nuclide/Source/gs-entbase/server/trigger_changelevel.cpp

108 lines
2.2 KiB
C++

/***
*
* Copyright (c) 2016-2019 Marco 'eukara' Hladik. All rights reserved.
*
* See the file LICENSE attached with the sources for usage details.
*
****/
vector g_landmarkpos;
enumflags {
LC_NOINTERMISSION, // Unused?
LC_USEONLY
};
class CLevelChanger : CBaseTrigger
{
string m_strMap;
string m_strLandmark;
float m_flChangeDelay;
entity m_activator;
void() CLevelChanger;
virtual void() Change;
virtual void() Trigger;
virtual int( entity, entity ) IsInside;
};
int CLevelChanger :: IsInside ( entity ePlayer, entity eVolume ) {
if ( ePlayer.absmin[0] > eVolume.absmax[0] ||
ePlayer.absmin[1] > eVolume.absmax[1] ||
ePlayer.absmin[2] > eVolume.absmax[2] ||
ePlayer.absmax[0] < eVolume.absmin[0] ||
ePlayer.absmax[1] < eVolume.absmin[1] ||
ePlayer.absmax[2] < eVolume.absmin[2] )
return FALSE;
return TRUE;
}
void CLevelChanger :: Change ( void )
{
if ( m_strLandmark ) {
entity landmark = find( world, ::targetname, m_strLandmark );
g_landmarkpos = landmark.origin - m_activator.origin;
changelevel( m_strMap, m_strLandmark );
} else {
changelevel( m_strMap );
}
}
void CLevelChanger :: Trigger ( void )
{
//entity eVolume;
if ( time < 5 ) {
return;
}
/*eVolume = find( world, ::targetname, m_strLandmark );
if ( eVolume && eVolume.classname == "CTriggerVolume" ) {
if ( IsInside( other, eVolume ) == FALSE ) {
return;
}
}*/
m_activator = other;
if ( m_flChangeDelay ) {
think = Change;
nextthink = time + m_flChangeDelay;
} else {
Change();
}
}
void CLevelChanger :: CLevelChanger ( void )
{
for ( int i = 1; i < ( tokenize( __fullspawndata ) - 1 ); i += 2 ) {
switch ( argv( i ) ) {
case "map":
m_strMap = argv( i + 1 );
break;
case "landmark":
m_strLandmark = argv( i + 1 );
break;
case "changedelay":
m_flChangeDelay = stof( argv( i + 1 ) );
break;
default:
break;
}
}
CBaseTrigger::CBaseTrigger();
if ( !( spawnflags & LC_USEONLY ) ) {
touch = Trigger;
}
CBaseTrigger::InitBrushTrigger();
}
CLASSEXPORT( info_landmark, CInfoNull )
CLASSEXPORT( trigger_changelevel, CLevelChanger )
vector Landmark_GetSpot(void)
{
entity landmark = find(world, targetname, startspot);
return landmark.origin + g_landmarkpos;
}