public static void Fire_bfg(edict_t self, float[] start, float[] dir, int damage, int speed, float damage_radius) { edict_t bfg; bfg = GameUtil.G_Spawn(); Math3D.VectorCopy(start, bfg.s.origin); Math3D.VectorCopy(dir, bfg.movedir); Math3D.Vectoangles(dir, bfg.s.angles); Math3D.VectorScale(dir, speed, bfg.velocity); bfg.movetype = Defines.MOVETYPE_FLYMISSILE; bfg.clipmask = Defines.MASK_SHOT; bfg.solid = Defines.SOLID_BBOX; bfg.s.effects |= Defines.EF_BFG | Defines.EF_ANIM_ALLFAST; Math3D.VectorClear(bfg.mins); Math3D.VectorClear(bfg.maxs); bfg.s.modelindex = GameBase.gi.Modelindex("sprites/s_bfg1.sp2"); bfg.owner = self; bfg.touch = bfg_touch; bfg.nextthink = GameBase.level.time + 8000 / speed; bfg.think = GameUtil.G_FreeEdictA; bfg.radius_dmg = damage; bfg.dmg_radius = damage_radius; bfg.classname = "bfg blast"; bfg.s.sound = GameBase.gi.Soundindex("weapons/bfg__l1a.wav"); bfg.think = bfg_think; bfg.nextthink = GameBase.level.time + Defines.FRAMETIME; bfg.teammaster = bfg; bfg.teamchain = null; if (self.client != null) { Check_dodge(self, bfg.s.origin, dir, speed); } GameBase.gi.Linkentity(bfg); }
public static void Fire_rocket(edict_t self, float[] start, float[] dir, int damage, int speed, float damage_radius, int radius_damage) { edict_t rocket; rocket = GameUtil.G_Spawn(); Math3D.VectorCopy(start, rocket.s.origin); Math3D.VectorCopy(dir, rocket.movedir); Math3D.Vectoangles(dir, rocket.s.angles); Math3D.VectorScale(dir, speed, rocket.velocity); rocket.movetype = Defines.MOVETYPE_FLYMISSILE; rocket.clipmask = Defines.MASK_SHOT; rocket.solid = Defines.SOLID_BBOX; rocket.s.effects |= Defines.EF_ROCKET; Math3D.VectorClear(rocket.mins); Math3D.VectorClear(rocket.maxs); rocket.s.modelindex = GameBase.gi.Modelindex("models/objects/rocket/tris.md2"); rocket.owner = self; rocket.touch = rocket_touch; rocket.nextthink = GameBase.level.time + 8000 / speed; rocket.think = GameUtil.G_FreeEdictA; rocket.dmg = damage; rocket.radius_dmg = radius_damage; rocket.dmg_radius = damage_radius; rocket.s.sound = GameBase.gi.Soundindex("weapons/rockfly.wav"); rocket.classname = "rocket"; if (self.client != null) { Check_dodge(self, rocket.s.origin, dir, speed); } GameBase.gi.Linkentity(rocket); }
public static void Fire_grenade(edict_t self, float[] start, float[] aimdir, int damage, int speed, float timer, float damage_radius) { edict_t grenade; 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 }; Math3D.Vectoangles(aimdir, dir); Math3D.AngleVectors(dir, forward, right, up); grenade = GameUtil.G_Spawn(); Math3D.VectorCopy(start, grenade.s.origin); Math3D.VectorScale(aimdir, speed, grenade.velocity); Math3D.VectorMA(grenade.velocity, 200F + Lib.Crandom() * 10F, up, grenade.velocity); Math3D.VectorMA(grenade.velocity, Lib.Crandom() * 10F, right, grenade.velocity); Math3D.VectorSet(grenade.avelocity, 300, 300, 300); grenade.movetype = Defines.MOVETYPE_BOUNCE; grenade.clipmask = Defines.MASK_SHOT; grenade.solid = Defines.SOLID_BBOX; grenade.s.effects |= Defines.EF_GRENADE; Math3D.VectorClear(grenade.mins); Math3D.VectorClear(grenade.maxs); grenade.s.modelindex = GameBase.gi.Modelindex("models/objects/grenade/tris.md2"); grenade.owner = self; grenade.touch = Grenade_Touch; grenade.nextthink = GameBase.level.time + timer; grenade.think = Grenade_Explode; grenade.dmg = damage; grenade.dmg_radius = damage_radius; grenade.classname = "grenade"; GameBase.gi.Linkentity(grenade); }
public static edict_t CreateTargetChangeLevel(string map) { edict_t ent; ent = GameUtil.G_Spawn(); ent.classname = "target_changelevel"; level.nextmap = map; ent.map = level.nextmap; return(ent); }
public static void Init() { if (GameBase.deathmatch.value != 0) { return; } for (int n = 0; n < PlayerTrail.TRAIL_LENGTH; n++) { PlayerTrail.trail[n] = GameUtil.G_Spawn(); PlayerTrail.trail[n].classname = "player_trail"; } trail_head = 0; trail_active = true; }
public static void Fire_grenade2(edict_t self, float[] start, float[] aimdir, int damage, int speed, float timer, float damage_radius, bool held) { edict_t grenade; 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 }; Math3D.Vectoangles(aimdir, dir); Math3D.AngleVectors(dir, forward, right, up); grenade = GameUtil.G_Spawn(); Math3D.VectorCopy(start, grenade.s.origin); Math3D.VectorScale(aimdir, speed, grenade.velocity); Math3D.VectorMA(grenade.velocity, 200F + Lib.Crandom() * 10F, up, grenade.velocity); Math3D.VectorMA(grenade.velocity, Lib.Crandom() * 10F, right, grenade.velocity); Math3D.VectorSet(grenade.avelocity, 300F, 300F, 300F); grenade.movetype = Defines.MOVETYPE_BOUNCE; grenade.clipmask = Defines.MASK_SHOT; grenade.solid = Defines.SOLID_BBOX; grenade.s.effects |= Defines.EF_GRENADE; Math3D.VectorClear(grenade.mins); Math3D.VectorClear(grenade.maxs); grenade.s.modelindex = GameBase.gi.Modelindex("models/objects/grenade2/tris.md2"); grenade.owner = self; grenade.touch = Grenade_Touch; grenade.nextthink = GameBase.level.time + timer; grenade.think = Grenade_Explode; grenade.dmg = damage; grenade.dmg_radius = damage_radius; grenade.classname = "hgrenade"; if (held) { grenade.spawnflags = 3; } else { grenade.spawnflags = 1; } grenade.s.sound = GameBase.gi.Soundindex("weapons/hgrenc1b.wav"); if (timer <= 0) { Grenade_Explode.Think(grenade); } else { GameBase.gi.Sound(self, Defines.CHAN_WEAPON, GameBase.gi.Soundindex("weapons/hgrent1a.wav"), 1, Defines.ATTN_NORM, 0); GameBase.gi.Linkentity(grenade); } }
public override void Use(edict_t self, edict_t other, edict_t activator) { edict_t ent; ent = GameUtil.G_Spawn(); ent.classname = self.target; Math3D.VectorCopy(self.s.origin, ent.s.origin); Math3D.VectorCopy(self.s.angles, ent.s.angles); GameSpawn.ED_CallSpawn(ent); GameBase.gi.Unlinkentity(ent); GameUtil.KillBox(ent); GameBase.gi.Linkentity(ent); if (self.speed != 0) { Math3D.VectorCopy(self.movedir, ent.velocity); } }
public static void Fire_blaster(edict_t self, float[] start, float[] dir, int damage, int speed, int effect, bool hyper) { edict_t bolt; trace_t tr; Math3D.VectorNormalize(dir); bolt = GameUtil.G_Spawn(); bolt.svflags = Defines.SVF_DEADMONSTER; Math3D.VectorCopy(start, bolt.s.origin); Math3D.VectorCopy(start, bolt.s.old_origin); Math3D.Vectoangles(dir, bolt.s.angles); Math3D.VectorScale(dir, speed, bolt.velocity); bolt.movetype = Defines.MOVETYPE_FLYMISSILE; bolt.clipmask = Defines.MASK_SHOT; bolt.solid = Defines.SOLID_BBOX; bolt.s.effects |= effect; Math3D.VectorClear(bolt.mins); Math3D.VectorClear(bolt.maxs); bolt.s.modelindex = GameBase.gi.Modelindex("models/objects/laser/tris.md2"); bolt.s.sound = GameBase.gi.Soundindex("misc/lasfly.wav"); bolt.owner = self; bolt.touch = blaster_touch; bolt.nextthink = GameBase.level.time + 2; bolt.think = GameUtil.G_FreeEdictA; bolt.dmg = damage; bolt.classname = "bolt"; if (hyper) { bolt.spawnflags = 1; } GameBase.gi.Linkentity(bolt); if (self.client != null) { Check_dodge(self, bolt.s.origin, dir, speed); } tr = GameBase.gi.Trace(self.s.origin, null, null, bolt.s.origin, bolt, Defines.MASK_SHOT); if (tr.fraction < 1) { Math3D.VectorMA(bolt.s.origin, -10, dir, bolt.s.origin); bolt.touch.Touch(bolt, tr.ent, GameBase.dummyplane, null); } }
public static void Give_f(edict_t ent) { String name; gitem_t it; Int32 index; Int32 i; Boolean give_all; edict_t it_ent; if (GameBase.deathmatch.value != 0 && GameBase.sv_cheats.value == 0) { SV_GAME.PF_cprintfhigh(ent, "You must run the server with '+set cheats 1' to enable this command.\\n"); return; } name = Cmd.Args(); if (0 == Lib.Q_stricmp(name, "all")) { give_all = true; } else { give_all = false; } if (give_all || 0 == Lib.Q_stricmp(Cmd.Argv(1), "health")) { if (Cmd.Argc() == 3) { ent.health = Lib.Atoi(Cmd.Argv(2)); } else { ent.health = ent.max_health; } if (!give_all) { return; } } if (give_all || 0 == Lib.Q_stricmp(name, "weapons")) { for (i = 1; i < GameBase.game.num_items; i++) { it = GameItemList.itemlist[i]; if (null == it.pickup) { continue; } if (0 == (it.flags & Defines.IT_WEAPON)) { continue; } ent.client.pers.inventory[i] += 1; } if (!give_all) { return; } } if (give_all || 0 == Lib.Q_stricmp(name, "ammo")) { for (i = 1; i < GameBase.game.num_items; i++) { it = GameItemList.itemlist[i]; if (null == it.pickup) { continue; } if (0 == (it.flags & Defines.IT_AMMO)) { continue; } GameItems.Add_Ammo(ent, it, 1000); } if (!give_all) { return; } } if (give_all || Lib.Q_stricmp(name, "armor") == 0) { gitem_armor_t info; it = GameItems.FindItem("Jacket Armor"); ent.client.pers.inventory[GameItems.ITEM_INDEX(it)] = 0; it = GameItems.FindItem("Combat Armor"); ent.client.pers.inventory[GameItems.ITEM_INDEX(it)] = 0; it = GameItems.FindItem("Body Armor"); info = ( gitem_armor_t )it.info; ent.client.pers.inventory[GameItems.ITEM_INDEX(it)] = info.max_count; if (!give_all) { return; } } if (give_all || Lib.Q_stricmp(name, "Power Shield") == 0) { it = GameItems.FindItem("Power Shield"); it_ent = GameUtil.G_Spawn(); it_ent.classname = it.classname; GameItems.SpawnItem(it_ent, it); GameItems.Touch_Item(it_ent, ent, GameBase.dummyplane, null); if (it_ent.inuse) { GameUtil.G_FreeEdict(it_ent); } if (!give_all) { return; } } if (give_all) { for (i = 1; i < GameBase.game.num_items; i++) { it = GameItemList.itemlist[i]; if (it.pickup != null) { continue; } if ((it.flags & (Defines.IT_ARMOR | Defines.IT_WEAPON | Defines.IT_AMMO)) != 0) { continue; } ent.client.pers.inventory[i] = 1; } return; } it = GameItems.FindItem(name); if (it == null) { name = Cmd.Argv(1); it = GameItems.FindItem(name); if (it == null) { SV_GAME.PF_cprintf(ent, Defines.PRINT_HIGH, "unknown item\\n"); return; } } if (it.pickup == null) { SV_GAME.PF_cprintf(ent, Defines.PRINT_HIGH, "non-pickup item\\n"); return; } index = GameItems.ITEM_INDEX(it); if ((it.flags & Defines.IT_AMMO) != 0) { if (Cmd.Argc() == 3) { ent.client.pers.inventory[index] = Lib.Atoi(Cmd.Argv(2)); } else { ent.client.pers.inventory[index] += it.quantity; } } else { it_ent = GameUtil.G_Spawn(); it_ent.classname = it.classname; GameItems.SpawnItem(it_ent, it); GameItems.Touch_Item(it_ent, ent, GameBase.dummyplane, null); if (it_ent.inuse) { GameUtil.G_FreeEdict(it_ent); } } }
public override void Ai(edict_t self, float dist) { float[] v = new float[] { 0, 0, 0 }; edict_t tempgoal; edict_t save; bool new1; edict_t marker; float d1, d2; trace_t tr; float[] v_forward = new float[] { 0, 0, 0 }, v_right = new float[] { 0, 0, 0 }; float left, center, right; float[] left_target = new float[] { 0, 0, 0 }, right_target = new float[] { 0, 0, 0 }; if ((self.monsterinfo.aiflags & Defines.AI_COMBAT_POINT) != 0) { M.M_MoveToGoal(self, dist); return; } if ((self.monsterinfo.aiflags & Defines.AI_SOUND_TARGET) != 0) { Math3D.VectorSubtract(self.s.origin, self.enemy.s.origin, v); if (Math3D.VectorLength(v) < 64) { self.monsterinfo.stand.Think(self); self.spawnflags &= ~1; self.enemy = null; } else { M.M_MoveToGoal(self, dist); } if (!GameUtil.FindTarget(self)) { return; } } if (Ai_checkattack(self, dist)) { return; } if (self.monsterinfo.attack_state == Defines.AS_SLIDING) { Ai_run_slide(self, dist); return; } if (enemy_vis) { M.M_MoveToGoal(self, dist); self.monsterinfo.aiflags &= ~Defines.AI_LOST_SIGHT; Math3D.VectorCopy(self.enemy.s.origin, self.monsterinfo.last_sighting); self.monsterinfo.trail_time = GameBase.level.time; return; } if (GameBase.coop.value != 0) { if (GameUtil.FindTarget(self)) { return; } } if ((self.monsterinfo.search_time != 0) && (GameBase.level.time > (self.monsterinfo.search_time + 20))) { M.M_MoveToGoal(self, dist); self.monsterinfo.search_time = 0; return; } save = self.goalentity; tempgoal = GameUtil.G_Spawn(); self.goalentity = tempgoal; new1 = false; if (0 == (self.monsterinfo.aiflags & Defines.AI_LOST_SIGHT)) { self.monsterinfo.aiflags |= (Defines.AI_LOST_SIGHT | Defines.AI_PURSUIT_LAST_SEEN); self.monsterinfo.aiflags &= ~(Defines.AI_PURSUE_NEXT | Defines.AI_PURSUE_TEMP); new1 = true; } if ((self.monsterinfo.aiflags & Defines.AI_PURSUE_NEXT) != 0) { self.monsterinfo.aiflags &= ~Defines.AI_PURSUE_NEXT; self.monsterinfo.search_time = GameBase.level.time + 5; if ((self.monsterinfo.aiflags & Defines.AI_PURSUE_TEMP) != 0) { self.monsterinfo.aiflags &= ~Defines.AI_PURSUE_TEMP; marker = null; Math3D.VectorCopy(self.monsterinfo.saved_goal, self.monsterinfo.last_sighting); new1 = true; } else if ((self.monsterinfo.aiflags & Defines.AI_PURSUIT_LAST_SEEN) != 0) { self.monsterinfo.aiflags &= ~Defines.AI_PURSUIT_LAST_SEEN; marker = PlayerTrail.PickFirst(self); } else { marker = PlayerTrail.PickNext(self); } if (marker != null) { Math3D.VectorCopy(marker.s.origin, self.monsterinfo.last_sighting); self.monsterinfo.trail_time = marker.timestamp; self.s.angles[Defines.YAW] = self.ideal_yaw = marker.s.angles[Defines.YAW]; new1 = true; } } Math3D.VectorSubtract(self.s.origin, self.monsterinfo.last_sighting, v); d1 = Math3D.VectorLength(v); if (d1 <= dist) { self.monsterinfo.aiflags |= Defines.AI_PURSUE_NEXT; dist = d1; } Math3D.VectorCopy(self.monsterinfo.last_sighting, self.goalentity.s.origin); if (new1) { tr = GameBase.gi.Trace(self.s.origin, self.mins, self.maxs, self.monsterinfo.last_sighting, self, Defines.MASK_PLAYERSOLID); if (tr.fraction < 1) { Math3D.VectorSubtract(self.goalentity.s.origin, self.s.origin, v); d1 = Math3D.VectorLength(v); center = tr.fraction; d2 = d1 * ((center + 1) / 2); self.s.angles[Defines.YAW] = self.ideal_yaw = Math3D.Vectoyaw(v); Math3D.AngleVectors(self.s.angles, v_forward, v_right, null); Math3D.VectorSet(v, d2, -16, 0); Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, left_target); tr = GameBase.gi.Trace(self.s.origin, self.mins, self.maxs, left_target, self, Defines.MASK_PLAYERSOLID); left = tr.fraction; Math3D.VectorSet(v, d2, 16, 0); Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, right_target); tr = GameBase.gi.Trace(self.s.origin, self.mins, self.maxs, right_target, self, Defines.MASK_PLAYERSOLID); right = tr.fraction; center = (d1 * center) / d2; if (left >= center && left > right) { if (left < 1) { Math3D.VectorSet(v, d2 * left * 0.5F, -16F, 0F); Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, left_target); } Math3D.VectorCopy(self.monsterinfo.last_sighting, self.monsterinfo.saved_goal); self.monsterinfo.aiflags |= Defines.AI_PURSUE_TEMP; Math3D.VectorCopy(left_target, self.goalentity.s.origin); Math3D.VectorCopy(left_target, self.monsterinfo.last_sighting); Math3D.VectorSubtract(self.goalentity.s.origin, self.s.origin, v); self.s.angles[Defines.YAW] = self.ideal_yaw = Math3D.Vectoyaw(v); } else if (right >= center && right > left) { if (right < 1) { Math3D.VectorSet(v, d2 * right * 0.5F, 16F, 0F); Math3D.G_ProjectSource(self.s.origin, v, v_forward, v_right, right_target); } Math3D.VectorCopy(self.monsterinfo.last_sighting, self.monsterinfo.saved_goal); self.monsterinfo.aiflags |= Defines.AI_PURSUE_TEMP; Math3D.VectorCopy(right_target, self.goalentity.s.origin); Math3D.VectorCopy(right_target, self.monsterinfo.last_sighting); Math3D.VectorSubtract(self.goalentity.s.origin, self.s.origin, v); self.s.angles[Defines.YAW] = self.ideal_yaw = Math3D.Vectoyaw(v); } } } M.M_MoveToGoal(self, dist); GameUtil.G_FreeEdict(tempgoal); if (self != null) { self.goalentity = save; } }