📄 playerclient.java
字号:
/* * Copyright (C) 1997-2001 Id Software, Inc. * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License as published by the Free Software * Foundation; either version 2 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. * * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., 59 Temple * Place - Suite 330, Boston, MA 02111-1307, USA. * */// Created on 28.12.2003 by RST.// $Id: PlayerClient.java,v 1.12 2005/12/27 21:02:30 salomo Exp $package jake2.game;import jake2.Defines;import jake2.game.monsters.M_Player;import jake2.game.pmove_t.TraceAdapter;import jake2.util.Lib;import jake2.util.Math3D;public class PlayerClient { public static int player_die_i = 0; /** * player_die. */ static EntDieAdapter player_die = new EntDieAdapter() { public String getID() { return "player_die"; } public void die(edict_t self, edict_t inflictor, edict_t attacker, int damage, float[] point) { int n; Math3D.VectorClear(self.avelocity); self.takedamage = Defines.DAMAGE_YES; self.movetype = Defines.MOVETYPE_TOSS; self.s.modelindex2 = 0; // remove linked weapon model self.s.angles[0] = 0; self.s.angles[2] = 0; self.s.sound = 0; self.client.weapon_sound = 0; self.maxs[2] = -8; // self.solid = SOLID_NOT; self.svflags |= Defines.SVF_DEADMONSTER; if (self.deadflag == 0) { self.client.respawn_time = GameBase.level.time + 1.0f; PlayerClient.LookAtKiller(self, inflictor, attacker); self.client.ps.pmove.pm_type = Defines.PM_DEAD; ClientObituary(self, inflictor, attacker); PlayerClient.TossClientWeapon(self); if (GameBase.deathmatch.value != 0) Cmd.Help_f(self); // show scores // clear inventory // this is kind of ugly, but it's how we want to handle keys in // coop for (n = 0; n < GameBase.game.num_items; n++) { if (GameBase.coop.value != 0 && (GameItemList.itemlist[n].flags & Defines.IT_KEY) != 0) self.client.resp.coop_respawn.inventory[n] = self.client.pers.inventory[n]; self.client.pers.inventory[n] = 0; } } // remove powerups self.client.quad_framenum = 0; self.client.invincible_framenum = 0; self.client.breather_framenum = 0; self.client.enviro_framenum = 0; self.flags &= ~Defines.FL_POWER_ARMOR; if (self.health < -40) { // gib GameBase.gi .sound(self, Defines.CHAN_BODY, GameBase.gi .soundindex("misc/udeath.wav"), 1, Defines.ATTN_NORM, 0); for (n = 0; n < 4; n++) GameMisc.ThrowGib(self, "models/objects/gibs/sm_meat/tris.md2", damage, Defines.GIB_ORGANIC); GameMisc.ThrowClientHead(self, damage); self.takedamage = Defines.DAMAGE_NO; } else { // normal death if (self.deadflag == 0) { player_die_i = (player_die_i + 1) % 3; // start a death animation self.client.anim_priority = Defines.ANIM_DEATH; if ((self.client.ps.pmove.pm_flags & pmove_t.PMF_DUCKED) != 0) { self.s.frame = M_Player.FRAME_crdeath1 - 1; self.client.anim_end = M_Player.FRAME_crdeath5; } else switch (player_die_i) { case 0: self.s.frame = M_Player.FRAME_death101 - 1; self.client.anim_end = M_Player.FRAME_death106; break; case 1: self.s.frame = M_Player.FRAME_death201 - 1; self.client.anim_end = M_Player.FRAME_death206; break; case 2: self.s.frame = M_Player.FRAME_death301 - 1; self.client.anim_end = M_Player.FRAME_death308; break; } GameBase.gi.sound(self, Defines.CHAN_VOICE, GameBase.gi .soundindex("*death" + ((Lib.rand() % 4) + 1) + ".wav"), 1, Defines.ATTN_NORM, 0); } } self.deadflag = Defines.DEAD_DEAD; GameBase.gi.linkentity(self); } }; static EntThinkAdapter SP_FixCoopSpots = new EntThinkAdapter() { public String getID() { return "SP_FixCoopSpots"; } public boolean think(edict_t self) { edict_t spot; float[] d = { 0, 0, 0 }; spot = null; EdictIterator es = null; while (true) { es = GameBase.G_Find(es, GameBase.findByClass, "info_player_start"); if (es == null) return true; spot = es.o; if (spot.targetname == null) continue; Math3D.VectorSubtract(self.s.origin, spot.s.origin, d); if (Math3D.VectorLength(d) < 384) { if ((self.targetname == null) || Lib.Q_stricmp(self.targetname, spot.targetname) != 0) { // gi.dprintf("FixCoopSpots changed %s at %s targetname // from %s to %s\n", self.classname, // vtos(self.s.origin), self.targetname, // spot.targetname); self.targetname = spot.targetname; } return true; } } } }; static EntThinkAdapter SP_CreateCoopSpots = new EntThinkAdapter() { public String getID() { return "SP_CreateCoopSpots"; } public boolean think(edict_t self) { edict_t spot; if (Lib.Q_stricmp(GameBase.level.mapname, "security") == 0) { spot = GameUtil.G_Spawn(); spot.classname = "info_player_coop"; spot.s.origin[0] = 188 - 64; spot.s.origin[1] = -164; spot.s.origin[2] = 80; spot.targetname = "jail3"; spot.s.angles[1] = 90; spot = GameUtil.G_Spawn(); spot.classname = "info_player_coop"; spot.s.origin[0] = 188 + 64; spot.s.origin[1] = -164; spot.s.origin[2] = 80; spot.targetname = "jail3"; spot.s.angles[1] = 90; spot = GameUtil.G_Spawn(); spot.classname = "info_player_coop"; spot.s.origin[0] = 188 + 128; spot.s.origin[1] = -164; spot.s.origin[2] = 80; spot.targetname = "jail3"; spot.s.angles[1] = 90; } return true; } }; // player pain is handled at the end of the frame in P_DamageFeedback static EntPainAdapter player_pain = new EntPainAdapter() { public String getID() { return "player_pain"; } public void pain(edict_t self, edict_t other, float kick, int damage) { } }; static EntDieAdapter body_die = new EntDieAdapter() { public String getID() { return "body_die"; } public void die(edict_t self, edict_t inflictor, edict_t attacker, int damage, float[] point) { int n; if (self.health < -40) { GameBase.gi.sound(self, Defines.CHAN_BODY, GameBase.gi.soundindex("misc/udeath.wav"), 1, Defines.ATTN_NORM, 0); for (n = 0; n < 4; n++) GameMisc.ThrowGib(self, "models/objects/gibs/sm_meat/tris.md2", damage, Defines.GIB_ORGANIC); self.s.origin[2] -= 48; GameMisc.ThrowClientHead(self, damage); self.takedamage = Defines.DAMAGE_NO; } } }; static edict_t pm_passent; // pmove doesn't need to know about passent and contentmask public static pmove_t.TraceAdapter PM_trace = new pmove_t.TraceAdapter() { public trace_t trace(float[] start, float[] mins, float[] maxs, float[] end) { if (pm_passent.health > 0) return GameBase.gi.trace(start, mins, maxs, end, pm_passent, Defines.MASK_PLAYERSOLID); else return GameBase.gi.trace(start, mins, maxs, end, pm_passent, Defines.MASK_DEADSOLID); } }; /** * QUAKED info_player_start (1 0 0) (-16 -16 -24) (16 16 32) The normal * starting point for a level. */ public static void SP_info_player_start(edict_t self) { if (GameBase.coop.value == 0) return; if (Lib.Q_stricmp(GameBase.level.mapname, "security") == 0) { // invoke one of our gross, ugly, disgusting hacks self.think = PlayerClient.SP_CreateCoopSpots; self.nextthink = GameBase.level.time + Defines.FRAMETIME; } } /** * QUAKED info_player_deathmatch (1 0 1) (-16 -16 -24) (16 16 32) potential * spawning position for deathmatch games. */ public static void SP_info_player_deathmatch(edict_t self) { if (0 == GameBase.deathmatch.value) { GameUtil.G_FreeEdict(self); return; } GameMisc.SP_misc_teleporter_dest.think(self); } /** * QUAKED info_player_coop (1 0 1) (-16 -16 -24) (16 16 32) potential * spawning position for coop games. */ public static void SP_info_player_coop(edict_t self) { if (0 == GameBase.coop.value) { GameUtil.G_FreeEdict(self); return; } if ((Lib.Q_stricmp(GameBase.level.mapname, "jail2") == 0) || (Lib.Q_stricmp(GameBase.level.mapname, "jail4") == 0) || (Lib.Q_stricmp(GameBase.level.mapname, "mine1") == 0) || (Lib.Q_stricmp(GameBase.level.mapname, "mine2") == 0) || (Lib.Q_stricmp(GameBase.level.mapname, "mine3") == 0) || (Lib.Q_stricmp(GameBase.level.mapname, "mine4") == 0) || (Lib.Q_stricmp(GameBase.level.mapname, "lab") == 0) || (Lib.Q_stricmp(GameBase.level.mapname, "boss1") == 0) || (Lib.Q_stricmp(GameBase.level.mapname, "fact3") == 0) || (Lib.Q_stricmp(GameBase.level.mapname, "biggun") == 0) || (Lib.Q_stricmp(GameBase.level.mapname, "space") == 0) || (Lib.Q_stricmp(GameBase.level.mapname, "command") == 0) || (Lib.Q_stricmp(GameBase.level.mapname, "power2") == 0) || (Lib.Q_stricmp(GameBase.level.mapname, "strike") == 0)) { // invoke one of our gross, ugly, disgusting hacks self.think = PlayerClient.SP_FixCoopSpots; self.nextthink = GameBase.level.time + Defines.FRAMETIME; } } /** * QUAKED info_player_intermission (1 0 1) (-16 -16 -24) (16 16 32) The * deathmatch intermission point will be at one of these Use 'angles' * instead of 'angle', so you can set pitch or roll as well as yaw. 'pitch * yaw roll' */ public static void SP_info_player_intermission() { } public static void ClientObituary(edict_t self, edict_t inflictor, edict_t attacker) { int mod; String message; String message2; boolean ff; if (GameBase.coop.value != 0 && attacker.client != null) GameBase.meansOfDeath |= Defines.MOD_FRIENDLY_FIRE; if (GameBase.deathmatch.value != 0 || GameBase.coop.value != 0) { ff = (GameBase.meansOfDeath & Defines.MOD_FRIENDLY_FIRE) != 0; mod = GameBase.meansOfDeath & ~Defines.MOD_FRIENDLY_FIRE; message = null; message2 = ""; switch (mod) { case Defines.MOD_SUICIDE: message = "suicides"; break; case Defines.MOD_FALLING: message = "cratered"; break; case Defines.MOD_CRUSH: message = "was squished"; break; case Defines.MOD_WATER: message = "sank like a rock"; break; case Defines.MOD_SLIME: message = "melted"; break; case Defines.MOD_LAVA: message = "does a back flip into the lava";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -