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)); }
static void Check_dodge(edict_t self, float[] start, float[] dir, int speed) { float[] end = new float[] { 0, 0, 0 }; float[] v = new float[] { 0, 0, 0 }; trace_t tr; float eta; if (GameBase.skill.value == 0) { if (Lib.Random() > 0.25) { return; } } Math3D.VectorMA(start, 8192, dir, end); tr = GameBase.gi.Trace(start, null, null, end, self, Defines.MASK_SHOT); if ((tr.ent != null) && (tr.ent.svflags & Defines.SVF_MONSTER) != 0 && (tr.ent.health > 0) && (null != tr.ent.monsterinfo.dodge) && GameUtil.Infront(tr.ent, self)) { Math3D.VectorSubtract(tr.endpos, start, v); eta = (Math3D.VectorLength(v) - tr.ent.maxs[0]) / speed; tr.ent.monsterinfo.dodge.Dodge(tr.ent, self, eta); } }