X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Ftriggers%2Ftrigger%2Fteleport.qc;h=0330ce8d8cc46b1e9065ff29065ff51f233dadfd;hb=9e113dae328809b5e7432f434649a35ebb185a52;hp=484daeedf9d3f0b645f50094c830e79713bfebf8;hpb=0ff1afbe6825c541b231fb4c4cfcbf60cbb5ecd7;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/triggers/trigger/teleport.qc b/qcsrc/common/triggers/trigger/teleport.qc index 484daeedf..0330ce8d8 100644 --- a/qcsrc/common/triggers/trigger/teleport.qc +++ b/qcsrc/common/triggers/trigger/teleport.qc @@ -1,3 +1,4 @@ +#include "teleport.qh" REGISTER_NET_LINKED(ENT_CLIENT_TRIGGER_TELEPORT) #ifdef SVQC @@ -11,52 +12,83 @@ void trigger_teleport_use(entity this, entity actor, entity trigger) } #endif -void Teleport_Touch(entity this, entity toucher) +bool Teleport_Active(entity this, entity player) { if (this.active != ACTIVE_ACTIVE) - return; + return false; #ifdef SVQC - if (!toucher.teleportable) - return; + if (!player.teleportable) + return false; - if(toucher.vehicle) - if(!toucher.vehicle.teleportable) - return; + if(player.vehicle) + if(!player.vehicle.teleportable) + return false; - if(IS_TURRET(toucher)) - return; + if(IS_TURRET(player)) + return false; #elif defined(CSQC) - if(!IS_PLAYER(toucher)) - return; + if(!IS_PLAYER(player)) + return false; #endif - if(IS_DEAD(toucher)) - return; + if(IS_DEAD(player)) + return false; if(this.team) - if(((this.spawnflags & 4) == 0) == (DIFF_TEAM(this, toucher))) - return; + if(((this.spawnflags & 4) == 0) == (DIFF_TEAM(this, player))) + return false; + + return true; +} + +void Teleport_Touch(entity this, entity toucher) +{ + entity player = toucher; + + if(!Teleport_Active(this, player)) + return; - EXACTTRIGGER_TOUCH(this, toucher); + EXACTTRIGGER_TOUCH(this, player); #ifdef SVQC - if(IS_PLAYER(toucher)) - RemoveGrapplingHook(toucher); + if(IS_PLAYER(player)) + RemoveGrapplingHooks(player); #endif entity e; - e = Simple_TeleportPlayer(this, toucher); + e = Simple_TeleportPlayer(this, player); #ifdef SVQC string s = this.target; this.target = string_null; - SUB_UseTargets(this, toucher, toucher); // TODO: should we be using toucher for trigger too? + SUB_UseTargets(this, player, player); // TODO: should we be using toucher for trigger too? if (!this.target) this.target = s; - SUB_UseTargets(e, toucher, toucher); + SUB_UseTargets(e, player, player); #endif } +#ifdef SVQC +void target_teleport_use(entity this, entity actor, entity trigger) +{ + entity player = actor; + + if(!Teleport_Active(this, player)) + return; + + if(IS_PLAYER(player)) + RemoveGrapplingHooks(player); + + entity e = Simple_TeleportPlayer(this, player); + + string s = this.target; this.target = string_null; + SUB_UseTargets(this, player, player); // TODO: should we be using toucher for trigger too? + if (!this.target) this.target = s; + + SUB_UseTargets(e, player, player); +} +#endif + #ifdef SVQC float trigger_teleport_send(entity this, entity to, float sf) { @@ -98,13 +130,33 @@ spawnfunc(trigger_teleport) return; } - this.teleport_next = teleport_first; - teleport_first = this; + IL_PUSH(g_teleporters, this); +} + +spawnfunc(target_teleporter) +{ + if(this.target == "") + { + // actually a destination! + spawnfunc_info_teleport_destination(this); + return; + } + + this.active = ACTIVE_ACTIVE; + + this.use = target_teleport_use; + + if(this.noise != "") + FOREACH_WORD(this.noise, true, precache_sound(it)); + + InitializeEntity(this, teleport_findtarget, INITPRIO_FINDTARGET); } #elif defined(CSQC) NET_HANDLE(ENT_CLIENT_TRIGGER_TELEPORT, bool isnew) { this.classname = "trigger_teleport"; + if(isnew) + IL_PUSH(g_teleporters, this); int mytm = ReadByte(); if(mytm) { this.team = mytm - 1; } this.spawnflags = ReadInt24_t(); this.active = ReadByte(); @@ -114,13 +166,10 @@ NET_HANDLE(ENT_CLIENT_TRIGGER_TELEPORT, bool isnew) this.entremove = trigger_remove_generic; this.solid = SOLID_TRIGGER; - //this.move_touch = trigger_push_touch; + //settouch(this, trigger_push_touch); this.move_time = time; defer(this, 0.25, teleport_findtarget); - this.teleport_next = teleport_first; - teleport_first = this; - return true; }