bool plObjectInVolumeDetector::MsgReceive(plMessage* msg) { plCollideMsg* pCollMsg = plCollideMsg::ConvertNoRef(msg); if (pCollMsg) { // If the avatar is disabled (flying around), don't trigger if (IIsDisabledAvatar(pCollMsg->fOtherKey)) return false; if (!fWaitingForEval) IRegisterForEval(); ITrigger(pCollMsg->fOtherKey, (pCollMsg->fEntering != 0)); return true; } plEvalMsg* pEvalMsg = plEvalMsg::ConvertNoRef(msg); if (pEvalMsg) IHandleEval(pEvalMsg); plPlayerPageMsg* pageMsg = plPlayerPageMsg::ConvertNoRef(msg); if (pageMsg && pageMsg->fUnload) { ITrigger(pageMsg->fPlayer, false); } return plCollisionDetector::MsgReceive(msg); }
hsBool plObjectInVolumeDetector::MsgReceive(plMessage* msg) { plCollideMsg* pCollMsg = plCollideMsg::ConvertNoRef(msg); if (pCollMsg) { // If the avatar is disabled (flying around), don't trigger if (IIsDisabledAvatar(pCollMsg->fOtherKey)) return false; ITrigger(pCollMsg->fOtherKey, (pCollMsg->fEntering != 0)); plgDispatch::Dispatch()->RegisterForExactType(plEvalMsg::Index(), GetKey()); return true; } plEvalMsg* pEvalMsg = plEvalMsg::ConvertNoRef(msg); if (pEvalMsg) { fNumEvals++; ISendSavedTriggerMsgs(); plgDispatch::Dispatch()->UnRegisterForExactType(plEvalMsg::Index(), GetKey()); } plPlayerPageMsg* pageMsg = plPlayerPageMsg::ConvertNoRef(msg); if (pageMsg && pageMsg->fUnload) { ITrigger(pageMsg->fPlayer, false); } return plCollisionDetector::MsgReceive(msg); }
bool plObjectInVolumeAndFacingDetector::MsgReceive(plMessage* msg) { // Avatar is entering or exiting our detector box plCollideMsg* collMsg = plCollideMsg::ConvertNoRef(msg); if (collMsg) { // make sure this is the local player... the notify will be the thing that propagates over the network if (plNetClientApp::GetInstance()->GetLocalPlayerKey() != collMsg->fOtherKey) return true; // If the avatar is disabled (flying around), don't trigger if (IIsDisabledAvatar(collMsg->fOtherKey)) return false; fAvatarInVolume = (collMsg->fEntering != 0); if (fAvatarInVolume) { plgDispatch::Dispatch()->RegisterForExactType(plEvalMsg::Index(), GetKey()); ICheckForTrigger(); } else { plgDispatch::Dispatch()->UnRegisterForExactType(plEvalMsg::Index(), GetKey()); // Avatar is leaving the volume, make sure to untrigger if we haven't already if (fTriggered) { fTriggered = false; ISendTriggerMsg(plNetClientApp::GetInstance()->GetLocalPlayerKey(), false); } } return true; } // Avatar is inside our detector box, so every frame we check if we need to trigger plEvalMsg* evalMsg = plEvalMsg::ConvertNoRef(msg); if (evalMsg) { ICheckForTrigger(); return true; } return plObjectInVolumeDetector::MsgReceive(msg); }
bool plCollisionDetector::MsgReceive(plMessage* msg) { plCollideMsg* pCollMsg = plCollideMsg::ConvertNoRef(msg); if (pCollMsg) { // If the avatar is disabled (flying around), don't trigger if (IIsDisabledAvatar(pCollMsg->fOtherKey)) return false; if (fType & kTypeBump) { if (!fBumped && !fTriggered) { for (int i = 0; i < fReceivers.Count(); i++) { plActivatorMsg* pMsg = new plActivatorMsg; pMsg->AddReceiver( fReceivers[i] ); if (fProxyKey) pMsg->fHiteeObj = fProxyKey; else pMsg->fHiteeObj = GetTarget()->GetKey(); pMsg->fHitterObj = pCollMsg->fOtherKey; pMsg->SetSender(GetKey()); pMsg->SetTriggerType( plActivatorMsg::kCollideContact ); plgDispatch::MsgSend( pMsg ); } fBumped = true; fTriggered = true; plgDispatch::Dispatch()->RegisterForExactType(plEvalMsg::Index(), GetKey()); return true; } if (fTriggered) { fBumped = true; return true; } return false; } for (int i = 0; i < fReceivers.Count(); i++) { plActivatorMsg* pMsg = new plActivatorMsg; pMsg->AddReceiver( fReceivers[i] ); if (fProxyKey) pMsg->fHiteeObj = fProxyKey; else pMsg->fHiteeObj = GetTarget()->GetKey(); pMsg->fHitterObj = pCollMsg->fOtherKey; pMsg->SetSender(GetKey()); if (fType & kTypeEnter && pCollMsg->fEntering) { pMsg->SetTriggerType( plActivatorMsg::kCollideEnter ); plgDispatch::MsgSend( pMsg ); continue; } if (fType & kTypeUnEnter && pCollMsg->fEntering) { pMsg->SetTriggerType( plActivatorMsg::kEnterUnTrigger ); plgDispatch::MsgSend( pMsg ); continue; } if(fType & kTypeExit && !pCollMsg->fEntering) { pMsg->SetTriggerType( plActivatorMsg::kCollideExit ); plgDispatch::MsgSend( pMsg ); continue; } if(fType & kTypeUnExit && !pCollMsg->fEntering) { pMsg->SetTriggerType( plActivatorMsg::kExitUnTrigger ); plgDispatch::MsgSend( pMsg ); continue; } if (fType & kTypeAny) { pMsg->SetTriggerType( plActivatorMsg::kCollideContact ); plgDispatch::MsgSend( pMsg ); continue; } delete (pMsg); } return true; } plEvalMsg* pEval = plEvalMsg::ConvertNoRef(msg); if (pEval) { if (!fBumped && fTriggered) { plgDispatch::Dispatch()->UnRegisterForExactType(plEvalMsg::Index(), GetKey()); for (int i = 0; i < fReceivers.Count(); i++) { plActivatorMsg* pMsg = new plActivatorMsg; pMsg->AddReceiver( fReceivers[i] ); if (fProxyKey) pMsg->fHiteeObj = fProxyKey; else pMsg->fHiteeObj = GetTarget()->GetKey(); pMsg->SetSender(GetKey()); pMsg->SetTriggerType( plActivatorMsg::kCollideUnTrigger ); plgDispatch::MsgSend( pMsg ); fTriggered = false; } } else if (fTriggered && fBumped) { fBumped = false; } return true; } return plDetectorModifier::MsgReceive(msg); }