示例#1
0
            public override void Use(edict_t self, edict_t other, edict_t activator)
            {
                if (GameBase.level.intermissiontime != 0)
                {
                    return;
                }
                if (0 == GameBase.deathmatch.value && 0 == GameBase.coop.value)
                {
                    if (GameBase.g_edicts[1].health <= 0)
                    {
                        return;
                    }
                }

                if (GameBase.deathmatch.value != 0 && 0 == (( Int32 )GameBase.dmflags.value & Defines.DF_ALLOW_EXIT) && other != GameBase.g_edicts[0])
                {
                    GameCombat.T_Damage(other, self, self, Globals.vec3_origin, other.s.origin, Globals.vec3_origin, 10 * other.max_health, 1000, 0, Defines.MOD_EXIT);
                    return;
                }

                if (GameBase.deathmatch.value != 0)
                {
                    if (activator != null && activator.client != null)
                    {
                        GameBase.gi.Bprintf(Defines.PRINT_HIGH, activator.client.pers.netname + " exited the level.\\n");
                    }
                }

                if (self.map.IndexOf('*') > -1)
                {
                    GameBase.game.serverflags &= ~(Defines.SFL_CROSS_TRIGGER_MASK);
                }
                PlayerHud.BeginIntermission(self);
            }
示例#2
0
        public static void Fire_rail(edict_t self, float[] start, float[] aimdir, int damage, int kick)
        {
            float[] from = new float[] { 0, 0, 0 };
            float[] end  = new float[] { 0, 0, 0 };
            trace_t tr   = null;
            edict_t ignore;
            int     mask;
            bool    water;

            Math3D.VectorMA(start, 8192F, aimdir, end);
            Math3D.VectorCopy(start, from);
            ignore = self;
            water  = false;
            mask   = Defines.MASK_SHOT | Defines.CONTENTS_SLIME | Defines.CONTENTS_LAVA;
            while (ignore != null)
            {
                tr = GameBase.gi.Trace(from, null, null, end, ignore, mask);
                if ((tr.contents & (Defines.CONTENTS_SLIME | Defines.CONTENTS_LAVA)) != 0)
                {
                    mask &= ~(Defines.CONTENTS_SLIME | Defines.CONTENTS_LAVA);
                    water = true;
                }
                else
                {
                    if ((tr.ent.svflags & Defines.SVF_MONSTER) != 0 || (tr.ent.client != null) || (tr.ent.solid == Defines.SOLID_BBOX))
                    {
                        ignore = tr.ent;
                    }
                    else
                    {
                        ignore = null;
                    }
                    if ((tr.ent != self) && (tr.ent.takedamage != 0))
                    {
                        GameCombat.T_Damage(tr.ent, self, self, aimdir, tr.endpos, tr.plane.normal, damage, kick, 0, Defines.MOD_RAILGUN);
                    }
                }

                Math3D.VectorCopy(tr.endpos, from);
            }

            GameBase.gi.WriteByte(Defines.svc_temp_entity);
            GameBase.gi.WriteByte(Defines.TE_RAILTRAIL);
            GameBase.gi.WritePosition(start);
            GameBase.gi.WritePosition(tr.endpos);
            GameBase.gi.Multicast(self.s.origin, Defines.MULTICAST_PHS);
            if (water)
            {
                GameBase.gi.WriteByte(Defines.svc_temp_entity);
                GameBase.gi.WriteByte(Defines.TE_RAILTRAIL);
                GameBase.gi.WritePosition(start);
                GameBase.gi.WritePosition(tr.endpos);
                GameBase.gi.Multicast(tr.endpos, Defines.MULTICAST_PHS);
            }

            if (self.client != null)
            {
                PlayerWeapon.PlayerNoise(self, tr.endpos, Defines.PNOISE_IMPACT);
            }
        }
示例#3
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);
            }
