diff options
Diffstat (limited to 'src/jake2/game/GameMisc.java')
-rw-r--r-- | src/jake2/game/GameMisc.java | 1177 |
1 files changed, 164 insertions, 1013 deletions
diff --git a/src/jake2/game/GameMisc.java b/src/jake2/game/GameMisc.java index a269c15..dbad217 100644 --- a/src/jake2/game/GameMisc.java +++ b/src/jake2/game/GameMisc.java @@ -19,200 +19,48 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // Created on 27.12.2003 by RST. -// $Id: GameMisc.java,v 1.1 2004-07-07 19:58:59 hzi Exp $ +// $Id: GameMisc.java,v 1.2 2004-07-08 15:58:44 hzi Exp $ package jake2.game; -import java.util.Date; +import jake2.client.M; -import jake2.*; -import jake2.client.*; -import jake2.qcommon.*; -import jake2.render.*; -import jake2.server.*; - -public class GameMisc extends GameTrigger { - - /*QUAKED func_group (0 0 0) ? - Used to group brushes together just for editor convenience. - */ - - //===================================================== - - static EntUseAdapter Use_Areaportal = new EntUseAdapter() { - public void use(edict_t ent, edict_t other, edict_t activator) { - ent.count ^= 1; // toggle state - // gi.dprintf ("portalstate: %i = %i\n", ent.style, ent.count); - gi.SetAreaPortalState(ent.style, ent.count!=0); - } - }; - - /*QUAKED func_areaportal (0 0 0) ? - - This is a non-visible object that divides the world into - areas that are seperated when this portal is not activated. - Usually enclosed in the middle of a door. - */ - - static EntThinkAdapter SP_func_areaportal = new EntThinkAdapter() { - public boolean think(edict_t ent) { - ent.use = Use_Areaportal; - ent.count = 0; // always start closed; - return true; - } - }; - - /*QUAKED path_corner (.5 .3 0) (-8 -8 -8) (8 8 8) TELEPORT - Target: next path corner - Pathtarget: gets used when an entity that has - this path_corner targeted touches it - */ - static EntTouchAdapter path_corner_touch = new EntTouchAdapter() { - public void touch(edict_t self, edict_t other, cplane_t plane, csurface_t surf) { - float[] v={0,0,0}; - edict_t next; - - if (other.movetarget != self) - return; - - if (other.enemy != null) - return; - - if (self.pathtarget != null) { - String savetarget; - - savetarget = self.target; - self.target = self.pathtarget; - G_UseTargets(self, other); - self.target = savetarget; - } - - if (self.target != null) - next = G_PickTarget(self.target); - else - next = null; - - if ((next != null) && (next.spawnflags & 1) != 0) { - VectorCopy(next.s.origin, v); - v[2] += next.mins[2]; - v[2] -= other.mins[2]; - VectorCopy(v, other.s.origin); - next = G_PickTarget(next.target); - other.s.event = EV_OTHER_TELEPORT; - } - - other.goalentity = other.movetarget = next; - - if (self.wait != 0) { - other.monsterinfo.pausetime = level.time + self.wait; - other.monsterinfo.stand.think(other); - return; - } - - if (other.movetarget == null) { - other.monsterinfo.pausetime = level.time + 100000000; - other.monsterinfo.stand.think(other); - } - else { - VectorSubtract(other.goalentity.s.origin, other.s.origin, v); - other.ideal_yaw = vectoyaw(v); - } - } - }; - - public static void SP_path_corner(edict_t self) { - if (self.targetname == null) { +public class GameMisc extends GameTrigger +{ + public static void SP_path_corner(edict_t self) + { + if (self.targetname == null) + { gi.dprintf("path_corner with no targetname at " + vtos(self.s.origin) + "\n"); G_FreeEdict(self); return; } self.solid = SOLID_TRIGGER; - self.touch = path_corner_touch; + self.touch = GameMiscAdapters.path_corner_touch; VectorSet(self.mins, -8, -8, -8); VectorSet(self.maxs, 8, 8, 8); self.svflags |= SVF_NOCLIENT; gi.linkentity(self); } - /*QUAKED point_combat (0.5 0.3 0) (-8 -8 -8) (8 8 8) Hold - Makes this the target of a monster and it will head here - when first activated before going after the activator. If - hold is selected, it will stay here. - */ - static EntTouchAdapter point_combat_touch = new EntTouchAdapter() { - public void touch(edict_t self, edict_t other, cplane_t plane, csurface_t surf) { - edict_t activator; - - if (other.movetarget != self) - return; - - if (self.target != null) { - other.target = self.target; - other.goalentity = other.movetarget = G_PickTarget(other.target); - if (null == other.goalentity) { - gi.dprintf(self.classname + " at " + vtos(self.s.origin) + " target " + self.target + " does not exist\n"); - other.movetarget = self; - } - self.target = null; - } - else if ((self.spawnflags & 1) != 0 && 0 == (other.flags & (FL_SWIM | FL_FLY))) { - other.monsterinfo.pausetime = level.time + 100000000; - other.monsterinfo.aiflags |= AI_STAND_GROUND; - other.monsterinfo.stand.think(other); - } - - if (other.movetarget == self) { - other.target = null; - other.movetarget = null; - other.goalentity = other.enemy; - other.monsterinfo.aiflags &= ~AI_COMBAT_POINT; - } - - if (self.pathtarget != null) { - String savetarget; - - savetarget = self.target; - self.target = self.pathtarget; - if (other.enemy != null && other.enemy.client != null) - activator = other.enemy; - else if (other.oldenemy != null && other.oldenemy.client != null) - activator = other.oldenemy; - else if (other.activator != null && other.activator.client != null) - activator = other.activator; - else - activator = other; - G_UseTargets(self, activator); - self.target = savetarget; - } - } - }; - - public static void SP_point_combat(edict_t self) { - if (deathmatch.value != 0) { + public static void SP_point_combat(edict_t self) + { + if (deathmatch.value != 0) + { G_FreeEdict(self); return; } self.solid = SOLID_TRIGGER; - self.touch = point_combat_touch; + self.touch = GameMiscAdapters.point_combat_touch; VectorSet(self.mins, -8, -8, -16); VectorSet(self.maxs, 8, 8, 16); self.svflags = SVF_NOCLIENT; gi.linkentity(self); }; - /*QUAKED viewthing (0 .5 .8) (-8 -8 -8) (8 8 8) - Just for the debugging level. Don't use - */ - public static EntThinkAdapter TH_viewthing = new EntThinkAdapter() { - public boolean think(edict_t ent) { - ent.s.frame = (ent.s.frame + 1) % 7; - ent.nextthink = level.time + FRAMETIME; - return true; - } - }; - - public static void SP_viewthing(edict_t ent) { + public static void SP_viewthing(edict_t ent) + { gi.dprintf("viewthing spawned\n"); ent.movetype = MOVETYPE_NONE; @@ -223,98 +71,48 @@ public class GameMisc extends GameTrigger { ent.s.modelindex = gi.modelindex("models/objects/banner/tris.md2"); gi.linkentity(ent); ent.nextthink = level.time + 0.5f; - ent.think = TH_viewthing; + ent.think = GameMiscAdapters.TH_viewthing; return; } /*QUAKED info_null (0 0.5 0) (-4 -4 -4) (4 4 4) Used as a positional target for spotlights, etc. */ - public static void SP_info_null(edict_t self) { + public static void SP_info_null(edict_t self) + { G_FreeEdict(self); }; /*QUAKED info_notnull (0 0.5 0) (-4 -4 -4) (4 4 4) Used as a positional target for lightning. */ - public static void SP_info_notnull(edict_t self) { + public static void SP_info_notnull(edict_t self) + { VectorCopy(self.s.origin, self.absmin); VectorCopy(self.s.origin, self.absmax); }; - /*QUAKED light (0 1 0) (-8 -8 -8) (8 8 8) START_OFF - Non-displayed light. - Default light value is 300. - Default style is 0. - If targeted, will toggle between on and off. - Default _cone value is 10 (used to set size of light for spotlights) - */ - - public static final int START_OFF = 1; - - static EntUseAdapter light_use = new EntUseAdapter() { - - public void use(edict_t self, edict_t other, edict_t activator) { - if ((self.spawnflags & START_OFF) != 0) { - gi.configstring(CS_LIGHTS + self.style, "m"); - self.spawnflags &= ~START_OFF; - } - else { - gi.configstring(CS_LIGHTS + self.style, "a"); - self.spawnflags |= START_OFF; - } - } - }; - - public static void SP_light(edict_t self) { + public static void SP_light(edict_t self) + { // no targeted lights in deathmatch, because they cause global messages - if (null == self.targetname || deathmatch.value != 0) { + if (null == self.targetname || deathmatch.value != 0) + { G_FreeEdict(self); return; } - if (self.style >= 32) { - self.use = light_use; - if ((self.spawnflags & START_OFF) != 0) + if (self.style >= 32) + { + self.use = GameMiscAdapters.light_use; + if ((self.spawnflags & GameMiscAdapters.START_OFF) != 0) gi.configstring(CS_LIGHTS + self.style, "a"); else gi.configstring(CS_LIGHTS + self.style, "m"); } } - /*QUAKED func_wall (0 .5 .8) ? TRIGGER_SPAWN TOGGLE START_ON ANIMATED ANIMATED_FAST - This is just a solid wall if not inhibited - - TRIGGER_SPAWN the wall will not be present until triggered - it will then blink in to existance; it will - kill anything that was in it's way - - TOGGLE only valid for TRIGGER_SPAWN walls - this allows the wall to be turned on and off - - START_ON only valid for TRIGGER_SPAWN walls - the wall will initially be present - */ - - static EntUseAdapter func_wall_use = new EntUseAdapter() { - public void use(edict_t self, edict_t other, edict_t activator) { - if (self.solid == SOLID_NOT) { - self.solid = SOLID_BSP; - self.svflags &= ~SVF_NOCLIENT; - KillBox(self); - } - else { - self.solid = SOLID_NOT; - self.svflags |= SVF_NOCLIENT; - } - gi.linkentity(self); - - if (0 == (self.spawnflags & 2)) - self.use = null; - } - }; - - public static void SP_func_wall(edict_t self) { + public static void SP_func_wall(edict_t self) + { self.movetype = MOVETYPE_PUSH; gi.setmodel(self, self.model); @@ -324,72 +122,45 @@ public class GameMisc extends GameTrigger { self.s.effects |= EF_ANIM_ALLFAST; // just a wall - if ((self.spawnflags & 7) == 0) { + if ((self.spawnflags & 7) == 0) + { self.solid = SOLID_BSP; gi.linkentity(self); return; } // it must be TRIGGER_SPAWN - if (0 == (self.spawnflags & 1)) { + if (0 == (self.spawnflags & 1)) + { // gi.dprintf("func_wall missing TRIGGER_SPAWN\n"); self.spawnflags |= 1; } // yell if the spawnflags are odd - if ((self.spawnflags & 4) != 0) { - if (0 == (self.spawnflags & 2)) { + if ((self.spawnflags & 4) != 0) + { + if (0 == (self.spawnflags & 2)) + { gi.dprintf("func_wall START_ON without TOGGLE\n"); self.spawnflags |= 2; } } - self.use = func_wall_use; - if ((self.spawnflags & 4) != 0) { + self.use = GameMiscAdapters.func_wall_use; + if ((self.spawnflags & 4) != 0) + { self.solid = SOLID_BSP; } - else { + else + { self.solid = SOLID_NOT; self.svflags |= SVF_NOCLIENT; } gi.linkentity(self); } - /*QUAKED func_object (0 .5 .8) ? TRIGGER_SPAWN ANIMATED ANIMATED_FAST - This is solid bmodel that will fall if it's support it removed. - */ - static EntTouchAdapter func_object_touch = new EntTouchAdapter() { - public void touch(edict_t self, edict_t other, cplane_t plane, csurface_t surf) { - // only squash thing we fall on top of - if (plane == null) - return; - if (plane.normal[2] < 1.0) - return; - if (other.takedamage == DAMAGE_NO) - return; - T_Damage(other, self, self, vec3_origin, self.s.origin, vec3_origin, self.dmg, 1, 0, MOD_CRUSH); - } - }; - - static EntThinkAdapter func_object_release = new EntThinkAdapter() { - public boolean think(edict_t self) { - self.movetype = MOVETYPE_TOSS; - self.touch = func_object_touch; - return true; - } - }; - - static EntUseAdapter func_object_use = new EntUseAdapter() { - public void use(edict_t self, edict_t other, edict_t activator) { - self.solid = SOLID_BSP; - self.svflags &= ~SVF_NOCLIENT; - self.use = null; - KillBox(self); - func_object_release.think(self); - } - }; - - public static void SP_func_object(edict_t self) { + public static void SP_func_object(edict_t self) + { gi.setmodel(self, self.model); self.mins[0] += 1; @@ -402,16 +173,18 @@ public class GameMisc extends GameTrigger { if (self.dmg == 0) self.dmg = 100; - if (self.spawnflags == 0) { + if (self.spawnflags == 0) + { self.solid = SOLID_BSP; self.movetype = MOVETYPE_PUSH; - self.think = func_object_release; + self.think = GameMiscAdapters.func_object_release; self.nextthink = level.time + 2 * FRAMETIME; } - else { + else + { self.solid = SOLID_NOT; self.movetype = MOVETYPE_PUSH; - self.use = func_object_use; + self.use = GameMiscAdapters.func_object_use; self.svflags |= SVF_NOCLIENT; } @@ -425,101 +198,10 @@ public class GameMisc extends GameTrigger { gi.linkentity(self); } - /*QUAKED func_explosive (0 .5 .8) ? Trigger_Spawn ANIMATED ANIMATED_FAST - Any brush that you want to explode or break apart. If you want an - ex0plosion, set dmg and it will do a radius explosion of that amount - at the center of the bursh. - - If targeted it will not be shootable. - - health defaults to 100. - - mass defaults to 75. This determines how much debris is emitted when - it explodes. You get one large chunk per 100 of mass (up to 8) and - one small chunk per 25 of mass (up to 16). So 800 gives the most. - */ - static EntDieAdapter func_explosive_explode = new EntDieAdapter() { - - public void die(edict_t self, edict_t inflictor, edict_t attacker, int damage, float[] point) { - float[] origin={0,0,0}; - float[] chunkorigin={0,0,0}; - float[] size={0,0,0}; - int count; - int mass; - - // bmodel origins are (0 0 0), we need to adjust that here - VectorScale(self.size, 0.5f, size); - VectorAdd(self.absmin, size, origin); - VectorCopy(origin, self.s.origin); - - self.takedamage = DAMAGE_NO; - - if (self.dmg != 0) - T_RadiusDamage(self, attacker, self.dmg, null, self.dmg + 40, MOD_EXPLOSIVE); - - VectorSubtract(self.s.origin, inflictor.s.origin, self.velocity); - VectorNormalize(self.velocity); - VectorScale(self.velocity, 150, self.velocity); - - // start chunks towards the center - VectorScale(size, 0.5f, size); - - mass = self.mass; - if (0 == mass) - mass = 75; - - // big chunks - if (mass >= 100) { - count = mass / 100; - if (count > 8) - count = 8; - while (count-- != 0) { - chunkorigin[0] = origin[0] + crandom() * size[0]; - chunkorigin[1] = origin[1] + crandom() * size[1]; - chunkorigin[2] = origin[2] + crandom() * size[2]; - ThrowDebris(self, "models/objects/debris1/tris.md2", 1, chunkorigin); - } - } - - // small chunks - count = mass / 25; - if (count > 16) - count = 16; - while (count-- != 0) { - chunkorigin[0] = origin[0] + crandom() * size[0]; - chunkorigin[1] = origin[1] + crandom() * size[1]; - chunkorigin[2] = origin[2] + crandom() * size[2]; - ThrowDebris(self, "models/objects/debris2/tris.md2", 2, chunkorigin); - } - - G_UseTargets(self, attacker); - - if (self.dmg != 0) - BecomeExplosion1(self); - else - G_FreeEdict(self); - } - }; - - static EntUseAdapter func_explosive_use = new EntUseAdapter() { - public void use(edict_t self, edict_t other, edict_t activator) { - func_explosive_explode.die(self, self, other, self.health, vec3_origin); - } - }; - - static EntUseAdapter func_explosive_spawn = new EntUseAdapter() { - - public void use(edict_t self, edict_t other, edict_t activator) { - self.solid = SOLID_BSP; - self.svflags &= ~SVF_NOCLIENT; - self.use = null; - KillBox(self); - gi.linkentity(self); - } - }; - - public static void SP_func_explosive(edict_t self) { - if (deathmatch.value != 0) { // auto-remove for deathmatch + public static void SP_func_explosive(edict_t self) + { + if (deathmatch.value != 0) + { // auto-remove for deathmatch G_FreeEdict(self); return; } @@ -531,15 +213,17 @@ public class GameMisc extends GameTrigger { gi.setmodel(self, self.model); - if ((self.spawnflags & 1) != 0) { + if ((self.spawnflags & 1) != 0) + { self.svflags |= SVF_NOCLIENT; self.solid = SOLID_NOT; - self.use = func_explosive_spawn; + self.use = GameMiscAdapters.func_explosive_spawn; } - else { + else + { self.solid = SOLID_BSP; if (self.targetname != null) - self.use = func_explosive_use; + self.use = GameMiscAdapters.func_explosive_use; } if ((self.spawnflags & 2) != 0) @@ -547,131 +231,21 @@ public class GameMisc extends GameTrigger { if ((self.spawnflags & 4) != 0) self.s.effects |= EF_ANIM_ALLFAST; - if (self.use != func_explosive_use) { + if (self.use != GameMiscAdapters.func_explosive_use) + { if (self.health == 0) self.health = 100; - self.die = func_explosive_explode; + self.die = GameMiscAdapters.func_explosive_explode; self.takedamage = DAMAGE_YES; } gi.linkentity(self); } - /*QUAKED misc_explobox (0 .5 .8) (-16 -16 0) (16 16 40) - Large exploding box. You can override its mass (100), - health (80), and dmg (150). - */ - - static EntTouchAdapter barrel_touch = new EntTouchAdapter() { - - public void touch(edict_t self, edict_t other, cplane_t plane, csurface_t surf) { - float ratio; - float[] v={0,0,0}; - - if ((null == other.groundentity) || (other.groundentity == self)) - return; - - ratio = (float) other.mass / (float) self.mass; - VectorSubtract(self.s.origin, other.s.origin, v); - M.M_walkmove(self, vectoyaw(v), 20 * ratio * FRAMETIME); - } - }; - - static EntThinkAdapter barrel_explode = new EntThinkAdapter() { - public boolean think(edict_t self) { - - float[] org={0,0,0}; - float spd; - float[] save={0,0,0}; - - T_RadiusDamage(self, self.activator, self.dmg, null, self.dmg + 40, MOD_BARREL); - - VectorCopy(self.s.origin, save); - VectorMA(self.absmin, 0.5f, self.size, self.s.origin); - - // a few big chunks - spd = 1.5f * (float) self.dmg / 200.0f; - org[0] = self.s.origin[0] + crandom() * self.size[0]; - org[1] = self.s.origin[1] + crandom() * self.size[1]; - org[2] = self.s.origin[2] + crandom() * self.size[2]; - ThrowDebris(self, "models/objects/debris1/tris.md2", spd, org); - org[0] = self.s.origin[0] + crandom() * self.size[0]; - org[1] = self.s.origin[1] + crandom() * self.size[1]; - org[2] = self.s.origin[2] + crandom() * self.size[2]; - ThrowDebris(self, "models/objects/debris1/tris.md2", spd, org); - - // bottom corners - spd = 1.75f * (float) self.dmg / 200.0f; - VectorCopy(self.absmin, org); - ThrowDebris(self, "models/objects/debris3/tris.md2", spd, org); - VectorCopy(self.absmin, org); - org[0] += self.size[0]; - ThrowDebris(self, "models/objects/debris3/tris.md2", spd, org); - VectorCopy(self.absmin, org); - org[1] += self.size[1]; - ThrowDebris(self, "models/objects/debris3/tris.md2", spd, org); - VectorCopy(self.absmin, org); - org[0] += self.size[0]; - org[1] += self.size[1]; - ThrowDebris(self, "models/objects/debris3/tris.md2", spd, org); - - // a bunch of little chunks - spd = 2 * self.dmg / 200; - org[0] = self.s.origin[0] + crandom() * self.size[0]; - org[1] = self.s.origin[1] + crandom() * self.size[1]; - org[2] = self.s.origin[2] + crandom() * self.size[2]; - ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); - org[0] = self.s.origin[0] + crandom() * self.size[0]; - org[1] = self.s.origin[1] + crandom() * self.size[1]; - org[2] = self.s.origin[2] + crandom() * self.size[2]; - ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); - org[0] = self.s.origin[0] + crandom() * self.size[0]; - org[1] = self.s.origin[1] + crandom() * self.size[1]; - org[2] = self.s.origin[2] + crandom() * self.size[2]; - ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); - org[0] = self.s.origin[0] + crandom() * self.size[0]; - org[1] = self.s.origin[1] + crandom() * self.size[1]; - org[2] = self.s.origin[2] + crandom() * self.size[2]; - ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); - org[0] = self.s.origin[0] + crandom() * self.size[0]; - org[1] = self.s.origin[1] + crandom() * self.size[1]; - org[2] = self.s.origin[2] + crandom() * self.size[2]; - ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); - org[0] = self.s.origin[0] + crandom() * self.size[0]; - org[1] = self.s.origin[1] + crandom() * self.size[1]; - org[2] = self.s.origin[2] + crandom() * self.size[2]; - ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); - org[0] = self.s.origin[0] + crandom() * self.size[0]; - org[1] = self.s.origin[1] + crandom() * self.size[1]; - org[2] = self.s.origin[2] + crandom() * self.size[2]; - ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); - org[0] = self.s.origin[0] + crandom() * self.size[0]; - org[1] = self.s.origin[1] + crandom() * self.size[1]; - org[2] = self.s.origin[2] + crandom() * self.size[2]; - ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); - - VectorCopy(save, self.s.origin); - if (self.groundentity != null) - BecomeExplosion2(self); - else - BecomeExplosion1(self); - - return true; - } - }; - - static EntDieAdapter barrel_delay = new EntDieAdapter() { - public void die(edict_t self, edict_t inflictor, edict_t attacker, int damage, float[] point) { - - self.takedamage = DAMAGE_NO; - self.nextthink = level.time + 2 * FRAMETIME; - self.think = barrel_explode; - self.activator = attacker; - } - }; - - public static void SP_misc_explobox(edict_t self) { - if (deathmatch.value != 0) { // auto-remove for deathmatch + public static void SP_misc_explobox(edict_t self) + { + if (deathmatch.value != 0) + { // auto-remove for deathmatch G_FreeEdict(self); return; } @@ -695,11 +269,11 @@ public class GameMisc extends GameTrigger { if (0 == self.dmg) self.dmg = 150; - self.die = barrel_delay; + self.die = GameMiscAdapters.barrel_delay; self.takedamage = DAMAGE_YES; self.monsterinfo.aiflags = AI_NOSTEP; - self.touch = barrel_touch; + self.touch = GameMiscAdapters.barrel_touch; self.think = M.M_droptofloor; self.nextthink = level.time + 2 * FRAMETIME; @@ -707,174 +281,68 @@ public class GameMisc extends GameTrigger { gi.linkentity(self); } - // - // miscellaneous specialty items - // - - /*QUAKED misc_blackhole (1 .5 0) (-8 -8 -8) (8 8 8) - */ - - static EntUseAdapter misc_blackhole_use = new EntUseAdapter() { - public void use(edict_t ent, edict_t other, edict_t activator) { - /* - gi.WriteByte (svc_temp_entity); - gi.WriteByte (TE_BOSSTPORT); - gi.WritePosition (ent.s.origin); - gi.multicast (ent.s.origin, MULTICAST_PVS); - */ - G_FreeEdict(ent); - } - }; - - static EntThinkAdapter misc_blackhole_think = new EntThinkAdapter() { - public boolean think(edict_t self) { - - if (++self.s.frame < 19) - self.nextthink = level.time + FRAMETIME; - else { - self.s.frame = 0; - self.nextthink = level.time + FRAMETIME; - } - return true; - } - }; - - public static void SP_misc_blackhole(edict_t ent) { + public static void SP_misc_blackhole(edict_t ent) + { ent.movetype = MOVETYPE_NONE; ent.solid = SOLID_NOT; VectorSet(ent.mins, -64, -64, 0); VectorSet(ent.maxs, 64, 64, 8); ent.s.modelindex = gi.modelindex("models/objects/black/tris.md2"); ent.s.renderfx = RF_TRANSLUCENT; - ent.use = misc_blackhole_use; - ent.think = misc_blackhole_think; + ent.use = GameMiscAdapters.misc_blackhole_use; + ent.think = GameMiscAdapters.misc_blackhole_think; ent.nextthink = level.time + 2 * FRAMETIME; gi.linkentity(ent); } - /*QUAKED misc_eastertank (1 .5 0) (-32 -32 -16) (32 32 32) - */ - - static EntThinkAdapter misc_eastertank_think = new EntThinkAdapter() { - public boolean think(edict_t self) { - if (++self.s.frame < 293) - self.nextthink = level.time + FRAMETIME; - else { - self.s.frame = 254; - self.nextthink = level.time + FRAMETIME; - } - return true; - } - }; - - public static void SP_misc_eastertank(edict_t ent) { + public static void SP_misc_eastertank(edict_t ent) + { ent.movetype = MOVETYPE_NONE; ent.solid = SOLID_BBOX; VectorSet(ent.mins, -32, -32, -16); VectorSet(ent.maxs, 32, 32, 32); ent.s.modelindex = gi.modelindex("models/monsters/tank/tris.md2"); ent.s.frame = 254; - ent.think = misc_eastertank_think; + ent.think = GameMiscAdapters.misc_eastertank_think; ent.nextthink = level.time + 2 * FRAMETIME; gi.linkentity(ent); } - /*QUAKED misc_easterchick (1 .5 0) (-32 -32 0) (32 32 32) - */ - - static EntThinkAdapter misc_easterchick_think = new EntThinkAdapter() { - public boolean think(edict_t self) { - if (++self.s.frame < 247) - self.nextthink = level.time + FRAMETIME; - else { - self.s.frame = 208; - self.nextthink = level.time + FRAMETIME; - } - return true; - } - }; - - public static void SP_misc_easterchick(edict_t ent) { + public static void SP_misc_easterchick(edict_t ent) + { ent.movetype = MOVETYPE_NONE; ent.solid = SOLID_BBOX; VectorSet(ent.mins, -32, -32, 0); VectorSet(ent.maxs, 32, 32, 32); ent.s.modelindex = gi.modelindex("models/monsters/bitch/tris.md2"); ent.s.frame = 208; - ent.think = misc_easterchick_think; + ent.think = GameMiscAdapters.misc_easterchick_think; ent.nextthink = level.time + 2 * FRAMETIME; gi.linkentity(ent); } - /*QUAKED misc_easterchick2 (1 .5 0) (-32 -32 0) (32 32 32) - */ - static EntThinkAdapter misc_easterchick2_think = new EntThinkAdapter() { - public boolean think(edict_t self) { - if (++self.s.frame < 287) - self.nextthink = level.time + FRAMETIME; - else { - self.s.frame = 248; - self.nextthink = level.time + FRAMETIME; - } - return true; - } - }; - - public static void SP_misc_easterchick2(edict_t ent) { + public static void SP_misc_easterchick2(edict_t ent) + { ent.movetype = MOVETYPE_NONE; ent.solid = SOLID_BBOX; VectorSet(ent.mins, -32, -32, 0); VectorSet(ent.maxs, 32, 32, 32); ent.s.modelindex = gi.modelindex("models/monsters/bitch/tris.md2"); ent.s.frame = 248; - ent.think = misc_easterchick2_think; + ent.think = GameMiscAdapters.misc_easterchick2_think; ent.nextthink = level.time + 2 * FRAMETIME; gi.linkentity(ent); } - /*QUAKED monster_commander_body (1 .5 0) (-32 -32 0) (32 32 48) - Not really a monster, this is the Tank Commander's decapitated body. - There should be a item_commander_head that has this as it's target. - */ - - static EntThinkAdapter commander_body_think = new EntThinkAdapter() { - public boolean think(edict_t self) { - if (++self.s.frame < 24) - self.nextthink = level.time + FRAMETIME; - else - self.nextthink = 0; - - if (self.s.frame == 22) - gi.sound(self, CHAN_BODY, gi.soundindex("tank/thud.wav"), 1, ATTN_NORM, 0); - return true; - } - }; - - static EntUseAdapter commander_body_use = new EntUseAdapter() { - - public void use(edict_t self, edict_t other, edict_t activator) { - self.think = commander_body_think; - self.nextthink = level.time + FRAMETIME; - gi.sound(self, CHAN_BODY, gi.soundindex("tank/pain.wav"), 1, ATTN_NORM, 0); - } - }; - - static EntThinkAdapter commander_body_drop = new EntThinkAdapter() { - public boolean think(edict_t self) { - self.movetype = MOVETYPE_TOSS; - self.s.origin[2] += 2; - return true; - } - }; - - public static void SP_monster_commander_body(edict_t self) { + public static void SP_monster_commander_body(edict_t self) + { self.movetype = MOVETYPE_NONE; self.solid = SOLID_BBOX; self.model = "models/monsters/commandr/tris.md2"; self.s.modelindex = gi.modelindex(self.model); VectorSet(self.mins, -32, -32, 0); VectorSet(self.maxs, 32, 32, 48); - self.use = commander_body_use; + self.use = GameMiscAdapters.commander_body_use; self.takedamage = DAMAGE_YES; self.flags = FL_GODMODE; self.s.renderfx |= RF_FRAMELERP; @@ -883,53 +351,26 @@ public class GameMisc extends GameTrigger { gi.soundindex("tank/thud.wav"); gi.soundindex("tank/pain.wav"); - self.think = commander_body_drop; + self.think = GameMiscAdapters.commander_body_drop; self.nextthink = level.time + 5 * FRAMETIME; } - /*QUAKED misc_banner (1 .5 0) (-4 -4 -4) (4 4 4) - The origin is the bottom of the banner. - The banner is 128 tall. - */ - static EntThinkAdapter misc_banner_think = new EntThinkAdapter() { - public boolean think(edict_t ent) { - ent.s.frame = (ent.s.frame + 1) % 16; - ent.nextthink = level.time + FRAMETIME; - return true; - } - }; - - public static void SP_misc_banner(edict_t ent) { + public static void SP_misc_banner(edict_t ent) + { ent.movetype = MOVETYPE_NONE; ent.solid = SOLID_NOT; ent.s.modelindex = gi.modelindex("models/objects/banner/tris.md2"); ent.s.frame = rand() % 16; gi.linkentity(ent); - ent.think = misc_banner_think; + ent.think = GameMiscAdapters.misc_banner_think; ent.nextthink = level.time + FRAMETIME; } - /*QUAKED misc_deadsoldier (1 .5 0) (-16 -16 0) (16 16 16) ON_BACK ON_STOMACH BACK_DECAP FETAL_POS SIT_DECAP IMPALED - This is the dead player model. Comes in 6 exciting different poses! - */ - static EntDieAdapter misc_deadsoldier_die = new EntDieAdapter() { - - public void die(edict_t self, edict_t inflictor, edict_t attacker, int damage, float[] point) { - int n; - - if (self.health > -80) - return; - - gi.sound(self, CHAN_BODY, gi.soundindex("misc/udeath.wav"), 1, ATTN_NORM, 0); - for (n = 0; n < 4; n++) - ThrowGib(self, "models/objects/gibs/sm_meat/tris.md2", damage, GIB_ORGANIC); - ThrowHead(self, "models/objects/gibs/head2/tris.md2", damage, GIB_ORGANIC); - } - }; - - public static void SP_misc_deadsoldier(edict_t ent) { - if (deathmatch.value != 0) { // auto-remove for deathmatch + public static void SP_misc_deadsoldier(edict_t ent) + { + if (deathmatch.value != 0) + { // auto-remove for deathmatch G_FreeEdict(ent); return; } @@ -957,30 +398,16 @@ public class GameMisc extends GameTrigger { ent.deadflag = DEAD_DEAD; ent.takedamage = DAMAGE_YES; ent.svflags |= SVF_MONSTER | SVF_DEADMONSTER; - ent.die = misc_deadsoldier_die; + ent.die = GameMiscAdapters.misc_deadsoldier_die; ent.monsterinfo.aiflags |= AI_GOOD_GUY; gi.linkentity(ent); } - /*QUAKED misc_viper (1 .5 0) (-16 -16 0) (16 16 32) - This is the Viper for the flyby bombing. - It is trigger_spawned, so you must have something use it for it to show up. - There must be a path for it to follow once it is activated. - - "speed" How fast the Viper should fly - */ - - static EntUseAdapter misc_viper_use = new EntUseAdapter() { - public void use(edict_t self, edict_t other, edict_t activator) { - self.svflags &= ~SVF_NOCLIENT; - self.use = GameFunc.train_use; - GameFunc.train_use.use(self, other, activator); - } - }; - - public static void SP_misc_viper(edict_t ent) { - if (null == ent.target) { + public static void SP_misc_viper(edict_t ent) + { + if (null == ent.target) + { gi.dprintf("misc_viper without a target at " + vtos(ent.absmin) + "\n"); G_FreeEdict(ent); return; @@ -995,9 +422,9 @@ public class GameMisc extends GameTrigger { VectorSet(ent.mins, -16, -16, 0); VectorSet(ent.maxs, 16, 16, 32); - ent.think = GameFunc.func_train_find; + ent.think = GameFuncAdapters.func_train_find; ent.nextthink = level.time + FRAMETIME; - ent.use = misc_viper_use; + ent.use = GameMiscAdapters.misc_viper_use; ent.svflags |= SVF_NOCLIENT; ent.moveinfo.accel = ent.moveinfo.decel = ent.moveinfo.speed = ent.speed; @@ -1007,7 +434,8 @@ public class GameMisc extends GameTrigger { /*QUAKED misc_bigviper (1 .5 0) (-176 -120 -24) (176 120 72) This is a large stationary viper as seen in Paul's intro */ - public static void SP_misc_bigviper(edict_t ent) { + public static void SP_misc_bigviper(edict_t ent) + { ent.movetype = MOVETYPE_NONE; ent.solid = SOLID_BBOX; VectorSet(ent.mins, -176, -120, -24); @@ -1016,70 +444,8 @@ public class GameMisc extends GameTrigger { gi.linkentity(ent); } - /*QUAKED misc_viper_bomb (1 0 0) (-8 -8 -8) (8 8 8) - "dmg" how much boom should the bomb make? - */ - static EntTouchAdapter misc_viper_bomb_touch = new EntTouchAdapter() { - - public void touch(edict_t self, edict_t other, cplane_t plane, csurface_t surf) { - G_UseTargets(self, self.activator); - - self.s.origin[2] = self.absmin[2] + 1; - T_RadiusDamage(self, self, self.dmg, null, self.dmg + 40, MOD_BOMB); - BecomeExplosion2(self); - } - }; - - static EntThinkAdapter misc_viper_bomb_prethink = new EntThinkAdapter() { - public boolean think(edict_t self) { - - float[] v={0,0,0}; - float diff; - - self.groundentity = null; - - diff = self.timestamp - level.time; - if (diff < -1.0) - diff = -1.0f; - - VectorScale(self.moveinfo.dir, 1.0f + diff, v); - v[2] = diff; - - diff = self.s.angles[2]; - vectoangles(v, self.s.angles); - self.s.angles[2] = diff + 10; - - return true; - } - }; - - static EntUseAdapter misc_viper_bomb_use = new EntUseAdapter() { - public void use(edict_t self, edict_t other, edict_t activator) { - edict_t viper=null; - - self.solid = SOLID_BBOX; - self.svflags &= ~SVF_NOCLIENT; - self.s.effects |= EF_ROCKET; - self.use = null; - self.movetype = MOVETYPE_TOSS; - self.prethink = misc_viper_bomb_prethink; - self.touch = misc_viper_bomb_touch; - self.activator = activator; - - EdictIterator es = null; - - es = G_Find(es, findByClass, "misc_viper"); - if (es != null) - viper = es.o; - - VectorScale(viper.moveinfo.dir, viper.moveinfo.speed, self.velocity); - - self.timestamp = level.time; - VectorCopy(viper.moveinfo.dir, self.moveinfo.dir); - } - }; - - public static void SP_misc_viper_bomb(edict_t self) { + public static void SP_misc_viper_bomb(edict_t self) + { self.movetype = MOVETYPE_NONE; self.solid = SOLID_NOT; VectorSet(self.mins, -8, -8, -8); @@ -1090,30 +456,16 @@ public class GameMisc extends GameTrigger { if (self.dmg == 0) self.dmg = 1000; - self.use = misc_viper_bomb_use; + self.use = GameMiscAdapters.misc_viper_bomb_use; self.svflags |= SVF_NOCLIENT; gi.linkentity(self); } - /*QUAKED misc_strogg_ship (1 .5 0) (-16 -16 0) (16 16 32) - This is a Storgg ship for the flybys. - It is trigger_spawned, so you must have something use it for it to show up. - There must be a path for it to follow once it is activated. - - "speed" How fast it should fly - */ - - static EntUseAdapter misc_strogg_ship_use = new EntUseAdapter() { - public void use(edict_t self, edict_t other, edict_t activator) { - self.svflags &= ~SVF_NOCLIENT; - self.use = GameFunc.train_use; - GameFunc.train_use.use(self, other, activator); - } - }; - - public static void SP_misc_strogg_ship(edict_t ent) { - if (null == ent.target) { + public static void SP_misc_strogg_ship(edict_t ent) + { + if (null == ent.target) + { gi.dprintf(ent.classname + " without a target at " + vtos(ent.absmin) + "\n"); G_FreeEdict(ent); return; @@ -1128,47 +480,30 @@ public class GameMisc extends GameTrigger { VectorSet(ent.mins, -16, -16, 0); VectorSet(ent.maxs, 16, 16, 32); - ent.think = GameFunc.func_train_find; + ent.think = GameFuncAdapters.func_train_find; ent.nextthink = level.time + FRAMETIME; - ent.use = misc_strogg_ship_use; + ent.use = GameMiscAdapters.misc_strogg_ship_use; ent.svflags |= SVF_NOCLIENT; ent.moveinfo.accel = ent.moveinfo.decel = ent.moveinfo.speed = ent.speed; gi.linkentity(ent); } - /*QUAKED misc_satellite_dish (1 .5 0) (-64 -64 0) (64 64 128) - */ - static EntThinkAdapter misc_satellite_dish_think = new EntThinkAdapter() { - public boolean think(edict_t self) { - self.s.frame++; - if (self.s.frame < 38) - self.nextthink = level.time + FRAMETIME; - return true; - } - }; - - static EntUseAdapter misc_satellite_dish_use = new EntUseAdapter() { - public void use(edict_t self, edict_t other, edict_t activator) { - self.s.frame = 0; - self.think = misc_satellite_dish_think; - self.nextthink = level.time + FRAMETIME; - } - }; - - public static void SP_misc_satellite_dish(edict_t ent) { + public static void SP_misc_satellite_dish(edict_t ent) + { ent.movetype = MOVETYPE_NONE; ent.solid = SOLID_BBOX; VectorSet(ent.mins, -64, -64, 0); VectorSet(ent.maxs, 64, 64, 128); ent.s.modelindex = gi.modelindex("models/objects/satellite/tris.md2"); - ent.use = misc_satellite_dish_use; + ent.use = GameMiscAdapters.misc_satellite_dish_use; gi.linkentity(ent); } /*QUAKED light_mine1 (0 1 0) (-2 -2 -12) (2 2 12) */ - public static void SP_light_mine1(edict_t ent) { + public static void SP_light_mine1(edict_t ent) + { ent.movetype = MOVETYPE_NONE; ent.solid = SOLID_BBOX; ent.s.modelindex = gi.modelindex("models/objects/minelite/light1/tris.md2"); @@ -1177,7 +512,8 @@ public class GameMisc extends GameTrigger { /*QUAKED light_mine2 (0 1 0) (-2 -2 -12) (2 2 12) */ - public static void SP_light_mine2(edict_t ent) { + public static void SP_light_mine2(edict_t ent) + { ent.movetype = MOVETYPE_NONE; ent.solid = SOLID_BBOX; ent.s.modelindex = gi.modelindex("models/objects/minelite/light2/tris.md2"); @@ -1187,19 +523,20 @@ public class GameMisc extends GameTrigger { /*QUAKED misc_gib_arm (1 0 0) (-8 -8 -8) (8 8 8) Intended for use with the target_spawner */ - public static void SP_misc_gib_arm(edict_t ent) { + public static void SP_misc_gib_arm(edict_t ent) + { gi.setmodel(ent, "models/objects/gibs/arm/tris.md2"); ent.solid = SOLID_NOT; ent.s.effects |= EF_GIB; ent.takedamage = DAMAGE_YES; - ent.die = gib_die; + ent.die = GameAIAdapters.gib_die; ent.movetype = MOVETYPE_TOSS; ent.svflags |= SVF_MONSTER; ent.deadflag = DEAD_DEAD; ent.avelocity[0] = random() * 200; ent.avelocity[1] = random() * 200; ent.avelocity[2] = random() * 200; - ent.think = G_FreeEdictA; + ent.think = GameUtilAdapters.G_FreeEdictA; ent.nextthink = level.time + 30; gi.linkentity(ent); } @@ -1207,19 +544,20 @@ public class GameMisc extends GameTrigger { /*QUAKED misc_gib_leg (1 0 0) (-8 -8 -8) (8 8 8) Intended for use with the target_spawner */ - public static void SP_misc_gib_leg(edict_t ent) { + public static void SP_misc_gib_leg(edict_t ent) + { gi.setmodel(ent, "models/objects/gibs/leg/tris.md2"); ent.solid = SOLID_NOT; ent.s.effects |= EF_GIB; ent.takedamage = DAMAGE_YES; - ent.die = gib_die; + ent.die = GameAIAdapters.gib_die; ent.movetype = MOVETYPE_TOSS; ent.svflags |= SVF_MONSTER; ent.deadflag = DEAD_DEAD; ent.avelocity[0] = random() * 200; ent.avelocity[1] = random() * 200; ent.avelocity[2] = random() * 200; - ent.think = G_FreeEdictA; + ent.think = GameUtilAdapters.G_FreeEdictA; ent.nextthink = level.time + 30; gi.linkentity(ent); } @@ -1227,19 +565,20 @@ public class GameMisc extends GameTrigger { /*QUAKED misc_gib_head (1 0 0) (-8 -8 -8) (8 8 8) Intended for use with the target_spawner */ - public static void SP_misc_gib_head(edict_t ent) { + public static void SP_misc_gib_head(edict_t ent) + { gi.setmodel(ent, "models/objects/gibs/head/tris.md2"); ent.solid = SOLID_NOT; ent.s.effects |= EF_GIB; ent.takedamage = DAMAGE_YES; - ent.die = gib_die; + ent.die = GameAIAdapters.gib_die; ent.movetype = MOVETYPE_TOSS; ent.svflags |= SVF_MONSTER; ent.deadflag = DEAD_DEAD; ent.avelocity[0] = random() * 200; ent.avelocity[1] = random() * 200; ent.avelocity[2] = random() * 200; - ent.think = G_FreeEdictA; + ent.think = GameUtilAdapters.G_FreeEdictA; ent.nextthink = level.time + 30; gi.linkentity(ent); } @@ -1251,7 +590,8 @@ public class GameMisc extends GameTrigger { "count" is position in the string (starts at 1) */ - public static void SP_target_character(edict_t self) { + public static void SP_target_character(edict_t self) + { self.movetype = MOVETYPE_PUSH; gi.setmodel(self, self.model); self.solid = SOLID_BSP; @@ -1260,82 +600,42 @@ public class GameMisc extends GameTrigger { return; } - /*QUAKED target_string (0 0 1) (-8 -8 -8) (8 8 8) - */ - - static EntUseAdapter target_string_use = new EntUseAdapter() { - public void use(edict_t self, edict_t other, edict_t activator) { - edict_t e; - int n, l; - char c; - - l = strlen(self.message); - for (e = self.teammaster; e != null; e = e.teamchain) { - if (e.count == 0) - continue; - n = e.count - 1; - if (n > l) { - e.s.frame = 12; - continue; - } - - c = self.message.charAt(n); - if (c >= '0' && c <= '9') - e.s.frame = c - '0'; - else if (c == '-') - e.s.frame = 10; - else if (c == ':') - e.s.frame = 11; - else - e.s.frame = 12; - } - } - }; - - public static void SP_target_string(edict_t self) { + public static void SP_target_string(edict_t self) + { if (self.message == null) self.message = ""; - self.use = target_string_use; + self.use = GameMiscAdapters.target_string_use; } - /*QUAKED func_clock (0 0 1) (-8 -8 -8) (8 8 8) TIMER_UP TIMER_DOWN START_OFF MULTI_USE - target a target_string with this - - The default is to be a time of day clock - - TIMER_UP and TIMER_DOWN run for "count" seconds and the fire "pathtarget" - If START_OFF, this entity must be used before it starts - - "style" 0 "xx" - 1 "xx:xx" - 2 "xx:xx:xx" - */ - - public static final int CLOCK_MESSAGE_SIZE = 16; - // don't let field width of any clock messages change, or it // could cause an overwrite after a game load - public static void func_clock_reset(edict_t self) { + public static void func_clock_reset(edict_t self) + { self.activator = null; - if ((self.spawnflags & 1) != 0) { + if ((self.spawnflags & 1) != 0) + { self.health = 0; self.wait = self.count; } - else if ((self.spawnflags & 2) != 0) { + else if ((self.spawnflags & 2) != 0) + { self.health = self.count; self.wait = 0; } } - public static void func_clock_format_countdown(edict_t self) { - if (self.style == 0) { + public static void func_clock_format_countdown(edict_t self) + { + if (self.style == 0) + { self.message = "" + self.health; //Com_sprintf(self.message, CLOCK_MESSAGE_SIZE, "%2i", self.health); return; } - if (self.style == 1) { + if (self.style == 1) + { self.message = "" + self.health / 60 + ":" + self.health % 60; //Com_sprintf(self.message, CLOCK_MESSAGE_SIZE, "%2i:%2i", self.health / 60, self.health % 60); /* @@ -1345,7 +645,8 @@ public class GameMisc extends GameTrigger { return; } - if (self.style == 2) { + if (self.style == 2) + { self.message = "" + self.health / 3600 + ":" + (self.health - (self.health / 3600) * 3600) / 60 + ":" + self.health % 60; /* Com_sprintf( @@ -1364,99 +665,17 @@ public class GameMisc extends GameTrigger { } } - public static EntThinkAdapter func_clock_think = new EntThinkAdapter() { - - public boolean think(edict_t self) { - if (null == self.enemy) { - - EdictIterator es = null; - - es = G_Find(es, findByTarget, self.target); - if (es != null) - self.enemy = es.o; - if (self.enemy == null) - return true; - } - - if ((self.spawnflags & 1) != 0) { - func_clock_format_countdown(self); - self.health++; - } - else if ((self.spawnflags & 2) != 0) { - func_clock_format_countdown(self); - self.health--; - } - else { - Date d = new Date(); - self.message = "" + d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds(); - - /* - struct tm * ltime; - time_t gmtime; - - time(& gmtime); - ltime = localtime(& gmtime); - Com_sprintf(self.message, CLOCK_MESSAGE_SIZE, "%2i:%2i:%2i", ltime.tm_hour, ltime.tm_min, ltime.tm_sec); - if (self.message[3] == ' ') - self.message[3] = '0'; - if (self.message[6] == ' ') - self.message[6] = '0'; - */ - } - - self.enemy.message = self.message; - self.enemy.use.use(self.enemy, self, self); - - if (((self.spawnflags & 1) != 0 && (self.health > self.wait)) - || ((self.spawnflags & 2) != 0 && (self.health < self.wait))) { - if (self.pathtarget != null) { - String savetarget; - String savemessage; - - savetarget = self.target; - savemessage = self.message; - self.target = self.pathtarget; - self.message = null; - G_UseTargets(self, self.activator); - self.target = savetarget; - self.message = savemessage; - } - - if (0 == (self.spawnflags & 8)) - return true; - - func_clock_reset(self); - - if ((self.spawnflags & 4) != 0) - return true; - } - - self.nextthink = level.time + 1; - return true; - - } - }; - - static EntUseAdapter func_clock_use = new EntUseAdapter() { - - public void use(edict_t self, edict_t other, edict_t activator) { - if (0 == (self.spawnflags & 8)) - self.use = null; - if (self.activator!=null) - return; - self.activator = activator; - self.think.think(self); - } - }; - - public static void SP_func_clock(edict_t self) { - if (self.target == null) { + public static void SP_func_clock(edict_t self) + { + if (self.target == null) + { gi.dprintf(self.classname + " with no target at " + vtos(self.s.origin) + "\n"); G_FreeEdict(self); return; } - if ((self.spawnflags & 2) != 0 && (0 == self.count)) { + if ((self.spawnflags & 2) != 0 && (0 == self.count)) + { gi.dprintf(self.classname + " with no count at " + vtos(self.s.origin) + "\n"); G_FreeEdict(self); return; @@ -1470,71 +689,23 @@ public class GameMisc extends GameTrigger { //self.message = gi.TagMalloc(CLOCK_MESSAGE_SIZE, TAG_LEVEL); self.message = new String(); - self.think = func_clock_think; + self.think = GameMiscAdapters.func_clock_think; if ((self.spawnflags & 4) != 0) - self.use = func_clock_use; + self.use = GameMiscAdapters.func_clock_use; else self.nextthink = level.time + 1; } - //================================================================================= - - static EntTouchAdapter teleporter_touch = new EntTouchAdapter() { - public void touch(edict_t self, edict_t other, cplane_t plane, csurface_t surf) { - edict_t dest; - int i; - - if (other.client ==null) - return; - - EdictIterator es =null; - dest = G_Find(null, findByTarget, self.target).o; - - if (dest==null) { - gi.dprintf("Couldn't find destination\n"); - return; - } - - // unlink to make sure it can't possibly interfere with KillBox - gi.unlinkentity(other); - - VectorCopy(dest.s.origin, other.s.origin); - VectorCopy(dest.s.origin, other.s.old_origin); - other.s.origin[2] += 10; - - // clear the velocity and hold them in place briefly - VectorClear(other.velocity); - other.client.ps.pmove.pm_time = 160 >> 3; // hold time - other.client.ps.pmove.pm_flags |= PMF_TIME_TELEPORT; - - // draw the teleport splash at source and on the player - self.owner.s.event = EV_PLAYER_TELEPORT; - other.s.event = EV_PLAYER_TELEPORT; - - // set angles - for (i = 0; i < 3; i++) { - other.client.ps.pmove.delta_angles[i] = (short) ANGLE2SHORT(dest.s.angles[i] - other.client.resp.cmd_angles[i]); - } - - VectorClear(other.s.angles); - VectorClear(other.client.ps.viewangles); - VectorClear(other.client.v_angle); - - // kill anything at the destination - KillBox(other); - - gi.linkentity(other); - } - }; - /*QUAKED misc_teleporter (1 0 0) (-32 -32 -24) (32 32 -16) Stepping onto this disc will teleport players to the targeted misc_teleporter_dest object. */ - public static void SP_misc_teleporter(edict_t ent) { + public static void SP_misc_teleporter(edict_t ent) + { edict_t trig; - if (ent.target==null) { + if (ent.target == null) + { gi.dprintf("teleporter without a target.\n"); G_FreeEdict(ent); return; @@ -1551,7 +722,7 @@ public class GameMisc extends GameTrigger { gi.linkentity(ent); trig = G_Spawn(); - trig.touch = teleporter_touch; + trig.touch = GameMiscAdapters.teleporter_touch; trig.solid = SOLID_TRIGGER; trig.target = ent.target; trig.owner = ent; @@ -1559,25 +730,5 @@ public class GameMisc extends GameTrigger { VectorSet(trig.mins, -8, -8, 8); VectorSet(trig.maxs, 8, 8, 24); gi.linkentity(trig); - } - - /*QUAKED misc_teleporter_dest (1 0 0) (-32 -32 -24) (32 32 -16) - Point teleporters at these. - */ - - public static EntThinkAdapter SP_misc_teleporter_dest = new EntThinkAdapter() { - public boolean think(edict_t ent) { - - gi.setmodel(ent, "models/objects/dmspot/tris.md2"); - ent.s.skinnum = 0; - ent.solid = SOLID_BBOX; - // ent.s.effects |= EF_FLIES; - VectorSet(ent.mins, -32, -32, -24); - VectorSet(ent.maxs, 32, 32, -16); - gi.linkentity(ent); - return true; - } - }; - } |