Пример #1
0
        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));
        }