From 278e984eaf5a1f6ea7a22390550ec8f38a555317 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Sat, 29 Aug 2020 00:28:22 +0200 Subject: [PATCH] random_trigger: Initial implementation. Triggers its target after a random albeit roughly defined interval --- src/gs-entbase/server.src | 1 + src/gs-entbase/server/random_trigger.cpp | 88 ++++++++++++++++++++++++ 2 files changed, 89 insertions(+) create mode 100644 src/gs-entbase/server/random_trigger.cpp diff --git a/src/gs-entbase/server.src b/src/gs-entbase/server.src index d09d9e0f..6f2961d8 100644 --- a/src/gs-entbase/server.src +++ b/src/gs-entbase/server.src @@ -86,6 +86,7 @@ server/monster_generic.cpp server/monstermaker.cpp server/multisource.cpp server/random_speaker.cpp +server/random_trigger.cpp server/scripted_sentence.cpp server/scripted_sequence.cpp #endlist diff --git a/src/gs-entbase/server/random_trigger.cpp b/src/gs-entbase/server/random_trigger.cpp new file mode 100644 index 00000000..50427a95 --- /dev/null +++ b/src/gs-entbase/server/random_trigger.cpp @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2016-2020 Marco Hladik + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +/*QUAKED random_trigger (1 0 0) (-8 -8 -8) (8 8 8) +"targetname" Name +"target" Target when triggered +"killtarget" Target to kill when triggered +"start_state" Start state (either 0 or 1) +"wait" Minimum time +"random_min" Minimum added random time +"random_max" Maximum added random time + +When triggered, it'll calculate some random interval until it triggers +its targets, based on some limits given. + +Trivia: +It was introduced in Gunman Chronicles. +*/ + +class random_trigger:CBaseTrigger +{ + float m_flMinTime; + float m_flRandMin; + float m_flRandMax; + int m_iStartState; + + void(void) random_trigger; + + virtual void(entity,int) Trigger; + virtual void(void) Respawn; +}; + +void +random_trigger::Trigger(entity act, int state) +{ + float r; + + if (GetMaster() == FALSE) + return; + + r = time + m_flMinTime + random(m_flRandMin, m_flRandMax); + CBaseTrigger::UseTargets_Delay(other, TRIG_TOGGLE, r); +} + +void +random_trigger::Respawn(void) +{ + if (m_iStartState == 1) + Trigger(this, TRIG_ON); +} + +void +random_trigger::random_trigger(void) +{ + for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) { + switch (argv(i)) { + case "start_state": + m_iStartState = stoi(argv(i+1)); + break; + case "wait": + m_flMinTime = stof(argv(i+1)); + break; + case "random_min": + m_flRandMin = stof(argv(i+1)); + break; + case "random_max": + m_flRandMax = stof(argv(i+1)); + break; + default: + break; + } + } + + CBaseTrigger::CBaseTrigger(); +}