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); }
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); }
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; }
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; } }