NSTrigger: add method CanBeTriggeredBy() which filters out various entity types.

This commit is contained in:
Marco Cawthorne 2023-09-27 12:57:25 -07:00
parent e820e74dbc
commit 854c5907a6
Signed by: eukara
GPG Key ID: CE2032F0A2882A22
3 changed files with 67 additions and 4 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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;
}