X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_game.pas;h=7f77a41a3194d89279f537bdd2d656cc92030b85;hb=48fa53d341e432475432901a339f1ae81fda7809;hp=a85ad9af2ab7362961e28449b46f8dc125f6467e;hpb=1c315223c6dbddff71a842f83a5bb1ef7ff5c6cb;p=d2df-sdl.git diff --git a/src/game/g_game.pas b/src/game/g_game.pas index a85ad9a..7f77a41 100644 --- a/src/game/g_game.pas +++ b/src/game/g_game.pas @@ -794,7 +794,7 @@ begin {$IF DEFINED(D2F_DEBUG)} if gPlayer1 <> nil then gPlayer1.NoTarget := True; - gAimLine := true; + gAimLine := g_dbg_aimline_on; {$ENDIF} end; @@ -1487,20 +1487,30 @@ var function sendMonsPos (mon: TMonster): Boolean; begin result := false; // don't stop - if (mon.MonsterType = MONSTER_BARREL) then + // this will also reset "need-send" flag + if mon.gncNeedSend then + begin + MH_SEND_MonsterPos(mon.UID); + end + else if (mon.MonsterType = MONSTER_BARREL) then begin if (mon.GameVelX <> 0) or (mon.GameVelY <> 0) then MH_SEND_MonsterPos(mon.UID); end - else - if (mon.MonsterState <> MONSTATE_SLEEP) then - begin - if (mon.MonsterState <> MONSTATE_DEAD) or (mon.GameVelX <> 0) or (mon.GameVelY <> 0) then - begin - MH_SEND_MonsterPos(mon.UID); - end; - end; + else if (mon.MonsterState <> MONSTATE_SLEEP) then + begin + if (mon.MonsterState <> MONSTATE_DEAD) or (mon.GameVelX <> 0) or (mon.GameVelY <> 0) then MH_SEND_MonsterPos(mon.UID); + end; end; + function sendMonsPosUnexpected (mon: TMonster): Boolean; + begin + result := false; // don't stop + // this will also reset "need-send" flag + if mon.gncNeedSend then MH_SEND_MonsterPos(mon.UID); + end; + +var + reliableUpdate: Boolean; begin g_ResetDynlights(); // Ïîðà âûêëþ÷àòü èãðó: @@ -1844,13 +1854,16 @@ begin g_GFX_Update(); g_Player_UpdateAll(); g_Player_UpdatePhysicalObjects(); - if gGameSettings.GameType = GT_SERVER then - if Length(gMonstersSpawned) > 0 then + + // server: send newly spawned monsters unconditionally + if (gGameSettings.GameType = GT_SERVER) then + begin + if (Length(gMonstersSpawned) > 0) then begin - for I := 0 to High(gMonstersSpawned) do - MH_SEND_MonsterSpawn(gMonstersSpawned[I]); + for I := 0 to High(gMonstersSpawned) do MH_SEND_MonsterSpawn(gMonstersSpawned[I]); SetLength(gMonstersSpawned, 0); end; + end; if (gSoundTriggerTime > 8) then begin @@ -1858,49 +1871,65 @@ begin gSoundTriggerTime := 0; end else + begin Inc(gSoundTriggerTime); + end; if (NetMode = NET_SERVER) then begin Inc(NetTimeToUpdate); Inc(NetTimeToReliable); - if NetTimeToReliable >= NetRelupdRate then + + // send monster updates + if (NetTimeToReliable >= NetRelupdRate) or (NetTimeToUpdate >= NetUpdateRate) then begin + // send all monsters (periodic sync) + reliableUpdate := (NetTimeToReliable >= NetRelupdRate); + for I := 0 to High(gPlayers) do - if gPlayers[I] <> nil then - MH_SEND_PlayerPos(True, gPlayers[I].UID); + begin + if (gPlayers[I] <> nil) then MH_SEND_PlayerPos(reliableUpdate, gPlayers[I].UID); + end; g_Mons_ForEach(sendMonsPos); - NetTimeToReliable := 0; - NetTimeToUpdate := NetUpdateRate; + if reliableUpdate then + begin + NetTimeToReliable := 0; + NetTimeToUpdate := NetUpdateRate; + end + else + begin + NetTimeToUpdate := 0; + end; end - else if NetTimeToUpdate >= NetUpdateRate then + else begin - if gPlayers <> nil then - for I := 0 to High(gPlayers) do - if gPlayers[I] <> nil then - MH_SEND_PlayerPos(False, gPlayers[I].UID); - - g_Mons_ForEach(sendMonsPos); - - NetTimeToUpdate := 0; + // send only mosters with some unexpected changes + g_Mons_ForEach(sendMonsPosUnexpected); end; + // send unexpected platform changes + g_Map_NetSendInterestingPanels(); + if NetUseMaster then + begin if gTime >= NetTimeToMaster then begin if (NetMHost = nil) or (NetMPeer = nil) then - if not g_Net_Slist_Connect then - g_Console_Add(_lc[I_NET_MSG_ERROR] + _lc[I_NET_SLIST_ERROR]); + begin + if not g_Net_Slist_Connect then g_Console_Add(_lc[I_NET_MSG_ERROR] + _lc[I_NET_SLIST_ERROR]); + end; g_Net_Slist_Update; NetTimeToMaster := gTime + NetMasterRate; end; + end; end - else - if NetMode = NET_CLIENT then - MC_SEND_PlayerPos(); + else if (NetMode = NET_CLIENT) then + begin + MC_SEND_PlayerPos(); + end; end; // if gameOn ... // Àêòèâíî îêíî èíòåðôåéñà - ïåðåäàåì êëàâèøè åìó: @@ -5106,12 +5135,12 @@ begin g_Console_Add(cmd + ' [ID | Name] [behaviour]'); g_Console_Add('ID | Name'); for b := MONSTER_DEMON to MONSTER_MAN do - g_Console_Add(Format('%2d | %s', [b, g_Monsters_GetNameByID(b)])); + g_Console_Add(Format('%2d | %s', [b, g_Mons_NameByTypeId(b)])); end else begin a := StrToIntDef(P[1], 0); if (a < MONSTER_DEMON) or (a > MONSTER_MAN) then - a := g_Monsters_GetIDByName(P[1]); + a := g_Mons_TypeIdByName(P[1]); if (a < MONSTER_DEMON) or (a > MONSTER_MAN) then g_Console_Add(Format(_lc[I_MSG_NO_MONSTER], [P[1]])) @@ -5202,7 +5231,7 @@ begin g_Console_Add('player left the map'); gExitByTrigger := True; //g_Game_ExitLevel(gTriggers[a].Data.MapName); - g_Game_ExitLevel(gTriggers[a].trigData.trigMapName); + g_Game_ExitLevel(gTriggers[a].trigData.trigMap); break; end; end; @@ -6072,7 +6101,7 @@ begin begin gExitByTrigger := True; //gNextMap := gTriggers[a].Data.MapName; - gNextMap := gTriggers[a].trigData.trigMapName; + gNextMap := gTriggers[a].trigData.trigMap; Break; end; // Èùåì ñëåäóþùóþ êàðòó â WAD ôàéëå