//============================================================================ bool plNCAgeJoiner::MsgReceive (plMessage * msg) { plNetClientMgr * nc = plNetClientMgr::GetInstance(); plAvatarMgr * am = plAvatarMgr::GetInstance(); plAgeLoader * al = plAgeLoader::GetInstance(); //======================================================================== // Finished updating the age from FileSrv //======================================================================== if (plResPatcherMsg * resMsg = plResPatcherMsg::ConvertNoRef(msg)) { if (resMsg->Success()) { nc->ResetServerTimeOffset(); NetCommLinkToAge( age, this ); LogMsg(kLogPerf, L"AgeJoiner: Next:kNoOp (age updated)"); } else Complete(false, resMsg->GetError()); return true; } //======================================================================== // Connected to age instance //======================================================================== if (plNetCommLinkToAgeMsg * linkToAgeMsg = plNetCommLinkToAgeMsg::ConvertNoRef(msg)) { if (IS_NET_ERROR(linkToAgeMsg->result)) { Complete(false, "LinkToAge failed"); } else if (unsigned ageVaultId = NetCommGetAge()->ageVaultId) { // Download the age vault VaultDownload( L"AgeJoin", ageVaultId, AgeVaultDownloadCallback, this, nil, // FVaultDownloadProgressCallback this ); } else { // not vault to downloaded, just start loading age data LogMsg(kLogPerf, L"AgeJoiner: Next:kLoadAge (no vault)"); nextOp = kLoadAge; } return true; } //======================================================================== // All age data paged in //======================================================================== if (plAgeLoaded2Msg * ageLoaded2Msg = plAgeLoaded2Msg::ConvertNoRef(msg)) { // Exec custom age settings al->ExecPendingAgeFniFiles(); al->ExecPendingAgeCsvFiles(); LogMsg(kLogPerf, L"AgeJoiner: Next:kLoadPlayer"); nextOp = kLoadPlayer; return true; } //======================================================================== // Local avatar loaded //======================================================================== plPlayerPageMsg * playerPageMsg = plPlayerPageMsg::ConvertNoRef(msg); if (playerPageMsg && !playerPageMsg->fUnload && playerPageMsg->fPlayer && playerPageMsg->fLocallyOriginated) { if (NetCommNeedToLoadAvatar()) NetCommSetAvatarLoaded(); LogMsg(kLogPerf, L"AgeJoiner: Next:kPropagatePlayer"); nextOp = kPropagatePlayer; return false; // NetClientMgr must also handle this message } //======================================================================== // Received all SDL states //======================================================================== plNetClientMgrMsg * netClientMgrMsg = plNetClientMgrMsg::ConvertNoRef(msg); if (netClientMgrMsg && netClientMgrMsg->type == plNetClientMgrMsg::kNotifyRcvdAllSDLStates) { LogMsg(kLogPerf, L"AgeJoiner: Next:kEnableClickables"); nextOp = kDestroyProgressBar; return true; } //======================================================================== // Done loading all states. Time to link in! //======================================================================== plInitialAgeStateLoadedMsg * stateMsg = plInitialAgeStateLoadedMsg::ConvertNoRef(msg); if(stateMsg) { plNetObjectDebugger::GetInstance()->LogMsg("OnServerInitComplete"); nc->SetFlagsBit(plNetClientApp::kLoadingInitialAgeState, false); const plArmatureMod *avMod = plAvatarMgr::GetInstance()->GetLocalAvatar(); plLinkEffectsTriggerMsg* lem = new plLinkEffectsTriggerMsg(); lem->SetLeavingAge(false); // linking in lem->SetLinkKey(nc->GetLocalPlayerKey()); plKey animKey = avMod->GetLinkInAnimKey(); lem->SetLinkInAnimKey(animKey); // indicate if we are invisible if (avMod && avMod->IsInStealthMode() && avMod->GetTarget(0)) lem->SetInvisLevel(avMod->GetStealthLevel()); lem->SetBCastFlag(plMessage::kNetPropagate); lem->MuteLinkSfx(muteLinkSfx); lem->AddReceiver(hsgResMgr::ResMgr()->FindKey(plUoid(kLinkEffectsMgr_KEY))); lem->AddReceiver(hsgResMgr::ResMgr()->FindKey(plUoid(kClient_KEY))); lem->Send(); Complete(true, "Age joined"); return true; } return false; }
//============================================================================ bool plNCAgeJoiner::MsgReceive (plMessage * msg) { plNetClientMgr * nc = plNetClientMgr::GetInstance(); plAvatarMgr * am = plAvatarMgr::GetInstance(); plAgeLoader * al = plAgeLoader::GetInstance(); //======================================================================== // Finished updating the age from FileSrv //======================================================================== if (plResPatcherMsg * resMsg = plResPatcherMsg::ConvertNoRef(msg)) { if (resMsg->Success()) { nc->ResetServerTimeOffset(); NetCommLinkToAge( age, this ); LogMsg(kLogPerf, L"AgeJoiner: Next:kNoOp (age updated)"); } else Complete(false, resMsg->GetError()); return true; } //======================================================================== // Connected to age instance //======================================================================== if (plNetCommLinkToAgeMsg * linkToAgeMsg = plNetCommLinkToAgeMsg::ConvertNoRef(msg)) { if (IS_NET_ERROR(linkToAgeMsg->result)) { Complete(false, "LinkToAge failed"); } else if (unsigned ageVaultId = NetCommGetAge()->ageVaultId) { // Download the age vault VaultDownload( L"AgeJoin", ageVaultId, AgeVaultDownloadCallback, this, nil, // FVaultDownloadProgressCallback this ); } else { // not vault to downloaded, just start loading age data LogMsg(kLogPerf, L"AgeJoiner: Next:kLoadAge (no vault)"); nextOp = kLoadAge; } return true; } //======================================================================== // All age data paged in //======================================================================== if (plAgeLoaded2Msg * ageLoaded2Msg = plAgeLoaded2Msg::ConvertNoRef(msg)) { // Exec custom age settings al->ExecPendingAgeFniFiles(); al->ExecPendingAgeCsvFiles(); LogMsg(kLogPerf, L"AgeJoiner: Next:kLoadPlayer"); nextOp = kLoadPlayer; return true; } //======================================================================== // Local avatar loaded //======================================================================== plPlayerPageMsg * playerPageMsg = plPlayerPageMsg::ConvertNoRef(msg); if (playerPageMsg && !playerPageMsg->fUnload && playerPageMsg->fPlayer && playerPageMsg->fLocallyOriginated) { if (NetCommNeedToLoadAvatar()) NetCommSetAvatarLoaded(); LogMsg(kLogPerf, L"AgeJoiner: Next:kPropagatePlayer"); nextOp = kPropagatePlayer; return false; // NetClientMgr must also handle this message } //======================================================================== // Received all SDL states //======================================================================== plNetClientMgrMsg * netClientMgrMsg = plNetClientMgrMsg::ConvertNoRef(msg); if (netClientMgrMsg && netClientMgrMsg->type == plNetClientMgrMsg::kNotifyRcvdAllSDLStates) { LogMsg(kLogPerf, L"AgeJoiner: Next:kEnableClickables"); nextOp = kDestroyProgressBar; return true; } return false; }
//============================================================================ void plNCAgeJoiner::ExecNextOp () { plNetClientMgr * nc = plNetClientMgr::GetInstance(); plAvatarMgr * am = plAvatarMgr::GetInstance(); plAgeLoader * al = plAgeLoader::GetInstance(); NextOp next = nextOp; nextOp = kNoOp; switch (next) { //==================================================================== case kNoOp: { } break; //==================================================================== case kLoadAge: { LogMsg(kLogPerf, L"AgeJoiner: Exec:kLoadAge"); // Start progress bar char str[256]; #ifdef PLASMA_EXTERNAL_RELEASE StrCopy(str, "Loading age...", arrsize(str)); #else StrPrintf(str, arrsize(str), "Loading age %s...", age.ageDatasetName); #endif progressBar = plProgressMgr::GetInstance()->RegisterOperation(0, str, plProgressMgr::kNone, false, true); plDispatch::SetMsgRecieveCallback(IDispatchMsgReceiveCallback); ((plResManager*)hsgResMgr::ResMgr())->SetProgressBarProc(IResMgrProgressBarCallback); // Start loading age data al->LoadAge(age.ageDatasetName); } break; //==================================================================== case kLoadPlayer: { LogMsg(kLogPerf, L"AgeJoiner: Exec:kLoadPlayer"); // Start loading local player const char * avatarName; if (NetCommNeedToLoadAvatar()) { if (nc->GetFlagsBit(plNetClientApp::kLinkingToOfflineAge)) avatarName = "Male"; else avatarName = NetCommGetPlayer()->avatarDatasetName; plString linkInName = plNetLinkingMgr::GetInstance()->GetAgeLink()->SpawnPoint().GetName(); am->LoadPlayer( avatarName, nil, linkInName.c_str() ); } else { LogMsg(kLogPerf, L"AgeJoiner: Next:kPropagatePlayer"); nextOp = kPropagatePlayer; } } break; //==================================================================== case kPropagatePlayer: { LogMsg(kLogPerf, L"AgeJoiner: Exec:kPropagatePlayer"); // Add our avatar to the scene int spawnPt = am->FindSpawnPoint(age.spawnPtName); nc->IPlayerChangeAge(false /*not exiting*/, spawnPt); if (!nc->GetFlagsBit(plNetClientApp::kLinkingToOfflineAge)) // Add our avatar to the game state am->PropagateLocalPlayer(spawnPt); LogMsg(kLogPerf, L"AgeJoiner: Next:kRequestAgeState"); nextOp = kRequestAgeState; } break; //============================================================================ case kRequestAgeState: { LogMsg(kLogPerf, L"AgeJoiner: Exec:kRequestAgeState"); if (nc->GetFlagsBit(plNetClientApp::kLinkingToOfflineAge)) { LogMsg(kLogPerf, L"AgeJoiner: Next:kSimStateRcvd"); nextOp = kSimStateRcvd; } else { // Request age player list nc->ISendMembersListRequest(); // Request initial SDL state plNetMsgGameStateRequest gsmsg; gsmsg.SetNetProtocol(kNetProtocolCli2Game); gsmsg.SetBit(plNetMessage::kInitialAgeStateRequest); nc->SendMsg(&gsmsg); // Send our avatar settings nc->SendLocalPlayerAvatarCustomizations(); } } break; //==================================================================== case kSimStateRcvd: { nc->NotifyRcvdAllSDLStates(); } break; //============================================================================ case kDestroyProgressBar: { plDispatch::SetMsgRecieveCallback(nil); ((plResManager*)hsgResMgr::ResMgr())->SetProgressBarProc(nil); delete progressBar; progressBar = nil; nc->EndTask(); nextOp = kEnableClickables; } break; //==================================================================== case kEnableClickables: { LogMsg(kLogPerf, L"AgeJoiner: Exec:kEnableClickables"); // Enable scene clickables (void)(new plInputIfaceMgrMsg(plInputIfaceMgrMsg::kEnableClickables))->Send(); LogMsg(kLogPerf, L"AgeJoiner: Next:kNotifyAgeLoaded"); nextOp = kNotifyAgeLoaded; } break; //==================================================================== case kNotifyAgeLoaded: { LogMsg(kLogPerf, L"AgeJoiner: Exec:kNotifyAgeLoaded"); nc->SetFlagsBit(plNetClientApp::kPlayingGame); nc->SetFlagsBit(plNetClientApp::kNeedToSendInitialAgeStateLoadedMsg); plAgeLoader::GetInstance()->NotifyAgeLoaded(true); nextOp = kNoOp; } break; DEFAULT_FATAL(nextOp); } }
//============================================================================ void plNCAgeLeaver::ExecNextOp () { plNetClientMgr * nc = plNetClientMgr::GetInstance(); plAvatarMgr * am = plAvatarMgr::GetInstance(); plAgeLoader * al = plAgeLoader::GetInstance(); NextOp next = nextOp; nextOp = kNoOp; switch (next) { //==================================================================== case kNoOp: { } break; //==================================================================== case kDisableClickables: { (new plInputIfaceMgrMsg(plInputIfaceMgrMsg::kDisableClickables))->Send(); nextOp = kLinkOutFX; } break; //==================================================================== case kLinkOutFX: { nc->StartLinkOutFX(); } break; //==================================================================== case kUnloadAge: { NetCliGameDisconnect(); // Cull nodes that were part of this age vault (but not shared by the player's vault) VaultCull(NetCommGetAge()->ageVaultId); // remove the age device inbox mappings VaultClearDeviceInboxMap(); // Tell our local player that he's unspawning (if that is indeed the case) nc->IPlayerChangeAge(true /* exiting */, 0/* respawn */); // disconnect age vault // @@@ TODO: Unload age vault here 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(); } break; //==================================================================== case kNotifyAgeUnloaded: { // Set "Playing Game" bit to false nc->SetFlagsBit(plNetClientMgr::kPlayingGame, false); // Release AgeSDL object, if any if (nc->fAgeSDLObjectKey) nc->GetKey()->Release(nc->fAgeSDLObjectKey); // All done leaving age Complete(true, "Age unloaded"); } break; DEFAULT_FATAL(nextOp); } }