Exemple #1
0
        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]);
        }
Exemple #2
0
            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);
            }
Exemple #3
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));
        }
Exemple #4
0
        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);
                }
            }
        }