DEADSOFTWARE

fixed some logic errors, but shit's still bugged
[d2df-sdl.git] / src / game / g_nethandler.pas
index c25b3145f111161f870e782370254aeaef397410..b8d7c8040b1cd58cff7f22eb5f45b7d77b550c08 100644 (file)
@@ -1,3 +1,19 @@
+(* Copyright (C)  DooM 2D:Forever Developers
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *)
+{$INCLUDE g_amodes.inc}
 unit g_nethandler;
 
 interface
@@ -10,11 +26,12 @@ procedure g_Net_HostMsgHandler(S: pTNetClient; P: pENetPacket);
 
 implementation
 
-uses e_fixedbuffer;
+uses e_fixedbuffer, e_log, StrUtils, SysUtils;
 
 procedure g_Net_ClientMsgHandler(P: pENetPacket);
 var
   MID: Byte;
+  Len: Word;
   B: Pointer;
 begin
   e_Raw_Seek(0);
@@ -22,48 +39,51 @@ begin
   B := P^.data;
   if B = nil then Exit;
 
-  MID := e_Raw_Read_Byte(B);
-
-  case MID of
-    NET_MSG_CHAT:   MC_RECV_Chat(B);
-    NET_MSG_GFX:    MC_RECV_Effect(B);
-    NET_MSG_SND:    MC_RECV_Sound(B);
-    NET_MSG_SCORE:  MC_RECV_GameStats(B);
-    NET_MSG_COOP:   MC_RECV_CoopStats(B);
-    NET_MSG_GEVENT: MC_RECV_GameEvent(B);
-    NET_MSG_FLAG:   MC_RECV_FlagEvent(B);
-    NET_MSG_GSET:   MC_RECV_GameSettings(B);
-
-    NET_MSG_PLR:    MC_RECV_PlayerCreate(B);
-    NET_MSG_PLRPOS: MC_RECV_PlayerPos(B);
-    NET_MSG_PLRSTA: MC_RECV_PlayerStats(B);
-    NET_MSG_PLRDEL: MC_RECV_PlayerDelete(B);
-    NET_MSG_PLRDMG: MC_RECV_PlayerDamage(B);
-    NET_MSG_PLRDIE: MC_RECV_PlayerDeath(B);
-    NET_MSG_PLRFIRE:MC_RECV_PlayerFire(B);
-    NET_MSG_PLRSET: MC_RECV_PlayerSettings(B);
-
-    NET_MSG_MSPAWN: MC_RECV_MonsterSpawn(B);
-    NET_MSG_MPOS:   MC_RECV_MonsterPos(B);
-    NET_MSG_MSTATE: MC_RECV_MonsterState(B);
-    NET_MSG_MSHOT:  MC_RECV_MonsterShot(B);
-    NET_MSG_MDEL:   MC_RECV_MonsterDelete(B);
-
-    NET_MSG_SHADD:  MC_RECV_CreateShot(B);
-    NET_MSG_SHPOS:  MC_RECV_UpdateShot(B);
-    NET_MSG_SHDEL:  MC_RECV_DeleteShot(B);
-
-    NET_MSG_ISPAWN: MC_RECV_ItemSpawn(B);
-    NET_MSG_IDEL:   MC_RECV_ItemDestroy(B);
-
-    NET_MSG_PSTATE: MC_RECV_PanelState(B);
-    NET_MSG_PTEX:   MC_RECV_PanelTexture(B);
-
-    NET_MSG_TSOUND: MC_RECV_TriggerSound(B);
-    NET_MSG_TMUSIC: MC_RECV_TriggerMusic(B);
-
-    NET_MSG_TIME_SYNC:  MC_RECV_TimeSync(B);
-    NET_MSG_VOTE_EVENT: MC_RECV_VoteEvent(B);
+  while RawPos < P^.dataLength do
+  begin
+    Len := e_Raw_Read_Word(B);
+    MID := e_Raw_Read_Byte(B);
+    case MID of
+      NET_MSG_CHAT:   MC_RECV_Chat(B);
+      NET_MSG_GFX:    MC_RECV_Effect(B);
+      NET_MSG_SND:    MC_RECV_Sound(B);
+      NET_MSG_SCORE:  MC_RECV_GameStats(B);
+      NET_MSG_COOP:   MC_RECV_CoopStats(B);
+      NET_MSG_GEVENT: MC_RECV_GameEvent(B);
+      NET_MSG_FLAG:   MC_RECV_FlagEvent(B);
+      NET_MSG_GSET:   MC_RECV_GameSettings(B);
+
+      NET_MSG_PLR:    MC_RECV_PlayerCreate(B);
+      NET_MSG_PLRPOS: MC_RECV_PlayerPos(B);
+      NET_MSG_PLRSTA: MC_RECV_PlayerStats(B);
+      NET_MSG_PLRDEL: MC_RECV_PlayerDelete(B);
+      NET_MSG_PLRDMG: MC_RECV_PlayerDamage(B);
+      NET_MSG_PLRDIE: MC_RECV_PlayerDeath(B);
+      NET_MSG_PLRFIRE:MC_RECV_PlayerFire(B);
+      NET_MSG_PLRSET: MC_RECV_PlayerSettings(B);
+
+      NET_MSG_MSPAWN: MC_RECV_MonsterSpawn(B);
+      NET_MSG_MPOS:   MC_RECV_MonsterPos(B);
+      NET_MSG_MSTATE: MC_RECV_MonsterState(B);
+      NET_MSG_MSHOT:  MC_RECV_MonsterShot(B);
+      NET_MSG_MDEL:   MC_RECV_MonsterDelete(B);
+
+      NET_MSG_SHADD:  MC_RECV_CreateShot(B);
+      NET_MSG_SHPOS:  MC_RECV_UpdateShot(B);
+      NET_MSG_SHDEL:  MC_RECV_DeleteShot(B);
+
+      NET_MSG_ISPAWN: MC_RECV_ItemSpawn(B);
+      NET_MSG_IDEL:   MC_RECV_ItemDestroy(B);
+
+      NET_MSG_PSTATE: MC_RECV_PanelState(B);
+      NET_MSG_PTEX:   MC_RECV_PanelTexture(B);
+
+      NET_MSG_TSOUND: MC_RECV_TriggerSound(B);
+      NET_MSG_TMUSIC: MC_RECV_TriggerMusic(B);
+
+      NET_MSG_TIME_SYNC:  MC_RECV_TimeSync(B);
+      NET_MSG_VOTE_EVENT: MC_RECV_VoteEvent(B);
+    end;
   end;
 
   enet_packet_destroy(P);
