2019-08-31 19:18:15 -07:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2016-2019 Marco Hladik <marco@icculus.org>
|
|
|
|
*
|
|
|
|
* Permission to use, copy, modify, and distribute this software for any
|
|
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
|
|
* copyright notice and this permission notice appear in all copies.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
|
|
* WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
|
|
|
|
* IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
|
|
|
|
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
*/
|
2018-12-30 17:00:38 -08:00
|
|
|
|
2019-09-06 20:37:06 -07:00
|
|
|
/*QUAKED func_train (0 .5 .8) ?
|
|
|
|
"targetname" Name
|
|
|
|
"target" Target when triggered.
|
|
|
|
"killtarget" Target to kill when triggered.
|
|
|
|
|
|
|
|
Moving platform following along path_* entities.
|
|
|
|
Very unfinished.
|
|
|
|
*/
|
|
|
|
|
2019-01-14 07:13:20 -08:00
|
|
|
class func_train:CBaseTrigger
|
2018-12-30 17:00:38 -08:00
|
|
|
{
|
|
|
|
float m_flSpeed;
|
|
|
|
|
2019-01-14 07:13:20 -08:00
|
|
|
void() func_train;
|
2018-12-30 17:00:38 -08:00
|
|
|
virtual void() Find;
|
2019-03-19 12:01:24 -07:00
|
|
|
virtual void() NextPath;
|
|
|
|
virtual void() GoToTarget;
|
2018-12-30 17:00:38 -08:00
|
|
|
virtual void() Trigger;
|
2019-03-19 12:01:24 -07:00
|
|
|
virtual void() Respawn;
|
2018-12-30 17:00:38 -08:00
|
|
|
};
|
|
|
|
|
2019-03-19 12:01:24 -07:00
|
|
|
void func_train::GoToTarget(void)
|
2018-12-30 17:00:38 -08:00
|
|
|
{
|
2019-03-19 12:01:24 -07:00
|
|
|
float flTravelTime;
|
|
|
|
vector vel_to_pos;
|
|
|
|
entity f;
|
|
|
|
|
|
|
|
f = find(world, CBaseTrigger::m_strTargetName, m_strTarget);
|
2018-12-30 17:00:38 -08:00
|
|
|
|
2019-01-14 07:13:20 -08:00
|
|
|
if (!f) {
|
2019-03-19 12:01:24 -07:00
|
|
|
print("^1func_train^7: Trigger-Target not found! Removing.\n");
|
2018-12-30 17:00:38 -08:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2019-01-14 07:13:20 -08:00
|
|
|
vector vecWorldPos;
|
2019-03-21 12:32:45 -07:00
|
|
|
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]));
|
|
|
|
|
2019-03-19 12:01:24 -07:00
|
|
|
vel_to_pos = (f.origin - vecWorldPos);
|
|
|
|
flTravelTime = (vlen(vel_to_pos) / m_flSpeed);
|
2019-01-14 07:13:20 -08:00
|
|
|
|
2019-03-19 12:01:24 -07:00
|
|
|
if (!flTravelTime) {
|
|
|
|
NextPath();
|
|
|
|
print(sprintf("TRAIN %s SPEED: %f\n", m_strTargetName, flTravelTime));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
velocity = (vel_to_pos * (1 / flTravelTime));
|
|
|
|
think = NextPath;
|
2019-09-01 13:39:56 -07:00
|
|
|
nextthink = (ltime + flTravelTime);
|
2018-12-30 17:00:38 -08:00
|
|
|
}
|
|
|
|
|
2019-03-19 12:01:24 -07:00
|
|
|
void func_train::NextPath(void)
|
2018-12-30 17:00:38 -08:00
|
|
|
{
|
2019-03-19 12:01:24 -07:00
|
|
|
CBaseTrigger current_target;
|
2018-12-30 17:00:38 -08:00
|
|
|
|
2019-03-19 12:01:24 -07:00
|
|
|
print(sprintf("^2func_train^7: Talking to current target %s... ", m_strTarget));
|
|
|
|
current_target = (CBaseTrigger)find(world, CBaseTrigger::m_strTargetName, m_strTarget);
|
|
|
|
|
|
|
|
if (!current_target) {
|
|
|
|
print("^1FAILED.\n");
|
|
|
|
} else {
|
|
|
|
print("^2SUCCESS.\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
m_strTarget = current_target.m_strTarget;
|
2019-01-14 07:13:20 -08:00
|
|
|
velocity = [0,0,0];
|
2019-03-21 12:32:45 -07:00
|
|
|
|
2019-03-19 12:01:24 -07:00
|
|
|
if (m_strTarget) {
|
|
|
|
GoToTarget();
|
|
|
|
}
|
2019-01-14 07:13:20 -08:00
|
|
|
}
|
2018-12-30 17:00:38 -08:00
|
|
|
|
2019-01-14 07:13:20 -08:00
|
|
|
void func_train::Trigger(void)
|
|
|
|
{
|
2019-03-19 12:01:24 -07:00
|
|
|
GoToTarget();
|
|
|
|
}
|
|
|
|
|
|
|
|
void func_train::Find(void)
|
|
|
|
{
|
2019-01-14 07:13:20 -08:00
|
|
|
entity f = find(world, CBaseTrigger::m_strTargetName, m_strTarget);
|
2019-01-18 12:06:23 -08:00
|
|
|
|
|
|
|
if (!f) {
|
2019-03-19 12:01:24 -07:00
|
|
|
print(sprintf("^1func_train^7: End-Target %s not found! Removing.\n",m_strTarget));
|
|
|
|
remove(this);
|
2019-01-18 12:06:23 -08:00
|
|
|
return;
|
|
|
|
}
|
2019-03-19 12:01:24 -07:00
|
|
|
|
|
|
|
print("^2func_train^7: Successfully found first target.\n");
|
2019-01-14 07:13:20 -08:00
|
|
|
vector vecWorldPos;
|
2019-03-21 12:32:45 -07:00
|
|
|
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]));
|
2018-12-30 17:00:38 -08:00
|
|
|
|
2019-03-19 12:01:24 -07:00
|
|
|
vecWorldPos = f.origin - vecWorldPos;
|
|
|
|
setorigin(this, vecWorldPos);
|
|
|
|
}
|
2019-01-18 12:06:23 -08:00
|
|
|
|
2019-03-19 12:01:24 -07:00
|
|
|
void func_train::Respawn(void)
|
|
|
|
{
|
|
|
|
solid = SOLID_BSP;
|
|
|
|
movetype = MOVETYPE_PUSH;
|
|
|
|
//blocked = Blocked;
|
|
|
|
|
|
|
|
setmodel(this, m_oldModel);
|
|
|
|
setorigin(this, m_oldOrigin);
|
|
|
|
|
|
|
|
/* Make sure we got some time for the paths to spawn */
|
|
|
|
nextthink = ltime + 0.1f;
|
|
|
|
think = Find;
|
2018-12-30 17:00:38 -08:00
|
|
|
}
|
|
|
|
|
2019-01-14 07:13:20 -08:00
|
|
|
void func_train::func_train(void)
|
2018-12-30 17:00:38 -08:00
|
|
|
{
|
2019-03-21 12:32:45 -07:00
|
|
|
for (int i = 1; i < (tokenize(__fullspawndata) - 1); i += 2) {
|
|
|
|
switch (argv(i)) {
|
2019-01-14 07:13:20 -08:00
|
|
|
case "speed":
|
|
|
|
m_flSpeed = stof(argv(i+1));
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2018-12-30 17:00:38 -08:00
|
|
|
}
|
|
|
|
|
2019-03-19 12:01:24 -07:00
|
|
|
if (!m_flSpeed) {
|
|
|
|
m_flSpeed = 100;
|
|
|
|
}
|
2018-12-30 17:00:38 -08:00
|
|
|
|
2019-03-19 12:01:24 -07:00
|
|
|
CBaseTrigger::CBaseTrigger();
|
|
|
|
Respawn();
|
2018-12-30 17:00:38 -08:00
|
|
|
}
|