Exemple #1
0
 public override void Use(edict_t ent, edict_t other, edict_t activator)
 {
     GameBase.gi.Sound(ent, Defines.CHAN_VOICE, ent.noise_index, 1, Defines.ATTN_NORM, 0);
     GameBase.level.found_secrets++;
     GameUtil.G_UseTargets(ent, activator);
     GameUtil.G_FreeEdict(ent);
 }
Exemple #2
0
            public override void Touch(edict_t self, edict_t other, cplane_t plane, csurface_t surf)
            {
                if (Lib.Strcmp(other.classname, "grenade") == 0)
                {
                    Math3D.VectorScale(self.movedir, self.speed * 10, other.velocity);
                }
                else if (other.health > 0)
                {
                    Math3D.VectorScale(self.movedir, self.speed * 10, other.velocity);
                    if (other.client != null)
                    {
                        Math3D.VectorCopy(other.velocity, other.client.oldvelocity);
                        if (other.fly_sound_debounce_time < GameBase.level.time)
                        {
                            other.fly_sound_debounce_time = GameBase.level.time + 1.5F;
                            GameBase.gi.Sound(other, Defines.CHAN_AUTO, windsound, 1, Defines.ATTN_NORM, 0);
                        }
                    }
                }

                if ((self.spawnflags & PUSH_ONCE) != 0)
                {
                    GameUtil.G_FreeEdict(self);
                }
            }
Exemple #3
0
        public static void SP_target_lightramp(edict_t self)
        {
            if (self.message == null || self.message.Length != 2 || self.message[0] < 'a' || self.message[0] > 'z' || self.message[1] < 'a' || self.message[1] > 'z' || self.message[0] == self.message[1])
            {
                GameBase.gi.Dprintf("target_lightramp has bad ramp (" + self.message + ") at " + Lib.Vtos(self.s.origin) + "\\n");
                GameUtil.G_FreeEdict(self);
                return;
            }

            if (GameBase.deathmatch.value != 0)
            {
                GameUtil.G_FreeEdict(self);
                return;
            }

            if (self.target == null)
            {
                GameBase.gi.Dprintf(self.classname + " with no target at " + Lib.Vtos(self.s.origin) + "\\n");
                GameUtil.G_FreeEdict(self);
                return;
            }

            self.svflags   |= Defines.SVF_NOCLIENT;
            self.use        = target_lightramp_use;
            self.think      = target_lightramp_think;
            self.movedir[0] = self.message[0] - 'a';
            self.movedir[1] = self.message[1] - 'a';
            self.movedir[2] = (self.movedir[1] - self.movedir[0]) / (self.speed / Defines.FRAMETIME);
        }
Exemple #4
0
            public override void Touch(edict_t self, edict_t other, cplane_t plane, csurface_t surf)
            {
                int mod;

                if (other == self.owner)
                {
                    return;
                }
                if (surf != null && (surf.flags & Defines.SURF_SKY) != 0)
                {
                    GameUtil.G_FreeEdict(self);
                    return;
                }

                if (self.owner.client != null)
                {
                    PlayerWeapon.PlayerNoise(self.owner, self.s.origin, Defines.PNOISE_IMPACT);
                }
                if (other.takedamage != 0)
                {
                    if ((self.spawnflags & 1) != 0)
                    {
                        mod = Defines.MOD_HYPERBLASTER;
                    }
                    else
                    {
                        mod = Defines.MOD_BLASTER;
                    }
                    float[] normal;
                    if (plane == null)
                    {
                        normal = new float[3];
                    }
                    else
                    {
                        normal = plane.normal;
                    }
                    GameCombat.T_Damage(other, self, self.owner, self.velocity, self.s.origin, normal, self.dmg, 1, Defines.DAMAGE_ENERGY, mod);
                }
                else
                {
                    GameBase.gi.WriteByte(Defines.svc_temp_entity);
                    GameBase.gi.WriteByte(Defines.TE_BLASTER);
                    GameBase.gi.WritePosition(self.s.origin);
                    if (plane == null)
                    {
                        GameBase.gi.WriteDir(Globals.vec3_origin);
                    }
                    else
                    {
                        GameBase.gi.WriteDir(plane.normal);
                    }
                    GameBase.gi.Multicast(self.s.origin, Defines.MULTICAST_PVS);
                }

                GameUtil.G_FreeEdict(self);
            }
