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

101 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 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) {
print("^1func_train^7: End-Target not found! Removing.\n");
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)
{
CBaseTrigger f = (CBaseTrigger)find(world, CBaseTrigger::m_strTargetName, m_strTarget);
m_strTarget = f.m_strTargetName;
velocity = [0,0,0];
}
void func_train::Trigger(void)
{
entity f = find(world, CBaseTrigger::m_strTargetName, m_strTarget);
if (!f) {
print("^1func_train^7: Trigger-Target not found! Removing.\n");
return;
}
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);
print(sprintf("TRAIN %s SPEED: %v\n", this.classname, (vecDifference * (1 / 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);
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;
}