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 Respawn(void);
virtual void SpawnKey(string,string);
virtual void Input(entity,string,string);
virtual void EndTouch(entity);
private:
float m_flWait;
bool m_bStartDisabled;
bool m_bIsModern;
bool m_bEnabled;
/* Input/Output */
string m_strOnStartTouch;
@ -76,6 +80,8 @@ trigger_multiple::trigger_multiple(void)
m_strOnStartTouch =
m_strOnEndTouchAll =
m_strOnTrigger = __NULL__;
m_bIsModern = false;
m_bEnabled = true;
}
void
@ -116,6 +122,10 @@ trigger_multiple::SpawnKey(string strKey, string strValue)
case "wait":
m_flWait = stof(strValue);
break;
case "StartDisabled":
m_bStartDisabled = ReadBool(strValue);
m_bIsModern = true;
break;
case "OnStartTouch":
case "OnStartTouchAll":
m_strOnStartTouch = PrepareOutput(m_strOnStartTouch, strValue);
@ -148,6 +158,35 @@ void
trigger_multiple::Respawn(void)
{
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
@ -155,12 +194,21 @@ trigger_multiple::Touch(entity eToucher)
{
if (GetMaster() == FALSE)
return;
if (HasSpawnFlags(TM_NOCLIENTS) && eToucher.flags & FL_CLIENT)
if (m_bEnabled == false)
return;
if (!HasSpawnFlags(TM_MONSTERS) && eToucher.flags & FL_MONSTER)
return;
if (!HasSpawnFlags(TM_PUSHABLES) && eToucher.classname == "func_pushable")
/* legacy entity check */
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;
}
/* if the target key isn't used, assume we're using the new I/O system */
if (HasTriggerTarget() == false)

View file

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

View file

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