hsBool plArmatureBrain::IHandleTaskMsg(plAvTaskMsg *msg) { plAvTask *task = msg->GetTask(); QueueTask(task); return true; }
bool plAvBrainSwim::MsgReceive(plMessage *msg) { plLOSHitMsg *losHit = plLOSHitMsg::ConvertNoRef(msg); if (losHit) { if (losHit->fRequestID == plArmatureMod::kAvatarLOSSwimSurface) { plSwimRegionInterface *region = nil; if (!losHit->fNoHit) { plSceneObject *hitObj = plSceneObject::ConvertNoRef(losHit->fObj->ObjectIsLoaded()); region = hitObj ? plSwimRegionInterface::ConvertNoRef(hitObj->GetGenericInterface(plSwimRegionInterface::Index())) : nil; //100-fDistance because of casting the ray from above to get around physxs Raycast requirments fSurfaceDistance = 100.f-losHit->fDistance; } else fSurfaceDistance = -100.f; if (fSwimStrategy) { if (region) fSwimStrategy->SetSurface(region, fArmature->GetTarget(0)->GetLocalToWorld().GetTranslate().fZ + fSurfaceDistance); else fSwimStrategy->SetSurface(nil, 0.f); } return true; } } plSwimMsg *swimMsg = plSwimMsg::ConvertNoRef(msg); if (swimMsg) { if (swimMsg->GetIsLeaving()) fMode = kAbort; return true; } plControlEventMsg *ctrlMsg = plControlEventMsg::ConvertNoRef(msg); if (ctrlMsg) return IHandleControlMsg(ctrlMsg); if (fMode == kWalking || fMode == kWading) return fAvMod->GetNextBrain(this)->MsgReceive(msg); if (plAvSeekMsg *seekM = plAvSeekMsg::ConvertNoRef(msg)) { // seek and subclasses always have a seek first if (!seekM->fNoSeek) { // use dumb seek plAvSeekTask *seek = new plAvSeekTask(seekM->fSeekPoint, seekM->fAlignType, seekM->fAnimName); QueueTask(seek); } // else don't seek at all. plAvOneShotMsg * oneshotM = plAvOneShotMsg::ConvertNoRef(msg); if(oneshotM) { // if it's a oneshot, add the oneshot task as well plAvOneShotTask *oneshot = new plAvOneShotTask(oneshotM, fAvMod, this); QueueTask(oneshot); } return true; } if (plArmatureBrain::MsgReceive(msg)) return true; if (fMode == kWading) // Things like LOS need to go to the human brain below us. return fAvMod->GetNextBrain(this)->MsgReceive(msg); return false; }