@@ -72,6 +92,7 @@ end;
 procedure g_Net_ClientLightMsgHandler(P: pENetPacket);
 var
   MID: Byte;
+  Len: Word;
   B: Pointer;
 begin
   e_Raw_Seek(0);
@@ -79,14 +100,23 @@ begin
   B := P^.data;
   if B = nil then Exit;
 
-  MID := e_Raw_Read_Byte(B);
-
-  case MID of
-    NET_MSG_GEVENT: MC_RECV_GameEvent(B);
-    NET_MSG_GSET:   MC_RECV_GameSettings(B);
-
-    NET_MSG_PLR:    if NetState <> NET_STATE_AUTH then MC_RECV_PlayerCreate(B);
-    NET_MSG_PLRDEL: if NetState <> NET_STATE_AUTH then MC_RECV_PlayerDelete(B);
+  while RawPos < P^.dataLength do
+  begin
+    Len := e_Raw_Read_Word(B);
+    MID := e_Raw_Read_Byte(B);
+    case MID of
+      NET_MSG_GEVENT: MC_RECV_GameEvent(B);
+      NET_MSG_GSET:   MC_RECV_GameSettings(B);
+
+      NET_MSG_PLR:
+        if NetState <> NET_STATE_AUTH then MC_RECV_PlayerCreate(B)
+        else RawPos := RawPos + Len-1;
+      NET_MSG_PLRDEL: 
+        if NetState <> NET_STATE_AUTH then MC_RECV_PlayerDelete(B)
+        else RawPos := RawPos + Len-1;
+
+      else RawPos := RawPos + Len-1;
+    end;
   end;
 
   enet_packet_destroy(P);
@@ -95,6 +125,7 @@ end;
 procedure g_Net_HostMsgHandler(S: pTNetClient; P: pENetPacket);
 var
   MID: Byte;
+  Len: Word;
   B: Pointer;
 begin
   e_Raw_Seek(0);
@@ -102,24 +133,27 @@ begin
   B := P^.data;
   if B = nil then Exit;
 
-  MID := e_Raw_Read_Byte(B);
-
-  case MID of
-    NET_MSG_INFO: MH_RECV_Info(S, B);
-    NET_MSG_CHAT: MH_RECV_Chat(S, B);
-    NET_MSG_REQFST: MH_RECV_FullStateRequest(S, B);
+  while RawPos < P^.dataLength do
+  begin
+    Len := e_Raw_Read_Word(B);
+    MID := e_Raw_Read_Byte(B);
+    case MID of
+      NET_MSG_INFO: MH_RECV_Info(S, B);
+      NET_MSG_CHAT: MH_RECV_Chat(S, B);
+      NET_MSG_REQFST: MH_RECV_FullStateRequest(S, B);
 
-    NET_MSG_PLRPOS: MH_RECV_PlayerPos(S, B);
-    NET_MSG_PLRSET: MH_RECV_PlayerSettings(S, B);
-    NET_MSG_CHEAT:  MH_RECV_CheatRequest(S, B);
+      NET_MSG_PLRPOS: MH_RECV_PlayerPos(S, B);
+      NET_MSG_PLRSET: MH_RECV_PlayerSettings(S, B);
+      NET_MSG_CHEAT:  MH_RECV_CheatRequest(S, B);
 
-    NET_MSG_RCON_AUTH: MH_RECV_RCONPassword(S, B);
-    NET_MSG_RCON_CMD:  MH_RECV_RCONCommand(S, B);
+      NET_MSG_RCON_AUTH: MH_RECV_RCONPassword(S, B);
+      NET_MSG_RCON_CMD:  MH_RECV_RCONCommand(S, B);
 
-    NET_MSG_MAP_REQUEST: MH_RECV_MapRequest(S, B);
-    NET_MSG_RES_REQUEST: MH_RECV_ResRequest(S, B);
+      NET_MSG_MAP_REQUEST: MH_RECV_MapRequest(S, B);
+      NET_MSG_RES_REQUEST: MH_RECV_ResRequest(S, B);
 
-    NET_MSG_VOTE_EVENT: MH_RECV_Vote(S, B);
+      NET_MSG_VOTE_EVENT: MH_RECV_Vote(S, B);
+    end;
   end;
 
   enet_packet_destroy(P);