From 321a2f31a9f3e0edb7415ef462a694594c7adefd Mon Sep 17 00:00:00 2001 From: kotofyt Date: Sun, 8 Mar 2026 18:57:00 +0200 Subject: [PATCH] networking fixes --- engine/steamnetwork.cpp | 55 +++++++++++++++++++-- funnyassets/maps/test.fmap | 14 ++++++ game/client/entitysystem.cpp | 7 +-- game/client/milmoba/player.cpp | 44 ++++++++++++++++- game/client/{mapmgr.cpp => worldsystem.cpp} | 0 game/client/{mapmgr.h => worldsystem.h} | 0 game/server/entitysystem.cpp | 4 +- game/server/entitysystem.h | 2 +- game/server/game.cpp | 7 ++- game/server/milmoba/player.cpp | 12 +++-- game/server/milmoba/player.h | 4 +- game/server/worldsystem.cpp | 0 game/server/worldsystem.h | 0 13 files changed, 130 insertions(+), 19 deletions(-) create mode 100644 funnyassets/maps/test.fmap rename game/client/{mapmgr.cpp => worldsystem.cpp} (100%) rename game/client/{mapmgr.h => worldsystem.h} (100%) create mode 100644 game/server/worldsystem.cpp create mode 100644 game/server/worldsystem.h diff --git a/engine/steamnetwork.cpp b/engine/steamnetwork.cpp index b3913c4..63aacfc 100644 --- a/engine/steamnetwork.cpp +++ b/engine/steamnetwork.cpp @@ -37,6 +37,11 @@ public: CUtlVector m_hConnections; + CUtlVector m_incomingPackets = {}; + CUtlVector m_incomingSteamPackets = {}; + CUtlVector m_freeSteamPackets = {}; + CUtlLock m_lock; + STEAM_GAMESERVER_CALLBACK(CSteamNetworkServer, ClientConnected, SteamNetConnectionStatusChangedCallback_t); STEAM_GAMESERVER_CALLBACK(CSteamNetworkServer, SteamNetAuthenticated, SteamNetAuthenticationStatus_t); }; @@ -56,6 +61,31 @@ CSteamNetworkServer::~CSteamNetworkServer() void CSteamNetworkServer::NetThink() { + int nReceived = 1; + for ( auto p: m_freeSteamPackets ) + { + p->Release(); + } + m_freeSteamPackets = {}; + for ( auto &hC: m_hConnections) + { + nReceived = 1; + while (nReceived) + { + SteamNetworkingMessage_t *pMessages[64]; + nReceived = m_pInterface->ReceiveMessagesOnConnection(hC, pMessages, 64); + for ( int i = 0; i < nReceived; i++ ) + { + m_incomingSteamPackets.AppendTail(pMessages[i]); + NetPacket_t packet = {}; + packet.m_uOwner = pMessages[i]->GetConnection(); + packet.uSize = pMessages[i]->GetSize(); + packet.pData = (void*)pMessages[i]->GetData(); + m_incomingPackets.AppendTail(packet); + } + + } + } } void CSteamNetworkServer::SetCallback( NetCallbackFn fnCallback ) @@ -66,16 +96,30 @@ void CSteamNetworkServer::SetCallback( NetCallbackFn fnCallback ) uint32_t CSteamNetworkServer::BHasUpdates() { - return 0; + return m_incomingPackets.GetSize(); } NetPacket_t CSteamNetworkServer::PeekPacket() { + m_lock.Lock(); + if (!BHasUpdates()) + return {}; + NetPacket_t p = m_incomingPackets[0]; + m_lock.Unlock(); + return p; } NetPacket_t CSteamNetworkServer::RecievePacket() { - + m_lock.Lock(); + if (!BHasUpdates()) + return {}; + NetPacket_t p = m_incomingPackets[0]; + m_freeSteamPackets.AppendTail(m_incomingSteamPackets[0]); + m_incomingSteamPackets.RemoveHead(1); + m_incomingPackets.RemoveHead(1); + m_lock.Unlock(); + return p; } @@ -281,7 +325,12 @@ NetPacket_t CSteamNetworkClient::RecievePacket() void CSteamNetworkClient::SendPacket( NetPacket_t stPacket ) { - + if (stPacket.m_eArrival == PACKET_MAY_ARRIVE) + { + m_pInterface->SendMessageToConnection(m_hConnection, stPacket.pData, stPacket.uSize, k_nSteamNetworkingSend_Unreliable, 0); + } + if (stPacket.m_eArrival == PACKET_MUST_ARRIVE) + m_pInterface->SendMessageToConnection(m_hConnection, stPacket.pData, stPacket.uSize, k_nSteamNetworkingSend_Reliable, 0); } bool CSteamNetworkClient::BIsActive() diff --git a/funnyassets/maps/test.fmap b/funnyassets/maps/test.fmap new file mode 100644 index 0000000..7fee271 --- /dev/null +++ b/funnyassets/maps/test.fmap @@ -0,0 +1,14 @@ +[ + { + "classname": "prop_physics", + "model": "game/core/maps/test0.fmesh_c", + "physics": "static" + }, + + { + "classname": "prop_physics", + "model": "game/core/meshes/cube.fmesh_c", + "physics": "dynamic", + "origin": [ 0, 15, 0 ] + } +] diff --git a/game/client/entitysystem.cpp b/game/client/entitysystem.cpp index 859fde8..dc4dd8b 100644 --- a/game/client/entitysystem.cpp +++ b/game/client/entitysystem.cpp @@ -12,6 +12,7 @@ #include "netprotocol.h" +static C_BaseEntity *s_pLocalEntity; CEntitySystem *EntitySystem() { @@ -122,6 +123,7 @@ IEntityFactory *CEntitySystem::GetFactoryByClassname( const char *szName ) return NULL; } + void CEntitySystem::DestroyEntityByIndex( uint32_t uIndex ) { if ( uIndex >= MAX_EDICTS ) @@ -129,6 +131,8 @@ void CEntitySystem::DestroyEntityByIndex( uint32_t uIndex ) if (m_pEntities[uIndex]) { V_printf("Deleting: %i\n", uIndex); + if (m_pEntities[uIndex] == s_pLocalEntity) + s_pLocalEntity = 0; delete m_pEntities[uIndex]; m_pEntities[uIndex] = 0; } @@ -174,9 +178,6 @@ searchIndex: return (char*)pEntity+pCurrentMap->m_pFields[uCurrentIndex].m_uOffset; } - -static C_BaseEntity *s_pLocalEntity; - void CEntitySystem::NetRecvPacket( NetPacket_t *pPacket ) { PlayerPacket_t *pPlayerPacket = (PlayerPacket_t*)pPacket->pData; diff --git a/game/client/milmoba/player.cpp b/game/client/milmoba/player.cpp index 60de039..a6cb3f0 100644 --- a/game/client/milmoba/player.cpp +++ b/game/client/milmoba/player.cpp @@ -23,7 +23,8 @@ void C_MOBAPlayer::Think( float fDelta ) C_MOBAPlayer *pEntity = (C_MOBAPlayer*)UTIL_GetLocalPlayer(); - m_vMovementVector.x = m_bIsForward - m_bIsBack; + m_vMovementVector.z = m_bIsForward - m_bIsBack; + m_vMovementVector.x = m_bIsLeft - m_bIsRight; if (pEntity == this) { @@ -84,3 +85,44 @@ static void IN_BackUp( int c, char **v ) { ((C_MOBAPlayer*)pPlayer)->m_bIsBack = false; } static ConCommand endback("-back", IN_BackUp); + +static void IN_RightDown( int c, char **v ) { + C_BaseEntity *pPlayer = UTIL_GetLocalPlayer(); + if (!pPlayer) + return; + if (!dynamic_cast(pPlayer)) + return; + ((C_MOBAPlayer*)pPlayer)->m_bIsRight = true; +} +static ConCommand startright("+right", IN_RightDown); + +static void IN_RightUp( int c, char **v ) { + C_BaseEntity *pPlayer = UTIL_GetLocalPlayer(); + if (!pPlayer) + return; + if (!dynamic_cast(pPlayer)) + return; + ((C_MOBAPlayer*)pPlayer)->m_bIsRight = false; +} +static ConCommand endright("-right", IN_RightUp); + + +static void IN_LeftDown( int c, char **v ) { + C_BaseEntity *pPlayer = UTIL_GetLocalPlayer(); + if (!pPlayer) + return; + if (!dynamic_cast(pPlayer)) + return; + ((C_MOBAPlayer*)pPlayer)->m_bIsLeft = true; +} +static ConCommand startleft("+left", IN_LeftDown); + +static void IN_LeftUp( int c, char **v ) { + C_BaseEntity *pPlayer = UTIL_GetLocalPlayer(); + if (!pPlayer) + return; + if (!dynamic_cast(pPlayer)) + return; + ((C_MOBAPlayer*)pPlayer)->m_bIsLeft = false; +} +static ConCommand endleft("-left", IN_LeftUp); diff --git a/game/client/mapmgr.cpp b/game/client/worldsystem.cpp similarity index 100% rename from game/client/mapmgr.cpp rename to game/client/worldsystem.cpp diff --git a/game/client/mapmgr.h b/game/client/worldsystem.h similarity index 100% rename from game/client/mapmgr.h rename to game/client/worldsystem.h diff --git a/game/server/entitysystem.cpp b/game/server/entitysystem.cpp index d146ebd..fb114e4 100644 --- a/game/server/entitysystem.cpp +++ b/game/server/entitysystem.cpp @@ -113,7 +113,7 @@ IEntityFactory *CEntitySystem::GetFactoryByClassname( const char *szName ) return NULL; } -void CEntitySystem::Think() +void CEntitySystem::Think( float fDelta ) { CBaseEntity *pEntity; int i; @@ -128,7 +128,7 @@ void CEntitySystem::Think() if ( !pEntity->m_pfnThink ) continue; - (pEntity->*pEntity->m_pfnThink)(0); + (pEntity->*pEntity->m_pfnThink)(fDelta); } } diff --git a/game/server/entitysystem.h b/game/server/entitysystem.h index 160df08..440037f 100644 --- a/game/server/entitysystem.h +++ b/game/server/entitysystem.h @@ -24,7 +24,7 @@ public: virtual IEntityFactory *GetFactoryByClassname( const char *szName ); - virtual void Think(); + virtual void Think( float fDelta ); virtual CBaseEntity **GetEntities(); virtual void NetRecvPacket( NetPacket_t *pPacket ); diff --git a/game/server/game.cpp b/game/server/game.cpp index 167b7c5..6353dc2 100644 --- a/game/server/game.cpp +++ b/game/server/game.cpp @@ -162,12 +162,11 @@ void NET_ProcessPacket( INetworkBase *pBase ) if (g_pCurrentConnection) g_pCurrentConnection->SendPacket({&stLocalEntity, sizeof(stLocalEntity), 0, PACKET_MUST_ARRIVE}); } - return; + break; case MESSAGE_ENTITY_DATA_SYNC: EntitySystem()->NetRecvPacket(&packet); - pBase->RecievePacket(); + break; default: - pBase->RecievePacket(); break; } pBase->RecievePacket(); @@ -208,7 +207,7 @@ void CFunnyGameBridge::Frame( float fDelta ) if (g_pCurrentConnection) { g_pPhysicsWorld->Frame(fTickRate); - EntitySystem()->Think(); + EntitySystem()->Think(fTickRate); EntitySystem()->NetSendThink(g_pCurrentConnection); } } diff --git a/game/server/milmoba/player.cpp b/game/server/milmoba/player.cpp index 3c018ca..222b1fd 100644 --- a/game/server/milmoba/player.cpp +++ b/game/server/milmoba/player.cpp @@ -6,7 +6,7 @@ void CMOBAPlayer::Spawn() { - CPhysicsProp::Spawn(); + CBaseEntity::Spawn(); SetModel("game/core/models/cube.fmdl"); SetScale(1); SetThink(Think); @@ -14,8 +14,14 @@ void CMOBAPlayer::Spawn() void CMOBAPlayer::Think( float fDelta ) { - V_printf("%f %f %f\n", m_vMovementVector.x, m_vMovementVector.y, m_vMovementVector.z); - CPhysicsProp::Think(fDelta); + Vector vPosition = GetAbsOrigin(); + // player might lie to us + m_vMovementVector.x = glm_clamp(m_vMovementVector.x, -1, 1); + m_vMovementVector.y = glm_clamp(m_vMovementVector.y, -1, 1); + + vPosition.x += m_vMovementVector.x*fDelta*5; + vPosition.z += m_vMovementVector.z*fDelta*5; + SetAbsOrigin(vPosition); }; LINK_ENTITY_TO_CLASS(player, CMOBAPlayer) diff --git a/game/server/milmoba/player.h b/game/server/milmoba/player.h index f578bc9..cc6a44e 100644 --- a/game/server/milmoba/player.h +++ b/game/server/milmoba/player.h @@ -3,10 +3,10 @@ #include "physicsprop.h" -class CMOBAPlayer: public CPhysicsProp +class CMOBAPlayer: public CBaseModelEntity { public: - DECLARE_CLASS(CMOBAPlayer, CPhysicsProp); + DECLARE_CLASS(CMOBAPlayer, CBaseModelEntity); DECLARE_DATADESC(); DECLARE_SERVERCLASS() diff --git a/game/server/worldsystem.cpp b/game/server/worldsystem.cpp new file mode 100644 index 0000000..e69de29 diff --git a/game/server/worldsystem.h b/game/server/worldsystem.h new file mode 100644 index 0000000..e69de29