From 19a4db076bfea2b51b3d2b52db4c1559f514cea6 Mon Sep 17 00:00:00 2001 From: Marco Hladik Date: Sun, 29 Mar 2020 12:56:46 +0200 Subject: [PATCH] Scripted Sequence: Support for classnames (untested), angle overrides... --- src/gs-entbase/server/basemonster.cpp | 41 ++++++++++++++++++--- src/gs-entbase/server/basenpc.cpp | 3 +- src/gs-entbase/server/scripted_sequence.cpp | 35 ++++++++++++++---- 3 files changed, 65 insertions(+), 14 deletions(-) diff --git a/src/gs-entbase/server/basemonster.cpp b/src/gs-entbase/server/basemonster.cpp index e8672d4f..7bf7c71e 100644 --- a/src/gs-entbase/server/basemonster.cpp +++ b/src/gs-entbase/server/basemonster.cpp @@ -65,14 +65,17 @@ class CBaseMonster:CBaseEntity vector base_maxs; int base_health; + int m_iSequenceRemove; int m_iSequenceState; float m_flSequenceEnd; float m_flSequenceSpeed; + vector m_vecSequenceAngle; /* pathfinding */ int m_iNodes; int m_iCurNode; nodeslist_t *m_pRoute; + vector m_vecLastNode; /* sequences */ string m_strRouteEnded; @@ -177,26 +180,42 @@ void CBaseMonster::FreeState(void) } } } + + if (m_iSequenceRemove) { + Hide(); + } } void CBaseMonster::CheckRoute(void) { float flDist; + vector evenpos; if (!m_iNodes) { return; } - flDist = floor( vlen( m_pRoute[m_iCurNode].dest - origin ) ); + /* level out position/node stuff */ + if (m_iCurNode < 0) { + evenpos = m_vecLastNode; + evenpos[2] = origin[2]; + } else { + evenpos = m_pRoute[m_iCurNode].dest; + evenpos[2] = origin[2]; + } - if ( flDist < 64 ) { + flDist = floor( vlen( evenpos - origin ) ); + + if ( flDist < 8 ) { print(sprintf("^2CBaseMonster::CheckRoute^7: %s reached node\n", this.netname)); m_iCurNode--; velocity = [0,0,0]; /* clamp friction */ } - if (m_iCurNode < 0) { + if (m_iCurNode < -1) { + ClearRoute(); print(sprintf("^2CBaseMonster::CheckRoute^7: %s reached end\n", this.netname)); + /* mark that we've ended a sequence, if we're in one and que anim */ if (m_iSequenceState == SEQUENCESTATE_ACTIVE) { if (m_flSequenceEnd) { @@ -205,9 +224,12 @@ void CBaseMonster::CheckRoute(void) think = FreeState; nextthink = time + duration; print(sprintf("^2CBaseMonster::CheckRoute^7: %s overriding anim for %f seconds (modelindex %d, frame %d)\n", this.netname, duration, modelindex, m_flSequenceEnd)); + } else { + /* we still need to trigger targets */ + think = FreeState; + nextthink = time; } } - ClearRoute(); } /*if ( flDist == m_flLastDist ) { @@ -229,7 +251,12 @@ void CBaseMonster::WalkRoute(void) { if (m_iNodes) { vector endangles; - endangles = vectoangles(m_pRoute[m_iCurNode].dest - origin); + /* we're on our last node */ + if (m_iCurNode < 0) { + endangles = vectoangles(m_vecLastNode - origin); + } else { + endangles = vectoangles(m_pRoute[m_iCurNode].dest - origin); + } input_angles[1] = endangles[1]; input_movevalues = [m_flSequenceSpeed, 0, 0]; } @@ -250,6 +277,7 @@ void CBaseMonster::NewRoute(vector destination) if (!m_iNodes) { route_calculate(this, destination, 0, NewRoute_RouteCB); + m_vecLastNode = destination; } } @@ -262,7 +290,8 @@ void CBaseMonster::Physics(void) input_timelength = frametime; /* override whatever we did above with this */ - if (m_iSequenceState == SEQUENCESTATE_ACTIVE) { + if (m_iSequenceState == SEQUENCESTATE_ENDING) { + input_angles = angles = v_angle = m_vecSequenceAngle; frame = m_flSequenceEnd; } else { movetype = MOVETYPE_WALK; diff --git a/src/gs-entbase/server/basenpc.cpp b/src/gs-entbase/server/basenpc.cpp index 25bb7c58..2d5533e7 100644 --- a/src/gs-entbase/server/basenpc.cpp +++ b/src/gs-entbase/server/basenpc.cpp @@ -385,7 +385,7 @@ CBaseNPC::FollowPlayer(void) v_angle = vectoangles(m_vecLastUserPos - origin); v_angle[0] = 0; v_angle[1] = Math_FixDelta(v_angle[1]); - v_angle[2] = 0; + v_angle[2] = 0; } else { m_vecLastUserPos = m_eFollowingChain.origin; } @@ -471,6 +471,7 @@ CBaseNPC::Physics(void) /* override whatever we did above with this */ if (m_iSequenceState == SEQUENCESTATE_ENDING) { + input_angles = angles = v_angle = m_vecSequenceAngle; frame = m_flSequenceEnd; } else { if (style != MONSTER_DEAD) { diff --git a/src/gs-entbase/server/scripted_sequence.cpp b/src/gs-entbase/server/scripted_sequence.cpp index 20b75cf5..90593c32 100644 --- a/src/gs-entbase/server/scripted_sequence.cpp +++ b/src/gs-entbase/server/scripted_sequence.cpp @@ -77,6 +77,8 @@ enum { class scripted_sequence:CBaseTrigger { + int m_iEnabled; + /* Target name OR classname description */ string m_strMonster; /* After the monster has moved to the action point, play this animation */ @@ -97,13 +99,28 @@ void scripted_sequence::Trigger(void) { CBaseMonster f; + if (!m_iEnabled) { + return; + } + print(sprintf("^2scripted_sequence::Trigger^7: with spawnflags %d\n", spawnflags)); f = (CBaseMonster)find(world, CBaseEntity::m_strTargetName, m_strMonster); /* target doesn't exist/hasn't spawned */ if (!f) { - print(sprintf("^1scripted_sequence::Trigger^7: Unknown target %s\n", m_strMonster)); - return; + /* time to look for a classname instead */ + for (entity c = world; (c = find(c, ::classname, m_strMonster));) { + /* within radius */ + if (vlen(origin - c.origin) < m_flSearchRadius) { + f = c; + break; + } + } + + if (!f) { + print(sprintf("^1scripted_sequence::Trigger^7: Unknown target %s\n", m_strMonster)); + return; + } } /* if we're told an anim, we better have it... or else. */ @@ -121,6 +138,9 @@ void scripted_sequence::Trigger(void) /* mark the state */ f.m_iSequenceState = SEQUENCESTATE_ACTIVE; + /* seems to be active at all times? contrary to SS_TURNTOFACE existing? */ + f.m_vecSequenceAngle = angles; + if (m_iMove == SS_WALK) { f.NewRoute(origin); f.m_flSequenceSpeed = 64; @@ -137,18 +157,19 @@ void scripted_sequence::Trigger(void) f.think = CBaseMonster::FreeState; f.nextthink = time + frameduration(f.modelindex, f.m_flSequenceEnd); } else if (m_iMove == SS_TURNTOFACE) { - /* turn instantly, only affect YAW. */ - vector newangle = vectoangles(origin - f.origin); - f.angles[1] = newangle[1]; f.m_iSequenceState = SEQUENCESTATE_ENDING; f.think = CBaseMonster::FreeState; f.nextthink = time + frameduration(f.modelindex, f.m_flSequenceEnd); - } + } + + if (!(spawnflags & SSFL_REPEATABLE)) { + m_iEnabled = FALSE; + } } void scripted_sequence::Respawn(void) { - + m_iEnabled = TRUE; } void scripted_sequence::scripted_sequence(void)