Skip to content

Commit cce4967

Browse files
committed
Add onPlayerResourceStart trigger check
Important: This commit also bumps _NETCODE_VERSION
1 parent 63b91ff commit cce4967

File tree

13 files changed

+182
-128
lines changed

13 files changed

+182
-128
lines changed

Client/mods/deathmatch/logic/CPacketHandler.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5023,8 +5023,9 @@ void CPacketHandler::Packet_ResourceStart(NetBitStreamInterface& bitStream)
50235023
uiTotalSizeProcessed = 0;
50245024

50255025
/*
5026-
* unsigned char (1) - resource name size
5026+
* unsigned char (1) - resource name size
50275027
* unsigned char (x) - resource name
5028+
* unsigned int (4) - start counter
50285029
* unsigned short (2) - resource id
50295030
* unsigned short (2) - resource entity id
50305031
* unsigned short (2) - resource dynamic entity id
@@ -5079,6 +5080,10 @@ void CPacketHandler::Packet_ResourceStart(NetBitStreamInterface& bitStream)
50795080
return;
50805081
}
50815082

5083+
// Start counter
5084+
unsigned int startCounter{};
5085+
bitStream.Read(startCounter);
5086+
50825087
// Resource ID
50835088
unsigned short usResourceID;
50845089
bitStream.Read(usResourceID);
@@ -5122,6 +5127,7 @@ void CPacketHandler::Packet_ResourceStart(NetBitStreamInterface& bitStream)
51225127
{
51235128
pResource->SetRemainingNoClientCacheScripts(usNoClientCacheScriptCount);
51245129
pResource->SetDownloadPriorityGroup(iDownloadPriorityGroup);
5130+
pResource->SetStartCounter(startCounter);
51255131

51265132
// Resource Chunk Type (F = Resource File, E = Exported Function)
51275133
unsigned char ucChunkType;

Client/mods/deathmatch/logic/CResource.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ void CResource::Load()
341341
{
342342
// Write resource net ID
343343
pBitStream->Write(GetNetID());
344+
pBitStream->Write(GetStartCounter());
344345
g_pNet->SendPacket(PACKET_ID_PLAYER_RESOURCE_START, pBitStream, PACKET_PRIORITY_HIGH, PACKET_RELIABILITY_RELIABLE_ORDERED);
345346
g_pNet->DeallocateNetBitStream(pBitStream);
346347
}

Client/mods/deathmatch/logic/CResource.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,13 @@ class CResource
110110
int GetDownloadPriorityGroup() { return m_iDownloadPriorityGroup; }
111111
void SetDownloadPriorityGroup(int iDownloadPriorityGroup) { m_iDownloadPriorityGroup = iDownloadPriorityGroup; }
112112

113+
void SetStartCounter(unsigned int startCounter) { m_startCounter = startCounter; }
114+
unsigned int GetStartCounter() const noexcept { return m_startCounter; }
115+
113116
private:
114117
unsigned short m_usNetID;
115118
uint m_uiScriptID;
119+
unsigned int m_startCounter{};
116120
SString m_strResourceName;
117121
CLuaMain* m_pLuaVM;
118122
CLuaManager* m_pLuaManager;

Server/mods/deathmatch/logic/CGame.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1555,6 +1555,9 @@ void CGame::QuitPlayer(CPlayer& Player, CClient::eQuitReasons Reason, bool bSayI
15551555

15561556
Player.CallEvent("onPlayerQuit", Arguments);
15571557

1558+
// Tell the resource manager
1559+
m_pResourceManager->OnPlayerQuit(Player);
1560+
15581561
// Tell the map manager
15591562
m_pMapManager->OnPlayerQuit(Player);
15601563

@@ -4172,17 +4175,16 @@ void CGame::Packet_PlayerNetworkStatus(CPlayerNetworkStatusPacket& Packet)
41724175

41734176
void CGame::Packet_PlayerResourceStart(CPlayerResourceStartPacket& Packet)
41744177
{
4175-
CPlayer* pPlayer = Packet.GetSourcePlayer();
4176-
if (pPlayer)
4177-
{
4178-
CResource* pResource = Packet.GetResource();
4179-
if (pResource)
4180-
{
4181-
CLuaArguments Arguments;
4182-
Arguments.PushResource(pResource);
4183-
pPlayer->CallEvent("onPlayerResourceStart", Arguments, NULL);
4184-
}
4185-
}
4178+
CPlayer* sourcePlayer = Packet.GetSourcePlayer();
4179+
CResource* resource = Packet.GetResource();
4180+
unsigned int playerStartCounter = Packet.GetStartCounter();
4181+
4182+
if (!sourcePlayer || !resource || !resource->CanPlayerTriggerResourceStart(sourcePlayer, playerStartCounter))
4183+
return;
4184+
4185+
CLuaArguments Arguments;
4186+
Arguments.PushResource(resource);
4187+
sourcePlayer->CallEvent("onPlayerResourceStart", Arguments, nullptr);
41864188
}
41874189

41884190
void CGame::Packet_PlayerWorldSpecialProperty(CPlayerWorldSpecialPropertyPacket& packet) noexcept

Server/mods/deathmatch/logic/CResource.cpp

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,23 @@ void CResource::Reload()
362362
Load();
363363
}
364364

365+
bool CResource::CanPlayerTriggerResourceStart(CPlayer* player, unsigned int playerStartCounter)
366+
{
367+
if (playerStartCounter != m_startCounter || m_eState != EResourceState::Running)
368+
return false;
369+
370+
if (m_isRunningForPlayer.contains(player))
371+
return false;
372+
373+
m_isRunningForPlayer.insert(player);
374+
return true;
375+
}
376+
377+
void CResource::OnPlayerQuit(CPlayer& Player)
378+
{
379+
m_isRunningForPlayer.erase(&Player);
380+
}
381+
365382
CResource::~CResource()
366383
{
367384
CIdArray::PushUniqueId(this, EIdClass::RESOURCE, m_uiScriptID);
@@ -1017,6 +1034,7 @@ bool CResource::Start(std::list<CResource*>* pDependents, bool bManualStart, con
10171034
return false;
10181035
}
10191036

1037+
m_startCounter = std::max<unsigned int>(m_startCounter + 1, 1); // We consider zero to be an invalid start counter.
10201038
m_bStartedManually = bManualStart;
10211039

10221040
// Remember the client files state
@@ -1028,7 +1046,7 @@ bool CResource::Start(std::list<CResource*>* pDependents, bool bManualStart, con
10281046

10291047
// Broadcast new resourceelement that is loaded and tell the players that a new resource was started
10301048
g_pGame->GetMapManager()->BroadcastResourceElements(m_pResourceElement, m_pDefaultElementGroup);
1031-
g_pGame->GetPlayerManager()->BroadcastOnlyJoined(CResourceStartPacket(m_strResourceName.c_str(), this));
1049+
g_pGame->GetPlayerManager()->BroadcastOnlyJoined(CResourceStartPacket(m_strResourceName, this, m_startCounter));
10321050
SendNoClientCacheScripts();
10331051
m_bClientSync = true;
10341052

@@ -1174,6 +1192,9 @@ bool CResource::Stop(bool bManualStop)
11741192
// Broadcast the packet to joined players
11751193
g_pGame->GetPlayerManager()->BroadcastOnlyJoined(removePacket);
11761194

1195+
// Clear the list of players where this resource is running
1196+
std::exchange(m_isRunningForPlayer, {});
1197+
11771198
OnResourceStateChange("loaded");
11781199
m_eState = EResourceState::Loaded;
11791200
return true;
@@ -3312,8 +3333,7 @@ bool CResource::CheckState()
33123333

33133334
void CResource::OnPlayerJoin(CPlayer& Player)
33143335
{
3315-
// do the player join crap
3316-
Player.Send(CResourceStartPacket(m_strResourceName.c_str(), this));
3336+
Player.Send(CResourceStartPacket(m_strResourceName.c_str(), this, m_startCounter));
33173337
SendNoClientCacheScripts(&Player);
33183338
}
33193339

Server/mods/deathmatch/logic/CResource.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ class CResource : public EHS
153153

154154
void Reload();
155155

156+
bool CanPlayerTriggerResourceStart(CPlayer* player, unsigned int playerStartCounter);
157+
156158
// Get a resource default setting
157159
bool GetDefaultSetting(const char* szName, char* szValue, size_t sizeBuffer);
158160

@@ -268,6 +270,7 @@ class CResource : public EHS
268270
uint GetScriptID() const noexcept { return m_uiScriptID; }
269271

270272
void OnPlayerJoin(CPlayer& Player);
273+
void OnPlayerQuit(CPlayer& Player);
271274
void SendNoClientCacheScripts(CPlayer* pPlayer = nullptr);
272275

273276
void OnResourceStateChange(const char* state) noexcept;
@@ -395,6 +398,9 @@ class CResource : public EHS
395398
CElementGroup* m_pDefaultElementGroup = nullptr; // stores elements created by scripts in this resource
396399
CLuaMain* m_pVM = nullptr;
397400

401+
unsigned int m_startCounter{};
402+
std::unordered_set<CPlayer*> m_isRunningForPlayer;
403+
398404
KeyValueMap m_Info;
399405
std::list<CIncludedResources*> m_IncludedResources; // we store them here temporarily, then read them once all the resources are loaded
400406
std::list<CResourceFile*> m_ResourceFiles;

Server/mods/deathmatch/logic/CResourceManager.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,14 @@ void CResourceManager::OnPlayerJoin(CPlayer& Player)
543543
}
544544
}
545545

546+
void CResourceManager::OnPlayerQuit(CPlayer& Player)
547+
{
548+
for (CResource* resource : CResource::m_StartedResources)
549+
{
550+
resource->OnPlayerQuit(Player);
551+
}
552+
}
553+
546554
//
547555
// Add resource <-> luaVM lookup mapping
548556
//

Server/mods/deathmatch/logic/CResourceManager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ class CResourceManager
6767
unsigned int GetResourceLoadedCount() { return m_uiResourceLoadedCount; }
6868
unsigned int GetResourceFailedCount() { return m_uiResourceFailedCount; }
6969
void OnPlayerJoin(CPlayer& Player);
70+
void OnPlayerQuit(CPlayer& Player);
7071

7172
const char* GetResourceDirectory();
7273

Server/mods/deathmatch/logic/packets/CPlayerResourceStartPacket.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,11 @@
1515

1616
bool CPlayerResourceStartPacket::Read(NetBitStreamInterface& BitStream)
1717
{
18-
ushort usResourceNetId;
19-
BitStream.Read(usResourceNetId);
18+
ushort usResourceNetId{};
19+
20+
if (!BitStream.Read(usResourceNetId) || !BitStream.Read(m_startCounter))
21+
return false;
22+
2023
m_pResource = g_pGame->GetResourceManager()->GetResourceFromNetID(usResourceNetId);
2124
return true;
2225
}

Server/mods/deathmatch/logic/packets/CPlayerResourceStartPacket.h

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,18 @@ class CResource;
1717
class CPlayerResourceStartPacket final : public CPacket
1818
{
1919
public:
20-
CPlayerResourceStartPacket() {}
20+
CPlayerResourceStartPacket() = default;
2121

22-
ePacketID GetPacketID() const { return PACKET_ID_PLAYER_RESOURCE_START; }
23-
unsigned long GetFlags() const { return PACKET_HIGH_PRIORITY | PACKET_RELIABLE | PACKET_SEQUENCED; };
24-
virtual ePacketOrdering GetPacketOrdering() const { return PACKET_ORDERING_DEFAULT; }
22+
ePacketID GetPacketID() const override { return PACKET_ID_PLAYER_RESOURCE_START; }
23+
unsigned long GetFlags() const override { return PACKET_HIGH_PRIORITY | PACKET_RELIABLE | PACKET_SEQUENCED; }
24+
ePacketOrdering GetPacketOrdering() const override { return PACKET_ORDERING_DEFAULT; }
2525

2626
bool Read(NetBitStreamInterface& BitStream);
2727

28-
CResource* GetResource() const { return m_pResource; }
28+
CResource* GetResource() const noexcept { return m_pResource; }
29+
unsigned int GetStartCounter() const noexcept { return m_startCounter; }
2930

3031
private:
31-
CResource* m_pResource;
32+
CResource* m_pResource{};
33+
unsigned int m_startCounter{};
3234
};

0 commit comments

Comments
 (0)