nuclide/Source/gs-entbase/server/func_train.cpp

108 lines
2.3 KiB
C++
Raw Normal View History

/***
*
2019-01-16 08:43:50 -08:00
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
*
* See the file LICENSE attached with the sources for usage details.
*
****/
class path_corner:CBaseTrigger
{
float m_flSpeed;
float m_flWait;
void() path_corner;
};
void path_corner::path_corner(void)
{
CBaseTrigger::CBaseTrigger();
m_flSpeed = 100;
m_flWait = 1.0f;
}
class func_train:CBaseTrigger
{
float m_flSpeed;
void() func_train;
virtual void() Find;
virtual void() MoveEnd;
virtual void() Trigger;
};
void func_train::Find(void)
{
entity f = find(world, CBaseTrigger::m_strTargetName, m_strTarget);
if (!f) {
remove(this);
return;
}
print("^2func_train^7: Successfully found first target.\n");
vector vecWorldPos;
vecWorldPos[0] = absmin[0] + ( 0.5 * ( absmax[0] - absmin[0] ) );
vecWorldPos[1] = absmin[1] + ( 0.5 * ( absmax[1] - absmin[1] ) );
vecWorldPos[2] = absmin[2] + ( 0.5 * ( absmax[2] - absmin[2] ) );
vecWorldPos = f.origin - vecWorldPos;
setorigin(this, vecWorldPos);
}
void func_train::MoveEnd(void)
{
entity f = find(world, CBaseTrigger::m_strTargetName, m_strTarget);
CBaseTrigger p = (CBaseTrigger)f;
m_strTarget = p.m_strTargetName;
velocity = [0,0,0];
}
void func_train::Trigger(void)
{
entity f = find(world, CBaseTrigger::m_strTargetName, m_strTarget);
vector vecWorldPos;
vecWorldPos[0] = absmin[0] + ( 0.5 * ( absmax[0] - absmin[0] ) );
vecWorldPos[1] = absmin[1] + ( 0.5 * ( absmax[1] - absmin[1] ) );
vecWorldPos[2] = absmin[2] + ( 0.5 * ( absmax[2] - absmin[2] ) );
vector vecDifference = (f.origin - vecWorldPos);
float flTravel = vlen(vecDifference);
float flTravelTime = (flTravel / m_flSpeed);
think = MoveEnd;
nextthink = (time + flTravelTime);
velocity = (vecDifference * (1 / flTravelTime));
}
void func_train::func_train(void)
{
CBaseTrigger::CBaseTrigger();
for ( int i = 1; i < ( tokenize( __fullspawndata ) - 1 ); i += 2 ) {
switch ( argv( i ) ) {
case "speed":
m_flSpeed = stof(argv(i+1));
break;
default:
break;
}
}
solid = SOLID_BSP;
movetype = MOVETYPE_PUSH;
//blocked = Blocked;
setmodel(this, m_oldModel);
setsize(this, mins, maxs);
setorigin(this, m_oldOrigin);
// start trains on the second frame, to make sure their targets have had
// a chance to spawn
nextthink = time + 0.25f;
think = Find;
}