示例#1
0
        public static void Fire_bfg(edict_t self, float[] start, float[] dir, int damage, int speed, float damage_radius)
        {
            edict_t bfg;

            bfg = GameUtil.G_Spawn();
            Math3D.VectorCopy(start, bfg.s.origin);
            Math3D.VectorCopy(dir, bfg.movedir);
            Math3D.Vectoangles(dir, bfg.s.angles);
            Math3D.VectorScale(dir, speed, bfg.velocity);
            bfg.movetype   = Defines.MOVETYPE_FLYMISSILE;
            bfg.clipmask   = Defines.MASK_SHOT;
            bfg.solid      = Defines.SOLID_BBOX;
            bfg.s.effects |= Defines.EF_BFG | Defines.EF_ANIM_ALLFAST;
            Math3D.VectorClear(bfg.mins);
            Math3D.VectorClear(bfg.maxs);
            bfg.s.modelindex = GameBase.gi.Modelindex("sprites/s_bfg1.sp2");
            bfg.owner        = self;
            bfg.touch        = bfg_touch;
            bfg.nextthink    = GameBase.level.time + 8000 / speed;
            bfg.think        = GameUtil.G_FreeEdictA;
            bfg.radius_dmg   = damage;
            bfg.dmg_radius   = damage_radius;
            bfg.classname    = "bfg blast";
            bfg.s.sound      = GameBase.gi.Soundindex("weapons/bfg__l1a.wav");
            bfg.think        = bfg_think;
            bfg.nextthink    = GameBase.level.time + Defines.FRAMETIME;
            bfg.teammaster   = bfg;
            bfg.teamchain    = null;
            if (self.client != null)
            {
                Check_dodge(self, bfg.s.origin, dir, speed);
            }
            GameBase.gi.Linkentity(bfg);
        }
示例#2
0
        public static void Fire_rocket(edict_t self, float[] start, float[] dir, int damage, int speed, float damage_radius, int radius_damage)
        {
            edict_t rocket;

            rocket = GameUtil.G_Spawn();
            Math3D.VectorCopy(start, rocket.s.origin);
            Math3D.VectorCopy(dir, rocket.movedir);
            Math3D.Vectoangles(dir, rocket.s.angles);
            Math3D.VectorScale(dir, speed, rocket.velocity);
            rocket.movetype   = Defines.MOVETYPE_FLYMISSILE;
            rocket.clipmask   = Defines.MASK_SHOT;
            rocket.solid      = Defines.SOLID_BBOX;
            rocket.s.effects |= Defines.EF_ROCKET;
            Math3D.VectorClear(rocket.mins);
            Math3D.VectorClear(rocket.maxs);
            rocket.s.modelindex = GameBase.gi.Modelindex("models/objects/rocket/tris.md2");
            rocket.owner        = self;
            rocket.touch        = rocket_touch;
            rocket.nextthink    = GameBase.level.time + 8000 / speed;
            rocket.think        = GameUtil.G_FreeEdictA;
            rocket.dmg          = damage;
            rocket.radius_dmg   = radius_damage;
            rocket.dmg_radius   = damage_radius;
            rocket.s.sound      = GameBase.gi.Soundindex("weapons/rockfly.wav");
            rocket.classname    = "rocket";
            if (self.client != null)
            {
                Check_dodge(self, rocket.s.origin, dir, speed);
            }
            GameBase.gi.Linkentity(rocket);
        }
示例#3
0
        public static void Fire_grenade(edict_t self, float[] start, float[] aimdir, int damage, int speed, float timer, float damage_radius)
        {
            edict_t grenade;

            float[] dir     = new float[] { 0, 0, 0 };
            float[] forward = new float[] { 0, 0, 0 }, right = new float[] { 0, 0, 0 }, up = new float[] { 0, 0, 0 };
            Math3D.Vectoangles(aimdir, dir);
            Math3D.AngleVectors(dir, forward, right, up);
            grenade = GameUtil.G_Spawn();
            Math3D.VectorCopy(start, grenade.s.origin);
            Math3D.VectorScale(aimdir, speed, grenade.velocity);
            Math3D.VectorMA(grenade.velocity, 200F + Lib.Crandom() * 10F, up, grenade.velocity);
            Math3D.VectorMA(grenade.velocity, Lib.Crandom() * 10F, right, grenade.velocity);
            Math3D.VectorSet(grenade.avelocity, 300, 300, 300);
            grenade.movetype   = Defines.MOVETYPE_BOUNCE;
            grenade.clipmask   = Defines.MASK_SHOT;
            grenade.solid      = Defines.SOLID_BBOX;
            grenade.s.effects |= Defines.EF_GRENADE;
            Math3D.VectorClear(grenade.mins);
            Math3D.VectorClear(grenade.maxs);
            grenade.s.modelindex = GameBase.gi.Modelindex("models/objects/grenade/tris.md2");
            grenade.owner        = self;
            grenade.touch        = Grenade_Touch;
            grenade.nextthink    = GameBase.level.time + timer;
            grenade.think        = Grenade_Explode;
            grenade.dmg          = damage;
            grenade.dmg_radius   = damage_radius;
            grenade.classname    = "grenade";
            GameBase.gi.Linkentity(grenade);
        }
示例#4
0
        public static edict_t CreateTargetChangeLevel(string map)
        {
            edict_t ent;

            ent           = GameUtil.G_Spawn();
            ent.classname = "target_changelevel";
            level.nextmap = map;
            ent.map       = level.nextmap;
            return(ent);
        }
示例#5
0
        public static void Init()
        {
            if (GameBase.deathmatch.value != 0)
            {
                return;
            }
            for (int n = 0; n < PlayerTrail.TRAIL_LENGTH; n++)
            {
                PlayerTrail.trail[n]           = GameUtil.G_Spawn();
                PlayerTrail.trail[n].classname = "player_trail";
            }

            trail_head   = 0;
            trail_active = true;
        }
示例#6
0
        public static void Fire_grenade2(edict_t self, float[] start, float[] aimdir, int damage, int speed, float timer, float damage_radius, bool held)
        {
            edict_t grenade;

            float[] dir     = new float[] { 0, 0, 0 };
            float[] forward = new float[] { 0, 0, 0 }, right = new float[] { 0, 0, 0 }, up = new float[] { 0, 0, 0 };
            Math3D.Vectoangles(aimdir, dir);
            Math3D.AngleVectors(dir, forward, right, up);
            grenade = GameUtil.G_Spawn();
            Math3D.VectorCopy(start, grenade.s.origin);
            Math3D.VectorScale(aimdir, speed, grenade.velocity);
            Math3D.VectorMA(grenade.velocity, 200F + Lib.Crandom() * 10F, up, grenade.velocity);
            Math3D.VectorMA(grenade.velocity, Lib.Crandom() * 10F, right, grenade.velocity);
            Math3D.VectorSet(grenade.avelocity, 300F, 300F, 300F);
            grenade.movetype   = Defines.MOVETYPE_BOUNCE;
            grenade.clipmask   = Defines.MASK_SHOT;
            grenade.solid      = Defines.SOLID_BBOX;
            grenade.s.effects |= Defines.EF_GRENADE;
            Math3D.VectorClear(grenade.mins);
            Math3D.VectorClear(grenade.maxs);
            grenade.s.modelindex = GameBase.gi.Modelindex("models/objects/grenade2/tris.md2");
            grenade.owner        = self;
            grenade.touch        = Grenade_Touch;
            grenade.nextthink    = GameBase.level.time + timer;
            grenade.think        = Grenade_Explode;
            grenade.dmg          = damage;
            grenade.dmg_radius   = damage_radius;
            grenade.classname    = "hgrenade";
            if (held)
            {
                grenade.spawnflags = 3;
            }
            else
            {
                grenade.spawnflags = 1;
            }
            grenade.s.sound = GameBase.gi.Soundindex("weapons/hgrenc1b.wav");
            if (timer <= 0)
            {
                Grenade_Explode.Think(grenade);
            }
            else
            {
                GameBase.gi.Sound(self, Defines.CHAN_WEAPON, GameBase.gi.Soundindex("weapons/hgrent1a.wav"), 1, Defines.ATTN_NORM, 0);
                GameBase.gi.Linkentity(grenade);
            }
        }
示例#7
0
            public override void Use(edict_t self, edict_t other, edict_t activator)
            {
                edict_t ent;

                ent           = GameUtil.G_Spawn();
                ent.classname = self.target;
                Math3D.VectorCopy(self.s.origin, ent.s.origin);
                Math3D.VectorCopy(self.s.angles, ent.s.angles);
                GameSpawn.ED_CallSpawn(ent);
                GameBase.gi.Unlinkentity(ent);
                GameUtil.KillBox(ent);
                GameBase.gi.Linkentity(ent);
                if (self.speed != 0)
                {
                    Math3D.VectorCopy(self.movedir, ent.velocity);
                }
            }
示例#8
0
        public static void Fire_blaster(edict_t self, float[] start, float[] dir, int damage, int speed, int effect, bool hyper)
        {
            edict_t bolt;
            trace_t tr;

            Math3D.VectorNormalize(dir);
            bolt         = GameUtil.G_Spawn();
            bolt.svflags = Defines.SVF_DEADMONSTER;
            Math3D.VectorCopy(start, bolt.s.origin);
            Math3D.VectorCopy(start, bolt.s.old_origin);
            Math3D.Vectoangles(dir, bolt.s.angles);
            Math3D.VectorScale(dir, speed, bolt.velocity);
            bolt.movetype   = Defines.MOVETYPE_FLYMISSILE;
            bolt.clipmask   = Defines.MASK_SHOT;
            bolt.solid      = Defines.SOLID_BBOX;
            bolt.s.effects |= effect;
            Math3D.VectorClear(bolt.mins);
            Math3D.VectorClear(bolt.maxs);
            bolt.s.modelindex = GameBase.gi.Modelindex("models/objects/laser/tris.md2");
            bolt.s.sound      = GameBase.gi.Soundindex("misc/lasfly.wav");
            bolt.owner        = self;
            bolt.touch        = blaster_touch;
            bolt.nextthink    = GameBase.level.time + 2;
            bolt.think        = GameUtil.G_FreeEdictA;
            bolt.dmg          = damage;
            bolt.classname    = "bolt";
            if (hyper)
            {
                bolt.spawnflags = 1;
            }
            GameBase.gi.Linkentity(bolt);
            if (self.client != null)
            {
                Check_dodge(self, bolt.s.origin, dir, speed);
            }
            tr = GameBase.gi.Trace(self.s.origin, null, null, bolt.s.origin, bolt, Defines.MASK_SHOT);
            if (tr.fraction < 1)
            {
                Math3D.VectorMA(bolt.s.origin, -10, dir, bolt.s.origin);
                bolt.touch.Touch(bolt, tr.ent, GameBase.dummyplane, null);
            }
        }
示例#9
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);
                }
            }
        }
示例#10
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;
                }
            }