Exemple #5
0
            public override Boolean Think(edict_t self)
            {
                if (self.spawnflags == (GameBase.game.serverflags & Defines.SFL_CROSS_TRIGGER_MASK & self.spawnflags))
                {
                    GameUtil.G_UseTargets(self, self);
                    GameUtil.G_FreeEdict(self);
                }

                return(true);
            }
Exemple #6
0
 public override void Use(edict_t ent, edict_t other, edict_t activator)
 {
     GameBase.gi.Sound(ent, Defines.CHAN_VOICE, ent.noise_index, 1, Defines.ATTN_NORM, 0);
     GameBase.level.found_goals++;
     if (GameBase.level.found_goals == GameBase.level.total_goals)
     {
         GameBase.gi.Configstring(Defines.CS_CDTRACK, "0");
     }
     GameUtil.G_UseTargets(ent, activator);
     GameUtil.G_FreeEdict(ent);
 }
Exemple #7
0
            public override void Touch(edict_t ent, edict_t other, cplane_t plane, csurface_t surf)
            {
                float[] origin = new float[] { 0, 0, 0 };
                int     n;

                if (other == ent.owner)
                {
                    return;
                }
                if (surf != null && (surf.flags & Defines.SURF_SKY) != 0)
                {
                    GameUtil.G_FreeEdict(ent);
                    return;
                }

                if (ent.owner.client != null)
                {
                    PlayerWeapon.PlayerNoise(ent.owner, ent.s.origin, Defines.PNOISE_IMPACT);
                }
                Math3D.VectorMA(ent.s.origin, -0.02F, ent.velocity, origin);
                if (other.takedamage != 0)
                {
                    GameCombat.T_Damage(other, ent, ent.owner, ent.velocity, ent.s.origin, plane.normal, ent.dmg, 0, 0, Defines.MOD_ROCKET);
                }
                else
                {
                    if (GameBase.deathmatch.value == 0 && 0 == GameBase.coop.value)
                    {
                        if ((surf != null) && 0 == (surf.flags & (Defines.SURF_WARP | Defines.SURF_TRANS33 | Defines.SURF_TRANS66 | Defines.SURF_FLOWING)))
                        {
                            n = Lib.Rand() % 5;
                            while (n-- > 0)
                            {
                                GameMisc.ThrowDebris(ent, "models/objects/debris2/tris.md2", 2, ent.s.origin);
                            }
                        }
                    }
                }

                GameCombat.T_RadiusDamage(ent, ent.owner, ent.radius_dmg, other, ent.dmg_radius, Defines.MOD_R_SPLASH);
                GameBase.gi.WriteByte(Defines.svc_temp_entity);
                if (ent.waterlevel != 0)
                {
                    GameBase.gi.WriteByte(Defines.TE_ROCKET_EXPLOSION_WATER);
                }
                else
                {
                    GameBase.gi.WriteByte(Defines.TE_ROCKET_EXPLOSION);
                }
                GameBase.gi.WritePosition(origin);
                GameBase.gi.Multicast(ent.s.origin, Defines.MULTICAST_PHS);
                GameUtil.G_FreeEdict(ent);
            }
Exemple #8
0
        public static void SP_trigger_gravity(edict_t self)
        {
            if (GameBase.st.gravity == null)
            {
                GameBase.gi.Dprintf("trigger_gravity without gravity set at " + Lib.Vtos(self.s.origin) + "\\n");
                GameUtil.G_FreeEdict(self);
                return;
            }

            InitTrigger(self);
            self.gravity = Lib.Atoi(GameBase.st.gravity);
            self.touch   = trigger_gravity_touch;
        }
Exemple #9
0
        public static bool Monster_start(edict_t self)
        {
            if (GameBase.deathmatch.value != 0)
            {
                GameUtil.G_FreeEdict(self);
                return(false);
            }

            if ((self.spawnflags & 4) != 0 && 0 == (self.monsterinfo.aiflags & Defines.AI_GOOD_GUY))
            {
                self.spawnflags &= ~4;
                self.spawnflags |= 1;
            }

            if (0 == (self.monsterinfo.aiflags & Defines.AI_GOOD_GUY))
            {
                GameBase.level.total_monsters++;
            }
            self.nextthink    = GameBase.level.time + Defines.FRAMETIME;
            self.svflags     |= Defines.SVF_MONSTER;
            self.s.renderfx  |= Defines.RF_FRAMELERP;
            self.takedamage   = Defines.DAMAGE_AIM;
            self.air_finished = GameBase.level.time + 12;
            self.use          = GameUtil.monster_use;
            self.max_health   = self.health;
            self.clipmask     = Defines.MASK_MONSTERSOLID;
            self.s.skinnum    = 0;
            self.deadflag     = Defines.DEAD_NO;
            self.svflags     &= ~Defines.SVF_DEADMONSTER;
            if (null == self.monsterinfo.checkattack)
            {
                self.monsterinfo.checkattack = GameUtil.M_CheckAttack;
            }
            Math3D.VectorCopy(self.s.origin, self.s.old_origin);
            if (GameBase.st.item != null && GameBase.st.item.Length > 0)
            {
                self.item = GameItems.FindItemByClassname(GameBase.st.item);
                if (self.item == null)
                {
                    GameBase.gi.Dprintf("monster_start:" + self.classname + " at " + Lib.Vtos(self.s.origin) + " has bad item: " + GameBase.st.item + "\\n");
                }
            }

            if (self.monsterinfo.currentmove != null)
            {
                self.s.frame = self.monsterinfo.currentmove.firstframe + (Lib.Rand() % (self.monsterinfo.currentmove.lastframe - self.monsterinfo.currentmove.firstframe + 1));
            }
            return(true);
        }
Exemple #10
0
        public static void SP_target_changelevel(edict_t ent)
        {
            if (ent.map == null)
            {
                GameBase.gi.Dprintf("target_changelevel with no map at " + Lib.Vtos(ent.s.origin) + "\\n");
                GameUtil.G_FreeEdict(ent);
                return;
            }

            if ((Lib.Q_stricmp(GameBase.level.mapname, "fact1") == 0) && (Lib.Q_stricmp(ent.map, "fact3") == 0))
            {
                ent.map = "fact3$secret1";
            }
            ent.use     = use_target_changelevel;
            ent.svflags = Defines.SVF_NOCLIENT;
        }
Exemple #11
0
        public static void SP_target_help(edict_t ent)
        {
            if (GameBase.deathmatch.value != 0)
            {
                GameUtil.G_FreeEdict(ent);
                return;
            }

            if (ent.message == null)
            {
                GameBase.gi.Dprintf(ent.classname + " with no message at " + Lib.Vtos(ent.s.origin) + "\\n");
                GameUtil.G_FreeEdict(ent);
                return;
            }

            ent.use = Use_Target_Help;
        }
Exemple #12
0
        public static void SP_target_goal(edict_t ent)
        {
            if (GameBase.deathmatch.value != 0)
            {
                GameUtil.G_FreeEdict(ent);
                return;
            }

            ent.use = use_target_goal;
            if (GameBase.st.noise == null)
            {
                GameBase.st.noise = "misc/secret.wav";
            }
            ent.noise_index = GameBase.gi.Soundindex(GameBase.st.noise);
            ent.svflags     = Defines.SVF_NOCLIENT;
            GameBase.level.total_goals++;
        }
Exemple #13
0
            public override bool Think(edict_t self)
            {
                if (self.target == null)
                {
                    GameBase.gi.Dprintf(self.classname + " at " + Lib.Vtos(self.s.origin) + " needs a target\\n");
                }
                else
                {
                    self.target_ent = GameBase.G_PickTarget(self.target);
                    Math3D.VectorSubtract(self.target_ent.s.origin, self.s.origin, self.move_origin);
                    GameUtil.G_FreeEdict(self.target_ent);
                }

                self.teammaster.dmg = self.dmg;
                self.think          = turret_breach_think;
                self.think.Think(self);
                return(true);
            }
Exemple #14
0
        public static void SP_turret_driver(edict_t self)
        {
            if (GameBase.deathmatch.value != 0)
            {
                GameUtil.G_FreeEdict(self);
                return;
            }

            self.movetype     = Defines.MOVETYPE_PUSH;
            self.solid        = Defines.SOLID_BBOX;
            self.s.modelindex = GameBase.gi.Modelindex("models/monsters/infantry/tris.md2");
            Math3D.VectorSet(self.mins, -16, -16, -24);
            Math3D.VectorSet(self.maxs, 16, 16, 32);
            self.health            = 100;
            self.gib_health        = 0;
            self.mass              = 200;
            self.viewheight        = 24;
            self.die               = turret_driver_die;
            self.monsterinfo.stand = M_Infantry.infantry_stand;
            self.flags            |= Defines.FL_NO_KNOCKBACK;
            GameBase.level.total_monsters++;
            self.svflags    |= Defines.SVF_MONSTER;
            self.s.renderfx |= Defines.RF_FRAMELERP;
            self.takedamage  = Defines.DAMAGE_AIM;
            self.use         = GameUtil.monster_use;
            self.clipmask    = Defines.MASK_MONSTERSOLID;
            Math3D.VectorCopy(self.s.origin, self.s.old_origin);
            self.monsterinfo.aiflags |= Defines.AI_STAND_GROUND | Defines.AI_DUCKED;
            if (GameBase.st.item != null)
            {
                self.item = GameItems.FindItemByClassname(GameBase.st.item);
                if (self.item == null)
                {
                    GameBase.gi.Dprintf(self.classname + " at " + Lib.Vtos(self.s.origin) + " has bad item: " + GameBase.st.item + "\\n");
                }
            }

            self.think     = turret_driver_link;
            self.nextthink = GameBase.level.time + Defines.FRAMETIME;
            GameBase.gi.Linkentity(self);
        }
Exemple #15
0
        public static void SP_target_secret(edict_t ent)
        {
            if (GameBase.deathmatch.value != 0)
            {
                GameUtil.G_FreeEdict(ent);
                return;
            }

            ent.use = use_target_secret;
            if (GameBase.st.noise == null)
            {
                GameBase.st.noise = "misc/secret.wav";
            }
            ent.noise_index = GameBase.gi.Soundindex(GameBase.st.noise);
            ent.svflags     = Defines.SVF_NOCLIENT;
            GameBase.level.total_secrets++;
            if (0 == Lib.Q_stricmp(GameBase.level.mapname, "mine3") && ent.s.origin[0] == 280 && ent.s.origin[1] == -2048 && ent.s.origin[2] == -624)
            {
                ent.message = "You have found a secret area.";
            }
        }
Exemple #16
0
            public override void Touch(edict_t self, edict_t other, cplane_t plane, csurface_t surf)
            {
                if (other == self.owner)
                {
                    return;
                }
                if (surf != null && (surf.flags & Defines.SURF_SKY) != 0)
                {
                    GameUtil.G_FreeEdict(self);
                    return;
                }

                if (self.owner.client != null)
                {
                    PlayerWeapon.PlayerNoise(self.owner, self.s.origin, Defines.PNOISE_IMPACT);
                }
                if (other.takedamage != 0)
                {
                    GameCombat.T_Damage(other, self, self.owner, self.velocity, self.s.origin, plane.normal, 200, 0, 0, Defines.MOD_BFG_BLAST);
                }
                GameCombat.T_RadiusDamage(self, self.owner, 200, other, 100, Defines.MOD_BFG_BLAST);
                GameBase.gi.Sound(self, Defines.CHAN_VOICE, GameBase.gi.Soundindex("weapons/bfg__x1b.wav"), 1, Defines.ATTN_NORM, 0);
                self.solid = Defines.SOLID_NOT;
                self.touch = null;
                Math3D.VectorMA(self.s.origin, -1 * Defines.FRAMETIME, self.velocity, self.s.origin);
                Math3D.VectorClear(self.velocity);
                self.s.modelindex = GameBase.gi.Modelindex("sprites/s_bfg3.sp2");
                self.s.frame      = 0;
                self.s.sound      = 0;
                self.s.effects   &= ~Defines.EF_ANIM_ALLFAST;
                self.think        = bfg_explode;
                self.nextthink    = GameBase.level.time + Defines.FRAMETIME;
                self.enemy        = other;
                GameBase.gi.WriteByte(Defines.svc_temp_entity);
                GameBase.gi.WriteByte(Defines.TE_BFG_BIGEXPLOSION);
                GameBase.gi.WritePosition(self.s.origin);
                GameBase.gi.Multicast(self.s.origin, Defines.MULTICAST_PVS);
            }
Exemple #17
0
            public override void Use(edict_t self, edict_t other, edict_t activator)
            {
                if (self.enemy == null)
                {
                    edict_t e;
                    e = null;
                    EdictIterator es = null;
                    while (true)
                    {
                        es = GameBase.G_Find(es, GameBase.findByTarget, self.target);
                        if (es == null)
                        {
                            break;
                        }
                        e = es.o;
                        if (Lib.Strcmp(e.classname, "light") != 0)
                        {
                            GameBase.gi.Dprintf(self.classname + " at " + Lib.Vtos(self.s.origin));
                            GameBase.gi.Dprintf("target " + self.target + " (" + e.classname + " at " + Lib.Vtos(e.s.origin) + ") is not a light\\n");
                        }
                        else
                        {
                            self.enemy = e;
                        }
                    }

                    if (null == self.enemy)
                    {
                        GameBase.gi.Dprintf(self.classname + " target " + self.target + " not found at " + Lib.Vtos(self.s.origin) + "\\n");
                        GameUtil.G_FreeEdict(self);
                        return;
                    }
                }

                self.timestamp = GameBase.level.time;
                target_lightramp_think.Think(self);
            }
Exemple #18
0
            public override void Touch(edict_t ent, edict_t other, cplane_t plane, csurface_t surf)
            {
                if (other == ent.owner)
                {
                    return;
                }
                if (surf != null && 0 != (surf.flags & Defines.SURF_SKY))
                {
                    GameUtil.G_FreeEdict(ent);
                    return;
                }

                if (other.takedamage == 0)
                {
                    if ((ent.spawnflags & 1) != 0)
                    {
                        if (Lib.Random() > 0.5F)
                        {
                            GameBase.gi.Sound(ent, Defines.CHAN_VOICE, GameBase.gi.Soundindex("weapons/hgrenb1a.wav"), 1, Defines.ATTN_NORM, 0);
                        }
                        else
                        {
                            GameBase.gi.Sound(ent, Defines.CHAN_VOICE, GameBase.gi.Soundindex("weapons/hgrenb2a.wav"), 1, Defines.ATTN_NORM, 0);
                        }
                    }
                    else
                    {
                        GameBase.gi.Sound(ent, Defines.CHAN_VOICE, GameBase.gi.Soundindex("weapons/grenlb1b.wav"), 1, Defines.ATTN_NORM, 0);
                    }

                    return;
                }

                ent.enemy = other;
                Grenade_Explode.Think(ent);
            }
Exemple #19
0
            public override bool Think(edict_t ent)
            {
                float[] origin = new float[] { 0, 0, 0 };
                int     mod;

                if (ent.owner.client != null)
                {
                    PlayerWeapon.PlayerNoise(ent.owner, ent.s.origin, Defines.PNOISE_IMPACT);
                }
                if (ent.enemy != null)
                {
                    float   points = 0;
                    float[] v      = new float[] { 0, 0, 0 };
                    float[] dir    = new float[] { 0, 0, 0 };
                    Math3D.VectorAdd(ent.enemy.mins, ent.enemy.maxs, v);
                    Math3D.VectorMA(ent.enemy.s.origin, 0.5F, v, v);
                    Math3D.VectorSubtract(ent.s.origin, v, v);
                    points = ent.dmg - 0.5F * Math3D.VectorLength(v);
                    Math3D.VectorSubtract(ent.enemy.s.origin, ent.s.origin, dir);
                    if ((ent.spawnflags & 1) != 0)
                    {
                        mod = Defines.MOD_HANDGRENADE;
                    }
                    else
                    {
                        mod = Defines.MOD_GRENADE;
                    }
                    GameCombat.T_Damage(ent.enemy, ent, ent.owner, dir, ent.s.origin, Globals.vec3_origin, (int)points, (int)points, Defines.DAMAGE_RADIUS, mod);
                }

                if ((ent.spawnflags & 2) != 0)
                {
                    mod = Defines.MOD_HELD_GRENADE;
                }
                else if ((ent.spawnflags & 1) != 0)
                {
                    mod = Defines.MOD_HG_SPLASH;
                }
                else
                {
                    mod = Defines.MOD_G_SPLASH;
                }
                GameCombat.T_RadiusDamage(ent, ent.owner, ent.dmg, ent.enemy, ent.dmg_radius, mod);
                Math3D.VectorMA(ent.s.origin, -0.02F, ent.velocity, origin);
                GameBase.gi.WriteByte(Defines.svc_temp_entity);
                if (ent.waterlevel != 0)
                {
                    if (ent.groundentity != null)
                    {
                        GameBase.gi.WriteByte(Defines.TE_GRENADE_EXPLOSION_WATER);
                    }
                    else
                    {
                        GameBase.gi.WriteByte(Defines.TE_ROCKET_EXPLOSION_WATER);
                    }
                }
                else
                {
                    if (ent.groundentity != null)
                    {
                        GameBase.gi.WriteByte(Defines.TE_GRENADE_EXPLOSION);
                    }
                    else
                    {
                        GameBase.gi.WriteByte(Defines.TE_ROCKET_EXPLOSION);
                    }
                }

                GameBase.gi.WritePosition(origin);
                GameBase.gi.Multicast(ent.s.origin, Defines.MULTICAST_PHS);
                GameUtil.G_FreeEdict(ent);
                return(true);
            }
