107 lines
2.3 KiB
C++
107 lines
2.3 KiB
C++
/***
|
|
*
|
|
* 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;
|
|
}
|