Scripted Sequence: Support for classnames (untested), angle overrides...
This commit is contained in:
parent
d59213834b
commit
19a4db076b
3 changed files with 65 additions and 14 deletions
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue