Skip to content
This repository has been archived by the owner on Mar 19, 2023. It is now read-only.

Commit

Permalink
Download external wads. Refactoring. Increased NET_PROTOCOL_VER
Browse files Browse the repository at this point in the history
  • Loading branch information
ZurgInq committed Mar 31, 2015
1 parent 607a266 commit bf82ff1
Show file tree
Hide file tree
Showing 6 changed files with 480 additions and 25 deletions.
18 changes: 11 additions & 7 deletions DF Sources/g_game.pas
Expand Up @@ -3,7 +3,7 @@
Interface

Uses
Windows, g_basic, g_player, Messages, e_graphics,
Windows, g_basic, g_player, Messages, e_graphics, Classes, g_res_downloader,
SysUtils, g_sound, MAPSTRUCT, WADEDITOR;

Type
Expand Down Expand Up @@ -2307,7 +2307,6 @@ procedure g_Game_StartServer(Map: String; GameMode: Byte;
var
ResName: String;
Team: Byte;

begin
g_Game_Free();

Expand Down Expand Up @@ -2401,21 +2400,23 @@ procedure g_Game_StartServer(Map: String; GameMode: Byte;

// Íàñòðîéêè èãðîêîâ è áîòîâ:
g_Player_Init();

NetState := NET_STATE_GAME;
end;

procedure g_Game_StartClient(Addr: String; Port: Word; PW: String = 'ASS');
var
ResName: String;
Map: String;
WadName: string;
Ptr: Pointer;
T: Cardinal;
MID: Byte;
State: Byte;
OuterLoop: Boolean;
WHash: TMD5Digest;
F: file;
newResPath: string;
begin
g_Game_Free();
State := 0;
Expand Down Expand Up @@ -2467,7 +2468,8 @@ procedure g_Game_StartClient(Addr: String; Port: Word; PW: String = 'ASS');
NetMyID := e_Raw_Read_Byte(Ptr);
NetPlrUID := e_Raw_Read_Word(Ptr);

gGameSettings.WAD := MapsDir + e_Raw_Read_String(Ptr);
WadName := e_Raw_Read_String(Ptr);
gGameSettings.WAD := MapsDir + WadName;
Map := e_Raw_Read_String(Ptr);

WHash := e_Raw_Read_MD5(Ptr);
Expand All @@ -2478,10 +2480,11 @@ procedure g_Game_StartClient(Addr: String; Port: Word; PW: String = 'ASS');
gGameSettings.Options := e_Raw_Read_LongWord(Ptr);
T := e_Raw_Read_LongWord(Ptr);

if FileExists(gGameSettings.WAD) then
newResPath := MapExist(MapsDir, WadName, WHash);
if newResPath = '' then
begin
gWADHash := MD5File(gGameSettings.WAD);
if not MD5Compare(gWADHash, WHash) then
newResPath := g_Res_DownloadMapFromServer(WadName);
if newResPath = '' then
begin
g_FatalError(_lc[I_NET_ERR_HASH]);
enet_packet_destroy(NetEvent.packet);
Expand All @@ -2490,6 +2493,7 @@ procedure g_Game_StartClient(Addr: String; Port: Word; PW: String = 'ASS');
end;
end;

gGameSettings.WAD := newResPath;
ResName := Map;

gPlayer1 := g_Player_Get(g_Player_Create(gPlayer1Settings.Model,
Expand Down
64 changes: 53 additions & 11 deletions DF Sources/g_map.pas
Expand Up @@ -3,7 +3,7 @@
Interface

Uses
e_graphics, g_basic, MAPSTRUCT, windows, g_textures,
e_graphics, g_basic, MAPSTRUCT, windows, g_textures, Classes,
g_phys, WADEDITOR, BinEditor, g_panel, md5asm;

Type
Expand All @@ -27,7 +27,7 @@ TRespawnPoint = record

PFlagPoint = ^TFlagPoint;
TFlagPoint = TRespawnPoint;

PFlag = ^TFlag;
TFlag = record
Obj: TObj;
Expand Down Expand Up @@ -107,6 +107,7 @@ procedure g_Map_LoadState(Var Mem: TBinMemoryReader);
gRelativeMapResStr: string = '';
gWADHash: TMD5Digest;
BackID: DWORD = DWORD(-1);
gExternalResources: TStringList;

Implementation

Expand Down Expand Up @@ -145,7 +146,7 @@ procedure CreateDoorMap();
end;
a, b, c, m, i, len: Integer;
ok: Boolean;

begin
if gWalls = nil then
Exit;
Expand Down Expand Up @@ -232,7 +233,7 @@ procedure CreateLiftMap();
Active: Boolean;
end;
a, b, c, len, i, j: Integer;
ok: Boolean;
ok: Boolean;

begin
if gLifts = nil then
Expand Down Expand Up @@ -390,7 +391,7 @@ function CreateTexture(RecName: String; Map: string; log: Boolean): Boolean;
with Textures[High(Textures)] do
begin
TextureName := RecName;

if TextureName = TEXTURE_NAME_WATER then
TextureID := TEXTURE_SPECIAL_WATER
else
Expand Down Expand Up @@ -461,7 +462,7 @@ function CreateAnimTexture(RecName: String; Map: string; log: Boolean): Boolean;
begin
Result := False;

// ×èòàåì WAD-ðåñóðñ àíèì.òåêñòóðû èç WAD'à â ïàìÿòü:
// ×èòàåì WAD-ðåñóðñ àíèì.òåêñòóðû èç WAD'à â ïàìÿòü:
g_ProcessResourceStr(RecName, WADName, SectionName, TextureName);

WAD := TWADEditor_1.Create();
Expand All @@ -485,7 +486,7 @@ function CreateAnimTexture(RecName: String; Map: string; log: Boolean): Boolean;
end;

WAD.FreeWAD();

if not WAD.ReadMemory(TextureWAD, ResLength) then
begin
FreeMem(TextureWAD);
Expand Down Expand Up @@ -565,7 +566,7 @@ procedure CreateItem(Item: TItemRec_1);
if (not (gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF])) and
ByteBool(Item.Options and ITEM_OPTION_ONLYDM) then
Exit;

g_Items_Create(Item.X, Item.Y, Item.ItemType, ByteBool(Item.Options and ITEM_OPTION_FALL),
gGameSettings.GameMode in [GM_DM, GM_TDM, GM_CTF, GM_COOP]);
end;
Expand Down Expand Up @@ -645,7 +646,7 @@ procedure CreateTrigger(Trigger: TTriggerRec_1; fTexturePanelType: Word);
_trigger: TTrigger;
begin
if g_Game_IsClient and not (Trigger.TriggerType in [TRIGGER_SOUND, TRIGGER_MUSIC]) then Exit;

with _trigger do
begin
X := Trigger.X;
Expand Down Expand Up @@ -692,7 +693,7 @@ procedure CreateMonster(monster: TMonsterRec_1);
procedure g_Map_ReAdd_DieTriggers();
var
i, a: Integer;

begin
if g_Game_IsClient then Exit;

Expand All @@ -709,6 +710,46 @@ procedure g_Map_ReAdd_DieTriggers();
end;
end;

function extractWadName(resourceName: string): string;
var posN: Integer;
begin
posN := Pos(':', resourceName);
if posN > 0 then
Result:= Copy(resourceName, 0, posN-1)
else
Result := '';
end;

procedure addResToExternalResList(res: string);
begin
res := extractWadName(res);
if (res <> '') and (gExternalResources.IndexOf(res) = -1) then
gExternalResources.Add(res);
end;

procedure generateExternalResourcesList(mapReader: TMapReader_1);
var
textures: TTexturesRec1Array;
mapHeader: TMapHeaderRec_1;
i: integer;
resFile: String;
begin
if gExternalResources = nil then
gExternalResources := TStringList.Create;

gExternalResources.Clear;
textures := mapReader.GetTextures();
for i := 0 to High(textures) do
begin
addResToExternalResList(resFile);
end;

mapHeader := mapReader.GetMapHeader;

addResToExternalResList(mapHeader.MusicName);
addResToExternalResList(mapHeader.SkyName);
end;

function g_Map_Load(Res: String): Boolean;
const
DefaultMusRes = 'Standart.wad:STDMUS\MUS1';
Expand Down Expand Up @@ -766,6 +807,7 @@ function g_Map_Load(Res: String): Boolean;
// Çàãðóçêà êàðòû:
g_Game_SetLoadingText(_lc[I_LOAD_MAP], 0, False);
MapReader := TMapReader_1.Create();

if not MapReader.LoadMap(Data) then
begin
g_FatalError(Format(_lc[I_GAME_ERROR_MAP_LOAD], [Res]));
Expand All @@ -775,7 +817,7 @@ function g_Map_Load(Res: String): Boolean;
end;

FreeMem(Data);

generateExternalResourcesList(MapReader);
// Çàãðóçêà òåêñòóð:
g_Game_SetLoadingText(_lc[I_LOAD_TEXTURES], 0, False);
_textures := MapReader.GetTextures();
Expand Down
98 changes: 96 additions & 2 deletions DF Sources/g_net.pas
Expand Up @@ -3,10 +3,10 @@
interface

uses
e_log, e_fixedbuffer, ENet, ENet_Types;
e_log, e_fixedbuffer, ENet, ENet_Types, Classes;

const
NET_PROTOCOL_VER = 141;
NET_PROTOCOL_VER = 142;

NET_MAXCLIENTS = 24;
NET_CHANS = 9;
Expand Down Expand Up @@ -53,6 +53,8 @@ TNetClient = record
end;
pTNetClient = ^TNetClient;

AByte = array of Byte;

var
NetInitDone: Boolean = False;
NetMode: Byte = NET_NONE;
Expand Down Expand Up @@ -116,6 +118,9 @@ procedure g_Net_Client_Send(Reliable: Boolean; Chan: Byte = NET_CHAN_GAME);
function g_Net_Client_Update(): enet_size_t;
function g_Net_Client_UpdateWhileLoading(): enet_size_t;

procedure g_Net_SendData(Data:AByte; peer: pENetPeer; Reliable: Boolean; Chan: Byte = NET_CHAN_GAME);
function g_net_Wait_Event(msgId: Word):TMemoryStream;

function IpToStr(IP: LongWord): string;

implementation
Expand Down Expand Up @@ -628,5 +633,94 @@ function IpToStr(IP: LongWord): string;
e_Raw_Seek(0);
end;

procedure g_Net_SendData(Data:AByte; peer: pENetPeer; Reliable: Boolean; Chan: Byte = NET_CHAN_GAME);
var
P: pENetPacket;
F: enet_uint32;
dataLength: Cardinal;
begin
P := nil;

dataLength := Length(Data);

if (Reliable) then
F := LongWord(ENET_PACKET_FLAG_RELIABLE)
else
F := 0;

if (peer <> nil) then
begin
P := enet_packet_create(@Data[0], dataLength, F);
if not Assigned(P) then Exit;
enet_peer_send(peer, Chan, P);
end
else
begin
P := enet_packet_create(@Data[0], dataLength, F);
if not Assigned(P) then Exit;

enet_host_widecast(NetHost, Chan, P);
end;

enet_host_flush(NetHost);
end;

function g_net_Wait_Event(msgId: Word):TMemoryStream;
var
downloadEvent: ENetEvent;
OuterLoop: Boolean;
MID: Byte;
Ptr: Pointer;
msgStream: TMemoryStream;
begin
msgStream := nil;
OuterLoop := True;
while OuterLoop do
begin
while (enet_host_service(NetHost, @downloadEvent, 0) > 0) do
begin
if (downloadEvent.kind = ENET_EVENT_TYPE_RECEIVE) then
begin
Ptr := downloadEvent.packet^.data;

MID := Byte(Ptr^);

if (MID = msgId) then
begin
msgStream := TMemoryStream.Create;
msgStream.SetSize(downloadEvent.packet^.dataLength);
msgStream.WriteBuffer(Ptr^, downloadEvent.packet^.dataLength);
msgStream.Seek(0, soFromBeginning);

OuterLoop := False;
enet_packet_destroy(downloadEvent.packet);
break;
end
else begin
enet_packet_destroy(downloadEvent.packet);
end;
end
else
if (downloadEvent.kind = ENET_EVENT_TYPE_DISCONNECT) then
begin
if (downloadEvent.data <= 7) then
g_Console_Add(_lc[I_NET_MSG_ERROR] + _lc[I_NET_ERR_CONN] + ' ' +
_lc[TStrings_Locale(Cardinal(I_NET_DISC_NONE) + downloadEvent.data)], True);
OuterLoop := False;
Break;
end;
end;

PreventWindowFromLockUp;

e_PollKeyboard();
if (e_KeyBuffer[1] = $080) or (e_KeyBuffer[57] = $080) then
begin
break;
end;
end;
Result := msgStream;
end;

end.

2 changes: 2 additions & 0 deletions DF Sources/g_nethandler.pas
Expand Up @@ -106,6 +106,8 @@ procedure g_Net_HostMsgHandler(S: pTNetClient; P: pENetPacket);
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_MAP_REQUEST: MH_RECV_MapRequest(S, B);
NET_MSG_RES_REQUEST: MH_RECV_ResRequest(S, B);
end;

enet_packet_destroy(P);
Expand Down

0 comments on commit bf82ff1

Please sign in to comment.