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

📄 playerclient.java

📁 Jake2是一个Java 3D游戏引擎.
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
     *      Com_Printf("sv %3i:%i %i\n", pm.cmd.impulse, c1, c2);      * }     */    /**     * This will be called once for each client frame, which will usually be a     * couple times for each server frame.     */    public static void ClientThink(edict_t ent, usercmd_t ucmd) {        gclient_t client;        edict_t other;        int i, j;        pmove_t pm = null;        GameBase.level.current_entity = ent;        client = ent.client;        if (GameBase.level.intermissiontime != 0) {            client.ps.pmove.pm_type = Defines.PM_FREEZE;            // can exit intermission after five seconds            if (GameBase.level.time > GameBase.level.intermissiontime + 5.0f                    && 0 != (ucmd.buttons & Defines.BUTTON_ANY))                GameBase.level.exitintermission = true;            return;        }        PlayerClient.pm_passent = ent;        if (ent.client.chase_target != null) {            client.resp.cmd_angles[0] = Math3D.SHORT2ANGLE(ucmd.angles[0]);            client.resp.cmd_angles[1] = Math3D.SHORT2ANGLE(ucmd.angles[1]);            client.resp.cmd_angles[2] = Math3D.SHORT2ANGLE(ucmd.angles[2]);        } else {            // set up for pmove            pm = new pmove_t();            if (ent.movetype == Defines.MOVETYPE_NOCLIP)                client.ps.pmove.pm_type = Defines.PM_SPECTATOR;            else if (ent.s.modelindex != 255)                client.ps.pmove.pm_type = Defines.PM_GIB;            else if (ent.deadflag != 0)                client.ps.pmove.pm_type = Defines.PM_DEAD;            else                client.ps.pmove.pm_type = Defines.PM_NORMAL;            client.ps.pmove.gravity = (short) GameBase.sv_gravity.value;            pm.s.set(client.ps.pmove);            for (i = 0; i < 3; i++) {                pm.s.origin[i] = (short) (ent.s.origin[i] * 8);                pm.s.velocity[i] = (short) (ent.velocity[i] * 8);            }            if (client.old_pmove.equals(pm.s)) {                pm.snapinitial = true;                // gi.dprintf ("pmove changed!\n");            }            // this should be a copy            pm.cmd.set(ucmd);            pm.trace = PlayerClient.PM_trace; // adds default parms            pm.pointcontents = GameBase.gi.pointcontents;            // perform a pmove            GameBase.gi.Pmove(pm);            // save results of pmove            client.ps.pmove.set(pm.s);            client.old_pmove.set(pm.s);            for (i = 0; i < 3; i++) {                ent.s.origin[i] = pm.s.origin[i] * 0.125f;                ent.velocity[i] = pm.s.velocity[i] * 0.125f;            }            Math3D.VectorCopy(pm.mins, ent.mins);            Math3D.VectorCopy(pm.maxs, ent.maxs);            client.resp.cmd_angles[0] = Math3D.SHORT2ANGLE(ucmd.angles[0]);            client.resp.cmd_angles[1] = Math3D.SHORT2ANGLE(ucmd.angles[1]);            client.resp.cmd_angles[2] = Math3D.SHORT2ANGLE(ucmd.angles[2]);            if (ent.groundentity != null && null == pm.groundentity                    && (pm.cmd.upmove >= 10) && (pm.waterlevel == 0)) {                GameBase.gi.sound(ent, Defines.CHAN_VOICE, GameBase.gi                        .soundindex("*jump1.wav"), 1, Defines.ATTN_NORM, 0);                PlayerWeapon.PlayerNoise(ent, ent.s.origin, Defines.PNOISE_SELF);            }            ent.viewheight = (int) pm.viewheight;            ent.waterlevel = (int) pm.waterlevel;            ent.watertype = pm.watertype;            ent.groundentity = pm.groundentity;            if (pm.groundentity != null)                ent.groundentity_linkcount = pm.groundentity.linkcount;            if (ent.deadflag != 0) {                client.ps.viewangles[Defines.ROLL] = 40;                client.ps.viewangles[Defines.PITCH] = -15;                client.ps.viewangles[Defines.YAW] = client.killer_yaw;            } else {                Math3D.VectorCopy(pm.viewangles, client.v_angle);                Math3D.VectorCopy(pm.viewangles, client.ps.viewangles);            }            GameBase.gi.linkentity(ent);            if (ent.movetype != Defines.MOVETYPE_NOCLIP)                GameBase.G_TouchTriggers(ent);            // touch other objects            for (i = 0; i < pm.numtouch; i++) {                other = pm.touchents[i];                for (j = 0; j < i; j++)                    if (pm.touchents[j] == other)                        break;                if (j != i)                    continue; // duplicated                if (other.touch == null)                    continue;                other.touch.touch(other, ent, GameBase.dummyplane, null);            }        }        client.oldbuttons = client.buttons;        client.buttons = ucmd.buttons;        client.latched_buttons |= client.buttons & ~client.oldbuttons;        // save light level the player is standing on for        // monster sighting AI        ent.light_level = ucmd.lightlevel;        // fire weapon from final position if needed        if ((client.latched_buttons & Defines.BUTTON_ATTACK) != 0) {            if (client.resp.spectator) {                client.latched_buttons = 0;                if (client.chase_target != null) {                    client.chase_target = null;                    client.ps.pmove.pm_flags &= ~pmove_t.PMF_NO_PREDICTION;                } else                    GameChase.GetChaseTarget(ent);            } else if (!client.weapon_thunk) {                client.weapon_thunk = true;                PlayerWeapon.Think_Weapon(ent);            }        }        if (client.resp.spectator) {            if (ucmd.upmove >= 10) {                if (0 == (client.ps.pmove.pm_flags & pmove_t.PMF_JUMP_HELD)) {                    client.ps.pmove.pm_flags |= pmove_t.PMF_JUMP_HELD;                    if (client.chase_target != null)                        GameChase.ChaseNext(ent);                    else                        GameChase.GetChaseTarget(ent);                }            } else                client.ps.pmove.pm_flags &= ~pmove_t.PMF_JUMP_HELD;        }        // update chase cam if being followed        for (i = 1; i <= GameBase.maxclients.value; i++) {            other = GameBase.g_edicts[i];            if (other.inuse && other.client.chase_target == ent)                GameChase.UpdateChaseCam(other);        }    }    /**     * This will be called once for each server frame, before running any other     * entities in the world.      */    public static void ClientBeginServerFrame(edict_t ent) {        gclient_t client;        int buttonMask;        if (GameBase.level.intermissiontime != 0)            return;        client = ent.client;        if (GameBase.deathmatch.value != 0                && client.pers.spectator != client.resp.spectator                && (GameBase.level.time - client.respawn_time) >= 5) {            spectator_respawn(ent);            return;        }        // run weapon animations if it hasn't been done by a ucmd_t        if (!client.weapon_thunk && !client.resp.spectator)            PlayerWeapon.Think_Weapon(ent);        else            client.weapon_thunk = false;        if (ent.deadflag != 0) {            // wait for any button just going down            if (GameBase.level.time > client.respawn_time) {                // in deathmatch, only wait for attack button                if (GameBase.deathmatch.value != 0)                    buttonMask = Defines.BUTTON_ATTACK;                else                    buttonMask = -1;                if ((client.latched_buttons & buttonMask) != 0                        || (GameBase.deathmatch.value != 0 && 0 != ((int) GameBase.dmflags.value & Defines.DF_FORCE_RESPAWN))) {                    respawn(ent);                    client.latched_buttons = 0;                }            }            return;        }        // add player trail so monsters can follow        if (GameBase.deathmatch.value != 0)            if (!GameUtil.visible(ent, PlayerTrail.LastSpot()))                PlayerTrail.Add(ent.s.old_origin);        client.latched_buttons = 0;    }    /**      * Returns true, if the players gender flag was set to female.      */    public static boolean IsFemale(edict_t ent) {        char info;            if (null == ent.client)            return false;            info = Info.Info_ValueForKey(ent.client.pers.userinfo, "gender")                .charAt(0);        if (info == 'f' || info == 'F')            return true;        return false;    }    /**     * Returns true, if the players gender flag was neither set to female nor to     * male.     */    public static boolean IsNeutral(edict_t ent) {        char info;            if (ent.client == null)            return false;            info = Info.Info_ValueForKey(ent.client.pers.userinfo, "gender")                .charAt(0);            if (info != 'f' && info != 'F' && info != 'm' && info != 'M')            return true;        return false;    }    /**     * Changes the camera view to look at the killer.     */    public static void LookAtKiller(edict_t self, edict_t inflictor,            edict_t attacker) {        float dir[] = { 0, 0, 0 };            edict_t world = GameBase.g_edicts[0];            if (attacker != null && attacker != world && attacker != self) {            Math3D.VectorSubtract(attacker.s.origin, self.s.origin, dir);        } else if (inflictor != null && inflictor != world && inflictor != self) {            Math3D.VectorSubtract(inflictor.s.origin, self.s.origin, dir);        } else {            self.client.killer_yaw = self.s.angles[Defines.YAW];            return;        }            if (dir[0] != 0)            self.client.killer_yaw = (float) (180 / Math.PI * Math.atan2(                    dir[1], dir[0]));        else {            self.client.killer_yaw = 0;            if (dir[1] > 0)                self.client.killer_yaw = 90;            else if (dir[1] < 0)                self.client.killer_yaw = -90;        }        if (self.client.killer_yaw < 0)            self.client.killer_yaw += 360;        }            /**      * Drop items and weapons in deathmatch games.      */     public static void TossClientWeapon(edict_t self) {        gitem_t item;        edict_t drop;        boolean quad;        float spread;            if (GameBase.deathmatch.value == 0)            return;            item = self.client.pers.weapon;        if (0 == self.client.pers.inventory[self.client.ammo_index])            item = null;        if (item != null && (Lib.strcmp(item.pickup_name, "Blaster") == 0))            item = null;            if (0 == ((int) (GameBase.dmflags.value) & Defines.DF_QUAD_DROP))            quad = false;        else            quad = (self.client.quad_framenum > (GameBase.level.framenum + 10));            if (item != null && quad)            spread = 22.5f;        else            spread = 0.0f;            if (item != null) {            self.client.v_angle[Defines.YAW] -= spread;            drop = GameItems.Drop_Item(self, item);            self.client.v_angle[Defines.YAW] += spread;            drop.spawnflags = Defines.DROPPED_PLAYER_ITEM;        }            if (quad) {            self.client.v_angle[Defines.YAW] += spread;            drop = GameItems.Drop_Item(self, GameItems                    .FindItemByClassname("item_quad"));            self.client.v_angle[Defines.YAW] -= spread;            drop.spawnflags |= Defines.DROPPED_PLAYER_ITEM;                drop.touch = GameItems.Touch_Item;            drop.nextthink = GameBase.level.time                    + (self.client.quad_framenum - GameBase.level.framenum)                    * Defines.FRAMETIME;            drop.think = GameUtil.G_FreeEdictA;        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -