176 lines
3.6 KiB
Text
176 lines
3.6 KiB
Text
/*
|
|
|
|
auto_respawn.script
|
|
handles the automatic repawning of vehicles around bases
|
|
|
|
*/
|
|
|
|
|
|
object auto_respawn {
|
|
|
|
void preinit();
|
|
void init();
|
|
void destroy();
|
|
|
|
boolean SpawnVehicle();
|
|
boolean CheckSpawn();
|
|
|
|
void UpdateThread( float initialWait );
|
|
|
|
void vOnVehicleDestroyed();
|
|
|
|
void vOnUnDeploy();
|
|
void vOnDeploy();
|
|
|
|
void StartThread( float delay );
|
|
void StopThread();
|
|
|
|
void KillVehicle();
|
|
|
|
float updateThreadHandle;
|
|
entity vehicle;
|
|
float waitTime;
|
|
float delayTime;
|
|
|
|
boolean active;
|
|
|
|
float vehicleType;
|
|
float playerType;
|
|
}
|
|
|
|
void auto_respawn::preinit() {
|
|
waitTime = gameRules.GetFloatKeyWithSuffix( self, "wait_time", 0 );
|
|
delayTime = getFloatKeyWithDefault( "delay_time", 0.5 );
|
|
|
|
playerType = sys.getTypeHandle( "idPlayer" );
|
|
vehicleType = sys.getTypeHandle( "sdTransport" );
|
|
|
|
setGameTeam( sys.getTeam( getKey( "team" ) ) );
|
|
|
|
updateThreadHandle = -1;
|
|
active = getIntKeyWithDefault( "start_active", false );
|
|
|
|
setContents( CONTENTS_TRIGGER );
|
|
}
|
|
|
|
void auto_respawn::init() {
|
|
if ( active ) {
|
|
StartThread( delayTime );
|
|
}
|
|
}
|
|
|
|
void auto_respawn::KillVehicle() {
|
|
if ( vehicle != $null_entity ) {
|
|
if ( vehicle.getNumOccupiedPositions() <= 0 ) {
|
|
// get the distance away that it is
|
|
float distSquared = sys.vecLengthSquared( vehicle.getWorldOrigin() - getWorldOrigin() );
|
|
if ( distSquared < 102400 ) {
|
|
// less than ~10m away
|
|
vector up;
|
|
up_z = 1.f;
|
|
vehicle.setTakesDamage( true );
|
|
vehicle.setIconEnabled( false );
|
|
vehicle.applyDamage( $null_entity, $null_entity, up, GetDamage( "damage_magog_npc_collide" ), 10000.f, $null_entity );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void auto_respawn::destroy() {
|
|
KillVehicle();
|
|
}
|
|
|
|
void auto_respawn::UpdateThread( float initialWait ) {
|
|
sys.wait( initialWait );
|
|
|
|
while ( true ) {
|
|
if ( SpawnVehicle() ) {
|
|
break;
|
|
}
|
|
sys.waitFrame();
|
|
}
|
|
updateThreadHandle = -1;
|
|
}
|
|
|
|
boolean auto_respawn::SpawnVehicle() {
|
|
if ( CheckSpawn() ) {
|
|
vehicle = sys.spawn( getKey( "def_construction" ) );
|
|
vehicle.setGameTeam( getGameTeam() );
|
|
vehicle.setOrigin( getOrigin() );
|
|
vehicle.setAngles( getAngles() );
|
|
vehicle.vSetDeployer( self );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
boolean auto_respawn::CheckSpawn() {
|
|
team_base team = getGameTeam();
|
|
|
|
if ( sys.getTime() < team.GetNextVehicleSpawnTime() ) {
|
|
return false;
|
|
}
|
|
|
|
if ( g_disableVehicleSpawns.getBoolValue() ) {
|
|
return false;
|
|
}
|
|
|
|
float count = entitiesInBounds( getMins(), getMaxs(), CONTENTS_VEHICLECLIP | CONTENTS_BODY | CONTENTS_SLIDEMOVER | CONTENTS_MONSTER | CONTENTS_SOLID, 0 );
|
|
float index;
|
|
entity other;
|
|
if ( count ) {
|
|
for( index = 0; index < count; index++ ) {
|
|
other = getBoundsCacheEntity( index );
|
|
if ( other == $null_entity ) {
|
|
continue;
|
|
}
|
|
if ( other.vBlockVehicleSpawn() ) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void auto_respawn::vOnVehicleDestroyed() {
|
|
vehicle = $null_entity;
|
|
|
|
StopThread();
|
|
|
|
if ( active ) {
|
|
StartThread( waitTime );
|
|
}
|
|
}
|
|
|
|
void auto_respawn::StartThread( float delay ) {
|
|
if ( sys.isClient() ) {
|
|
return;
|
|
}
|
|
|
|
if ( vehicle != $null_entity ) {
|
|
return;
|
|
}
|
|
|
|
if ( updateThreadHandle == -1 ) {
|
|
updateThreadHandle = thread UpdateThread( delay );
|
|
}
|
|
}
|
|
|
|
void auto_respawn::StopThread() {
|
|
if ( updateThreadHandle != -1 ) {
|
|
sys.terminate( updateThreadHandle );
|
|
updateThreadHandle = -1;
|
|
}
|
|
}
|
|
|
|
void auto_respawn::vOnUnDeploy() {
|
|
active = false;
|
|
StopThread();
|
|
KillVehicle();
|
|
}
|
|
|
|
void auto_respawn::vOnDeploy() {
|
|
active = true;
|
|
StartThread( delayTime );
|
|
}
|