Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
server.qc File Reference
Include dependency graph for server.qc:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define WarpZone_StoreProjectileData(e_)

Functions

 spawnfunc (func_camera)
 spawnfunc (misc_warpzone_position)
 spawnfunc (target_warpzone_reconnect)
 spawnfunc (trigger_warpzone)
 spawnfunc (trigger_warpzone_position)
 spawnfunc (trigger_warpzone_reconnect)
void trigger_warpzone_reconnect_use (entity this, entity actor, entity trigger)
bool visible_to_some_client (entity ent)
bool WarpZone_Camera_Send (entity this, entity to, int sf)
void WarpZone_InitStep_ClearTarget (entity this)
void WarpZone_InitStep_FinalizeTransform (entity this)
void WarpZone_InitStep_FindOriginTarget (entity this)
void WarpZone_InitStep_FindTarget (entity this)
void WarpZone_InitStep_UpdateTransform (entity this)
void WarpZone_PlayerPhysics_FixVAngle (entity this)
float WarpZone_Projectile_Touch (entity this, entity toucher)
bool WarpZone_Send (entity this, entity to, int sf)
void WarpZone_StartFrame ()
float WarpZone_Teleport (entity wz, entity player, float f0, float f1)
bool WarpZone_Teleported_Send (entity this, entity to, int sf)
void WarpZone_TeleportPlayer (entity teleporter, entity player, vector to, vector to_angles, vector to_velocity)
void WarpZone_Think (entity this)
void WarpZone_Touch (entity this, entity toucher)
void WarpZoneCamera_InitStep_FindTarget (entity this)
void WarpZoneCamera_Think (entity this)
void WarpZonePosition_InitStep_FindTarget (entity this)
void WarpZones_Reconnect ()

Variables

bool autocvar_sv_warpzone_allow_selftarget
entity warpzone_camera_first
float warpzone_initialized
entity warpzone_next
vector warpzone_oldangles
vector warpzone_oldorigin
vector warpzone_oldvelocity
entity warpzone_position_first
float warpzone_reconnecting
vector warpzone_save_angles
vector warpzone_save_eangles
vector warpzone_save_eorigin
vector warpzone_save_origin
float warpzone_teleport_finishtime
float warpzone_teleport_time
entity warpzone_teleport_zone

Macro Definition Documentation

◆ WarpZone_StoreProjectileData

#define WarpZone_StoreProjectileData ( e_)
Value:
MACRO_BEGIN \
entity e = e_; \
e.warpzone_oldorigin = e.origin; \
e.warpzone_oldvelocity = e.velocity; \
e.warpzone_oldangles = e.angles; \
#define MACRO_END
Definition macro.qh:7

Definition at line 36 of file server.qc.

36#define WarpZone_StoreProjectileData(e_) MACRO_BEGIN \
37 entity e = e_; \
38 e.warpzone_oldorigin = e.origin; \
39 e.warpzone_oldvelocity = e.velocity; \
40 e.warpzone_oldangles = e.angles; \
41MACRO_END

Referenced by WarpZone_StartFrame(), and WarpZone_Teleport().

Function Documentation

◆ spawnfunc() [1/6]

spawnfunc ( func_camera )

Definition at line 677 of file server.qc.

678{
679 if (!this.scale)
680 this.scale = this.modelscale;
681 if (!this.scale)
682 this.scale = 1;
683 if (this.model != "")
684 {
685 precache_model(this.model);
686 _setmodel(this, this.model); // no precision needed
687 }
688 setorigin(this, this.origin);
689 if (this.scale)
690 setsize(this, this.mins * this.scale, this.maxs * this.scale);
691 else
692 setsize(this, this.mins, this.maxs);
693 if (!this.solid)
694 this.solid = SOLID_BSP;
695 else if (this.solid < 0)
696 this.solid = SOLID_NOT;
698 this.SendFlags = 0xFFFFFF;
701}
vector mins
const float SOLID_NOT
vector maxs
vector origin
float solid
const float SOLID_BSP
model
Definition ent_cs.qc:164
int SendFlags
Definition net.qh:159
float modelscale
Definition models.qh:3
float scale
Definition projectile.qc:14
#define setSendEntity(e, f)
bool WarpZone_Camera_Send(entity this, entity to, int sf)
Definition server.qc:264
entity warpzone_camera_first
Definition server.qc:640
entity warpzone_next
Definition server.qc:641

References maxs, mins, model, modelscale, origin, scale, SendFlags, setSendEntity, solid, SOLID_BSP, SOLID_NOT, warpzone_camera_first, WarpZone_Camera_Send(), and warpzone_next.

◆ spawnfunc() [2/6]

spawnfunc ( misc_warpzone_position )

Definition at line 642 of file server.qc.

643{
644 // "target", "angles", "origin"
647}
entity warpzone_position_first
Definition server.qc:639

References warpzone_next, and warpzone_position_first.

◆ spawnfunc() [3/6]

spawnfunc ( target_warpzone_reconnect )

Definition at line 812 of file server.qc.

813{
814 spawnfunc_trigger_warpzone_reconnect(this); // both names make sense here :(
815}

◆ spawnfunc() [4/6]

spawnfunc ( trigger_warpzone )

Definition at line 652 of file server.qc.

653{
654 // warp zone entities must have:
655 // "killtarget" pointing to a target_position with a direction arrow
656 // that points AWAY from the warp zone, and that is inside
657 // the warp zone trigger
658 // "target" pointing to an identical warp zone at another place in
659 // the map, with another killtarget to designate its
660 // orientation
661
662 if (!this.scale)
663 this.scale = this.modelscale;
664 if (!this.scale)
665 this.scale = 1;
666
668
670 this.SendFlags = 0xFFFFFF;
673 warpzone_first = this;
674
675 IL_PUSH(g_warpzones, this);
676}
float effects
const float EF_NODEPTHTEST
ERASEABLE entity IL_PUSH(IntrusiveList this, entity it)
Push to tail.
#define BITSET_ASSIGN(a, b)
Definition common.qh:107
IntrusiveList g_warpzones
Definition common.qh:6
bool WarpZone_Send(entity this, entity to, int sf)
Definition server.qc:226
entity warpzone_first
Definition server.qh:4
void WarpZoneLib_ExactTrigger_Init(entity this, bool unsetmodel)
Definition util_server.qc:8

