trigger_once/multiple/teleport: Support for Source Engine game specific trigger filters

This commit is contained in:
Marco Cawthorne 2023-09-27 13:00:46 -07:00
parent 3ea74c3c3d
commit abea931460
Signed by: eukara
GPG key ID: CE2032F0A2882A22
3 changed files with 131 additions and 11 deletions

View file

@ -56,10 +56,14 @@ public:
virtual void Touch(entity); virtual void Touch(entity);
virtual void Respawn(void); virtual void Respawn(void);
virtual void SpawnKey(string,string); virtual void SpawnKey(string,string);
virtual void Input(entity,string,string);
virtual void EndTouch(entity); virtual void EndTouch(entity);
private: private:
float m_flWait; float m_flWait;
bool m_bStartDisabled;
bool m_bIsModern;
bool m_bEnabled;
/* Input/Output */ /* Input/Output */
string m_strOnStartTouch; string m_strOnStartTouch;
@ -76,6 +80,8 @@ trigger_multiple::trigger_multiple(void)
m_strOnStartTouch = m_strOnStartTouch =
m_strOnEndTouchAll = m_strOnEndTouchAll =
m_strOnTrigger = __NULL__; m_strOnTrigger = __NULL__;
m_bIsModern = false;
m_bEnabled = true;
} }
void void
@ -116,6 +122,10 @@ trigger_multiple::SpawnKey(string strKey, string strValue)
case "wait": case "wait":
m_flWait = stof(strValue); m_flWait = stof(strValue);
break; break;
case "StartDisabled":
m_bStartDisabled = ReadBool(strValue);
m_bIsModern = true;
break;
case "OnStartTouch": case "OnStartTouch":
case "OnStartTouchAll": case "OnStartTouchAll":
m_strOnStartTouch = PrepareOutput(m_strOnStartTouch, strValue); m_strOnStartTouch = PrepareOutput(m_strOnStartTouch, strValue);
@ -148,6 +158,35 @@ void
trigger_multiple::Respawn(void) trigger_multiple::Respawn(void)
{ {
InitBrushTrigger(); InitBrushTrigger();
m_bEnabled = (m_bStartDisabled) ? false : true;
}
void
trigger_multiple::Input(entity entityActivator, string inputName, string dataField)
{
switch (inputName) {
case "Enable":
m_bEnabled = true;
break;
case "Disable":
m_bEnabled = false;
break;
case "Toggle":
m_bEnabled = (m_bEnabled) ? false : true;
break;
case "TouchTest":
Touch(entityActivator);
break;
case "StartTouch":
StartTouch(entityActivator);
break;
case "EndTouch":
EndTouch(entityActivator);
break;
default:
super::Input(entityActivator, inputName, dataField);
break;
}
} }
void void
@ -155,12 +194,21 @@ trigger_multiple::Touch(entity eToucher)
{ {
if (GetMaster() == FALSE) if (GetMaster() == FALSE)
return; return;
if (HasSpawnFlags(TM_NOCLIENTS) && eToucher.flags & FL_CLIENT)
if (m_bEnabled == false)
return; return;
if (!HasSpawnFlags(TM_MONSTERS) && eToucher.flags & FL_MONSTER)
return; /* legacy entity check */
if (!HasSpawnFlags(TM_PUSHABLES) && eToucher.classname == "func_pushable") if (m_bIsModern == false) {
if (HasSpawnFlags(TM_NOCLIENTS) && eToucher.flags & FL_CLIENT)
return;
if (!HasSpawnFlags(TM_MONSTERS) && eToucher.flags & FL_MONSTER)
return;
if (!HasSpawnFlags(TM_PUSHABLES) && eToucher.classname == "func_pushable")
return;
} else if (CanBeTriggeredBy(eToucher) == false) {
return; return;
}
/* if the target key isn't used, assume we're using the new I/O system */ /* if the target key isn't used, assume we're using the new I/O system */
if (HasTriggerTarget() == false) if (HasTriggerTarget() == false)

View file

@ -52,9 +52,14 @@ public:
virtual void Respawn(void); virtual void Respawn(void);
virtual void SpawnKey(string,string); virtual void SpawnKey(string,string);
virtual void Input(entity, string, string);
private: private:
bool m_bStartDisabled;
bool m_bEnabled;
string m_strOnStartTouch; string m_strOnStartTouch;
string m_strOnTrigger; string m_strOnTrigger;
bool m_bIsModern;
}; };
void void
@ -62,6 +67,9 @@ trigger_once::trigger_once(void)
{ {
m_strOnStartTouch = m_strOnStartTouch =
m_strOnTrigger = __NULL__; m_strOnTrigger = __NULL__;
m_bIsModern = false;
m_bStartDisabled = false;
m_bEnabled = true;
} }
void void
@ -71,7 +79,6 @@ trigger_once::Spawned(void)
if (m_strOnTrigger) if (m_strOnTrigger)
m_strOnTrigger = CreateOutput(m_strOnTrigger); m_strOnTrigger = CreateOutput(m_strOnTrigger);
if (m_strOnStartTouch) if (m_strOnStartTouch)
m_strOnStartTouch = CreateOutput(m_strOnStartTouch); m_strOnStartTouch = CreateOutput(m_strOnStartTouch);
} }
@ -81,6 +88,7 @@ trigger_once::Respawn(void)
{ {
InitBrushTrigger(); InitBrushTrigger();
m_iValue = 0; m_iValue = 0;
m_bEnabled = (m_bStartDisabled) ? false : true;
} }
void void
@ -110,6 +118,10 @@ void
trigger_once::SpawnKey(string strKey, string strValue) trigger_once::SpawnKey(string strKey, string strValue)
{ {
switch (strKey) { switch (strKey) {
case "StartDisabled":
m_bStartDisabled = ReadBool(strValue);
m_bIsModern = true;
break;
case "OnStartTouch": case "OnStartTouch":
m_strOnStartTouch = PrepareOutput(m_strOnStartTouch, strValue); m_strOnStartTouch = PrepareOutput(m_strOnStartTouch, strValue);
break; break;
@ -121,6 +133,29 @@ trigger_once::SpawnKey(string strKey, string strValue)
break; break;
} }
} }
void
trigger_once::Input(entity entityActivator, string inputName, string dataField)
{
switch (inputName) {
case "Enable":
m_bEnabled = true;
break;
case "Disable":
m_bEnabled = false;
break;
case "Toggle":
m_bEnabled = (m_bEnabled) ? false : true;
break;
case "StartTouch":
StartTouch(entityActivator);
break;
default:
super::Input(entityActivator, inputName, dataField);
break;
}
}
void void
trigger_once::Touch(entity eToucher) trigger_once::Touch(entity eToucher)
{ {
@ -129,17 +164,26 @@ trigger_once::Touch(entity eToucher)
if (GetMaster() == FALSE) if (GetMaster() == FALSE)
return; return;
if (HasSpawnFlags(TO_NOCLIENTS) && eToucher.flags & FL_CLIENT) if (m_bEnabled == false)
return; return;
if (!HasSpawnFlags(TO_MONSTERS) && eToucher.flags & FL_MONSTER)
return; /* legacy entity check */
if (!HasSpawnFlags(TO_PUSHABLES) && isPushable == true) if (m_bIsModern == false) {
if (HasSpawnFlags(TO_NOCLIENTS) && eToucher.flags & FL_CLIENT)
return;
if (!HasSpawnFlags(TO_MONSTERS) && eToucher.flags & FL_MONSTER)
return;
if (!HasSpawnFlags(TO_PUSHABLES) && isPushable == true)
return;
} else if (CanBeTriggeredBy(eToucher) == false) {
return; return;
}
SetSolid(SOLID_NOT); /* make inactive */ SetSolid(SOLID_NOT); /* make inactive */
m_iValue = 1; m_iValue = 1;
if (!target && !m_strKillTarget) { if (!target && !m_strKillTarget) {
NSLog("^2trigger_once::^3Touch^7: %S is triggering OnStartTouch", eToucher.classname);
UseOutput(eToucher, m_strOnStartTouch); UseOutput(eToucher, m_strOnStartTouch);
return; return;
} }

View file

@ -48,10 +48,14 @@ public:
virtual void Respawn(void); virtual void Respawn(void);
virtual void SpawnKey(string, string); virtual void SpawnKey(string, string);
nonvirtual bool CanPass(NSEntity);
private: private:
bool m_bEnabled;
string m_sndTeleport; string m_sndTeleport;
string m_sndTeleportEnter; string m_sndTeleportEnter;
string m_sndTeleportExit; string m_sndTeleportExit;
bool m_bIsModern;
}; };
void void
@ -60,6 +64,8 @@ trigger_teleport::trigger_teleport(void)
m_sndTeleport = __NULL__; m_sndTeleport = __NULL__;
m_sndTeleportEnter = __NULL__; m_sndTeleportEnter = __NULL__;
m_sndTeleportExit = __NULL__; m_sndTeleportExit = __NULL__;
m_bEnabled = true;
m_bIsModern = false;
} }
void void
@ -75,11 +81,33 @@ trigger_teleport::SpawnKey(string strKey, string strValue)
case "snd_teleport_exit": case "snd_teleport_exit":
m_sndTeleportExit = strValue; m_sndTeleportExit = strValue;
break; break;
case "StartDisabled":
m_bEnabled = ReadBool(strValue);
m_bIsModern = true;
break;
default: default:
super::SpawnKey(strKey, strValue); super::SpawnKey(strKey, strValue);
} }
} }
bool
trigger_teleport::CanPass(NSEntity target)
{
/* legacy entity check */
if (m_bIsModern == false) {
if (HasSpawnFlags(TRIGTELE_NOCLIENTS) && target.flags & FL_CLIENT)
return false;
if (!HasSpawnFlags(TRIGTELE_MONSTERS) && target.flags & FL_MONSTER)
return false;
} else {
if (CanBeTriggeredBy(target) == false)
return false;
}
return true;
}
void void
trigger_teleport::Spawned(void) trigger_teleport::Spawned(void)
{ {
@ -106,9 +134,9 @@ trigger_teleport::Touch(entity eToucher)
{ {
if (GetMaster() == FALSE) if (GetMaster() == FALSE)
return; return;
if (HasSpawnFlags(TRIGTELE_NOCLIENTS) && eToucher.flags & FL_CLIENT) if (m_bEnabled == false)
return; return;
if (!HasSpawnFlags(TRIGTELE_MONSTERS) && eToucher.flags & FL_MONSTER) if (CanPass((NSEntity)eToucher) == false)
return; return;
if (eToucher.movetype != MOVETYPE_NONE) { if (eToucher.movetype != MOVETYPE_NONE) {