@@ -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+
365382CResource::~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
33133334void 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
0 commit comments