diff --git a/src/gs-entbase/server.src b/src/gs-entbase/server.src index 1757466e..c345add7 100644 --- a/src/gs-entbase/server.src +++ b/src/gs-entbase/server.src @@ -59,6 +59,7 @@ server/trigger_cdaudio.cpp server/trigger_camera.cpp server/trigger_hurt.cpp server/trigger_changelevel.cpp +server/trigger_changetarget.cpp server/trigger_look.cpp server/trigger_once.cpp server/trigger_multiple.cpp diff --git a/src/gs-entbase/server/baseentity.cpp b/src/gs-entbase/server/baseentity.cpp index 4e8fe776..eb4bfb31 100644 --- a/src/gs-entbase/server/baseentity.cpp +++ b/src/gs-entbase/server/baseentity.cpp @@ -351,6 +351,7 @@ CBaseEntity::CBaseEntity(void) m_oldflRenderAmt = m_flRenderAmt; m_oldvecRenderColor = m_vecRenderColor; m_oldflRenderAmt = m_flRenderAmt; + m_oldstrTarget = m_strTarget; if (m_oldModel != "") { precache_model(m_oldModel); @@ -365,6 +366,7 @@ CBaseEntity::Respawn(void) SetSolid(m_oldSolid); SetAngles(m_oldAngle); SetOrigin(m_oldOrigin); + m_strTarget = m_oldstrTarget; #ifdef GS_RENDERFX SetRenderFX(m_oldiRenderFX); diff --git a/src/gs-entbase/server/baseentity.h b/src/gs-entbase/server/baseentity.h index 75436c6e..d7a969ba 100644 --- a/src/gs-entbase/server/baseentity.h +++ b/src/gs-entbase/server/baseentity.h @@ -17,6 +17,7 @@ class CBaseEntity { string m_strTarget; + string m_oldstrTarget; /* needed due to trigger_changetarget */ string m_strTargetName; int m_iBody; diff --git a/src/gs-entbase/server/multi_manager.cpp b/src/gs-entbase/server/multi_manager.cpp index 03835589..a8681063 100644 --- a/src/gs-entbase/server/multi_manager.cpp +++ b/src/gs-entbase/server/multi_manager.cpp @@ -144,6 +144,7 @@ multi_manager::multi_manager(void) // HACK: Avoid infinite loops if (m_strTargetName != argv(i)) { m_eTriggers[b].m_strTarget = argv(i); + m_eTriggers[b].m_oldstrTarget = argv(i); b++; } } diff --git a/src/gs-entbase/server/scripted_sequence.cpp b/src/gs-entbase/server/scripted_sequence.cpp index 36faa79f..cbc90b14 100644 --- a/src/gs-entbase/server/scripted_sequence.cpp +++ b/src/gs-entbase/server/scripted_sequence.cpp @@ -246,6 +246,7 @@ void scripted_sequence::Respawn(void) { m_iEnabled = TRUE; + m_strTarget = m_oldstrTarget; if (m_strIdleAnim) { think = InitIdle; @@ -283,6 +284,7 @@ scripted_sequence::scripted_sequence(void) break; } } + m_oldstrTarget = m_strTarget; } CLASSEXPORT(aiscripted_sequence, scripted_sequence) diff --git a/src/gs-entbase/server/trigger_changetarget.cpp b/src/gs-entbase/server/trigger_changetarget.cpp new file mode 100644 index 00000000..c244af16 --- /dev/null +++ b/src/gs-entbase/server/trigger_changetarget.cpp @@ -0,0 +1,66 @@ +/* + * 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 trigger_changetarget (1 0 0) (-8 -8 -8) (8 8 8) +"targetname" Name +"target" Target when triggered +"m_iszNewTarget" Name of the new 'target' value for the targeted entity + +When triggered, trigger_changetarget changes the 'target' value of any entity +to something else. +*/ + +class trigger_changetarget:CBaseTrigger +{ + string m_strNewTarget; + + void(void) trigger_changetarget; + + virtual void(entity,int) Trigger; +}; + +void +trigger_changetarget::Trigger(entity act, int state) +{ + CBaseEntity f; + + f = (CBaseEntity)find(world, CBaseEntity::m_strTargetName, m_strTarget); + + if (f) { + dprint("^2trigger_changetarget::^3Trigger^7: " \ + "Changing %s (%s) target from '%s' to '%s'\n", \ + m_strTarget, f.classname, f.m_strTarget, m_strTarget); + + /* now change the target */ + f.m_strTarget = m_strNewTarget; + } +} + +void +trigger_changetarget::trigger_changetarget(void) +{ + for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) { + switch (argv(i)) { + case "m_iszNewTarget": + m_strNewTarget = argv(i+1); + break; + default: + break; + } + } + + CBaseTrigger::CBaseTrigger(); +}