DEADSOFTWARE

fix playerstats netmessage; zero gTime before spawning players
[d2df-sdl.git] / src / game / g_netmsg.pas
index 244b2ebd716ef55a21674fbd4b375f9c2324aad8..1fd6f7c5a8d3e7a6be8a0dad2ce9ea3980b2b78c 100644 (file)
@@ -442,11 +442,22 @@ begin
       e_LogWritefln('*** client #%u (cid #%u) authenticated...', [C.ID, C.Player]);
       //e_LogWritefln('spawning player with pid #%u...', [PID]);
       //Respawn(gGameSettings.GameType = GT_SINGLE);
-      //k8: no, do not spawn a player yet, wait for a 'i am ready' packet
+      //k8: no, do not spawn a player yet, wait for "request full state" packet
       Lives := 0;
       Spectate;
       FNoRespawn := True;
-      FWantsInGame := false; // TODO: look into this later
+      // `FWantsInGame` seems to mean "spawn the player on the next occasion".
+      // that is, if we'll set it to `true`, the player can be spawned after
+      // warmup time ran out, for example, regardless of the real player state.
+      // also, this seems to work only for the initial connection. further
+      // map changes could initiate resource downloading, but the player will
+      // be spawned immediately.
+      // the proper solution will require another player state, "ephemeral".
+      // the player should start any map in "ephemeral" state, and turned into
+      // real mobj only when they sent a special "i am ready" packet. this packet
+      // must be sent after receiving the full state, so the player will get a full
+      // map view before going into game.
+      FWantsInGame := false;
       C^.WaitForFirstSpawn := true;
     end;
   end;
@@ -465,7 +476,11 @@ begin
   if gState in [STATE_INTERCUSTOM, STATE_FOLD] then
     MH_SEND_GameEvent(NET_EV_MAPEND, 0, 'N', C^.ID);
 
-  if NetUseMaster then g_Net_Slist_Update;
+  if NetUseMaster then
+  begin
+    //g_Net_Slist_Update;
+    g_Net_Slist_Pulse();
+  end;
 end;
 
 
@@ -476,6 +491,7 @@ begin
   if not C.WaitForFirstSpawn then exit;
   plr := g_Player_Get(C^.Player);
   if not assigned(plr) then exit;
+  g_Net_Slist_ServerPlayerComes();
   e_LogWritefln('*** client #%u (cid #%u) first spawn', [C.ID, C.Player]);
   C.WaitForFirstSpawn := false;
   plr.FNoRespawn := false;
@@ -809,18 +825,14 @@ begin
 end;
 
 procedure MH_SEND_Info(ID: Byte);
-var
-  Map: string;
 begin
-  Map := g_ExtractFileName(gMapInfo.Map);
-
   NetOut.Clear();
 
   NetOut.Write(Byte(NET_MSG_INFO));
   NetOut.Write(ID);
   NetOut.Write(NetClients[ID].Player);
-  NetOut.Write(gGameSettings.WAD);
-  NetOut.Write(Map);
+  NetOut.Write(ExtractFileName(gGameSettings.WAD));
+  NetOut.Write(g_ExtractFileName(gMapInfo.Map));
   NetOut.Write(gWADHash);
   NetOut.Write(gGameSettings.GameMode);
   NetOut.Write(gGameSettings.GoalLimit);
@@ -1166,6 +1178,7 @@ begin
     NetOut.Write(Byte(FJetpack));
     NetOut.Write(FFireTime);
     NetOut.Write(Byte(FFlaming));
+    NetOut.Write(FSpawnInvul);
   end;
 
   g_Net_Host_Send(ID, True, NET_CHAN_PLAYER);
@@ -1785,7 +1798,7 @@ begin
         gGameSettings.GameMode := gSwitchGameMode;
 
         gWADHash := EvHash;
-        if not g_Game_StartMap(EvStr, True) then
+        if not g_Game_StartMap(false{asMegawad}, EvStr, True) then
         begin
           if not isWadPath(EvStr) then
             g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [gGameSettings.WAD + ':\' + EvStr]))
@@ -2341,6 +2354,7 @@ begin
     if (OldFire <= 0) and (FFireTime > 0) then
       g_Sound_PlayExAt('SOUND_IGNITE', Obj.X, Obj.Y);
     Flam := M.ReadByte() <> 0;
+    FSpawnInvul := M.ReadLongInt();
     if OldJet and not FJetpack then
       JetpackOff
     else if not OldJet and FJetpack then