diff --git a/dlls/triggers.cpp b/dlls/triggers.cpp index d7f9483c..b9d51ca3 100644 --- a/dlls/triggers.cpp +++ b/dlls/triggers.cpp @@ -1837,30 +1837,40 @@ void CBaseTrigger::TeleportTouch( CBaseEntity *pOther ) entvars_t *pevToucher = pOther->pev; edict_t *pentTarget = NULL; - // Only teleport monsters or clients - if( !FBitSet( pevToucher->flags, FL_CLIENT | FL_MONSTER ) ) - return; - - if( !UTIL_IsMasterTriggered( m_sMaster, pOther ) ) - return; - - if( !( pev->spawnflags & SF_TRIGGER_ALLOWMONSTERS ) ) + if( !(pev->spawnflags & SF_TRIGGER_TELEPORTALL) ) { - // no monsters allowed! - if( FBitSet( pevToucher->flags, FL_MONSTER ) ) - { + // Only teleport monsters or clients + if( !FBitSet( pevToucher->flags, FL_CLIENT | FL_MONSTER ) ) + return; + + if( !UTIL_IsMasterTriggered( m_sMaster, pOther ) ) return; + + if( !( pev->spawnflags & SF_TRIGGER_ALLOWMONSTERS ) ) + { + // no monsters allowed! + if( FBitSet( pevToucher->flags, FL_MONSTER ) ) + { + return; + } } - } - if( ( pev->spawnflags & SF_TRIGGER_NOCLIENTS ) ) - { - // no clients allowed - if( pOther->IsPlayer() ) + if( ( pev->spawnflags & SF_TRIGGER_NOCLIENTS ) ) { - return; + // no clients allowed + if( pOther->IsPlayer() ) + { + return; + } } } + else + { + if( pOther->IsBSPModel() ) + return; + if(pOther == this) + return; + } pentTarget = FIND_ENTITY_BY_TARGETNAME( pentTarget, STRING( pev->target ) ); if( FNullEnt( pentTarget ) ) @@ -1878,8 +1888,10 @@ void CBaseTrigger::TeleportTouch( CBaseEntity *pOther ) pevToucher->flags &= ~FL_ONGROUND; UTIL_SetOrigin( pevToucher, tmp ); - - pevToucher->angles = pentTarget->v.angles; + if( pev->spawnflags & SF_TRIGGER_PORTAL ) + pevToucher->angles = pevToucher->angles + pentTarget->v.angles; + else + pevToucher->angles = pentTarget->v.angles; if( pOther->IsPlayer() ) { @@ -1887,7 +1899,8 @@ void CBaseTrigger::TeleportTouch( CBaseEntity *pOther ) } pevToucher->fixangle = TRUE; - pevToucher->velocity = pevToucher->basevelocity = g_vecZero; + if( !( pev->spawnflags & SF_TRIGGER_PORTAL ) ) + pevToucher->velocity = pevToucher->basevelocity = g_vecZero; } class CTriggerTeleport : public CBaseTrigger diff --git a/dlls/util.h b/dlls/util.h index e97c202e..8b4ecf8b 100644 --- a/dlls/util.h +++ b/dlls/util.h @@ -459,6 +459,8 @@ extern DLL_GLOBAL int g_Language; #define SF_TRIGGER_ALLOWMONSTERS 1// monsters allowed to fire this trigger #define SF_TRIGGER_NOCLIENTS 2// players not allowed to fire this trigger #define SF_TRIGGER_PUSHABLES 4// only pushables can fire this trigger +#define SF_TRIGGER_PORTAL 8// apply angles relative +#define SF_TRIGGER_TELEPORTALL 16// teleport all entities // func breakable #define SF_BREAK_TRIGGER_ONLY 1// may only be broken by trigger