From ba4ccc4df66e506216c516f539137cd7c1c3045c Mon Sep 17 00:00:00 2001 From: div0 Date: Fri, 24 Oct 2008 12:13:39 +0000 Subject: [PATCH] slightly different hook behaviour (projectiles that the hook teleports must now go THROUGH the hook's circle) git-svn-id: svn://svn.icculus.org/nexuiz/trunk@4864 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/server/portals.qc | 35 +++++++++++++++++++++++++----- data/qcsrc/server/t_teleporters.qc | 6 +++-- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/data/qcsrc/server/portals.qc b/data/qcsrc/server/portals.qc index e7f0e0a70..1cd0df261 100644 --- a/data/qcsrc/server/portals.qc +++ b/data/qcsrc/server/portals.qc @@ -226,8 +226,30 @@ float Portal_FindSafeOrigin(entity portal) return 1; } +float Portal_WillHitPlane(vector eorg, vector emins, vector emaxs, vector evel, vector porg, vector pnorm, float psize) +{ + float dist, distpersec, delta; + vector v; + + dist = (eorg - porg) * pnorm; + dist += min(emins_x * pnorm_x, emaxs_x * pnorm_x); + dist += min(emins_y * pnorm_y, emaxs_y * pnorm_y); + dist += min(emins_z * pnorm_z, emaxs_z * pnorm_z); + if(dist < -1) // other side? + return 0; + distpersec = evel * pnorm; + if(distpersec >= 0) // going away from the portal? + return 0; + delta = dist / distpersec; + v = eorg - evel * delta - porg; + v = v - pnorm * (pnorm * v); + return vlen(v) < psize; +} + void Portal_Touch() { + vector g; + // portal is being removed? if(self.solid != SOLID_TRIGGER) return; // possibly engine bug @@ -239,9 +261,6 @@ void Portal_Touch() return; // only handle TouchAreaGrid ones (only these can teleport) // for some unknown reason, this also gets collisions from SV_Impact sometimes - if(other.classname == "grapplinghook") - return; - if(other.classname == "porto") { if(other.portal_id == self.portal_id) @@ -262,7 +281,8 @@ void Portal_Touch() if(IS_INDEPENDENT_PLAYER(other.owner) || IS_INDEPENDENT_PLAYER(self.owner)) return; // cannot go through someone else's portal fixedmakevectors(self.angles); - if((other.origin - self.origin) * v_forward < 0) + g = frametime * '0 0 -1' * cvar("sv_gravity"); + if(!Portal_WillHitPlane(other.origin, other.mins, other.maxs, other.velocity + g, self.origin, v_forward, self.maxs_x)) return; /* @@ -423,6 +443,7 @@ void Portal_Damage(entity inflictor, entity attacker, float damage, float deatht void Portal_Think() { entity e, o; + vector g; // portal is being removed? if(self.solid != SOLID_TRIGGER) @@ -435,6 +456,8 @@ void Portal_Think() self.solid = SOLID_BBOX; self.owner = world; + g = frametime * '0 0 -1' * cvar("sv_gravity"); + fixedmakevectors(self.angles); FOR_EACH_PLAYER(e) @@ -445,7 +468,7 @@ void Portal_Think() if(e != o) if(IS_INDEPENDENT_PLAYER(e) || IS_INDEPENDENT_PLAYER(o)) continue; // cannot go through someone else's portal - if((e.origin - self.origin) * v_forward < 0) // wrong side of the plane? no teleport + if(!Portal_WillHitPlane(e.origin, e.mins, e.maxs, e.velocity + g, self.origin, v_forward, self.maxs_x)) continue; // if e would hit the portal in a frame... @@ -599,7 +622,7 @@ entity Portal_Spawn(entity own, vector org, vector ang) portal.angles = ang; portal.think = Portal_Think; portal.nextthink = 0; - portal.portal_activatetime = time + 1.1; + portal.portal_activatetime = time + 0.1; portal.event_damage = Portal_Damage; portal.health = 200; portal.fade_time = time + cvar("g_balance_portal_lifetime"); diff --git a/data/qcsrc/server/t_teleporters.qc b/data/qcsrc/server/t_teleporters.qc index 80e209367..75ade0589 100644 --- a/data/qcsrc/server/t_teleporters.qc +++ b/data/qcsrc/server/t_teleporters.qc @@ -25,8 +25,6 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle if(player.classname == "player") { - RemoveGrapplingHook(player); - // Kill anyone else in the teleporter box (NO MORE TDEATH) if(player.takedamage && player.deadflag == DEAD_NO && !g_race) { @@ -104,6 +102,10 @@ void Teleport_Touch (void) EXACTTRIGGER_TOUCH; makevectors(self.enemy.mangle); + + if(other.classname == "player") + RemoveGrapplingHook(other); + TeleportPlayer(self, other, self.enemy.origin + '0 0 1' * (1 - other.mins_z - 24), self.enemy.mangle, v_forward * vlen(other.velocity), '0 0 0', '0 0 0'); if(self.enemy.target) -- 2.39.2