2
3
mirror of https://foundry.openuru.org/gitblit/r/CWE-ou-minkata.git synced 2025-07-14 02:27:40 -04:00

Fix relto-plunge

Looks like the fissure fall camera region got triggered then untriggered
during the linking process. In debug builds, this happened in one frame,
so only an exit message got sent out. In faster builds, both would be
sent, and you would plunge. To fix that, we don't send eval until we're no
longer MidLink.
This commit is contained in:
2012-02-25 01:55:55 -05:00
parent 8c345dac3d
commit 24a644107e
2 changed files with 24 additions and 7 deletions

View File

@ -73,6 +73,9 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com
plArmatureMod* plCollisionDetector::IGetAvatarModifier(plKey key) plArmatureMod* plCollisionDetector::IGetAvatarModifier(plKey key)
{ {
if (!key)
return nil;
plSceneObject* avObj = plSceneObject::ConvertNoRef(key->ObjectIsLoaded()); plSceneObject* avObj = plSceneObject::ConvertNoRef(key->ObjectIsLoaded());
if (avObj) if (avObj)
{ {
@ -242,8 +245,6 @@ plCameraRegionDetector::~plCameraRegionDetector()
void plCameraRegionDetector::ITrigger(plKey hitter, bool entering, bool immediate) void plCameraRegionDetector::ITrigger(plKey hitter, bool entering, bool immediate)
{ {
if (fSavingSendMsg)
DetectorLogRed("%s: Stale messages on ITrigger. This should never happen!", GetKeyName().c_str());
if (fIsInside && entering) if (fIsInside && entering)
DetectorLogRed("%s: Duplicate enter! Did we miss an exit?", GetKeyName().c_str()); DetectorLogRed("%s: Duplicate enter! Did we miss an exit?", GetKeyName().c_str());
else if (!fIsInside && !entering) else if (!fIsInside && !entering)
@ -384,11 +385,18 @@ hsBool plObjectInVolumeDetector::MsgReceive(plMessage* msg)
plCollideMsg* pCollMsg = plCollideMsg::ConvertNoRef(msg); plCollideMsg* pCollMsg = plCollideMsg::ConvertNoRef(msg);
if (pCollMsg) if (pCollMsg)
{ {
fLastHitter = pCollMsg->fOtherKey;
// If the avatar is disabled (flying around), don't trigger // If the avatar is disabled (flying around), don't trigger
if (IIsDisabledAvatar(pCollMsg->fOtherKey)) if (IIsDisabledAvatar(fLastHitter))
return false; return false;
ITrigger(pCollMsg->fOtherKey, (pCollMsg->fEntering != 0)); ITrigger(fLastHitter, (pCollMsg->fEntering != 0));
plgDispatch::Dispatch()->RegisterForExactType(plEvalMsg::Index(), GetKey());
// If we never eval before the exit...
if (fWaitingForEval)
plgDispatch::Dispatch()->UnRegisterForExactType(plEvalMsg::Index(), GetKey());
else
plgDispatch::Dispatch()->RegisterForExactType(plEvalMsg::Index(), GetKey());
fWaitingForEval = !fWaitingForEval;
return true; return true;
} }
@ -396,8 +404,13 @@ hsBool plObjectInVolumeDetector::MsgReceive(plMessage* msg)
if (pEvalMsg) if (pEvalMsg)
{ {
fNumEvals++; fNumEvals++;
// Don't dispatch if we're not in the age
if (plArmatureMod* av = IGetAvatarModifier(fLastHitter))
if (av->IsMidLink())
return true;
ISendSavedTriggerMsgs(); ISendSavedTriggerMsgs();
plgDispatch::Dispatch()->UnRegisterForExactType(plEvalMsg::Index(), GetKey()); plgDispatch::Dispatch()->UnRegisterForExactType(plEvalMsg::Index(), GetKey());
fWaitingForEval = false;
} }
plPlayerPageMsg* pageMsg = plPlayerPageMsg::ConvertNoRef(msg); plPlayerPageMsg* pageMsg = plPlayerPageMsg::ConvertNoRef(msg);

View File

@ -99,15 +99,19 @@ protected:
uint32_t fNumEvals; uint32_t fNumEvals;
uint32_t fLastEnterEval; uint32_t fLastEnterEval;
uint32_t fLastExitEval; uint32_t fLastExitEval;
bool fWaitingForEval;
plKey fLastHitter;
public: public:
plObjectInVolumeDetector() plObjectInVolumeDetector()
: plCollisionDetector(), fSavedActivatorMsg(nil), fNumEvals(0), fLastEnterEval(0), fLastExitEval(0) : plCollisionDetector(), fSavedActivatorMsg(nil), fNumEvals(0), fLastEnterEval(0),
fWaitingForEval(false), fLastHitter(nil)
{ } { }
plObjectInVolumeDetector(int8_t type) plObjectInVolumeDetector(int8_t type)
: plCollisionDetector(type), fSavedActivatorMsg(nil), fNumEvals(0), fLastEnterEval(0), fLastExitEval(0) : plCollisionDetector(type), fSavedActivatorMsg(nil), fNumEvals(0), fLastEnterEval(0),
fWaitingForEval(false), fLastHitter(nil)
{ } { }
virtual ~plObjectInVolumeDetector() { } virtual ~plObjectInVolumeDetector() { }