示例#4
0
            public override bool Think(edict_t self)
            {
                edict_t ent;
                float   points;

                float[]       v = new float[] { 0, 0, 0 };
                float         dist;
                EdictIterator edit = null;

                if (self.s.frame == 0)
                {
                    ent = null;
                    while ((edit = GameBase.Findradius(edit, self.s.origin, self.dmg_radius)) != null)
                    {
                        ent = edit.o;
                        if (ent.takedamage == 0)
                        {
                            continue;
                        }
                        if (ent == self.owner)
                        {
                            continue;
                        }
                        if (!GameCombat.CanDamage(ent, self))
                        {
                            continue;
                        }
                        if (!GameCombat.CanDamage(ent, self.owner))
                        {
                            continue;
                        }
                        Math3D.VectorAdd(ent.mins, ent.maxs, v);
                        Math3D.VectorMA(ent.s.origin, 0.5F, v, v);
                        Math3D.VectorSubtract(self.s.origin, v, v);
                        dist   = Math3D.VectorLength(v);
                        points = (float)(self.radius_dmg * (1 - Math.Sqrt(dist / self.dmg_radius)));
                        if (ent == self.owner)
                        {
                            points = points * 0.5F;
                        }
                        GameBase.gi.WriteByte(Defines.svc_temp_entity);
                        GameBase.gi.WriteByte(Defines.TE_BFG_EXPLOSION);
                        GameBase.gi.WritePosition(ent.s.origin);
                        GameBase.gi.Multicast(ent.s.origin, Defines.MULTICAST_PHS);
                        GameCombat.T_Damage(ent, self, self.owner, self.velocity, ent.s.origin, Globals.vec3_origin, (int)points, 0, Defines.DAMAGE_ENERGY, Defines.MOD_BFG_EFFECT);
                    }
                }

                self.nextthink = GameBase.level.time + Defines.FRAMETIME;
                self.s.frame++;
                if (self.s.frame == 5)
                {
                    self.think = GameUtil.G_FreeEdictA;
                }
                return(true);
            }
示例#5
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);
            }
示例#6
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);
     }
 }
示例#7
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);
            }
示例#8
0
            public override void Blocked(edict_t self, edict_t other)
            {
                edict_t attacker;

                if (other.takedamage != 0)
                {
                    if (self.teammaster.owner != null)
                    {
                        attacker = self.teammaster.owner;
                    }
                    else
                    {
                        attacker = self.teammaster;
                    }
                    GameCombat.T_Damage(other, self, attacker, Globals.vec3_origin, other.s.origin, Globals.vec3_origin, self.teammaster.dmg, 10, 0, Defines.MOD_CRUSH);
                }
            }
示例#9
0
        public static bool KillBox(edict_t ent)
        {
            trace_t tr;

            while (true)
            {
                tr = GameBase.gi.Trace(ent.s.origin, ent.mins, ent.maxs, ent.s.origin, null, Defines.MASK_PLAYERSOLID);
                if (tr.ent == null || tr.ent == GameBase.g_edicts[0])
                {
                    break;
                }
                GameCombat.T_Damage(tr.ent, ent, ent, Globals.vec3_origin, ent.s.origin, Globals.vec3_origin, 100000, 0, Defines.DAMAGE_NO_PROTECTION, Defines.MOD_TELEFRAG);
                if (tr.ent.solid != 0)
                {
                    return(false);
                }
            }

            return(true);
        }
示例#10
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);
            }
示例#11
0
            public override void Touch(edict_t self, edict_t other, cplane_t plane, csurface_t surf)
            {
                int dflags;

                if (other.takedamage == 0)
                {
                    return;
                }
                if (self.timestamp > GameBase.level.time)
                {
                    return;
                }
                if ((self.spawnflags & 16) != 0)
                {
                    self.timestamp = GameBase.level.time + 1;
                }
                else
                {
                    self.timestamp = GameBase.level.time + Defines.FRAMETIME;
                }
                if (0 == (self.spawnflags & 4))
                {
                    if ((GameBase.level.framenum % 10) == 0)
                    {
                        GameBase.gi.Sound(other, Defines.CHAN_AUTO, self.noise_index, 1, Defines.ATTN_NORM, 0);
                    }
                }

                if ((self.spawnflags & 8) != 0)
                {
                    dflags = Defines.DAMAGE_NO_PROTECTION;
                }
                else
                {
                    dflags = 0;
                }
                GameCombat.T_Damage(other, self, self, Globals.vec3_origin, other.s.origin, Globals.vec3_origin, self.dmg, self.dmg, dflags, Defines.MOD_TRIGGER_HURT);
            }
示例#12
0
            public override Boolean Think(edict_t self)
            {
                edict_t ignore;

                Single[] start = new Single[] { 0, 0, 0 };
                Single[] end   = new Single[] { 0, 0, 0 };
                trace_t  tr;

                Single[] point        = new Single[] { 0, 0, 0 };
                Single[] last_movedir = new Single[] { 0, 0, 0 };
                Int32    count;

                if ((self.spawnflags & 0x80000000) != 0)
                {
                    count = 8;
                }
                else
                {
                    count = 4;
                }
                if (self.enemy != null)
                {
                    Math3D.VectorCopy(self.movedir, last_movedir);
                    Math3D.VectorMA(self.enemy.absmin, 0.5F, self.enemy.size, point);
                    Math3D.VectorSubtract(point, self.s.origin, self.movedir);
                    Math3D.VectorNormalize(self.movedir);
                    if (!Math3D.VectorEquals(self.movedir, last_movedir))
                    {
                        self.spawnflags = ( Int32 )(self.spawnflags | 0x80000000);
                    }
                }

                ignore = self;
                Math3D.VectorCopy(self.s.origin, start);
                Math3D.VectorMA(start, 2048, self.movedir, end);
                while (true)
                {
                    tr = GameBase.gi.Trace(start, null, null, end, ignore, Defines.CONTENTS_SOLID | Defines.CONTENTS_MONSTER | Defines.CONTENTS_DEADMONSTER);
                    if (tr.ent == null)
                    {
                        break;
                    }
                    if ((tr.ent.takedamage != 0) && 0 == (tr.ent.flags & Defines.FL_IMMUNE_LASER))
                    {
                        GameCombat.T_Damage(tr.ent, self, self.activator, self.movedir, tr.endpos, Globals.vec3_origin, self.dmg, 1, Defines.DAMAGE_ENERGY, Defines.MOD_TARGET_LASER);
                    }
                    if (0 == (tr.ent.svflags & Defines.SVF_MONSTER) && (null == tr.ent.client))
                    {
                        if ((self.spawnflags & 0x80000000) != 0)
                        {
                            self.spawnflags = ( Int32 )(self.spawnflags & ~0x80000000);
                            GameBase.gi.WriteByte(Defines.svc_temp_entity);
                            GameBase.gi.WriteByte(Defines.TE_LASER_SPARKS);
                            GameBase.gi.WriteByte(count);
                            GameBase.gi.WritePosition(tr.endpos);
                            GameBase.gi.WriteDir(tr.plane.normal);
                            GameBase.gi.WriteByte(( Int32 )self.s.skinnum);                                // This cast might break something
                            GameBase.gi.Multicast(tr.endpos, Defines.MULTICAST_PVS);
                        }

                        break;
                    }

                    ignore = tr.ent;
                    Math3D.VectorCopy(tr.endpos, start);
                }

                Math3D.VectorCopy(tr.endpos, self.s.old_origin);
                self.nextthink = GameBase.level.time + Defines.FRAMETIME;
                return(true);
            }
