Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
movelib.qc
Go to the documentation of this file.
1#include "movelib.qh"
2
3#ifdef SVQC
4.vector moveto;
5
10vector movelib_dragvec(entity this, float drag, float exp_)
11{
12 float lspeed,ldrag;
13
14 lspeed = vlen(this.velocity);
15 ldrag = lspeed * drag;
16 ldrag = ldrag * (drag * exp_);
17 ldrag = 1 - (ldrag / lspeed);
18
19 return this.velocity * ldrag;
20}
21
26float movelib_dragflt(float fspeed,float drag,float exp_)
27{
28 float ldrag;
29
30 ldrag = fspeed * drag;
31 ldrag = ldrag * ldrag * exp_;
32 ldrag = 1 - (ldrag / fspeed);
33
34 return ldrag;
35}
36
42vector movelib_inertmove_byspeed(entity this, vector vel_new, float vel_max,float newmin,float oldmax)
43{
44 float influense;
45
46 influense = vlen(this.velocity) * (1 / vel_max);
47
48 influense = bound(newmin,influense,oldmax);
49
50 return (vel_new * (1 - influense)) + (this.velocity * influense);
51}
52
53vector movelib_inertmove(entity this, vector new_vel,float new_bias)
54{
55 return new_vel * new_bias + this.velocity * (1-new_bias);
56}
57
58void movelib_move(entity this, vector force,float max_velocity,float drag,float theMass,float breakforce)
59{
60 float deltatime;
61 float acceleration;
62 float mspeed;
63 vector breakvec;
64
65 deltatime = time - this.movelib_lastupdate;
66 if (deltatime > 0.15) deltatime = 0;
67 this.movelib_lastupdate = time;
68 if (!deltatime) return;
69
70 mspeed = vlen(this.velocity);
71
72 if (theMass)
73 acceleration = vlen(force) / theMass;
74 else
75 acceleration = vlen(force);
76
77 if (IS_ONGROUND(this))
78 {
79 if (breakforce)
80 {
81 breakvec = (normalize(this.velocity) * (breakforce / theMass) * deltatime);
82 this.velocity = this.velocity - breakvec;
83 }
84
85 this.velocity = this.velocity + force * (acceleration * deltatime);
86 }
87
88 if (drag)
89 this.velocity = movelib_dragvec(this, drag, 1);
90
91 if (this.waterlevel > 1)
92 {
93 this.velocity = this.velocity + force * (acceleration * deltatime);
94 this.velocity = this.velocity + '0 0 0.05' * autocvar_sv_gravity * deltatime;
95 }
96 else
97 this.velocity = this.velocity + '0 0 -1' * autocvar_sv_gravity * deltatime;
98
99 mspeed = vlen(this.velocity);
100
101 if (max_velocity)
102 if (mspeed > max_velocity)
103 this.velocity = normalize(this.velocity) * (mspeed - 50);//* max_velocity;
104}
105
106/*
107.float mass;
108.float side_friction;
109.float ground_friction;
110.float air_friction;
111.float water_friction;
112.float buoyancy;
113float movelib_deltatime;
114
115void movelib_startupdate(entity this)
116{
117 movelib_deltatime = time - this.movelib_lastupdate;
118
119 if (movelib_deltatime > 0.5)
120 movelib_deltatime = 0;
121
122 this.movelib_lastupdate = time;
123}
124
125void movelib_update(entity this, vector dir,float force)
126{
127 vector acceleration;
128 float old_speed;
129 float ffriction,v_z;
130
131 vector breakvec;
132 vector old_dir;
133 vector ggravity;
134 vector old;
135
136 if(!movelib_deltatime)
137 return;
138 v_z = this.velocity_z;
139 old_speed = vlen(this.velocity);
140 old_dir = normalize(this.velocity);
141
142 //ggravity = (autocvar_sv_gravity / this.mass) * '0 0 100';
143 acceleration = (force / this.mass) * dir;
144 //acceleration -= old_dir * (old_speed / this.mass);
145 acceleration -= ggravity;
146
147 if(this.waterlevel > 1)
148 {
149 ffriction = this.water_friction;
150 acceleration += this.buoyancy * '0 0 1';
151 }
152 else
153 if(IS_ONGROUND(this))
154 ffriction = this.ground_friction;
155 else
156 ffriction = this.air_friction;
157
158 ffriction = bound(0, ffriction, 1);
159 acceleration *= ffriction;
160 //this.velocity = this.velocity * (ffriction * movelib_deltatime);
161 this.velocity += acceleration * movelib_deltatime;
162 this.velocity_z = v_z;
163
164}
165*/
166
167void movelib_brake_simple(entity this, float force)
168{
169 float mspeed;
170 vector mdir;
171 float vz;
172
173 mspeed = max(0,vlen(this.velocity) - force);
174 mdir = normalize(this.velocity);
175 vz = this.velocity.z;
176 this.velocity = mdir * mspeed;
177 this.velocity_z = vz;
178}
179
184#endif
185
186void movelib_groundalign4point(entity this, float spring_length, float spring_up, float blendrate, float _max)
187{
188 vector a, b, c, d, e, r, push_angle, ahead, side;
189
190 push_angle.y = 0;
191 r = (this.absmax + this.absmin) * 0.5 + (v_up * spring_up);
192 e = v_up * spring_length;
193
194 // Put springs slightly inside bbox
195 ahead = v_forward * (this.maxs.x * 0.8);
196 side = v_right * (this.maxs.y * 0.8);
197
198 a = r + ahead + side;
199 b = r + ahead - side;
200 c = r - ahead + side;
201 d = r - ahead - side;
202
203 traceline(a, a - e,MOVE_NORMAL,this);
204 a.z = (1 - trace_fraction);
205 r = trace_endpos;
206
207 traceline(b, b - e,MOVE_NORMAL,this);
208 b.z = (1 - trace_fraction);
209 r += trace_endpos;
210
211 traceline(c, c - e,MOVE_NORMAL,this);
212 c.z = (1 - trace_fraction);
213 r += trace_endpos;
214
215 traceline(d, d - e,MOVE_NORMAL,this);
216 d.z = (1 - trace_fraction);
217 r += trace_endpos;
218
219 a.x = r.z;
220 r = this.origin;
221 r.z = r.z;
222
223 push_angle.x = (a.z - c.z) * _max;
224 push_angle.x += (b.z - d.z) * _max;
225
226 push_angle.z = (b.z - a.z) * _max;
227 push_angle.z += (d.z - c.z) * _max;
228
229 //this.angles_x += push_angle_x * 0.95;
230 //this.angles_z += push_angle_z * 0.95;
231
232 this.angles_x = ((1-blendrate) * this.angles.x) + (push_angle.x * blendrate);
233 this.angles_z = ((1-blendrate) * this.angles.z) + (push_angle.z * blendrate);
234
235 //a = this.origin;
236 setorigin(this, r);
237}
238
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
float waterlevel
Definition player.qh:226
#define autocvar_sv_gravity
Definition stats.qh:421
vector v_up
const float MOVE_NORMAL
vector velocity
float time
vector v_right
vector trace_endpos
vector maxs
vector absmax
vector v_forward
vector origin
float trace_fraction
vector absmin
ent angles
Definition ent_cs.qc:121
float bound(float min, float value, float max)
float vlen(vector v)
vector normalize(vector v)
float max(float f,...)
vector movelib_dragvec(entity this, float drag, float exp_)
Simulate drag this.velocity = movelib_dragvec(this.velocity,0.02,0.5);.
Definition movelib.qc:10
void movelib_groundalign4point(entity this, float spring_length, float spring_up, float blendrate, float _max)
Pitches and rolls the entity to match the gound.
Definition movelib.qc:186
void movelib_brake_simple(entity this, float force)
Definition movelib.qc:167
float movelib_dragflt(float fspeed, float drag, float exp_)
Simulate drag this.velocity *= movelib_dragflt(somespeed,0.01,0.7);.
Definition movelib.qc:26
vector movelib_inertmove_byspeed(entity this, vector vel_new, float vel_max, float newmin, float oldmax)
Do a inertia simulation based on velocity.
Definition movelib.qc:42
void movelib_move(entity this, vector force, float max_velocity, float drag, float theMass, float breakforce)
Definition movelib.qc:58
vector movelib_inertmove(entity this, vector new_vel, float new_bias)
Definition movelib.qc:53
float movelib_lastupdate
Definition movelib.qh:27
#define IS_ONGROUND(s)
Definition movetypes.qh:16
vector
Definition self.qh:92
vector moveto
Definition zombie.qc:17