diff --git a/dlls/cbase.h b/dlls/cbase.h index e541f667..144b15b7 100644 --- a/dlls/cbase.h +++ b/dlls/cbase.h @@ -828,6 +828,9 @@ class CBaseTrigger : public CBaseToggle void InitTrigger( void ); virtual int ObjectCaps( void ) { return CBaseToggle :: ObjectCaps() & ~FCAP_ACROSS_TRANSITION; } + + // For trigger_teleport TriggerTouch + int m_iszLandmarkName = 0; }; class CChangeLevel : public CBaseTrigger diff --git a/dlls/triggers.cpp b/dlls/triggers.cpp index b2819eba..79ff945e 100644 --- a/dlls/triggers.cpp +++ b/dlls/triggers.cpp @@ -1899,7 +1899,27 @@ void CBaseTrigger :: TeleportTouch( CBaseEntity *pOther ) if ( pOther->IsPlayer() ) { - tmp.z -= pOther->pev->mins.z;// make origin adjustments in case the teleportee is a player. (origin in center, not at feet) + // If a landmark was specified, offset the player relative to the landmark + if (m_iszLandmarkName) + { + edict_t *pentLandmark = FIND_ENTITY_BY_TARGETNAME(nullptr, STRING(m_iszLandmarkName)); + + if (!FNullEnt(pentLandmark)) + { + Vector diff = pevToucher->origin - VARS(pentLandmark)->origin; + tmp += diff; + tmp.z--; // offset by -1 because it will +1 of this scope. + } + else + { + // fallback, shouldn't happen but anyway. + tmp.z -= pOther->pev->mins.z; + } + } + else + { + tmp.z -= pOther->pev->mins.z;// make origin adjustments in case the teleportee is a player. (origin in center, not at feet) + } } tmp.z++; @@ -1950,6 +1970,7 @@ class CTriggerTeleport : public CBaseTrigger { public: void Spawn( void ); + void KeyValue(KeyValueData *pkvd); }; LINK_ENTITY_TO_CLASS( trigger_teleport, CTriggerTeleport ); @@ -1960,6 +1981,24 @@ void CTriggerTeleport :: Spawn( void ) SetTouch( &CTriggerTeleport::TeleportTouch ); } +void CTriggerTeleport :: KeyValue(KeyValueData *pkvd) +{ + if (FStrEq(pkvd->szKeyName, "landmark")) + { + if (Q_strlen(pkvd->szValue) > 0) + { + m_iszLandmarkName = ALLOC_STRING(pkvd->szValue); + } + + // If empty, handle it in the teleport touch instead + pkvd->fHandled = TRUE; + } + else + { + CBaseTrigger::KeyValue(pkvd); + } +} + LINK_ENTITY_TO_CLASS( info_teleport_destination, CPointEntity );