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:
@ -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);
|
||||||
|
@ -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() { }
|
||||||
|
Reference in New Issue
Block a user