mirror of
https://foundry.openuru.org/gitblit/r/CWE-ou-minkata.git
synced 2025-07-17 02:51:27 +00:00
Track NPC clones
Manual state management in python was kind of fiddly, so let's track all avatar clones in the NetApp and unload them as needed. This also seems to fix a potential bug in plNPCSpawnMod (is that even used?).
This commit is contained in:
@ -223,6 +223,7 @@ void plNCAgeLeaver::ExecNextOp () {
|
||||
plAgeLoader::GetInstance()->UnloadAge(); // unload age
|
||||
nc->ISendCameraReset(false/*leaving age*/); // reset camera
|
||||
nc->IUnloadRemotePlayers(); // unload other players
|
||||
nc->IUnloadNPCs(); // unload non-player clones
|
||||
|
||||
if (NetCommNeedToLoadAvatar())
|
||||
am->UnLoadLocalPlayer();
|
||||
|
@ -181,13 +181,9 @@ void plNetClientMgr::Shutdown()
|
||||
|
||||
plNetLinkingMgr::GetInstance()->LeaveAge(true);
|
||||
|
||||
// release existing remote players
|
||||
int i;
|
||||
for (i=0;i<RemotePlayerKeys().size();i++)
|
||||
{
|
||||
plKey k=RemotePlayerKeys()[i];
|
||||
plAvatarMgr::GetInstance()->UnLoadRemotePlayer(k);
|
||||
}
|
||||
// release all avatar clones
|
||||
IUnloadRemotePlayers();
|
||||
IUnloadNPCs();
|
||||
|
||||
// Finally, pump the dispatch system so all the new refs get delivered.
|
||||
plgDispatch::Dispatch()->MsgQueueProcess();
|
||||
@ -197,7 +193,7 @@ void plNetClientMgr::Shutdown()
|
||||
delete fMsgRecorder;
|
||||
fMsgRecorder = nil;
|
||||
}
|
||||
for (i = 0; i < fMsgPlayers.size(); i++)
|
||||
for (int i = 0; i < fMsgPlayers.size(); i++)
|
||||
delete fMsgPlayers[i];
|
||||
fMsgPlayers.clear();
|
||||
|
||||
@ -424,9 +420,19 @@ int plNetClientMgr::IPrepMsg(plNetMessage* msg)
|
||||
//
|
||||
void plNetClientMgr::IUnloadRemotePlayers()
|
||||
{
|
||||
for(int i=RemotePlayerKeys().size()-1;i>=0;i--)
|
||||
plAvatarMgr::GetInstance()->UnLoadRemotePlayer(RemotePlayerKeys()[i]);
|
||||
hsAssert(!RemotePlayerKeys().size(),"Still remote players left when linking out");
|
||||
for (size_t i = fRemotePlayerKeys.size(); i > 0; --i)
|
||||
plAvatarMgr::GetInstance()->UnLoadAvatar(fRemotePlayerKeys[i-1], true);
|
||||
hsAssert(fRemotePlayerKeys.empty(), "Still remote players left when linking out");
|
||||
}
|
||||
|
||||
//
|
||||
// unload NPCs since we're leaving the age
|
||||
//
|
||||
void plNetClientMgr::IUnloadNPCs()
|
||||
{
|
||||
for (size_t i = fNPCKeys.size(); i > 0; --i)
|
||||
plAvatarMgr::GetInstance()->UnLoadAvatar(fNPCKeys[i-1], false);
|
||||
hsAssert(fNPCKeys.empty(), "Still npcs left when linking out");
|
||||
}
|
||||
|
||||
//
|
||||
@ -853,6 +859,31 @@ plSynchedObject* plNetClientMgr::GetLocalPlayer(hsBool forceLoad) const
|
||||
plSynchedObject::ConvertNoRef(fLocalPlayerKey->ObjectIsLoaded()) : nil;
|
||||
}
|
||||
|
||||
plSynchedObject* plNetClientMgr::GetNPC(uint32_t i) const
|
||||
{
|
||||
return fNPCKeys[i] ? plSynchedObject::ConvertNoRef(fNPCKeys[i]->ObjectIsLoaded()) : nil;
|
||||
}
|
||||
|
||||
void plNetClientMgr::AddNPCKey(const plKey& npc)
|
||||
{
|
||||
// note: npc keys have little sanity checking...
|
||||
hsAssert(npc, "adding nil npc key? naughty, naughty...");
|
||||
fNPCKeys.push_back(npc);
|
||||
}
|
||||
|
||||
bool plNetClientMgr::IsNPCKey(const plKey& npc, int* idx) const
|
||||
{
|
||||
if (npc)
|
||||
{
|
||||
plKeyVec::const_iterator it = std::find(fNPCKeys.begin(), fNPCKeys.end(), npc);
|
||||
bool found = it != fNPCKeys.end();
|
||||
if (idx)
|
||||
*idx = found ? (it - fNPCKeys.begin()) : -1;
|
||||
return found;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//
|
||||
// return a ptr to a remote player
|
||||
//
|
||||
|
@ -153,7 +153,7 @@ private:
|
||||
// cached char info
|
||||
plKey fLocalPlayerKey;
|
||||
plKeyVec fRemotePlayerKeys;
|
||||
// plKeyVec fNPCKeys;
|
||||
plKeyVec fNPCKeys;
|
||||
|
||||
class plNetClientMgrMsg * fDisableMsg;
|
||||
|
||||
@ -222,6 +222,7 @@ private:
|
||||
void IRemoveCloneRoom();
|
||||
|
||||
void IUnloadRemotePlayers();
|
||||
void IUnloadNPCs();
|
||||
|
||||
plKey ILoadClone(plLoadCloneMsg *cloneMsg);
|
||||
|
||||
@ -309,9 +310,15 @@ public:
|
||||
|
||||
// avatar vault actions
|
||||
int UploadPlayerVault(uint32_t vaultFlags);
|
||||
|
||||
// npc clones
|
||||
const plKeyVec& NPCKeys() const { return fNPCKeys; }
|
||||
plSynchedObject* GetNPC(uint32_t i) const;
|
||||
void AddNPCKey(const plKey& npc);
|
||||
bool IsNPCKey(const plKey& npc, int* idx=nil) const;
|
||||
|
||||
// remote players
|
||||
const std::vector<plKey>& RemotePlayerKeys() const { return fRemotePlayerKeys; }
|
||||
const plKeyVec& RemotePlayerKeys() const { return fRemotePlayerKeys; }
|
||||
plSynchedObject* GetRemotePlayer(int i) const;
|
||||
void AddRemotePlayerKey(plKey p);
|
||||
hsBool IsRemotePlayerKey(const plKey p, int* idx=nil);
|
||||
|
@ -113,13 +113,16 @@ plKey plNetClientMgr::ILoadClone(plLoadCloneMsg *pCloneMsg)
|
||||
|
||||
// check if local or remote player before loading
|
||||
plLoadAvatarMsg* loadAvMsg=plLoadAvatarMsg::ConvertNoRef(pCloneMsg);
|
||||
if (loadAvMsg && loadAvMsg->GetIsPlayer())
|
||||
if (loadAvMsg)
|
||||
{
|
||||
bool originating = ( pCloneMsg->GetOriginatingPlayerID() == this->GetPlayerID() );
|
||||
if (originating)
|
||||
fLocalPlayerKey = cloneKey;
|
||||
else
|
||||
AddRemotePlayerKey(cloneKey);
|
||||
if (loadAvMsg->GetIsPlayer())
|
||||
if (originating)
|
||||
fLocalPlayerKey = cloneKey;
|
||||
else
|
||||
AddRemotePlayerKey(cloneKey);
|
||||
else // hey, we got a quab or yeesha... or some other such devilry...
|
||||
AddNPCKey(cloneKey);
|
||||
}
|
||||
|
||||
plKey cloneNodeKey = hsgResMgr::ResMgr()->FindKey(kNetClientCloneRoom_KEY);
|
||||
@ -139,6 +142,12 @@ plKey plNetClientMgr::ILoadClone(plLoadCloneMsg *pCloneMsg)
|
||||
return cloneKey;
|
||||
}
|
||||
|
||||
// need to drop our ref if it's an NPC
|
||||
// remote players handled by plPlayerPageMsg--don't sweat that
|
||||
plKeyVec::iterator it = std::find(fNPCKeys.begin(), fNPCKeys.end(), cloneKey);
|
||||
if (it != fNPCKeys.end())
|
||||
fNPCKeys.erase(it);
|
||||
|
||||
ICheckPendingStateLoad(hsTimer::GetSysSeconds());
|
||||
plSynchEnabler p(false); // turn off dirty tracking while in this function
|
||||
|
||||
|
Reference in New Issue
Block a user