X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Ft_teleporters.qc;h=a80323e23a49c95f2a734d8d12060e9a3f091ed0;hb=b8f39159e32e43bb8fafb5d49a599cddc94a9011;hp=eba0ea0681b3ee22edfcc378e7ca1c23f1027b17;hpb=06831b03595a3e450bf120d56d54f7e32c603cbe;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/t_teleporters.qc b/qcsrc/server/t_teleporters.qc index eba0ea068..a80323e23 100644 --- a/qcsrc/server/t_teleporters.qc +++ b/qcsrc/server/t_teleporters.qc @@ -33,7 +33,7 @@ float check_tdeath(entity player, vector org, vector telefragmin, vector telefra { TDEATHLOOP(org) { - if not(teamplay && cvar("g_telefrags_teamplay") && head.team == player.team) + if not(teams_matter && autocvar_g_telefrags_teamplay && head.team == player.team) if(head.classname == "player") if(head.health >= 1) return 1; @@ -48,7 +48,7 @@ void tdeath(entity player, entity teleporter, entity telefragger, vector telefra { if (player.classname == "player" && player.health >= 1) { - if not(teamplay && cvar("g_telefrags_teamplay") && head.team == player.team) + if not(teams_matter && autocvar_g_telefrags_teamplay && head.team == player.team) { if(head.classname == "player") if(head.health >= 1) @@ -88,16 +88,19 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle makevectors (to_angles); - if(self.pushltime < time) // only show one teleport effect per teleporter per 0.2 seconds, for better fps + if(player.classname == "player") // don't play sounds or show particles for anything that isn't a player, maybe change later to block only observers { - if(tflags & TELEPORT_FLAG_SOUND) - sound (player, CHAN_TRIGGER, "misc/teleport.wav", VOL_BASE, ATTN_NORM); - if(tflags & TELEPORT_FLAG_PARTICLES) + if(self.pushltime < time) // only show one teleport effect per teleporter per 0.2 seconds, for better fps { - pointparticles(particleeffectnum("teleport"), player.origin, '0 0 0', 1); - pointparticles(particleeffectnum("teleport"), to + v_forward * 32, '0 0 0', 1); + if(tflags & TELEPORT_FLAG_SOUND) + sound (player, CHAN_TRIGGER, "misc/teleport.wav", VOL_BASE, ATTN_NORM); + if(tflags & TELEPORT_FLAG_PARTICLES) + { + pointparticles(particleeffectnum("teleport"), player.origin, '0 0 0', 1); + pointparticles(particleeffectnum("teleport"), to + v_forward * 32, '0 0 0', 1); + } + self.pushltime = time + 0.2; } - self.pushltime = time + 0.2; } // Relocate the player @@ -115,7 +118,7 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle if(player.classname == "player") { if(tflags & TELEPORT_FLAG_TDEATH) - if(player.takedamage && player.deadflag == DEAD_NO && !g_race && !g_cts && (cvar("g_telefrags") || (tflags & TELEPORT_FLAG_FORCE_TDEATH))) + if(player.takedamage && player.deadflag == DEAD_NO && !g_race && !g_cts && (autocvar_g_telefrags || (tflags & TELEPORT_FLAG_FORCE_TDEATH))) tdeath(player, teleporter, telefragger, telefragmin, telefragmax); // player no longer is on ground @@ -128,7 +131,7 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle if(teleporter.owner) { player.pusher = teleporter.owner; - player.pushltime = time + cvar("g_maxpushtime"); + player.pushltime = time + autocvar_g_maxpushtime; } else { @@ -147,17 +150,55 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle } } -void Teleport_Touch (void) +void Simple_TeleportPlayer(entity teleporter, entity player) { - entity oldself, e; - vector o; + vector locout; + entity e; float p; + + // Find the output teleporter + if(!teleporter.enemy) + { + RandomSelection_Init(); + for(e = world; (e = find(e, targetname, teleporter.target)); ) + { + p = 1; + if(autocvar_g_telefrags_avoid) + { + locout = e.origin + '0 0 1' * (1 - player.mins_z - 24); + if(check_tdeath(player, locout, '0 0 0', '0 0 0')) + p = 0; + } + RandomSelection_Add(e, 0, string_null, (e.cnt ? e.cnt : 1), p); + } + teleporter.enemy = RandomSelection_chosen_ent; + } + + if(!teleporter.enemy) { sprint(player, "Teleport destination vanished. Sorry... please complain to the mapper.\n"); } + + makevectors(teleporter.enemy.mangle); + + if(teleporter.enemy.speed) + if(vlen(player.velocity) > teleporter.enemy.speed) + player.velocity = normalize(player.velocity) * max(0, teleporter.enemy.speed); + + if(autocvar_g_teleport_maxspeed) + if(vlen(player.velocity) > autocvar_g_teleport_maxspeed) + player.velocity = normalize(player.velocity) * max(0, autocvar_g_teleport_maxspeed); + + locout = teleporter.enemy.origin + '0 0 1' * (1 - player.mins_z - 24); + TeleportPlayer(teleporter, player, locout, teleporter.enemy.mangle, v_forward * vlen(player.velocity), '0 0 0', '0 0 0', TELEPORT_FLAGS_TELEPORTER); +} + +void Teleport_Touch (void) +{ + entity oldself; string s; if (self.active != ACTIVE_ACTIVE) return; - if (other.health < 1) + if (other.deadflag != DEAD_NO) return; if not(other.flags & FL_CLIENT) // FIXME: Make missiles firable through the teleport too return; @@ -168,49 +209,10 @@ void Teleport_Touch (void) EXACTTRIGGER_TOUCH; - makevectors(self.enemy.mangle); - if(other.classname == "player") RemoveGrapplingHook(other); - - if(self.enemy) - { - e = self.enemy; - } - else - { - RandomSelection_Init(); - for(e = world; (e = find(e, targetname, self.target)); ) - { - p = 1; - if(cvar("g_telefrags_avoid")) - { - o = e.origin + '0 0 1' * (1 - other.mins_z - 24); - if(check_tdeath(other, o, '0 0 0', '0 0 0')) - p = 0; - } - if(e.cnt) - RandomSelection_Add(e, 0, string_null, e.cnt, p); - else - RandomSelection_Add(e, 0, string_null, 1, p); - } - e = RandomSelection_chosen_ent; - } - - if(!e) - { - sprint(other, "Teleport destination vanished. Sorry... please complain to the mapper.\n"); - } - - if(e.speed) - if(vlen(other.velocity) > e.speed) - other.velocity = normalize(other.velocity) * max(0, e.speed); - if(cvar("g_teleport_maxspeed")) - if(vlen(other.velocity) > cvar("g_teleport_maxspeed")) - other.velocity = normalize(other.velocity) * max(0, cvar("g_teleport_maxspeed")); - - o = e.origin + '0 0 1' * (1 - other.mins_z - 24); - TeleportPlayer(self, other, o, e.mangle, v_forward * vlen(other.velocity), '0 0 0', '0 0 0', TELEPORT_FLAGS_TELEPORTER); + + Simple_TeleportPlayer(self, other); activator = other; s = self.target; self.target = string_null; @@ -218,7 +220,7 @@ void Teleport_Touch (void) if not(self.target) self.target = s; oldself = self; - self = e; + self = self.enemy; SUB_UseTargets(); self = oldself; } @@ -290,6 +292,17 @@ void teleport_findtarget (void) self.touch = Teleport_Touch; } +entity Teleport_Find(vector mi, vector ma) +{ + entity e; + for(e = world; (e = find(e, classname, "trigger_teleport")); ) + if(WarpZoneLib_BoxTouchesBrush(mi, ma, e, world)) + return e; + return world; +} + +entity teleport_first; +.entity teleport_next; void spawnfunc_trigger_teleport (void) { self.angles = '0 0 0'; @@ -308,6 +321,9 @@ void spawnfunc_trigger_teleport (void) objerror ("Teleporter with no target"); return; } + + self.teleport_next = teleport_first; + teleport_first = self; } void WarpZone_PostTeleportPlayer_Callback(entity pl)