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))
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
}
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)
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;
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!
}
{
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!
}
}
#pragma once
bool WarpZoneLib_MoveOutOfSolid(entity e);
-bool WarpZoneLib_ExactTrigger_Touch(entity this, entity toucher);
#ifdef SVQC
void WarpZoneLib_ExactTrigger_Init(entity this);
#endif