📄 playerclient.java
字号:
* 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 + -