void PM_ForceLegsAnim( animNumber_t anim) { if (BG_InSpecialJump(pm->ps->legsAnim) && pm->ps->legsTimer > 0 && !BG_InSpecialJump(anim)) { return; } if (BG_InRoll(pm->ps, pm->ps->legsAnim) && pm->ps->legsTimer > 0 && !BG_InRoll(pm->ps, anim)) { return; } pm->ps->legsTimer = 0; PM_StartLegsAnim( anim ); }
qboolean NPC_CanTryJump() { if (!(NPCInfo->scriptFlags&SCF_NAV_CAN_JUMP) || // Can't Jump (NPCInfo->scriptFlags&SCF_NO_ACROBATICS) || // If Can't Jump At All (level.time<NPCInfo->jumpBackupTime) || // If Backing Up, Don't Try The Jump Again (level.time<NPCInfo->jumpNextCheckTime) || // Don't Even Try To Jump Again For This Amount Of Time (NPCInfo->jumpTime) || // Don't Jump If Already Going (PM_InKnockDown(&NPC->client->ps)) || // Don't Jump If In Knockdown (BG_InRoll(&NPC->client->ps, NPC->client->ps.legsAnim)) || // ... Or Roll (NPC->client->ps.groundEntityNum==ENTITYNUM_NONE) // ... Or In The Air ) { return qfalse; } return qtrue; }
// Imported from single-player, this function is mainly intended to make porting from SP easier. void PM_SetAnim(int setAnimParts, animNumber_t anim, int setAnimFlags, int blendTime) { assert( anim < MAX_TOTALANIMATIONS); assert( bgGlobalAnimations[anim].firstFrame != 0 || bgGlobalAnimations[anim].numFrames != 0); if (BG_InSpecialJump(anim)) { setAnimFlags |= SETANIM_FLAG_RESTART; } if (BG_InRoll(pm->ps, pm->ps->legsAnim)) { //never interrupt a roll return; } if (setAnimFlags&SETANIM_FLAG_OVERRIDE) { if (setAnimParts & SETANIM_TORSO) { if( (setAnimFlags & SETANIM_FLAG_RESTART) || (pm->ps->torsoAnim & ~ANIM_TOGGLEBIT ) != anim ) { PM_SetTorsoAnimTimer(0); } } if (setAnimParts & SETANIM_LEGS) { if( (setAnimFlags & SETANIM_FLAG_RESTART) || (pm->ps->legsAnim & ~ANIM_TOGGLEBIT ) != anim ) { PM_SetLegsAnimTimer(0); } } } PM_SetAnimFinal(setAnimParts, anim, setAnimFlags, blendTime); }