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); }
void plObjectInVolumeAndFacingDetector::ICheckForTrigger() { plArmatureMod* armMod = plAvatarMgr::GetInstance()->GetLocalAvatar(); plSceneObject* avatar = armMod ? armMod->GetTarget(0) : nil; plSceneObject* target = GetTarget(); if (armMod && target) { hsVector3 playerView = avatar->GetCoordinateInterface()->GetLocalToWorld().GetAxis(hsMatrix44::kView); hsVector3 objView = target->GetCoordinateInterface()->GetLocalToWorld().GetAxis(hsMatrix44::kView); playerView.Normalize(); objView.Normalize(); float dot = playerView * objView; // hsStatusMessageF("Dot: %f Tolerance: %f", dot, fFacingTolerance); bool facing = dot >= fFacingTolerance; bool movingForward = false; if (fNeedWalkingForward) { // And are we walking towards it? plArmatureBrain* abrain = armMod->FindBrainByClass(plAvBrainHuman::Index()); //armMod->GetCurrentBrain(); plAvBrainHuman* brain = plAvBrainHuman::ConvertNoRef(abrain); if (brain && brain->IsMovingForward() && brain->fCallbackAction->IsOnGround()) movingForward = true; } else movingForward = true; if (facing && movingForward && !fTriggered) { DetectorLog("%s: Trigger InVolume&Facing", GetKeyName().c_str()); fTriggered = true; ITrigger(avatar->GetKey(), true, true); } else if (!facing && fTriggered) { DetectorLog("%s: Untrigger InVolume&Facing", GetKeyName().c_str()); fTriggered = false; ITrigger(avatar->GetKey(), false, true); } } }
hsBool 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; ITrigger(plNetClientApp::GetInstance()->GetLocalPlayerKey(), false, true); } } 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); }