Skip to content

Commit 0440f81

Browse files
authored
Merge pull request #1150 from openmultiplayer/amir/changes
fix slot reserving for players outside of raknet
2 parents 2832ec0 + c622068 commit 0440f81

File tree

4 files changed

+56
-2
lines changed

4 files changed

+56
-2
lines changed

Server/Components/LegacyNetwork/legacy_network_impl.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,12 @@ RakNetLegacyNetwork::~RakNetLegacyNetwork()
291291
core->getPlayers().getPlayerChangeDispatcher().removeEventHandler(this);
292292
core->getPlayers().getPlayerConnectDispatcher().removeEventHandler(this);
293293
}
294+
295+
if (npcComponent)
296+
{
297+
npcComponent->getPoolEventDispatcher().removeEventHandler(this);
298+
}
299+
294300
rakNetServer.Disconnect(300);
295301
RakNet::RakNetworkFactory::DestroyRakServerInterface(&rakNetServer);
296302
}
@@ -899,6 +905,15 @@ void RakNetLegacyNetwork::start()
899905
{
900906
SAMPRakNet::SetGracePeriod(*gracePeriod);
901907
}
908+
909+
// Set reserved slots based on NPC count once more because slots reserved
910+
// Before RakServer::Start are reset because RakPeer::Start calls RakPeer::Disconnect
911+
// As well which resets the value for RakPeer::reservedSlots class member.
912+
// Note: this behavior does not affect slots reserved in next executions.
913+
if (npcComponent)
914+
{
915+
rakNetServer.ReserveSlots(npcComponent->count());
916+
}
902917
}
903918

904919
void RakNetLegacyNetwork::onTick(Microseconds elapsed, TimePoint now)

Server/Components/LegacyNetwork/legacy_network_impl.hpp

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include <raknet/RakNetworkFactory.h>
2121
#include <raknet/RakServerInterface.h>
2222
#include <raknet/StringCompressor.h>
23+
#include <Server/Components/NPCs/npcs.hpp>
2324

2425
using namespace Impl;
2526

@@ -34,7 +35,7 @@ static const StaticArray<StringView, 2> ProtectedRules = {
3435

3536
class Core;
3637

37-
class RakNetLegacyNetwork final : public Network, public CoreEventHandler, public PlayerConnectEventHandler, public PlayerChangeEventHandler, public INetworkQueryExtension
38+
class RakNetLegacyNetwork final : public Network, public CoreEventHandler, public PlayerConnectEventHandler, public PlayerChangeEventHandler, public INetworkQueryExtension, public PoolEventHandler<INPC>
3839
{
3940
private:
4041
ICore* core = nullptr;
@@ -44,8 +45,24 @@ class RakNetLegacyNetwork final : public Network, public CoreEventHandler, publi
4445
StaticArray<RakNet::RakPeer::RemoteSystemStruct*, PLAYER_POOL_SIZE> playerRemoteSystem;
4546
Milliseconds cookieSeedTime;
4647
TimePoint lastCookieSeed;
48+
INPCComponent* npcComponent = nullptr;
4749

4850
public:
51+
inline void setNPCComponent(INPCComponent* comp)
52+
{
53+
npcComponent = comp;
54+
55+
if (npcComponent)
56+
{
57+
npcComponent->getPoolEventDispatcher().addEventHandler(this);
58+
}
59+
}
60+
61+
inline INPCComponent* getNPCComponent()
62+
{
63+
return npcComponent;
64+
}
65+
4966
inline void setQueryConsole(IConsoleComponent* console)
5067
{
5168
query.setConsole(console);
@@ -309,6 +326,22 @@ class RakNetLegacyNetwork final : public Network, public CoreEventHandler, publi
309326
query.buildPlayerDependentBuffers(&player);
310327
}
311328

329+
void onPoolEntryCreated(INPC& npc) override
330+
{
331+
if (npcComponent)
332+
{
333+
rakNetServer.ReserveSlots(npcComponent->count());
334+
}
335+
}
336+
337+
void onPoolEntryDestroyed(INPC& npc) override
338+
{
339+
if (npcComponent)
340+
{
341+
rakNetServer.ReserveSlots(npcComponent->count());
342+
}
343+
}
344+
312345
bool addRule(StringView rule, StringView value) override
313346
{
314347
if (isRuleProtected(rule))

Server/Components/LegacyNetwork/legacy_network_main.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class RakNetLegacyNetworkComponent final : public INetworkComponent
2828
void onInit(IComponentList* components) override
2929
{
3030
legacyNetwork.setQueryConsole(components->queryComponent<IConsoleComponent>());
31+
legacyNetwork.setNPCComponent(components->queryComponent<INPCComponent>());
3132
}
3233

3334
void onFree(IComponent* component) override
@@ -36,6 +37,11 @@ class RakNetLegacyNetworkComponent final : public INetworkComponent
3637
{
3738
legacyNetwork.setQueryConsole(nullptr);
3839
}
40+
41+
if (component == legacyNetwork.getNPCComponent())
42+
{
43+
legacyNetwork.setNPCComponent(nullptr);
44+
}
3945
}
4046

4147
INetwork* getNetwork() override

0 commit comments

Comments
 (0)