108 lines
2.2 KiB
C++
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;
|
|
}
|