From 299b2eed7213f47f9c41cd57e914a6f709932168 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Wed, 4 May 2022 13:59:10 -0700 Subject: [PATCH] scripted_sequence & multi_manager: Mark both their return values as positive once they've triggered their targets only. --- src/gs-entbase/server/multi_manager.qc | 3 ++- src/gs-entbase/server/scripted_sequence.qc | 7 +++++-- src/gs-entbase/shared/NSMonster.h | 1 + src/gs-entbase/shared/NSMonster.qc | 6 ++++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/gs-entbase/server/multi_manager.qc b/src/gs-entbase/server/multi_manager.qc index c2fe1e95..913d14f9 100644 --- a/src/gs-entbase/server/multi_manager.qc +++ b/src/gs-entbase/server/multi_manager.qc @@ -198,6 +198,7 @@ multi_manager::Trigger(entity act, int state) dprint(sprintf("^2%s::^3Trigger^7: %s (%s)\n", this.classname, wow.target, eFind.classname)); + m_iValue = TRUE; UseTargets(wow.m_eActivator, TRIG_TOGGLE, 0.0f); } @@ -221,8 +222,8 @@ multi_manager::Trigger(entity act, int state) continue; m_eTriggers[i].think = mm_enttrigger; + m_eTriggers[i].m_iValue = FALSE; m_eTriggers[i].nextthink = time + m_eTriggers[i].m_flUntilTriggered; - m_eTriggers[i].m_iValue = TRUE; m_eTriggers[i].m_eActivator = act; } } diff --git a/src/gs-entbase/server/scripted_sequence.qc b/src/gs-entbase/server/scripted_sequence.qc index 80e0e81e..0d95a7e7 100644 --- a/src/gs-entbase/server/scripted_sequence.qc +++ b/src/gs-entbase/server/scripted_sequence.qc @@ -187,13 +187,16 @@ scripted_sequence::RunOnEntity(entity targ) if (target) { dprint(sprintf("\tTrigger when finished: %s\n", target)); f.m_strRouteEnded = target; + f.m_ssLast = this; + m_iValue = FALSE; /* will be marked as used once triggered */ } else { /* make sure we're not about to trigger _anything_ */ f.m_strRouteEnded = __NULL__; + f.m_ssLast = __NULL__; + /* mark us as having been used, for multisources. */ + m_iValue = TRUE; } - /* mark us as having been used, for multisources. */ - m_iValue = TRUE; /* mark the state */ f.m_iSequenceState = SEQUENCESTATE_ACTIVE; diff --git a/src/gs-entbase/shared/NSMonster.h b/src/gs-entbase/shared/NSMonster.h index 11ebc554..56d0c583 100644 --- a/src/gs-entbase/shared/NSMonster.h +++ b/src/gs-entbase/shared/NSMonster.h @@ -183,6 +183,7 @@ typedef enum class NSMonster:NSSurfacePropEntity { #ifdef SERVER + entity m_ssLast; vector oldnet_velocity; float m_flPitch; int m_iFlags; diff --git a/src/gs-entbase/shared/NSMonster.qc b/src/gs-entbase/shared/NSMonster.qc index de15fba2..68298841 100644 --- a/src/gs-entbase/shared/NSMonster.qc +++ b/src/gs-entbase/shared/NSMonster.qc @@ -338,11 +338,17 @@ NSMonster::FreeState(void) m_iSequenceState = SEQUENCESTATE_NONE; m_iSequenceFlags = 0; + if (m_ssLast) { + scripted_sequence seq = (scripted_sequence)m_ssLast; + seq.m_iValue = TRUE; + } + /* we're clearing m_strRouteEnded early, because m_strRouteEnded might change when .Trigger is executed. It could be another scripted sequence triggering another sequence. Hence the caching */ to_trigger = m_strRouteEnded; m_strRouteEnded = __NULL__; + m_ssLast = __NULL__; /* trigger when required */ if (to_trigger) {