From af1db55f678ba2014fc7f857b6dd580a09121cb4 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 12 Jun 2012 17:50:45 -0400 Subject: [PATCH] Mute the linking sound on client kicks This commit is really quite awesome in that you can now propagate any plLinkToAgeMsg that will mute the link out, link in sounds, or both. Some garbage fields were repurposed for this functionality. The messages were passed correctly on Cyan's MOULa server. Conflicts: Sources/Plasma/PubUtilLib/plMessage/plLinkToAgeMsg.h Sources/Plasma/PubUtilLib/plNetClient/plLinkEffectsMgr.cpp Sources/Plasma/PubUtilLib/plNetClient/plNetClientMgr.h Sources/Plasma/PubUtilLib/plNetClient/plNetLinkingMgr.cpp --- .../PubUtilLib/plMessage/plLinkToAgeMsg.cpp | 38 +++++++---- .../PubUtilLib/plMessage/plLinkToAgeMsg.h | 22 ++++++- .../plNetClient/plLinkEffectsMgr.cpp | 3 +- .../plNetClient/plNetCliAgeJoiner.cpp | 40 +++++++++++- .../plNetClient/plNetCliAgeJoiner.h | 1 + .../plNetClient/plNetCliAgeLeaver.cpp | 14 ++++- .../plNetClient/plNetCliAgeLeaver.h | 1 + .../PubUtilLib/plNetClient/plNetClientMgr.cpp | 63 ------------------- .../PubUtilLib/plNetClient/plNetClientMgr.h | 3 - .../plNetClient/plNetLinkingMgr.cpp | 6 ++ 10 files changed, 109 insertions(+), 82 deletions(-) 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(),