From e4be0065fb8b831cec90bfc66f6a91b2b0c04564 Mon Sep 17 00:00:00 2001 From: slipher Date: Tue, 5 Nov 2024 17:56:43 -0600 Subject: [PATCH] Clean up snapshot mess with #including gamelogic A shared header defined snapshot_t which was used in both the client and cgame, but with different definitions of the player state struct. For the cgame definition of playerState_t it included the file shared/bg_public.h from the gamelogic. Instead of this define an ipcSnapshot_t type which has a consistent definition and is used for IPC messages. Now snapshot_t will be defined and used only in the cgame. --- src/engine/client/cg_api.h | 22 ++++++++--------- src/engine/client/cg_msgdef.h | 43 +++++++++++++++------------------- src/engine/client/cl_cgame.cpp | 16 ++++++------- src/shared/client/cg_api.cpp | 2 +- src/shared/client/cg_api.h | 2 +- 5 files changed, 40 insertions(+), 45 deletions(-) diff --git a/src/engine/client/cg_api.h b/src/engine/client/cg_api.h index 9dada3c0b7..ff034d5fa1 100644 --- a/src/engine/client/cg_api.h +++ b/src/engine/client/cg_api.h @@ -25,10 +25,6 @@ along with this program. If not, see . #define CGAPI_H #include "engine/qcommon/q_shared.h" -#ifdef BUILD_CGAME -// TODO: find a better way that does not depend on a gamelogic file from an engine file -#include "shared/bg_public.h" -#endif #define CMD_BACKUP 64 #define CMD_MASK ( CMD_BACKUP - 1 ) @@ -41,7 +37,10 @@ along with this program. If not, see . // Snapshots are generated at regular time intervals by the server, // but they may not be sent if a client's rate level is exceeded, or // they may be dropped by the network. -struct snapshot_t + +// This particular struct is missing player state, which is added by other +// snapshot structs building on it. +struct snapshotBase_t { int snapFlags; // SNAPFLAG_RATE_DELAYED, etc int ping; @@ -50,12 +49,6 @@ struct snapshot_t byte areamask[ MAX_MAP_AREA_BYTES ]; // portalarea visibility bits -#ifdef BUILD_CGAME - playerState_t ps; // complete information about the current player at this time -#else - OpaquePlayerState ps; -#endif - // all of the entities that need to be presented at the time of this snapshot std::vector entities; @@ -63,6 +56,13 @@ struct snapshot_t std::vector serverCommands; }; +// used for IPC +struct ipcSnapshot_t +{ + snapshotBase_t b; + OpaquePlayerState ps; +}; + struct cgClientState_t { connstate_t connState; diff --git a/src/engine/client/cg_msgdef.h b/src/engine/client/cg_msgdef.h index 37e0c8ec37..f3f778b05f 100644 --- a/src/engine/client/cg_msgdef.h +++ b/src/engine/client/cg_msgdef.h @@ -29,35 +29,30 @@ along with this program. If not, see . #include "common/KeyIdentification.h" namespace Util { - template<> struct SerializeTraits { -#ifdef BUILD_ENGINE - static void Write(Writer& stream, const snapshot_t& snap) + template<> struct SerializeTraits { + static void Write(Writer& stream, const ipcSnapshot_t& snap) { - - stream.Write(snap.snapFlags); - stream.Write(snap.ping); - stream.Write(snap.serverTime); - stream.WriteData(&snap.areamask, MAX_MAP_AREA_BYTES); + stream.Write(snap.b.snapFlags); + stream.Write(snap.b.ping); + stream.Write(snap.b.serverTime); + stream.WriteData(&snap.b.areamask, MAX_MAP_AREA_BYTES); stream.Write(snap.ps); - stream.Write>(snap.entities); - stream.Write>(snap.serverCommands); + stream.Write>(snap.b.entities); + stream.Write>(snap.b.serverCommands); } -#endif -#ifdef BUILD_CGAME - static snapshot_t Read(Reader& stream) + + static ipcSnapshot_t Read(Reader& stream) { - snapshot_t snap; - snap.snapFlags = stream.Read(); - snap.ping = stream.Read(); - snap.serverTime = stream.Read(); - stream.ReadData(&snap.areamask, MAX_MAP_AREA_BYTES); - auto ops = stream.Read(); - memcpy(&snap.ps, &ops, sizeof(snap.ps)); - snap.entities = stream.Read>(); - snap.serverCommands = stream.Read>(); + ipcSnapshot_t snap; + snap.b.snapFlags = stream.Read(); + snap.b.ping = stream.Read(); + snap.b.serverTime = stream.Read(); + stream.ReadData(&snap.b.areamask, MAX_MAP_AREA_BYTES); + snap.ps = stream.Read(); + snap.b.entities = stream.Read>(); + snap.b.serverCommands = stream.Read>(); return snap; } -#endif }; // For skeletons, only send the bones which are used @@ -265,7 +260,7 @@ using GetCurrentSnapshotNumberMsg = IPC::SyncMessage< >; using GetSnapshotMsg = IPC::SyncMessage< IPC::Message, int>, - IPC::Reply + IPC::Reply >; using GetCurrentCmdNumberMsg = IPC::SyncMessage< IPC::Message>, diff --git a/src/engine/client/cl_cgame.cpp b/src/engine/client/cl_cgame.cpp index 23f9325064..79349175bb 100644 --- a/src/engine/client/cl_cgame.cpp +++ b/src/engine/client/cl_cgame.cpp @@ -281,7 +281,7 @@ void CL_FillServerCommands(std::vector& commands, int start, int en CL_GetSnapshot ==================== */ -bool CL_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ) +bool CL_GetSnapshot( int snapshotNumber, ipcSnapshot_t *snapshot ) { clSnapshot_t *clSnap; @@ -305,14 +305,14 @@ bool CL_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ) } // write the snapshot - snapshot->snapFlags = clSnap->snapFlags; - snapshot->ping = clSnap->ping; - snapshot->serverTime = clSnap->serverTime; - memcpy( snapshot->areamask, clSnap->areamask, sizeof( snapshot->areamask ) ); + snapshot->b.snapFlags = clSnap->snapFlags; + snapshot->b.ping = clSnap->ping; + snapshot->b.serverTime = clSnap->serverTime; + memcpy( snapshot->b.areamask, clSnap->areamask, sizeof( snapshot->b.areamask ) ); snapshot->ps = clSnap->ps; - snapshot->entities = clSnap->entities; + snapshot->b.entities = clSnap->entities; - CL_FillServerCommands(snapshot->serverCommands, clc.lastExecutedServerCommand + 1, clSnap->serverCommandNum); + CL_FillServerCommands(snapshot->b.serverCommands, clc.lastExecutedServerCommand + 1, clSnap->serverCommandNum); clc.lastExecutedServerCommand = clSnap->serverCommandNum; return true; @@ -1149,7 +1149,7 @@ void CGameVM::QVMSyscall(int syscallNum, Util::Reader& reader, IPC::Channel& cha break; case CG_GETSNAPSHOT: - IPC::HandleMsg(channel, std::move(reader), [this] (int number, bool& res, snapshot_t& snapshot) { + IPC::HandleMsg(channel, std::move(reader), [this] (int number, bool& res, ipcSnapshot_t& snapshot) { res = CL_GetSnapshot(number, &snapshot); }); break; diff --git a/src/shared/client/cg_api.cpp b/src/shared/client/cg_api.cpp index 1f1892df2c..c239c2d45e 100644 --- a/src/shared/client/cg_api.cpp +++ b/src/shared/client/cg_api.cpp @@ -84,7 +84,7 @@ void trap_GetCurrentSnapshotNumber( int *snapshotNumber, int *serverTime ) VM::SendMsg(*snapshotNumber, *serverTime); } -bool trap_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ) +bool trap_GetSnapshot( int snapshotNumber, ipcSnapshot_t *snapshot ) { bool res; VM::SendMsg(snapshotNumber, res, *snapshot); diff --git a/src/shared/client/cg_api.h b/src/shared/client/cg_api.h index 6146d28ad7..00c2847ca3 100644 --- a/src/shared/client/cg_api.h +++ b/src/shared/client/cg_api.h @@ -86,7 +86,7 @@ int trap_R_LerpTag( orientation_t *tag, const refEntity_t *refent, c void trap_R_GetTextureSize( qhandle_t handle, int *x, int *y ); qhandle_t trap_R_GenerateTexture( const byte *data, int x, int y ); void trap_GetCurrentSnapshotNumber( int *snapshotNumber, int *serverTime ); -bool trap_GetSnapshot( int snapshotNumber, snapshot_t *snapshot ); +bool trap_GetSnapshot( int snapshotNumber, ipcSnapshot_t *snapshot ); int trap_GetCurrentCmdNumber(); bool trap_GetUserCmd( int cmdNumber, usercmd_t *ucmd ); void trap_SetUserCmdValue( int stateValue, int flags, float sensitivityScale );