trigger_once/multiple/teleport: Support for Source Engine game specific trigger filters
This commit is contained in:
parent
3ea74c3c3d
commit
abea931460
3 changed files with 131 additions and 11 deletions
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue