Beispiel #1
0
            public override bool Think(edict_t self)
            {
                float[] offset = new float[] { 0, 0, 0 }, start = new float[] { 0, 0, 0 }, f = new float[] { 0, 0, 0 }, r = new float[] { 0, 0, 0 }, end = new float[] { 0, 0, 0 }, dir = new float[] { 0, 0, 0 };
                trace_t tr;
                int     damage;

                Math3D.AngleVectors(self.s.angles, f, r, null);
                Math3D.VectorSet(offset, 24, 0, 6);
                Math3D.G_ProjectSource(self.s.origin, offset, f, r, start);
                Math3D.VectorCopy(self.enemy.s.origin, end);
                if (!Parasite_drain_attack_ok(start, end))
                {
                    end[2] = self.enemy.s.origin[2] + self.enemy.maxs[2] - 8;
                    if (!Parasite_drain_attack_ok(start, end))
                    {
                        end[2] = self.enemy.s.origin[2] + self.enemy.mins[2] + 8;
                        if (!Parasite_drain_attack_ok(start, end))
                        {
                            return(true);
                        }
                    }
                }

                Math3D.VectorCopy(self.enemy.s.origin, end);
                tr = GameBase.gi.Trace(start, null, null, end, self, Defines.MASK_SHOT);
                if (tr.ent != self.enemy)
                {
                    return(true);
                }
                if (self.s.frame == FRAME_drain03)
                {
                    damage = 5;
                    GameBase.gi.Sound(self.enemy, Defines.CHAN_AUTO, sound_impact, 1, Defines.ATTN_NORM, 0);
                }
                else
                {
                    if (self.s.frame == FRAME_drain04)
                    {
                        GameBase.gi.Sound(self, Defines.CHAN_WEAPON, sound_suck, 1, Defines.ATTN_NORM, 0);
                    }
                    damage = 2;
                }

                GameBase.gi.WriteByte(Defines.svc_temp_entity);
                GameBase.gi.WriteByte(Defines.TE_PARASITE_ATTACK);
                GameBase.gi.WriteShort(self.index);
                GameBase.gi.WritePosition(start);
                GameBase.gi.WritePosition(end);
                GameBase.gi.Multicast(self.s.origin, Defines.MULTICAST_PVS);
                Math3D.VectorSubtract(start, end, dir);
                GameCombat.T_Damage(self.enemy, self, self, dir, self.enemy.s.origin, Globals.vec3_origin, damage, 0, Defines.DAMAGE_NO_KNOCKBACK, Defines.MOD_UNKNOWN);
                return(true);
            }
Beispiel #2
0
 public override bool Think(edict_t self)
 {
     float[] forward = new float[] { 0, 0, 0 }, right = new float[] { 0, 0, 0 };
     float[] origin  = new float[] { 0, 0, 0 };
     float[] dir     = new float[] { 0, 0, 0 };
     float[] offset  = new float[] { 0, 0, 0 };
     Math3D.VectorSubtract(self.enemy.s.origin, self.s.origin, dir);
     Math3D.AngleVectors(self.s.angles, forward, right, null);
     Math3D.VectorSet(offset, 18.5F, -0.9F, 10F);
     Math3D.G_ProjectSource(self.s.origin, offset, forward, right, origin);
     GameBase.gi.Sound(self, Defines.CHAN_WEAPON, sound_attack2, 1, Defines.ATTN_NORM, 0);
     GameBase.gi.WriteByte(Defines.svc_temp_entity);
     GameBase.gi.WriteByte(Defines.TE_SPLASH);
     GameBase.gi.WriteByte(32);
     GameBase.gi.WritePosition(origin);
     GameBase.gi.WriteDir(dir);
     GameBase.gi.WriteByte(1);
     GameBase.gi.Multicast(origin, Defines.MULTICAST_PVS);
     GameCombat.T_Damage(self.enemy, self, self, dir, self.enemy.s.origin, Globals.vec3_origin, 5 + Lib.Rand() % 6, -10, Defines.DAMAGE_ENERGY, Defines.MOD_UNKNOWN);
     return(true);
 }
Beispiel #3
0
            public override void Touch(edict_t self, edict_t other, cplane_t plane, csurface_t surf)
            {
                if (self.health <= 0)
                {
                    self.touch = null;
                    return;
                }

                if (other.takedamage != 0)
                {
                    if (Math3D.VectorLength(self.velocity) > 400)
                    {
                        float[] point  = new float[] { 0, 0, 0 };
                        float[] normal = new float[] { 0, 0, 0 };
                        int     damage;
                        Math3D.VectorCopy(self.velocity, normal);
                        Math3D.VectorNormalize(normal);
                        Math3D.VectorMA(self.s.origin, self.maxs[0], normal, point);
                        damage = (int)(40 + 10 * Lib.Random());
                        GameCombat.T_Damage(other, self, self, self.velocity, point, normal, damage, damage, 0, Defines.MOD_UNKNOWN);
                    }
                }

                if (!M.M_CheckBottom(self))
                {
                    if (self.groundentity != null)
                    {
                        self.monsterinfo.nextframe = FRAME_attack02;
                        self.touch = null;
                    }

                    return;
                }

                self.touch = null;
            }
