public static edict_t PickFirst(edict_t self) { if (!trail_active) { return(null); } int marker = trail_head; for (int n = PlayerTrail.TRAIL_LENGTH; n > 0; n--) { if (PlayerTrail.trail[marker].timestamp <= self.monsterinfo.trail_time) { marker = NEXT(marker); } else { break; } } if (GameUtil.Visible(self, PlayerTrail.trail[marker])) { return(PlayerTrail.trail[marker]); } if (GameUtil.Visible(self, PlayerTrail.trail[PREV(marker)])) { return(PlayerTrail.trail[PREV(marker)]); } return(PlayerTrail.trail[marker]); }
public override bool Think(edict_t self) { float[] target = new float[] { 0, 0, 0 }; float[] dir = new float[] { 0, 0, 0 }; float reaction_time; self.nextthink = GameBase.level.time + Defines.FRAMETIME; if (self.enemy != null && (!self.enemy.inuse || self.enemy.health <= 0)) { self.enemy = null; } if (null == self.enemy) { if (!GameUtil.FindTarget(self)) { return(true); } self.monsterinfo.trail_time = GameBase.level.time; self.monsterinfo.aiflags &= ~Defines.AI_LOST_SIGHT; } else { if (GameUtil.Visible(self, self.enemy)) { if ((self.monsterinfo.aiflags & Defines.AI_LOST_SIGHT) != 0) { self.monsterinfo.trail_time = GameBase.level.time; self.monsterinfo.aiflags &= ~Defines.AI_LOST_SIGHT; } } else { self.monsterinfo.aiflags |= Defines.AI_LOST_SIGHT; return(true); } } Math3D.VectorCopy(self.enemy.s.origin, target); target[2] += self.enemy.viewheight; Math3D.VectorSubtract(target, self.target_ent.s.origin, dir); Math3D.Vectoangles(dir, self.target_ent.move_angles); if (GameBase.level.time < self.monsterinfo.attack_finished) { return(true); } reaction_time = (3 - GameBase.skill.value) * 1F; if ((GameBase.level.time - self.monsterinfo.trail_time) < reaction_time) { return(true); } self.monsterinfo.attack_finished = GameBase.level.time + reaction_time + 1F; self.target_ent.spawnflags |= 65536; return(true); }
public static bool Ai_checkattack(edict_t self, float dist) { float[] temp = new[] { 0f, 0f, 0f }; bool hesDeadJim; if (self.goalentity != null) { if ((self.monsterinfo.aiflags & Defines.AI_COMBAT_POINT) != 0) { return(false); } if ((self.monsterinfo.aiflags & Defines.AI_SOUND_TARGET) != 0) { if ((GameBase.level.time - self.enemy.teleport_time) > 5) { if (self.goalentity == self.enemy) { if (self.movetarget != null) { self.goalentity = self.movetarget; } else { self.goalentity = null; } } self.monsterinfo.aiflags &= ~Defines.AI_SOUND_TARGET; if ((self.monsterinfo.aiflags & Defines.AI_TEMP_STAND_GROUND) != 0) { self.monsterinfo.aiflags &= ~(Defines.AI_STAND_GROUND | Defines.AI_TEMP_STAND_GROUND); } } else { self.show_hostile = (int)GameBase.level.time + 1; return(false); } } } enemy_vis = false; hesDeadJim = false; if ((null == self.enemy) || (!self.enemy.inuse)) { hesDeadJim = true; } else if ((self.monsterinfo.aiflags & Defines.AI_MEDIC) != 0) { if (self.enemy.health > 0) { hesDeadJim = true; self.monsterinfo.aiflags &= ~Defines.AI_MEDIC; } } else { if ((self.monsterinfo.aiflags & Defines.AI_BRUTAL) != 0) { if (self.enemy.health <= -80) { hesDeadJim = true; } } else { if (self.enemy.health <= 0) { hesDeadJim = true; } } } if (hesDeadJim) { self.enemy = null; if (self.oldenemy != null && self.oldenemy.health > 0) { self.enemy = self.oldenemy; self.oldenemy = null; HuntTarget(self); } else { if (self.movetarget != null) { self.goalentity = self.movetarget; self.monsterinfo.walk.Think(self); } else { self.monsterinfo.pausetime = GameBase.level.time + 100000000; self.monsterinfo.stand.Think(self); } return(true); } } self.show_hostile = (int)GameBase.level.time + 1; enemy_vis = GameUtil.Visible(self, self.enemy); if (enemy_vis) { self.monsterinfo.search_time = GameBase.level.time + 5; Math3D.VectorCopy(self.enemy.s.origin, self.monsterinfo.last_sighting); } enemy_infront = GameUtil.Infront(self, self.enemy); enemy_range = GameUtil.Range(self, self.enemy); Math3D.VectorSubtract(self.enemy.s.origin, self.s.origin, temp); enemy_yaw = Math3D.Vectoyaw(temp); if (self.monsterinfo.attack_state == Defines.AS_MISSILE) { Ai_run_missile(self); return(true); } if (self.monsterinfo.attack_state == Defines.AS_MELEE) { Ai_run_melee(self); return(true); } if (!enemy_vis) { return(false); } return(self.monsterinfo.checkattack.Think(self)); }
public static void M_ReactToDamage(edict_t targ, edict_t attacker) { if ((null != attacker.client) && 0 != (attacker.svflags & Defines.SVF_MONSTER)) { return; } if (attacker == targ || attacker == targ.enemy) { return; } if (0 != (targ.monsterinfo.aiflags & Defines.AI_GOOD_GUY)) { if (attacker.client != null || (attacker.monsterinfo.aiflags & Defines.AI_GOOD_GUY) != 0) { return; } } if (attacker.client != null) { targ.monsterinfo.aiflags &= ~Defines.AI_SOUND_TARGET; if (targ.enemy != null && targ.enemy.client != null) { if (GameUtil.Visible(targ, targ.enemy)) { targ.oldenemy = attacker; return; } targ.oldenemy = targ.enemy; } targ.enemy = attacker; if (0 == (targ.monsterinfo.aiflags & Defines.AI_DUCKED)) { GameUtil.FoundTarget(targ); } return; } if (((targ.flags & (Defines.FL_FLY | Defines.FL_SWIM)) == (attacker.flags & (Defines.FL_FLY | Defines.FL_SWIM))) && (!(targ.classname.Equals(attacker.classname))) && (!(attacker.classname.Equals("monster_tank"))) && (!(attacker.classname.Equals("monster_supertank"))) && (!(attacker.classname.Equals("monster_makron"))) && (!(attacker.classname.Equals("monster_jorg")))) { if (targ.enemy != null && targ.enemy.client != null) { targ.oldenemy = targ.enemy; } targ.enemy = attacker; if (0 == (targ.monsterinfo.aiflags & Defines.AI_DUCKED)) { GameUtil.FoundTarget(targ); } } else if (attacker.enemy == targ) { if (targ.enemy != null && targ.enemy.client != null) { targ.oldenemy = targ.enemy; } targ.enemy = attacker; if (0 == (targ.monsterinfo.aiflags & Defines.AI_DUCKED)) { GameUtil.FoundTarget(targ); } } else if (attacker.enemy != null && attacker.enemy != targ) { if (targ.enemy != null && targ.enemy.client != null) { targ.oldenemy = targ.enemy; } targ.enemy = attacker.enemy; if (0 == (targ.monsterinfo.aiflags & Defines.AI_DUCKED)) { GameUtil.FoundTarget(targ); } } }