示例#13
0
            public override bool Think(edict_t self)
            {
                edict_t ent;
                edict_t ignore;

                float[] point = new float[] { 0, 0, 0 };
                float[] dir   = new float[] { 0, 0, 0 };
                float[] start = new float[] { 0, 0, 0 };
                float[] end   = new float[] { 0, 0, 0 };
                int     dmg;
                trace_t tr;

                if (GameBase.deathmatch.value != 0)
                {
                    dmg = 5;
                }
                else
                {
                    dmg = 10;
                }
                EdictIterator edit = null;

                while ((edit = GameBase.Findradius(edit, self.s.origin, 256)) != null)
                {
                    ent = edit.o;
                    if (ent == self)
                    {
                        continue;
                    }
                    if (ent == self.owner)
                    {
                        continue;
                    }
                    if (ent.takedamage == 0)
                    {
                        continue;
                    }
                    if (0 == (ent.svflags & Defines.SVF_MONSTER) && (null == ent.client) && (Lib.Strcmp(ent.classname, "misc_explobox") != 0))
                    {
                        continue;
                    }
                    Math3D.VectorMA(ent.absmin, 0.5F, ent.size, point);
                    Math3D.VectorSubtract(point, self.s.origin, dir);
                    Math3D.VectorNormalize(dir);
                    ignore = self;
                    Math3D.VectorCopy(self.s.origin, start);
                    Math3D.VectorMA(start, 2048, dir, end);
                    while (true)
                    {
                        tr = GameBase.gi.Trace(start, null, null, end, ignore, Defines.CONTENTS_SOLID | Defines.CONTENTS_MONSTER | Defines.CONTENTS_DEADMONSTER);
                        if (null == tr.ent)
                        {
                            break;
                        }
                        if ((tr.ent.takedamage != 0) && 0 == (tr.ent.flags & Defines.FL_IMMUNE_LASER) && (tr.ent != self.owner))
                        {
                            GameCombat.T_Damage(tr.ent, self, self.owner, dir, tr.endpos, Globals.vec3_origin, dmg, 1, Defines.DAMAGE_ENERGY, Defines.MOD_BFG_LASER);
                        }
                        if (0 == (tr.ent.svflags & Defines.SVF_MONSTER) && (null == tr.ent.client))
                        {
                            GameBase.gi.WriteByte(Defines.svc_temp_entity);
                            GameBase.gi.WriteByte(Defines.TE_LASER_SPARKS);
                            GameBase.gi.WriteByte(4);
                            GameBase.gi.WritePosition(tr.endpos);
                            GameBase.gi.WriteDir(tr.plane.normal);
                            GameBase.gi.WriteByte(self.s.skinnum);
                            GameBase.gi.Multicast(tr.endpos, Defines.MULTICAST_PVS);
                            break;
                        }

                        ignore = tr.ent;
                        Math3D.VectorCopy(tr.endpos, start);
                    }

                    GameBase.gi.WriteByte(Defines.svc_temp_entity);
                    GameBase.gi.WriteByte(Defines.TE_BFG_LASER);
                    GameBase.gi.WritePosition(self.s.origin);
                    GameBase.gi.WritePosition(tr.endpos);
                    GameBase.gi.Multicast(self.s.origin, Defines.MULTICAST_PHS);
                }

                self.nextthink = GameBase.level.time + Defines.FRAMETIME;
                return(true);
            }
示例#14
0
        public static bool Fire_hit(edict_t self, float[] aim, int damage, int kick)
        {
            trace_t tr;

            float[] forward = new float[] { 0, 0, 0 }, right = new float[] { 0, 0, 0 }, up = new float[] { 0, 0, 0 };
            float[] v       = new float[] { 0, 0, 0 };
            float[] point   = new float[] { 0, 0, 0 };
            float   range;

            float[] dir = new float[] { 0, 0, 0 };
            Math3D.VectorSubtract(self.enemy.s.origin, self.s.origin, dir);
            range = Math3D.VectorLength(dir);
            if (range > aim[0])
            {
                return(false);
            }
            if (aim[1] > self.mins[0] && aim[1] < self.maxs[0])
            {
                range -= self.enemy.maxs[0];
            }
            else
            {
                if (aim[1] < 0)
                {
                    aim[1] = self.enemy.mins[0];
                }
                else
                {
                    aim[1] = self.enemy.maxs[0];
                }
            }

            Math3D.VectorMA(self.s.origin, range, dir, point);
            tr = GameBase.gi.Trace(self.s.origin, null, null, point, self, Defines.MASK_SHOT);
            if (tr.fraction < 1)
            {
                if (0 == tr.ent.takedamage)
                {
                    return(false);
                }
                if ((tr.ent.svflags & Defines.SVF_MONSTER) != 0 || (tr.ent.client != null))
                {
                    tr.ent = self.enemy;
                }
            }

            Math3D.AngleVectors(self.s.angles, forward, right, up);
            Math3D.VectorMA(self.s.origin, range, forward, point);
            Math3D.VectorMA(point, aim[1], right, point);
            Math3D.VectorMA(point, aim[2], up, point);
            Math3D.VectorSubtract(point, self.enemy.s.origin, dir);
            GameCombat.T_Damage(tr.ent, self, self, dir, point, Globals.vec3_origin, damage, kick / 2, Defines.DAMAGE_NO_KNOCKBACK, Defines.MOD_HIT);
            if (0 == (tr.ent.svflags & Defines.SVF_MONSTER) && (null == tr.ent.client))
            {
                return(false);
            }
            Math3D.VectorMA(self.enemy.absmin, 0.5F, self.enemy.size, v);
            Math3D.VectorSubtract(v, point, v);
            Math3D.VectorNormalize(v);
            Math3D.VectorMA(self.enemy.velocity, kick, v, self.enemy.velocity);
            if (self.enemy.velocity[2] > 0)
            {
                self.enemy.groundentity = null;
            }
            return(true);
        }
