func_tracktrain: Fix them automatically starting up. Differentiate between GoldSrc and Source engine spawnflags.

This commit is contained in:
Marco Cawthorne 2023-09-27 12:58:51 -07:00
parent 854c5907a6
commit 91519b2706
Signed by: eukara
GPG key ID: CE2032F0A2882A22

View file

@ -16,13 +16,24 @@
enumflags enumflags
{ {
TRAIN_WAIT, OLDTRAIN_WAIT,
TRAIN_NOPITCH, OLDTRAIN_NOPITCH,
TRAIN_UNUSED2, OLDTRAIN_UNUSED2,
TRAIN_NOTSOLID OLDTRAIN_NOTSOLID
}; };
/*!QUAKED func_tracktrain (0 .5 .8) ? TRAIN_WAIT TRAIN_NOPITCH x TRAIN_NOTSOLID enumflags
{
TRAIN_NOPITCH,
TRAIN_NOUSER,
TRAIN_NONSOLID,
TRAIN_FIXED,
TRAIN_RIDEABLE,
TRAIN_SOUNDPITCH,
TRAIN_NOBLOCK
};
/*!QUAKED func_tracktrain (0 .5 .8) ? OLDTRAIN_WAIT OLDTRAIN_NOPITCH x OLDTRAIN_NOTSOLID
# OVERVIEW # OVERVIEW
An interactive train that moves along a path akin to func_train. An interactive train that moves along a path akin to func_train.
@ -35,9 +46,9 @@ An interactive train that moves along a path akin to func_train.
- "snd_stop" : Path to sound sample which plays when it stops moving. - "snd_stop" : Path to sound sample which plays when it stops moving.
# SPAWNFLAGS # SPAWNFLAGS
- TRAIN_WAIT (1) : Stop at each path_corner until we're triggered again. - OLDTRAIN_WAIT (1) : Stop at each path_corner until we're triggered again.
- TRAIN_NOPITCH (2) : Train does not pivot up/down at all. - OLDTRAIN_NOPITCH (2) : Train does not pivot up/down at all.
- TRAIN_NOTSOLID (8) : Don't do collision testing against this entity. - OLDTRAIN_NOTSOLID (8) : Don't do collision testing against this entity.
# NOTES # NOTES
Upon level entry, the func_tracktrain will spawn right where its first path_corner Upon level entry, the func_tracktrain will spawn right where its first path_corner
@ -52,15 +63,6 @@ This entity was introduced in Half-Life (1998).
class class
func_tracktrain:NSRenderableEntity func_tracktrain:NSRenderableEntity
{ {
float m_flWait;
float m_flSpeed;
float m_flDamage;
float m_flHeight;
float m_flStartSpeed;
float m_flBank;
string m_strMoveSnd;
string m_strStopSnd;
public: public:
void func_tracktrain(void); void func_tracktrain(void);
@ -79,6 +81,17 @@ public:
nonvirtual void PathDone(void); nonvirtual void PathDone(void);
virtual void Blocked(entity); virtual void Blocked(entity);
private:
float m_flWait;
float m_flSpeed;
float m_flDamage;
float m_flHeight;
float m_flStartSpeed;
float m_flBank;
string m_strMoveSnd;
string m_strStopSnd;
bool m_bIsModern;
}; };
void void
@ -92,6 +105,7 @@ func_tracktrain::func_tracktrain(void)
m_flBank = 0.0f; m_flBank = 0.0f;
m_strMoveSnd = __NULL__; m_strMoveSnd = __NULL__;
m_strStopSnd = __NULL__; m_strStopSnd = __NULL__;
m_bIsModern = false;
} }
void void
@ -163,6 +177,9 @@ func_tracktrain::SpawnKey(string strKey, string strValue)
case "stopsnd": case "stopsnd":
m_strStopSnd = sprintf("func_tracktrain.stop_%i", stoi(strValue) + 1i); m_strStopSnd = sprintf("func_tracktrain.stop_%i", stoi(strValue) + 1i);
break; break;
/* TODO: */
case "velocitytype":
m_bIsModern = true;
default: default:
super::SpawnKey(strKey, strValue); super::SpawnKey(strKey, strValue);
} }
@ -182,7 +199,13 @@ func_tracktrain::Spawned(void)
void void
func_tracktrain::Respawn(void) func_tracktrain::Respawn(void)
{ {
SetSolid(HasSpawnFlags(TRAIN_NOTSOLID) ? SOLID_NOT : SOLID_BSP); /* legacy compat */
if (m_bIsModern == false) {
SetSolid(HasSpawnFlags(OLDTRAIN_NOTSOLID) ? SOLID_NOT : SOLID_BSP);
} else {
SetSolid(HasSpawnFlags(TRAIN_NONSOLID) ? SOLID_NOT : SOLID_BSP);
}
SetMovetype(MOVETYPE_PUSH); SetMovetype(MOVETYPE_PUSH);
SetModel(GetSpawnModel()); SetModel(GetSpawnModel());
SetOrigin(GetSpawnOrigin()); SetOrigin(GetSpawnOrigin());
@ -267,14 +290,21 @@ func_tracktrain::PathMove(void)
/* 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 */ vecAngleDest[1] += 180.0f; /* this is an evil hack */
/* we only care about YAW */ if (m_bIsModern == false) {
if (HasSpawnFlags(TRAIN_NOPITCH)) /* we only care about YAW */
vecAngleDest[0] = 0; if (HasSpawnFlags(OLDTRAIN_NOPITCH))
else vecAngleDest[0] = 0;
vecAngleDest[0] = -Math_FixDelta(vecAngleDest[0]); else
vecAngleDest[0] = -Math_FixDelta(vecAngleDest[0]);
} else {
if (HasSpawnFlags(TRAIN_NOPITCH))
vecAngleDest[0] = 0;
else
vecAngleDest[0] = -Math_FixDelta(vecAngleDest[0]);
}
vecAngleDest[1] = Math_FixDelta(vecAngleDest[1]); vecAngleDest[1] = Math_FixDelta(vecAngleDest[1]);
vecAngleDest[2] = 0; vecAngleDest[2] = 0;
@ -320,12 +350,19 @@ void
func_tracktrain::PathNext(void) func_tracktrain::PathNext(void)
{ {
path_corner eNode; path_corner eNode;
if (HasTriggerTarget() == false)
return;
eNode = (path_corner)find(world, ::targetname, target); eNode = (path_corner)find(world, ::targetname, target);
if (!eNode) { if (!eNode) {
return; return;
} }
NSLog("^1func_tracktrain::^3PathNext^7: Going to target %S (%s)", target, eNode.classname);
SetOrigin((eNode.origin) + [0,0,m_flHeight]); SetOrigin((eNode.origin) + [0,0,m_flHeight]);
PathDone(); PathDone();
@ -355,14 +392,50 @@ func_tracktrain::PathNext(void)
void void
func_tracktrain::Trigger(entity act, triggermode_t state) func_tracktrain::Trigger(entity act, triggermode_t state)
{ {
breakpoint();
PathMove(); PathMove();
} }
void void
func_tracktrain::AfterSpawn(void) func_tracktrain::AfterSpawn(void)
{ {
PathNext(); path_corner eNode;
if (HasTriggerTarget() == false)
return;
eNode = (path_corner)find(world, ::targetname, target);
if (!eNode) {
return;
}
NSLog("^1func_tracktrain::^3AfterSpawn^7: Start at target %S (%s)", target, eNode.classname);
SetOrigin((eNode.origin) + [0,0,m_flHeight]);
PathDone();
/* if speed is 0, retain current speed */
if (eNode.m_flSpeed > 0)
m_flSpeed = eNode.m_flSpeed;
m_flWait = eNode.m_flWait;
target = eNode.target;
ClearVelocity();
/* warp */
if (eNode.HasSpawnFlags(PC_TELEPORT)) {
SetOrigin((eNode.origin) + [0,0,m_flHeight]);
}
/* stop until triggered again */
if (eNode.HasSpawnFlags(PC_WAIT)) {
SoundStop();
return;
}
/* auto start */
if (!targetname) { if (!targetname) {
PathMove(); PathMove();
} }