Exemple #20
0
 public override void Use(edict_t self, edict_t other, edict_t activator)
 {
     GameBase.game.serverflags |= self.spawnflags;
     GameUtil.G_FreeEdict(self);
 }
Exemple #21
0
            public override void Ai(edict_t self, float dist)
            {
                float[] v = new float[] { 0, 0, 0 };
                edict_t tempgoal;
                edict_t save;
                bool    new1;
                edict_t marker;
                float   d1, d2;
                trace_t tr;

                float[] v_forward = new float[] { 0, 0, 0 }, v_right = new float[] { 0, 0, 0 };
                float   left, center, right;

                float[] left_target = new float[] { 0, 0, 0 }, right_target = new float[] { 0, 0, 0 };
                if ((self.monsterinfo.aiflags & Defines.AI_COMBAT_POINT) != 0)
                {
                    M.M_MoveToGoal(self, dist);
                    return;
                }

                if ((self.monsterinfo.aiflags & Defines.AI_SOUND_TARGET) != 0)
                {
                    Math3D.VectorSubtract(self.s.origin, self.enemy.s.origin, v);
                    if (Math3D.VectorLength(v) < 64)
                    {
                        self.monsterinfo.stand.Think(self);
                        self.spawnflags &= ~1;
                        self.enemy       = null;
                    }
                    else
                    {
                        M.M_MoveToGoal(self, dist);
                    }
                    if (!GameUtil.FindTarget(self))
                    {
                        return;
                    }
                }

                if (Ai_checkattack(self, dist))
                {
                    return;
                }
                if (self.monsterinfo.attack_state == Defines.AS_SLIDING)
                {
                    Ai_run_slide(self, dist);
                    return;
                }

                if (enemy_vis)
                {
                    M.M_MoveToGoal(self, dist);
                    self.monsterinfo.aiflags &= ~Defines.AI_LOST_SIGHT;
                    Math3D.VectorCopy(self.enemy.s.origin, self.monsterinfo.last_sighting);
                    self.monsterinfo.trail_time = GameBase.level.time;
                    return;
                }

                if (GameBase.coop.value != 0)
                {
                    if (GameUtil.FindTarget(self))
                    {
                        return;
                    }
                }

                if ((self.monsterinfo.search_time != 0) && (GameBase.level.time > (self.monsterinfo.search_time + 20)))
                {
                    M.M_MoveToGoal(self, dist);
                    self.monsterinfo.search_time = 0;
                    return;
                }

                save            = self.goalentity;
                tempgoal        = GameUtil.G_Spawn();
                self.goalentity = tempgoal;
                new1            = false;
                if (0 == (self.monsterinfo.aiflags & Defines.AI_LOST_SIGHT))
                {
                    self.monsterinfo.aiflags |= (Defines.AI_LOST_SIGHT | Defines.AI_PURSUIT_LAST_SEEN);
                    self.monsterinfo.aiflags &= ~(Defines.AI_PURSUE_NEXT | Defines.AI_PURSUE_TEMP);
                    new1 = true;
                }

                if ((self.monsterinfo.aiflags & Defines.AI_PURSUE_NEXT) != 0)
                {
                    self.monsterinfo.aiflags    &= ~Defines.AI_PURSUE_NEXT;
                    self.monsterinfo.search_time = GameBase.level.time + 5;
                    if ((self.monsterinfo.aiflags & Defines.AI_PURSUE_TEMP) != 0)
                    {
                        self.monsterinfo.aiflags &= ~Defines.AI_PURSUE_TEMP;
                        marker = null;
                        Math3D.VectorCopy(self.monsterinfo.saved_goal, self.monsterinfo.last_sighting);
                        new1 = true;
                    }
                    else if ((self.monsterinfo.aiflags & Defines.AI_PURSUIT_LAST_SEEN) != 0)
                    {
                        self.monsterinfo.aiflags &= ~Defines.AI_PURSUIT_LAST_SEEN;
                        marker = PlayerTrail.PickFirst(self);
                    }
                    else
                    {
                        marker = PlayerTrail.PickNext(self);
                    }

                    if (marker != null)
                    {
                        Math3D.VectorCopy(marker.s.origin, self.monsterinfo.last_sighting);
                        self.monsterinfo.trail_time = marker.timestamp;
                        self.s.angles[Defines.YAW]  = self.ideal_yaw = marker.s.angles[Defines.YAW];
                        new1 = true;
                    }
                }

                Math3D.VectorSubtract(self.s.origin, self.monsterinfo.last_sighting, v);
                d1 = Math3D.VectorLength(v);
                if (d1 <= dist)
                {
                    self.monsterinfo.aiflags |= Defines.AI_PURSUE_NEXT;
                    dist = d1;
                }

                Math3D.VectorCopy(self.monsterinfo.last_sighting, self.goalentity.s.origin);
                if (new1)
                {
                    tr = GameBase.gi.Trace(self.s.origin, self.mins, self.maxs, self.monsterinfo.last_sighting, self, Defines.MASK_PLAYERSOLID);
                    if (tr.fraction < 1)
                    {
                        Math3D.VectorSubtract(self.goalentity.s.origin, self.s.origin, v);
                        d1     = Math3D.VectorLength(v);
                        center = tr.fraction;
                        d2     = d1 * ((center + 1) / 2);
                        self.s.angles[Defines.YAW] = self.ideal_yaw = Math3D.Vectoyaw(v);
                        Math3D.AngleVectors(self.s.angles, v_forward, v_right, null);
                        Math3D.VectorSet(v, d2, -16, 0);
                        Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, left_target);
                        tr   = GameBase.gi.Trace(self.s.origin, self.mins, self.maxs, left_target, self, Defines.MASK_PLAYERSOLID);
                        left = tr.fraction;
                        Math3D.VectorSet(v, d2, 16, 0);
                        Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, right_target);
                        tr     = GameBase.gi.Trace(self.s.origin, self.mins, self.maxs, right_target, self, Defines.MASK_PLAYERSOLID);
                        right  = tr.fraction;
                        center = (d1 * center) / d2;
                        if (left >= center && left > right)
                        {
                            if (left < 1)
                            {
                                Math3D.VectorSet(v, d2 * left * 0.5F, -16F, 0F);
                                Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, left_target);
                            }

                            Math3D.VectorCopy(self.monsterinfo.last_sighting, self.monsterinfo.saved_goal);
                            self.monsterinfo.aiflags |= Defines.AI_PURSUE_TEMP;
                            Math3D.VectorCopy(left_target, self.goalentity.s.origin);
                            Math3D.VectorCopy(left_target, self.monsterinfo.last_sighting);
                            Math3D.VectorSubtract(self.goalentity.s.origin, self.s.origin, v);
                            self.s.angles[Defines.YAW] = self.ideal_yaw = Math3D.Vectoyaw(v);
                        }
                        else if (right >= center && right > left)
                        {
                            if (right < 1)
                            {
                                Math3D.VectorSet(v, d2 * right * 0.5F, 16F, 0F);
                                Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, right_target);
                            }

                            Math3D.VectorCopy(self.monsterinfo.last_sighting, self.monsterinfo.saved_goal);
                            self.monsterinfo.aiflags |= Defines.AI_PURSUE_TEMP;
                            Math3D.VectorCopy(right_target, self.goalentity.s.origin);
                            Math3D.VectorCopy(right_target, self.monsterinfo.last_sighting);
                            Math3D.VectorSubtract(self.goalentity.s.origin, self.s.origin, v);
                            self.s.angles[Defines.YAW] = self.ideal_yaw = Math3D.Vectoyaw(v);
                        }
                    }
                }

                M.M_MoveToGoal(self, dist);
                GameUtil.G_FreeEdict(tempgoal);
                if (self != null)
                {
                    self.goalentity = save;
                }
            }
