From e3a129f34c214146f6daeefc6b46737f4dfff8bd Mon Sep 17 00:00:00 2001 From: div0 Date: Tue, 9 Sep 2008 13:33:55 +0000 Subject: [PATCH] prevent an exploit to create portals on noimpact git-svn-id: svn://svn.icculus.org/nexuiz/trunk@4435 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/portals.qc | 14 -------------- data/qcsrc/server/w_porto.qc | 29 +++++++++++++++++++++++------ 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/data/qcsrc/server/portals.qc b/data/qcsrc/server/portals.qc index c5ef81f08..e54706ff3 100644 --- a/data/qcsrc/server/portals.qc +++ b/data/qcsrc/server/portals.qc @@ -602,13 +602,6 @@ float Portal_SpawnInPortalAtTrace(entity own, vector dir, float portal_id_val) vector ang; vector org; - if(trace_ent.movetype == MOVETYPE_WALK) - { - trace_endpos = trace_ent.origin + '0 0 1' * PL_MIN_z; - trace_plane_normal = '0 0 1'; - dir = -1 * dir; // create telefrag portals the other way round - } - org = trace_endpos; ang = fixedvectoangles2(trace_plane_normal, dir); fixedmakevectors(ang); @@ -633,13 +626,6 @@ float Portal_SpawnOutPortalAtTrace(entity own, vector dir, float portal_id_val) vector ang; vector org; - if(trace_ent.movetype == MOVETYPE_WALK) - { - trace_endpos = trace_ent.origin + '0 0 1' * PL_MIN_z; - trace_plane_normal = '0 0 1'; - dir = -1 * dir; // create telefrag portals the other way round - } - org = trace_endpos; ang = fixedvectoangles2(trace_plane_normal, dir); fixedmakevectors(ang); diff --git a/data/qcsrc/server/w_porto.qc b/data/qcsrc/server/w_porto.qc index 1df8d6590..1b5385887 100644 --- a/data/qcsrc/server/w_porto.qc +++ b/data/qcsrc/server/w_porto.qc @@ -60,10 +60,20 @@ void W_Porto_Think (void) void W_Porto_Touch (void) { vector norm; + float noreflect; if(other.classname == "portal") return; // handled by the portal + noreflect = 0; + if(trace_ent.movetype == MOVETYPE_WALK) + { + traceline(trace_ent.origin, trace_ent.origin + '0 0 2' * PL_MIN_z, MOVE_NORMAL, self); + if(trace_fraction >= 1) + return; + noreflect = 1; + } + norm = trace_plane_normal; if(self.owner.playerid != self.playerid) { @@ -71,13 +81,17 @@ void W_Porto_Touch (void) } else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK) { - // just reflect - self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal); - self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * trace_plane_normal)); + if(!noreflect) + { + // just reflect + self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal); + self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * trace_plane_normal)); + } } else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) { - W_Porto_Fail(0); + if(!noreflect) + W_Porto_Fail(0); } else if(self.effects & EF_RED) { @@ -87,8 +101,11 @@ void W_Porto_Touch (void) sound(self, CHAN_PROJECTILE, "misc/invshot.wav", VOL_BASE, ATTN_NORM); centerprint(self.owner, "^1In^7-portal created.\n"); trace_plane_normal = norm; - self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal); - self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * trace_plane_normal)); + if(!noreflect) + { + self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal); + self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * trace_plane_normal)); + } } else { -- 2.39.2