diff --git a/src/gs-entbase/server/trigger_multiple.qc b/src/gs-entbase/server/trigger_multiple.qc index e276326c..6ffc2a32 100644 --- a/src/gs-entbase/server/trigger_multiple.qc +++ b/src/gs-entbase/server/trigger_multiple.qc @@ -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) diff --git a/src/gs-entbase/server/trigger_once.qc b/src/gs-entbase/server/trigger_once.qc index 93fc18ba..80377f2a 100644 --- a/src/gs-entbase/server/trigger_once.qc +++ b/src/gs-entbase/server/trigger_once.qc @@ -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; } diff --git a/src/gs-entbase/server/trigger_teleport.qc b/src/gs-entbase/server/trigger_teleport.qc index e0f889ae..90e38eb6 100644 --- a/src/gs-entbase/server/trigger_teleport.qc +++ b/src/gs-entbase/server/trigger_teleport.qc @@ -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) {