public static void SP_target_blaster(edict_t self) { self.use = use_target_blaster; GameBase.G_SetMovedir(self.s.angles, self.movedir); self.noise_index = GameBase.gi.Soundindex("weapons/laser2.wav"); if (0 == self.dmg) { self.dmg = 15; } if (0 == self.speed) { self.speed = 1000; } self.svflags = Defines.SVF_NOCLIENT; }
public override bool Think(edict_t self) { if (self.target == null) { GameBase.gi.Dprintf(self.classname + " at " + Lib.Vtos(self.s.origin) + " needs a target\\n"); } else { self.target_ent = GameBase.G_PickTarget(self.target); Math3D.VectorSubtract(self.target_ent.s.origin, self.s.origin, self.move_origin); GameUtil.G_FreeEdict(self.target_ent); } self.teammaster.dmg = self.dmg; self.think = turret_breach_think; self.think.Think(self); return(true); }
public static void SP_trigger_multiple(edict_t ent) { if (ent.sounds == 1) { ent.noise_index = GameBase.gi.Soundindex("misc/secret.wav"); } else if (ent.sounds == 2) { ent.noise_index = GameBase.gi.Soundindex("misc/talk.wav"); } else if (ent.sounds == 3) { ent.noise_index = GameBase.gi.Soundindex("misc/trigger1.wav"); } if (ent.wait == 0) { ent.wait = 0.2F; } ent.touch = Touch_Multi; ent.movetype = Defines.MOVETYPE_NONE; ent.svflags |= Defines.SVF_NOCLIENT; if ((ent.spawnflags & 4) != 0) { ent.solid = Defines.SOLID_NOT; ent.use = trigger_enable; } else { ent.solid = Defines.SOLID_TRIGGER; ent.use = Use_Multi; } if (!Math3D.VectorEquals(ent.s.angles, Globals.vec3_origin)) { GameBase.G_SetMovedir(ent.s.angles, ent.movedir); } GameBase.gi.Setmodel(ent, ent.model); GameBase.gi.Linkentity(ent); }
public override bool Think(edict_t self) { float[] vec = new float[] { 0, 0, 0 }; self.think = turret_driver_think; self.nextthink = GameBase.level.time + Defines.FRAMETIME; self.target_ent = GameBase.G_PickTarget(self.target); self.target_ent.owner = self; self.target_ent.teammaster.owner = self; Math3D.VectorCopy(self.target_ent.s.angles, self.s.angles); vec[0] = self.target_ent.s.origin[0] - self.s.origin[0]; vec[1] = self.target_ent.s.origin[1] - self.s.origin[1]; vec[2] = 0; self.move_origin[0] = Math3D.VectorLength(vec); Math3D.VectorSubtract(self.s.origin, self.target_ent.s.origin, vec); Math3D.Vectoangles(vec, vec); AnglesNormalize(vec); self.move_origin[1] = vec[1]; self.move_origin[2] = self.s.origin[2] - self.target_ent.s.origin[2]; self.teammaster = self.target_ent.teammaster; self.flags |= Defines.FL_TEAMSLAVE; return(true); }
public override void Use(edict_t self, edict_t other, edict_t activator) { if (self.enemy == null) { edict_t e; e = null; EdictIterator es = null; while (true) { es = GameBase.G_Find(es, GameBase.findByTarget, self.target); if (es == null) { break; } e = es.o; if (Lib.Strcmp(e.classname, "light") != 0) { GameBase.gi.Dprintf(self.classname + " at " + Lib.Vtos(self.s.origin)); GameBase.gi.Dprintf("target " + self.target + " (" + e.classname + " at " + Lib.Vtos(e.s.origin) + ") is not a light\\n"); } else { self.enemy = e; } } if (null == self.enemy) { GameBase.gi.Dprintf(self.classname + " target " + self.target + " not found at " + Lib.Vtos(self.s.origin) + "\\n"); GameUtil.G_FreeEdict(self); return; } } self.timestamp = GameBase.level.time; target_lightramp_think.Think(self); }
public static void T_RadiusDamage(edict_t inflictor, edict_t attacker, float damage, edict_t ignore, float radius, int mod) { float points; EdictIterator edictit = null; float[] v = new float[] { 0, 0, 0 }; float[] dir = new float[] { 0, 0, 0 }; while ((edictit = GameBase.Findradius(edictit, inflictor.s.origin, radius)) != null) { edict_t ent = edictit.o; if (ent == ignore) { continue; } if (ent.takedamage == 0) { continue; } Math3D.VectorAdd(ent.mins, ent.maxs, v); Math3D.VectorMA(ent.s.origin, 0.5F, v, v); Math3D.VectorSubtract(inflictor.s.origin, v, v); points = damage - 0.5F * Math3D.VectorLength(v); if (ent == attacker) { points = points * 0.5F; } if (points > 0) { if (CanDamage(ent, inflictor)) { Math3D.VectorSubtract(ent.s.origin, inflictor.s.origin, dir); T_Damage(ent, inflictor, attacker, dir, inflictor.s.origin, Globals.vec3_origin, (int)points, (int)points, Defines.DAMAGE_RADIUS, mod); } } } }
public override Boolean Think(edict_t self) { self.movetype = Defines.MOVETYPE_NONE; self.solid = Defines.SOLID_NOT; self.s.renderfx |= Defines.RF_BEAM | Defines.RF_TRANSLUCENT; self.s.modelindex = 1; if ((self.spawnflags & 64) != 0) { self.s.frame = 16; } else { self.s.frame = 4; } if ((self.spawnflags & 2) != 0) { self.s.skinnum = unchecked (( Int32 )0xf2f2f0f0); } else if ((self.spawnflags & 4) != 0) { self.s.skinnum = unchecked (( Int32 )0xd0d1d2d3); } else if ((self.spawnflags & 8) != 0) { self.s.skinnum = unchecked (( Int32 )0xf3f3f1f1); } else if ((self.spawnflags & 16) != 0) { self.s.skinnum = unchecked (( Int32 )0xdcdddedf); } else if ((self.spawnflags & 32) != 0) { self.s.skinnum = unchecked (( Int32 )0xe0e1e2e3); } if (null == self.enemy) { if (self.target != null) { EdictIterator edit = GameBase.G_Find(null, GameBase.findByTarget, self.target); if (edit == null) { GameBase.gi.Dprintf(self.classname + " at " + Lib.Vtos(self.s.origin) + ": " + self.target + " is a bad target\\n"); } self.enemy = edit.o; } else { GameBase.G_SetMovedir(self.s.angles, self.movedir); } } self.use = target_laser_use; self.think = target_laser_think; if (0 == self.dmg) { self.dmg = 1; } Math3D.VectorSet(self.mins, -8, -8, -8); Math3D.VectorSet(self.maxs, 8, 8, 8); GameBase.gi.Linkentity(self); if ((self.spawnflags & 1) != 0) { Target_laser_on(self); } else { Target_laser_off(self); } return(true); }
public static void BeginIntermission(edict_t targ) { int i, n; edict_t ent, client; if (GameBase.level.intermissiontime != 0) { return; } GameBase.game.autosaved = false; for (i = 0; i < GameBase.maxclients.value; i++) { client = GameBase.g_edicts[1 + i]; if (!client.inuse) { continue; } if (client.health <= 0) { PlayerClient.Respawn(client); } } GameBase.level.intermissiontime = GameBase.level.time; GameBase.level.changemap = targ.map; if (GameBase.level.changemap.IndexOf('*') > -1) { if (GameBase.coop.value != 0) { for (i = 0; i < GameBase.maxclients.value; i++) { client = GameBase.g_edicts[1 + i]; if (!client.inuse) { continue; } for (n = 1; n < GameItemList.itemlist.Length; n++) { if (GameItemList.itemlist[n] != null) { if ((GameItemList.itemlist[n].flags & Defines.IT_KEY) != 0) { client.client.pers.inventory[n] = 0; } } } } } } else { if (0 == GameBase.deathmatch.value) { GameBase.level.exitintermission = true; return; } } GameBase.level.exitintermission = false; ent = GameBase.G_FindEdict(null, GameBase.findByClass, "info_player_intermission"); if (ent == null) { ent = GameBase.G_FindEdict(null, GameBase.findByClass, "info_player_start"); if (ent == null) { ent = GameBase.G_FindEdict(null, GameBase.findByClass, "info_player_deathmatch"); } } else { i = Lib.Rand() & 3; EdictIterator es = null; while (i-- > 0) { es = GameBase.G_Find(es, GameBase.findByClass, "info_player_intermission"); if (es == null) { continue; } ent = es.o; } } Math3D.VectorCopy(ent.s.origin, GameBase.level.intermission_origin); Math3D.VectorCopy(ent.s.angles, GameBase.level.intermission_angle); for (i = 0; i < GameBase.maxclients.value; i++) { client = GameBase.g_edicts[1 + i]; if (!client.inuse) { continue; } MoveClientToIntermission(client); } }
public static void Monster_start_go(edict_t self) { float[] v = new float[] { 0, 0, 0 }; if (self.health <= 0) { return; } if (self.target != null) { bool notcombat; bool fixup; edict_t target = null; notcombat = false; fixup = false; EdictIterator edit = null; while ((edit = GameBase.G_Find(edit, GameBase.findByTarget, self.target)) != null) { target = edit.o; if (Lib.Strcmp(target.classname, "point_combat") == 0) { self.combattarget = self.target; fixup = true; } else { notcombat = true; } } if (notcombat && self.combattarget != null) { GameBase.gi.Dprintf(self.classname + " at " + Lib.Vtos(self.s.origin) + " has target with mixed types\\n"); } if (fixup) { self.target = null; } } if (self.combattarget != null) { edict_t target = null; EdictIterator edit = null; while ((edit = GameBase.G_Find(edit, GameBase.findByTarget, self.combattarget)) != null) { target = edit.o; if (Lib.Strcmp(target.classname, "point_combat") != 0) { GameBase.gi.Dprintf(self.classname + " at " + Lib.Vtos(self.s.origin) + " has bad combattarget " + self.combattarget + " : " + target.classname + " at " + Lib.Vtos(target.s.origin)); } } } if (self.target != null) { self.goalentity = self.movetarget = GameBase.G_PickTarget(self.target); if (null == self.movetarget) { GameBase.gi.Dprintf(self.classname + " can't find target " + self.target + " at " + Lib.Vtos(self.s.origin) + "\\n"); self.target = null; self.monsterinfo.pausetime = 100000000; self.monsterinfo.stand.Think(self); } else if (Lib.Strcmp(self.movetarget.classname, "path_corner") == 0) { Math3D.VectorSubtract(self.goalentity.s.origin, self.s.origin, v); self.ideal_yaw = self.s.angles[Defines.YAW] = Math3D.Vectoyaw(v); self.monsterinfo.walk.Think(self); self.target = null; } else { self.goalentity = self.movetarget = null; self.monsterinfo.pausetime = 100000000; self.monsterinfo.stand.Think(self); } } else { self.monsterinfo.pausetime = 100000000; self.monsterinfo.stand.Think(self); } self.think = Monster.monster_think; self.nextthink = GameBase.level.time + Defines.FRAMETIME; }
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); }
public static void G_UseTargets(edict_t ent, edict_t activator) { edict_t t; CheckClassname(ent); if (ent.delay != 0) { t = G_Spawn(); t.classname = "DelayedUse"; t.nextthink = GameBase.level.time + ent.delay; t.think = Think_Delay; t.activator = activator; if (activator == null) { GameBase.gi.Dprintf("Think_Delay with no activator\\n"); } t.message = ent.message; t.target = ent.target; t.killtarget = ent.killtarget; return; } if ((ent.message != null) && (activator.svflags & Defines.SVF_MONSTER) == 0) { GameBase.gi.Centerprintf(activator, "" + ent.message); if (ent.noise_index != 0) { GameBase.gi.Sound(activator, Defines.CHAN_AUTO, ent.noise_index, 1, Defines.ATTN_NORM, 0); } else { GameBase.gi.Sound(activator, Defines.CHAN_AUTO, GameBase.gi.Soundindex("misc/talk1.wav"), 1, Defines.ATTN_NORM, 0); } } EdictIterator edit = null; if (ent.killtarget != null) { while ((edit = GameBase.G_Find(edit, GameBase.findByTarget, ent.killtarget)) != null) { t = edit.o; G_FreeEdict(t); if (!ent.inuse) { GameBase.gi.Dprintf("entity was removed while using killtargets\\n"); return; } } } if (ent.target != null) { edit = null; while ((edit = GameBase.G_Find(edit, GameBase.findByTarget, ent.target)) != null) { t = edit.o; if (Lib.Q_stricmp("func_areaportal", t.classname) == 0 && (Lib.Q_stricmp("func_door", ent.classname) == 0 || Lib.Q_stricmp("func_door_rotating", ent.classname) == 0)) { continue; } if (t == ent) { GameBase.gi.Dprintf("WARNING: Entity used itself.\\n"); } else { if (t.use != null) { t.use.Use(t, ent, activator); } } if (!ent.inuse) { GameBase.gi.Dprintf("entity was removed while using targets\\n"); return; } } } }