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