r4345 - trunk/data/qcsrc/server
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Fri Sep 5 02:07:56 EDT 2008
Author: div0
Date: 2008-09-05 02:07:56 -0400 (Fri, 05 Sep 2008)
New Revision: 4345
Modified:
trunk/data/qcsrc/server/portals.qc
trunk/data/qcsrc/server/portals.qh
trunk/data/qcsrc/server/w_porto.qc
Log:
more portal gun changes
Modified: trunk/data/qcsrc/server/portals.qc
===================================================================
--- trunk/data/qcsrc/server/portals.qc 2008-09-04 15:20:35 UTC (rev 4344)
+++ trunk/data/qcsrc/server/portals.qc 2008-09-05 06:07:56 UTC (rev 4345)
@@ -2,6 +2,7 @@
.vector portal_safe_origin;
.float portal_wants_to_vanish;
.float portal_activatetime;
+.float portal_id;
.entity portal_in, portal_out;
@@ -74,15 +75,17 @@
return vbest * v;
}
-void Portal_TeleportPlayer(entity teleporter, entity player)
+.vector right_vector;
+float Portal_TeleportPlayer(entity teleporter, entity player)
{
vector from, to, safe, step, transform, ang, newvel;
- float planeshift;
+ float planeshift, s, t;
from = teleporter.origin;
- to = teleporter.enemy.origin;
transform = teleporter.portal_transform;
+ to = teleporter.enemy.origin;
to = to + Portal_Transform_Apply(teleporter.portal_transform, player.origin - from);
+ newvel = Portal_Transform_Apply(transform, player.velocity);
// this now is INSIDE the plane... can't use that
// shift it out
@@ -91,9 +94,14 @@
// first shift it ON the plane if needed
planeshift = ((teleporter.enemy.origin - to) * v_forward) + PlayerEdgeDistance(player, v_forward);
if(planeshift > 0)
- to += v_forward * planeshift;
- else
- print("no planeshift?\n");
+ to += newvel * (planeshift / (newvel * v_forward));
+
+ s = bound(-48, (to - teleporter.enemy.origin) * v_right, 48);
+ t = bound(-48, (to - teleporter.enemy.origin) * v_up, 48);
+ to = teleporter.enemy.origin
+ + (to * v_forward) * v_forward
+ + s * v_right
+ + t * v_up;
safe = teleporter.enemy.portal_safe_origin; // a valid player origin
step = to + ((safe - to) * v_forward) * v_forward;
@@ -102,7 +110,7 @@
{
bprint("'safe' teleport location is not safe!\n");
// FAIL TODO why does this happen?
- return;
+ return 0;
}
safe = trace_endpos;
tracebox(safe, PL_MIN, PL_MAX, to, MOVE_NOMONSTERS, player);
@@ -126,7 +134,8 @@
}
ang_x = -ang_x;
- newvel = Portal_Transform_Apply(transform, player.velocity);
+ // factor -1 allows chaining portals, but may be weird
+ player.right_vector = -1 * Portal_Transform_Apply(transform, player.right_vector);
if(player.flagcarried)
DropFlag(player.flagcarried);
@@ -136,6 +145,8 @@
teleporter.portal_wants_to_vanish = 0;
teleporter.fade_time = time + 15;
teleporter.enemy.health = 300;
+
+ return 1;
}
float Portal_FindSafeOrigin(entity portal)
@@ -161,7 +172,10 @@
void Portal_Touch()
{
if(other.classname == "porto")
- return;
+ {
+ if(other.portal_id == self.portal_id)
+ return;
+ }
if(time < self.portal_activatetime)
if(other == self.owner)
{
@@ -177,7 +191,10 @@
// can't teleport this
return;
}
- Portal_TeleportPlayer(self, other);
+ if(Portal_TeleportPlayer(self, other))
+ if(other.classname == "porto")
+ if(other.cnt == 0)
+ other.cnt = 1;
}
void Portal_MakeBrokenPortal(entity portal)
@@ -393,17 +410,32 @@
if(own.portal_out)
Portal_Remove(own.portal_out, 0);
}
-float Portal_VerifyPortal(entity own, vector org, vector ang)
+void Portal_ClearWithID(entity own, float id)
{
- fixedmakevectors(ang);
- if(!CheckWireframeBox(own, org - 48 * v_right - 48 * v_up + 16 * v_forward, 96 * v_right, 96 * v_up, 96 * v_forward))
- return 0;
- return 1;
+ if(own.portal_in)
+ if(own.portal_in.portal_id == id)
+ {
+ if(own.portal_out)
+ Portal_Disconnect(own.portal_in, own.portal_out);
+ Portal_Remove(own.portal_in, 0);
+ }
+ if(own.portal_out)
+ if(own.portal_out.portal_id == id)
+ {
+ if(own.portal_in)
+ Portal_Disconnect(own.portal_in, own.portal_out);
+ Portal_Remove(own.portal_out, 0);
+ }
}
entity Portal_Spawn(entity own, vector org, vector ang)
{
entity portal;
+
+ fixedmakevectors(ang);
+ if(!CheckWireframeBox(own, org - 48 * v_right - 48 * v_up + 16 * v_forward, 96 * v_right, 96 * v_up, 96 * v_forward))
+ return world;
+
portal = spawn();
portal.classname = "portal";
portal.owner = own;
@@ -435,23 +467,6 @@
vector ang;
vector org;
-#ifdef DEBUG
- {
- vector a, b;
- a = randomvec();
- a = '0 0 -1';
- a = normalize(a);
- b = randomvec();
- b = '1 0 0';
- b = normalize(b - (b * a) * a);
- print("f/u = ", vtos(a), " ", vtos(b), "\n");
- a = vectoangles2(a, b);
- print("ang = ", vtos(a), "\n");
- fixedmakevectors(a);
- print("f/u = ", vtos(v_forward), " ", vtos(v_up), "\n");
- }
-#endif
-
if(trace_ent.movetype == MOVETYPE_WALK)
{
trace_endpos = trace_ent.origin + '0 0 1' * PL_MIN_z;
@@ -463,21 +478,15 @@
ang = vectoangles2(trace_plane_normal, dir);
fixedmakevectors(ang);
- if((trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) || !Portal_VerifyPortal(own, org, ang))
- {
- // cannot create a portal here
- // clear all to make sure
- Portal_ClearAll(own);
- return 0;
- }
-
portal = Portal_Spawn(own, org, ang);
if(!portal)
{
- Portal_ClearAll(own);
+ if(!self.portal_out || self.portal_out.portal_id == portal_id_val)
+ Portal_ClearAll(own);
return 0;
}
+ portal.portal_id = portal_id_val;
Portal_SetInPortal(own, portal);
return 1;
@@ -500,21 +509,15 @@
ang = vectoangles2(trace_plane_normal, dir);
fixedmakevectors(ang);
- if((trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) || !Portal_VerifyPortal(own, org, ang))
- {
- // cannot create a portal here
- // clear all to make sure
- Portal_ClearAll(own);
- return 0;
- }
-
portal = Portal_Spawn(own, org, ang);
if(!portal)
{
- Portal_ClearAll(own);
+ if(!self.portal_in || self.portal_in.portal_id == portal_id_val)
+ Portal_ClearAll(own);
return 0;
}
+ portal.portal_id = portal_id_val;
Portal_SetOutPortal(own, portal);
return 1;
Modified: trunk/data/qcsrc/server/portals.qh
===================================================================
--- trunk/data/qcsrc/server/portals.qh 2008-09-04 15:20:35 UTC (rev 4344)
+++ trunk/data/qcsrc/server/portals.qh 2008-09-05 06:07:56 UTC (rev 4345)
@@ -1,3 +1,4 @@
void Portal_ClearAll(entity own);
-float Portal_SpawnOutPortalAtTrace(entity own, vector dir, float portal_id);
-float Portal_SpawnInPortalAtTrace(entity own, vector dir, float portal_id);
+float Portal_SpawnOutPortalAtTrace(entity own, vector dir, float id);
+float Portal_SpawnInPortalAtTrace(entity own, vector dir, float id);
+void Portal_ClearWithID(entity own, float id);
Modified: trunk/data/qcsrc/server/w_porto.qc
===================================================================
--- trunk/data/qcsrc/server/w_porto.qc 2008-09-04 15:20:35 UTC (rev 4344)
+++ trunk/data/qcsrc/server/w_porto.qc 2008-09-05 06:07:56 UTC (rev 4345)
@@ -1,11 +1,11 @@
-.float porto_grenade_id;
+.float portal_id;
.vector porto_v_angle; // holds "held" view angles
.float porto_v_angle_held;
.vector right_vector;
void W_Porto_Success (void)
{
- self.owner.porto_grenade_id = 0;
+ self.owner.portal_id = 0;
remove(self);
}
@@ -13,7 +13,11 @@
void W_Porto_Fail (void)
{
centerprint(self.owner, "^1Portal deployment failed.\n\n^2Catch it to try again!");
- self.owner.porto_grenade_id = 0;
+
+ // no portals here!
+ Portal_ClearWithID(self.owner, self.portal_id);
+
+ self.owner.portal_id = 0;
// TODO maybe instead throw the portal gun there?
// self.owner.weapons = self.owner.weapons | WEPBIT_PORTO;
setsize (self, '-16 -16 0', '16 16 32');
@@ -51,27 +55,41 @@
{
remove(self);
}
+ else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK)
+ {
+ // just reflect
+ self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal);
+ }
+ else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+ {
+ W_Porto_Fail();
+ }
else if(self.cnt == 0)
{
self.cnt = 1;
- if(!Portal_SpawnInPortalAtTrace(self.owner, self.right_vector, self.porto_grenade_id))
+ if(Portal_SpawnInPortalAtTrace(self.owner, self.right_vector, self.portal_id))
{
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);
+ }
+ else
+ {
+ trace_plane_normal = norm;
W_Porto_Fail();
- return;
}
- trace_plane_normal = norm;
- self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal);
}
else
{
- if(!Portal_SpawnOutPortalAtTrace(self.owner, self.right_vector, self.porto_grenade_id))
+ if(Portal_SpawnOutPortalAtTrace(self.owner, self.right_vector, self.portal_id))
{
+ W_Porto_Success();
+ }
+ else
+ {
trace_plane_normal = norm;
W_Porto_Fail();
}
- else
- W_Porto_Success();
}
}
@@ -108,7 +126,7 @@
gren.angles = vectoangles (gren.velocity);
gren.flags = FL_PROJECTILE;
- self.porto_grenade_id = gren.porto_grenade_id = time;
+ self.portal_id = gren.portal_id = time;
gren.playerid = self.playerid;
fixedmakevectors(vectoangles(gren.velocity));
gren.right_vector = v_right;
@@ -177,7 +195,7 @@
makevectors(self.porto_v_angle); // override the previously set angles
if (self.BUTTON_ATCK)
- if (!self.porto_grenade_id)
+ if (!self.portal_id)
if (weapon_prepareattack(0, cvar("g_balance_porto_primary_refire")))
{
W_Porto_Attack();
More information about the nexuiz-commits
mailing list