From d324259e722439dc2f08209afaa701c760493198 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Fri, 7 Aug 2020 14:07:38 +0200 Subject: [PATCH] CBaseTrigger: Massive change that allows us to finally set states. This affected every entity that can be triggered. Things like the airlock check in c1a0d work now. --- doc/faq | 0 gearbox.fmf | 5 +- hunger.fmf | 7 +- rewolf_demo.fmf | 7 +- scihunt.fmf | 5 +- src/gs-entbase/server/ambient_generic.cpp | 8 +- src/gs-entbase/server/basemonster.cpp | 4 +- src/gs-entbase/server/basenpc.cpp | 2 +- src/gs-entbase/server/basetrigger.cpp | 96 ++++++++++++------- src/gs-entbase/server/button_target.cpp | 15 ++- src/gs-entbase/server/env_beverage.cpp | 8 +- src/gs-entbase/server/env_explosion.cpp | 4 +- src/gs-entbase/server/env_fade.cpp | 4 +- src/gs-entbase/server/env_global.cpp | 24 +++-- src/gs-entbase/server/env_laser.cpp | 17 +++- src/gs-entbase/server/env_message.cpp | 4 +- src/gs-entbase/server/env_render.cpp | 4 +- src/gs-entbase/server/env_shake.cpp | 6 +- src/gs-entbase/server/env_shooter.cpp | 31 ++++-- src/gs-entbase/server/env_spark.cpp | 5 +- src/gs-entbase/server/env_sprite.cpp | 5 +- src/gs-entbase/server/func_breakable.cpp | 36 ++++--- src/gs-entbase/server/func_button.cpp | 19 ++-- src/gs-entbase/server/func_conveyor.cpp | 18 ++-- src/gs-entbase/server/func_door.cpp | 21 ++-- src/gs-entbase/server/func_door_rotating.cpp | 13 +-- src/gs-entbase/server/func_guntarget.cpp | 27 +++--- src/gs-entbase/server/func_pendulum.cpp | 27 ++++-- src/gs-entbase/server/func_rotating.cpp | 21 ++-- src/gs-entbase/server/func_tracktrain.cpp | 4 +- src/gs-entbase/server/func_train.cpp | 7 +- src/gs-entbase/server/func_wall.cpp | 25 +++-- src/gs-entbase/server/func_wall_toggle.cpp | 24 +++-- src/gs-entbase/server/game_text.cpp | 4 +- src/gs-entbase/server/infodecal.cpp | 7 +- src/gs-entbase/server/light.cpp | 23 +++-- src/gs-entbase/server/monstermaker.cpp | 19 +++- src/gs-entbase/server/multi_manager.cpp | 6 +- src/gs-entbase/server/multisource.cpp | 53 ++++++---- src/gs-entbase/server/path_corner.cpp | 6 +- src/gs-entbase/server/player_loadsaved.cpp | 4 +- src/gs-entbase/server/player_weaponstrip.cpp | 4 +- src/gs-entbase/server/scripted_sentence.cpp | 4 +- src/gs-entbase/server/scripted_sequence.cpp | 4 +- src/gs-entbase/server/trigger_auto.cpp | 2 +- src/gs-entbase/server/trigger_autosave.cpp | 6 +- src/gs-entbase/server/trigger_camera.cpp | 8 +- src/gs-entbase/server/trigger_cdaudio.cpp | 12 ++- src/gs-entbase/server/trigger_changelevel.cpp | 6 +- src/gs-entbase/server/trigger_hurt.cpp | 42 ++++---- src/gs-entbase/server/trigger_look.cpp | 7 +- src/gs-entbase/server/trigger_multiple.cpp | 7 +- src/gs-entbase/server/trigger_once.cpp | 11 ++- src/gs-entbase/server/trigger_push.cpp | 15 ++- src/gs-entbase/server/trigger_relay.cpp | 72 +++++++++++++- src/server/cstrike/item_c4bomb.cpp | 2 +- src/server/cstrike/item_suit.cpp | 2 +- src/server/valve/item_longjump.cpp | 2 +- src/server/valve/item_suit.cpp | 4 +- src/server/valve/items.cpp | 2 +- src/server/valve/monster_houndeye.cpp | 1 + 61 files changed, 540 insertions(+), 298 deletions(-) mode change 100755 => 100644 doc/faq mode change 100755 => 100644 gearbox.fmf mode change 100755 => 100644 rewolf_demo.fmf diff --git a/doc/faq b/doc/faq old mode 100755 new mode 100644 diff --git a/gearbox.fmf b/gearbox.fmf old mode 100755 new mode 100644 index bb908eb6..9caf6f96 --- a/gearbox.fmf +++ b/gearbox.fmf @@ -23,10 +23,7 @@ BASEGAME gearbox -set gameinfo_cldll 1 -set gameinfo_hlversion "1110" -set gameinfo_svonly "0" - -DOWNLOADSURL http://www.frag-net.com/dl/gearbox_packages -UPDATEURL http://www.frag-net.com/mods/valve.fmf -INSTALL "gearbox_essential;valve_essential;free_essential;addons_essential" +-set gameinfo_pkgname "cg_gearbox" // you don't really want to change these RTCBROKER master.frag-net.com:27950 diff --git a/hunger.fmf b/hunger.fmf index b221451c..ccc6052c 100644 --- a/hunger.fmf +++ b/hunger.fmf @@ -23,12 +23,7 @@ BASEGAME hunger -set gameinfo_url_info "www.planethalflife.com/manke" -set gameinfo_url_dl "http://www.frag-net.com/mods/hunger.fmf" -set gameinfo_menutrack "sound/song/you_are.wav" - -// download/update packaging information -// PACKAGE hunger/pak0.pak 0xc1cbd5c1 "http://www.frag-net.com/files/hunger_pak0.pak" - -// do we want this? I don't want to automatically update it -// UPDATEURL http://www.frag-net.com/mods/hunger.fmf +-set gameinfo_pkgname "cg_hunger" // you don't really want to change these RTCBROKER master.frag-net.com:27950 diff --git a/rewolf_demo.fmf b/rewolf_demo.fmf old mode 100755 new mode 100644 index 2e02dc00..82a9075f --- a/rewolf_demo.fmf +++ b/rewolf_demo.fmf @@ -22,12 +22,7 @@ BASEGAME rewolf_demo -set gameinfo_cldll 1 -set gameinfo_hlversion "1110" -set gameinfo_svonly "0" - -// download/update packaging information -UPDATEURL http://www.frag-net.com/mods/rewolf_demo.fmf -PACKAGE rewolf_demo/pak0.pk3 0x105f03e9 "http://www.frag-net.com/dl/105f03e9/file.pk3" -PACKAGE logos/pakrm_logos.pk3 0xd318299 "http://www.frag-net.com/dl/d318299/file.pk3" -PACKAGE platform/pak0.pk3 0xd707e87f "http://www.frag-net.com/dl/707e87f/file.pk3" +-set gameinfo_pkgname "cg_rewolf" // you don't really want to change these RTCBROKER master.frag-net.com:27950 diff --git a/scihunt.fmf b/scihunt.fmf index 3e7893b5..55292bf3 100644 --- a/scihunt.fmf +++ b/scihunt.fmf @@ -24,10 +24,7 @@ BASEGAME scihunt -set gameinfo_url_info "www.richwhitehouse.com" -set gameinfo_url_dl "http://www.frag-net.com/mods/scihunt.fmf" -set gameinfo_menutrack "sound/Hondo2/pca.wav" - -DOWNLOADSURL http://www.frag-net.com/dl/scihunt_packages -UPDATEURL http://www.frag-net.com/mods/scihunt.fmf -INSTALL "scihunt_essential;valve_essential;free_essential;addons_essential" +-set gameinfo_pkgname "cg_scihunt" // you don't really want to change these RTCBROKER master.frag-net.com:27950 diff --git a/src/gs-entbase/server/ambient_generic.cpp b/src/gs-entbase/server/ambient_generic.cpp index 614ec990..2fc6b651 100644 --- a/src/gs-entbase/server/ambient_generic.cpp +++ b/src/gs-entbase/server/ambient_generic.cpp @@ -57,8 +57,8 @@ class ambient_generic:CBaseTrigger void(void) ambient_generic; virtual void(void) Respawn; - virtual void(void) UseNormal; - virtual void(void) UseLoop; + virtual void(int) UseNormal; + virtual void(int) UseLoop; virtual float(entity, float) SendEntity; }; @@ -91,7 +91,7 @@ ambient_generic::SendEntity(entity ePEnt, float fChanged) } void -ambient_generic::UseNormal(void) +ambient_generic::UseNormal(int state) { sound(this, CHAN_VOICE, m_strActivePath, m_flVolume, m_flRadius, m_flPitch); dprint(sprintf("^2ambient_generic::^3UseNormal^7: %s plays `%s`\n", @@ -99,7 +99,7 @@ ambient_generic::UseNormal(void) } void -ambient_generic::UseLoop(void) +ambient_generic::UseLoop(int state) { if (m_iToggleSwitch == TRUE) { dprint(sprintf("^2ambient_generic::^3UseLoop^7: %s stops `%s`\n", diff --git a/src/gs-entbase/server/basemonster.cpp b/src/gs-entbase/server/basemonster.cpp index 37db4bce..e59fcf6a 100644 --- a/src/gs-entbase/server/basemonster.cpp +++ b/src/gs-entbase/server/basemonster.cpp @@ -343,7 +343,7 @@ CBaseMonster::FreeState(void) if (trigger.Trigger != __NULL__) { dprint(sprintf("^2CBaseMonster::^3FreeState^7: %s triggered %f\n", m_strRouteEnded, time)); - trigger.Trigger(); + trigger.Trigger(TRIG_TOGGLE); } else { dprint(sprintf("^1CBaseMonster::^3FreeState^7: %s not a valid trigger\n", m_strRouteEnded)); } @@ -509,7 +509,7 @@ CBaseMonster::Physics(void) /* override whatever we did above with this */ if (m_iSequenceState == SEQUENCESTATE_ENDING) { - input_angles = v_angle = m_vecSequenceAngle; + input_angles = v_angle = angles = m_vecSequenceAngle; SetFrame(m_flSequenceEnd); } else if (movetype == MOVETYPE_WALK) { SeeThink(); diff --git a/src/gs-entbase/server/basenpc.cpp b/src/gs-entbase/server/basenpc.cpp index c6c8831d..55421334 100644 --- a/src/gs-entbase/server/basenpc.cpp +++ b/src/gs-entbase/server/basenpc.cpp @@ -447,7 +447,7 @@ CBaseNPC::Physics(void) /* override whatever we did above with this */ if (m_iSequenceState == SEQUENCESTATE_ENDING) { - input_angles = v_angle = m_vecSequenceAngle; + input_angles = v_angle = angles = m_vecSequenceAngle; SetFrame(m_flSequenceEnd); } else { if (style != MONSTER_DEAD) { diff --git a/src/gs-entbase/server/basetrigger.cpp b/src/gs-entbase/server/basetrigger.cpp index 0fa3496d..f84b16d0 100644 --- a/src/gs-entbase/server/basetrigger.cpp +++ b/src/gs-entbase/server/basetrigger.cpp @@ -20,34 +20,44 @@ enum USE_CONTINOUS }; +enum +{ + TRIG_TOGGLE, + TRIG_OFF, + TRIG_ON +}; + class CBaseTrigger:CBaseEntity { int m_strGlobalState; string m_strKillTarget; string m_strMessage; string m_strMaster; + float m_flDelay; int m_iUseType; int m_iTeam; + int m_iValue; void(void) CBaseTrigger; - virtual void(void) Trigger; - virtual void(void) UseTargets; + + virtual void(int) Trigger; + virtual void(int) UseTargets; + virtual void(int, float) UseTargets_Delay; virtual int(void) GetValue; virtual int(void) GetMaster; - virtual void(float) UseTargets_Delay; virtual void(void) InitBrushTrigger; virtual void(void) InitPointTrigger; }; void -CBaseTrigger::UseTargets(void) +CBaseTrigger::UseTargets(int state) { - for (entity eFind = world; (eFind = find(eFind, CBaseTrigger::m_strTargetName, m_strTarget));) { - CBaseTrigger trigger = (CBaseTrigger) eFind; + for (entity f = world; (f = find(f, CBaseTrigger::m_strTargetName, m_strTarget));) { + CBaseTrigger trigger = (CBaseTrigger)f; dprint(sprintf("^2%s::^3UseTargets^7: Triggering %s `%s`\n", - this.classname, eFind.classname, trigger.m_strTargetName)); + this.classname, f.classname, trigger.m_strTargetName)); if (trigger.Trigger != __NULL__) { - trigger.Trigger(); + trigger.Trigger(state); } } @@ -69,38 +79,12 @@ CBaseTrigger::UseTargets(void) } } -int -CBaseTrigger::GetValue(void) -{ - return TRUE; -} - -int -CBaseTrigger::GetMaster(void) -{ - CBaseTrigger t; - - /* default to success */ - if (!m_strMaster) { - return TRUE; - } - - t = (CBaseTrigger)find(world, CBaseTrigger::m_strTarget, m_strMaster); - - /* we couldn't find it, so let's not even bother going further */ - if (!t) { - return FALSE; - } - - return t.GetValue(); -} - void -CBaseTrigger::UseTargets_Delay (float fDelay) +CBaseTrigger::UseTargets_Delay(int state, float fDelay) { static void Entities_UseTargets_Delay_Think(void) { eActivator = self.owner; - CBaseTrigger::UseTargets(); + CBaseTrigger::UseTargets(self.health); /* ugly */ remove(self); } @@ -112,10 +96,48 @@ CBaseTrigger::UseTargets_Delay (float fDelay) eTimer.think = Entities_UseTargets_Delay_Think; eTimer.m_strTarget = m_strTarget; eTimer.nextthink = time + fDelay; + eTimer.health = state; /* ugly */ +} + +int +CBaseTrigger::GetValue(void) +{ + return m_iValue; +} + +int +CBaseTrigger::GetMaster(void) +{ + CBaseTrigger t; + + /* default to success */ + if (!m_strMaster) { + dprint(sprintf("^2%s::^3GetMaster^7: No master, return success\n", + this.classname)); + return TRUE; + } + + t = (CBaseTrigger)find(world, CBaseTrigger::m_strTarget, m_strMaster); + + /* we couldn't find it, so let's not even bother going further */ + if (!t) { + dprint(sprintf("^2%s::^3GetMaster^7: Invalid master, return success\n", + this.classname)); + return TRUE; + } + + if (t.GetValue() == 1) + dprint(sprintf("^2%s::^3GetMaster^7: %s learns %s ^2POSITIVE\n", + this.classname, m_strTargetName, m_strMaster)); + else + dprint(sprintf("^2%s::^3GetMaster^7: %s learns %s ^1NEGATIVE\n", + this.classname, m_strTargetName, m_strMaster)); + + return t.GetValue(); } void -CBaseTrigger::Trigger(void) +CBaseTrigger::Trigger(int state) { } diff --git a/src/gs-entbase/server/button_target.cpp b/src/gs-entbase/server/button_target.cpp index e092c7d1..0c53a071 100644 --- a/src/gs-entbase/server/button_target.cpp +++ b/src/gs-entbase/server/button_target.cpp @@ -38,13 +38,18 @@ class button_target:CBaseTrigger void(void) button_target; virtual void(void) Respawn; - virtual void(void) Trigger; + virtual void(int) Trigger; virtual void(int) Damage; }; void button_target::Respawn(void) { + /* yuck */ + static void PUseWrapper(void) { + Trigger(TRIG_TOGGLE); + } + SetMovetype(MOVETYPE_PUSH); SetSolid(SOLID_BSP); SetModel(m_oldModel); @@ -52,7 +57,7 @@ button_target::Respawn(void) /* it's either one or the other */ if (spawnflags & BUTTA_USE) { - PlayerUse = Trigger; + PlayerUse = PUseWrapper; } else { health = 1; takedamage = DAMAGE_YES; @@ -64,20 +69,20 @@ button_target::Respawn(void) } void -button_target::Trigger(void) +button_target::Trigger(int status) { /* make unusable */ PlayerUse = __NULL__; takedamage = DAMAGE_NO; frame = 1 - frame; - UseTargets(); + UseTargets(status); } void button_target::Damage(int hit) { - Trigger(); + Trigger(TRIG_TOGGLE); /* TODO: Set state? */ } void diff --git a/src/gs-entbase/server/env_beverage.cpp b/src/gs-entbase/server/env_beverage.cpp index 0880c596..e155d752 100644 --- a/src/gs-entbase/server/env_beverage.cpp +++ b/src/gs-entbase/server/env_beverage.cpp @@ -46,10 +46,11 @@ class env_beverage:CBaseTrigger int m_iReady; int m_iSkin; void(void) env_beverage; - virtual void(void) Trigger; + virtual void(int) Trigger; }; -void env_beverage::Trigger(void) +void +env_beverage::Trigger(int unused) { if (m_iReady == FALSE || m_iUses <= 0) { return; @@ -66,7 +67,8 @@ void env_beverage::Trigger(void) m_iReady = FALSE; } -void env_beverage::env_beverage(void) +void +env_beverage::env_beverage(void) { precache_model("models/can.mdl"); precache_sound("weapons/g_bounce3.wav"); diff --git a/src/gs-entbase/server/env_explosion.cpp b/src/gs-entbase/server/env_explosion.cpp index 40a07f34..1f46c5cb 100644 --- a/src/gs-entbase/server/env_explosion.cpp +++ b/src/gs-entbase/server/env_explosion.cpp @@ -39,7 +39,7 @@ class env_explosion:CBaseTrigger float m_flMaxDelay; void(void) env_explosion; - virtual void(void) Trigger; + virtual void(int) Trigger; }; void env_explosion::env_explosion(void) @@ -56,7 +56,7 @@ void env_explosion::env_explosion(void) CBaseTrigger::CBaseTrigger(); } -void env_explosion::Trigger(void) +void env_explosion::Trigger(int state) { FX_Explosion(origin); diff --git a/src/gs-entbase/server/env_fade.cpp b/src/gs-entbase/server/env_fade.cpp index ace92f28..2cca6156 100644 --- a/src/gs-entbase/server/env_fade.cpp +++ b/src/gs-entbase/server/env_fade.cpp @@ -40,10 +40,10 @@ class env_fade:CBaseTrigger float m_flFadeHold; void(void) env_fade; - virtual void(void) Trigger; + virtual void(int) Trigger; }; -void env_fade::Trigger (void) +void env_fade::Trigger(int state) { WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); WriteByte(MSG_MULTICAST, EV_FADE); diff --git a/src/gs-entbase/server/env_global.cpp b/src/gs-entbase/server/env_global.cpp index 44d5b450..8518f6ad 100644 --- a/src/gs-entbase/server/env_global.cpp +++ b/src/gs-entbase/server/env_global.cpp @@ -45,7 +45,7 @@ class env_global:CBaseTrigger int m_iInitialState; void(void) env_global; - virtual void(void) Trigger; + virtual void(int) Trigger; virtual int(string) GlobalPresent; virtual void(string, int) AddNewGlobal; @@ -53,7 +53,9 @@ class env_global:CBaseTrigger virtual int(string) GetGlobal; }; -void env_global::Trigger(void) { +void +env_global::Trigger(int state) +{ int iOldValue = GetGlobal(m_strGlobalState); int iNewValue = 0; @@ -84,7 +86,9 @@ void env_global::Trigger(void) { } } -int env_global::GlobalPresent (string strName) { +int +env_global::GlobalPresent(string strName) +{ for (int i = 1; i < (tokenize(cvar_string(CENVGLOBAL_CVAR)) - 1); i += 2) { if (argv(i) == strName) { return 1; @@ -93,11 +97,14 @@ int env_global::GlobalPresent (string strName) { return 0; } -void env_global::AddNewGlobal (string strName, int iValue) { +void +env_global::AddNewGlobal(string strName, int iValue) +{ cvar_set(CENVGLOBAL_CVAR, sprintf("%s %s %i", cvar_string(CENVGLOBAL_CVAR), strName, iValue)); } -void env_global::SetGlobal (string strName, int iValue) { +void +env_global::SetGlobal(string strName, int iValue) { string strNewData = ""; for (int i = 1; i < (tokenize(cvar_string(CENVGLOBAL_CVAR)) - 1); i += 2) { if (argv(i) != strName) { @@ -107,7 +114,9 @@ void env_global::SetGlobal (string strName, int iValue) { cvar_set(CENVGLOBAL_CVAR, sprintf("%s %s %i", strNewData, strName, iValue)); } -int env_global::GetGlobal (string strName) { +int +env_global::GetGlobal(string strName) +{ for (int i = 1; i < (tokenize(cvar_string(CENVGLOBAL_CVAR)) - 1); i += 2) { if (argv(i) == strName) { return stoi(argv(i+1)); @@ -116,7 +125,8 @@ int env_global::GetGlobal (string strName) { return 0; } -void env_global::env_global(void) +void +env_global::env_global(void) { for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) { switch (argv(i)) { diff --git a/src/gs-entbase/server/env_laser.cpp b/src/gs-entbase/server/env_laser.cpp index 601be73d..5c60cc33 100644 --- a/src/gs-entbase/server/env_laser.cpp +++ b/src/gs-entbase/server/env_laser.cpp @@ -54,7 +54,7 @@ class env_laser:CBaseTrigger void(void) env_laser; virtual void(void) think; - virtual void(void) Trigger; + virtual void(int) Trigger; virtual void(void) Respawn; virtual void(void) ParentUpdate; virtual float(entity, float) SendEntity; @@ -85,10 +85,19 @@ void env_laser::think(void) } } -void env_laser::Trigger(void) +void env_laser::Trigger(int state) { - m_iState = 1 - m_iState; - + switch (state) { + case TRIG_OFF: + m_iState = 0; + break; + case TRIG_ON: + m_iState = 1; + break; + default: + m_iState = 1 - m_iState; + } + if (m_iState) { nextthink = time; } else { diff --git a/src/gs-entbase/server/env_message.cpp b/src/gs-entbase/server/env_message.cpp index 8a29bf63..2435400d 100644 --- a/src/gs-entbase/server/env_message.cpp +++ b/src/gs-entbase/server/env_message.cpp @@ -41,11 +41,11 @@ class env_message:CBaseTrigger void(void) env_message; - virtual void(void) Play; + virtual void(int) Play; virtual void(void) Respawn; }; -void env_message::Play(void) +void env_message::Play(int state) { WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); WriteByte(MSG_MULTICAST, EV_MESSAGE); diff --git a/src/gs-entbase/server/env_render.cpp b/src/gs-entbase/server/env_render.cpp index 64eef77a..cb93a28f 100644 --- a/src/gs-entbase/server/env_render.cpp +++ b/src/gs-entbase/server/env_render.cpp @@ -36,11 +36,11 @@ enumflags class env_render:CBaseTrigger { void(void) env_render; - virtual void(void) Trigger; + virtual void(int) Trigger; }; void -env_render::Trigger(void) +env_render::Trigger(int state) { for (entity e = world; (e = find(e, CBaseEntity::m_strTargetName, m_strTarget));) { diff --git a/src/gs-entbase/server/env_shake.cpp b/src/gs-entbase/server/env_shake.cpp index bef04b4b..d7b201ab 100644 --- a/src/gs-entbase/server/env_shake.cpp +++ b/src/gs-entbase/server/env_shake.cpp @@ -37,12 +37,12 @@ class env_shake:CBaseTrigger float m_flFrequency; void(void) env_shake; - virtual void(void) Trigger; + virtual void(int) Trigger; }; -void env_shake::Trigger (void) +void env_shake::Trigger(int state) { - for (entity e = world; (e = find(e, ::classname, "Player"));) { + for (entity e = world; (e = find(e, ::classname, "player"));) { WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); WriteByte(MSG_MULTICAST, EV_SHAKE); WriteFloat(MSG_MULTICAST, m_flRadius); diff --git a/src/gs-entbase/server/env_shooter.cpp b/src/gs-entbase/server/env_shooter.cpp index 9be690a0..9ddd50da 100644 --- a/src/gs-entbase/server/env_shooter.cpp +++ b/src/gs-entbase/server/env_shooter.cpp @@ -48,10 +48,11 @@ class env_shooter:CBaseTrigger void(void) env_shooter; virtual void(void) Respawn; virtual void(void) ShootGib; - virtual void(void) Trigger; + virtual void(int) Trigger; }; -void env_shooter::ShootGib(void) +void +env_shooter::ShootGib(void) { static void Gib_Remove(void) { remove(self); } @@ -77,18 +78,34 @@ void env_shooter::ShootGib(void) } } -void env_shooter::Trigger(void) +void +env_shooter::Trigger(int state) { - think = ShootGib; - nextthink = time + m_flVariance; + switch (state) { + case TRIG_OFF: + think = __NULL__; + nextthink = 0.0f; + break; + case TRIG_ON: + think = ShootGib; + nextthink = time + m_flVariance; + break; + default: + if (think == __NULL__) + Trigger(TRIG_ON); + else + Trigger(TRIG_OFF); + } } -void env_shooter::Respawn(void) +void +env_shooter::Respawn(void) { m_iGibsLeft = m_iGibs; } -void env_shooter::env_shooter(void) +void +env_shooter::env_shooter(void) { for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) { switch (argv(i)) { diff --git a/src/gs-entbase/server/env_spark.cpp b/src/gs-entbase/server/env_spark.cpp index 961fa845..0e8dd396 100644 --- a/src/gs-entbase/server/env_spark.cpp +++ b/src/gs-entbase/server/env_spark.cpp @@ -51,7 +51,7 @@ class env_spark:CBaseTrigger void(void) env_spark; virtual void(void) CreateSpark; virtual void(void) TimedSpark; - virtual void(void) Trigger; + virtual void(int) Trigger; virtual void(void) Respawn; }; @@ -68,7 +68,8 @@ void env_spark::TimedSpark(void) nextthink = time + (random() * m_flMaxDelay); } -void env_spark::Trigger(void) +/* TODO: Implement state */ +void env_spark::Trigger(int state) { if (spawnflags & EVSPARK_TOGGLE) { if (think != __NULL__) { diff --git a/src/gs-entbase/server/env_sprite.cpp b/src/gs-entbase/server/env_sprite.cpp index e654936c..fde6e140 100644 --- a/src/gs-entbase/server/env_sprite.cpp +++ b/src/gs-entbase/server/env_sprite.cpp @@ -44,7 +44,7 @@ class env_sprite:CBaseTrigger float m_flEffects; void(void) env_sprite; - virtual void(void) Trigger; + virtual void(int) Trigger; virtual float(entity, float) Network; }; @@ -91,7 +91,8 @@ void env_sprite::NetworkOnce(void) multicast(origin, MULTICAST_PVS); } -void env_sprite::Trigger(void) +/* TODO: Implement state */ +void env_sprite::Trigger(int state) { if (spawnflags & ENVS_PLAYONCE) { NetworkOnce(); diff --git a/src/gs-entbase/server/func_breakable.cpp b/src/gs-entbase/server/func_breakable.cpp index 5d7f8a25..ba116748 100755 --- a/src/gs-entbase/server/func_breakable.cpp +++ b/src/gs-entbase/server/func_breakable.cpp @@ -115,14 +115,15 @@ class func_breakable:CBaseTrigger void(void) func_breakable; virtual void(void) Respawn; virtual void(void) Explode; - virtual void(void) Trigger; + virtual void(int) Trigger; virtual void(void) PlayerTouch; /*virtual void(void) PressureDeath;*/ virtual void(int) Pain; virtual void(int) Death; }; -void func_breakable::Pain (int body) +void +func_breakable::Pain(int body) { if (spawnflags & SF_TRIGGER) { return; @@ -159,17 +160,19 @@ void func_breakable::Pain (int body) } -void func_breakable::Explode(void) +void +func_breakable::Explode(void) { vector rp = absmin + (0.5 * (absmax - absmin)); FX_BreakModel(vlen(size) / 10, absmin, absmax, [0,0,0], m_iMaterial); FX_Explosion(rp); Damage_Radius(rp, this, m_flExplodeMag, m_flExplodeMag * 2.5f, TRUE, 0); - CBaseTrigger::UseTargets(); + CBaseTrigger::UseTargets(TRIG_TOGGLE); CBaseEntity::Hide(); } -void func_breakable::Death(int body) +void +func_breakable::Death(int body) { static void break_spawnobject(void) { /* these might get overwritten by the entity spawnfunction */ @@ -215,24 +218,31 @@ void func_breakable::Death(int body) nextthink = time + random(0.0,0.5); } else { FX_BreakModel(vlen(size) / 10, absmin, absmax, [0,0,0], m_iMaterial); - CBaseTrigger::UseTargets(); + CBaseTrigger::UseTargets(TRIG_TOGGLE); CBaseEntity::Hide(); } } -void func_breakable::Trigger(void) +void +func_breakable::Trigger(int state) { if (health > 0) func_breakable::Death(0); } -/*void func_breakable::PressureDeath(void) +/*void +func_breakable::PressureDeath(void) { func_breakable::Death(m_pressAttacker, m_pressType, m_pressDamage); }*/ -void func_breakable::PlayerTouch(void) +void +func_breakable::PlayerTouch(void) { + static void TriggerWrap(void) { + Trigger(TRIG_TOGGLE); + } + if (other.classname == classname) { return; } @@ -252,7 +262,7 @@ void func_breakable::PlayerTouch(void) if ((spawnflags & SF_PRESSURE) && (other.absmin[2] >= maxs[2] - 2)) { touch = __NULL__; - think = Trigger; + think = TriggerWrap; if (m_flDelay == 0) { m_flDelay = 0.1f; @@ -263,7 +273,8 @@ void func_breakable::PlayerTouch(void) } -void func_breakable::Respawn(void) +void +func_breakable::Respawn(void) { CBaseEntity::Respawn(); @@ -293,7 +304,8 @@ void func_breakable::Respawn(void) } } -void func_breakable::func_breakable(void) +void +func_breakable::func_breakable(void) { vector vvm_angles = [0,0,0]; precache_model(model); diff --git a/src/gs-entbase/server/func_button.cpp b/src/gs-entbase/server/func_button.cpp index 2404110a..efe66348 100644 --- a/src/gs-entbase/server/func_button.cpp +++ b/src/gs-entbase/server/func_button.cpp @@ -133,7 +133,7 @@ class func_button:CBaseTrigger virtual void(void) MoveAway; virtual void(void) Touch; virtual void(void) Blocked; - virtual void(void) Trigger; + virtual void(int) Trigger; virtual void(void) Use; virtual void(int) Pain; virtual void(int) Death; @@ -194,6 +194,7 @@ void func_button::MoveBack(void) { touch = __NULL__; m_iState = STATE_DOWN; + m_iValue = 0; if (m_strSndUnpressed) { if (m_iSoundCompat) @@ -229,10 +230,12 @@ void func_button::MoveAway(void) Arrived(); } + m_iValue = 1; SetFrame(FRAME_ON); } -void func_button::Trigger(void) +/* TODO: Handle state */ +void func_button::Trigger(int state) { if (m_flNextTrigger > time) { return; @@ -257,9 +260,9 @@ void func_button::Trigger(void) MoveAway(); if (m_flDelay) { - UseTargets_Delay(m_flDelay); + UseTargets_Delay(TRIG_TOGGLE, m_flDelay); } else { - UseTargets(); + UseTargets(TRIG_TOGGLE); } } @@ -267,7 +270,7 @@ void func_button::Touch(void) { if (other.movetype == MOVETYPE_WALK) { eActivator = other; - Trigger(); + Trigger(TRIG_TOGGLE); if (!(spawnflags & SF_BTT_TOUCH_ONLY)) { touch = __NULL__; @@ -277,17 +280,17 @@ void func_button::Touch(void) void func_button::Use(void) { - Trigger(); + Trigger(TRIG_TOGGLE); } void func_button::Pain (int body) { - Trigger(); + Trigger(TRIG_TOGGLE); } void func_button::Death (int body) { - Trigger(); + Trigger(TRIG_TOGGLE); } void func_button::Blocked(void) diff --git a/src/gs-entbase/server/func_conveyor.cpp b/src/gs-entbase/server/func_conveyor.cpp index eed8f6c4..78975cef 100644 --- a/src/gs-entbase/server/func_conveyor.cpp +++ b/src/gs-entbase/server/func_conveyor.cpp @@ -33,12 +33,13 @@ class func_conveyor:CBaseTrigger void(void) func_conveyor; virtual void(void) Respawn; - virtual void(void) Trigger; + virtual void(int) Trigger; virtual void(void) touch; virtual void(void) SetMovementDirection; }; -void func_conveyor::SetMovementDirection(void) +void +func_conveyor::SetMovementDirection(void) { if (angles == [0,-1,0]) { m_vecMoveDir = [0,0,1]; @@ -50,18 +51,22 @@ void func_conveyor::SetMovementDirection(void) } } -void func_conveyor::touch(void) +void +func_conveyor::touch(void) { other.basevelocity = m_vecMoveDir * m_flSpeed; } -void func_conveyor::Trigger(void) +/* TODO: Handle state? */ +void +func_conveyor::Trigger(int state) { /* changes direction */ m_flSpeed = -m_flSpeed; } -void func_conveyor::Respawn(void) +void +func_conveyor::Respawn(void) { m_vecMoveDir = [0,0,0]; angles = m_oldAngle; @@ -87,7 +92,8 @@ void func_conveyor::Respawn(void) SetAngles([0,0,0]); } -void func_conveyor::func_conveyor(void) +void +func_conveyor::func_conveyor(void) { CBaseTrigger::CBaseTrigger(); } diff --git a/src/gs-entbase/server/func_door.cpp b/src/gs-entbase/server/func_door.cpp index 9af79d06..70962bcc 100644 --- a/src/gs-entbase/server/func_door.cpp +++ b/src/gs-entbase/server/func_door.cpp @@ -98,7 +98,7 @@ class func_door:CBaseTrigger virtual void(void) Arrived; virtual void(void) Returned; virtual void(void) Respawn; - virtual void(void) Trigger; + virtual void(int) Trigger; virtual void(void) Blocked; virtual void(void) Touch; virtual void(void) Use; @@ -109,7 +109,7 @@ void func_door::Use(void) { eActivator.gflags &= ~GF_USE_RELEASED; - Trigger(); + Trigger(TRIG_TOGGLE); } void @@ -154,7 +154,7 @@ func_door::Returned(void) t = (CBaseTrigger)find(world, CBaseTrigger::m_strTargetName, m_strFire); if (t) { - t.Trigger(); + t.Trigger(TRIG_TOGGLE); } } @@ -174,6 +174,7 @@ func_door::MoveBack(void) touch = __NULL__; } + m_iValue = 0; m_iState = DOORSTATE_DOWN; MoveToDestination(m_vecPos1, Returned); } @@ -198,13 +199,17 @@ func_door::MoveAway(void) } } + m_iValue = 1; m_iState = DOORSTATE_UP; MoveToDestination(m_vecPos2, Arrived); } void -func_door::Trigger(void) +func_door::Trigger(int state) { + if (GetMaster() == 0) + return; + if (m_flNextTrigger > time) { if (!(spawnflags & SF_MOV_TOGGLE)) { return; @@ -215,9 +220,9 @@ func_door::Trigger(void) /* only trigger stuff once we are done moving */ if ((m_iState == DOORSTATE_RAISED) || (m_iState == DOORSTATE_LOWERED)) { if (m_flDelay > 0) { - CBaseTrigger::UseTargets_Delay(m_flDelay); + CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay); } else { - CBaseTrigger::UseTargets(); + CBaseTrigger::UseTargets(TRIG_TOGGLE); } } @@ -243,7 +248,7 @@ func_door::Touch(void) if (other.movetype == MOVETYPE_WALK) { if (other.absmin[2] <= maxs[2] - 2) { eActivator = other; - Trigger(); + Trigger(TRIG_TOGGLE); } } } @@ -368,6 +373,7 @@ func_door::Respawn(void) PlayerUse = __NULL__; } + m_iValue = 0; m_iState = DOORSTATE_LOWERED; m_vecPos1 = m_oldOrigin; m_vecPos2 = (m_vecPos1 + m_vecMoveDir * (fabs(m_vecMoveDir * size) - m_flLip)); @@ -376,6 +382,7 @@ func_door::Respawn(void) SetOrigin(m_vecPos2); m_vecPos2 = m_vecPos1; m_vecPos1 = origin; + m_iValue = 1; } if (m_strTargetName) { diff --git a/src/gs-entbase/server/func_door_rotating.cpp b/src/gs-entbase/server/func_door_rotating.cpp index 56304515..a9e86118 100644 --- a/src/gs-entbase/server/func_door_rotating.cpp +++ b/src/gs-entbase/server/func_door_rotating.cpp @@ -64,7 +64,7 @@ class func_door_rotating:CBaseTrigger virtual void(void) Returned; virtual void(void) Back; virtual void(void) Away; - virtual void(void) Trigger; + virtual void(int) Trigger; virtual void(void) Use; virtual void(void) Touch; virtual void(void) Blocked; @@ -196,7 +196,8 @@ void func_door_rotating::Away(void) RotToDest(m_vecPos2 * fDirection, Arrived); } -void func_door_rotating::Trigger(void) +/* TODO: Handle state */ +void func_door_rotating::Trigger(int state) { if (GetMaster() == FALSE) { return; @@ -215,16 +216,16 @@ void func_door_rotating::Trigger(void) Away(); if (m_flDelay) { - CBaseTrigger::UseTargets_Delay(m_flDelay); + CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay); } else { - CBaseTrigger::UseTargets(); + CBaseTrigger::UseTargets(TRIG_TOGGLE); } } void func_door_rotating::Use(void) { eActivator.gflags &= ~GF_USE_RELEASED; - Trigger(); + Trigger(TRIG_TOGGLE); } void func_door_rotating::Touch(void) @@ -239,7 +240,7 @@ void func_door_rotating::Touch(void) if (other.movetype == MOVETYPE_WALK) { eActivator = other; - Trigger(); + Trigger(TRIG_TOGGLE); } touch = __NULL__; } diff --git a/src/gs-entbase/server/func_guntarget.cpp b/src/gs-entbase/server/func_guntarget.cpp index d92ac5d5..0e80f438 100644 --- a/src/gs-entbase/server/func_guntarget.cpp +++ b/src/gs-entbase/server/func_guntarget.cpp @@ -37,20 +37,10 @@ class func_guntarget:CBaseTrigger virtual void(void) NextPath; virtual void(void) Move; virtual void(void) Stop; - virtual void(void) Trigger; + virtual void(int) Trigger; virtual void(int) Death; - virtual int(void) GetValue; }; -int func_guntarget::GetValue(void) -{ - if (health <= 0) { - return TRUE; - } else { - return FALSE; - } -} - void func_guntarget::Move(void) { float flTravelTime; @@ -114,7 +104,7 @@ void func_guntarget::Death(int iHitBody) for (a = world; (a = find(a, CBaseTrigger::m_strTargetName, m_strFire));) { CBaseTrigger trigger = (CBaseTrigger)a; - trigger.Trigger(); + trigger.Trigger(TRIG_TOGGLE); } } @@ -126,28 +116,35 @@ void func_guntarget::Stop(void) think = __NULL__; } -void func_guntarget::Trigger(void) +/* TODO: Handle state? */ +void func_guntarget::Trigger(int state) { - flags = (1< 0) { - CBaseTrigger::UseTargets_Delay(m_flDelay); + CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay); } else { - CBaseTrigger::UseTargets(); + CBaseTrigger::UseTargets(TRIG_TOGGLE); } solid = SOLID_NOT; } diff --git a/src/gs-entbase/server/trigger_camera.cpp b/src/gs-entbase/server/trigger_camera.cpp index db20a027..231955ca 100644 --- a/src/gs-entbase/server/trigger_camera.cpp +++ b/src/gs-entbase/server/trigger_camera.cpp @@ -30,16 +30,16 @@ class trigger_camera:CBaseTrigger float m_flWait; void(void) trigger_camera; - virtual void(void) Trigger; + virtual void(int) Trigger; }; void -trigger_camera::Trigger(void) +trigger_camera::Trigger(int state) { if (m_flDelay > 0) { - CBaseTrigger::UseTargets_Delay(m_flDelay); + CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay); } else { - CBaseTrigger::UseTargets(); + CBaseTrigger::UseTargets(TRIG_TOGGLE); } if (m_strMoveTo) { diff --git a/src/gs-entbase/server/trigger_cdaudio.cpp b/src/gs-entbase/server/trigger_cdaudio.cpp index 6bbfa0cd..dd5fc158 100644 --- a/src/gs-entbase/server/trigger_cdaudio.cpp +++ b/src/gs-entbase/server/trigger_cdaudio.cpp @@ -26,12 +26,13 @@ class trigger_cdaudio:CBaseTrigger int m_iCDTrack; void(void) trigger_cdaudio; - virtual void(void) Trigger; + virtual void(int) Trigger; virtual void(void) Respawn; + virtual void(void) touch; }; void -trigger_cdaudio::Trigger(void) +trigger_cdaudio::Trigger(int unused) { if (!(other.flags & FL_CLIENT)) { return; @@ -49,6 +50,12 @@ trigger_cdaudio::Trigger(void) remove(this); } +void +trigger_cdaudio::touch(void) +{ + Trigger(TRIG_TOGGLE); +} + void trigger_cdaudio::Respawn(void) { @@ -69,5 +76,4 @@ trigger_cdaudio::trigger_cdaudio(void) } CBaseTrigger::CBaseTrigger(); CBaseTrigger::InitBrushTrigger(); - touch = Trigger; } diff --git a/src/gs-entbase/server/trigger_changelevel.cpp b/src/gs-entbase/server/trigger_changelevel.cpp index 55273714..b89a2f74 100644 --- a/src/gs-entbase/server/trigger_changelevel.cpp +++ b/src/gs-entbase/server/trigger_changelevel.cpp @@ -53,7 +53,7 @@ class trigger_changelevel:CBaseTrigger void(void) trigger_changelevel; virtual void(void) Change; - virtual void(void) Trigger; + virtual void(int) Trigger; virtual void(void) TouchTrigger; virtual void(void) Respawn; virtual int(entity, entity) IsInside; @@ -97,7 +97,7 @@ trigger_changelevel::Change(void) } void -trigger_changelevel::Trigger(void) +trigger_changelevel::Trigger(int unused) { /* this means a delayed trigger is active */ if (nextthink > 0.0f) @@ -123,7 +123,7 @@ void trigger_changelevel::TouchTrigger(void) { eActivator = other; - Trigger(); + Trigger(TRIG_TOGGLE); } void diff --git a/src/gs-entbase/server/trigger_hurt.cpp b/src/gs-entbase/server/trigger_hurt.cpp index c812390c..0cc42dd1 100644 --- a/src/gs-entbase/server/trigger_hurt.cpp +++ b/src/gs-entbase/server/trigger_hurt.cpp @@ -45,29 +45,32 @@ class trigger_hurt:CBaseTrigger float m_flDelay; void(void) trigger_hurt; - virtual void(void) Trigger; - virtual void(void) Touch; + virtual void(int) Trigger; + virtual void(void) touch; virtual void(void) Respawn; }; void -trigger_hurt::Trigger(void) +trigger_hurt::Trigger(int state) { - if (solid != SOLID_NOT) { - dprint(sprintf("trigger_hurt::^3Trigger: %s deactivated\n", - m_strTargetName)); + switch (state) { + case TRIG_OFF: solid = SOLID_NOT; - touch = __NULL__; - } else { - dprint(sprintf("trigger_hurt::^3Trigger: %s activated\n", - m_strTargetName)); + break; + case TRIG_ON: + solid = SOLID_TRIGGER; InitBrushTrigger(); - touch = Touch; + break; + default: + if (solid == SOLID_NOT) + Trigger(TRIG_ON); + else + Trigger(TRIG_OFF); } } void -trigger_hurt::Touch(void) +trigger_hurt::touch(void) { if (m_flNextTrigger > time) { return; @@ -84,17 +87,17 @@ trigger_hurt::Touch(void) if (other.flags & FL_CLIENT) { eActivator = other; if (m_flDelay > 0) { - CBaseTrigger::UseTargets_Delay(m_flDelay); + CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay); } else { - CBaseTrigger::UseTargets(); + CBaseTrigger::UseTargets(TRIG_TOGGLE); } } } else { eActivator = other; if (m_flDelay > 0) { - CBaseTrigger::UseTargets_Delay(m_flDelay); + CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay); } else { - CBaseTrigger::UseTargets(); + CBaseTrigger::UseTargets(TRIG_TOGGLE); } } } @@ -106,7 +109,7 @@ trigger_hurt::Touch(void) /* shut it down if used once */ if (spawnflags & SF_HURT_ONCE) { - Trigger(); + Trigger(TRIG_OFF); } m_flNextTrigger = time + m_flNextDmg; @@ -119,10 +122,9 @@ trigger_hurt::Respawn(void) m_flNextTrigger = 0.0f; if (spawnflags & SF_HURT_OFF) { - solid = SOLID_NOT; + Trigger(TRIG_OFF); } else { - InitBrushTrigger(); - touch = Touch; + Trigger(TRIG_ON); } } diff --git a/src/gs-entbase/server/trigger_look.cpp b/src/gs-entbase/server/trigger_look.cpp index 52b16124..2fc2ab34 100644 --- a/src/gs-entbase/server/trigger_look.cpp +++ b/src/gs-entbase/server/trigger_look.cpp @@ -53,6 +53,9 @@ trigger_look::Touch(void) float dot; entity lt; + if (GetMaster() == FALSE) + return; + if (!(other.flags & FL_CLIENT)) { /* FIXME: could this conflict with other entities? probably. */ m_flLooked = 0.0f; @@ -86,9 +89,9 @@ trigger_look::Touch(void) /* trigger and disable entity, for now */ if (m_flDelay > 0) { - UseTargets_Delay(m_flDelay); + UseTargets_Delay(TRIG_TOGGLE, m_flDelay); } else { - UseTargets(); + UseTargets(TRIG_TOGGLE); } solid = SOLID_NOT; } diff --git a/src/gs-entbase/server/trigger_multiple.cpp b/src/gs-entbase/server/trigger_multiple.cpp index c584475a..3ae654e3 100644 --- a/src/gs-entbase/server/trigger_multiple.cpp +++ b/src/gs-entbase/server/trigger_multiple.cpp @@ -48,6 +48,9 @@ trigger_multiple::touch(void) { eActivator = other; + if (GetMaster() == FALSE) + return; + if (Rules_IsTeamPlay() == TRUE) { if (m_iTeam > 0 && eActivator.team != m_iTeam + 1) { return; @@ -59,9 +62,9 @@ trigger_multiple::touch(void) } if (m_flDelay > 0) { - UseTargets_Delay(m_flDelay); + UseTargets_Delay(TRIG_TOGGLE, m_flDelay); } else { - UseTargets(); + UseTargets(TRIG_TOGGLE); } /* This is effectively a trigger_once...*/ diff --git a/src/gs-entbase/server/trigger_once.cpp b/src/gs-entbase/server/trigger_once.cpp index 5a6c6a65..2b641b54 100644 --- a/src/gs-entbase/server/trigger_once.cpp +++ b/src/gs-entbase/server/trigger_once.cpp @@ -35,7 +35,6 @@ enumflags class trigger_once:CBaseTrigger { - float m_flDelay; void(void) trigger_once; virtual void(void) touch; @@ -49,22 +48,27 @@ trigger_once::touch(void) return; if (spawnflags & TO_NOCLIENTS && other.spawnflags & FL_CLIENT) return; + if (GetMaster() == FALSE) + return; eActivator = other; solid = SOLID_NOT; /* make inactive */ + m_iValue = 1; if (m_flDelay > 0) { - CBaseTrigger::UseTargets_Delay(m_flDelay); + CBaseTrigger::UseTargets_Delay(TRIG_TOGGLE, m_flDelay); } else { - CBaseTrigger::UseTargets(); + CBaseTrigger::UseTargets(TRIG_TOGGLE); } } void trigger_once::Respawn(void) { + m_iValue = 0; solid = SOLID_TRIGGER; SetRenderMode(RM_TRIGGER); + InitBrushTrigger(); } void @@ -81,5 +85,4 @@ trigger_once::trigger_once(void) } CBaseTrigger::CBaseTrigger(); - InitBrushTrigger(); } diff --git a/src/gs-entbase/server/trigger_push.cpp b/src/gs-entbase/server/trigger_push.cpp index 2af07111..bdb4050c 100644 --- a/src/gs-entbase/server/trigger_push.cpp +++ b/src/gs-entbase/server/trigger_push.cpp @@ -40,7 +40,7 @@ class trigger_push:CBaseTrigger virtual void(void) touch; virtual void(void) Respawn; - virtual void(void) Trigger; + virtual void(int state) Trigger; virtual void(void) SetMovementDirection; }; @@ -60,12 +60,17 @@ trigger_push::SetMovementDirection(void) } void -trigger_push::Trigger(void) +trigger_push::Trigger(int state) { - if (solid == SOLID_NOT) { - solid = SOLID_TRIGGER; - } else { + switch (state) { + case TRIG_OFF: solid = SOLID_NOT; + break; + case TRIG_ON: + solid = SOLID_TRIGGER; + break; + default: + solid = (solid == SOLID_NOT) ? SOLID_TRIGGER : SOLID_NOT; } } diff --git a/src/gs-entbase/server/trigger_relay.cpp b/src/gs-entbase/server/trigger_relay.cpp index afe7443e..50402b89 100644 --- a/src/gs-entbase/server/trigger_relay.cpp +++ b/src/gs-entbase/server/trigger_relay.cpp @@ -14,12 +14,78 @@ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/*QUAKED trigger_relay (0 .5 .8) ? +/*QUAKED trigger_relay (0 .5 .8) ? TRLY_ONCE "targetname" Name "target" Target when triggered. "killtarget" Target to kill when triggered. +"delay" Delay til the target is triggered. +"triggerstate" Desired state of the triggered entity. -See trigger_once. +This is an inbetween trigger that forces a desired output state +instead of toggling e.g. a door open. + +When the spawnflag TRLY_ONCE is set, the trigger_relay will be removed upon +triggering its targets. */ -CLASSEXPORT(trigger_relay, trigger_once) +enumflags +{ + TRLY_ONCE, +}; + +enum +{ + TRL_STATE_OFF, + TRL_STATE_ON, + TRL_STATE_TOGGLE +}; + +class trigger_relay:CBaseTrigger +{ + int m_iTriggerState; + int m_iEnabled; + + void(void) trigger_relay; + virtual void(int) Trigger; + virtual void(void) Respawn; +}; + +void +trigger_relay::Trigger(int state) +{ + if (m_iEnabled == FALSE) + return; + if (spawnflags & TRLY_ONCE) + m_iEnabled = FALSE; + + if (m_flDelay > 0) { + CBaseTrigger::UseTargets_Delay(m_iTriggerState, m_flDelay); + } else { + CBaseTrigger::UseTargets(m_iTriggerState); + } +} + +void +trigger_relay::Respawn(void) +{ + m_iEnabled = TRUE; +} + +void +trigger_relay::trigger_relay(void) +{ + CBaseTrigger::CBaseTrigger(); + + for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) { + switch (argv(i)) { + case "delay": + m_flDelay = stof(argv(i+1)); + break; + case "triggerstate": + m_iTriggerState = stoi(argv(i+1)); + break; + default: + break; + } + } +} diff --git a/src/server/cstrike/item_c4bomb.cpp b/src/server/cstrike/item_c4bomb.cpp index c9558413..1847f8eb 100644 --- a/src/server/cstrike/item_c4bomb.cpp +++ b/src/server/cstrike/item_c4bomb.cpp @@ -94,7 +94,7 @@ item_c4::Logic(void) for (entity e = world; (e = find(e, ::classname, "func_bomb_target"));) { CBaseTrigger trigger = (CBaseTrigger)e; if (trigger.Trigger != __NULL__) { - trigger.Trigger(); + trigger.Trigger(TRIG_TOGGLE); } } diff --git a/src/server/cstrike/item_suit.cpp b/src/server/cstrike/item_suit.cpp index 51b4cdc4..714b4d42 100644 --- a/src/server/cstrike/item_suit.cpp +++ b/src/server/cstrike/item_suit.cpp @@ -37,7 +37,7 @@ void item_suit::touch(void) sound(other, CHAN_ITEM, "items/tr_kevlar.wav", 1, ATTN_NORM); pl.g_items |= ITEM_SUIT; - CBaseTrigger::UseTargets(); + CBaseTrigger::UseTargets(TRIG_TOGGLE); if (cvar("sv_playerslots") == 1) { remove(self); diff --git a/src/server/valve/item_longjump.cpp b/src/server/valve/item_longjump.cpp index 7b3914c8..328408ff 100644 --- a/src/server/valve/item_longjump.cpp +++ b/src/server/valve/item_longjump.cpp @@ -47,7 +47,7 @@ void item_longjump::touch(void) sound(other, CHAN_VOICE, "fvox/powermove_on.wav", 1, ATTN_NORM); pl.g_items |= ITEM_LONGJUMP; - CBaseTrigger::UseTargets(); + CBaseTrigger::UseTargets(TRIG_TOGGLE); if (real_owner || cvar("sv_playerslots") == 1) { remove(self); diff --git a/src/server/valve/item_suit.cpp b/src/server/valve/item_suit.cpp index 63400b9f..2abba515 100644 --- a/src/server/valve/item_suit.cpp +++ b/src/server/valve/item_suit.cpp @@ -45,8 +45,9 @@ void item_suit::touch(void) sound(other, CHAN_ITEM, "fvox/bell.wav", 1, ATTN_NORM); sound(other, CHAN_VOICE, "fvox/hev_logon.wav", 1, ATTN_NORM); pl.g_items |= ITEM_SUIT; + m_iValue = TRUE; - CBaseTrigger::UseTargets(); + CBaseTrigger::UseTargets(TRIG_TOGGLE); if (real_owner || cvar("sv_playerslots") == 1) { remove(self); @@ -64,6 +65,7 @@ void item_suit::Respawn(void) SetSize(VEC_HULL_MIN, VEC_HULL_MAX); SetOrigin(m_oldOrigin); SetModel(m_oldModel); + m_iValue = FALSE; think = __NULL__; nextthink = -1; diff --git a/src/server/valve/items.cpp b/src/server/valve/items.cpp index 13a9fdd5..3923e11a 100644 --- a/src/server/valve/items.cpp +++ b/src/server/valve/items.cpp @@ -28,7 +28,7 @@ void item_pickup::touch(void) Logging_Pickup(other, this, __NULL__); Sound_Play(other, CHAN_ITEM, "weapon.pickup"); - CBaseTrigger::UseTargets(); + CBaseTrigger::UseTargets(TRIG_TOGGLE); if (real_owner || m_iWasDropped == 1 || cvar("sv_playerslots") == 1) { remove(self); diff --git a/src/server/valve/monster_houndeye.cpp b/src/server/valve/monster_houndeye.cpp index 39835482..8bd7ed4f 100644 --- a/src/server/valve/monster_houndeye.cpp +++ b/src/server/valve/monster_houndeye.cpp @@ -83,6 +83,7 @@ monster_houndeye::AttackMelee(void) think = AttackBlast; nextthink = m_flAnimTime; + return TRUE; } void