📄 gamemisc.java
字号:
}; /* * 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 String getID() { return "func_wall_use";} public void use(edict_t self, edict_t other, edict_t activator) { if (self.solid == Defines.SOLID_NOT) { self.solid = Defines.SOLID_BSP; self.svflags &= ~Defines.SVF_NOCLIENT; GameUtil.KillBox(self); } else { self.solid = Defines.SOLID_NOT; self.svflags |= Defines.SVF_NOCLIENT; } GameBase.gi.linkentity(self); if (0 == (self.spawnflags & 2)) self.use = null; } }; /* * 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 String getID() { return "func_object_touch";} 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 == Defines.DAMAGE_NO) return; GameCombat.T_Damage(other, self, self, Globals.vec3_origin, self.s.origin, Globals.vec3_origin, self.dmg, 1, 0, Defines.MOD_CRUSH); } }; static EntThinkAdapter func_object_release = new EntThinkAdapter() { public String getID() { return "func_object_release";} public boolean think(edict_t self) { self.movetype = Defines.MOVETYPE_TOSS; self.touch = func_object_touch; return true; } }; static EntUseAdapter func_object_use = new EntUseAdapter() { public String getID() { return "func_object_use";} public void use(edict_t self, edict_t other, edict_t activator) { self.solid = Defines.SOLID_BSP; self.svflags &= ~Defines.SVF_NOCLIENT; self.use = null; GameUtil.KillBox(self); func_object_release.think(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. */ public static EntDieAdapter func_explosive_explode = new EntDieAdapter() { public String getID() { return "func_explosive_explode";} 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 Math3D.VectorScale(self.size, 0.5f, size); Math3D.VectorAdd(self.absmin, size, origin); Math3D.VectorCopy(origin, self.s.origin); self.takedamage = Defines.DAMAGE_NO; if (self.dmg != 0) GameCombat.T_RadiusDamage(self, attacker, self.dmg, null, self.dmg + 40, Defines.MOD_EXPLOSIVE); Math3D.VectorSubtract(self.s.origin, inflictor.s.origin, self.velocity); Math3D.VectorNormalize(self.velocity); Math3D.VectorScale(self.velocity, 150, self.velocity); // start chunks towards the center Math3D.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] + Lib.crandom() * size[0]; chunkorigin[1] = origin[1] + Lib.crandom() * size[1]; chunkorigin[2] = origin[2] + Lib.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] + Lib.crandom() * size[0]; chunkorigin[1] = origin[1] + Lib.crandom() * size[1]; chunkorigin[2] = origin[2] + Lib.crandom() * size[2]; ThrowDebris(self, "models/objects/debris2/tris.md2", 2, chunkorigin); } GameUtil.G_UseTargets(self, attacker); if (self.dmg != 0) BecomeExplosion1(self); else GameUtil.G_FreeEdict(self); } }; public static EntUseAdapter func_explosive_use = new EntUseAdapter() { public String getID() { return "func_explosive_use";} public void use(edict_t self, edict_t other, edict_t activator) { func_explosive_explode.die(self, self, other, self.health, Globals.vec3_origin); } }; public static EntUseAdapter func_explosive_spawn = new EntUseAdapter() { public String getID() { return "func_explosive_spawn";} public void use(edict_t self, edict_t other, edict_t activator) { self.solid = Defines.SOLID_BSP; self.svflags &= ~Defines.SVF_NOCLIENT; self.use = null; GameUtil.KillBox(self); GameBase.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). */ public static EntTouchAdapter barrel_touch = new EntTouchAdapter() { public String getID() { return "barrel_touch";} 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; Math3D.VectorSubtract(self.s.origin, other.s.origin, v); M.M_walkmove(self, Math3D.vectoyaw(v), 20 * ratio * Defines.FRAMETIME); } }; public static EntThinkAdapter barrel_explode = new EntThinkAdapter() { public String getID() { return "barrel_explode";} public boolean think(edict_t self) { float[] org = { 0, 0, 0 }; float spd; float[] save = { 0, 0, 0 }; GameCombat.T_RadiusDamage(self, self.activator, self.dmg, null, self.dmg + 40, Defines.MOD_BARREL); Math3D.VectorCopy(self.s.origin, save); Math3D.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] + Lib.crandom() * self.size[0]; org[1] = self.s.origin[1] + Lib.crandom() * self.size[1]; org[2] = self.s.origin[2] + Lib.crandom() * self.size[2]; ThrowDebris(self, "models/objects/debris1/tris.md2", spd, org); org[0] = self.s.origin[0] + Lib.crandom() * self.size[0]; org[1] = self.s.origin[1] + Lib.crandom() * self.size[1]; org[2] = self.s.origin[2] + Lib.crandom() * self.size[2]; ThrowDebris(self, "models/objects/debris1/tris.md2", spd, org); // bottom corners spd = 1.75f * (float) self.dmg / 200.0f; Math3D.VectorCopy(self.absmin, org); ThrowDebris(self, "models/objects/debris3/tris.md2", spd, org); Math3D.VectorCopy(self.absmin, org); org[0] += self.size[0]; ThrowDebris(self, "models/objects/debris3/tris.md2", spd, org); Math3D.VectorCopy(self.absmin, org); org[1] += self.size[1]; ThrowDebris(self, "models/objects/debris3/tris.md2", spd, org); Math3D.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] + Lib.crandom() * self.size[0]; org[1] = self.s.origin[1] + Lib.crandom() * self.size[1]; org[2] = self.s.origin[2] + Lib.crandom() * self.size[2]; ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); org[0] = self.s.origin[0] + Lib.crandom() * self.size[0]; org[1] = self.s.origin[1] + Lib.crandom() * self.size[1]; org[2] = self.s.origin[2] + Lib.crandom() * self.size[2]; ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); org[0] = self.s.origin[0] + Lib.crandom() * self.size[0]; org[1] = self.s.origin[1] + Lib.crandom() * self.size[1]; org[2] = self.s.origin[2] + Lib.crandom() * self.size[2]; ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); org[0] = self.s.origin[0] + Lib.crandom() * self.size[0]; org[1] = self.s.origin[1] + Lib.crandom() * self.size[1]; org[2] = self.s.origin[2] + Lib.crandom() * self.size[2]; ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); org[0] = self.s.origin[0] + Lib.crandom() * self.size[0]; org[1] = self.s.origin[1] + Lib.crandom() * self.size[1]; org[2] = self.s.origin[2] + Lib.crandom() * self.size[2]; ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); org[0] = self.s.origin[0] + Lib.crandom() * self.size[0]; org[1] = self.s.origin[1] + Lib.crandom() * self.size[1]; org[2] = self.s.origin[2] + Lib.crandom() * self.size[2]; ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); org[0] = self.s.origin[0] + Lib.crandom() * self.size[0]; org[1] = self.s.origin[1] + Lib.crandom() * self.size[1]; org[2] = self.s.origin[2] + Lib.crandom() * self.size[2]; ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); org[0] = self.s.origin[0] + Lib.crandom() * self.size[0]; org[1] = self.s.origin[1] + Lib.crandom() * self.size[1]; org[2] = self.s.origin[2] + Lib.crandom() * self.size[2]; ThrowDebris(self, "models/objects/debris2/tris.md2", spd, org); Math3D.VectorCopy(save, self.s.origin); if (self.groundentity != null) BecomeExplosion2(self); else BecomeExplosion1(self); return true; } }; public static EntDieAdapter barrel_delay = new EntDieAdapter() { public String getID() { return "barrel_delay";} public void die(edict_t self, edict_t inflictor, edict_t attacker, int damage, float[] point) { self.takedamage = Defines.DAMAGE_NO; self.nextthink = GameBase.level.time + 2 * Defines.FRAMETIME; self.think = barrel_explode; self.activator = attacker; } }; // // miscellaneous specialty items // /* * QUAKED misc_blackhole (1 .5 0) (-8 -8 -8) (8 8 8) */ static EntUseAdapter misc_blackhole_use = new EntUseAdapter() { public String getID() { return "misc_blavkhole_use";} 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); */ GameUtil.G_FreeEdict(ent); } }; static EntThinkAdapter misc_blackhole_think = new EntThinkAdapter() { public String getID() { return "misc_blackhole_think";} public boolean think(edict_t self) { if (++self.s.frame < 19) self.nextthink = GameBase.level.time + Defines.FRAMETIME; else { self.s.frame = 0; self.nextthink = GameBase.level.time + Defines.FRAMETIME; } return true; } }; /* * QUAKED misc_eastertank (1 .5 0) (-32 -32 -16) (32 32 32) */ static EntThinkAdapter misc_eastertank_think = new EntThinkAdapter() { public String getID() { return "misc_eastertank_think";} public boolean think(edict_t self) { if (++self.s.frame < 293) self.nextthink = GameBase.level.time + Defines.FRAMETIME; else { self.s.frame = 254; self.nextthink = GameBase.level.time + Defines.FRAMETIME; } return true; } }; /*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -