mirror of
https://foundry.openuru.org/gitblit/r/CWE-ou-minkata.git
synced 2025-07-17 10:52:46 +00:00
@ -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