DEADSOFTWARE

buffer network messages (broke a lot of shit)
[d2df-sdl.git] / src / game / g_netmsg.pas
index 6e8106fc61701e20d9b29c2eede43ff50d6cec16..b4612d3ec5cc8e7d676cc89ccac23d6f71d9066b 100644 (file)
@@ -13,7 +13,7 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *)
-{$MODE DELPHI}
+{$INCLUDE g_amodes.inc}
 unit g_netmsg;
 
 interface
@@ -430,7 +430,8 @@ end;
 
 function  MH_RECV_PlayerPos(C: pTNetClient; P: Pointer): Word;
 var
-  Dir, WeaponSelect: Byte;
+  Dir, i: Byte;
+  WeaponSelect: Word;
   PID: Word;
   kByte: Word;
   Pl: TPlayer;
@@ -452,7 +453,8 @@ begin
     NetTime := GT;
     kByte := e_Raw_Read_Word(P);
     Dir := e_Raw_Read_Byte(P);
-    WeaponSelect := e_Raw_Read_Byte(P);
+    WeaponSelect := e_Raw_Read_Word(P);
+    //e_WriteLog(Format('R:ws=%d', [WeaponSelect]), MSG_WARNING);
     if Direction <> TDirection(Dir) then
       JustTeleported := False;
 
@@ -475,8 +477,14 @@ begin
     if LongBool(kByte and NET_KEY_NW) then PressKey(KEY_NEXTWEAPON, 10000);
     if LongBool(kByte and NET_KEY_PW) then PressKey(KEY_PREVWEAPON, 10000);
 
-    if WeaponSelect <> 255 then
-      QueueWeaponSwitch(WeaponSelect);
+    for i := 0 to 15 do
+    begin
+      if (WeaponSelect and Word(1 shl i)) <> 0 then
+      begin
+        //e_WriteLog(Format(' R:wn=%d', [i]), MSG_WARNING);
+        QueueWeaponSwitch(i);
+      end;
+    end;
   end;
 
   // MH_SEND_PlayerPos(False, PID, C^.ID);
@@ -1066,13 +1074,13 @@ begin
     e_Buffer_Write(@NetOut, Lives);
     e_Buffer_Write(@NetOut, Team);
 
-    for I := WEAPON_KASTET to WEAPON_SUPERPULEMET do
+    for I := WP_FIRST to WP_LAST do
       e_Buffer_Write(@NetOut, Byte(FWeapon[I]));
 
-    for I := A_BULLETS to A_CELLS do
+    for I := A_BULLETS to A_HIGH do
       e_Buffer_Write(@NetOut, FAmmo[I]);
 
-    for I := A_BULLETS to A_CELLS do
+    for I := A_BULLETS to A_HIGH do
       e_Buffer_Write(@NetOut, FMaxAmmo[I]);
 
     for I := MR_SUIT to MR_MAX do
@@ -1094,6 +1102,7 @@ begin
     e_Buffer_Write(@NetOut, Byte(FPhysics));
     e_Buffer_Write(@NetOut, Byte(FNoRespawn));
     e_Buffer_Write(@NetOut, Byte(FJetpack));
+    e_Buffer_Write(@NetOut, FFireTime);
   end;
 
   g_Net_Host_Send(ID, True, NET_CHAN_PLAYER);
@@ -1370,6 +1379,7 @@ begin
     e_Buffer_Write(@NetOut, MonsterAmmo);
     e_Buffer_Write(@NetOut, MonsterPain);
     e_Buffer_Write(@NetOut, Byte(AnimIsReverse));
+    e_Buffer_Write(@NetOut, FFireTime);
   end;
 
   g_Net_Host_Send(ID, True, NET_CHAN_MONSTER);
@@ -2119,13 +2129,13 @@ begin
     Lives := e_Raw_Read_Byte(P);
     NewTeam := e_Raw_Read_Byte(P);
 
-    for I := WEAPON_KASTET to WEAPON_SUPERPULEMET do
+    for I := WP_FIRST to WP_LAST do
       FWeapon[I] := (e_Raw_Read_Byte(P) <> 0);
 
-    for I := A_BULLETS to A_CELLS do
+    for I := A_BULLETS to A_HIGH do
       FAmmo[I] := e_Raw_Read_Word(P);
 
-    for I := A_BULLETS to A_CELLS do
+    for I := A_BULLETS to A_HIGH do
       FMaxAmmo[I] := e_Raw_Read_Word(P);
 
     for I := MR_SUIT to MR_MAX do
@@ -2174,6 +2184,7 @@ begin
     FNoRespawn := e_Raw_Read_Byte(P) <> 0;
     OldJet := FJetpack;
     FJetpack := e_Raw_Read_Byte(P) <> 0;
+    FFireTime := e_Raw_Read_LongInt(P);
     if OldJet and not FJetpack then
       JetpackOff
     else if not OldJet and FJetpack then
