]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote-tracking branch 'origin/master' into samual/mutator_ctf
authorSamual Lenks <samual@xonotic.org>
Thu, 6 Sep 2012 18:39:04 +0000 (14:39 -0400)
committerSamual Lenks <samual@xonotic.org>
Thu, 6 Sep 2012 18:39:04 +0000 (14:39 -0400)
Conflicts:
qcsrc/warpzonelib/common.qh

qcsrc/server/mutators/gamemode_ctf.qc
qcsrc/warpzonelib/common.qc
qcsrc/warpzonelib/common.qh

index 86795ffeb932fd51538aed1eae453519cd5ae49b..866c1c80c8b1105c2903c2ca21e1566ee0d87a92 100644 (file)
@@ -265,7 +265,7 @@ void ctf_Handle_Throw(entity player, entity reciever, float droptype)
        {
                case DROP_PASS:
                {
-                       WarpZone_RefSys_MakeSameRefSys(flag, player);
+                       WarpZone_RefSys_Copy(flag, reciever);
                        targ_origin = WarpZone_RefSys_TransformOrigin(reciever, flag, (0.5 * (reciever.absmin + reciever.absmax)));
                        flag.velocity = (normalize(targ_origin - player.origin) * autocvar_g_ctf_pass_velocity);
                        break;
index 8907a1d32c5a8aa724b71ffbed01f4e521eb3bd4..f87d540e5549d47446d2d525a4d8ce87df2bdec0 100644 (file)
@@ -16,11 +16,19 @@ void WarpZone_Accumulator_AddTransform(entity acc, vector t, vector s)
 }
 void WarpZone_Accumulator_Add(entity acc, entity wz)
 {
-       vector t, st;
-       t = AnglesTransform_Multiply(wz.warpzone_transform, acc.warpzone_transform);
-       st = AnglesTransform_Multiply_GetPostShift(wz.warpzone_transform, wz.warpzone_shift, acc.warpzone_transform, acc.warpzone_shift);
-       acc.warpzone_transform = t;
-       acc.warpzone_shift = st;
+       WarpZone_Accumulator_AddTransform(acc, wz.warpzone_transform, wz.warpzone_shift);
+}
+void WarpZone_Accumulator_AddInverseTransform(entity acc, vector t, vector s)
+{
+       vector tt, ss;
+       tt = AnglesTransform_Invert(t);
+       ss = AnglesTransform_PrePostShift_GetPostShift(s, tt, '0 0 0');
+       WarpZone_Accumulator_AddTransform(acc, tt, ss);
+       // yes, this probably can be done simpler... but this way is "obvious" :)
+}
+void WarpZone_Accumulator_AddInverse(entity acc, entity wz)
+{
+       WarpZone_Accumulator_AddInverseTransform(acc, wz.warpzone_transform, wz.warpzone_shift);
 }
 
 .vector(vector, vector) camera_transform;
@@ -643,7 +651,7 @@ void WarpZone_RefSys_GC()
        if(self.owner.WarpZone_refsys != self)
                remove(self);
 }
-void WarpZone_RefSys_Add(entity me, entity wz)
+void WarpZone_RefSys_CheckCreate(entity me)
 {
        if(me.WarpZone_refsys.owner != me)
        {
@@ -654,8 +662,38 @@ void WarpZone_RefSys_Add(entity me, entity wz)
                me.WarpZone_refsys.nextthink = time + 1;
                WarpZone_Accumulator_Clear(me.WarpZone_refsys);
        }
-       if(wz)
-               WarpZone_Accumulator_Add(me.WarpZone_refsys, wz);
+}
+void WarpZone_RefSys_Clear(entity me)
+{
+       if(me.WarpZone_refsys)
+       {
+               remove(me.WarpZone_refsys);
+               me.WarpZone_refsys = world;
+       }
+}
+void WarpZone_RefSys_AddTransform(entity me, vector t, vector s)
+{
+       if(t != '0 0 0' || s != '0 0 0')
+       {
+               WarpZone_RefSys_CheckCreate(me);
+               WarpZone_Accumulator_AddTransform(me.WarpZone_refsys, t, s);
+       }
+}
+void WarpZone_RefSys_Add(entity me, entity wz)
+{
+       WarpZone_RefSys_AddTransform(me, wz.warpzone_transform, wz.warpzone_shift);
+}
+void WarpZone_RefSys_AddInverseTransform(entity me, vector t, vector s)
+{
+       if(t != '0 0 0' || s != '0 0 0')
+       {
+               WarpZone_RefSys_CheckCreate(me);
+               WarpZone_Accumulator_AddInverseTransform(me.WarpZone_refsys, t, s);
+       }
+}
+void WarpZone_RefSys_AddInverse(entity me, entity wz)
+{
+       WarpZone_RefSys_AddInverseTransform(me, wz.warpzone_transform, wz.warpzone_shift);
 }
 .vector WarpZone_refsys_incremental_shift;
 .vector WarpZone_refsys_incremental_transform;
@@ -665,18 +703,7 @@ void WarpZone_RefSys_AddIncrementally(entity me, entity ref)
        if(me.WarpZone_refsys_incremental_transform == ref.WarpZone_refsys.warpzone_transform)
        if(me.WarpZone_refsys_incremental_shift == ref.WarpZone_refsys.warpzone_shift)
                return;
