Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
sv_vehicles.qc
Go to the documentation of this file.
1#include "sv_vehicles.qh"
2
8#include <server/bot/api.qh>
9#include <server/client.qh>
10#include <server/damage.qh>
11#include <server/items/items.qh>
13#include <server/world.qh>
14
15bool SendAuxiliaryXhair(entity this, entity to, int sf)
16{
17 WriteHeader(MSG_ENTITY, ENT_CLIENT_AUXILIARYXHAIR);
19
21
22 if(sf & 2)
23 {
24 WriteVector(MSG_ENTITY, this.origin);
25 }
26
27 if(sf & 4)
28 {
29 WriteByte(MSG_ENTITY, rint(this.colormod_x * 255));
30 WriteByte(MSG_ENTITY, rint(this.colormod_y * 255));
31 WriteByte(MSG_ENTITY, rint(this.colormod_z * 255));
32 }
33
34 return true;
35}
36
38{
40 entity axh = e.(AuxiliaryXhair[this.cnt]);
41 return axh.owner == this.owner; // cheaply check if the client's axh owner is the same as our real owner
42}
43
46
47void UpdateAuxiliaryXhair(entity own, vector loc, vector clr, int axh_id)
48{
49 if(!IS_REAL_CLIENT(own))
50 return;
51
52 axh_id = bound(0, axh_id, MAX_AXH);
53 entity axh = own.(AuxiliaryXhair[axh_id]);
54
55 if(axh == NULL || wasfreed(axh)) // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist? Mario: because of sloppy code like this)
56 {
57 axh = new(auxiliary_xhair);
58 axh.cnt = axh_id;
59 //axh.drawonlytoclient = own; // not spectatable
61 axh.owner = own;
62 Net_LinkEntity(axh, false, 0, SendAuxiliaryXhair);
63 }
64
65 if(loc != axh.axh_prevorigin)
66 {
67 setorigin(axh, loc);
68 axh.SendFlags |= 2;
69 }
70
71 if(clr != axh.axh_prevcolors)
72 {
73 axh.colormod = clr;
74 axh.SendFlags |= 4;
75 }
76
77 own.(AuxiliaryXhair[axh_id]) = axh; // set it anyway...?
78}
79
80void CSQCVehicleSetup(entity own, int vehicle_id)
81{
82 if(!IS_REAL_CLIENT(own))
83 return;
84
85 msg_entity = own;
86
87 WriteHeader(MSG_ONE, TE_CSQC_VEHICLESETUP);
88 WriteByte(MSG_ONE, vehicle_id);
89
90 if(vehicle_id == 0 || vehicle_id == HUD_NORMAL)
91 {
92 for(int i = 0; i < MAX_AXH; ++i)
93 {
94 entity axh = own.(AuxiliaryXhair[i]);
95 own.(AuxiliaryXhair[i]) = NULL;
96
97 if(axh.owner == own && axh != NULL && !wasfreed(axh))
98 delete(axh);
99 }
100 }
101}
102
103void vehicles_locktarget(entity this, float incr, float decr, float _lock_time)
104{
105 if(this.lock_target && IS_DEAD(this.lock_target))
106 {
107 this.lock_target = NULL;
108 this.lock_strength = 0;
109 this.lock_time = 0;
110 }
111
112 if(this.lock_time > time)
113 {
114 if(this.lock_target)
115 if(this.lock_soundtime < time)
116 {
117 this.lock_soundtime = time + 0.5;
118 play2(this.owner, "vehicles/locked.wav");
119 }
120
121 return;
122 }
123
124 if(trace_ent != NULL)
125 {
126 if(SAME_TEAM(trace_ent, this))
127 trace_ent = NULL;
128
129 if(IS_DEAD(trace_ent))
130 trace_ent = NULL;
131
133 trace_ent = NULL;
134
135 if(trace_ent.alpha <= 0.5 && trace_ent.alpha != 0)
136 trace_ent = NULL; // invisible
137 }
138
139 if(this.lock_target == NULL && trace_ent != NULL)
140 this.lock_target = trace_ent;
141
142 if(this.lock_target && trace_ent == this.lock_target)
143 {
144 if(this.lock_strength != 1 && this.lock_strength + incr >= 1)
145 {
146 play2(this.owner, "vehicles/lock.wav");
147 this.lock_soundtime = time + 0.8;
148 }
149 else if (this.lock_strength != 1 && this.lock_soundtime < time)
150 {
151 play2(this.owner, "vehicles/locking.wav");
152 this.lock_soundtime = time + 0.3;
153 }
154 }
155
156 // Have a locking target
157 // Trace hit current target
158 if(trace_ent == this.lock_target && trace_ent != NULL)
159 {
160 this.lock_strength = min(this.lock_strength + incr, 1);
161 if(this.lock_strength == 1)
162 this.lock_time = time + _lock_time;
163 }
164 else
165 {
166 if(trace_ent)
167 this.lock_strength = max(this.lock_strength - decr * 2, 0);
168 else
169 this.lock_strength = max(this.lock_strength - decr, 0);
170
171 if(this.lock_strength == 0)
172 this.lock_target = NULL;
173 }
174}
175
176// projectile handling
177void vehicles_projectile_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
178{
179 // Ignore damage from oterh projectiles from my owner (dont mess up volly's)
180 if(inflictor.owner == this.owner)
181 return;
182
183 TakeResource(this, RES_HEALTH, damage);
184 this.velocity += force;
185 if(GetResource(this, RES_HEALTH) < 1)
186 {
187 this.takedamage = DAMAGE_NO;
188 this.event_damage = func_null;
189 setthink(this, adaptor_think2use);
190 this.nextthink = time;
191 }
192}
193
195{
196 if(this.owner && toucher != NULL)
197 {
198 if(toucher == this.owner.vehicle)
199 return;
200
201 if(toucher == this.owner.vehicle.tur_head)
202 return;
203 }
204
206
207 this.event_damage = func_null;
208 RadiusDamage (this, this.realowner, this.shot_dmg, 0, this.shot_radius, this, NULL, this.shot_force, this.projectiledeathtype, DMG_NOWEP, toucher);
209
210 delete(this);
211}
212
217
219{
220 vehicles_projectile_explode(this, trigger);
221}
222
224 vector _org, vector _vel,
225 float _dmg, float _radi, float _force, float _size,
226 int _deahtype, float _projtype, float _health,
227 bool _cull, bool _clianim, entity _owner)
228{
229 TC(Sound, _mzlsound);
230 entity proj = new(vehicles_projectile);
231
233 setorigin(proj, _org);
234
235 proj.shot_dmg = _dmg;
236 proj.shot_radius = _radi;
237 proj.shot_force = _force;
238 proj.projectiledeathtype = _deahtype;
239 proj.solid = SOLID_BBOX;
241 proj.flags = FL_PROJECTILE;
242 IL_PUSH(g_projectiles, proj);
243 IL_PUSH(g_bot_dodge, proj);
244 proj.bot_dodge = true;
245 proj.bot_dodgerating = _dmg;
246 proj.velocity = _vel;
249 proj.owner = this;
250 proj.realowner = _owner;
251 setthink(proj, SUB_Remove);
252 proj.nextthink = time + 30;
253
254 if(_health)
255 {
256 proj.takedamage = DAMAGE_AIM;
257 proj.event_damage = vehicles_projectile_damage;
258 SetResourceExplicit(proj, RES_HEALTH, _health);
259 }
260 else
261 proj.flags |= FL_NOTARGET;
262
263 if(_mzlsound != SND_Null)
264 sound (this, CH_WEAPON_A, _mzlsound, VOL_BASE, ATTEN_NORM);
265
266 if(_mzlfx != EFFECT_Null)
267 Send_Effect(_mzlfx, proj.origin, proj.velocity, 1);
268
269 setsize (proj, '-1 -1 -1' * _size, '1 1 1' * _size);
270
271 CSQCProjectile(proj, _clianim, _projtype, _cull);
272
273 return proj;
274}
275
277{
278 sound (this, CH_SHOTS, SND_ROCKET_IMPACT, VOL_BASE, ATTEN_NORM);
279 Send_Effect(EFFECT_EXPLOSION_SMALL, randomvec() * 80 + (this.origin + '0 0 100'), '0 0 0', 1);
280 Send_Effect(EFFECT_EXPLOSION_SMALL, this.wp00.origin + '0 0 64', '0 0 0', 1);
281 delete(this);
282}
283
288
290{
291 this.alpha -= 0.1;
292 if(this.cnt >= time)
293 delete(this);
294 else
295 this.nextthink = time + 0.1;
296}
297
298entity vehicle_tossgib(entity this, entity _template, vector _vel, string _tag, bool _burn, bool _explode, float _maxtime, vector _rot)
299{
300 entity _gib = new(vehicle_gib);
301 _setmodel(_gib, _template.model);
302 vector org = gettaginfo(this, gettagindex(this, _tag));
303 setorigin(_gib, org);
304 _gib.velocity = _vel;
306 _gib.solid = SOLID_CORPSE;
307 _gib.colormod = '-0.5 -0.5 -0.5';
308 _gib.effects = EF_LOWPRECISION;
309 _gib.avelocity = _rot;
310
311 if(_burn)
312 _gib.effects |= EF_FLAME;
313
314 if(_explode)
315 {
317 _gib.nextthink = time + random() * _explode;
319 }
320 else
321 {
322 _gib.cnt = time + _maxtime;
324 _gib.nextthink = time + _maxtime - 1;
325 _gib.alpha = 1;
326 }
327 return _gib;
328}
329
331 entity _slot,
332 int _hud,
333 Model _hud_model,
334 bool(entity,float) _framefunc,
335 void(entity,bool) _exitfunc, float(entity, entity) _enterfunc)
336{
337 if(!(_owner.vehicle_flags & VHF_MULTISLOT))
338 _owner.vehicle_flags |= VHF_MULTISLOT;
339
340 _slot.PlayerPhysplug = _framefunc;
341 _slot.vehicle_exit = _exitfunc;
342 _slot.vehicle_enter = _enterfunc;
343 STAT(HUD, _slot) = _hud;
344 _slot.vehicle_flags = VHF_PLAYERSLOT;
345 _slot.vehicle_viewport = new(vehicle_viewport);
346 _slot.vehicle_hudmodel = new(vehicle_hudmodel);
347 _slot.vehicle_hudmodel.viewmodelforclient = _slot;
349
350 setmodel(_slot.vehicle_hudmodel, _hud_model);
351 setmodel(_slot.vehicle_viewport, MDL_Null);
352
353 setattachment(_slot.vehicle_hudmodel, _slot, "");
354 setattachment(_slot.vehicle_viewport, _slot.vehicle_hudmodel, "");
355
356 return true;
357}
358
359vector vehicle_aimturret(entity _vehic, vector _target, entity _turrret, string _tagname,
360 float _pichlimit_min, float _pichlimit_max,
361 float _rotlimit_min, float _rotlimit_max, float _aimspeed, float dt)
362{
363 vector vtmp, vtag;
364 float ftmp;
365 vtag = gettaginfo(_turrret, gettagindex(_turrret, _tagname));
366 vtmp = vectoangles(normalize(_target - vtag));
368 vtmp = AnglesTransform_Normalize(vtmp, true);
369 ftmp = _aimspeed * dt;
370 vtmp_y = bound(-ftmp, vtmp_y, ftmp);
371 vtmp_x = bound(-ftmp, vtmp_x, ftmp);
372 _turrret.angles_y = bound(_rotlimit_min, _turrret.angles_y + vtmp_y, _rotlimit_max);
373 _turrret.angles_x = bound(_pichlimit_min, _turrret.angles_x + vtmp_x, _pichlimit_max);
374 return vtag;
375}
376
378{
379 int eff = 0, cmap;
380 const vector cmod = '0 0 0';
381 if(this.team && teamplay)
382 cmap = 1024 + (this.team - 1) * 17;
383 else if(player)
384 cmap = player.colormap;
385 else
386 cmap = 1024;
388 eff |= EF_NODEPTHTEST;
390 eff |= EF_FULLBRIGHT;
391
392 // Find all ents attacked to main model and setup effects, colormod etc.
394 {
395 if(it == this.vehicle_shieldent)
396 continue;
397
398 it.effects = eff;
399 it.colormod = cmod;
400 it.colormap = cmap;
401 it.alpha = 1;
402 });
403
404 // Also check head tags
406 {
407 if(it == this.vehicle_shieldent)
408 continue;
409
410 it.effects = eff;
411 it.colormod = cmod;
412 it.colormap = cmap;
413 it.alpha = 1;
414 });
415
416 this.vehicle_hudmodel.effects = this.effects = eff; // | EF_LOWPRECISION;
417 this.vehicle_hudmodel.colormod = this.colormod = cmod;
418 this.vehicle_hudmodel.colormap = this.colormap = cmap;
420
421 this.alpha = 1;
422 this.avelocity = '0 0 0';
423 this.velocity = '0 0 0';
424 this.effects = eff;
425
426 Vehicle info = this.vehicledef; //REGISTRY_GET(Vehicles, this.vehicleid);
427 info.vr_setcolors(info, this);
428}
429
431{
432 // Remove "return helper" entities, if any.
433 IL_EACH(g_vehicle_returners, it.wp00 == veh,
434 {
435 it.classname = "";
436 setthink(it, SUB_Remove);
437 it.nextthink = time + 0.1;
438 IL_REMOVE(g_vehicle_returners, it);
439
440 if(it.waypointsprite_attached)
441 WaypointSprite_Kill(it.waypointsprite_attached);
442 });
443}
444
445void vehicles_spawn(entity this);
447{
448 Send_Effect(EFFECT_TELEPORT, this.wp00.origin + '0 0 64', '0 0 0', 1);
449
451 this.wp00.nextthink = time;
452
455
456 delete(this);
457}
458
460{
463
464 delete(this);
465}
466
468{
469 entity ent = this;
470
471 if(ent.cnt)
472 {
474 ent.nextthink = ent.cnt;
475 }
476 else
477 {
479 ent.nextthink = time + 1;
480
481 ent = spawn();
482 ent.team = this.wp00.team;
483 ent.wp00 = this.wp00;
484 setorigin(ent, this.wp00.pos1);
485
486 ent.nextthink = time + 5;
488 }
489
490 vector rgb;
491 if(teamplay && ent.team)
492 rgb = Team_ColorRGB(ent.team);
493 else
494 rgb = '1 1 1';
495 entity wp = WaypointSprite_Spawn(WP_Vehicle, 0, 0, ent, '0 0 64', NULL, 0, ent, waypointsprite_attached, true, RADARICON_Vehicle);
496 wp.wp_extra = ent.wp00.vehicleid;
497 wp.colormod = rgb;
498 if(ent.waypointsprite_attached)
499 {
500 WaypointSprite_UpdateRule(ent.waypointsprite_attached, ent.wp00.team, SPRITERULE_DEFAULT);
501 if(this == NULL)
502 WaypointSprite_UpdateBuildFinished(ent.waypointsprite_attached, ent.nextthink);
503 WaypointSprite_Ping(ent.waypointsprite_attached);
504 }
505}
506
508{
510
511 entity ret = new(vehicle_return);
513 ret.wp00 = veh;
514 ret.team = veh.team;
516
517 if(IS_DEAD(veh))
518 {
519 ret.cnt = time + veh.respawntime;
520 ret.nextthink = min(time + veh.respawntime, time + veh.respawntime - 5);
521 }
522 else
523 {
524 ret.nextthink = min(time + veh.respawntime, time + veh.respawntime - 1);
525 }
526
527 setorigin(ret, veh.pos1 + '0 0 96');
528}
529
530void vehicle_use(entity this, entity actor, entity trigger)
531{
532 LOG_DEBUG("vehicle ", this.netname, " used by ", actor.classname);
533
534 this.tur_head.team = actor.team;
535
536 if(this.tur_head.team == 0)
537 this.active = ACTIVE_NOT;
538 else
539 this.active = ACTIVE_ACTIVE;
540
541 if(this.active == ACTIVE_ACTIVE && !IS_DEAD(this) && !game_stopped)
542 {
543 LOG_DEBUG("Respawning vehicle: ", this.netname);
544 if(this.effects & EF_NODRAW)
545 {
547 this.nextthink = time + 3;
548 }
549 else
550 {
551 vehicles_setreturn(this);
552 vehicles_reset_colors(this, actor);
553 }
554 }
555}
556
557void vehicles_regen(entity this, float timer, .float regen_field, float field_max, float rpause, float regen, float delta_time, float _healthscale)
558{
559 if(this.(regen_field) < field_max)
560 if(timer + rpause < time)
561 {
562 if(_healthscale)
563 regen = regen * (GetResource(this, RES_HEALTH) / this.max_health);
564
565 this.(regen_field) = min(this.(regen_field) + regen * delta_time, field_max);
566
567 if(this.owner)
568 this.owner.(regen_field) = (this.(regen_field) / field_max) * 100;
569 }
570}
571
572void vehicles_regen_resource(entity this, float timer, .float regen_field, float field_max, float rpause, float regen, float delta_time, float _healthscale, Resource resource)
573{
574 float resource_amount = GetResource(this, resource);
575
576 if(resource_amount < field_max)
577 if(timer + rpause < time)
578 {
579 if(_healthscale)
580 regen = regen * (resource_amount / this.max_health);
581
582 SetResource(this, resource, min(resource_amount + regen * delta_time, field_max));
583
584 if(this.owner)
585 this.owner.(regen_field) = (GetResource(this, resource) / field_max) * 100;
586 }
587}
588
590{
591 this.alpha -= 0.1;
592 if (this.alpha <= 0)
593 {
594 // setmodel(this, MDL_Null);
595 this.alpha = -1;
596 this.effects |= EF_NODRAW;
597 }
598 else
599 {
600 this.nextthink = time + 0.1;
601 }
602}
603
605{
606 int myhealth = ((this.owner) ? this.owner.vehicle_health : ((GetResource(this, RES_HEALTH) / this.max_health) * 100));
607
608 if(myhealth <= 50)
609 if(this.pain_frame < time)
610 {
611 float _ftmp = myhealth / 50;
612 this.pain_frame = time + max(0.1, 0.1 + (random() * 0.5 * _ftmp));
613 Send_Effect(EFFECT_SMOKE_SMALL, (this.origin + (randomvec() * 80)), '0 0 0', 1);
614
615 if(this.vehicle_flags & VHF_DMGSHAKE)
616 this.velocity += randomvec() * 30;
617
618 if(this.vehicle_flags & VHF_DMGROLL)
619 {
621 this.tur_head.angles += randomvec();
622 else
623 this.angles += randomvec();
624 }
625 }
626}
627
628void vehicles_frame(entity this, entity actor)
629{
630 vehicles_painframe(this);
631}
632
633void vehicles_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype, .entity weaponentity, vector hitloc, vector force)
634{
635 this.dmg_time = time;
636
637 // WEAPONTODO
638 if(DEATH_ISWEAPON(deathtype, WEP_VORTEX))
640 else if(DEATH_ISWEAPON(deathtype, WEP_MACHINEGUN))
642 else if(DEATH_ISWEAPON(deathtype, WEP_RIFLE))
644 else if(DEATH_ISWEAPON(deathtype, WEP_VAPORIZER))
646 else if(DEATH_ISWEAPON(deathtype, WEP_SEEKER))
648 else if(DEATH_WEAPONOF(deathtype) != WEP_Null)
650
651 this.enemy = attacker;
652
653 this.pain_finished = time;
654
655 if((this.vehicle_flags & VHF_HASSHIELD) && (this.vehicle_shield > 0))
656 {
657 if (wasfreed(this.vehicle_shieldent) || this.vehicle_shieldent == NULL)
658 {
660 this.vehicle_shieldent.effects = EF_LOWPRECISION;
661
662 setmodel(this.vehicle_shieldent, MDL_VEH_SHIELD);
663 setattachment(this.vehicle_shieldent, this, "");
664 setorigin(this.vehicle_shieldent, real_origin(this) - this.origin);
665 this.vehicle_shieldent.scale = 256 / vlen(this.maxs - this.mins);
667 }
668
669 this.vehicle_shieldent.colormod = '1 1 1';
670 this.vehicle_shieldent.alpha = 0.45;
671 this.vehicle_shieldent.angles = vectoangles(normalize(hitloc - (this.origin + this.vehicle_shieldent.origin))) - this.angles;
672 this.vehicle_shieldent.nextthink = time;
673 this.vehicle_shieldent.effects &= ~EF_NODRAW;
674
675 this.vehicle_shield -= damage;
676
677 if(this.vehicle_shield < 0)
678 {
679 TakeResource(this, RES_HEALTH, fabs(this.vehicle_shield));
680 this.vehicle_shieldent.colormod = '2 0 0';
681 this.vehicle_shield = 0;
682 this.vehicle_shieldent.alpha = 0.75;
683
684 if(sound_allowed(MSG_BROADCAST, attacker))
685 spamsound (this, CH_PAIN, SND_ONS_HIT2, VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER
686 }
687 else
688 if(sound_allowed(MSG_BROADCAST, attacker))
689 spamsound (this, CH_PAIN, SND_ONS_ELECTRICITY_EXPLODE, VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER
690
691 }
692 else
693 {
694 TakeResource(this, RES_HEALTH, damage);
695
696 if(sound_allowed(MSG_BROADCAST, attacker))
697 spamsound (this, CH_PAIN, SND_ONS_HIT2, VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER
698 }
699
701 this.velocity += force * this.damageforcescale;
702 else
703 this.velocity += force;
704
705 if(GetResource(this, RES_HEALTH) <= 0)
706 {
707 if(this.owner)
708 {
711 else
713 }
714
715 antilag_clear(this, this);
716
717 Vehicle info = this.vehicledef; //REGISTRY_GET(Vehicles, this.vehicleid);
718 info.vr_death(info, this);
719 vehicles_setreturn(this);
720 }
721}
722
723bool vehicles_heal(entity targ, entity inflictor, float amount, float limit)
724{
725 float true_limit = ((limit != RES_LIMIT_NONE) ? limit : targ.max_health);
726 if(GetResource(targ, RES_HEALTH) <= 0 || GetResource(targ, RES_HEALTH) >= true_limit)
727 return false;
728
729 GiveResourceWithLimit(targ, RES_HEALTH, amount, true_limit);
730 if(targ.owner)
731 targ.owner.vehicle_health = (GetResource(targ, RES_HEALTH) / targ.max_health) * 100;
732 return true;
733}
734
736{
737 if(IS_PLAYER(e) && time >= e.vehicle_enter_delay)
738 return true;
739
740 if(IS_MONSTER(e))
741 return true;
742
743 return false;
744}
745
746void vehicles_impact(entity this, float _minspeed, float _speedfac, float _maxpain)
747{
749 return;
750
751 if(this.play_time < time)
752 {
753 if(vdist(this.velocity - this.oldvelocity, >, _minspeed))
754 {
755 float wc = vlen(this.velocity - this.oldvelocity);
756 float take = min(_speedfac * wc, _maxpain);
757 Damage(this, NULL, NULL, take, DEATH_FALL.m_id, DMG_NOWEP, this.origin, '0 0 0');
758 this.play_time = time + 0.25;
759 }
760 }
761}
762
763// vehicle enter/exit handling
765{
766 // TODO: we actually want the player's size here
767 tracebox(this.origin + '0 0 32', PL_MIN_CONST, PL_MAX_CONST, prefer_spot, MOVE_NORMAL, player);
769 return prefer_spot;
770
771 float mysize = 1.5 * vlen(this.maxs - this.mins);
772 vector v;
773 vector v2 = 0.5 * (this.absmin + this.absmax);
774 for(int i = 0; i < autocvar_g_vehicles_exit_attempts; ++i)
775 {
776 v = randomvec();
777 v_z = 0;
778 v = v2 + normalize(v) * mysize;
779 tracebox(v2, PL_MIN_CONST, PL_MAX_CONST, v, MOVE_NORMAL, player);
781 return v;
782 }
783
784 return this.origin;
785}
786
788void vehicles_exit(entity vehic, bool eject)
789{
790 entity player = vehic.owner;
791
793 {
794 LOG_TRACE("^1vehicles_exit already running! this is not good...");
795 return;
796 }
797
799
800 if(vehic.vehicle_flags & VHF_PLAYERSLOT)
801 {
802 vehic.vehicle_exit(vehic, eject);
803 vehicles_exit_running = false;
804 return;
805 }
806
807 if (player)
808 {
809 if (IS_REAL_CLIENT(player))
810 {
811 msg_entity = player;
813 WriteEntity( MSG_ONE, player);
814
815 // NOTE: engine networked
818 WriteAngle(MSG_ONE, vehic.angles_y);
820 }
821
822 player.takedamage = DAMAGE_AIM;
823 player.solid = SOLID_SLIDEBOX;
825 player.effects &= ~EF_NODRAW;
826 player.teleportable = TELEPORT_NORMAL;
827 player.alpha = default_player_alpha;
828 player.PlayerPhysplug = func_null;
829 player.vehicle = NULL;
830 player.view_ofs = STAT(PL_VIEW_OFS, player);
831 player.event_damage = PlayerDamage;
832 STAT(HUD, player) = HUD_NORMAL;
833 for(int slot = 0; slot < MAX_WEAPONSLOTS; ++ slot)
834 {
835 .entity weaponentity = weaponentities[slot];
836 player.(weaponentity).m_switchweapon = vehic.(weaponentity).m_switchweapon;
837 delete(vehic.(weaponentity)); // no longer needed
838 }
839 player.last_vehiclecheck = time + 3;
840 player.vehicle_enter_delay = time + 2;
841 setsize(player, STAT(PL_MIN, player), STAT(PL_MAX, player));
842
844
845 Kill_Notification(NOTIF_ONE, player, MSG_CENTER, CPID_VEHICLES);
846 Kill_Notification(NOTIF_ONE, player, MSG_CENTER, CPID_VEHICLES_OTHER); // kill all vehicle notifications when exiting a vehicle?
847 }
848
849 vehic.flags |= FL_NOTARGET;
850
851 if(!IS_DEAD(vehic))
852 vehic.avelocity = '0 0 0';
853
854 vehic.tur_head.nodrawtoclient = NULL;
855
856 if(!teamplay)
857 vehic.team = 0;
858
859 WaypointSprite_Kill(vehic.wps_intruder);
860
861 MUTATOR_CALLHOOK(VehicleExit, player, vehic);
862
863 vehic.team = vehic.tur_head.team;
864
865 if(vehic.old_vehicle_flags & VHF_SHIELDREGEN)
866 vehic.vehicle_flags |= VHF_SHIELDREGEN;
867 vehic.old_vehicle_flags = 0;
868
869 sound (vehic, CH_TRIGGER_SINGLE, SND_Null, 1, ATTEN_NORM);
870 vehic.vehicle_hudmodel.viewmodelforclient = vehic;
871 vehic.phase = time + 1;
872
873 vehic.vehicle_exit(vehic, eject);
874
875 vehicles_setreturn(vehic);
877 vehic.owner = NULL;
878
879 CSQCMODEL_AUTOINIT(vehic);
880
881 if(player)
882 player.oldorigin = player.origin; // player's location is set by the exit functions, so we need to do this after everything
883
884 vehicles_exit_running = false;
885}
886
888{
889 if(MUTATOR_CALLHOOK(VehicleTouch, this, toucher))
890 return;
891
892 // Vehicle currently in use
893 if(this.owner)
894 {
895 if(toucher != NULL)
896 if((this.origin_z + this.maxs_z) > (toucher.origin_z))
898 if(!weaponLocked(this.owner))
899 {
901 Damage(toucher, this, this.owner, autocvar_g_vehicles_crush_dmg, DEATH_VH_CRUSH.m_id, DMG_NOWEP, '0 0 0', normalize(toucher.origin - this.origin) * autocvar_g_vehicles_crush_force);
902
903 return; // Dont do selfdamage when hitting "soft targets".
904 }
905
906 if(this.play_time < time) {
907 Vehicle info = this.vehicledef; //REGISTRY_GET(Vehicles, this.vehicleid);
908 info.vr_impact(info, this);
909 }
910
911 return;
912 }
913
914 if(autocvar_g_vehicles_enter)
915 return;
916
917 vehicles_enter(toucher, this);
918}
919
921{
922 entity v = this.vehicle;
923 if (!v) return false;
924 if (IS_DEAD(v)) return false;
925 bool(entity,int) f = v.vehicles_impulse;
926 if (f && f(this,imp)) return true;
927 switch (imp)
928 {
929 case IMP_weapon_drop.impulse:
930 {
931 stuffcmd(this, "\ntoggle cl_eventchase_vehicle\nset _vehicles_shownchasemessage 1\n");
932 return true;
933 }
934 }
935 return false;
936}
937
939{
940 // Remove this when bots know how to use vehicles
942 return;
943
944 // TODO: mutator hook to prevent entering vehicles
945 if((!IS_PLAYER(pl))
946 || (veh.phase >= time)
947 || (pl.vehicle_enter_delay >= time)
948 || (STAT(FROZEN, pl) || StatusEffects_active(STATUSEFFECT_Frozen, pl))
949 || (IS_DEAD(pl))
950 || (pl.vehicle)
951 ) { return; }
952
953 Vehicle info = veh.vehicledef; //REGISTRY_GET(Vehicles, veh.vehicleid);
954
955 if(autocvar_g_vehicles_enter) // vehicle's touch function should handle this if entering via use key is disabled (TODO)
956 if(veh.vehicle_flags & VHF_MULTISLOT)
957 if(veh.owner && SAME_TEAM(pl, veh))
958 {
959 // we don't need a return value or anything here
960 // if successful the owner check below will prevent anything weird
961 info.vr_gunner_enter(info, veh, pl);
962 }
963
964 if(veh.owner)
965 return; // got here and didn't enter the gunner, return
966
967 if(teamplay)
968 if(veh.team)
969 if(DIFF_TEAM(pl, veh))
970 if(autocvar_g_vehicles_steal)
971 {
972 FOREACH_CLIENT(IS_PLAYER(it) && SAME_TEAM(it, veh), Send_Notification(NOTIF_ONE, it, MSG_CENTER, CENTER_VEHICLE_STEAL));
973
974 Send_Notification(NOTIF_ONE, pl, MSG_CENTER, CENTER_VEHICLE_STEAL_SELF);
975
976 veh.vehicle_shield = 0;
977 veh.old_vehicle_flags = veh.vehicle_flags; // make a backup just so we're not permanently crippling this vehicle
978 veh.vehicle_flags &= ~VHF_SHIELDREGEN;
979
980 if (autocvar_g_vehicles_steal_show_waypoint) {
981 entity wp = WaypointSprite_Spawn(WP_VehicleIntruder, 0, 0, pl, '0 0 68', NULL, veh.team, veh, wps_intruder, true, RADARICON_DANGER);
982 wp.colormod = Team_ColorRGB(pl.team);
983 }
984 }
985 else return;
986
988
989 veh.vehicle_ammo1 = 0;
990 veh.vehicle_ammo2 = 0;
991 veh.vehicle_reload1 = 0;
992 veh.vehicle_reload2 = 0;
993 veh.vehicle_energy = 0;
994
995 veh.owner = pl;
996 pl.vehicle = veh;
997
998 // .viewmodelforclient works better.
999 //veh.vehicle_hudmodel.drawonlytoclient = veh.owner;
1000
1001 veh.vehicle_hudmodel.viewmodelforclient = pl;
1002
1003 UNSET_DUCKED(pl);
1004 pl.view_ofs = STAT(PL_VIEW_OFS, pl);
1005 setsize(pl, STAT(PL_MIN, pl), STAT(PL_MAX, pl));
1006
1007 veh.event_damage = vehicles_damage;
1008 veh.event_heal = vehicles_heal;
1009 veh.nextthink = 0;
1010 pl.items &= ~IT_USING_JETPACK;
1011 pl.angles = veh.angles;
1012 pl.takedamage = DAMAGE_NO;
1013 pl.solid = SOLID_NOT;
1014 pl.disableclientprediction = 1; // physics is no longer run, so this won't be reset
1016 pl.teleportable = false;
1017 pl.alpha = -1;
1018 pl.event_damage = func_null;
1019 pl.view_ofs = '0 0 0';
1020 veh.colormap = pl.colormap;
1021 if(veh.tur_head)
1022 veh.tur_head.colormap = pl.colormap;
1023 for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
1024 {
1025 .entity weaponentity = weaponentities[slot];
1026 veh.(weaponentity) = new(temp_wepent);
1027 veh.(weaponentity).m_switchweapon = pl.(weaponentity).m_switchweapon;
1028 }
1029 STAT(HUD, pl) = veh.vehicleid;
1030 pl.PlayerPhysplug = veh.PlayerPhysplug;
1031
1032 pl.vehicle_ammo1 = veh.vehicle_ammo1;
1033 pl.vehicle_ammo2 = veh.vehicle_ammo2;
1034 pl.vehicle_reload1 = veh.vehicle_reload1;
1035 pl.vehicle_reload2 = veh.vehicle_reload2;
1036 pl.vehicle_energy = veh.vehicle_energy;
1037
1038 // Cant do this, hides attached objects too.
1039 //veh.exteriormodeltoclient = veh.owner;
1040 //veh.tur_head.exteriormodeltoclient = veh.owner;
1041
1042 UNSET_ONGROUND(pl);
1043 UNSET_ONGROUND(veh);
1044
1045 veh.team = pl.team;
1046 veh.flags -= FL_NOTARGET;
1047
1048 vehicles_reset_colors(veh, pl);
1049
1050 if (IS_REAL_CLIENT(pl))
1051 {
1052 Send_Notification(NOTIF_ONE, pl, MSG_CENTER, CENTER_VEHICLE_ENTER);
1053
1054 msg_entity = pl;
1056 WriteEntity(MSG_ONE, veh.vehicle_viewport);
1057
1058 // NOTE: engine networked
1060 if(veh.tur_head)
1061 {
1062 WriteAngle(MSG_ONE, veh.tur_head.angles_x + veh.angles_x); // tilt
1063 WriteAngle(MSG_ONE, veh.tur_head.angles_y + veh.angles_y); // yaw
1064 WriteAngle(MSG_ONE, 0); // roll
1065 }
1066 else
1067 {
1068 WriteAngle(MSG_ONE, veh.angles_x * -1); // tilt
1069 WriteAngle(MSG_ONE, veh.angles_y); // yaw
1070 WriteAngle(MSG_ONE, 0); // roll
1071 }
1072 }
1073
1075
1076 CSQCVehicleSetup(pl, veh.vehicleid);
1077
1078 MUTATOR_CALLHOOK(VehicleEnter, pl, veh);
1079
1081 info.vr_enter(info, veh);
1082
1083 antilag_clear(pl, CS(pl));
1084}
1085
1087{
1089
1090 if(this.owner)
1091 STAT(VEHICLESTAT_W2MODE, this.owner) = STAT(VEHICLESTAT_W2MODE, this);
1092
1093 Vehicle info = this.vehicledef; //REGISTRY_GET(Vehicles, this.vehicleid);
1094 info.vr_think(info, this);
1095
1096 vehicles_painframe(this);
1097
1099}
1100
1102{
1103 if(this.owner)
1105
1107
1108 if(this.active != ACTIVE_NOT)
1109 vehicles_spawn(this);
1110}
1111
1112// initialization
1114{
1115 LOG_DEBUG("Spawning vehicle: ", this.classname);
1116
1117 // disown & reset
1118 this.vehicle_hudmodel.viewmodelforclient = this;
1119
1120 this.owner = NULL;
1121 settouch(this, vehicles_touch);
1122 this.event_damage = vehicles_damage;
1123 this.event_heal = vehicles_heal;
1124 this.reset = vehicles_reset;
1125 this.iscreature = true;
1126 this.teleportable = false; // no teleporting for vehicles, too buggy
1127 this.damagedbycontents = true;
1129 this.solid = SOLID_SLIDEBOX;
1130 this.takedamage = DAMAGE_AIM;
1131 this.deadflag = DEAD_NO;
1132 if(!this.bot_attack)
1133 IL_PUSH(g_bot_targets, this);
1134 this.bot_attack = true;
1135 this.flags = FL_NOTARGET;
1136 this.avelocity = '0 0 0';
1137 this.velocity = '0 0 0';
1138 setthink(this, vehicles_think);
1139 this.nextthink = time;
1140
1141 // Reset locking
1142 this.lock_strength = 0;
1143 this.lock_target = NULL;
1144 this.misc_bulletcounter = 0;
1145
1146 // Return to spawn
1147 this.angles = this.pos2;
1148 setorigin(this, this.pos1);
1149 // Show it
1150 Send_Effect(EFFECT_TELEPORT, this.origin + '0 0 64', '0 0 0', 1);
1151
1152 if(this.vehicle_controller)
1153 this.team = this.vehicle_controller.team;
1154
1156 {
1157 for(int slot = 0; slot < MAX_WEAPONSLOTS; ++slot)
1158 {
1159 .entity weaponentity = weaponentities[slot];
1160 if(it.(weaponentity).hook.aiment == this)
1161 RemoveHook(it.(weaponentity).hook);
1162 }
1163 });
1164
1165
1166 Vehicle info = this.vehicledef; //REGISTRY_GET(Vehicles, this.vehicleid);
1167 info.vr_spawn(info, this);
1168
1170
1171 CSQCMODEL_AUTOINIT(this);
1172}
1173
1174bool vehicle_initialize(entity this, Vehicle info, bool nodrop)
1175{
1177 return false;
1178
1179 if(!info.vehicleid)
1180 return false;
1181
1182 if(!this.tur_head)
1183 info.vr_precache(info);
1184
1185 if(this.targetname && this.targetname != "")
1186 {
1188 if(!this.vehicle_controller)
1189 {
1190 LOG_DEBUG("^1WARNING: ^7Vehicle with invalid .targetname");
1191 this.active = ACTIVE_ACTIVE;
1192 }
1193 else
1194 {
1195 this.team = this.vehicle_controller.team;
1196 this.use = vehicle_use;
1197
1198 if(teamplay)
1199 {
1200 if(this.vehicle_controller.team == 0)
1201 this.active = ACTIVE_NOT;
1202 else
1203 this.active = ACTIVE_ACTIVE;
1204 }
1205 }
1206 }
1207 else { this.active = ACTIVE_ACTIVE; }
1208
1209 if(this.team && (!teamplay || !autocvar_g_vehicles_teams))
1210 this.team = 0;
1211
1212 if(this.mdl == "" || !this.mdl)
1213 _setmodel(this, info.model);
1214 else
1215 _setmodel(this, this.mdl);
1216
1218
1221 this.tur_head = new(tur_head);
1222 this.tur_head.owner = this;
1223 this.takedamage = DAMAGE_NO;
1224 this.bot_attack = true;
1225 IL_PUSH(g_bot_targets, this);
1226 this.iscreature = true;
1227 this.teleportable = false; // no teleporting for vehicles, too buggy
1228 this.damagedbycontents = true;
1230 this.vehicleid = info.vehicleid;
1231 this.vehicledef = info;
1232 this.PlayerPhysplug = info.PlayerPhysplug;
1233 this.event_damage = func_null;
1234 this.event_heal = func_null;
1235 settouch(this, vehicles_touch);
1236 setthink(this, vehicles_spawn);
1237 this.nextthink = time;
1238 this.effects = EF_NODRAW;
1240
1243
1245 this.effects |= EF_NODEPTHTEST;
1246
1248 this.effects |= EF_FULLBRIGHT;
1249
1250 _setmodel(this.vehicle_hudmodel, info.hud_model);
1251 setmodel(this.vehicle_viewport, MDL_Null);
1252
1253 if(info.head_model != "")
1254 {
1255 _setmodel(this.tur_head, info.head_model);
1256 setattachment(this.tur_head, this, info.tag_head);
1257 setattachment(this.vehicle_hudmodel, this.tur_head, info.tag_hud);
1258 setattachment(this.vehicle_viewport, this.vehicle_hudmodel, info.tag_view);
1259 }
1260 else
1261 {
1262 setattachment(this.tur_head, this, "");
1263 setattachment(this.vehicle_hudmodel, this, info.tag_hud);
1264 setattachment(this.vehicle_viewport, this.vehicle_hudmodel, info.tag_view);
1265 }
1266
1267 setsize(this, info.m_mins, info.m_maxs);
1268
1269 info.vr_setup(info, this);
1270
1271 if(!nodrop)
1272 {
1273 setorigin(this, this.origin);
1274 tracebox(this.origin + '0 0 100', info.m_mins, info.m_maxs, this.origin - '0 0 10000', MOVE_WORLDONLY, this);
1275 setorigin(this, trace_endpos);
1276 }
1277
1278 this.pos1 = this.origin;
1279 this.pos2 = this.angles;
1280 this.tur_head.team = this.team;
1281
1282 if(this.active == ACTIVE_NOT)
1283 this.nextthink = 0; // wait until activated
1286 else
1287 this.nextthink = time + game_starttime;
1288
1289 if(MUTATOR_CALLHOOK(VehicleInit, this))
1290 return false;
1291
1292 return true;
1293}
vector AnglesTransform_ToAngles(vector v)
vector AnglesTransform_LeftDivide(vector from_transform, vector to_transform)
vector AnglesTransform_Normalize(vector t, float minimize_roll)
vector AnglesTransform_FromAngles(vector v)
void antilag_clear(entity e, entity store)
Definition antilag.qc:114
float bot_attack
Definition api.qh:38
IntrusiveList g_bot_targets
Definition api.qh:149
IntrusiveList g_bot_dodge
Definition api.qh:150
#define MUTATOR_CALLHOOK(id,...)
Definition base.qh:143
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
float max_health
float pain_finished
void SetResource(entity e, Resource res_type, float amount)
Sets the current amount of resource the given entity will have.
float GetResource(entity e, Resource res_type)
Returns the current amount of resource the given entity has.
void TakeResource(entity receiver, Resource res_type, float amount)
Takes an entity some resource.
bool SetResourceExplicit(entity e, Resource res_type, float amount)
Sets the resource amount of an entity without calling any hooks.
const int MAX_AXH
Definition model.qh:3
virtual void vr_gunner_enter()
(SERVER) called when a player enters this vehicle while occupied
Definition vehicle.qh:70
string hud_model
cockpit model
Definition vehicle.qh:24
string head_model
full name of tur_head model
Definition vehicle.qh:22
vector m_mins
vehicle hitbox size
Definition vehicle.qh:36
string model
full name of model
Definition vehicle.qh:18
virtual void vr_precache()
(BOTH) precaches models/sounds used by this vehicle
Definition vehicle.qh:66
virtual void vr_impact()
(SERVER) called when a vehicle hits something
Definition vehicle.qh:74
virtual void vr_think()
(SERVER) logic to run every frame
Definition vehicle.qh:62
virtual void vr_enter()
(SERVER) called when a player enters this vehicle
Definition vehicle.qh:68
virtual void vr_setup()
(BOTH) setup vehicle data
Definition vehicle.qh:60
virtual void vr_death()
(SERVER) called when vehicle dies
Definition vehicle.qh:64
vector m_maxs
vehicle hitbox size
Definition vehicle.qh:38
int vehicleid
Definition vehicle.qh:8
virtual void vr_setcolors()
(SERVER) called when a vehicle's colors are being reset, so modules can be updated
Definition vehicle.qh:76
string netname
Definition powerups.qc:20
float cnt
Definition powerups.qc:24
vector colormod
Definition powerups.qc:21
float alpha
Definition items.qc:13
entity owner
Definition main.qh:87
int team
Definition main.qh:188
const int IT_USING_JETPACK
Definition item.qh:27
string mdl
Definition item.qh:89
#define setmodel(this, m)
Definition model.qh:26
#define IS_DEAD(s)
Definition player.qh:245
#define UNSET_DUCKED(s)
Definition player.qh:212
#define IS_PLAYER(s)
Definition player.qh:243
float game_starttime
Definition stats.qh:82
float game_stopped
Definition stats.qh:81
vector real_origin(entity ent)
Definition util.qc:148
const vector PL_MIN_CONST
Definition constants.qh:56
const int FL_PROJECTILE
Definition constants.qh:85
const int FL_NOTARGET
Definition constants.qh:76
const int HUD_NORMAL
Definition constants.qh:47
const vector PL_MAX_CONST
Definition constants.qh:55
string classname
float flags
const float SOLID_SLIDEBOX
entity trace_ent
float DPCONTENTS_SOLID
vector avelocity
const float MOVE_NORMAL
vector mins
const float SOLID_CORPSE
vector velocity
const float EF_ADDITIVE
float DPCONTENTS_BODY
const float SOLID_BBOX
const float EF_FULLBRIGHT
const float SOLID_NOT
float effects
float DPCONTENTS_PLAYERCLIP
float time
vector trace_endpos
float trace_startsolid
vector maxs
const float EF_FLAME
float nextthink
float MOVE_WORLDONLY
float trace_dphitq3surfaceflags
float colormap
vector absmax
const float EF_NODEPTHTEST
const float EF_SELECTABLE
vector origin
float trace_fraction
vector absmin
float trace_allsolid
float Q3SURFACEFLAG_NOIMPACT
const float EF_NOSHADOW
const float EF_NODRAW
float dphitcontentsmask
#define spawn
#define use
entity tag_entity
const int EF_TELEPORT_BIT
const int EF_DOUBLESIDED
#define CSQCMODEL_AUTOUPDATE(e)
#define CSQCMODEL_AUTOINIT(e)
void CSQCProjectile(entity e, float clientanimate, int type, float docull)
void Damage(entity targ, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
Definition damage.qc:503
float RadiusDamage(entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity cantbe, entity mustbe, float forceintensity, int deathtype,.entity weaponentity, entity directhitentity)
Definition damage.qc:981
float damagedbycontents
Definition damage.qh:45
IntrusiveList g_damagedbycontents
Definition damage.qh:135
#define DMG_NOWEP
Definition damage.qh:104
float damageforcescale
#define DEATH_ISWEAPON(t, w)
Definition all.qh:46
#define DEATH_WEAPONOF(t)
Definition all.qh:45
void SUB_Remove(entity this)
Remove entity.
Definition defer.qh:13
const int ACTIVE_NOT
Definition defs.qh:36
int active
Definition defs.qh:34
const int ACTIVE_ACTIVE
Definition defs.qh:37
float EF_NOGUNBOB
float EF_LOWPRECISION
#define gettagindex
void Send_Effect(entity eff, vector eff_loc, vector eff_vel, int eff_cnt)
Definition all.qc:124
ent angles
Definition ent_cs.qc:121
solid
Definition ent_cs.qc:165
float timer
Definition hud.qh:125
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
#define IL_EACH(this, cond, body)
#define FOREACH_ENTITY_ENT(fld, match, body)
Definition iter.qh:179
#define TC(T, sym)
Definition _all.inc:82
#define bool
Definition _all.inc:24
const int MSG_ENTITY
Definition net.qh:115
#define WriteHeader(to, id)
Definition net.qh:221
void Net_LinkEntity(entity e, bool docull, float dt, bool(entity this, entity to, int sendflags) sendfunc)
Definition net.qh:123
#define STAT(...)
Definition stats.qh:82
#define LOG_TRACE(...)
Definition log.qh:76
#define LOG_DEBUG(...)
Definition log.qh:80
float MSG_ONE
Definition menudefs.qc:56
float bound(float min, float value, float max)
entity find(entity start,.string field, string match)
float random(void)
float vlen(vector v)
vector vectoangles(vector v)
void WriteEntity(entity data, float dest, float desto)
vector randomvec(void)
float min(float f,...)
float rint(float f)
vector normalize(vector v)
void WriteByte(float data, float dest, float desto)
float fabs(float f)
void WriteAngle(float data, float dest, float desto)
float MSG_BROADCAST
Definition menudefs.qc:55
float max(float f,...)
void set_movetype(entity this, int mt)
Definition movetypes.qc:4
const int MOVETYPE_WALK
Definition movetypes.qh:132
const int MOVETYPE_FLYMISSILE
Definition movetypes.qh:138
#define UNSET_ONGROUND(s)
Definition movetypes.qh:18
const int MOVETYPE_NOCLIP
Definition movetypes.qh:137
const int MOVETYPE_TOSS
Definition movetypes.qh:135
var void func_null()
void Send_Notification(NOTIF broadcast, entity client, MSG net_type, Notification net_name,...count)
Definition all.qc:1573
void Kill_Notification(NOTIF broadcast, entity client, MSG net_type, CPID net_cpid)
Definition all.qc:1537
#define NULL
Definition post.qh:14
#define gettaginfo
Definition post.qh:32
entity msg_entity
Definition progsdefs.qc:63
float DEAD_NO
Definition progsdefs.qc:274
float deadflag
Definition progsdefs.qc:149
#define stuffcmd(cl,...)
Definition progsdefs.qh:23
const int RES_LIMIT_NONE
Definition resources.qh:60
#define setthink(e, f)
vector
Definition self.qh:92
#define setcefc(e, f)
vector org
Definition self.qh:92
entity entity toucher
Definition self.qh:72
#define settouch(e, f)
Definition self.qh:73
bool autocvar_g_fullbrightplayers
Definition client.qh:17
bool autocvar_g_playerclip_collisions
Definition client.qh:18
bool autocvar_g_nodepthtestplayers
Definition client.qh:34
void RemoveHook(entity this)
Definition hook.qc:48
void RemoveGrapplingHooks(entity pl)
Definition hook.qc:30
int int int imp
Definition impulse.qc:90
float respawntime
Definition items.qh:30
vector oldvelocity
Definition main.qh:42
bool iscreature
Definition main.qh:46
void PlayerDamage(entity this, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
Definition player.qc:234
int projectiledeathtype
Definition common.qh:21
#define PROJECTILE_TOUCH(e, t)
Definition common.qh:28
IntrusiveList g_projectiles
Definition common.qh:58
#define PROJECTILE_MAKETRIGGER(e)
Definition common.qh:34
float misc_bulletcounter
Definition common.qh:19
const int CH_PAIN
Definition sound.qh:18
const int CH_TRIGGER_SINGLE
Definition sound.qh:13
const float VOL_BASE
Definition sound.qh:36
const int CH_SHOTS
Definition sound.qh:14
const int CH_WEAPON_A
Definition sound.qh:7
const float ATTEN_NORM
Definition sound.qh:30
#define sound(e, c, s, v, a)
Definition sound.qh:52
void play2(entity e, string filename)
Definition all.qc:116
float spamsound(entity e, int chan, Sound samp, float vol, float _atten)
use this one if you might be causing spam (e.g.
Definition all.qc:124
bool sound_allowed(int to, entity e)
Definition all.qc:9
ClientState CS(Client this)
Definition state.qh:47
bool StatusEffects_active(StatusEffect this, entity actor)
const int DAMAGE_NO
Definition subs.qh:79
vector pos2
Definition subs.qh:50
vector pos1
Definition subs.qh:50
const int DAMAGE_AIM
Definition subs.qh:81
float takedamage
Definition subs.qh:78
entity enemy
Definition sv_ctf.qh:153
void CSQCModel_UnlinkEntity(entity e)
Definition sv_model.qc:129
void GiveResourceWithLimit(entity receiver, Resource res_type, float amount, float limit)
Gives an entity some resource but not more than a limit.
entity tur_head
Definition sv_turrets.qh:28
void vehicles_enter(entity pl, entity veh)
void vehicles_impact(entity this, float _minspeed, float _speedfac, float _maxpain)
void vehicles_showwp_goaway(entity this)
void vehicles_reset_colors(entity this, entity player)
bool vehicle_initialize(entity this, Vehicle info, bool nodrop)
void vehicles_setreturn(entity veh)
void vehicles_touch(entity this, entity toucher)
entity vehicles_projectile(entity this, entity _mzlfx, Sound _mzlsound, vector _org, vector _vel, float _dmg, float _radi, float _force, float _size, int _deahtype, float _projtype, float _health, bool _cull, bool _clianim, entity _owner)
void vehicles_exit(entity vehic, bool eject)
void vehicle_use(entity this, entity actor, entity trigger)
void vehicles_regen(entity this, float timer,.float regen_field, float field_max, float rpause, float regen, float delta_time, float _healthscale)
void vehicles_reset(entity this)
vector vehicles_findgoodexit(entity this, entity player, vector prefer_spot)
void shieldhit_think(entity this)
vector axh_prevorigin
bool vehicle_addplayerslot(entity _owner, entity _slot, int _hud, Model _hud_model, bool(entity, float) _framefunc, void(entity, bool) _exitfunc, float(entity, entity) _enterfunc)
void UpdateAuxiliaryXhair(entity own, vector loc, vector clr, int axh_id)
void vehicles_projectile_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
bool AuxiliaryXhair_customize(entity this, entity client)
bool vehicle_impulse(entity this, int imp)
void vehicles_projectile_explode(entity this, entity toucher)
bool SendAuxiliaryXhair(entity this, entity to, int sf)
bool vehicles_heal(entity targ, entity inflictor, float amount, float limit)
int old_vehicle_flags
void vehicles_think(entity this)
void vehicles_regen_resource(entity this, float timer,.float regen_field, float field_max, float rpause, float regen, float delta_time, float _healthscale, Resource resource)
void vehicles_painframe(entity this)
void vehicles_gib_explode(entity this)
void vehicles_spawn(entity this)
void CSQCVehicleSetup(entity own, int vehicle_id)
void vehicles_return(entity this)
bool vehicles_crushable(entity e)
void vehicles_projectile_explode_think(entity this)
vector vehicle_aimturret(entity _vehic, vector _target, entity _turrret, string _tagname, float _pichlimit_min, float _pichlimit_max, float _rotlimit_min, float _rotlimit_max, float _aimspeed, float dt)
void vehicles_gib_touch(entity this, entity toucher)
void vehicles_clearreturn(entity veh)
void vehicles_damage(entity this, entity inflictor, entity attacker, float damage, int deathtype,.entity weaponentity, vector hitloc, vector force)
void vehicles_showwp(entity this)
void vehicles_projectile_explode_use(entity this, entity actor, entity trigger)
void vehicles_frame(entity this, entity actor)
void vehicles_gib_think(entity this)
vector axh_prevcolors
entity vehicle_tossgib(entity this, entity _template, vector _vel, string _tag, bool _burn, bool _explode, float _maxtime, vector _rot)
void vehicles_locktarget(entity this, float incr, float decr, float _lock_time)
const float vehicle_shield
If ent is player this is 0..100 indicating precentage of energy left on vehicle. If ent is vehicle,...
float dmg_time
const float SVC_SETVIEWANGLES
float autocvar_g_vehicles_delayspawn_jitter
float autocvar_g_vehicles_vaporizer_damagerate
entity vehicle_viewport
const float SVC_SETVIEWPORT
float pain_frame
const int VHEF_EJECT
User pressed exit key.
bool autocvar_g_vehicles_delayspawn
float vehicles_exit_running
Release ownership, client possibly allready dissconnected / went spec / changed team / used "kill" (n...
const int VHEF_RELEASE
User pressed exit key 3 times fast (not implemented) or vehicle is dying.
bool autocvar_g_vehicles
Definition sv_vehicles.qh:8
float autocvar_g_vehicles_weapon_damagerate
entity vehicle_controller
float autocvar_g_vehicles_crush_force
float autocvar_g_vehicles_crush_minspeed
float lock_time
entity vehicle
Entity to disply the shild effect on damage.
float autocvar_g_vehicles_allow_bots
float autocvar_g_vehicles_machinegun_damagerate
int vehicle_flags
float autocvar_g_vehicles_tag_damagerate
int autocvar_g_vehicles_exit_attempts
float autocvar_g_vehicles_thinkrate
float lock_strength
float autocvar_g_vehicles_rifle_damagerate
entity vehicle_hudmodel
IntrusiveList g_vehicle_returners
float autocvar_g_vehicles_vortex_damagerate
float play_time
entity vehicle_shieldent
entity wps_intruder
entity lock_target
float autocvar_g_vehicles_crush_dmg
float lock_soundtime
#define SAME_TEAM(a, b)
Definition teams.qh:241
vector Team_ColorRGB(int teamid)
Definition teams.qh:76
bool teamplay
Definition teams.qh:59
#define DIFF_TEAM(a, b)
Definition teams.qh:242
const int TELEPORT_NORMAL
float teleportable
entity realowner
string targetname
Definition triggers.qh:56
string target
Definition triggers.qh:55
#define IS_TURRET(v)
Definition utils.qh:23
#define IS_REAL_CLIENT(v)
Definition utils.qh:17
#define IS_MONSTER(v)
Definition utils.qh:21
#define FOREACH_CLIENT(cond, body)
Definition utils.qh:50
#define IS_VEHICLE(v)
Definition utils.qh:22
#define IS_BOT_CLIENT(v)
want: (IS_CLIENT(v) && !IS_REAL_CLIENT(v))
Definition utils.qh:15
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt()
Definition vector.qh:8
entity wp00
const int VHF_PLAYERSLOT
Vehicle has multiple player slots.
Definition vehicle.qh:97
const int VHF_HASSHIELD
Indicates vehicle.
Definition vehicle.qh:85
const int VHF_MULTISLOT
Add random head angles each frame if health < 50%.
Definition vehicle.qh:96
entity vehicledef
Definition vehicle.qh:101
const int VHF_DMGSHAKE
Vehicle is airborn.
Definition vehicle.qh:93
const int VHF_DMGHEADROLL
Add random angles each frame if health < 50%.
Definition vehicle.qh:95
const int VHF_ISVEHICLE
Definition vehicle.qh:84
const int VHF_SHIELDREGEN
Vehicle has shileding.
Definition vehicle.qh:86
const int VHF_DEATHEJECT
Vehicles energy regenerates.
Definition vehicle.qh:89
const int VHF_DMGROLL
Add random velocity each frame if health < 50%.
Definition vehicle.qh:94
float myhealth
Definition view.qc:644
void WaypointSprite_Kill(entity wp)
void WaypointSprite_Ping(entity e)
entity WaypointSprite_Spawn(entity spr, float _lifetime, float maxdistance, entity ref, vector ofs, entity showto, float t, entity own,.entity ownfield, float hideable, entity icon)
entity WaypointSprite_getviewentity(entity e)
void WaypointSprite_UpdateBuildFinished(entity e, float f)
void WaypointSprite_UpdateRule(entity e, float t, float r)
const int SPRITERULE_DEFAULT
entity waypointsprite_attached
const int MAX_WEAPONSLOTS
Definition weapon.qh:16
entity weaponentities[MAX_WEAPONSLOTS]
Definition weapon.qh:17
bool weaponLocked(entity player)
Weapon m_switchweapon
Definition wepent.qh:25
float default_player_alpha
Definition world.qh:72