Xonotic
cl_player.qc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011 Rudolf Polzer
3  * Copyright (c) 2015 Micah Talkiewicz
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a copy
6  * of this software and associated documentation files (the "Software"), to
7  * deal in the Software without restriction, including without limitation the
8  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9  * sell copies of the Software, and to permit persons to whom the Software is
10  * furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be included in
13  * all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  */
23 #include "cl_player.qh"
24 
25 #include "cl_model.qh"
26 #include "common.qh"
27 #include "interpolate.qh"
28 
31 
32 // engine stuff
33 float pmove_onground; // weird engine flag we shouldn't really use but have to for now
34 
43 
45 {
46  if (time >= csqcplayer_predictionerrortime) return '0 0 0';
48 }
49 
51 {
52  if (time >= csqcplayer_predictionerrortime) return '0 0 0';
54 }
55 
56 void CSQCPlayer_SetPredictionError(vector o, vector v, float onground_diff)
57 {
58  // error too big to compensate, we LIKELY hit a teleport or a
59  // jumppad, or it's a jump time disagreement that'll get fixed
60  // next frame
61 
62  // FIXME we sometimes have disagreement in order of jump velocity. Do not act on them!
63  /*
64  // commented out as this one did not help
65  if(onground_diff)
66  {
67  printf("ONGROUND MISMATCH: %d x=%v v=%v\n", onground_diff, o, v);
68  return;
69  }
70  */
71  if(vdist(o, >, 32) || vdist(v, >, 192))
72  {
73  //printf("TOO BIG: x=%v v=%v\n", o, v);
74  return;
75  }
76 
78  {
80  return;
81  }
82 
87 }
88 
90 {
92  if (csqcplayer_status != CSQCPLAYERSTATUS_PREDICTED) LOG_FATALF("Cannot unpredict in current status (%d)", csqcplayer_status);
95  csqcplayer_moveframe = csqcplayer_sequence + 1; // + 1 because the recieved frame has the move already done (server side)
96  this.flags = player_pmflags;
97 }
98 
100 {
101  if (IS_DUCKED(this) || !(this.isplayermodel & ISPLAYER_PLAYER))
102  {
103  this.mins = PHYS_PL_CROUCH_MIN(this);
104  this.maxs = PHYS_PL_CROUCH_MAX(this);
105  this.view_ofs = PHYS_PL_CROUCH_VIEWOFS(this);
106  }
107  else
108  {
109  this.mins = PHYS_PL_MIN(this);
110  this.maxs = PHYS_PL_MAX(this);
111  if (IS_DEAD(this))
112  this.maxs.z = 5;
113  this.view_ofs = PHYS_PL_VIEWOFS(this);
114  }
115 }
116 
118 {
119  player_pmflags = this.flags;
120  csqcplayer_origin = this.origin;
124 }
125 
127 
129 {
130  if(!autocvar_cl_movement) { return; }
131 
132  //_Movetype_CheckWater(this); // we apparently need to check water *before* physics so it can use this for water jump
133 
134  vector oldv_angle = this.v_angle;
135  vector oldangles = this.angles; // we need to save these, as they're abused by other code
136  this.v_angle = PHYS_INPUT_ANGLES(this);
137  this.angles = PHYS_WORLD_ANGLES(this);
138 
140 
141  Movetype_Physics_NoMatchTicrate(this, PHYS_INPUT_TIMELENGTH, true);
142 
143  view_angles = this.v_angle;
144  input_angles = this.angles;
145  this.v_angle = oldv_angle;
146  this.angles = oldangles;
147 
148  this.pmove_flags =
149  ((IS_DUCKED(this)) ? PMF_DUCKED : 0) |
150  ((IS_JUMP_HELD(this)) ? PMF_JUMP_HELD : 0) |
151  ((IS_ONGROUND(this)) ? PMF_ONGROUND : 0);
152 }
153 
154 void CSQCPlayer_PredictTo(entity this, float endframe, bool apply_error)
155 {
156  CSQCPlayer_Unpredict(this);
157  if (apply_error)
158  {
161  }
163 
165 
166 #if 0
167  // we don't need this
168  // darkplaces makes servercommandframe == 0 in these cases anyway
169  if (STAT(HEALTH) <= 0)
170  {
172  getinputstate(csqcplayer_moveframe-1);
173  LOG_INFO("the Weird code path got hit");
174  return;
175  }
176 #endif
177 
178  if (csqcplayer_moveframe >= endframe)
179  {
180  getinputstate(csqcplayer_moveframe - 1);
181  }
182  else
183  {
184  do
185  {
186  if (!getinputstate(csqcplayer_moveframe)) break;
187  /*if (input_timelength > 0.0005)
188  {
189  if (input_timelength > 0.05)
190  {
191  input_timelength /= 2;
192  CSQCPlayer_Physics(this);
193  }
194  CSQCPlayer_Physics(this);
195  }*/
196  CSQCPlayer_Physics(this);
199  }
200  while (csqcplayer_moveframe < endframe);
201  }
202 
203  // add in anything that was applied after (for low packet rate protocols)
205 }
206 
208 {
209  return (this == csqcplayer);
210 }
211 
218 {
219  float smoothtime = bound(0, time - smooth_prevtime, 0.1);
220  smooth_prevtime = max(smooth_prevtime, drawtime); // drawtime is the previous frame's time at this point
221 
222  if(this.csqcmodel_teleported || !(this.pmove_flags & PMF_ONGROUND) || autocvar_cl_stairsmoothspeed <= 0 || this.ground_networkentity)
223  stairsmoothz = v.z;
224  else
225  {
226  if(stairsmoothz < v.z)
227  v.z = stairsmoothz = bound(v.z - PHYS_STEPHEIGHT(this), stairsmoothz + smoothtime * autocvar_cl_stairsmoothspeed, v.z);
228  else if(stairsmoothz > v.z)
229  v.z = stairsmoothz = bound(v.z, stairsmoothz - smoothtime * autocvar_cl_stairsmoothspeed, v.z + PHYS_STEPHEIGHT(this));
230  }
231 
232  float viewheight = bound(0, (time - smooth_prevtime) / max(0.0001, autocvar_cl_smoothviewheight), 1);
233  viewheightavg = viewheightavg * (1 - viewheight) + this.view_ofs.z * viewheight;
234  v.z += viewheightavg;
235 
237 
238  return v;
239 }
240 
241 // simplified copy of CSQCPlayer_ApplySmoothing for use on player models
244 .float stairsmooth_drawtime; // holds the previous draw time
246 {
247  float smoothtime = bound(0, time - this.stairsmooth_prevtime, 0.1);
248  this.stairsmooth_prevtime = max(this.stairsmooth_prevtime, this.stairsmooth_drawtime); // stairsmooth_drawtime is the previous frame's time at this point
249 
250  if(this.csqcmodel_teleported || !isonground || autocvar_cl_stairsmoothspeed <= 0 || this.ground_networkentity)
251  this.stairsmooth_offset = v.z;
252  else
253  {
254  if(this.stairsmooth_offset < v.z)
255  v.z = this.stairsmooth_offset = bound(v.z - PHYS_STEPHEIGHT(this), this.stairsmooth_offset + smoothtime * autocvar_cl_stairsmoothspeed, v.z);
256  else if(this.stairsmooth_offset > v.z)
257  v.z = this.stairsmooth_offset = bound(v.z, this.stairsmooth_offset - smoothtime * autocvar_cl_stairsmoothspeed, v.z + PHYS_STEPHEIGHT(this));
258  }
259 
260  this.stairsmooth_prevtime = time;
262 
263  return v;
264 }
265 
269 {
271  return;
273 }
274 
283 {
285  return;
289  //setproperty(VF_CL_VIEWANGLES, view_angles); // update view angles as well so we can aim
290 }
291 
292 float autocvar_cl_bob = 0;
297 float autocvar_cl_bobup = 0.5;
298 float autocvar_cl_bobfall = 0.05;
308 {
309  if(this.csqcmodel_isdead || PHYS_INVEHICLE(this) || !(this.isplayermodel & ISPLAYER_PLAYER))
310  return v;
311 
312  // bounded XY speed, used by several effects below
313  float bob, cycle;
314 
315  // vertical view bobbing code
317  {
318  float bob_limit = autocvar_cl_bob_limit;
319 
321  {
322  // use traces to determine what range the view can bob in, and scale down the bob as needed
323  vector bob_height_check_dest = v;
324  bob_height_check_dest.z += autocvar_cl_bob_limit * 1.1;
325  traceline(v, bob_height_check_dest, MOVE_NOMONSTERS, NULL);
326  float trace1fraction = trace_fraction;
327 
328  bob_height_check_dest = v;
329  bob_height_check_dest.z += autocvar_cl_bob_limit * -0.5;
330  traceline(v, bob_height_check_dest, MOVE_NOMONSTERS, NULL);
331  float trace2fraction = trace_fraction;
332 
333  bob_limit *= min(trace1fraction, trace2fraction);
334  }
335 
336  // LordHavoc: figured out bobup: the time at which the sin is at 180
337  // degrees (which allows lengthening or squishing the peak or valley)
338  cycle = time / autocvar_cl_bobcycle;
339  cycle -= rint(cycle);
340  if(cycle < autocvar_cl_bobup)
341  cycle = sin(M_PI * cycle / autocvar_cl_bobup);
342  else
343  cycle = sin(M_PI + M_PI * (cycle - autocvar_cl_bobup) / (1.0 - autocvar_cl_bobup));
344  // bob is proportional to velocity in the xy plane
345  // (don't count Z, or jumping messes it up)
346  float xyspeed = bound(0, sqrt(this.velocity.x * this.velocity.x + this.velocity.y * this.velocity.y), autocvar_cl_bob_velocity_limit);
347  bob = xyspeed * autocvar_cl_bob;
348  bob = bound(0, bob, bob_limit);
349  bob = bob * 0.3 + bob * 0.7 * cycle;
350  v.z += bob;
351  }
352 
353  // horizontal view bobbing code
355  {
356  cycle = time / autocvar_cl_bob2cycle;
357  cycle -= rint(cycle);
358  if(cycle < 0.5)
359  cycle = cos(M_PI * cycle / 0.5); // cos looks better here with the other view bobbing using sin
360  else
361  cycle = cos(M_PI + M_PI * (cycle - 0.5) / 0.5);
362  bob = autocvar_cl_bob2 * cycle;
363 
364  // this value slowly decreases from 1 to 0 when we stop touching the ground.
365  // The cycle is later multiplied with it so the view smooths back to normal
366  if(IS_ONGROUND(this) && !(input_buttons & BIT(1))) // also block the effect while the jump button is pressed, to avoid twitches when bunny-hopping
367  bob2_smooth = 1;
368  else
369  {
370  if(bob2_smooth > 0)
372  else
373  bob2_smooth = 0;
374  }
375 
376  // calculate the front and side of the player between the X and Y axes
378  // now get the speed based on those angles. The bounds should match the same value as xyspeed's
381  v_forward = v_forward * bob;
382  v_right = v_right * bob;
383  // we use side with forward and front with right, so the bobbing goes
384  // to the side when we walk forward and to the front when we strafe
385  vector bob2vel;
386  bob2vel.x = side * v_forward.x + front * v_right.x + 0 * v_up.x;
387  bob2vel.y = side * v_forward.y + front * v_right.y + 0 * v_up.y;
388  bob2vel.z = side * v_forward.z + front * v_right.z + 0 * v_up.z;
389  v.x += bob2vel.x;
390  v.y += bob2vel.y;
391  }
392 
393  // fall bobbing code
394  // causes the view to swing down and back up when touching the ground
396  {
397  if(!IS_ONGROUND(this))
398  {
399  bobfall_speed = bound(-400, this.velocity.z, 0) * bound(0, autocvar_cl_bobfall, 0.1);
401  bobfall_swing = 1;
402  else
403  bobfall_swing = 0; // really?
404  }
405  else
406  {
408  float bobfall = sin(M_PI * bobfall_swing) * bobfall_speed;
409  v.z += bobfall;
410  }
411  }
412 
413  return v;
414 }
415 
419 {
421  float side = (this.velocity * v_right);
422  float sign = (side < 0) ? -1 : 1;
423  side = fabs(side);
424 
425  if(side < autocvar_cl_rollspeed)
427  else
428  side = autocvar_cl_rollangle;
429 
430  return side * sign;
431 }
432 
438 {
439  vector forward;
440  vector chase_dest;
441 
443  {
444  view_angles.x = 0;
446  forward = v_forward;
447  vector up = v_up;
448  // trace a little further so it hits a surface more consistently (to avoid 'snapping' on the edge of the range)
449  chase_dest.x = v.x - forward.x * autocvar_chase_back + up.x * autocvar_chase_up;
450  chase_dest.y = v.y - forward.y * autocvar_chase_back + up.y * autocvar_chase_up;
451  chase_dest.z = v.z - forward.z * autocvar_chase_back + up.z * autocvar_chase_up;
452 
453  // trace from first person view location to our chosen third person view location
454  traceline(v, chase_dest, MOVE_NOMONSTERS, NULL);
455 
456  vector bestvieworg = trace_endpos;
457  vector offset = '0 0 0';
458  for(offset.x = -16; offset.x <= 16; offset.x += 8)
459  {
460  for(offset.y = -16; offset.y <= 16; offset.y += 8)
461  {
463  up = v_up;
464  chase_dest.x = v.x - forward.x * autocvar_chase_back + up.x * autocvar_chase_up + offset.x;
465  chase_dest.y = v.y - forward.y * autocvar_chase_back + up.y * autocvar_chase_up + offset.y;
466  chase_dest.z = v.z - forward.z * autocvar_chase_back + up.z * autocvar_chase_up + offset.z;
467  traceline(v, chase_dest, MOVE_NOMONSTERS, NULL);
468  if(bestvieworg.z > trace_endpos.z)
469  bestvieworg.z = trace_endpos.z;
470  }
471  }
472  bestvieworg.z -= 8;
473  v = bestvieworg;
474 
476  //setproperty(VF_CL_VIEWANGLES, view_angles); // update view angles as well so we can aim
477  }
478  else
479  {
481  forward = v_forward;
483  forward = normalize(forward * -1);
484  // trace a little further so it hits a surface more consistently (to avoid 'snapping' on the edge of the range)
485  float cdist = -autocvar_chase_back - 8;
486  chase_dest.x = v.x + forward.x * cdist;
487  chase_dest.y = v.y + forward.y * cdist;
488  chase_dest.z = v.z + forward.z * cdist + autocvar_chase_up;
489  if (this.move_movetype == MOVETYPE_NOCLIP)
490  {
491  // as if traceline hasn't hit anything
492  trace_endpos = chase_dest;
493  trace_plane_normal = '0 0 0';
494  }
495  else
496  {
497  traceline(v, chase_dest, MOVE_NOMONSTERS, NULL);
498  }
499  v.x = 1 * trace_endpos.x + 8 * forward.x + 4 * trace_plane_normal.x;
500  v.y = 1 * trace_endpos.y + 8 * forward.y + 4 * trace_plane_normal.y;
501  v.z = 1 * trace_endpos.z + 8 * forward.z + 4 * trace_plane_normal.z;
502 
504  {
505  // now flip the view so the player is looking at themselves
506  vector newang = vectoangles(forward);
507  view_angles.x = view_angles.x * -1; // inverse up-down looking direction
508  view_angles.y = newang.y;
509  }
510  }
511 
512 #if 0
513  tracebox(v, '-4 -4 -4', '4 4 4', v - v_forward * autocvar_chase_back, MOVE_NORMAL, this);
514  v = trace_endpos;
515  tracebox(v, '-4 -4 -4', '4 4 4', v + v_up * autocvar_chase_up, MOVE_NORMAL, this);
516  v = trace_endpos;
517 #endif
518  return v;
519 }
520 
522 {
523  vector vieworg = this.origin;
524  if(intermission)
525  {
526  // just update view offset, don't need to do anything else
527  vieworg.z += this.view_ofs.z;
528  }
529  else
530  {
531  vieworg = CSQCPlayer_ApplySmoothing(this, vieworg);
533  vieworg = CSQCPlayer_ApplyChase(this, vieworg);
534  else
535  {
536  // angles
539  view_angles.z += CSQCPlayer_CalcRoll(this);
540  // TODO? we don't have damage time accessible here
541  // origin
542  vieworg = vieworg + view_punchvector;
543  vieworg = CSQCPlayer_ApplyBobbing(this, vieworg);
544  }
546  }
547  setproperty(VF_ORIGIN, vieworg);
548  setproperty(VF_ANGLES, view_angles);
549 }
550 
552 
555 {
556  vector v0 = ((intermission && !autocvar_cl_movement_intermissionrunning) ? '0 0 0' : pmove_vel); // TRICK: pmove_vel is set by the engine when we get here. No need to network velocity
557  float vh = PHYS_VIEWHEIGHT(NULL);
558  vector pl_viewofs = PHYS_PL_VIEWOFS(NULL);
559  vector pl_viewofs_crouch = PHYS_PL_CROUCH_VIEWOFS(NULL);
560  entity e = csqcplayer;
561  if (e)
562  {
563  if (servercommandframe == 0 || clientcommandframe == 0)
564  {
566  e.view_ofs = '0 0 1' * vh;
567 
568  // get crouch state from the server
569  if (vh == pl_viewofs.z) e.flags &= ~FL_DUCKED;
570  else if (vh == pl_viewofs_crouch.z) e.flags |= FL_DUCKED;
571 
572  // get onground state from the server
573  e.flags = BITSET(e.flags, FL_ONGROUND, pmove_onground);
574 
576 
577  // override it back just in case
578  e.view_ofs = '0 0 1' * vh;
579 
580  // set velocity
581  e.velocity = v0;
582  }
583  else
584  {
585  int flg = e.iflags; e.iflags &= ~(IFLAG_ORIGIN | IFLAG_ANGLES);
587  e.iflags = flg;
588 
590  {
591  vector o = e.origin;
594  CSQCPlayer_SetPredictionError(e.origin - o, e.velocity - v0, pmove_onground - IS_ONGROUND(e));
595  e.origin = o;
596  e.velocity = v0;
597 
598  // get crouch state from the server
599  if (vh == pl_viewofs.z) e.flags &= ~FL_DUCKED;
600  else if(vh == pl_viewofs_crouch.z) e.flags |= FL_DUCKED;
601 
602  // get onground state from the server
603  e.flags = BITSET(e.flags, FL_ONGROUND, pmove_onground);
604 
606  }
608 
609 #ifdef CSQCMODEL_SERVERSIDE_CROUCH
610  // get crouch state from the server (LAG)
611  if (vh == pl_viewofs.z) e.flags &= ~FL_DUCKED;
612  else if (vh == pl_viewofs_crouch.z) e.flags |= FL_DUCKED;
613 #endif
615 
616  if (!IS_DEAD(e))
617  e.angles.y = input_angles.y;
618  }
619 
620  // relink
621  e.stairsmooth_drawtime = drawtime; // since drawtime is a frame old at this point, copy it now to avoid using a drawtime 2 frames old!
622  e.origin = CSQCModel_ApplyStairSmoothing(e, (e.pmove_flags & PMF_ONGROUND), e.origin);
623  setorigin(e, e.origin);
624  }
625 
627  if (view)
628  {
629  if (view != csqcplayer)
630  {
631  InterpolateOrigin_Do(view);
632  view.view_ofs = '0 0 1' * vh;
633  }
635  {
636  int refdefflags = 0;
637  if (view.csqcmodel_teleported) refdefflags |= REFDEFFLAG_TELEPORTED;
638  if (input_buttons & BIT(1)) refdefflags |= REFDEFFLAG_JUMPING;
639  // note: these two only work in WIP2, but are harmless in WIP1
640  if (PHYS_HEALTH(NULL) <= 0 && PHYS_HEALTH(NULL) != -666 && PHYS_HEALTH(NULL) != -2342) refdefflags |= REFDEFFLAG_DEAD;
641  if (intermission) refdefflags |= REFDEFFLAG_INTERMISSION;
642  V_CalcRefdef(view, refdefflags); // TODO? uses .health stat in the engine when this isn't called here, may be broken!
643  }
644  else
645  {
646  CSQCPlayer_CalcRefdef(view);
647  }
648  }
649  else
650  {
651  // FIXME by CSQC spec we have to do this:
652  // but it breaks chase cam
653  /*
654  setproperty(VF_ORIGIN, pmove_org + '0 0 1' * vh);
655  setproperty(VF_ANGLES, view_angles);
656  */
657  }
659 }
660 
662 {
663  csqcplayer = NULL;
664  cvar_settemp("cl_movement_replay", "1");
665 }
666 
668 {
669  if (this != csqcplayer) return false;
671  return true;
672 }
673 
675 {
676  if (this.entnum != player_localnum + 1) return false;
677  csqcplayer = this;
679  if (cvar("cl_movement_replay"))
680  cvar_settemp("cl_movement_replay", "0");
681  this.entremove = CSQCPlayer_Remove;
682  return true;
683 }
bool autocvar_v_deathtilt
Definition: cl_player.qc:266
const int PMF_JUMP_HELD
Definition: cl_player.qh:34
float bobfall_swing
Definition: cl_player.qc:304
#define PHYS_PL_CROUCH_MIN(s)
Definition: player.qh:83
float stairsmooth_offset
Definition: cl_player.qc:242
vector csqcplayer_origin
Definition: cl_player.qc:35
float autocvar_v_deathtiltangle
Definition: cl_player.qc:267
#define PHYS_PL_CROUCH_MAX(s)
Definition: player.qh:82
const int ISPLAYER_PLAYER
Definition: common.qh:59
float autocvar_cl_bob_limit
Definition: cl_player.qc:294
vector CSQCPlayer_ApplyChase(entity this, vector v)
Definition: cl_player.qc:437
#define CSQCPLAYER_HOOK_POSTCAMERASETUP()
vector view_ofs
Definition: progsdefs.qc:151
vector CSQCPlayer_GetPredictionErrorO()
Definition: cl_player.qc:44
entity CSQCModel_server2csqc(int i)
Definition: cl_model.qc:314
#define PHYS_PL_CROUCH_VIEWOFS(s)
Definition: player.qh:86
#define PHYS_PL_VIEWOFS(s)
Definition: player.qh:85
float autocvar_chase_pitchangle
Definition: cl_player.qc:436
int pmove_flags
Definition: cl_player.qh:33
bool csqcmodel_isdead
float servercommandframe
Definition: csprogsdefs.qc:24
float cvar_settemp(string tmp_cvar, string tmp_value)
Definition: util.qc:696
#define IS_DUCKED(s)
Definition: player.qh:206
int isplayermodel
float FL_ONGROUND
Definition: progsdefs.qc:240
float autocvar_v_iroll_level
Definition: cl_player.qc:281
float autocvar_chase_up
Definition: cl_player.qc:434
float autocvar_v_iroll_cycle
Definition: cl_player.qc:278
bool CSQCPlayer_PreUpdate(entity this)
Definition: cl_player.qc:667
float autocvar_cl_bob_limit_heightcheck
Definition: cl_player.qc:295
void CSQCPlayer_Remove(entity this)
Definition: cl_player.qc:661
float stairsmooth_drawtime
Definition: cl_player.qc:244
entity() spawn
const float MOVE_NORMAL
Definition: csprogsdefs.qc:252
float input_buttons
Definition: csprogsdefs.qc:62
void CSQC_ClientMovement_PlayerMove_Frame(entity this)
vector input_angles
Definition: csprogsdefs.qc:60
vector v_angle
Definition: progsdefs.qc:161
#define IS_ONGROUND(s)
Definition: movetypes.qh:16
float intermission
Definition: csprogsdefs.qc:148
void CSQCPlayer_SetMinsMaxs(entity this)
Definition: cl_player.qc:99
vector maxs
Definition: csprogsdefs.qc:113
float autocvar_cl_bob
Definition: cl_player.qc:292
const int CSQCPLAYERSTATUS_PREDICTED
Definition: cl_player.qh:30
bool autocvar_chase_overhead
Definition: cl_player.qc:435
vector pmove_vel
Definition: csprogsdefs.qc:55
origin
Definition: ent_cs.qc:114
float bobfall_speed
Definition: cl_player.qc:305
void CSQCPlayer_ApplyIdleScaling(entity this)
Definition: cl_player.qc:282
void Movetype_Physics_NoMatchTicrate(entity this, float movedt, bool isclient)
Definition: movetypes.qc:813
float csqcplayer_status
Definition: cl_player.qh:27
float drawtime
Definition: view.qh:115
float autocvar_cl_bobup
Definition: cl_player.qc:297
float autocvar_chase_back
Definition: cl_player.qc:433
float move_movetype
Definition: movetypes.qh:76
void CSQCPlayer_Unpredict(entity this)
Definition: cl_player.qc:89
float autocvar_v_ipitch_level
Definition: cl_player.qc:279
float PMF_DUCKED
Definition: csprogsdefs.qc:921
float REFDEFFLAG_DEAD
Definition: csprogsdefs.qc:925
vector CSQCPlayer_GetPredictionErrorV()
Definition: cl_player.qc:50
void CSQCPlayer_CalcRefdef(entity this)
Definition: cl_player.qc:521
vector csqcplayer_predictionerroro
Definition: cl_player.qc:39
float autocvar_cl_rollspeed
Definition: cl_player.qc:417
void CSQCPlayer_ApplyDeathTilt(entity this)
Definition: cl_player.qc:268
float clientcommandframe
Definition: csprogsdefs.qc:23
#define PHYS_PL_MAX(s)
Definition: player.qh:80
vector view_angles
Definition: csprogsdefs.qc:150
bool autocvar_chase_front
Definition: view.qh:18
float CSQCPlayer_CalcRoll(entity this)
Definition: cl_player.qc:418
float csqcplayer_predictionerrortime
Definition: cl_player.qc:41
bool CSQCPlayer_IsLocalPlayer(entity this)
Definition: cl_player.qc:207
#define BIT(n)
Only ever assign into the first 24 bits in QC (so max is BIT(23)).
Definition: bits.qh:8
float csqcplayer_moveframe
Definition: cl_player.qc:38
float autocvar_cl_bob_velocity_limit
Definition: cl_player.qc:296
const float MOVE_NOMONSTERS
Definition: csprogsdefs.qc:253
vector mins
Definition: csprogsdefs.qc:113
#define PHYS_PL_MIN(s)
Definition: player.qh:81
float REFDEFFLAG_TELEPORTED
Definition: csprogsdefs.qc:923
float csqcplayer_predictionerrorfactor
Definition: cl_player.qc:42
float autocvar_cl_bobfallminspeed
Definition: cl_player.qc:300
vector v_up
Definition: csprogsdefs.qc:31
float autocvar_v_idlescale
Definition: cl_player.qc:275
float autocvar_cl_bob2smooth
Definition: cl_player.qc:303
vector csqcplayer_predictionerrorv
Definition: cl_player.qc:40
float autocvar_cl_bob2cycle
Definition: cl_player.qc:302
float autocvar_cl_stairsmoothspeed
Definition: cl_player.qc:213
float csqcplayer_sequence
Definition: cl_player.qc:36
#define NULL
Definition: post.qh:17
float frametime
Definition: csprogsdefs.qc:17
#define LOG_INFO(...)
Definition: log.qh:70
vector trace_endpos
Definition: csprogsdefs.qc:37
void CSQCPlayer_SetCamera()
Called once per CSQC_UpdateView()
Definition: cl_player.qc:554
float autocvar_cl_bobcycle
Definition: cl_player.qc:293
float PMF_ONGROUND
Definition: csprogsdefs.qc:922
#define IS_DEAD(s)
Definition: utils.qh:26
bool autocvar_cl_movement_intermissionrunning
Definition: cl_player.qc:30
float autocvar_cl_bobfallcycle
Definition: cl_player.qc:299
float player_localentnum
Definition: csprogsdefs.qc:19
float autocvar_cl_rollangle
Definition: cl_player.qc:416
#define BITSET(var, mask, flag)
Definition: bits.qh:11
float autocvar_cl_bob2
Definition: cl_player.qc:301
vector(float skel, float bonenum) _skel_get_boneabs_hidden
const float M_PI
Definition: csprogsdefs.qc:269
vector CSQCPlayer_ApplySmoothing(entity this, vector v)
Definition: cl_player.qc:217
float smooth_prevtime
Definition: cl_player.qc:215
#define PHYS_VIEWHEIGHT(s)
Definition: player.qh:88
const int IFLAG_ORIGIN
Definition: interpolate.qh:36
float autocvar_cl_movement_errorcompensation
Definition: cl_player.qc:29
float MOVETYPE_NOCLIP
Definition: progsdefs.qc:254
vector v
Definition: ent_cs.qc:116
float spectatee_status
Definition: main.qh:166
const float VF_ANGLES
Definition: csprogsdefs.qc:186
bool CSQCPlayer_PostUpdate(entity this)
Definition: cl_player.qc:674
float flags
Definition: csprogsdefs.qc:129
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
Definition: vector.qh:8
float viewheightavg
Definition: cl_player.qc:216
vector view_punchangle
Definition: csprogsdefs.qc:151
float autocvar_cl_smoothviewheight
Definition: cl_player.qc:214
float stairsmooth_prevtime
Definition: cl_player.qc:243
void CSQCPlayer_SetPredictionError(vector o, vector v, float onground_diff)
Definition: cl_player.qc:56
vector v_right
Definition: csprogsdefs.qc:31
#define LOG_FATALF(...)
Definition: log.qh:59
const int CSQCPLAYERSTATUS_UNPREDICTED
Definition: cl_player.qh:28
vector CSQCModel_ApplyStairSmoothing(entity this, bool isonground, vector v)
Definition: cl_player.qc:245
setorigin(ent, v)
float REFDEFFLAG_INTERMISSION
Definition: csprogsdefs.qc:926
vector trace_plane_normal
Definition: csprogsdefs.qc:38
void CSQCPlayer_PredictTo(entity this, float endframe, bool apply_error)
Definition: cl_player.qc:154
void CSQCPlayer_Physics(entity this)
Definition: cl_player.qc:128
vector angles
Definition: csprogsdefs.qc:104
entity csqcplayer
Definition: cl_player.qh:26
#define IS_JUMP_HELD(s)
Definition: player.qh:199
int autocvar_chase_active
Definition: view.qh:17
float autocvar_v_iyaw_level
Definition: cl_player.qc:280
bool autocvar_cl_useenginerefdef
Definition: cl_player.qc:551
float pmove_onground
Definition: cl_player.qc:33
float REFDEFFLAG_JUMPING
Definition: csprogsdefs.qc:924
#define PHYS_HEALTH(s)
Definition: player.qh:89
bool autocvar_cl_movement
Definition: cl_player.qh:24
#define PHYS_STEPHEIGHT(s)
Definition: movetypes.qh:38
float time
Definition: csprogsdefs.qc:16
float autocvar_v_ipitch_cycle
Definition: cl_player.qc:276
vector velocity
Definition: csprogsdefs.qc:103
vector csqcplayer_velocity
Definition: cl_player.qc:35
vector view_punchvector
Definition: csprogsdefs.qc:152
float autocvar_cl_bobfall
Definition: cl_player.qc:298
#define makevectors
Definition: post.qh:21
int player_pmflags
Definition: cl_player.qc:37
float trace_fraction
Definition: csprogsdefs.qc:36
const int CSQCPLAYERSTATUS_FROMSERVER
Definition: cl_player.qh:29
float entnum
Definition: csprogsdefs.qc:94
void InterpolateOrigin_Do(entity this)
set origin based on iorigin1 (old pos), iorigin2 (desired pos), and time
Definition: interpolate.qc:129
float player_localnum
Definition: csprogsdefs.qc:20
const int IFLAG_ANGLES
Definition: interpolate.qh:28
float csqcmodel_teleported
Definition: cl_model.qh:39
vector CSQCPlayer_ApplyBobbing(entity this, vector v)
Definition: cl_player.qc:307
float ticrate
Definition: main.qh:182
void CSQCPlayer_SavePrediction(entity this)
Definition: cl_player.qc:117
float autocvar_v_iyaw_cycle
Definition: cl_player.qc:277
const float VF_ORIGIN
Definition: csprogsdefs.qc:182
float bob2_smooth
Definition: cl_player.qc:306
float stairsmoothz
Definition: cl_player.qc:212
vector v_forward
Definition: csprogsdefs.qc:31