trigger_push: Support for the 'target' spawn key.

This commit is contained in:
Marco Cawthorne 2023-05-10 16:13:28 -07:00
parent ff78e34c16
commit dad5071379
Signed by: eukara
GPG key ID: CE2032F0A2882A22

View file

@ -85,6 +85,7 @@ public:
private:
PREDICTED_FLOAT(m_flSpeed)
PREDICTED_VECTOR(m_vecMoveDir)
PREDICTED_BOOL(m_bHasTarget)
};
void
@ -92,6 +93,7 @@ trigger_push::trigger_push(void)
{
m_vecMoveDir = [0,0,0];
m_flSpeed = 100;
m_bHasTarget = false;
}
#ifdef SERVER
@ -101,6 +103,7 @@ trigger_push::Save(float handle)
super::Save(handle);
SaveVector(handle, "m_vecMoveDir", m_vecMoveDir);
SaveFloat(handle, "m_flSpeed", m_flSpeed);
SaveBool(handle, "m_bHasTarget", m_bHasTarget);
}
void
@ -113,6 +116,9 @@ trigger_push::Restore(string strKey, string strValue)
case "m_flSpeed":
m_flSpeed = ReadFloat(strValue);
break;
case "m_bHasTarget":
m_bHasTarget = ReadFloat(strValue);
break;
default:
super::Restore(strKey, strValue);
}
@ -133,6 +139,18 @@ trigger_push::SpawnKey(string strKey, string strValue)
void
trigger_push::Respawn(void)
{
static void JumpDestCheck(void) {
/* this ent has a destination target */
m_bHasTarget = false;
if (target) {
entity targetPos = find(world, ::targetname, target);
if (targetPos) {
m_bHasTarget = true;
m_vecMoveDir = targetPos.origin;
}
}
}
InitBrushTrigger();
RestoreAngles();
@ -142,6 +160,9 @@ trigger_push::Respawn(void)
if (HasSpawnFlags(TP_STARTOFF)) {
SetSolid(SOLID_NOT);
}
if (target)
ScheduleThink(JumpDestCheck, 0.5f);
}
void
@ -201,6 +222,7 @@ trigger_push::EvaluateEntity(void)
EVALUATE_VECTOR(m_vecMoveDir, 0, PUSH_CHANGED_MOVEDIR)
EVALUATE_VECTOR(m_vecMoveDir, 1, PUSH_CHANGED_MOVEDIR)
EVALUATE_VECTOR(m_vecMoveDir, 2, PUSH_CHANGED_MOVEDIR)
EVALUATE_FIELD(m_bHasTarget, PUSH_CHANGED_MOVEDIR)
}
float
@ -252,6 +274,7 @@ trigger_push::SendEntity(entity ePEnt, float flChanged)
SENDENTITY_FLOAT(m_vecMoveDir[0], PUSH_CHANGED_MOVEDIR)
SENDENTITY_FLOAT(m_vecMoveDir[1], PUSH_CHANGED_MOVEDIR)
SENDENTITY_FLOAT(m_vecMoveDir[2], PUSH_CHANGED_MOVEDIR)
SENDENTITY_BYTE(m_bHasTarget, PUSH_CHANGED_MOVEDIR)
return true;
}
@ -287,6 +310,7 @@ trigger_push::ReceiveEntity(float flNew, float flChanged)
READENTITY_FLOAT(m_vecMoveDir[0], PUSH_CHANGED_MOVEDIR)
READENTITY_FLOAT(m_vecMoveDir[1], PUSH_CHANGED_MOVEDIR)
READENTITY_FLOAT(m_vecMoveDir[2], PUSH_CHANGED_MOVEDIR)
READENTITY_BYTE(m_bHasTarget, PUSH_CHANGED_MOVEDIR)
if (flChanged & PUSH_CHANGED_SIZE)
setsize(this, mins, maxs);
@ -324,6 +348,12 @@ trigger_push::Touch(entity eToucher)
return;
}
if (m_bHasTarget) {
if (eToucher.flags & FL_ONGROUND)
eToucher.velocity = Route_GetJumpVelocity(WorldSpaceCenter(), m_vecMoveDir, 1.0);
return;
}
/* trigger_push is not supposed to work underwater */
if (eToucher.waterlevel > 1)
return;