[nexuiz-commits] r8709 - in trunk/data/qcsrc: server warpzonelib
DONOTREPLY at icculus.org
DONOTREPLY at icculus.org
Sun Feb 28 14:44:12 EST 2010
Author: div0
Date: 2010-02-28 14:44:11 -0500 (Sun, 28 Feb 2010)
New Revision: 8709
Modified:
trunk/data/qcsrc/server/w_rocketlauncher.qc
trunk/data/qcsrc/warpzonelib/TODO
trunk/data/qcsrc/warpzonelib/anglestransform.qc
trunk/data/qcsrc/warpzonelib/anglestransform.qh
trunk/data/qcsrc/warpzonelib/common.qc
trunk/data/qcsrc/warpzonelib/common.qh
trunk/data/qcsrc/warpzonelib/server.qc
Log:
fix RL
Modified: trunk/data/qcsrc/server/w_rocketlauncher.qc
===================================================================
--- trunk/data/qcsrc/server/w_rocketlauncher.qc 2010-02-28 19:44:07 UTC (rev 8708)
+++ trunk/data/qcsrc/server/w_rocketlauncher.qc 2010-02-28 19:44:11 UTC (rev 8709)
@@ -228,8 +228,8 @@
velspeed = vlen(self.velocity);
makevectors(self.owner.v_angle);
- desireddir = v_forward;
- desiredorigin = self.owner.origin + self.owner.view_ofs;
+ desireddir = WarpZone_RefSys_TransformVelocity(self.owner, self, v_forward);
+ desiredorigin = WarpZone_RefSys_TransformOrigin(self.owner, self, self.owner.origin + self.owner.view_ofs);
olddir = normalize(self.velocity);
#if 0
@@ -298,7 +298,7 @@
W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 5, "weapons/rocket_fire.wav", cvar("g_balance_rocketlauncher_damage"));
pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
- missile = spawn ();
+ missile = WarpZone_RefSys_SpawnSameRefSys(self);
missile.owner = self;
self.lastrocket = missile;
if(cvar("g_balance_rocketlauncher_detonatedelay") >= 0)
Modified: trunk/data/qcsrc/warpzonelib/TODO
===================================================================
--- trunk/data/qcsrc/warpzonelib/TODO 2010-02-28 19:44:07 UTC (rev 8708)
+++ trunk/data/qcsrc/warpzonelib/TODO 2010-02-28 19:44:11 UTC (rev 8709)
@@ -11,12 +11,12 @@
- crylink: YES
- nex: YES
- hagar: YES
+- rocketlauncher: YES (except for trail bug)
- porto: YES (bwahahahaha)
- hlac: YES
- minstanex: YES
- rifle: YES
- fireball: YES (BFG effect cannot work through warpzones by design, so it's not available through warpzones)
-- rocketlauncher: NO (guiding not working, trail bug)
- hook: NO (hook beam, pull not working)
- tuba: NO (sound)
Modified: trunk/data/qcsrc/warpzonelib/anglestransform.qc
===================================================================
--- trunk/data/qcsrc/warpzonelib/anglestransform.qc 2010-02-28 19:44:07 UTC (rev 8708)
+++ trunk/data/qcsrc/warpzonelib/anglestransform.qc 2010-02-28 19:44:11 UTC (rev 8709)
@@ -168,3 +168,18 @@
return v;
}
#endif
+
+vector AnglesTransform_Multiply_GetPreShift(vector sf0, vector t0, vector st0, vector sf1, vector t1, vector st1)
+{
+ // we want the result of:
+ // t0 * (t1 * (p - sf1) + st1 - sf0) + st0
+ // t0 * t1 * (p - sf1) + t0 * (st1 - sf0) + st0
+ return sf1;
+}
+vector AnglesTransform_Multiply_GetPostShift(vector sf0, vector t0, vector st0, vector sf1, vector t1, vector st1)
+{
+ // we want the result of:
+ // t0 * (t1 * (p - sf1) + st1 - sf0) + st0
+ // t0 * t1 * (p - sf1) + t0 * (st1 - sf0) + st0
+ return AnglesTransform_Apply(t0, st1 - sf0) + st0;
+}
Modified: trunk/data/qcsrc/warpzonelib/anglestransform.qh
===================================================================
--- trunk/data/qcsrc/warpzonelib/anglestransform.qh 2010-02-28 19:44:07 UTC (rev 8708)
+++ trunk/data/qcsrc/warpzonelib/anglestransform.qh 2010-02-28 19:44:11 UTC (rev 8709)
@@ -21,3 +21,7 @@
vector AnglesTransform_ApplyToAngles(vector transform, vector v);
vector AnglesTransform_ApplyToVAngles(vector transform, vector v);
+
+// transformed = (original - preshift) * transform + postshift
+vector AnglesTransform_Multiply_GetPreShift(vector sf0, vector t0, vector st0, vector sf1, vector t1, vector st1);
+vector AnglesTransform_Multiply_GetPostShift(vector sf0, vector t0, vector st0, vector sf1, vector t1, vector st1);
Modified: trunk/data/qcsrc/warpzonelib/common.qc
===================================================================
--- trunk/data/qcsrc/warpzonelib/common.qc 2010-02-28 19:44:07 UTC (rev 8708)
+++ trunk/data/qcsrc/warpzonelib/common.qc 2010-02-28 19:44:11 UTC (rev 8709)
@@ -298,6 +298,7 @@
vector org_new;
vector org0_new;
vector shift0_new, transform_new, shift1_new;
+ vector transform_second;
vector p;
entity e, e0;
entity wz;
@@ -345,9 +346,11 @@
org0_new = WarpZone_TransformOrigin(e, org);
traceline(e.warpzone_targetorigin, org0_new, MOVE_NOMONSTERS, e);
org_new = trace_endpos;
- transform_new = AnglesTransform_Multiply(transform, AnglesTransform_Invert(e.warpzone_transform));
- shift0_new = e.warpzone_targetorigin;
- shift1_new = AnglesTransform_Apply(transform, e.warpzone_origin - shift0) + shift1;
+
+ transform_second = AnglesTransform_Invert(e.warpzone_transform);
+ transform_new = AnglesTransform_Multiply(transform, transform_second);
+ shift0_new = AnglesTransform_Multiply_GetPreShift(shift0, transform, shift1, e.warpzone_targetorigin, transform_second, e.warpzone_origin);
+ shift1_new = AnglesTransform_Multiply_GetPostShift(shift0, transform, shift1, e.warpzone_targetorigin, transform_second, e.warpzone_origin);
WarpZone_FindRadius_Recurse(
org_new,
bound(0, rad - vlen(org_new - org0_new), rad - 8),
@@ -367,3 +370,83 @@
e.WarpZone_findradius_hit = 0;
return e0;
}
+
+void WarpZone_Accumulator_Clear(entity acc)
+{
+ acc.warpzone_transform = '0 0 0';
+ acc.warpzone_origin = '0 0 0';
+ acc.warpzone_targetorigin = '0 0 0';
+}
+void WarpZone_Accumulator_Add(entity acc, entity wz)
+{
+ vector sf, t, st;
+ sf = AnglesTransform_Multiply_GetPreShift(wz.warpzone_origin, wz.warpzone_transform, wz.warpzone_targetorigin, acc.warpzone_origin, acc.warpzone_transform, acc.warpzone_targetorigin);
+ t = AnglesTransform_Multiply(wz.warpzone_transform, acc.warpzone_transform);
+ st = AnglesTransform_Multiply_GetPostShift(wz.warpzone_origin, wz.warpzone_transform, wz.warpzone_targetorigin, acc.warpzone_origin, acc.warpzone_transform, acc.warpzone_targetorigin);
+ acc.warpzone_origin = sf;
+ acc.warpzone_transform = t;
+ acc.warpzone_targetorigin = st;
+}
+
+.entity WarpZone_refsys;
+void WarpZone_RefSys_GC()
+{
+ // garbage collect unused reference systems
+ self.nextthink = time + 1;
+ if(self.owner.WarpZone_refsys != self)
+ remove(self);
+}
+void WarpZone_RefSys_Add(entity me, entity wz)
+{
+ if(me.WarpZone_refsys.owner != me)
+ {
+ me.WarpZone_refsys = spawn();
+ me.WarpZone_refsys.classname = "warpzone_refsys";
+ me.WarpZone_refsys.owner = me;
+ me.WarpZone_refsys.think = WarpZone_RefSys_GC;
+ me.WarpZone_refsys.nextthink = time + 1;
+ WarpZone_Accumulator_Clear(me.WarpZone_refsys);
+ }
+ if(wz)
+ WarpZone_Accumulator_Add(me.WarpZone_refsys, wz);
+}
+vector WarpZone_RefSys_TransformOrigin(entity from, entity to, vector org)
+{
+ if(from.WarpZone_refsys)
+ org = WarpZone_UnTransformOrigin(from.WarpZone_refsys, org);
+ if(to.WarpZone_refsys)
+ org = WarpZone_TransformOrigin(to.WarpZone_refsys, org);
+ return org;
+}
+vector WarpZone_RefSys_TransformVelocity(entity from, entity to, vector vel)
+{
+ if(from.WarpZone_refsys)
+ vel = WarpZone_UnTransformVelocity(from.WarpZone_refsys, vel);
+ if(to.WarpZone_refsys)
+ vel = WarpZone_TransformVelocity(to.WarpZone_refsys, vel);
+ return vel;
+}
+vector WarpZone_RefSys_TransformAngles(entity from, entity to, vector ang)
+{
+ if(from.WarpZone_refsys)
+ ang = WarpZone_UnTransformAngles(from.WarpZone_refsys, ang);
+ if(to.WarpZone_refsys)
+ ang = WarpZone_TransformAngles(to.WarpZone_refsys, ang);
+ return ang;
+}
+vector WarpZone_RefSys_TransformVAngles(entity from, entity to, vector ang)
+{
+ if(from.WarpZone_refsys)
+ ang = WarpZone_UnTransformVAngles(from.WarpZone_refsys, ang);
+ if(to.WarpZone_refsys)
+ ang = WarpZone_TransformVAngles(to.WarpZone_refsys, ang);
+ return ang;
+}
+entity WarpZone_RefSys_SpawnSameRefSys(entity me)
+{
+ entity e;
+ e = spawn();
+ if(me.WarpZone_refsys)
+ WarpZone_RefSys_Add(e, me.WarpZone_refsys);
+ return e;
+}
Modified: trunk/data/qcsrc/warpzonelib/common.qh
===================================================================
--- trunk/data/qcsrc/warpzonelib/common.qh 2010-02-28 19:44:07 UTC (rev 8708)
+++ trunk/data/qcsrc/warpzonelib/common.qh 2010-02-28 19:44:11 UTC (rev 8709)
@@ -45,3 +45,11 @@
vector WarpZone_UnTransformVelocity(entity wz, vector v);
vector WarpZone_UnTransformAngles(entity wz, vector v);
vector WarpZone_UnTransformVAngles(entity wz, vector v);
+
+// reference systems (chained warpzone transforms)
+void WarpZone_RefSys_Add(entity me, entity wz);
+vector WarpZone_RefSys_TransformOrigin(entity from, entity to, vector org);
+vector WarpZone_RefSys_TransformVelocity(entity from, entity to, vector vel);
+vector WarpZone_RefSys_TransformAngles(entity from, entity to, vector ang);
+vector WarpZone_RefSys_TransformVAngles(entity from, entity to, vector ang);
+entity WarpZone_RefSys_SpawnSameRefSys(entity me);
Modified: trunk/data/qcsrc/warpzonelib/server.qc
===================================================================
--- trunk/data/qcsrc/warpzonelib/server.qc 2010-02-28 19:44:07 UTC (rev 8708)
+++ trunk/data/qcsrc/warpzonelib/server.qc 2010-02-28 19:44:11 UTC (rev 8709)
@@ -86,7 +86,8 @@
//print(sprintf("warpzone: %f %f %f -> %f %f %f\n", o0_x, o0_y, o0_z, o1_x, o1_y, o1_z));
//o1 = trace_endpos;
- WarpZone_TeleportPlayer(self, other, o1 - player.view_ofs, a1, v1);
+ WarpZone_RefSys_Add(player, self);
+ WarpZone_TeleportPlayer(self, player, o1 - player.view_ofs, a1, v1);
WarpZone_StoreProjectileData(player);
player.warpzone_teleport_time = time;
@@ -237,6 +238,7 @@
v0 = self.velocity;
a0 = self.angles;
+ // FIXME this code assumes the trace goes through just one warpzone.
// this approach transports the projectile at its full speed, but does
// not properly retain the projectile trail (but we can't retain it
// easily anyway without delaying the projectile by two frames, so who
@@ -263,6 +265,7 @@
return FALSE;
}
}
+ WarpZone_RefSys_Add(self, wz);
WarpZone_StoreProjectileData(self);
self.warpzone_teleport_time = time;
More information about the nexuiz-commits
mailing list