示例#15
0
        public static void P_WorldEffects()
        {
            bool breather;
            bool envirosuit;
            int  waterlevel, old_waterlevel;

            if (current_player.movetype == Defines.MOVETYPE_NOCLIP)
            {
                current_player.air_finished = GameBase.level.time + 12;
                return;
            }

            waterlevel     = current_player.waterlevel;
            old_waterlevel = current_client.old_waterlevel;
            current_client.old_waterlevel = waterlevel;
            breather   = current_client.breather_framenum > GameBase.level.framenum;
            envirosuit = current_client.enviro_framenum > GameBase.level.framenum;
            if (old_waterlevel == 0 && waterlevel != 0)
            {
                PlayerWeapon.PlayerNoise(current_player, current_player.s.origin, Defines.PNOISE_SELF);
                if ((current_player.watertype & Defines.CONTENTS_LAVA) != 0)
                {
                    GameBase.gi.Sound(current_player, Defines.CHAN_BODY, GameBase.gi.Soundindex("player/lava_in.wav"), 1, Defines.ATTN_NORM, 0);
                }
                else if ((current_player.watertype & Defines.CONTENTS_SLIME) != 0)
                {
                    GameBase.gi.Sound(current_player, Defines.CHAN_BODY, GameBase.gi.Soundindex("player/watr_in.wav"), 1, Defines.ATTN_NORM, 0);
                }
                else if ((current_player.watertype & Defines.CONTENTS_WATER) != 0)
                {
                    GameBase.gi.Sound(current_player, Defines.CHAN_BODY, GameBase.gi.Soundindex("player/watr_in.wav"), 1, Defines.ATTN_NORM, 0);
                }
                current_player.flags |= Defines.FL_INWATER;
                current_player.damage_debounce_time = GameBase.level.time - 1;
            }

            if (old_waterlevel != 0 && waterlevel == 0)
            {
                PlayerWeapon.PlayerNoise(current_player, current_player.s.origin, Defines.PNOISE_SELF);
                GameBase.gi.Sound(current_player, Defines.CHAN_BODY, GameBase.gi.Soundindex("player/watr_out.wav"), 1, Defines.ATTN_NORM, 0);
                current_player.flags &= ~Defines.FL_INWATER;
            }

            if (old_waterlevel != 3 && waterlevel == 3)
            {
                GameBase.gi.Sound(current_player, Defines.CHAN_BODY, GameBase.gi.Soundindex("player/watr_un.wav"), 1, Defines.ATTN_NORM, 0);
            }

            if (old_waterlevel == 3 && waterlevel != 3)
            {
                if (current_player.air_finished < GameBase.level.time)
                {
                    GameBase.gi.Sound(current_player, Defines.CHAN_VOICE, GameBase.gi.Soundindex("player/gasp1.wav"), 1, Defines.ATTN_NORM, 0);
                    PlayerWeapon.PlayerNoise(current_player, current_player.s.origin, Defines.PNOISE_SELF);
                }
                else if (current_player.air_finished < GameBase.level.time + 11)
                {
                    GameBase.gi.Sound(current_player, Defines.CHAN_VOICE, GameBase.gi.Soundindex("player/gasp2.wav"), 1, Defines.ATTN_NORM, 0);
                }
            }

            if (waterlevel == 3)
            {
                if (breather || envirosuit)
                {
                    current_player.air_finished = GameBase.level.time + 10;
                    if (((int)(current_client.breather_framenum - GameBase.level.framenum) % 25) == 0)
                    {
                        if (current_client.breather_sound == 0)
                        {
                            GameBase.gi.Sound(current_player, Defines.CHAN_AUTO, GameBase.gi.Soundindex("player/u_breath1.wav"), 1, Defines.ATTN_NORM, 0);
                        }
                        else
                        {
                            GameBase.gi.Sound(current_player, Defines.CHAN_AUTO, GameBase.gi.Soundindex("player/u_breath2.wav"), 1, Defines.ATTN_NORM, 0);
                        }
                        current_client.breather_sound ^= 1;
                        PlayerWeapon.PlayerNoise(current_player, current_player.s.origin, Defines.PNOISE_SELF);
                    }
                }

                if (current_player.air_finished < GameBase.level.time)
                {
                    if (current_player.client.next_drown_time < GameBase.level.time && current_player.health > 0)
                    {
                        current_player.client.next_drown_time = GameBase.level.time + 1;
                        current_player.dmg += 2;
                        if (current_player.dmg > 15)
                        {
                            current_player.dmg = 15;
                        }
                        if (current_player.health <= current_player.dmg)
                        {
                            GameBase.gi.Sound(current_player, Defines.CHAN_VOICE, GameBase.gi.Soundindex("player/drown1.wav"), 1, Defines.ATTN_NORM, 0);
                        }
                        else if ((Lib.Rand() & 1) != 0)
                        {
                            GameBase.gi.Sound(current_player, Defines.CHAN_VOICE, GameBase.gi.Soundindex("*gurp1.wav"), 1, Defines.ATTN_NORM, 0);
                        }
                        else
                        {
                            GameBase.gi.Sound(current_player, Defines.CHAN_VOICE, GameBase.gi.Soundindex("*gurp2.wav"), 1, Defines.ATTN_NORM, 0);
                        }
                        current_player.pain_debounce_time = GameBase.level.time;
                        GameCombat.T_Damage(current_player, GameBase.g_edicts[0], GameBase.g_edicts[0], Globals.vec3_origin, current_player.s.origin, Globals.vec3_origin, current_player.dmg, 0, Defines.DAMAGE_NO_ARMOR, Defines.MOD_WATER);
                    }
                }
            }
            else
            {
                current_player.air_finished = GameBase.level.time + 12;
                current_player.dmg          = 2;
            }

            if (waterlevel != 0 && 0 != (current_player.watertype & (Defines.CONTENTS_LAVA | Defines.CONTENTS_SLIME)))
            {
                if ((current_player.watertype & Defines.CONTENTS_LAVA) != 0)
                {
                    if (current_player.health > 0 && current_player.pain_debounce_time <= GameBase.level.time && current_client.invincible_framenum < GameBase.level.framenum)
                    {
                        if ((Lib.Rand() & 1) != 0)
                        {
                            GameBase.gi.Sound(current_player, Defines.CHAN_VOICE, GameBase.gi.Soundindex("player/burn1.wav"), 1, Defines.ATTN_NORM, 0);
                        }
                        else
                        {
                            GameBase.gi.Sound(current_player, Defines.CHAN_VOICE, GameBase.gi.Soundindex("player/burn2.wav"), 1, Defines.ATTN_NORM, 0);
                        }
                        current_player.pain_debounce_time = GameBase.level.time + 1;
                    }

                    if (envirosuit)
                    {
                        GameCombat.T_Damage(current_player, GameBase.g_edicts[0], GameBase.g_edicts[0], Globals.vec3_origin, current_player.s.origin, Globals.vec3_origin, 1 * waterlevel, 0, 0, Defines.MOD_LAVA);
                    }
                    else
                    {
                        GameCombat.T_Damage(current_player, GameBase.g_edicts[0], GameBase.g_edicts[0], Globals.vec3_origin, current_player.s.origin, Globals.vec3_origin, 3 * waterlevel, 0, 0, Defines.MOD_LAVA);
                    }
                }

                if ((current_player.watertype & Defines.CONTENTS_SLIME) != 0)
                {
                    if (!envirosuit)
                    {
                        GameCombat.T_Damage(current_player, GameBase.g_edicts[0], GameBase.g_edicts[0], Globals.vec3_origin, current_player.s.origin, Globals.vec3_origin, 1 * waterlevel, 0, 0, Defines.MOD_SLIME);
                    }
                }
            }
        }
示例#16
0
        public static void P_FallingDamage(edict_t ent)
        {
            float delta;
            int   damage;

            float[] dir = new float[] { 0, 0, 0 };
            if (ent.s.modelindex != 255)
            {
                return;
            }
            if (ent.movetype == Defines.MOVETYPE_NOCLIP)
            {
                return;
            }
            if ((ent.client.oldvelocity[2] < 0) && (ent.velocity[2] > ent.client.oldvelocity[2]) && (null == ent.groundentity))
            {
                delta = ent.client.oldvelocity[2];
            }
            else
            {
                if (ent.groundentity == null)
                {
                    return;
                }
                delta = ent.velocity[2] - ent.client.oldvelocity[2];
            }

            delta = delta * delta * 0.0001F;
            if (ent.waterlevel == 3)
            {
                return;
            }
            if (ent.waterlevel == 2)
            {
                delta *= 0.25f;
            }
            if (ent.waterlevel == 1)
            {
                delta *= 0.5f;
            }
            if (delta < 1)
            {
                return;
            }
            if (delta < 15)
            {
                ent.s.event_renamed = Defines.EV_FOOTSTEP;
                return;
            }

            ent.client.fall_value = delta * 0.5F;
            if (ent.client.fall_value > 40)
            {
                ent.client.fall_value = 40;
            }
            ent.client.fall_time = GameBase.level.time + Defines.FALL_TIME;
            if (delta > 30)
            {
                if (ent.health > 0)
                {
                    if (delta >= 55)
                    {
                        ent.s.event_renamed = Defines.EV_FALLFAR;
                    }
                    else
                    {
                        ent.s.event_renamed = Defines.EV_FALL;
                    }
                }

                ent.pain_debounce_time = GameBase.level.time;
                damage = (int)((delta - 30) / 2);
                if (damage < 1)
                {
                    damage = 1;
                }
                Math3D.VectorSet(dir, 0, 0, 1);
                if (GameBase.deathmatch.value == 0 || 0 == ((int)GameBase.dmflags.value & Defines.DF_NO_FALLING))
                {
                    GameCombat.T_Damage(ent, GameBase.g_edicts[0], GameBase.g_edicts[0], dir, ent.s.origin, Globals.vec3_origin, damage, 0, 0, Defines.MOD_FALLING);
                }
            }
            else
            {
                ent.s.event_renamed = Defines.EV_FALLSHORT;
                return;
            }
        }
示例#17
0
        public static void Fire_lead(edict_t self, float[] start, float[] aimdir, int damage, int kick, int te_impact, int hspread, int vspread, int mod)
        {
            trace_t tr;

            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 };
            float[] end     = new float[] { 0, 0, 0 };
            float   r;
            float   u;

            float[] water_start  = new float[] { 0, 0, 0 };
            bool    water        = false;
            int     content_mask = Defines.MASK_SHOT | Defines.MASK_WATER;

            tr = GameBase.gi.Trace(self.s.origin, null, null, start, self, Defines.MASK_SHOT);
            if (!(tr.fraction < 1))
            {
                Math3D.Vectoangles(aimdir, dir);
                Math3D.AngleVectors(dir, forward, right, up);
                r = Lib.Crandom() * hspread;
                u = Lib.Crandom() * vspread;
                Math3D.VectorMA(start, 8192, forward, end);
                Math3D.VectorMA(end, r, right, end);
                Math3D.VectorMA(end, u, up, end);
                if ((GameBase.gi.pointcontents.Pointcontents(start) & Defines.MASK_WATER) != 0)
                {
                    water = true;
                    Math3D.VectorCopy(start, water_start);
                    content_mask &= ~Defines.MASK_WATER;
                }

                tr = GameBase.gi.Trace(start, null, null, end, self, content_mask);
                if ((tr.contents & Defines.MASK_WATER) != 0)
                {
                    int color;
                    water = true;
                    Math3D.VectorCopy(tr.endpos, water_start);
                    if (!Math3D.VectorEquals(start, tr.endpos))
                    {
                        if ((tr.contents & Defines.CONTENTS_WATER) != 0)
                        {
                            if (Lib.Strcmp(tr.surface.name, "*brwater") == 0)
                            {
                                color = Defines.SPLASH_BROWN_WATER;
                            }
                            else
                            {
                                color = Defines.SPLASH_BLUE_WATER;
                            }
                        }
                        else if ((tr.contents & Defines.CONTENTS_SLIME) != 0)
                        {
                            color = Defines.SPLASH_SLIME;
                        }
                        else if ((tr.contents & Defines.CONTENTS_LAVA) != 0)
                        {
                            color = Defines.SPLASH_LAVA;
                        }
                        else
                        {
                            color = Defines.SPLASH_UNKNOWN;
                        }
                        if (color != Defines.SPLASH_UNKNOWN)
                        {
                            GameBase.gi.WriteByte(Defines.svc_temp_entity);
                            GameBase.gi.WriteByte(Defines.TE_SPLASH);
                            GameBase.gi.WriteByte(8);
                            GameBase.gi.WritePosition(tr.endpos);
                            GameBase.gi.WriteDir(tr.plane.normal);
                            GameBase.gi.WriteByte(color);
                            GameBase.gi.Multicast(tr.endpos, Defines.MULTICAST_PVS);
                        }

                        Math3D.VectorSubtract(end, start, dir);
                        Math3D.Vectoangles(dir, dir);
                        Math3D.AngleVectors(dir, forward, right, up);
                        r = Lib.Crandom() * hspread * 2;
                        u = Lib.Crandom() * vspread * 2;
                        Math3D.VectorMA(water_start, 8192, forward, end);
                        Math3D.VectorMA(end, r, right, end);
                        Math3D.VectorMA(end, u, up, end);
                    }

                    tr = GameBase.gi.Trace(water_start, null, null, end, self, Defines.MASK_SHOT);
                }
            }

            if (!((tr.surface != null) && 0 != (tr.surface.flags & Defines.SURF_SKY)))
            {
                if (tr.fraction < 1)
                {
                    if (tr.ent.takedamage != 0)
                    {
                        GameCombat.T_Damage(tr.ent, self, self, aimdir, tr.endpos, tr.plane.normal, damage, kick, Defines.DAMAGE_BULLET, mod);
                    }
                    else
                    {
                        if (!"sky".Equals(tr.surface.name))
                        {
                            GameBase.gi.WriteByte(Defines.svc_temp_entity);
                            GameBase.gi.WriteByte(te_impact);
                            GameBase.gi.WritePosition(tr.endpos);
                            GameBase.gi.WriteDir(tr.plane.normal);
                            GameBase.gi.Multicast(tr.endpos, Defines.MULTICAST_PVS);
                            if (self.client != null)
                            {
                                PlayerWeapon.PlayerNoise(self, tr.endpos, Defines.PNOISE_IMPACT);
                            }
                        }
                    }
                }
            }

            if (water)
            {
                float[] pos = new float[] { 0, 0, 0 };
                Math3D.VectorSubtract(tr.endpos, water_start, dir);
                Math3D.VectorNormalize(dir);
                Math3D.VectorMA(tr.endpos, -2, dir, pos);
                if ((GameBase.gi.pointcontents.Pointcontents(pos) & Defines.MASK_WATER) != 0)
                {
                    Math3D.VectorCopy(pos, tr.endpos);
                }
                else
                {
                    tr = GameBase.gi.Trace(pos, null, null, water_start, tr.ent, Defines.MASK_WATER);
                }
                Math3D.VectorAdd(water_start, tr.endpos, pos);
                Math3D.VectorScale(pos, 0.5F, pos);
                GameBase.gi.WriteByte(Defines.svc_temp_entity);
                GameBase.gi.WriteByte(Defines.TE_BUBBLETRAIL);
                GameBase.gi.WritePosition(water_start);
                GameBase.gi.WritePosition(tr.endpos);
                GameBase.gi.Multicast(pos, Defines.MULTICAST_PVS);
            }
        }
示例#18
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);
            }