]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Include boxesoverlap() in WarpZoneLib_ExactTrigger_Touch() for convenient efficiency...
authorbones_was_here <bones_was_here@xonotic.au>
Fri, 3 Feb 2023 04:40:07 +0000 (14:40 +1000)
committerbones_was_here <bones_was_here@xonotic.au>
Sun, 21 May 2023 14:34:12 +0000 (00:34 +1000)
qcsrc/lib/warpzone/common.qc
qcsrc/lib/warpzone/common.qh
qcsrc/lib/warpzone/server.qc
qcsrc/lib/warpzone/util_server.qh

index 4e82e2a7dd96b013461a0329a02773fb4c3059cf..d9a12517d1512efa663e3d5234eae467156edaf8 100644 (file)
@@ -808,7 +808,7 @@ entity WarpZone_RefSys_SpawnSameRefSys(entity me)
        return e;
 }
 
-bool WarpZoneLib_ExactTrigger_Touch(entity this, entity toucher)
+bool WarpZoneLib_ExactTrigger_Touch(entity this, entity toucher, bool touchfunc)
 {
        vector emin = toucher.absmin, emax = toucher.absmax;
        if(STAT(Q3COMPAT))
@@ -818,7 +818,12 @@ bool WarpZoneLib_ExactTrigger_Touch(entity this, entity toucher)
                emin += '1 1 1';
                emax -= '1 1 1';
        }
-       return WarpZoneLib_BoxTouchesBrush(emin, emax, this, toucher);
+
+       // if called from a touch func, we can assume the boxes do overlap
+       if (!touchfunc && !boxesoverlap(emin, emax, this.absmin, this.absmax)) // quick
+               return false;
+
+       return WarpZoneLib_BoxTouchesBrush(emin, emax, this, toucher); // accurate
 }
 
 
index 020391528961ce838a3f27fed7679e83bd2806f1..ea7619af4d884069811fa2f5019b6be8413fdea7 100644 (file)
@@ -109,9 +109,9 @@ entity WarpZone_RefSys_SpawnSameRefSys(entity me); // spawn().R = me.R
 bool WarpZoneLib_MoveOutOfSolid(entity e);
 #define move_out_of_solid(e) WarpZoneLib_MoveOutOfSolid(e)
 
-bool WarpZoneLib_ExactTrigger_Touch(entity this, entity toucher);
+bool WarpZoneLib_ExactTrigger_Touch(entity this, entity toucher, bool touchfunc);
 void WarpZoneLib_ExactTrigger_Init(entity this);
 
 // WARNING: this kills the trace globals
-#define EXACTTRIGGER_TOUCH(e,t) if(!WarpZoneLib_ExactTrigger_Touch((e), (t))) return
+#define EXACTTRIGGER_TOUCH(e,t) if(!WarpZoneLib_ExactTrigger_Touch((e), (t), true)) return // intended for use in touch funcs
 #define EXACTTRIGGER_INIT  WarpZoneLib_ExactTrigger_Init(this)
index b9157d2526c500c4250b9dfb575e604021da0934..f58a9801b36ee7bd788d4ffe4641a27f27caf0c4 100644 (file)
@@ -193,8 +193,7 @@ void WarpZone_Touch(entity this, entity toucher)
        if(toucher.move_movetype == MOVETYPE_NONE || toucher.move_movetype == MOVETYPE_FOLLOW || toucher.tag_entity)
                return;
 
-       if(!WarpZoneLib_ExactTrigger_Touch(this, toucher))
-               return;
+       EXACTTRIGGER_TOUCH(this, toucher);
 
        if(WarpZone_PlaneDist(this, toucher.origin + toucher.view_ofs) >= 0) // wrong side of the trigger_warpzone (don't teleport yet)
                return;
@@ -815,7 +814,7 @@ void WarpZone_StartFrame()
                        if (warpzone_warpzones_exist) {
                                entity e = WarpZone_Find(it.origin + it.mins, it.origin + it.maxs);
                                if (e)
-                               if (WarpZoneLib_ExactTrigger_Touch(e, it))
+                               if (WarpZoneLib_ExactTrigger_Touch(e, it, false))
                                if (WarpZone_PlaneDist(e, it.origin + it.view_ofs) <= 0)
                                        WarpZone_Teleport(e, it, -1, 0); // NOT triggering targets by this!
                        }
@@ -825,7 +824,7 @@ void WarpZone_StartFrame()
                        {
                                entity ent = Teleport_Find(it.origin + it.mins, it.origin + it.maxs);
                                if (ent)
-                               if (WarpZoneLib_ExactTrigger_Touch(ent, it))
+                               if (WarpZoneLib_ExactTrigger_Touch(ent, it, false))
                                        Simple_TeleportPlayer(ent, it); // NOT triggering targets by this!
                        }
                }
index 515f8db2e727b47bf172e5eb91e4ca9d52deaf67..c4799c662c52d4a32e56fb860c28d107b6172a88 100644 (file)
@@ -1,7 +1,6 @@
 #pragma once
 
 bool WarpZoneLib_MoveOutOfSolid(entity e);
-bool WarpZoneLib_ExactTrigger_Touch(entity this, entity toucher);
 #ifdef SVQC
 void WarpZoneLib_ExactTrigger_Init(entity this);
 #endif