diff --git a/Sources/Plasma/PubUtilLib/plMessage/plLinkToAgeMsg.cpp b/Sources/Plasma/PubUtilLib/plMessage/plLinkToAgeMsg.cpp index 098360ae..13fecb4b 100644 --- a/Sources/Plasma/PubUtilLib/plMessage/plLinkToAgeMsg.cpp +++ b/Sources/Plasma/PubUtilLib/plMessage/plLinkToAgeMsg.cpp @@ -53,11 +53,11 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com // // plLinkToAgeMsg -plLinkToAgeMsg::plLinkToAgeMsg() : fLinkInAnimName(nil) +plLinkToAgeMsg::plLinkToAgeMsg() : fLinkInAnimName(nil), fFlags(0) { } -plLinkToAgeMsg::plLinkToAgeMsg( const plAgeLinkStruct * link ) : fLinkInAnimName(nil) +plLinkToAgeMsg::plLinkToAgeMsg( const plAgeLinkStruct * link ) : fLinkInAnimName(nil), fFlags(0) { fAgeLink.CopyFrom( link ); } @@ -67,12 +67,22 @@ plLinkToAgeMsg::~plLinkToAgeMsg() delete [] fLinkInAnimName; } -// StreamVersion needed for back compatibility. -uint8_t plLinkToAgeInfo_StreamVersion = 0; +void plLinkToAgeMsg::PlayLinkSfx(bool linkIn, bool linkOut) +{ + if (linkIn) + fFlags &= ~kMuteLinkInSfx; + else + fFlags |= kMuteLinkInSfx; + if (linkOut) + fFlags &= ~kMuteLinkOutSfx; + else + fFlags |= kMuteLinkOutSfx; +} + void plLinkToAgeMsg::Read(hsStream* stream, hsResMgr* mgr) { plMessage::IMsgRead( stream, mgr ); - uint8_t ltaVer = stream->ReadByte(); + fFlags = stream->ReadByte(); fAgeLink.Read( stream, mgr ); fLinkInAnimName = stream->ReadSafeString(); } @@ -80,7 +90,7 @@ void plLinkToAgeMsg::Read(hsStream* stream, hsResMgr* mgr) void plLinkToAgeMsg::Write(hsStream* stream, hsResMgr* mgr) { plMessage::IMsgWrite( stream, mgr ); - stream->WriteByte( plLinkToAgeInfo_StreamVersion ); + stream->WriteByte( fFlags ); fAgeLink.Write( stream, mgr ); stream->WriteSafeString(fLinkInAnimName); } @@ -185,6 +195,14 @@ plLinkEffectsTriggerMsg::~plLinkEffectsTriggerMsg() { } +void plLinkEffectsTriggerMsg::MuteLinkSfx(bool mute) +{ + if (mute) + fFlags |= kMuteLinkSfx; + else + fFlags &= ~kMuteLinkSfx; +} + void plLinkEffectsTriggerMsg::Read(hsStream* stream, hsResMgr* mgr) { plMessage::IMsgRead( stream, mgr ); @@ -192,11 +210,7 @@ void plLinkEffectsTriggerMsg::Read(hsStream* stream, hsResMgr* mgr) fInvisLevel = stream->ReadLE32(); fLeavingAge = stream->ReadBool(); fLinkKey = mgr->ReadKey(stream); - - // This variable is for internal use only. Still read/written for backwards compatability. - fEffects = stream->ReadLE32(); - fEffects = 0; - + fFlags = stream->ReadLE32(); fLinkInAnimKey = mgr->ReadKey(stream); } @@ -207,7 +221,7 @@ void plLinkEffectsTriggerMsg::Write(hsStream* stream, hsResMgr* mgr) stream->WriteLE32(fInvisLevel); stream->WriteBool(fLeavingAge); mgr->WriteKey(stream, fLinkKey); - stream->WriteLE32(fEffects); + stream->WriteLE32(fFlags); mgr->WriteKey(stream, fLinkInAnimKey); } diff --git a/Sources/Plasma/PubUtilLib/plMessage/plLinkToAgeMsg.h b/Sources/Plasma/PubUtilLib/plMessage/plLinkToAgeMsg.h index 079e30fe..13592be6 100644 --- a/Sources/Plasma/PubUtilLib/plMessage/plLinkToAgeMsg.h +++ b/Sources/Plasma/PubUtilLib/plMessage/plLinkToAgeMsg.h @@ -58,6 +58,13 @@ class hsResMgr; class plLinkToAgeMsg : public plMessage { + enum + { + kMuteLinkOutSfx = 1<<0, + kMuteLinkInSfx = 1<<1, + }; + + uint8_t fFlags; plAgeLinkStruct fAgeLink; char* fLinkInAnimName; @@ -72,6 +79,10 @@ public: plAgeLinkStruct * GetAgeLink() { return &fAgeLink; } const plAgeLinkStruct * GetAgeLink() const { return &fAgeLink; } + void PlayLinkSfx(bool linkIn = true, bool linkOut = true); + bool PlayLinkInSfx() const { return (fFlags & kMuteLinkInSfx) == 0; } + bool PlayLinkOutSfx() const { return (fFlags & kMuteLinkOutSfx) == 0; } + const char * GetLinkInAnimName() { return fLinkInAnimName; } void SetLinkInAnimName(const char* name) { delete [] fLinkInAnimName; fLinkInAnimName = hsStrcpy(name); } @@ -117,12 +128,18 @@ public: class plLinkEffectsTriggerMsg : public plMessage { protected: + enum + { + kMuteLinkSfx = 1<<0 + }; + bool fLeavingAge; plKey fLinkKey; plKey fLinkInAnimKey; int fInvisLevel; + int fFlags; public: - plLinkEffectsTriggerMsg() : fLeavingAge(true), fLinkKey(nil), fLinkInAnimKey(nil), fEffects(0), fInvisLevel(0) { } + plLinkEffectsTriggerMsg() : fLeavingAge(true), fLinkKey(nil), fLinkInAnimKey(nil), fEffects(0), fInvisLevel(0), fFlags(0) { } ~plLinkEffectsTriggerMsg(); CLASSNAME_REGISTER( plLinkEffectsTriggerMsg ); @@ -139,6 +156,9 @@ public: void SetLinkInAnimKey(plKey &key); plKey GetLinkInAnimKey() { return fLinkInAnimKey; } + + void MuteLinkSfx(bool mute); + bool MuteLinkSfx() const { return (fFlags & kMuteLinkSfx) != 0; } void Read(hsStream* stream, hsResMgr* mgr); void Write(hsStream* stream, hsResMgr* mgr); diff --git a/Sources/Plasma/PubUtilLib/plNetClient/plLinkEffectsMgr.cpp b/Sources/Plasma/PubUtilLib/plNetClient/plLinkEffectsMgr.cpp index 7e979bf5..6cab6095 100644 --- a/Sources/Plasma/PubUtilLib/plNetClient/plLinkEffectsMgr.cpp +++ b/Sources/Plasma/PubUtilLib/plNetClient/plLinkEffectsMgr.cpp @@ -365,6 +365,7 @@ bool plLinkEffectsMgr::MsgReceive(plMessage *msg) BCMsg->fLinkKey = linkKey; BCMsg->SetLinkFlag(plLinkEffectBCMsg::kLeavingAge, pTriggerMsg->IsLeavingAge()); BCMsg->SetLinkFlag(plLinkEffectBCMsg::kSendCallback, true); + BCMsg->SetLinkFlag(plLinkEffectBCMsg::kMute, pTriggerMsg->MuteLinkSfx()); // Check if you have a Yeesha book, and mute sound if you don't. // 'CleftSolved' gets set when you click on the linking panel in the cleft, @@ -393,7 +394,7 @@ bool plLinkEffectsMgr::MsgReceive(plMessage *msg) if ( linkToACA || linkFromACA || linkToStartup || linkFromStartup || linkToFissureDrop || linkToDsntFromShell) { BCMsg->SetLinkFlag(plLinkEffectBCMsg::kMute); - } + } } } diff --git a/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeJoiner.cpp b/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeJoiner.cpp index 13f5c20f..8288317f 100644 --- a/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeJoiner.cpp +++ b/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeJoiner.cpp @@ -50,6 +50,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "plNetCliAgeJoiner.h" #include "plNetClientMgr.h" #include "plNetLinkingMgr.h" +#include "plNetObjectDebugger.h" #include "pnSceneObject/plSceneObject.h" #include "pnSceneObject/plCoordinateInterface.h" @@ -59,6 +60,7 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include "plNetClientComm/plNetClientComm.h" #include "plAgeLoader/plAgeLoader.h" +#include "plAvatar/plArmatureMod.h" #include "plAvatar/plAvatarMgr.h" #include "plVault/plVault.h" @@ -100,11 +102,13 @@ struct plNCAgeJoiner { FNCAgeJoinerCallback callback; void * userState; bool complete; + bool muteLinkSfx; plOperationProgress* progressBar; plNCAgeJoiner ( const NetCommAge & age, + bool muteSfx, FNCAgeJoinerCallback callback, void * userState ); @@ -157,10 +161,12 @@ void AgeVaultDownloadCallback ( //============================================================================ plNCAgeJoiner::plNCAgeJoiner ( const NetCommAge & age, + bool muteSfx, FNCAgeJoinerCallback callback, void * userState ) : nextOp(kNoOp) , age(age) +, muteLinkSfx(muteSfx) , callback(callback) , userState(userState) , complete(false) @@ -354,7 +360,7 @@ void plNCAgeJoiner::ExecNextOp () { nc->SetFlagsBit(plNetClientApp::kPlayingGame); nc->SetFlagsBit(plNetClientApp::kNeedToSendInitialAgeStateLoadedMsg); plAgeLoader::GetInstance()->NotifyAgeLoaded(true); - Complete(true, "Age joined"); + nextOp = kNoOp; } break; @@ -448,6 +454,36 @@ bool plNCAgeJoiner::MsgReceive (plMessage * msg) { 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; } @@ -469,6 +505,7 @@ void plNCAgeJoiner::Update () { void NCAgeJoinerCreate ( plNCAgeJoiner ** pjoiner, const NetCommAge & age, + bool muteSfx, FNCAgeJoinerCallback callback, void * userState ) { @@ -478,6 +515,7 @@ void NCAgeJoinerCreate ( plNCAgeJoiner * joiner; *pjoiner = joiner = new plNCAgeJoiner( age, + muteSfx, callback, userState ); diff --git a/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeJoiner.h b/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeJoiner.h index 1369c3a5..fa2266e9 100644 --- a/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeJoiner.h +++ b/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeJoiner.h @@ -85,6 +85,7 @@ typedef void (* FNCAgeJoinerCallback)( void NCAgeJoinerCreate ( plNCAgeJoiner ** joiner, const NetCommAge & age, + bool muteSfx, FNCAgeJoinerCallback callback, void * userState ); diff --git a/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeLeaver.cpp b/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeLeaver.cpp index 843d74c7..5cc98ed7 100644 --- a/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeLeaver.cpp +++ b/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeLeaver.cpp @@ -81,12 +81,14 @@ struct plNCAgeLeaver { NextOp nextOp; bool quitting; + bool muteLinkSfx; bool complete; FNCAgeLeaverCallback callback; void * userState; plNCAgeLeaver ( bool quitting, + bool muteSfx, FNCAgeLeaverCallback callback, void * userState ); @@ -109,10 +111,12 @@ struct plNCAgeLeaver { //============================================================================ plNCAgeLeaver::plNCAgeLeaver ( bool quitting, + bool muteSfx, FNCAgeLeaverCallback callback, void * userState ) : nextOp(kNoOp) , quitting(quitting) +, muteLinkSfx(muteSfx) , complete(false) , callback(callback) , userState(userState) @@ -200,7 +204,13 @@ void plNCAgeLeaver::ExecNextOp () { //==================================================================== case kLinkOutFX: { - nc->StartLinkOutFX(); + plLinkEffectsTriggerMsg* lem = new plLinkEffectsTriggerMsg(); + lem->MuteLinkSfx(muteLinkSfx); + lem->SetLeavingAge(true); + lem->SetLinkKey(nc->GetLocalPlayerKey()); + lem->SetBCastFlag(plMessage::kNetPropagate); + lem->SetBCastFlag(plMessage::kNetForce); // Necessary? + lem->Send(hsgResMgr::ResMgr()->FindKey(plUoid(kLinkEffectsMgr_KEY))); } break; @@ -264,6 +274,7 @@ void plNCAgeLeaver::Update () { void NCAgeLeaverCreate ( plNCAgeLeaver ** pleaver, bool quitting, + bool muteSfx, FNCAgeLeaverCallback callback, void * userState ) { @@ -273,6 +284,7 @@ void NCAgeLeaverCreate ( plNCAgeLeaver * leaver; *pleaver = leaver = new plNCAgeLeaver( quitting, + muteSfx, callback, userState ); diff --git a/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeLeaver.h b/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeLeaver.h index 9e4c9319..1533dfd3 100644 --- a/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeLeaver.h +++ b/Sources/Plasma/PubUtilLib/plNetClient/plNetCliAgeLeaver.h @@ -85,6 +85,7 @@ typedef void (* FNCAgeLeaverCallback)( void NCAgeLeaverCreate ( plNCAgeLeaver ** leaver, bool quitting, + bool muteSfx, FNCAgeLeaverCallback callback, void * userState ); diff --git a/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.cpp b/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.cpp index 649fbb2b..d3d8f82b 100644 --- a/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.cpp +++ b/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.cpp @@ -437,55 +437,6 @@ void plNetClientMgr::IUnloadNPCs() hsAssert(fNPCKeys.empty(), "Still npcs left when linking out"); } -// -// begin linking out sounds and gfx -// -void plNetClientMgr::StartLinkOutFX() -{ - // send msg to trigger link out effect - if (fLocalPlayerKey) - { - plNetLinkingMgr * lm = plNetLinkingMgr::GetInstance(); - - plLinkEffectsTriggerMsg* lem = new plLinkEffectsTriggerMsg(); - lem->SetLeavingAge(true); - lem->SetLinkKey(fLocalPlayerKey); - lem->SetBCastFlag(plMessage::kNetPropagate); - lem->SetBCastFlag(plMessage::kNetForce); // Necessary? - lem->AddReceiver(hsgResMgr::ResMgr()->FindKey(plUoid(kLinkEffectsMgr_KEY))); - lem->Send(); - } -} - -// -// beging linking in sounds snd gfx -// -void plNetClientMgr::StartLinkInFX() -{ - if (fLocalPlayerKey) - { - const plArmatureMod *avMod = plAvatarMgr::GetInstance()->GetLocalAvatar(); - - plLinkEffectsTriggerMsg* lem = new plLinkEffectsTriggerMsg(); - lem->SetLeavingAge(false); // linking in - lem->SetLinkKey(fLocalPlayerKey); - 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->AddReceiver(hsgResMgr::ResMgr()->FindKey(plUoid(kLinkEffectsMgr_KEY))); - lem->AddReceiver(hsgResMgr::ResMgr()->FindKey(plUoid(kClient_KEY))); - plgDispatch::MsgSend(lem); - } -} - // // compute the difference between our clock and the server's in unified time // @@ -1056,20 +1007,6 @@ bool plNetClientMgr::MsgReceive( plMessage* msg ) return true; } - - plInitialAgeStateLoadedMsg *stateMsg = plInitialAgeStateLoadedMsg::ConvertNoRef( msg ); - if( stateMsg != nil ) - { - // done receiving the initial state of the age from the server - plNetObjectDebugger::GetInstance()->LogMsg("OnServerInitComplete"); - - // delete fProgressBar; - // fProgressBar=nil; - - SetFlagsBit(kLoadingInitialAgeState, false); - StartLinkInFX(); - } - plNetVoiceListMsg* voxList = plNetVoiceListMsg::ConvertNoRef(msg); if (voxList) { diff --git a/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.h b/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.h index 0a32d7d1..b0e074e8 100644 --- a/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.h +++ b/Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.h @@ -249,9 +249,6 @@ public: static plNetClientMgr* GetInstance() { return plNetClientMgr::ConvertNoRef(fInstance); } - void StartLinkOutFX(); - void StartLinkInFX(); - bool MsgReceive(plMessage* msg); void Shutdown(); int Init(); diff --git a/Sources/Plasma/PubUtilLib/plNetClient/plNetLinkingMgr.cpp b/Sources/Plasma/PubUtilLib/plNetClient/plNetLinkingMgr.cpp index 7a767f5d..2360d3d6 100644 --- a/Sources/Plasma/PubUtilLib/plNetClient/plNetLinkingMgr.cpp +++ b/Sources/Plasma/PubUtilLib/plNetClient/plNetLinkingMgr.cpp @@ -100,6 +100,7 @@ struct NlmOpWaitOp : NlmOp { struct NlmJoinAgeOp : NlmOp { NetCommAge age; + bool muteSfx; NlmJoinAgeOp () : NlmOp(kNlmOpJoinAgeOp) { } @@ -107,6 +108,7 @@ struct NlmJoinAgeOp : NlmOp { struct NlmLeaveAgeOp : NlmOp { bool quitting; + bool muteSfx; NlmLeaveAgeOp () : NlmOp(kNlmOpLeaveAgeOp), quitting(false) { } @@ -237,6 +239,7 @@ void plNetLinkingMgr::ExecNextOp () { NCAgeJoinerCreate( &s_ageJoiner, joinAgeOp->age, + joinAgeOp->muteSfx, NCAgeJoinerCallback, waitOp ); @@ -258,6 +261,7 @@ void plNetLinkingMgr::ExecNextOp () { NCAgeLeaverCreate( &s_ageLeaver, leaveAgeOp->quitting, + leaveAgeOp->muteSfx, NCAgeLeaverCallback, waitOp ); @@ -419,12 +423,14 @@ void plNetLinkingMgr::IDoLink(plLinkToAgeMsg* msg) } // Queue leave op NlmLeaveAgeOp * leaveAgeOp = new NlmLeaveAgeOp; + leaveAgeOp->muteSfx = !msg->PlayLinkOutSfx(); QueueOp(leaveAgeOp); } // Queue join op NlmJoinAgeOp * joinAgeOp = new NlmJoinAgeOp; joinAgeOp->age.ageInstId = *GetAgeLink()->GetAgeInfo()->GetAgeInstanceGuid(); + joinAgeOp->muteSfx = !msg->PlayLinkInSfx(); StrCopy( joinAgeOp->age.ageDatasetName, GetAgeLink()->GetAgeInfo()->GetAgeFilename(),