⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playerclient.java

📁 Jake2是一个Java 3D游戏引擎.
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
/* * 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 + -