Called for each player at the end of the server frame and right after spawning.
(SubgameEntity ent, GameExportsImpl gameExports)
| 964 | * spawning. |
| 965 | */ |
| 966 | void ClientEndServerFrame(SubgameEntity ent, GameExportsImpl gameExports) { |
| 967 | float bobtime; |
| 968 | int i; |
| 969 | |
| 970 | current_player = ent; |
| 971 | current_client = ent.getClient(); |
| 972 | |
| 973 | // |
| 974 | // If the origin or velocity have changed since ClientThink(), |
| 975 | // update the pmove values. This will happen when the client |
| 976 | // is pushed by a bmodel or kicked by an explosion. |
| 977 | // |
| 978 | // If it wasn't updated here, the view position would lag a frame |
| 979 | // behind the body position when pushed -- "sinking into plats" |
| 980 | // |
| 981 | for (i = 0; i < 3; i++) { |
| 982 | current_client.getPlayerState().pmove.origin[i] = (short) (ent.s.origin[i] * 8.0); |
| 983 | current_client.getPlayerState().pmove.velocity[i] = (short) (ent.velocity[i] * 8.0); |
| 984 | } |
| 985 | |
| 986 | // |
| 987 | // If the end of unit layout is displayed, don't give |
| 988 | // the player any normal movement attributes |
| 989 | // |
| 990 | if (gameExports.level.intermissiontime != 0) { |
| 991 | // FIXME: add view drifting here? |
| 992 | current_client.getPlayerState().blend[3] = 0; |
| 993 | current_client.getPlayerState().fov = 90; |
| 994 | PlayerHud.G_SetStats(ent, gameExports); |
| 995 | return; |
| 996 | } |
| 997 | |
| 998 | Math3D.AngleVectors(current_client.v_angle, forward, right, up); |
| 999 | |
| 1000 | // burn from lava, etc |
| 1001 | P_WorldEffects(gameExports); |
| 1002 | |
| 1003 | // |
| 1004 | // set model angles from view angles so other things in |
| 1005 | // the world can tell which direction you are looking |
| 1006 | // |
| 1007 | if (current_client.v_angle[Defines.PITCH] > 180) |
| 1008 | ent.s.angles[Defines.PITCH] = (-360 + current_client.v_angle[Defines.PITCH]) / 3; |
| 1009 | else |
| 1010 | ent.s.angles[Defines.PITCH] = current_client.v_angle[Defines.PITCH] / 3; |
| 1011 | ent.s.angles[Defines.YAW] = current_client.v_angle[Defines.YAW]; |
| 1012 | ent.s.angles[Defines.ROLL] = 0; |
| 1013 | ent.s.angles[Defines.ROLL] = SV_CalcRoll(ent.s.angles, ent.velocity) * 4; |
| 1014 | |
| 1015 | // |
| 1016 | // calculate speed and cycle to be used for |
| 1017 | // all cyclic walking effects |
| 1018 | // |
| 1019 | xyspeed = (float) Math.sqrt(ent.velocity[0] * ent.velocity[0] |
| 1020 | + ent.velocity[1] * ent.velocity[1]); |
| 1021 | |
| 1022 | if (xyspeed < 5) { |
| 1023 | bobmove = 0; |
no test coverage detected