X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Ftriggers%2Fteleporters.qh;h=6f5f8cb76e21bec6f941b85e2aebccd767b5ba21;hb=268f9c69576b6bb929f66d19f0d077d19ba47edd;hp=bdd24ddeff3b916ebf239ef0f4a2ab314b406eb9;hpb=52c8d9ce236f80561b3963a67da390ff19b82a81;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/triggers/teleporters.qh b/qcsrc/common/triggers/teleporters.qh index bdd24ddef..6f5f8cb76 100644 --- a/qcsrc/common/triggers/teleporters.qh +++ b/qcsrc/common/triggers/teleporters.qh @@ -1,9 +1,38 @@ -#ifndef T_TELEPORTERS_H -#define T_TELEPORTERS_H +#pragma once + +IntrusiveList g_teleporters; +STATIC_INIT(g_teleporters) { g_teleporters = IL_NEW(); } + +.entity pusher; +const float TELEPORT_FLAG_SOUND = 1; +const float TELEPORT_FLAG_PARTICLES = 2; +const float TELEPORT_FLAG_TDEATH = 4; +const float TELEPORT_FLAG_FORCE_TDEATH = 8; + +#define TELEPORT_FLAGS_WARPZONE 0 +#define TELEPORT_FLAGS_PORTAL (TELEPORT_FLAG_SOUND | TELEPORT_FLAG_PARTICLES | TELEPORT_FLAG_TDEATH | TELEPORT_FLAG_FORCE_TDEATH) +#define TELEPORT_FLAGS_TELEPORTER (TELEPORT_FLAG_SOUND | TELEPORT_FLAG_PARTICLES | TELEPORT_FLAG_TDEATH) + +// types for .teleportable entity setting +const float TELEPORT_NORMAL = 1; // play sounds/effects etc +const float TELEPORT_SIMPLE = 2; // only do teleport, nothing special + +entity Simple_TeleportPlayer(entity teleporter, entity player); + +void Teleport_Touch(entity this, entity toucher); + +void teleport_findtarget(entity this); + +entity Teleport_Find(vector mi, vector ma); + +void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity, vector telefragmin, vector telefragmax, float tflags); + +entity teleport_first; +.entity teleport_next; #ifdef SVQC -void trigger_teleport_use(); +void trigger_teleport_use(entity this, entity actor, entity trigger); #define TDEATHLOOP(o) \ entity head; \ @@ -27,42 +56,41 @@ void trigger_teleport_use(); if(head.takedamage) \ if(boxesoverlap(deathmin, deathmax, head.absmin, head.absmax)) - float check_tdeath(entity player, vector org, vector telefragmin, vector telefragmax); float tdeath_hit; void tdeath(entity player, entity teleporter, entity telefragger, vector telefragmin, vector telefragmax); void spawn_tdeath(vector v0, entity e, vector v); -.entity pusher; -const float TELEPORT_FLAG_SOUND = 1; -const float TELEPORT_FLAG_PARTICLES = 2; -const float TELEPORT_FLAG_TDEATH = 4; -const float TELEPORT_FLAG_FORCE_TDEATH = 8; - -#define TELEPORT_FLAGS_WARPZONE 0 -#define TELEPORT_FLAGS_PORTAL (TELEPORT_FLAG_SOUND | TELEPORT_FLAG_PARTICLES | TELEPORT_FLAG_TDEATH | TELEPORT_FLAG_FORCE_TDEATH) -#define TELEPORT_FLAGS_TELEPORTER (TELEPORT_FLAG_SOUND | TELEPORT_FLAG_PARTICLES | TELEPORT_FLAG_TDEATH) - -// types for .teleportable entity setting -const float TELEPORT_NORMAL = 1; // play sounds/effects etc -const float TELEPORT_SIMPLE = 2; // only do teleport, nothing special - void Reset_ArcBeam(entity player, vector forward); -void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity, vector telefragmin, vector telefragmax, float tflags); - -entity Simple_TeleportPlayer(entity teleporter, entity player); - -void Teleport_Touch (void); - -void teleport_findtarget (void); -entity Teleport_Find(vector mi, vector ma); - -entity teleport_first; -.entity teleport_next; +#endif void WarpZone_PostTeleportPlayer_Callback(entity pl); -#endif +#ifdef CSQC +.entity realowner; +.float lastteleporttime; + +#define TDEATHLOOP(o) \ + entity head; \ + vector deathmin; \ + vector deathmax; \ + float deathradius; \ + deathmin = (o) + player.mins; \ + deathmax = (o) + player.maxs; \ + if(telefragmin != telefragmax) \ + { \ + if(deathmin.x > telefragmin.x) deathmin.x = telefragmin.x; \ + if(deathmin.y > telefragmin.y) deathmin.y = telefragmin.y; \ + if(deathmin.z > telefragmin.z) deathmin.z = telefragmin.z; \ + if(deathmax.x < telefragmax.x) deathmax.x = telefragmax.x; \ + if(deathmax.y < telefragmax.y) deathmax.y = telefragmax.y; \ + if(deathmax.z < telefragmax.z) deathmax.z = telefragmax.z; \ + } \ + deathradius = max(vlen(deathmin), vlen(deathmax)); \ + for(head = findradius(o, deathradius); head; head = head.chain) \ + if(head != player) \ + if(head.isplayermodel) \ + if(boxesoverlap(deathmin, deathmax, head.absmin, head.absmax)) #endif