@@ -2377,7 +2388,8 @@ begin
         else
           if gItems[ID].ItemType in [ITEM_WEAPON_SAW, ITEM_WEAPON_PISTOL, ITEM_WEAPON_SHOTGUN1, ITEM_WEAPON_SHOTGUN2,
                                      ITEM_WEAPON_CHAINGUN, ITEM_WEAPON_ROCKETLAUNCHER, ITEM_WEAPON_PLASMA,
-                                     ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERPULEMET, ITEM_AMMO_BACKPACK] then
+                                     ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERPULEMET, ITEM_WEAPON_FLAMETHROWER,
+                                     ITEM_AMMO_BACKPACK] then
             g_Sound_PlayExAt('SOUND_ITEM_GETWEAPON',
               gItems[ID].Obj.X, gItems[ID].Obj.Y)
             else
@@ -2393,7 +2405,7 @@ begin
       else
         if gItems[ID].ItemType in [ITEM_WEAPON_SAW, ITEM_WEAPON_PISTOL, ITEM_WEAPON_SHOTGUN1, ITEM_WEAPON_SHOTGUN2,
                                    ITEM_WEAPON_CHAINGUN, ITEM_WEAPON_ROCKETLAUNCHER, ITEM_WEAPON_PLASMA,
-                                   ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERPULEMET] then
+                                   ITEM_WEAPON_BFG, ITEM_WEAPON_SUPERPULEMET, ITEM_WEAPON_FLAMETHROWER] then
           g_Sound_PlayExAt('SOUND_ITEM_GETWEAPON',
             gItems[ID].Obj.X, gItems[ID].Obj.Y)
         else
@@ -2659,6 +2671,7 @@ begin
     MonsterAmmo := e_Raw_Read_LongInt(P);
     MonsterPain := e_Raw_Read_LongInt(P);
     AnimRevert := e_Raw_Read_Byte(P) <> 0;
+    FFireTime := e_Raw_Read_LongInt(P);
     RevertAnim(AnimRevert);
 
     if MonsterState <> MState then
@@ -2764,6 +2777,7 @@ begin
   e_Buffer_Write(@NetOut, gPlayer1Settings.Team);
 
   g_Net_Client_Send(True, NET_CHAN_SERVICE);
+  g_Net_Flush(); // send immediately, there's no frames yet
 end;
 
 procedure MC_SEND_Chat(Txt: string; Mode: Byte);
@@ -2787,7 +2801,7 @@ var
   kByte: Word;
   Predict: Boolean;
   strafeDir: Byte;
-  WeaponSelect: Byte = 255;
+  WeaponSelect: Word = 0;
   I: Integer;
 begin
   if not gGameOn then Exit;
@@ -2855,7 +2869,7 @@ begin
       if isKeyPressed(KeyPrevWeapon, KeyPrevWeapon2) then kByte := kByte or NET_KEY_PW;
       for I := 0 to High(KeyWeapon) do
         if isKeyPressed(KeyWeapon[I], KeyWeapon2[I]) then
-          WeaponSelect := I;
+          WeaponSelect := WeaponSelect or Word(1 shl I);
     end;
     // fix movebutton state
     P1MoveButton := P1MoveButton or (strafeDir shl 4);
@@ -2868,6 +2882,7 @@ begin
   e_Buffer_Write(@NetOut, kByte);
   e_Buffer_Write(@NetOut, Byte(gPlayer1.Direction));
   e_Buffer_Write(@NetOut, WeaponSelect);
+  //e_WriteLog(Format('S:ws=%d', [WeaponSelect]), MSG_WARNING);
   g_Net_Client_Send(True, NET_CHAN_PLAYERPOS);
 
   //kBytePrev := kByte;
@@ -2900,6 +2915,7 @@ begin
   e_Buffer_Write(@NetOut, Byte(NET_MSG_REQFST));
 
   g_Net_Client_Send(True, NET_CHAN_SERVICE);
+  g_Net_Flush(); // send immediately, because loading
 end;
 
 procedure MC_SEND_CheatRequest(Kind: Byte);
@@ -2972,9 +2988,11 @@ end;
 procedure ResDataMsgToBytes(var bytes: AByte; const ResData: TResDataMsg);
 var
   ResultStream: TMemoryStream;
+  dummy: Word = $FFFE;
 begin
   ResultStream := TMemoryStream.Create;
 
+  ResultStream.WriteBuffer(dummy, 2); //dummy length
   ResultStream.WriteBuffer(ResData.MsgId, SizeOf(ResData.MsgId)); //msgId
   ResultStream.WriteBuffer(ResData.FileSize, SizeOf(ResData.FileSize));  //file size
   ResultStream.WriteBuffer(ResData.FileData[0], ResData.FileSize);       //file data
@@ -2998,11 +3016,13 @@ procedure MapDataMsgToBytes(var bytes: AByte; const MapDataMsg: TMapDataMsg);
 var
   ResultStream: TMemoryStream;
   resCount: Integer;
+  dummy: Word = $FFFF;
 begin
   resCount := Length(MapDataMsg.ExternalResources);
 
   ResultStream := TMemoryStream.Create;
 
+  ResultStream.WriteBuffer(dummy, 2); //dummy length
   ResultStream.WriteBuffer(MapDataMsg.MsgId, SizeOf(MapDataMsg.MsgId)); //msgId
   ResultStream.WriteBuffer(MapDataMsg.FileSize, SizeOf(MapDataMsg.FileSize));  //file size
   ResultStream.WriteBuffer(MapDataMsg.FileData[0], MapDataMsg.FileSize);       //file data