From 49408b134244f8ecfd10bd565989f16676b5e4dc Mon Sep 17 00:00:00 2001 From: Marco Cawthorne Date: Tue, 26 Sep 2023 22:24:13 -0700 Subject: [PATCH] NSMoverEntity: add 'movedir' key support for Source Engine based maps --- src/shared/NSMoverEntity.h | 3 +++ src/shared/NSMoverEntity.qc | 43 ++++++++++++++++++++++++++++++------- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/shared/NSMoverEntity.h b/src/shared/NSMoverEntity.h index 87bd7b41..3a5b7d51 100644 --- a/src/shared/NSMoverEntity.h +++ b/src/shared/NSMoverEntity.h @@ -103,6 +103,7 @@ public: #ifdef SERVER virtual void Save(float); virtual void Restore(string, string); + virtual void SpawnKey(string, string); #endif private: @@ -113,6 +114,8 @@ private: moverState_t m_moverState; moverType_t m_moverType; int m_iPortalState; + vector m_vecMoveDir; /* movedir override from Source */ + bool m_bUseMoveDir; nonvirtual void _PortalOpen(void); nonvirtual void _PortalClose(void); diff --git a/src/shared/NSMoverEntity.qc b/src/shared/NSMoverEntity.qc index edf5dbec..3d88869a 100644 --- a/src/shared/NSMoverEntity.qc +++ b/src/shared/NSMoverEntity.qc @@ -24,9 +24,23 @@ NSMoverEntity::NSMoverEntity(void) m_moverState = MOVER_POS1; m_moverType = MOVERTYPE_LINEAR; m_iPortalState = 0i; + m_bUseMoveDir = false; } #ifdef SERVER +void +NSMoverEntity::SpawnKey(string strKey, string strValue) +{ + switch (strKey) { + case "movedir": + m_vecMoveDir = ReadVector(strValue); + m_bUseMoveDir = true; + break; + default: + super::Restore(strKey, strValue); + } +} + void NSMoverEntity::Save(float handle) { @@ -39,6 +53,8 @@ NSMoverEntity::Save(float handle) SaveFloat(handle, "m_moverState", m_moverState); SaveFloat(handle, "m_moverType", m_moverType); SaveInt(handle, "m_iPortalState", m_iPortalState); + SaveVector(handle, "m_vecMoveDir", m_vecMoveDir); + SaveBool(handle, "m_bUseMoveDir", m_bUseMoveDir); } void @@ -66,6 +82,12 @@ NSMoverEntity::Restore(string strKey, string strValue) case "m_iPortalState": m_iPortalState = ReadInt(strValue); break; + case "m_vecMoveDir": + m_vecMoveDir = ReadVector(strValue); + break; + case "m_bUseMoveDir": + m_bUseMoveDir = ReadBool(strValue); + break; default: super::Restore(strKey, strValue); } @@ -78,15 +100,20 @@ NSMoverEntity::GetDirectionalPosition(vector vecAngle, float flLip) vector vecMoveDir = g_vec_null; vector vecPos = g_vec_null; - /* editor angle */ - if (vecAngle == [0,-1,0]) { - vecMoveDir = [0,0,1]; - } else if (vecAngle == [0,-2,0]) { - vecMoveDir = [0,0,-1]; - } else { - /* manually specified angle */ - makevectors(vecAngle); + if (m_bUseMoveDir == true) { + makevectors(m_vecMoveDir); vecMoveDir = v_forward; + } else { + /* editor angle */ + if (vecAngle == [0,-1,0]) { + vecMoveDir = [0,0,1]; + } else if (vecAngle == [0,-2,0]) { + vecMoveDir = [0,0,-1]; + } else { + /* manually specified angle */ + makevectors(vecAngle); + vecMoveDir = v_forward; + } } vecPos = (GetOrigin() + vecMoveDir * (fabs(vecMoveDir * size) - flLip));