func_tracktrain: fixes to the way the angle delta is calculated, and restore the train to a position relative to its last target post level transition.

This commit is contained in:
Marco Cawthorne 2023-10-04 08:55:03 -07:00
parent 40adc77d66
commit 47eb4fb88f
Signed by: eukara
GPG key ID: CE2032F0A2882A22

View file

@ -68,6 +68,7 @@ public:
virtual void Save(float); virtual void Save(float);
virtual void Restore(string,string); virtual void Restore(string,string);
virtual void TransitionComplete(void);
virtual void SpawnKey(string,string); virtual void SpawnKey(string,string);
virtual void Spawned(void); virtual void Spawned(void);
virtual void Respawn(void); virtual void Respawn(void);
@ -92,6 +93,7 @@ private:
string m_strMoveSnd; string m_strMoveSnd;
string m_strStopSnd; string m_strStopSnd;
bool m_bIsModern; bool m_bIsModern;
vector m_vecRelationTarget;
}; };
void void
@ -119,6 +121,16 @@ func_tracktrain::Save(float handle)
SaveFloat(handle, "m_flStartSpeed", m_flStartSpeed); SaveFloat(handle, "m_flStartSpeed", m_flStartSpeed);
SaveString(handle, "m_strMoveSnd", m_strMoveSnd); SaveString(handle, "m_strMoveSnd", m_strMoveSnd);
SaveString(handle, "m_strStopSnd", m_strStopSnd); SaveString(handle, "m_strStopSnd", m_strStopSnd);
SaveBool(handle, "m_bIsModern", m_bIsModern);
if (target) {
NSEntity targetEnt = (NSEntity)find(world, ::targetname, target);
m_vecRelationTarget = targetEnt.GetOrigin() - GetOrigin();
} else {
m_vecRelationTarget = g_vec_null;
}
SaveVector(handle, "m_vecRelationTarget", m_vecRelationTarget);
} }
void void
@ -146,11 +158,26 @@ func_tracktrain::Restore(string strKey, string strValue)
case "m_strStopSnd": case "m_strStopSnd":
m_strStopSnd = ReadString(strValue); m_strStopSnd = ReadString(strValue);
break; break;
case "m_bIsModern":
m_bIsModern = ReadBool(strValue);
break;
case "m_vecRelationTarget":
m_vecRelationTarget = ReadVector(strValue);
break;
default: default:
super::Restore(strKey, strValue); super::Restore(strKey, strValue);
} }
} }
void
func_tracktrain::TransitionComplete(void)
{
if (target) {
NSEntity targetEnt = (NSEntity)find(world, ::targetname, target);
SetOrigin(targetEnt.GetOrigin() - m_vecRelationTarget);
}
}
void void
func_tracktrain::SpawnKey(string strKey, string strValue) func_tracktrain::SpawnKey(string strKey, string strValue)
{ {
@ -209,11 +236,10 @@ func_tracktrain::Respawn(void)
SetMovetype(MOVETYPE_PUSH); SetMovetype(MOVETYPE_PUSH);
SetModel(GetSpawnModel()); SetModel(GetSpawnModel());
SetOrigin(GetSpawnOrigin()); SetOrigin(GetSpawnOrigin());
m_flSpeed = m_flStartSpeed; m_flSpeed = m_flStartSpeed;
/* let's wait 1/4 a second to give the path_corner entities a chance to ScheduleThink(AfterSpawn, 0.0f);
* spawn in case they're after us in the ent lump */
ScheduleThink(AfterSpawn, 0.25f);
SetTriggerTarget(m_oldstrTarget); SetTriggerTarget(m_oldstrTarget);
} }
@ -286,11 +312,10 @@ func_tracktrain::PathMove(void)
vector vecDiff; vector vecDiff;
vector vecAngleDiff; vector vecAngleDiff;
vecDiff = eNode.origin - origin; vecDiff = origin - eNode.origin;
/* the direction we're aiming for */ /* the direction we're aiming for */
vecAngleDest = vectoangles(vecDiff); vecAngleDest = vectoangles(vecDiff);
vecAngleDest[1] += 180.0f; /* this is an evil hack */
if (m_bIsModern == false) { if (m_bIsModern == false) {
/* we only care about YAW */ /* we only care about YAW */
@ -308,7 +333,13 @@ func_tracktrain::PathMove(void)
vecAngleDest[1] = Math_FixDelta(vecAngleDest[1]); vecAngleDest[1] = Math_FixDelta(vecAngleDest[1]);
vecAngleDest[2] = 0; vecAngleDest[2] = 0;
vecAngleDiff = vecAngleDest - angles; {
makevectors(vecAngleDest);
vecAngleDest = vectoangles(v_forward);
makevectors(angles);
}
vecAngleDiff = vecAngleDest - vectoangles(v_forward);
vecAngleDiff[2] = 0; vecAngleDiff[2] = 0;
//print(sprintf("vecAngleDiff: %v\n", vecAngleDiff)); //print(sprintf("vecAngleDiff: %v\n", vecAngleDiff));
@ -409,7 +440,6 @@ func_tracktrain::AfterSpawn(void)
return; return;
} }
NSLog("^1func_tracktrain::^3AfterSpawn^7: Start at target %S (%s)", target, eNode.classname); NSLog("^1func_tracktrain::^3AfterSpawn^7: Start at target %S (%s)", target, eNode.classname);
SetOrigin((eNode.origin) + [0,0,m_flHeight]); SetOrigin((eNode.origin) + [0,0,m_flHeight]);