Esempio n. 1
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);
            }
Esempio n. 2
0
 public override void Use(edict_t self, edict_t other, edict_t activator)
 {
     GameBase.gi.WriteByte(Defines.svc_temp_entity);
     GameBase.gi.WriteByte(Defines.TE_SPLASH);
     GameBase.gi.WriteByte(self.count);
     GameBase.gi.WritePosition(self.s.origin);
     GameBase.gi.WriteDir(self.movedir);
     GameBase.gi.WriteByte(self.sounds);
     GameBase.gi.Multicast(self.s.origin, Defines.MULTICAST_PVS);
     if (self.dmg != 0)
     {
         GameCombat.T_RadiusDamage(self, activator, self.dmg, null, self.dmg + 40, Defines.MOD_SPLASH);
     }
 }
Esempio n. 3
0
            public override Boolean Think(edict_t self)
            {
                Single save;

                GameBase.gi.WriteByte(Defines.svc_temp_entity);
                GameBase.gi.WriteByte(Defines.TE_EXPLOSION1);
                GameBase.gi.WritePosition(self.s.origin);
                GameBase.gi.Multicast(self.s.origin, Defines.MULTICAST_PHS);
                GameCombat.T_RadiusDamage(self, self.activator, self.dmg, null, self.dmg + 40, Defines.MOD_EXPLOSIVE);
                save       = self.delay;
                self.delay = 0;
                GameUtil.G_UseTargets(self, self.activator);
                self.delay = save;
                return(true);
            }
Esempio n. 4
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);
            }
Esempio n. 5
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);
            }