error("Camera with nonexisting target");
return;
}
+ WarpZone_Camera_SetUp(self, self.enemy.origin, self.enemy.angles);
}
void WarpZone_InitStep_UpdateTransform()
tex = getsurfacetexture(self, i_s);
if not(tex)
break; // this is beyond the last one
- if(tex != "textures/common/warpzone")
+ if(tex == "textures/common/trigger")
continue;
n_t = getsurfacenumtriangles(self, i_s);
for(i_t = 0; i_t < n_t; ++i_t)
self.enemy = world;
}
+entity warpzone_first; .entity warpzone_next;
void WarpZone_InitStep_FindTarget()
{
float i;
entity e, e2;
+ if(self.enemy)
+ return;
+
// this way only one of the two ents needs to target
if(self.target != "")
{
+ self.enemy = self; // so the if(!e.enemy) check also skips self, saves one IF
+
e2 = world;
- for(e = world; (e = find(world, targetname, self.target)); )
+ for(e = world, i = 0; (e = find(e, targetname, self.target)); )
if(!e.enemy)
- if(random() * ++i < 1)
- e2 = e;
+ if(e.classname == self.classname) // possibly non-warpzones may use the same targetname!
+ if(random() * ++i < 1)
+ e2 = e;
if(!e2)
{
+ self.enemy = world;
error("Warpzone with non-existing target");
return;
}
WarpZone_SetUp(self, self.warpzone_origin, self.warpzone_angles, self.enemy.warpzone_origin, self.enemy.warpzone_angles);
self.touch = WarpZone_Touch;
+ self.SendFlags = 0xFFFFFF;
}
float warpzone_initialized;
WarpZone_StoreProjectileData(e);
}
-void target_warpzone_reconnect_use()
+void trigger_warpzone_reconnect_use()
{
entity e;
e = self;
for(self = warpzone_first; self; self = self.warpzone_next)
if(e.target == "" || self.target == e.target || self.enemy.target == e.target)
WarpZone_InitStep_FinalizeTransform();
+ self = e;
+}
+
+void spawnfunc_trigger_warpzone_reconnect()
+{
+ self.use = trigger_warpzone_reconnect_use;
}
-void trigger_warpzone_reconnect()
+void spawnfunc_target_warpzone_reconnect()
{
- self.use = target_warpzone_reconnect_use;
+ spawnfunc_trigger_warpzone_reconnect(); // both names make sense here :(
}