Exemple #22
0
        public static void Give_f(edict_t ent)
        {
            String  name;
            gitem_t it;
            Int32   index;
            Int32   i;
            Boolean give_all;
            edict_t it_ent;

            if (GameBase.deathmatch.value != 0 && GameBase.sv_cheats.value == 0)
            {
                SV_GAME.PF_cprintfhigh(ent, "You must run the server with '+set cheats 1' to enable this command.\\n");
                return;
            }

            name = Cmd.Args();
            if (0 == Lib.Q_stricmp(name, "all"))
            {
                give_all = true;
            }
            else
            {
                give_all = false;
            }
            if (give_all || 0 == Lib.Q_stricmp(Cmd.Argv(1), "health"))
            {
                if (Cmd.Argc() == 3)
                {
                    ent.health = Lib.Atoi(Cmd.Argv(2));
                }
                else
                {
                    ent.health = ent.max_health;
                }
                if (!give_all)
                {
                    return;
                }
            }

            if (give_all || 0 == Lib.Q_stricmp(name, "weapons"))
            {
                for (i = 1; i < GameBase.game.num_items; i++)
                {
                    it = GameItemList.itemlist[i];
                    if (null == it.pickup)
                    {
                        continue;
                    }
                    if (0 == (it.flags & Defines.IT_WEAPON))
                    {
                        continue;
                    }
                    ent.client.pers.inventory[i] += 1;
                }

                if (!give_all)
                {
                    return;
                }
            }

            if (give_all || 0 == Lib.Q_stricmp(name, "ammo"))
            {
                for (i = 1; i < GameBase.game.num_items; i++)
                {
                    it = GameItemList.itemlist[i];
                    if (null == it.pickup)
                    {
                        continue;
                    }
                    if (0 == (it.flags & Defines.IT_AMMO))
                    {
                        continue;
                    }
                    GameItems.Add_Ammo(ent, it, 1000);
                }

                if (!give_all)
                {
                    return;
                }
            }

            if (give_all || Lib.Q_stricmp(name, "armor") == 0)
            {
                gitem_armor_t info;
                it = GameItems.FindItem("Jacket Armor");
                ent.client.pers.inventory[GameItems.ITEM_INDEX(it)] = 0;
                it = GameItems.FindItem("Combat Armor");
                ent.client.pers.inventory[GameItems.ITEM_INDEX(it)] = 0;
                it   = GameItems.FindItem("Body Armor");
                info = ( gitem_armor_t )it.info;
                ent.client.pers.inventory[GameItems.ITEM_INDEX(it)] = info.max_count;
                if (!give_all)
                {
                    return;
                }
            }

            if (give_all || Lib.Q_stricmp(name, "Power Shield") == 0)
            {
                it               = GameItems.FindItem("Power Shield");
                it_ent           = GameUtil.G_Spawn();
                it_ent.classname = it.classname;
                GameItems.SpawnItem(it_ent, it);
                GameItems.Touch_Item(it_ent, ent, GameBase.dummyplane, null);
                if (it_ent.inuse)
                {
                    GameUtil.G_FreeEdict(it_ent);
                }
                if (!give_all)
                {
                    return;
                }
            }

            if (give_all)
            {
                for (i = 1; i < GameBase.game.num_items; i++)
                {
                    it = GameItemList.itemlist[i];
                    if (it.pickup != null)
                    {
                        continue;
                    }
                    if ((it.flags & (Defines.IT_ARMOR | Defines.IT_WEAPON | Defines.IT_AMMO)) != 0)
                    {
                        continue;
                    }
                    ent.client.pers.inventory[i] = 1;
                }

                return;
            }

            it = GameItems.FindItem(name);
            if (it == null)
            {
                name = Cmd.Argv(1);
                it   = GameItems.FindItem(name);
                if (it == null)
                {
                    SV_GAME.PF_cprintf(ent, Defines.PRINT_HIGH, "unknown item\\n");
                    return;
                }
            }

            if (it.pickup == null)
            {
                SV_GAME.PF_cprintf(ent, Defines.PRINT_HIGH, "non-pickup item\\n");
                return;
            }

            index = GameItems.ITEM_INDEX(it);
            if ((it.flags & Defines.IT_AMMO) != 0)
            {
                if (Cmd.Argc() == 3)
                {
                    ent.client.pers.inventory[index] = Lib.Atoi(Cmd.Argv(2));
                }
                else
                {
                    ent.client.pers.inventory[index] += it.quantity;
                }
            }
            else
            {
                it_ent           = GameUtil.G_Spawn();
                it_ent.classname = it.classname;
                GameItems.SpawnItem(it_ent, it);
                GameItems.Touch_Item(it_ent, ent, GameBase.dummyplane, null);
                if (it_ent.inuse)
                {
                    GameUtil.G_FreeEdict(it_ent);
                }
            }
        }