r4864 - trunk/data/qcsrc/server
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Fri Oct 24 08:13:41 EDT 2008
Author: div0
Date: 2008-10-24 08:13:39 -0400 (Fri, 24 Oct 2008)
New Revision: 4864
Modified:
trunk/data/qcsrc/server/portals.qc
trunk/data/qcsrc/server/t_teleporters.qc
Log:
slightly different hook behaviour (projectiles that the hook teleports must now go THROUGH the hook's circle)
Modified: trunk/data/qcsrc/server/portals.qc
===================================================================
--- trunk/data/qcsrc/server/portals.qc 2008-10-24 09:45:12 UTC (rev 4863)
+++ trunk/data/qcsrc/server/portals.qc 2008-10-24 12:13:39 UTC (rev 4864)
@@ -226,8 +226,30 @@
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 @@
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 @@
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_Think()
{
entity e, o;
+ vector g;
// portal is being removed?
if(self.solid != SOLID_TRIGGER)
@@ -435,6 +456,8 @@
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 @@
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 @@
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");
Modified: trunk/data/qcsrc/server/t_teleporters.qc
===================================================================
--- trunk/data/qcsrc/server/t_teleporters.qc 2008-10-24 09:45:12 UTC (rev 4863)
+++ trunk/data/qcsrc/server/t_teleporters.qc 2008-10-24 12:13:39 UTC (rev 4864)
@@ -25,8 +25,6 @@
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 @@
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)
More information about the nexuiz-commits
mailing list