From 854c5907a6f44ca46ed947c46f656f19ae17c315 Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Wed, 27 Sep 2023 12:57:25 -0700 Subject: [PATCH] NSTrigger: add method CanBeTriggeredBy() which filters out various entity types. --- src/shared/NSTrigger.h | 18 +++++++++++++++++ src/shared/NSTrigger.qc | 44 +++++++++++++++++++++++++++++++++++++++++ src/shared/sound.qc | 9 +++++---- 3 files changed, 67 insertions(+), 4 deletions(-) diff --git a/src/shared/NSTrigger.h b/src/shared/NSTrigger.h index 755d6a2b..f439980f 100644 --- a/src/shared/NSTrigger.h +++ b/src/shared/NSTrigger.h @@ -46,6 +46,21 @@ typedef enum TRIG_TOGGLE } triggermode_t; +enumflags +{ + TOUCHFILTER_CLIENTS, + TOUCHFILTER_NPCS, + TOUCHFILTER_PUSHABLE, + TOUCHFILTER_PHYSICS, + TOUCHFILTER_FRIENDLIES, + TOUCHFILTER_CLIENTSINVEHICLES, + TOUCHFILTER_EVERYTHING, + TOUCHFILTER_CLIENTSNOTINVEHICLES, + TOUCHFILTER_DEBRIS, + TOUCHFILTER_NPCSINVEHICLES, + TOUCHFILTER_NOBOTS +}; + /** NSTrigger handles all the non-input as well as Legacy (Quake, GoldSource) style trigger behaviour. It also deals with masters, touches, blocking and so on. @@ -77,6 +92,9 @@ public: virtual void Restore(string,string); virtual void Input(entity,string,string); + /* Called to check if the target entity can touch trigger itself. */ + virtual bool CanBeTriggeredBy(entity); + /** Called whenever we're legacy triggered by another object or function. */ virtual void Trigger(entity, triggermode_t); diff --git a/src/shared/NSTrigger.qc b/src/shared/NSTrigger.qc index ffb8eb1a..c7311baf 100644 --- a/src/shared/NSTrigger.qc +++ b/src/shared/NSTrigger.qc @@ -34,10 +34,48 @@ NSTrigger::NSTrigger(void) } #ifdef SERVER + +bool +NSTrigger::CanBeTriggeredBy(entity testEnt) +{ + /* easy way out */ + if (spawnflags & TOUCHFILTER_EVERYTHING) + return true; + + /* filters */ + if (!(spawnflags & TOUCHFILTER_CLIENTS) && (testEnt.flags & FL_CLIENT)) + return false; + if (!(spawnflags & TOUCHFILTER_NPCS) && (testEnt.flags & FL_MONSTER)) + return false; + if (!(spawnflags & TOUCHFILTER_PUSHABLE) && (testEnt.classname == "func_pushable")) + return false; + if (!(spawnflags & TOUCHFILTER_PHYSICS) && (testEnt.isPhysics == true)) + return false; + if (!(spawnflags & TOUCHFILTER_FRIENDLIES) && (testEnt.flags & FL_MONSTER) && (testEnt.m_iAlliance == 0)) + return false; + if (!(spawnflags & TOUCHFILTER_CLIENTSINVEHICLES) && (testEnt.flags & FL_CLIENT) && (testEnt.flags & FL_INVEHICLE)) + return false; + +/* + + if (!spawnflags & TOUCHFILTER_CLIENTSNOTINVEHICLES) { + return false; + if (!spawnflags &TRIGTELE_DEBRIS) && ) + return false; + if (!spawnflags &TRIGTELE_NPCSINVEHICLES) && ) + return false; + if (!spawnflags &TRIGTELE_NOBOTS) && ) + return false; +*/ + + return true; +} + /* legacy trigger architecture */ void NSTrigger::Trigger(entity act, triggermode_t state) { + breakpoint(); NSLog("^2%s::^3Trigger^7: Triggered by %s with no consequence", classname, act.classname); } @@ -50,6 +88,9 @@ NSTrigger::UseTargets(entity act, int state, float fDelay) remove(self); } + if not (target) + return; + if not (m_strKillTarget) if not (target) return; @@ -158,6 +199,8 @@ NSTrigger::HasTriggerTarget(void) { if not (target) return false; + if (target == "") + return false; return true; } @@ -323,6 +366,7 @@ NSTrigger::_TouchHandler(void) } #endif + /* start touch in case we haven't */ if (m_beingTouched != true) StartTouch(other); diff --git a/src/shared/sound.qc b/src/shared/sound.qc index 5808423e..a667c353 100644 --- a/src/shared/sound.qc +++ b/src/shared/sound.qc @@ -308,12 +308,12 @@ Sound_PrecacheFile(string fileName) { filestream scriptFile; string lineStream; - int braceDepth; + int braceDepth = 0i; string sndDefName = ""; int startIndex = g_sounds_count; if (g_sounds_count >= SOUNDSHADER_MAX) - return; + return false; scriptFile = fopen(fileName, FILE_READ); @@ -361,7 +361,7 @@ Sound_PrecacheFile(string fileName) g_sounds_count++; if (g_sounds_count >= SOUNDSHADER_MAX) - return; + return false; } break; default: @@ -795,6 +795,7 @@ Sound_GetID(string defName) { if (defName == "") return -1; + return (int)hash_get(g_hashsounds, defName, -1); } @@ -923,7 +924,7 @@ SoundSource_Init(void) /* file doesn't exist. that's okay. */ if (manifestFile < 0) { - error(sprintf("loading %S failed.\n", manifestStart)); + //error(sprintf("loading %S failed.\n", manifestStart)); return; }