References BITSET_ASSIGN, EF_NODEPTHTEST, effects, g_warpzones, IL_PUSH(), modelscale, scale, SendFlags, setSendEntity, warpzone_first, warpzone_next, WarpZone_Send(), and WarpZoneLib_ExactTrigger_Init().

◆ spawnfunc() [5/6]

spawnfunc ( trigger_warpzone_position )

Definition at line 648 of file server.qc.

649{
650 spawnfunc_misc_warpzone_position(this);
651}

◆ spawnfunc() [6/6]

spawnfunc ( trigger_warpzone_reconnect )

Definition at line 807 of file server.qc.

808{
810}
#define use
void trigger_warpzone_reconnect_use(entity this, entity actor, entity trigger)
Definition server.qc:785

References trigger_warpzone_reconnect_use(), and use.

◆ trigger_warpzone_reconnect_use()

void trigger_warpzone_reconnect_use ( entity this,
entity actor,
entity trigger )

Definition at line 785 of file server.qc.

786{
787 // NOTE: this matches for target, not targetname, but of course
788 // targetname must be set too on the other entities
789 for (entity e = warpzone_first; e; e = e.warpzone_next)
790 e.warpzone_reconnecting = ((this.target == "" || e.target == this.target) && !((this.spawnflags & 1) && (visible_to_some_client(e) || visible_to_some_client(e.enemy))));
791 for (entity e = warpzone_camera_first; e; e = e.warpzone_next)
792 e.warpzone_reconnecting = ((this.target == "" || e.target == this.target) && !((this.spawnflags & 1) && visible_to_some_client(e)));
793 for (entity e = warpzone_first; e; e = e.warpzone_next)
794 if (e.warpzone_reconnecting)
796 for (entity e = warpzone_first; e; e = e.warpzone_next)
797 if (e.warpzone_reconnecting)
799 for (entity e = warpzone_camera_first; e; e = e.warpzone_next)
800 if (e.warpzone_reconnecting)
802 for (entity e = warpzone_first; e; e = e.warpzone_next)
803 if (e.warpzone_reconnecting || e.enemy.warpzone_reconnecting)
805}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
void WarpZoneCamera_InitStep_FindTarget(entity this)
Definition server.qc:467
bool visible_to_some_client(entity ent)
Definition server.qc:780
void WarpZone_InitStep_FindTarget(entity this)
Definition server.qc:586
void WarpZone_InitStep_ClearTarget(entity this)
Definition server.qc:579
void WarpZone_InitStep_FinalizeTransform(entity this)
Definition server.qc:616

References entity(), visible_to_some_client(), warpzone_camera_first, warpzone_first, WarpZone_InitStep_ClearTarget(), WarpZone_InitStep_FinalizeTransform(), WarpZone_InitStep_FindTarget(), and WarpZoneCamera_InitStep_FindTarget().

Referenced by spawnfunc().

◆ visible_to_some_client()

bool visible_to_some_client ( entity ent)

Definition at line 780 of file server.qc.

781{
782 FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it) && checkpvs(it.origin + it.view_ofs, ent), return true);
783 return false;
784}
#define IS_PLAYER(s)
Definition player.qh:242
float checkpvs(vector viewpos, entity viewee)
#define IS_REAL_CLIENT(v)
Definition utils.qh:17
#define FOREACH_CLIENT(cond, body)
Definition utils.qh:52

References checkpvs(), entity(), FOREACH_CLIENT, IS_PLAYER, and IS_REAL_CLIENT.

Referenced by trigger_warpzone_reconnect_use().

◆ WarpZone_Camera_Send()

bool WarpZone_Camera_Send ( entity this,
entity to,
int sf )

Definition at line 264 of file server.qc.

265{
266 sf = 0;
267 WriteHeader(MSG_ENTITY, ENT_CLIENT_WARPZONE_CAMERA);
268
269 if (this.warpzone_fadestart)
270 BITSET_ASSIGN(sf, 2);
271 if (this.origin != '0 0 0')
272 BITSET_ASSIGN(sf, 4);
274
275 // we need THESE to render the warpzone (and cull properly)...
276 if (sf & 4)
277 WriteVector(MSG_ENTITY, this.origin);
278
280 WriteVector(MSG_ENTITY, this.mins);
281 WriteVector(MSG_ENTITY, this.maxs);
282 WriteByte(MSG_ENTITY, bound(1, this.scale * 16, 255));
283
284 // we need THESE to calculate the proper transform
285 WriteVector(MSG_ENTITY, this.enemy.origin);
286 WriteVector(MSG_ENTITY, this.enemy.angles);
287
288 if (sf & 2)
289 {
292 }
293
294 return true;
295}
float modelindex
WriteByte(chan, ent.angles.y/DEC_FACTOR)
const int MSG_ENTITY
Definition net.qh:156
#define WriteHeader(to, id)
Definition net.qh:265
float warpzone_fadestart
Definition common.qh:24
float warpzone_fadeend
Definition common.qh:25
float bound(float min, float value, float max)
void WriteShort(float data, float dest, float desto)
entity enemy
Definition sv_ctf.qh:152

References BITSET_ASSIGN, bound(), enemy, entity(), maxs, mins, modelindex, MSG_ENTITY, origin, scale, warpzone_fadeend, warpzone_fadestart, WriteByte(), WriteHeader, and WriteShort().

Referenced by spawnfunc().

◆ WarpZone_InitStep_ClearTarget()

void WarpZone_InitStep_ClearTarget ( entity this)

Definition at line 579 of file server.qc.

580{
581 if (this.enemy)
582 this.enemy.enemy = NULL;
583 this.enemy = NULL;
584}
#define NULL
Definition post.qh:14

References enemy, entity(), and NULL.

Referenced by trigger_warpzone_reconnect_use(), and WarpZones_Reconnect().

◆ WarpZone_InitStep_FinalizeTransform()

void WarpZone_InitStep_FinalizeTransform ( entity this)

Definition at line 616 of file server.qc.

617{
618 if (!this.enemy || this.enemy.enemy != this)
619 {
620 error("Invalid warp zone detected. Killed.");
621 return;
622 }
623
625 WarpZone_SetUp(this, this.warpzone_origin, this.warpzone_angles, this.enemy.warpzone_origin, this.enemy.warpzone_angles);
627 this.SendFlags = 0xFFFFFF;
628 if (this.spawnflags & 1)
629 {
631 this.nextthink = time;
632 }
633 else
634 this.nextthink = 0;
635}
int spawnflags
Definition ammo.qh:15
float time
float nextthink
void WarpZone_Touch(entity this, entity toucher)
Definition server.qc:181
void WarpZone_SetUp(entity e, vector my_org, vector my_ang, vector other_org, vector other_ang)
Definition common.qc:60
vector warpzone_origin
Definition common.qh:17
float warpzone_warpzones_exist
Definition common.qh:12
vector warpzone_angles
Definition common.qh:18
#define error
Definition pre.qh:6
#define setthink(e, f)
#define settouch(e, f)
Definition self.qh:77
void WarpZone_Think(entity this)
Definition server.qc:714

References enemy, entity(), error, nextthink, SendFlags, setthink, settouch, spawnflags, time, warpzone_angles, warpzone_origin, WarpZone_SetUp(), WarpZone_Think(), WarpZone_Touch(), and warpzone_warpzones_exist.

Referenced by trigger_warpzone_reconnect_use(), WarpZone_Think(), and WarpZones_Reconnect().

◆ WarpZone_InitStep_FindOriginTarget()

void WarpZone_InitStep_FindOriginTarget ( entity this)

Definition at line 415 of file server.qc.

416{
417 if (this.killtarget != "")
418 {
419 this.aiment = find(NULL, targetname, this.killtarget);
420 if (this.aiment == NULL)
421 {
422 error("Warp zone with nonexisting killtarget");
423 return;
424 }
425 this.killtarget = string_null;
426 }
427}
entity find(entity start,.string field, string match)
entity aiment
Definition movetypes.qh:90
string string_null
Definition nil.qh:9
string killtarget
Definition subs.qh:48
string targetname
Definition triggers.qh:56

References aiment, entity(), error, find(), killtarget, NULL, string_null, and targetname.

Referenced by WarpZone_StartFrame().

◆ WarpZone_InitStep_FindTarget()

void WarpZone_InitStep_FindTarget ( entity this)

Definition at line 586 of file server.qc.

587{
588 if (this.enemy)
589 return;
590
591 // this way only one of the two ents needs to target
592 if (this.target != "")
593 {
595 this.enemy = this; // so the if (!e.enemy) check also skips this, saves one IF
596
597 int i;
598 entity e, e2 = NULL;
599 for (e = NULL, i = 0; (e = find(e, targetname, this.target)); )
600 if (!e.enemy)
601 if (e.classname == this.classname) // possibly non-warpzones may use the same targetname!
602 if (random() * ++i < 1)
603 e2 = e;
604 if (!e2)
605 {
606 this.enemy = NULL;
607 error("Warpzone with non-existing target");
608 return;
609 }
610 this.enemy = e2;
611 e2.enemy = this;
612 }
613}
float random(void)
bool autocvar_sv_warpzone_allow_selftarget
Definition server.qc:17
string target
Definition triggers.qh:55

References autocvar_sv_warpzone_allow_selftarget, enemy, entity(), error, find(), NULL, random(), target, and targetname.

Referenced by trigger_warpzone_reconnect_use(), and WarpZones_Reconnect().

◆ WarpZone_InitStep_UpdateTransform()

void WarpZone_InitStep_UpdateTransform ( entity this)

Definition at line 497 of file server.qc.

498{
499 vector org, ang, norm, point;
500 float area;
501 vector tri, a, b, c, n;
502 float i_s, i_t, n_t;
503 string tex;
504
505 org = this.origin;
506 if (org == '0 0 0')
507 org = 0.5 * (this.mins + this.maxs);
508
509 norm = point = '0 0 0';
510 area = 0;
511 for (i_s = 0; ; ++i_s)
512 {
513 tex = getsurfacetexture(this, i_s);
514 if (!tex)
515 break; // this is beyond the last one
516 if (tex == "textures/common/trigger" || tex == "trigger")
517 continue;
518 n_t = getsurfacenumtriangles(this, i_s);
519 for (i_t = 0; i_t < n_t; ++i_t)
520 {
521 tri = getsurfacetriangle(this, i_s, i_t);
522 a = getsurfacepoint(this, i_s, tri.x);
523 b = getsurfacepoint(this, i_s, tri.y);
524 c = getsurfacepoint(this, i_s, tri.z);
525 n = cross(c - a, b - a);
526 area += vlen(n);
527 norm += n;
528 point += vlen(n) * (a + b + c);
529 }
530 }
531 if (area > 0)
532 {
533 norm *= 1 / area;
534 point *= 1 / (3 * area);
535 if (vdist(norm, <, 0.99))
536 {
537 LOG_INFO("trigger_warpzone near ", vtos(this.aiment.origin), " is nonplanar. BEWARE.");
538 area = 0; // no autofixing in this case
539 }
540 norm = normalize(norm);
541 }
542
543 ang = '0 0 0';
544 if (this.aiment)
545 {
546 org = this.aiment.origin;
547 ang = this.aiment.angles;
548 if (area > 0)
549 {
550 org -= ((org - point) * norm) * norm; // project to plane
551 vector forward, right, up;
552 MAKE_VECTORS(ang, forward, right, up);
553 if (norm * forward < 0)
554 {
555 LOG_INFO("Position target of trigger_warpzone near ", vtos(this.aiment.origin), " points into trigger_warpzone. BEWARE.");
556 norm = -1 * norm;
557 }
558 ang = vectoangles2(norm, up); // keep rotation, but turn exactly against plane
559 ang.x = -ang.x;
560 if (norm * forward < 0.99)
561 LOG_INFO("trigger_warpzone near ", vtos(this.aiment.origin), " has been turned to match plane orientation (", vtos(this.aiment.angles), " -> ", vtos(ang));
562 if (vdist(org - this.aiment.origin, >, 0.5))
563 LOG_INFO("trigger_warpzone near ", vtos(this.aiment.origin), " has been moved to match the plane (", vtos(this.aiment.origin), " -> ", vtos(org), ").");
564 }
565 }
566 else if (area > 0)
567 {
568 org = point;
569 ang = vectoangles(norm);
570 ang.x = -ang.x;
571 }
572 else
573 error("cannot infer origin/angles for this warpzone, please use a killtarget or a trigger_warpzone_position");
574
575 this.warpzone_origin = org;
576 this.warpzone_angles = ang;
577}
#define MAKE_VECTORS(angles, forward, right, up)
Same as the makevectors builtin but uses the provided locals instead of the v_* globals.
#define LOG_INFO(...)
Definition log.qh:62
float vlen(vector v)
vector vectoangles(vector v)
string vtos(vector v)
vector normalize(vector v)
vector
Definition self.qh:96
vector org
Definition self.qh:96
vector vector ang
Definition self.qh:96
#define vdist(v, cmp, f)
Vector distance comparison, avoids sqrt().
Definition vector.qh:8
#define cross(a, b)
Definition vector.qh:25

References aiment, ang, cross, entity(), error, LOG_INFO, MAKE_VECTORS, maxs, mins, normalize(), org, origin, vdist, vectoangles(), vector, vlen(), vtos(), warpzone_angles, and warpzone_origin.

Referenced by WarpZone_StartFrame(), and WarpZone_Think().

◆ WarpZone_PlayerPhysics_FixVAngle()

void WarpZone_PlayerPhysics_FixVAngle ( entity this)

Definition at line 817 of file server.qc.

818{
819#ifndef WARPZONE_DONT_FIX_VANGLE
820 if (IS_REAL_CLIENT(this))
821 if (this.v_angle.z <= 360) // if not already adjusted
822 if (time - CS(this).ping * 0.001 < this.warpzone_teleport_time)
823 {
825 this.v_angle_z += 720; // mark as adjusted
826 }
827#endif
828}
float ping
Definition main.qh:169
vector v_angle
Definition player.qh:236
vector WarpZone_TransformVAngles(entity wz, vector ang)
Definition common.qc:501
entity warpzone_teleport_zone
Definition server.qc:34
float warpzone_teleport_time
Definition server.qc:32
ClientState CS(Client this)
Definition state.qh:47

References CS(), entity(), IS_REAL_CLIENT, ping, time, v_angle, warpzone_teleport_time, warpzone_teleport_zone, and WarpZone_TransformVAngles().

Referenced by PlayerPreThink(), and sys_phys_fix().

◆ WarpZone_Projectile_Touch()

float WarpZone_Projectile_Touch ( entity this,
entity toucher )

Definition at line 344 of file server.qc.

345{
346 if (toucher.classname == "trigger_warpzone")
347 return true;
348
349 // no further impacts if we teleported this frame!
350 // this is because even if we did teleport, the engine still may raise
351 // touch events for the previous location
352 // engine now aborts moves on teleport, so this SHOULD not happen any more
353 // but if this is called from TouchAreaGrid of the projectile moving,
354 // then this won't do
355 if (time == this.warpzone_teleport_time)
356 return true;
357
358#ifdef SVQC
359#ifdef WARPZONELIB_KEEPDEBUG
360 // this SEEMS to not happen at the moment, but if it did, it would be more reliable
361 {
362 float save_dpstartcontents;
363 float save_dphitcontents;
364 float save_dphitq3surfaceflags;
365 string save_dphittexturename;
366 float save_allsolid;
367 float save_startsolid;
368 float save_fraction;
369 vector save_endpos;
370 vector save_plane_normal;
371 float save_plane_dist;
372 entity save_ent;
373 float save_inopen;
374 float save_inwater;
375 save_dpstartcontents = trace_dpstartcontents;
376 save_dphitcontents = trace_dphitcontents;
377 save_dphitq3surfaceflags = trace_dphitq3surfaceflags;
378 save_dphittexturename = trace_dphittexturename;
379 save_allsolid = trace_allsolid;
380 save_startsolid = trace_startsolid;
381 save_fraction = trace_fraction;
382 save_endpos = trace_endpos;
383 save_plane_normal = trace_plane_normal;
384 save_plane_dist = trace_plane_dist;
385 save_ent = trace_ent;
386 save_inopen = trace_inopen;
387 save_inwater = trace_inwater;
388 float f = WarpZone_CheckProjectileImpact(this);
389 if (f) return (f > 0);
390 trace_dpstartcontents = save_dpstartcontents;
391 trace_dphitcontents = save_dphitcontents;
392 trace_dphitq3surfaceflags = save_dphitq3surfaceflags;
393 trace_dphittexturename = save_dphittexturename;
394 trace_allsolid = save_allsolid;
395 trace_startsolid = save_startsolid;
396 trace_fraction = save_fraction;
397 trace_endpos = save_endpos;
398 trace_plane_normal = save_plane_normal;
399 trace_plane_dist = save_plane_dist;
400 trace_ent = save_ent;
401 trace_inopen = save_inopen;
402 trace_inwater = save_inwater;
403 }
404#endif
405
407 return true;
408#endif
409
410 return false;
411}
float trace_dphitcontents
entity trace_ent
float trace_dpstartcontents
string trace_dphittexturename
vector trace_endpos
float trace_startsolid
float trace_inopen
float trace_dphitq3surfaceflags
float trace_fraction
float trace_allsolid
vector trace_plane_normal
float trace_plane_dist
float trace_inwater
entity entity toucher
Definition self.qh:76
bool WarpZone_Projectile_Touch_ImpactFilter_Callback(entity this, entity toucher)
Definition common.qc:150

References entity(), time, toucher, trace_allsolid, trace_dphitcontents, trace_dphitq3surfaceflags, trace_dphittexturename, trace_dpstartcontents, trace_endpos, trace_ent, trace_fraction, trace_inopen, trace_inwater, trace_plane_dist, trace_plane_normal, trace_startsolid, vector, WarpZone_Projectile_Touch_ImpactFilter_Callback(), and warpzone_teleport_time.

Referenced by W_Devastator_Touch(), and W_OverkillRocketPropelledChainsaw_Touch().

◆ WarpZone_Send()

bool WarpZone_Send ( entity this,
entity to,
int sf )

Definition at line 226 of file server.qc.

227{
228 WriteHeader(MSG_ENTITY, ENT_CLIENT_WARPZONE);
229
230 // we must send this flag for clientside to match properly too
231 sf = 0;
232 if (this.warpzone_isboxy)
233 BITSET_ASSIGN(sf, 1);
234 if (this.warpzone_fadestart)
235 BITSET_ASSIGN(sf, 2);
236 if (this.origin != '0 0 0')
237 BITSET_ASSIGN(sf, 4);
239
240 // we need THESE to render the warpzone (and cull properly)...
241 if (sf & 4)
242 WriteVector(MSG_ENTITY, this.origin);
243
245 WriteVector(MSG_ENTITY, this.mins);
246 WriteVector(MSG_ENTITY, this.maxs);
247 WriteByte(MSG_ENTITY, bound(1, this.scale * 16, 255));
248
249 // we need THESE to calculate the proper transform
250 WriteVector(MSG_ENTITY, this.warpzone_origin);
251 WriteVector(MSG_ENTITY, this.warpzone_angles);
252 WriteVector(MSG_ENTITY, this.warpzone_targetorigin);
253 WriteVector(MSG_ENTITY, this.warpzone_targetangles);
254
255 if (sf & 2)
256 {
259 }
260
261 return true;
262}
vector warpzone_targetorigin
Definition common.qh:20
float warpzone_isboxy
Definition common.qh:15
vector warpzone_targetangles
Definition common.qh:21

References BITSET_ASSIGN, bound(), entity(), maxs, mins, modelindex, MSG_ENTITY, origin, scale, warpzone_angles, warpzone_fadeend, warpzone_fadestart, warpzone_isboxy, warpzone_origin, warpzone_targetangles, warpzone_targetorigin, WriteByte(), WriteHeader, and WriteShort().

Referenced by spawnfunc().

◆ WarpZone_StartFrame()

void WarpZone_StartFrame ( )

Definition at line 733 of file server.qc.

734{
736 {
738 for (entity e = warpzone_first; e; e = e.warpzone_next)
740 for (entity e = warpzone_position_first; e; e = e.warpzone_next)
742 for (entity e = warpzone_first; e; e = e.warpzone_next)
746 }
747
750
751 FOREACH_CLIENT(true,
752 {
754 WarpZone_StoreProjectileData(it); // TODO: not actually needed
755
756 if (IS_OBSERVER(it) || it.solid == SOLID_NOT)
757 {
758 // warpzones
760 {
761 entity e = WarpZone_Find(it.origin + it.mins, it.origin + it.maxs);
762 if (e)
763 if (WarpZoneLib_ExactTrigger_Touch(e, it, false))
764 if (WarpZone_PlaneDist(e, it.origin + it.view_ofs) <= 0)
765 WarpZone_Teleport(e, it, -1, 0); // NOT triggering targets by this!
766 }
767
768 // teleporters
769 if (it.teleportable)
770 {
771 entity ent = Teleport_Find(it.origin + it.mins, it.origin + it.maxs);
772 if (ent && WarpZoneLib_ExactTrigger_Touch(ent, it, false))
773 Simple_TeleportPlayer(ent, it); // NOT triggering targets by this!
774 }
775 }
776 });
777}
#define IL_EACH(this, cond, body)
entity WarpZone_Find(vector mi, vector ma)
Definition common.qc:158
bool WarpZoneLib_ExactTrigger_Touch(entity this, entity toucher, bool touchfunc)
Definition common.qc:789
float WarpZone_PlaneDist(entity wz, vector v)
Definition common.qc:476
IntrusiveList g_projectiles
Definition common.qh:58
float warpzone_initialized
Definition server.qc:637
void WarpZone_InitStep_FindOriginTarget(entity this)
Definition server.qc:415
void WarpZones_Reconnect()
Definition server.qc:702
#define WarpZone_StoreProjectileData(e_)
Definition server.qc:36
void WarpZone_InitStep_UpdateTransform(entity this)
Definition server.qc:497
float WarpZone_Teleport(entity wz, entity player, float f0, float f1)
Definition server.qc:80
void WarpZonePosition_InitStep_FindTarget(entity this)
Definition server.qc:429
void WarpZone_PostInitialize_Callback()
Definition main.qc:518
entity Simple_TeleportPlayer(entity teleporter, entity player)
entity Teleport_Find(vector mi, vector ma)
#define IS_OBSERVER(v)
Definition utils.qh:11

References entity(), FOREACH_CLIENT, g_projectiles, IL_EACH, IS_OBSERVER, Simple_TeleportPlayer(), SOLID_NOT, Teleport_Find(), WarpZone_Find(), warpzone_first, warpzone_initialized, WarpZone_InitStep_FindOriginTarget(), WarpZone_InitStep_UpdateTransform(), WarpZone_PlaneDist(), warpzone_position_first, WarpZone_PostInitialize_Callback(), WarpZone_StoreProjectileData, WarpZone_Teleport(), warpzone_warpzones_exist, WarpZoneLib_ExactTrigger_Touch(), WarpZonePosition_InitStep_FindTarget(), and WarpZones_Reconnect().

Referenced by StartFrame().

◆ WarpZone_Teleport()

float WarpZone_Teleport ( entity wz,
entity player,
float f0,
float f1 )

Definition at line 80 of file server.qc.

81{
82 vector o0, a0, v0, o1, a1, v1, o10;
83
84 o0 = player.origin + player.view_ofs;
85 v0 = player.velocity;
86 a0 = player.angles;
87
88 o10 = o1 = WarpZone_TransformOrigin(wz, o0);
89 v1 = WarpZone_TransformVelocity(wz, v0);
90 if (!IS_NOT_A_CLIENT(player))
92 else
93 a1 = WarpZone_TransformAngles(wz, a0);
94
95 if (f0 != 0 || f1 != 0)
96 {
97 // retry last move but behind the warpzone!
98 // we must first go back as far as we can, then forward again, to not cause double touch events!
99
100 tracebox(o1 - player.view_ofs + v1 * frametime * f1, player.mins, player.maxs, o1 - player.view_ofs + v1 * frametime * f0, MOVE_WORLDONLY, player);
101 {
102 entity own = player.owner;
103 player.owner = NULL;
104 tracebox(trace_endpos, player.mins, player.maxs, o1 - player.view_ofs + v1 * frametime * f1, MOVE_NORMAL, player); // this should get us through the warpzone
105 player.owner = own;
106 }
107 o1 = trace_endpos + player.view_ofs;
108
109 float d, dv, md;
110 md = max(vlen(player.mins), vlen(player.maxs));
111 d = WarpZone_TargetPlaneDist(wz, o1);
112 dv = WarpZone_TargetPlaneDist(wz, v1);
113 if (d < 0)
114 o1 -= v1 * (d / dv);
115 }
116
117 // put them out of solid
118 tracebox(o1 - player.view_ofs, player.mins, player.maxs, o1 - player.view_ofs, MOVE_NOMONSTERS, player);
120 {
121 setorigin(player, o1 - player.view_ofs);
122 if (WarpZoneLib_MoveOutOfSolid(player))
123 {
124 o1 = player.origin + player.view_ofs;
125 setorigin(player, o0 - player.view_ofs);
126 }
127 else
128 {
129 LOG_INFO("would have to put player in solid, won't do that");
130 setorigin(player, o0 - player.view_ofs);
131 return 0;
132 }
133 }
134
135 // do the teleport
136 WarpZone_RefSys_Add(player, wz);
137 WarpZone_TeleportPlayer(wz, player, o1 - player.view_ofs, a1, v1);
139 player.warpzone_teleport_time = time;
140 player.warpzone_teleport_finishtime = time;
141 player.warpzone_teleport_zone = wz;
142
143#ifdef SVQC
144 // prevent further teleports back
145 float dt = (v1 != '0 0 0') ? (o1 - o10) * v1 * (1 / (v1 * v1)) : 0;
146 if (dt < PHYS_INPUT_FRAMETIME)
147 player.warpzone_teleport_finishtime += PHYS_INPUT_FRAMETIME - dt;
148#endif
149
150#ifndef WARPZONE_USE_FIXANGLE
151 #ifdef SVQC
152 if (IS_VEHICLE(player) && player.owner)
153 player = player.owner; // hax
154 if (IS_PLAYER(player))
155 {
156 // instead of fixangle, send the transform to the client for smoother operation
157 player.fixangle = false;
158
159 entity ts = new(warpzone_teleported);
160 setmodel(ts, MDL_Null);
162 ts.SendFlags = 0xFFFFFF;
163 ts.drawonlytoclient = player;
164 setthink(ts, SUB_Remove);
165 ts.nextthink = time + 1;
166 ts.owner = player;
167 ts.enemy = wz;
168 ts.effects = EF_NODEPTHTEST;
169 ts.angles = wz.warpzone_transform;
170 }
171 #elifdef CSQC
172 setproperty(VF_CL_VIEWANGLES, WarpZone_TransformVAngles(wz, getpropertyvec(VF_CL_VIEWANGLES)));
173 //if (checkextension("DP_CSQC_ROTATEMOVES"))
174 //CL_RotateMoves(wz.warpzone_transform);
175 #endif
176#endif
177
178 return 1;
179}
#define setmodel(this, m)
Definition model.qh:26
#define IS_NOT_A_CLIENT(s)
Definition player.qh:243
#define PHYS_INPUT_FRAMETIME
Definition player.qh:254
#define PHYS_INPUT_ANGLES(s)
Definition player.qh:249
const float MOVE_NOMONSTERS
const float VF_CL_VIEWANGLES
float frametime
const float MOVE_NORMAL
float MOVE_WORLDONLY
void SUB_Remove(entity this)
Remove entity.
Definition defer.qh:12
void WarpZone_RefSys_Add(entity me, entity wz)
Definition common.qc:705
vector WarpZone_TransformVelocity(entity wz, vector v)
Definition common.qc:491
vector WarpZone_TransformAngles(entity wz, vector v)
Definition common.qc:496
vector WarpZone_TransformOrigin(entity wz, vector v)
Definition common.qc:486
float WarpZone_TargetPlaneDist(entity wz, vector v)
Definition common.qc:481
int WarpZoneLib_MoveOutOfSolid(entity e)
Definition common.qc:822
float max(float f,...)
f1
Definition all.inc:566
bool WarpZone_Teleported_Send(entity this, entity to, int sf)
Definition server.qc:72
void WarpZone_TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity)
Definition server.qc:43
#define IS_VEHICLE(v)
Definition utils.qh:24

References EF_NODEPTHTEST, entity(), f1, frametime, IS_NOT_A_CLIENT, IS_PLAYER, IS_VEHICLE, LOG_INFO, max(), MOVE_NOMONSTERS, MOVE_NORMAL, MOVE_WORLDONLY, NULL, PHYS_INPUT_ANGLES, PHYS_INPUT_FRAMETIME, setmodel, setSendEntity, setthink, SUB_Remove(), time, trace_endpos, trace_startsolid, vector, VF_CL_VIEWANGLES, vlen(), WarpZone_RefSys_Add(), WarpZone_StoreProjectileData, WarpZone_TargetPlaneDist(), WarpZone_Teleported_Send(), WarpZone_TeleportPlayer(), WarpZone_TransformAngles(), WarpZone_TransformOrigin(), WarpZone_TransformVAngles(), WarpZone_TransformVelocity(), and WarpZoneLib_MoveOutOfSolid().

Referenced by WarpZone_StartFrame(), and WarpZone_Touch().

◆ WarpZone_Teleported_Send()

bool WarpZone_Teleported_Send ( entity this,
entity to,
int sf )

Definition at line 72 of file server.qc.

73{
74 WriteHeader(MSG_ENTITY, ENT_CLIENT_WARPZONE_TELEPORTED);
75 WriteVector(MSG_ENTITY, this.angles);
76 return true;
77}
ent angles
Definition ent_cs.qc:146

References angles, entity(), MSG_ENTITY, and WriteHeader.

Referenced by WarpZone_Teleport().

◆ WarpZone_TeleportPlayer()

void WarpZone_TeleportPlayer ( entity teleporter,
entity player,
vector to,
vector to_angles,
vector to_velocity )

Definition at line 43 of file server.qc.

44{
45#ifdef SVQC
46 player.lastteleport_origin = player.origin;
47 player.lastteleporttime = time;
48#endif
49 setorigin(player, to); // NOTE: this also aborts the move, when this is called by touch
50 player.angles = to_angles;
51#ifdef SVQC
52 player.oldorigin = to; // for DP's unsticking
53 player.fixangle = true;
54 if (IS_BOT_CLIENT(player))
55 {
56 // FIXME find a way to smooth view's angles change for bots too
57 player.v_angle = player.angles;
58 bot_aim_reset(player);
59 }
60#endif
61 player.velocity = to_velocity;
62
63 BITXOR_ASSIGN(player.effects, EF_TELEPORT_BIT);
64
65 if (IS_PLAYER(player))
66 BITCLR_ASSIGN(player.flags, FL_ONGROUND);
67
69}
void bot_aim_reset(entity this)
Definition aim.qc:134
const int FL_ONGROUND
Definition constants.qh:78
const int EF_TELEPORT_BIT
#define BITCLR_ASSIGN(a, b)
Definition common.qh:104
#define BITXOR_ASSIGN(a, b)
Definition common.qh:110
void WarpZone_PostTeleportPlayer_Callback(entity pl)
#define IS_BOT_CLIENT(v)
want: (IS_CLIENT(v) && !IS_REAL_CLIENT(v))
Definition utils.qh:15

References BITCLR_ASSIGN, BITXOR_ASSIGN, bot_aim_reset(), EF_TELEPORT_BIT, entity(), FL_ONGROUND, IS_BOT_CLIENT, IS_PLAYER, time, vector, and WarpZone_PostTeleportPlayer_Callback().

Referenced by WarpZone_Teleport().

◆ WarpZone_Think()

void WarpZone_Think ( entity this)

Definition at line 714 of file server.qc.

715{
716 if (this.warpzone_save_origin != this.origin
717 || this.warpzone_save_angles != this.angles
718 || this.warpzone_save_eorigin != this.enemy.origin
719 || this.warpzone_save_eangles != this.enemy.angles)
720 {
725 this.warpzone_save_origin = this.origin;
726 this.warpzone_save_angles = this.angles;
727 this.warpzone_save_eorigin = this.enemy.origin;
728 this.warpzone_save_eangles = this.enemy.angles;
729 }
730 this.nextthink = time;
731}
vector warpzone_save_eangles
Definition server.qc:28
vector warpzone_save_origin
Definition server.qc:25
vector warpzone_save_angles
Definition server.qc:26
vector warpzone_save_eorigin
Definition server.qc:27

References angles, enemy, entity(), nextthink, origin, time, WarpZone_InitStep_FinalizeTransform(), WarpZone_InitStep_UpdateTransform(), warpzone_save_angles, warpzone_save_eangles, warpzone_save_eorigin, and warpzone_save_origin.

Referenced by WarpZone_InitStep_FinalizeTransform().

◆ WarpZone_Touch()

void WarpZone_Touch ( entity this,
entity toucher )

Definition at line 181 of file server.qc.

182{
183 if (toucher.classname == "trigger_warpzone")
184 return;
185
186 if (time <= toucher.warpzone_teleport_finishtime) // already teleported this frame
187 return;
188
189 // FIXME needs a better check to know what is safe to teleport and what not
190 if (toucher.move_movetype == MOVETYPE_NONE || toucher.move_movetype == MOVETYPE_FOLLOW || toucher.tag_entity)
191 return;
192
193 if (WarpZone_PlaneDist(this, toucher.origin + toucher.view_ofs) >= 0) // wrong side of the trigger_warpzone (don't teleport yet)
194 return;
195
197
198 float f;
199 // number of frames we need to go back:
200 // dist = 16*sqrt(2) qu
201 // dist ~ 24 qu
202 // 24 qu = v*t
203 // 24 qu = v*frametime*n
204 // n = 24 qu/(v*frametime)
205 // for clients go only one frame though, may be too irritating otherwise
206 // but max 0.25 sec = 0.25/frametime frames
207 // 24/(0.25/frametime)
208 // 96*frametime
209 float d = 24 + max(vlen(toucher.mins), vlen(toucher.maxs));
211 f = -d / bound(frametime * d * 1, frametime * vlen(toucher.velocity), d);
212 else
213 f = -1;
214 if (WarpZone_Teleport(this, toucher, f, 0))
215 {
216#ifdef SVQC
217 SUB_UseTargets_SkipTargets(this, toucher, toucher, BIT(1) | BIT(3)); // use toucher too?
218 SUB_UseTargets_SkipTargets(this.enemy, toucher, toucher, BIT(1) | BIT(2)); // use toucher too?
219#endif
220 }
221 else
222 LOG_TRACE("WARPZONE FAIL AHAHAHAHAH))");
223}
#define BIT(n)
Only ever assign into the first 24 bits in QC (so max is BIT(23)).
Definition bits.qh:8
#define EXACTTRIGGER_TOUCH(e, t)
Definition common.qh:118
#define LOG_TRACE(...)
Definition log.qh:74
const int MOVETYPE_NONE
Definition movetypes.qh:129
const int MOVETYPE_FOLLOW
Definition movetypes.qh:141
void SUB_UseTargets_SkipTargets(entity this, entity actor, entity trigger, int skiptargets)
Definition triggers.qc:346

References BIT, bound(), enemy, entity(), EXACTTRIGGER_TOUCH, frametime, IS_NOT_A_CLIENT, LOG_TRACE, max(), MOVETYPE_FOLLOW, MOVETYPE_NONE, SUB_UseTargets_SkipTargets(), time, toucher, vlen(), WarpZone_PlaneDist(), and WarpZone_Teleport().

Referenced by WarpZone_InitStep_FinalizeTransform().

◆ WarpZoneCamera_InitStep_FindTarget()

void WarpZoneCamera_InitStep_FindTarget ( entity this)

Definition at line 467 of file server.qc.

