func_tracktrain: Fix them automatically starting up. Differentiate between GoldSrc and Source engine spawnflags.
This commit is contained in:
parent
854c5907a6
commit
91519b2706
1 changed files with 98 additions and 25 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue