Esempio n. 1
0
hsBool plArmatureBrain::IHandleTaskMsg(plAvTaskMsg *msg)
{
    plAvTask *task = msg->GetTask();
    QueueTask(task);
    return true;
}
Esempio n. 2
0
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;
}