468{
469 entity e;
470 float i;
471 if (this.target == "")
472 {
473 error("Camera with no target");
474 return;
475 }
476 this.enemy = NULL;
477 for (e = NULL, i = 0; (e = find(e, targetname, this.target)); )
478 if (random() * ++i < 1)
479 this.enemy = e;
480 if (this.enemy == NULL)
481 {
482 error("Camera with nonexisting target");
483 return;
484 }
486 WarpZone_Camera_SetUp(this, this.enemy.origin, this.enemy.angles);
487 this.SendFlags = 0xFFFFFF;
488 if (this.spawnflags & 1)
489 {
491 this.nextthink = time;
492 }
493 else
494 this.nextthink = 0;
495}
void WarpZone_Camera_SetUp(entity e, vector my_org, vector my_ang)
Definition common.qc:89
float warpzone_cameras_exist
Definition common.qh:13
void WarpZoneCamera_Think(entity this)
Definition server.qc:451

References enemy, entity(), error, find(), nextthink, NULL, random(), SendFlags, setthink, spawnflags, target, targetname, time, WarpZone_Camera_SetUp(), warpzone_cameras_exist, and WarpZoneCamera_Think().

Referenced by trigger_warpzone_reconnect_use(), and WarpZones_Reconnect().

◆ WarpZoneCamera_Think()

void WarpZoneCamera_Think ( entity this)

Definition at line 451 of file server.qc.

452{
453 if (this.warpzone_save_origin != this.origin
454 || this.warpzone_save_angles != this.angles
455 || this.warpzone_save_eorigin != this.enemy.origin
456 || this.warpzone_save_eangles != this.enemy.angles)
457 {
458 WarpZone_Camera_SetUp(this, this.enemy.origin, this.enemy.angles);
459 this.warpzone_save_origin = this.origin;
460 this.warpzone_save_angles = this.angles;
461 this.warpzone_save_eorigin = this.enemy.origin;
462 this.warpzone_save_eangles = this.enemy.angles;
463 }
464 this.nextthink = time;
465}

References angles, enemy, entity(), nextthink, origin, time, WarpZone_Camera_SetUp(), warpzone_save_angles, warpzone_save_eangles, warpzone_save_eorigin, and warpzone_save_origin.

Referenced by WarpZoneCamera_InitStep_FindTarget().

◆ WarpZonePosition_InitStep_FindTarget()

void WarpZonePosition_InitStep_FindTarget ( entity this)

Definition at line 429 of file server.qc.

430{
431 if (this.target == "")
432 {
433 error("Warp zone position with no target");
434 return;
435 }
436 this.enemy = find(NULL, targetname, this.target);
437 if (this.enemy == NULL)
438 {
439 error("Warp zone position with nonexisting target");
440 return;
441 }
442 if (this.enemy.aiment)
443 {
444 // already is positioned
445 error("Warp zone position targeting already oriented warpzone");
446 return;
447 }
448 this.enemy.aiment = this;
449}

References enemy, entity(), error, find(), NULL, target, and targetname.

Referenced by WarpZone_StartFrame().

◆ WarpZones_Reconnect()

void WarpZones_Reconnect ( )

Definition at line 702 of file server.qc.

703{
704 for (entity e = warpzone_first; e; e = e.warpzone_next)
706 for (entity e = warpzone_first; e; e = e.warpzone_next)
708 for (entity e = warpzone_camera_first; e; e = e.warpzone_next)
710 for (entity e = warpzone_first; e; e = e.warpzone_next)
712}

References entity(), warpzone_camera_first, warpzone_first, WarpZone_InitStep_ClearTarget(), WarpZone_InitStep_FinalizeTransform(), WarpZone_InitStep_FindTarget(), and WarpZoneCamera_InitStep_FindTarget().

Referenced by WarpZone_StartFrame().

Variable Documentation

◆ autocvar_sv_warpzone_allow_selftarget

bool autocvar_sv_warpzone_allow_selftarget

Definition at line 17 of file server.qc.

Referenced by WarpZone_InitStep_FindTarget().

◆ warpzone_camera_first

entity warpzone_camera_first

Definition at line 640 of file server.qc.

Referenced by spawnfunc(), trigger_warpzone_reconnect_use(), and WarpZones_Reconnect().

◆ warpzone_initialized

float warpzone_initialized

Definition at line 637 of file server.qc.

Referenced by WarpZone_StartFrame().

◆ warpzone_next

entity warpzone_next

Definition at line 641 of file server.qc.

Referenced by spawnfunc(), spawnfunc(), and spawnfunc().

◆ warpzone_oldangles

vector warpzone_oldangles

Definition at line 31 of file server.qc.

◆ warpzone_oldorigin

vector warpzone_oldorigin

Definition at line 31 of file server.qc.

◆ warpzone_oldvelocity

vector warpzone_oldvelocity

Definition at line 31 of file server.qc.

◆ warpzone_position_first

entity warpzone_position_first

Definition at line 639 of file server.qc.

Referenced by spawnfunc(), and WarpZone_StartFrame().

◆ warpzone_reconnecting

float warpzone_reconnecting

Definition at line 779 of file server.qc.

◆ warpzone_save_angles

vector warpzone_save_angles

Definition at line 26 of file server.qc.

Referenced by WarpZone_Think(), and WarpZoneCamera_Think().

◆ warpzone_save_eangles

vector warpzone_save_eangles

Definition at line 28 of file server.qc.

Referenced by WarpZone_Think(), and WarpZoneCamera_Think().

◆ warpzone_save_eorigin

vector warpzone_save_eorigin

Definition at line 27 of file server.qc.

Referenced by WarpZone_Think(), and WarpZoneCamera_Think().

◆ warpzone_save_origin

vector warpzone_save_origin

Definition at line 25 of file server.qc.

Referenced by WarpZone_Think(), and WarpZoneCamera_Think().

◆ warpzone_teleport_finishtime

float warpzone_teleport_finishtime

Definition at line 33 of file server.qc.

◆ warpzone_teleport_time

float warpzone_teleport_time

Definition at line 32 of file server.qc.

Referenced by WarpZone_PlayerPhysics_FixVAngle(), and WarpZone_Projectile_Touch().

◆ warpzone_teleport_zone

entity warpzone_teleport_zone

Definition at line 34 of file server.qc.

Referenced by WarpZone_PlayerPhysics_FixVAngle().