X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=qcsrc%2Fwarpzonelib%2Fserver.qc;h=e0dfc6675342eb9282283f6f6599398896370e4a;hb=a2c8a61e10b6a1daac13b4a369875f4c2195e32e;hp=6e0ecb5b33811de1c266da4a90c617a84d16b2c3;hpb=669ea85f389d64cf59d47c24f9b447843a4e9d57;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/warpzonelib/server.qc b/qcsrc/warpzonelib/server.qc index 6e0ecb5b3..e0dfc6675 100644 --- a/qcsrc/warpzonelib/server.qc +++ b/qcsrc/warpzonelib/server.qc @@ -243,7 +243,13 @@ float WarpZone_CheckProjectileImpact() entity wz; wz = WarpZone_Find(self.origin + self.mins, self.origin + self.maxs); if(!wz) - return FALSE; + return 0; + if(self.warpzone_teleport_time == time) + { + // just ignore if we got teleported this frame already and now hit a wall and are in a warpzone again (this will cause a detonation) + // print("2 warps 1 frame\n"); + return -1; + } o0 = self.origin; v0 = self.velocity; a0 = self.angles; @@ -262,38 +268,40 @@ float WarpZone_CheckProjectileImpact() pd = WarpZone_TargetPlaneDist(wz, self.origin); if(pd < mpd) { - dpd = normalize(self.velocity) * self.warpzone_targetforward; + dpd = normalize(self.velocity) * wz.warpzone_targetforward; setorigin(self, self.origin + normalize(self.velocity) * ((mpd - pd) / dpd)); if(!WarpZoneLib_MoveOutOfSolid(self)) { setorigin(self, o0); self.angles = a0; self.velocity = v0; - return FALSE; + return 0; } } WarpZone_RefSys_Add(self, wz); WarpZone_StoreProjectileData(self); self.warpzone_teleport_time = time; - return TRUE; + return +1; } float WarpZone_Projectile_Touch() { + float f; if(other.classname == "trigger_warpzone") return TRUE; if(WarpZone_Projectile_Touch_ImpactFilter_Callback()) return TRUE; - if(WarpZone_CheckProjectileImpact()) - return TRUE; - if(self.warpzone_teleport_time == time) // already got teleported this frame? no collision then please + if((f = WarpZone_CheckProjectileImpact()) != 0) + return (f > 0); + if(self.warpzone_teleport_time == time) { + // sequence: hit warpzone, get teleported, hit wall + // print("2 hits 1 frame\n"); setorigin(self, self.warpzone_oldorigin); self.velocity = self.warpzone_oldvelocity; self.angles = self.warpzone_oldangles; return TRUE; } - return FALSE; } @@ -351,7 +359,7 @@ void WarpZoneCamera_InitStep_FindTarget() error("Camera with nonexisting target"); return; } - ++warpzone_cameras_exist; + warpzone_cameras_exist = 1; WarpZone_Camera_SetUp(self, self.enemy.origin, self.enemy.angles); self.SendFlags = 0xFFFFFF; } @@ -486,7 +494,7 @@ void WarpZone_InitStep_FinalizeTransform() return; } - ++warpzone_warpzones_exist; + warpzone_warpzones_exist = 1; WarpZone_SetUp(self, self.warpzone_origin, self.warpzone_angles, self.enemy.warpzone_origin, self.enemy.warpzone_angles); self.touch = WarpZone_Touch; self.SendFlags = 0xFFFFFF; @@ -596,8 +604,41 @@ void WarpZone_StartFrame() self = e; WarpZones_Reconnect(); } - for(e = world; (e = nextent(e)); ) - WarpZone_StoreProjectileData(e); + + if(warpzone_warpzones_exist) + { + entity oldself, oldother; + oldself = self; + oldother = other; + for(e = world; (e = nextent(e)); ) + { + WarpZone_StoreProjectileData(e); + float f; + f = clienttype(e); + if(f == CLIENTTYPE_REAL) + { + if(e.solid != SOLID_NOT) // not spectating? + continue; + if(e.movetype != MOVETYPE_NOCLIP && e.movetype != MOVETYPE_FLY) // not spectating? (this is to catch observers) + continue; + self = WarpZone_Find(e.origin + e.mins, e.origin + e.maxs); + if(!self) + continue; + other = e; + if(WarpZoneLib_ExactTrigger_Touch()) + continue; + WarpZone_Teleport(e); // NOT triggering targets by this! + } + if(f == CLIENTTYPE_NOTACLIENT) + { + for(; (e = nextent(e)); ) + WarpZone_StoreProjectileData(e); + break; + } + } + self = oldself; + other = oldother; + } } .float warpzone_reconnecting;