Beispiel #4
0
        public static void M_WorldEffects(edict_t ent)
        {
            int dmg;

            if (ent.health > 0)
            {
                if (0 == (ent.flags & Defines.FL_SWIM))
                {
                    if (ent.waterlevel < 3)
                    {
                        ent.air_finished = GameBase.level.time + 12;
                    }
                    else if (ent.air_finished < GameBase.level.time)
                    {
                        // drown!
                        if (ent.pain_debounce_time < GameBase.level.time)
                        {
                            dmg = (int)(2f + 2f * Math.Floor(GameBase.level.time - ent.air_finished));

                            if (dmg > 15)
                            {
                                dmg = 15;
                            }

                            GameCombat.T_Damage(
                                ent,
                                GameBase.g_edicts[0],
                                GameBase.g_edicts[0],
                                Globals.vec3_origin,
                                ent.s.origin,
                                Globals.vec3_origin,
                                dmg,
                                0,
                                Defines.DAMAGE_NO_ARMOR,
                                Defines.MOD_WATER
                                );

                            ent.pain_debounce_time = GameBase.level.time + 1;
                        }
                    }
                }
                else
                {
                    if (ent.waterlevel > 0)
                    {
                        ent.air_finished = GameBase.level.time + 9;
                    }
                    else if (ent.air_finished < GameBase.level.time)
                    {
                        // suffocate!
                        if (ent.pain_debounce_time < GameBase.level.time)
                        {
                            dmg = (int)(2 + 2 * Math.Floor(GameBase.level.time - ent.air_finished));

                            if (dmg > 15)
                            {
                                dmg = 15;
                            }

                            GameCombat.T_Damage(
                                ent,
                                GameBase.g_edicts[0],
                                GameBase.g_edicts[0],
                                Globals.vec3_origin,
                                ent.s.origin,
                                Globals.vec3_origin,
                                dmg,
                                0,
                                Defines.DAMAGE_NO_ARMOR,
                                Defines.MOD_WATER
                                );

                            ent.pain_debounce_time = GameBase.level.time + 1;
                        }
                    }
                }
            }

            if (ent.waterlevel == 0)
            {
                if ((ent.flags & Defines.FL_INWATER) != 0)
                {
                    GameBase.gi.sound(ent, Defines.CHAN_BODY, GameBase.gi.soundindex("player/watr_out.wav"), 1, Defines.ATTN_NORM, 0);
                    ent.flags &= ~Defines.FL_INWATER;
                }

                return;
            }

            if ((ent.watertype & Defines.CONTENTS_LAVA) != 0 && 0 == (ent.flags & Defines.FL_IMMUNE_LAVA))
            {
                if (ent.damage_debounce_time < GameBase.level.time)
                {
                    ent.damage_debounce_time = GameBase.level.time + 0.2f;

                    GameCombat.T_Damage(
                        ent,
                        GameBase.g_edicts[0],
                        GameBase.g_edicts[0],
                        Globals.vec3_origin,
                        ent.s.origin,
                        Globals.vec3_origin,
                        10 * ent.waterlevel,
                        0,
                        0,
                        Defines.MOD_LAVA
                        );
                }
            }

            if ((ent.watertype & Defines.CONTENTS_SLIME) != 0 && 0 == (ent.flags & Defines.FL_IMMUNE_SLIME))
            {
                if (ent.damage_debounce_time < GameBase.level.time)
                {
                    ent.damage_debounce_time = GameBase.level.time + 1;

                    GameCombat.T_Damage(
                        ent,
                        GameBase.g_edicts[0],
                        GameBase.g_edicts[0],
                        Globals.vec3_origin,
                        ent.s.origin,
                        Globals.vec3_origin,
                        4 * ent.waterlevel,
                        0,
                        0,
                        Defines.MOD_SLIME
                        );
                }
            }

            if (0 == (ent.flags & Defines.FL_INWATER))
            {
                if (0 == (ent.svflags & Defines.SVF_DEADMONSTER))
                {
                    if ((ent.watertype & Defines.CONTENTS_LAVA) != 0)
                    {
                        if (Globals.rnd.NextDouble() <= 0.5)
                        {
                            GameBase.gi.sound(ent, Defines.CHAN_BODY, GameBase.gi.soundindex("player/lava1.wav"), 1, Defines.ATTN_NORM, 0);
                        }
                        else
                        {
                            GameBase.gi.sound(ent, Defines.CHAN_BODY, GameBase.gi.soundindex("player/lava2.wav"), 1, Defines.ATTN_NORM, 0);
                        }
                    }
                    else if ((ent.watertype & Defines.CONTENTS_SLIME) != 0)
                    {
                        GameBase.gi.sound(ent, Defines.CHAN_BODY, GameBase.gi.soundindex("player/watr_in.wav"), 1, Defines.ATTN_NORM, 0);
                    }
                    else if ((ent.watertype & Defines.CONTENTS_WATER) != 0)
                    {
                        GameBase.gi.sound(ent, Defines.CHAN_BODY, GameBase.gi.soundindex("player/watr_in.wav"), 1, Defines.ATTN_NORM, 0);
                    }
                }

                ent.flags |= Defines.FL_INWATER;
                ent.damage_debounce_time = 0;
            }
        }