diff --git a/src/game/g_netmsg.pas b/src/game/g_netmsg.pas
index 0f57f84feeaf19f70148dae8ba60fcd250d53fe2..36c0aa15e5e293f5a64713e87706577d27149864 100644 (file)
--- a/src/game/g_netmsg.pas
+++ b/src/game/g_netmsg.pas
NET_MSG_FLAG = 107;
NET_MSG_REQFST = 108;
NET_MSG_GSET = 109;
+ NET_MSG_FLAGPOS= 110;
NET_MSG_PLR = 111;
NET_MSG_PLRPOS = 112;
NET_MSG_ISPAWN = 121;
NET_MSG_IDEL = 122;
+ NET_MSG_IPOS = 123;
NET_MSG_MSPAWN = 131;
NET_MSG_MPOS = 132;
NET_MSG_MSHOT = 134;
NET_MSG_MDEL = 135;
- NET_MSG_PSTATE = 141;
- NET_MSG_PTEX = 142;
+ NET_MSG_PSTATE = 141;
+ NET_MSG_PTEX = 142;
NET_MSG_TSOUND = 151;
NET_MSG_TMUSIC = 152;
NET_CHEAT_SUICIDE = 1;
NET_CHEAT_SPECTATE = 2;
NET_CHEAT_READY = 3;
+ NET_CHEAT_DROPFLAG = 4;
NET_MAX_DIFFTIME = 5000 div 36;
procedure MH_SEND_CoopStats(ID: Integer = NET_EVERYONE);
procedure MH_SEND_GameEvent(EvType: Byte; EvNum: Integer = 0; EvStr: string = 'N'; ID: Integer = NET_EVERYONE);
procedure MH_SEND_FlagEvent(EvType: Byte; Flag: Byte; PID: Word; Quiet: Boolean = False; ID: Integer = NET_EVERYONE);
+procedure MH_SEND_FlagPos(Flag: Byte; ID: Integer = NET_EVERYONE);
procedure MH_SEND_GameSettings(ID: Integer = NET_EVERYONE);
// PLAYER
procedure MH_SEND_PlayerCreate(PID: Word; ID: Integer = NET_EVERYONE);
@@ -174,6 +178,7 @@ procedure MH_SEND_PlayerSettings(PID: Word; Mdl: string = ''; ID: Integer = NET_
// ITEM
procedure MH_SEND_ItemSpawn(Quiet: Boolean; IID: Word; ID: Integer = NET_EVERYONE);
procedure MH_SEND_ItemDestroy(Quiet: Boolean; IID: Word; ID: Integer = NET_EVERYONE);
+procedure MH_SEND_ItemPos(IID: Word; ID: Integer = NET_EVERYONE);
// PANEL
procedure MH_SEND_PanelTexture(PGUID: Integer; AnimLoop: Byte; ID: Integer = NET_EVERYONE);
procedure MH_SEND_PanelState(PGUID: Integer; ID: Integer = NET_EVERYONE);
procedure MC_RECV_CoopStats(var M: TMsg);
procedure MC_RECV_GameEvent(var M: TMsg);
procedure MC_RECV_FlagEvent(var M: TMsg);
+procedure MC_RECV_FlagPos(var M: TMsg);
procedure MC_RECV_GameSettings(var M: TMsg);
// PLAYER
function MC_RECV_PlayerCreate(var M: TMsg): Word;
// ITEM
procedure MC_RECV_ItemSpawn(var M: TMsg);
procedure MC_RECV_ItemDestroy(var M: TMsg);
+procedure MC_RECV_ItemPos(var M: TMsg);
// PANEL
procedure MC_RECV_PanelTexture(var M: TMsg);
procedure MC_RECV_PanelState(var M: TMsg);
g_language, g_monsters, g_netmaster, utils, wadreader, MAPDEF;
const
- NET_KEY_LEFT = 1;
- NET_KEY_RIGHT = 2;
- NET_KEY_UP = 4;
- NET_KEY_DOWN = 8;
- NET_KEY_JUMP = 16;
- NET_KEY_FIRE = 32;
- NET_KEY_OPEN = 64;
- NET_KEY_NW = 256;
- NET_KEY_PW = 512;
- NET_KEY_CHAT = 2048;
- NET_KEY_FORCEDIR = 4096;
+ NET_KEY_LEFT = 1 shl 0;
+ NET_KEY_RIGHT = 1 shl 1;
+ NET_KEY_UP = 1 shl 2;
+ NET_KEY_DOWN = 1 shl 3;
+ NET_KEY_JUMP = 1 shl 4;
+ NET_KEY_FIRE = 1 shl 5;
+ NET_KEY_OPEN = 1 shl 6;
+ NET_KEY_CHAT = 1 shl 7;
+ NET_KEY_FORCEDIR = 1 shl 8;
//var
//kBytePrev: Word = 0;
function MH_RECV_PlayerPos(C: pTNetClient; var M: TMsg): Word;
var
Dir, i: Byte;
+ WeaponAct: Byte;
WeaponSelect: Word;
PID: Word;
kByte: Word;
NetTime := GT;
kByte := M.ReadWord();
Dir := M.ReadByte();
+ WeaponAct := M.ReadByte();
WeaponSelect := M.ReadWord();
//e_WriteLog(Format('R:ws=%d', [WeaponSelect]), MSG_WARNING);
if Direction <> TDirection(Dir) then
if LongBool(kByte and NET_KEY_JUMP) then PressKey(KEY_JUMP, 10000);
if LongBool(kByte and NET_KEY_FIRE) then PressKey(KEY_FIRE, 10000);
if LongBool(kByte and NET_KEY_OPEN) then PressKey(KEY_OPEN, 10000);
- if LongBool(kByte and NET_KEY_NW) then PressKey(KEY_NEXTWEAPON, 10000);
- if LongBool(kByte and NET_KEY_PW) then PressKey(KEY_PREVWEAPON, 10000);
+
+ for i := 0 to 7 do
+ begin
+ if (WeaponAct and Byte(1 shl i)) <> 0 then
+ begin
+ //e_WriteLog(Format(' R:wn=%d', [i]), MSG_WARNING);
+ ProcessWeaponAction(i);
+ end;
+ end;
for i := 0 to 15 do
begin
Dec(gInterReadyCount);
end;
end;
+ NET_CHEAT_DROPFLAG:
+ Pl.TryDropFlag();
end;
end;
NetOut.Write(gFlags[Flag].Obj.Y);
NetOut.Write(gFlags[Flag].Obj.Vel.X);
NetOut.Write(gFlags[Flag].Obj.Vel.Y);
+ NetOut.Write(Byte(gFlags[Flag].Direction));
g_Net_Host_Send(ID, True, NET_CHAN_IMPORTANT);
end;
+procedure MH_SEND_FlagPos(Flag: Byte; ID: Integer = NET_EVERYONE);
+begin
+ NetOut.Write(Byte(NET_MSG_FLAGPOS));
+ NetOut.Write(Flag);
+ NetOut.Write(gFlags[Flag].Obj.X);
+ NetOut.Write(gFlags[Flag].Obj.Y);
+ NetOut.Write(gFlags[Flag].Obj.Vel.X);
+ NetOut.Write(gFlags[Flag].Obj.Vel.Y);
+
+ g_Net_Host_Send(ID, False, NET_CHAN_IMPORTANT);
+end;
+
procedure MH_SEND_GameSettings(ID: Integer = NET_EVERYONE);
begin
NetOut.Write(Byte(NET_MSG_GSET));
g_Net_Host_Send(ID, True, NET_CHAN_LARGEDATA);
end;
+procedure MH_SEND_ItemPos(IID: Word; ID: Integer = NET_EVERYONE);
+var
+ it: PItem;
+begin
+ it := g_Items_ByIdx(IID);
+
+ NetOut.Write(Byte(NET_MSG_IPOS));
+ NetOut.Write(IID);
+ NetOut.Write(it.Obj.X);
+ NetOut.Write(it.Obj.Y);
+ NetOut.Write(it.Obj.Vel.X);
+ NetOut.Write(it.Obj.Vel.Y);
+
+ g_Net_Host_Send(ID, False, NET_CHAN_LARGEDATA);
+end;
+
// PANEL
procedure MH_SEND_PanelTexture(PGUID: Integer; AnimLoop: Byte; ID: Integer = NET_EVERYONE);
end;
end;
+procedure MC_RECV_FlagPos(var M: TMsg);
+var
+ Fl: Byte;
+begin
+ Fl := M.ReadByte();
+ if Fl = FLAG_NONE then Exit;
+ gFlags[Fl].Obj.X := M.ReadLongInt();
+ gFlags[Fl].Obj.Y := M.ReadLongInt();
+ gFlags[Fl].Obj.Vel.X := M.ReadLongInt();
+ gFlags[Fl].Obj.Vel.Y := M.ReadLongInt();
+end;
+
procedure MC_RECV_FlagEvent(var M: TMsg);
var
PID: Word;
gFlags[Fl].Obj.Y := M.ReadLongInt();
gFlags[Fl].Obj.Vel.X := M.ReadLongInt();
gFlags[Fl].Obj.Vel.Y := M.ReadLongInt();
+ gFlags[Fl].Direction := TDirection(M.ReadByte());
Pl := g_Player_Get(PID);
if (Pl = nil) and
g_Items_Remove(ID);
end;
+procedure MC_RECV_ItemPos(var M: TMsg);
+var
+ ID: Word;
+ X, Y, VX, VY: Integer;
+ it: PItem;
+begin
+ if not gGameOn then Exit;
+
+ ID := M.ReadWord();
+ X := M.ReadLongInt();
+ Y := M.ReadLongInt();
+ VX := M.ReadLongInt();
+ VY := M.ReadLongInt();
+
+ if g_Items_ValidId(ID) then
+ begin
+ it := g_Items_ByIdx(ID);
+ it.Obj.X := X;
+ it.Obj.Y := Y;
+ it.Obj.Vel.X := VX;
+ it.Obj.Vel.Y := VY;
+ it.positionChanged();
+ end;
+end;
+
// PANEL
procedure MC_RECV_PanelTexture(var M: TMsg);
kByte: Word;
Predict: Boolean;
strafeDir: Byte;
+ WeaponAct: Byte = 0;
WeaponSelect: Word = 0;
i: Integer;
begin
end;
if gPlayerAction[0, ACTION_ATTACK] then kByte := kByte or NET_KEY_FIRE;
if gPlayerAction[0, ACTION_ACTIVATE] then kByte := kByte or NET_KEY_OPEN;
- if gPlayerAction[0, ACTION_WEAPNEXT] then kByte := kByte or NET_KEY_NW;
- if gPlayerAction[0, ACTION_WEAPPREV] then kByte := kByte or NET_KEY_PW;
- gPlayerAction[0, ACTION_WEAPNEXT] := False; // HACK, remove after readyweaon&pendinweapon implementation
- gPlayerAction[0, ACTION_WEAPPREV] := False; // HACK, remove after readyweaon&pendinweapon implementation
+ for i := WP_FACT to WP_LACT do
+ begin
+ if gWeaponAction[0, i] then
+ begin
+ WeaponAct := WeaponAct or Byte(1 shl i);
+ gWeaponAction[0, i] := False
+ end
+ end;
for i := WP_FIRST to WP_LAST do
begin
NetOut.Write(gTime);
NetOut.Write(kByte);
NetOut.Write(Byte(gPlayer1.Direction));
+ NetOut.Write(WeaponAct);
NetOut.Write(WeaponSelect);
//e_WriteLog(Format('S:ws=%d', [WeaponSelect]), MSG_WARNING);
g_Net_Client_Send(True, NET_CHAN_PLAYERPOS);