Scripted Sequence: Support for classnames (untested), angle overrides...

This commit is contained in:
Marco Cawthorne 2020-03-29 12:56:46 +02:00
parent d59213834b
commit 19a4db076b
3 changed files with 65 additions and 14 deletions

View File

@ -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;

View File

@ -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) {

View File

@ -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)