diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plArmatureMod.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plArmatureMod.cpp index 27a7c847..8d426153 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plArmatureMod.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plArmatureMod.cpp @@ -649,6 +649,7 @@ void plArmatureMod::IInitDefaults() fStealthLevel = 0; fMouseFrameTurnStrength = 0.f; fSuspendInputCount = 0; + fIsLinkedIn = false; fMidLink = false; fAlreadyPanicLinking = false; fReverseFBOnIdle = false; @@ -1374,16 +1375,21 @@ hsBool plArmatureMod::MsgReceive(plMessage* msg) plLinkInDoneMsg *doneMsg = plLinkInDoneMsg::ConvertNoRef(msg); if (doneMsg) { + fIsLinkedIn = true; IFireBehaviorNotify(plHBehavior::kBehaviorTypeLinkIn, false); return true; } plAgeLoadedMsg *ageLoadMsg = plAgeLoadedMsg::ConvertNoRef(msg); - if (ageLoadMsg && ageLoadMsg->fLoaded) - { - // only the local player gets these - NetworkSynch(hsTimer::GetSysSeconds(), true); - EnablePhysics(true); + if (ageLoadMsg) + { + if (ageLoadMsg->fLoaded) + { + // only the local player gets these + NetworkSynch(hsTimer::GetSysSeconds(), true); + EnablePhysics(true); + } else + fIsLinkedIn = false; return true; } @@ -2517,6 +2523,11 @@ bool plArmatureMod::IsMidLink() return fMidLink; } +bool plArmatureMod::IsLinkedIn() +{ + return fIsLinkedIn; +} + hsBool plArmatureMod::ConsumeJump() { if (!GetInputFlag(B_CONTROL_CONSUMABLE_JUMP)) diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plArmatureMod.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plArmatureMod.h index 8353125e..081e345d 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plArmatureMod.h +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plAvatar/plArmatureMod.h @@ -318,6 +318,7 @@ public: int GetStealthLevel() const { return fStealthLevel; } bool IsOpaque(); + bool IsLinkedIn(); bool IsMidLink(); hsBool ConsumeJump(); // returns true if the jump keypress was available to consume @@ -401,6 +402,7 @@ protected: plArmatureUpdateMsg *fUpdateMsg; // Trying to be a good lad here and align all our bools and UInt8s... + bool fIsLinkedIn; // We have finished playing the LinkEffects and are properly in the age bool fMidLink; // We're in between a LeaveAge and an EnterAge bool fAlreadyPanicLinking; // Cleared when you enter an age. Prevents spamming the server with panic link requests. bool fUnconsumedJump; // We've pressed the jump key, but haven't jumped yet diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPhysical/plCollisionDetector.cpp b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPhysical/plCollisionDetector.cpp index 127a1cf6..d8301c1b 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPhysical/plCollisionDetector.cpp +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPhysical/plCollisionDetector.cpp @@ -676,9 +676,8 @@ void plSubworldRegionDetector::Write(hsStream* stream, hsResMgr* mgr) /////////////////////////////////// hsBool plPanicLinkRegion::MsgReceive(plMessage* msg) { - plCollideMsg* pCollMsg = plCollideMsg::ConvertNoRef(msg); - if (pCollMsg) + if (plCollideMsg* pCollMsg = plCollideMsg::ConvertNoRef(msg)) { if (plNetClientApp::GetInstance()->GetLocalPlayerKey() != pCollMsg->fOtherKey) return true; @@ -688,13 +687,17 @@ hsBool plPanicLinkRegion::MsgReceive(plMessage* msg) plArmatureMod* avMod = IGetAvatarModifier(pCollMsg->fOtherKey); if (avMod) { - hsPoint3 pos; - if (avMod->GetController()) - { - avMod->GetController()->GetPositionSim(pos); - DetectorLogSpecial("Avatar is panic linking. Position %f,%f,%f and is %s", pos.fX, pos.fY, pos.fZ, avMod->GetController()->IsEnabled() ? "enabled" : "disabled"); - } - avMod->PanicLink(fPlayLinkOutAnim); + if (avMod->IsLinkedIn()) + { + hsPoint3 kinPos; + if (avMod->GetController()) + { + avMod->GetController()->GetPositionSim(kinPos); + DetectorLogSpecial("Avatar is panic linking. KinPos at %f,%f,%f and is %s", kinPos.fX, pos.fY, pos.fZ, avMod->GetController()->IsEnabled() ? "enabled" : "disabled"); + } + avMod->PanicLink(fPlayLinkOutAnim); + } else + DetectorLogRed("PANIC LINK %s before we actually linked in!", GetKey()->GetName()); } } diff --git a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPhysical/plCollisionDetector.h b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPhysical/plCollisionDetector.h index c097f478..91dfecd0 100644 --- a/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPhysical/plCollisionDetector.h +++ b/MOULOpenSourceClientPlugin/Plasma20/Sources/Plasma/PubUtilLib/plPhysical/plCollisionDetector.h @@ -232,8 +232,7 @@ class plPanicLinkRegion : public plCollisionDetector public: hsBool fPlayLinkOutAnim; - plPanicLinkRegion() : fPlayLinkOutAnim(true) {;} - ~plPanicLinkRegion(){;} + plPanicLinkRegion() : fPlayLinkOutAnim(true) { } virtual hsBool MsgReceive(plMessage* msg);