From 8b946246bb7a32eaff6d964e5ff0afa2745ff224 Mon Sep 17 00:00:00 2001 From: kadaverjack Date: Sat, 18 Mar 2006 10:20:47 +0000 Subject: [PATCH] players now keep their speed (not optimal: they should keep their angle relative to the teleporter as well) and become invis for a short time (to avoid "ghostimages" created by interpolation) when stepping through teleporters and fixed the items falling through floor bug hopefully once and for all (nexdm10 still gave warnings about stuck entities) git-svn-id: svn://svn.icculus.org/nexuiz/trunk@1167 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/gamec/cl_player.c | 2 +- data/qcsrc/server/gamec/cl_weaponsystem.c | 8 +++++++- data/qcsrc/server/gamec/t_items.c | 2 +- data/qcsrc/server/gamec/t_teleporters.c | 25 +++++++++++++++++++---- 4 files changed, 30 insertions(+), 7 deletions(-) diff --git a/data/qcsrc/server/gamec/cl_player.c b/data/qcsrc/server/gamec/cl_player.c index 8b648acdf..f9d9dbb08 100644 --- a/data/qcsrc/server/gamec/cl_player.c +++ b/data/qcsrc/server/gamec/cl_player.c @@ -226,7 +226,7 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float TossGib (world, "models/gibs/chunk.mdl", self.origin, self.velocity,1); TossGib (world, "models/gibs/chunk.mdl", self.origin, '0 0 450',1); - sound (trace_ent, CHAN_VOICE, "misc/gib.wav", 1, ATTN_NORM); + sound (self, CHAN_VOICE, "misc/gib.wav", 1, ATTN_NORM); } } diff --git a/data/qcsrc/server/gamec/cl_weaponsystem.c b/data/qcsrc/server/gamec/cl_weaponsystem.c index b41bc9fbb..044fe36b9 100644 --- a/data/qcsrc/server/gamec/cl_weaponsystem.c +++ b/data/qcsrc/server/gamec/cl_weaponsystem.c @@ -126,7 +126,13 @@ void() CL_Weaponentity_Think = remove(self); return; } - self.effects = self.owner.effects; + + if (self.flags & FL_FLY) + // owner is currently being teleported, so don't apply EF_NODRAW otherwise the viewmodel would "blink" + self.effects = self.owner.effects - (self.owner.effects & EF_NODRAW); + else + self.effects = self.owner.effects; + self.alpha = self.owner.alpha; // create or update the lasertarget entity diff --git a/data/qcsrc/server/gamec/t_items.c b/data/qcsrc/server/gamec/t_items.c index 95c079983..9597984f4 100644 --- a/data/qcsrc/server/gamec/t_items.c +++ b/data/qcsrc/server/gamec/t_items.c @@ -220,7 +220,7 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, } else { - setorigin (self, self.origin + '0 0 18'); + setorigin (self, self.origin + '0 0 1' * other.maxs_z + '0 0 18'); // setsize (self, '-8 -8 -5', '8 8 8'); } self.movetype = MOVETYPE_TOSS; diff --git a/data/qcsrc/server/gamec/t_teleporters.c b/data/qcsrc/server/gamec/t_teleporters.c index 147ebc19a..298f63744 100644 --- a/data/qcsrc/server/gamec/t_teleporters.c +++ b/data/qcsrc/server/gamec/t_teleporters.c @@ -19,6 +19,17 @@ void() tdeath_touch = Damage (self.owner, self, self.owner, 10000, DEATH_TELEFRAG, self.owner.origin, '0 0 0'); }; +void tdeath_remove() +{ + if (self.owner) + { + self.owner.effects = self.owner.effects - (self.owner.effects & EF_NODRAW); + if (self.owner.weaponentity) + self.owner.weaponentity.flags = self.owner.weaponentity.flags - (self.owner.weaponentity.flags & FL_FLY); + } + remove(self); +} + // org2 is where they will return to if the teleport fails void(vector org, entity death_owner, vector org2) spawn_tdeath = { @@ -34,9 +45,14 @@ void(vector org, entity death_owner, vector org2) spawn_tdeath = setorigin (death, org); death.touch = tdeath_touch; death.nextthink = time + 0.2; - death.think = SUB_Remove; + death.think = tdeath_remove; death.owner = death_owner; + // hide entity to avoid "ghosts" between teleporter and destination caused by clientside interpolation + death.owner.effects = death.owner.effects | EF_NODRAW; + if (death.owner.weaponentity) // misuse FL_FLY to avoid EF_NODRAW on viewmodel + death.owner.weaponentity.flags = death.owner.weaponentity.flags | FL_FLY; + force_retouch = 2; // make sure even still objects get hit }; @@ -44,7 +60,7 @@ void Teleport_Touch (void) { if (other.health < 1) return; - if (other.classname != "player") // FIXME: Make missiles firable through the teleport too + if (!other.flags & FL_CLIENT) // FIXME: Make missiles firable through the teleport too return; // Make teleport effect where the player left @@ -68,7 +84,8 @@ void Teleport_Touch (void) other.angles = dest.mangle; other.fixangle = TRUE; - other.velocity = '0 0 0'; + // keep velocity but change movement direction + other.velocity = v_forward * vlen(other.velocity); other.flags = other.flags - (other.flags & FL_ONGROUND); // reset tracking of oldvelocity for impact damage (sudden velocity changes) @@ -110,4 +127,4 @@ void trigger_teleport (void) if (!self.target) objerror ("Teleporter with no target"); -} \ No newline at end of file +} -- 2.39.2