-       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);
-       }
-       t = AnglesTransform_Invert(me.WarpZone_refsys_incremental_transform);
-       s = AnglesTransform_PrePostShift_GetPostShift(me.WarpZone_refsys_incremental_shift, t, '0 0 0');
-       WarpZone_Accumulator_AddTransform(me.WarpZone_refsys, t, s);
+       WarpZone_Accumulator_AddInverseTransform(me.WarpZone_refsys, me.WarpZone_refsys_incremental_transform, me.WarpZone_refsys_incremental_shift);
        WarpZone_Accumulator_Add(me.WarpZone_refsys, ref.WarpZone_refsys);
        me.WarpZone_refsys_incremental_shift = ref.WarpZone_refsys.warpzone_shift;
        me.WarpZone_refsys_incremental_transform = ref.WarpZone_refsys.warpzone_transform;
@@ -718,33 +745,21 @@ vector WarpZone_RefSys_TransformVAngles(entity from, entity to, vector ang)
                ang = WarpZone_TransformVAngles(to.WarpZone_refsys, ang);
        return ang;
 }
-entity WarpZone_RefSys_SpawnSameRefSys(entity me)
+void WarpZone_RefSys_Copy(entity me, entity from)
 {
-       entity e;
-       e = spawn();
-       if(me.WarpZone_refsys)
+       if(from.WarpZone_refsys)
        {
-               e.WarpZone_refsys = spawn();
-               e.WarpZone_refsys.classname = "warpzone_refsys";
-               e.WarpZone_refsys.owner = e;
-               e.WarpZone_refsys.think = WarpZone_RefSys_GC;
-               e.WarpZone_refsys.nextthink = time + 1;
-               e.WarpZone_refsys.warpzone_shift = me.WarpZone_refsys.warpzone_shift;
-               e.WarpZone_refsys.warpzone_transform = me.WarpZone_refsys.warpzone_transform;
+               WarpZone_RefSys_CheckCreate(me);
+               me.WarpZone_refsys.warpzone_shift = from.WarpZone_refsys.warpzone_shift;
+               me.WarpZone_refsys.warpzone_transform = from.WarpZone_refsys.warpzone_transform;
        }
-       return e;
+       else
+               WarpZone_RefSys_Clear(me);
 }
-void WarpZone_RefSys_MakeSameRefSys(entity to, entity from)
+entity WarpZone_RefSys_SpawnSameRefSys(entity me)
 {
-       if(from.WarpZone_refsys)
-       {
-               to.WarpZone_refsys = spawn();
-               to.WarpZone_refsys.classname = "warpzone_refsys";
-               to.WarpZone_refsys.owner = to;
-               to.WarpZone_refsys.think = WarpZone_RefSys_GC;
-               to.WarpZone_refsys.nextthink = time + 1;
-               to.WarpZone_refsys.warpzone_shift = from.WarpZone_refsys.warpzone_shift;
-               to.WarpZone_refsys.warpzone_transform = from.WarpZone_refsys.warpzone_transform;
-       }
-       return;
+       entity e;
+       e = spawn();
+       WarpZone_RefSys_Copy(e, me);
+       return e;
 }
index 6082b891b7a0edfc9bcd8ddc65f36c8f63317a8b..e7cf23908eda0198025a0c5ebaf437b1eb890757 100644 (file)
@@ -62,15 +62,25 @@ 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);
-void WarpZone_RefSys_AddIncrementally(entity me, entity ref);
-void WarpZone_RefSys_BeginAddingIncrementally(entity me, entity ref);
-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);
-void WarpZone_RefSys_MakeSameRefSys(entity to, entity from);
+void WarpZone_RefSys_Clear(entity me); // R := id
+void WarpZone_RefSys_Add(entity me, entity wz); // me.R := wz me.R
+void WarpZone_RefSys_AddInverse(entity me, entity wz); // me.R := wz^-1 me.R
+void WarpZone_RefSys_AddTransform(entity me, vector t, vector s); // me.R := [t s] me.R
+void WarpZone_RefSys_AddInverseTransform(entity me, vector t, vector s); // me.R := [t s]^-1 me.R
+
+// makes this reference system track ref's changes
+// NOTE: this is ONLY sensible if WarpZone_RefSys_Add is no longer called on "me" while doing this
+// To achieve this, make sure no touch events on warpzone are raised by this entity
+// or set a movetype that causes no warpzoning (e.g. MOVETYPE_NONE, MOVETYPE_FOLLOW)
+void WarpZone_RefSys_AddIncrementally(entity me, entity ref); // me.R := ref.R me.Rref^-1 me.R; me.Rref := ref.R
+void WarpZone_RefSys_BeginAddingIncrementally(entity me, entity ref); // me.Rref := ref.R
+
+vector WarpZone_RefSys_TransformOrigin(entity from, entity to, vector org); // return to.R from.R^-1 org
+vector WarpZone_RefSys_TransformVelocity(entity from, entity to, vector vel); // return to.R from.R^-1 vel
+vector WarpZone_RefSys_TransformAngles(entity from, entity to, vector ang); // return to.R from.R^-1 ang
+vector WarpZone_RefSys_TransformVAngles(entity from, entity to, vector ang); // return to.R from.R^-1 ang
+void WarpZone_RefSys_Copy(entity me, entity from); // to.R := from.R
+entity WarpZone_RefSys_SpawnSameRefSys(entity me); // spawn().R = me.R
 
 #ifndef BITCLR
 # define BITCLR(a,b) ((a) - ((a) & (b)))