diff --git a/src/game/g_netmsg.pas b/src/game/g_netmsg.pas
index a88513acac78c6a4f5bcb799c91af45f2588e739..58b008f1d0edd09769d4a06c69d8c27d49c0a39e 100644 (file)
--- a/src/game/g_netmsg.pas
+++ b/src/game/g_netmsg.pas
+(* 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/>.
+ *)
+{$MODE DELPHI}
unit g_netmsg;
interface
@@ -130,7 +146,7 @@ procedure MH_SEND_Everything(CreatePlayers: Boolean = False; ID: Integer = NET_E
procedure MH_SEND_Info(ID: Byte);
procedure MH_SEND_Chat(Txt: string; Mode: Byte; ID: Integer = NET_EVERYONE);
procedure MH_SEND_Effect(X, Y: Integer; Ang: SmallInt; Kind: Byte; ID: Integer = NET_EVERYONE);
-procedure MH_SEND_Sound(X, Y: Integer; Name: string; ID: Integer = NET_EVERYONE);
+procedure MH_SEND_Sound(X, Y: Integer; Name: string; Pos: Boolean = True; ID: Integer = NET_EVERYONE);
procedure MH_SEND_CreateShot(Proj: LongInt; ID: Integer = NET_EVERYONE);
procedure MH_SEND_UpdateShot(Proj: LongInt; ID: Integer = NET_EVERYONE);
procedure MH_SEND_DeleteShot(Proj: LongInt; X, Y: LongInt; Loud: Boolean = True; ID: Integer = NET_EVERYONE);
Math, ENet, e_input, e_fixedbuffer, e_graphics, e_log,
g_textures, g_gfx, g_sound, g_console, g_basic, g_options, g_main,
g_game, g_player, g_map, g_panel, g_items, g_weapons, g_phys, g_gui,
- g_language, g_monsters, g_netmaster,
- WADEDITOR, MAPDEF;
+ g_language, g_monsters, g_netmaster, utils, wadreader, MAPDEF;
const
NET_KEY_LEFT = 1;
for I := Low(gRenderForegrounds) to High(gRenderForegrounds) do
if gRenderForegrounds[I] <> nil then
with gRenderForegrounds[I] do
+ begin
if (GetTextureCount > 1) then
MH_SEND_PanelTexture(PanelType, I, LastAnimLoop, ID);
+ if Moved then
+ MH_SEND_PanelState(PanelType, I, ID);
+ end;
if gRenderBackgrounds <> nil then
for I := Low(gRenderBackgrounds) to High(gRenderBackgrounds) do
if gRenderBackgrounds[I] <> nil then
with gRenderBackgrounds[I] do
- if GetTextureCount > 1 then
+ begin
+ if (GetTextureCount > 1) then
MH_SEND_PanelTexture(PanelType, I, LastAnimLoop, ID);
+ if Moved then
+ MH_SEND_PanelState(PanelType, I, ID);
+ end;
if gWater <> nil then
for I := Low(gWater) to High(gWater) do
if gWater[I] <> nil then
var
Map: string;
begin
- g_ProcessResourceStr(gMapInfo.Map, nil, nil, @Map);
+ Map := g_ExtractFileName(gMapInfo.Map);
e_Buffer_Clear(@NetOut);
g_Net_Host_Send(ID, False, NET_CHAN_GAME);
end;
-procedure MH_SEND_Sound(X, Y: Integer; Name: string; ID: Integer = NET_EVERYONE);
+procedure MH_SEND_Sound(X, Y: Integer; Name: string; Pos: Boolean = True; ID: Integer = NET_EVERYONE);
begin
e_Buffer_Write(@NetOut, Byte(NET_MSG_SND));
e_Buffer_Write(@NetOut, Name);
- e_Buffer_Write(@NetOut, X);
- e_Buffer_Write(@NetOut, Y);
+ if Pos then
+ begin
+ e_Buffer_Write(@NetOut, Byte(1));
+ e_Buffer_Write(@NetOut, X);
+ e_Buffer_Write(@NetOut, Y);
+ end
+ else
+ e_Buffer_Write(@NetOut, Byte(0));
g_Net_Host_Send(ID, False, NET_CHAN_GAME);
end;
TP := gWalls[PID];
PANEL_LIFTUP, PANEL_LIFTDOWN, PANEL_LIFTLEFT, PANEL_LIFTRIGHT:
TP := gLifts[PID];
+ PANEL_BACK:
+ begin
+ TP := gRenderBackgrounds[PID];
+ TP.Moved := True;
+ end;
+ PANEL_FORE:
+ begin
+ TP := gRenderForegrounds[PID];
+ TP.Moved := True;
+ end;
else
Exit;
end;
e_Buffer_Write(@NetOut, PID);
e_Buffer_Write(@NetOut, Byte(TP.Enabled));
e_Buffer_Write(@NetOut, TP.LiftType);
+ e_Buffer_Write(@NetOut, TP.X);
+ e_Buffer_Write(@NetOut, TP.Y);
g_Net_Host_Send(ID, True, NET_CHAN_LARGEDATA);
end;
var
Name: string;
X, Y: Integer;
+ Pos: Boolean;
begin
Name := e_Raw_Read_String(P);
- X := e_Raw_Read_LongInt(P);
- Y := e_Raw_Read_LongInt(P);
- g_Sound_PlayExAt(Name, X, Y);
+ Pos := e_Raw_Read_Byte(P) <> 0;
+ if Pos then
+ begin
+ X := e_Raw_Read_LongInt(P);
+ Y := e_Raw_Read_LongInt(P);
+ g_Sound_PlayExAt(Name, X, Y);
+ end
+ else
+ g_Sound_PlayEx(Name);
end;
procedure MC_RECV_CreateShot(P: Pointer);
E: Boolean;
Lift: Byte;
PType: Word;
+ X, Y: Integer;
begin
if not gGameOn then Exit;
PType := e_Raw_Read_Word(P);
ID := e_Raw_Read_LongWord(P);
E := (e_Raw_Read_Byte(P) <> 0);
Lift := e_Raw_Read_Byte(P);
+ X := e_Raw_Read_LongInt(P);
+ Y := e_Raw_Read_LongInt(P);
case PType of
PANEL_WALL, PANEL_OPENDOOR, PANEL_CLOSEDOOR:
PANEL_LIFTUP, PANEL_LIFTDOWN, PANEL_LIFTLEFT, PANEL_LIFTRIGHT:
g_Map_SetLift(ID, Lift);
+
+ PANEL_BACK:
+ begin
+ gRenderBackgrounds[ID].X := X;
+ gRenderBackgrounds[ID].Y := Y;
+ end;
+
+ PANEL_FORE:
+ begin
+ gRenderForegrounds[ID].X := X;
+ gRenderForegrounds[ID].Y := Y;
+ end;
end;
end;
function ReadFile(const FileName: TFileName): AByte;
var
- FileStream : TFileStream;
+ FileStream : TStream;
+ fname: string;
begin
+ e_WriteLog(Format('NETWORK: looking for file "%s"', [FileName]), MSG_NOTIFY);
+ fname := findDiskWad(FileName);
+ if length(fname) = 0 then
+ begin
+ e_WriteLog(Format('NETWORK: file "%s" not found!', [FileName]), MSG_FATALERROR);
+ SetLength(Result, 0);
+ exit;
+ end;
+ e_WriteLog(Format('NETWORK: found file "%s"', [fname]), MSG_NOTIFY);
Result := nil;
- FileStream:= TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
+ FileStream := openDiskFileRO(fname);
try
- if FileStream.Size>0 then
+ if FileStream.Size > 0 then
begin
SetLength(Result, FileStream.Size);
FileStream.Read(Result[0], FileStream.Size);