Script:Files:script/teams/gdf.script
From Mod Wiki
object team_gdf { void preinit(); void syncFields(); void destroy(); boolean OnAllowRespawn( entity p ); void RespawnWaves(); void OnNextRespawnTimeChanged(); void SetRespawnTimer( float t ); float GetMineLimit(); void GiveSpawnItems( entity p ); float GetHealthBoost( entity p ); void OnSoldierUpgrade( entity p, float oldLevel, float newLevel, boolean isSpawn ); void OnMedicUpgrade( entity p, float oldLevel, float newLevel, boolean isSpawn ); void OnCovertOpsUpgrade( entity p, float oldLevel, float newLevel, boolean isSpawn ); void OnBattleSenseUpgrade( entity p, float oldLevel, float newLevel, boolean isSpawn ); void OnLightWeaponsUpgrade( entity p, float oldLevel, float newLevel, boolean isSpawn ); void OnProficiencyUpgrade( entity p, float type, float oldLevel, float newLevel ); boolean HasConstructionBonus( entity p ); boolean HasRepairBonus( entity p ); boolean HasDisarmBonus( entity p ); boolean HasChargeArmBonus( entity p ); boolean HasSelfArmingMines( entity p ); boolean HasFastFireSupportLock( entity p ); boolean HasFastFireSupportRecharge( entity p ); boolean HasFastHackBonus( entity p ); boolean HasVehicleArmorBonus( entity p ); boolean HasEnhancedRadar( entity p ); boolean HasPersonalJammer( entity p ); boolean CanRequestVehicle( entity p ); boolean HasEfficientDecoys( entity p ); boolean HasSpreadBonus( entity p ); boolean HasFastTargetLock( entity p ); float GetMaxSupplies( entity p ); boolean CanStab( entity p ); void CreatePersonnelAuras( entity p ); float GetFireSupportDelayScale(); float GetWeaponSpeedBonus( entity p ); void RegenPulse( entity p ); void KillSpawnWaves(); void SetRespawnWait( float time ); void OnMapStart(); float allowRespawnTime; float nextRespawnTime; float GetNextRespawnTime() { return nextRespawnTime; } } void team_gdf::syncFields() { syncBroadcast( "nextRespawnTime" ); syncCallback( "nextRespawnTime", "OnNextRespawnTimeChanged" ); } void team_gdf::OnNextRespawnTimeChanged() { SetRespawnTimer( nextRespawnTime ); } void team_gdf::preinit() { gdfTeam = self; repairItem = "inventory/tools/pliers"; hackItem = "inventory/tools/pliers_hack"; chargeArmItem = "inventory/tools/pliers/charge"; chargeDisarmItem = "inventory/tools/pliers"; armItem = "inventory/tools/pliers"; constructItem = "inventory/tools/pliers"; disguiseItem = "inventory/tools/pliers_hack"; reviveItem = "inventory/tools/defibrillator"; stabItem = "inventory/weapons/knife"; disguisedStabItem = "inventory/weapons/spikes/gdf"; plantItem = "inventory/items/he_charge"; spawnHostDisarmItem = "inventory/tools/defibrillator"; respawnWait = 20.f; structureName = sys.localizeString( "game/struct/commandcenter" ); spottingProficiency = GetProficiency( "pro_covertops_spot" ); radarSpottingProficiency = GetProficiency( "pro_covertops_radar_spot" ); repairProficiency = GetProficiency( "pro_engineer_repair" ); reviveProficiency = GetProficiency( "pro_medic_revive" ); reviveWaitProficiency = GetProficiency( "pro_battlesense_revive_wait" ); backstabDisguisedProficiency= GetProficiency( "pro_covertops_backstab_disguised" ); reviveMeToolTip1 = GetToolTip( getKey( "tt_player_revive_1" ) ); reviveMeToolTip2 = GetToolTip( getKey( "tt_player_revive_2" ) ); parachuteToolTip = GetToolTip( getKey( "tt_player_parachute" ) ); vehicleRepairTask = GetPlayerTask( getKey( "task_vehicle_repair" ) ); captureSpawnTask = GetPlayerTask( getKey( "task_capture_spawn" ) ); liberateSpawnTaskCovertOnly = GetPlayerTask( getKey( "task_liberate_spawn_covert" ) ); liberateSpawnTask = GetPlayerTask( getKey( "task_liberate_spawn" ) ); } void team_gdf::KillSpawnWaves() { sys.killThread( "RespawnWaves_gdf" ); } void team_gdf::OnMapStart() { OnMapStart_Base(); KillSpawnWaves(); if ( !sys.isClient() ) { thread RespawnWaves(); } } void team_gdf::destroy() { KillSpawnWaves(); } boolean team_gdf::OnAllowRespawn( entity p ) { return sys.getTime() < allowRespawnTime; } void team_gdf::RespawnWaves() { sys.threadName( "RespawnWaves_gdf" ); allowRespawnTime = sys.getTime() + 1.f; sys.wait( 0.5f ); while ( true ) { nextRespawnTime = sys.getTime() + respawnWait; SetRespawnTimer( nextRespawnTime ); sys.wait( respawnWait ); allowRespawnTime = sys.getTime() + 0.5f; MarkWaitingPlayers(); } } void team_gdf::SetRespawnTimer( float t ) { player p = sys.getLocalPlayer(); if( p != $null_entity ) { sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.gdfRespawnTime", nextRespawnTime * 1000 ); player viewPlayer = sys.getLocalViewPlayer(); if ( viewPlayer != $null_entity ) { team_base team = viewPlayer.getGameTeam(); if ( team == gdfTeam ) { sys.setGUIFloat( GUI_GLOBALS_HANDLE, "gameHud.spectatingRespawnTime", nextRespawnTime * 1000 ); } } } } float team_gdf::GetMineLimit() { return 3.f; } void team_gdf::OnSoldierUpgrade( entity p, float oldLevel, float newLevel, boolean isSpawn ) { ON_UPGRADE( 2 ) { UpgradeClip( p, g_ammoRocketLauncher, 2 ); UpgradeClip( p, g_ammoGPMG, 100 ); if ( isSpawn ) { p.setAmmo( g_ammoRocketLauncher, p.getAmmo( g_ammoRocketLauncher ) + 2 ); p.setAmmo( g_ammoGPMG, p.getAmmo( g_ammoGPMG ) + 100 ); } } } void team_gdf::OnMedicUpgrade( entity p, float oldLevel, float newLevel, boolean isSpawn ) { } void team_gdf::OnBattleSenseUpgrade( entity p, float oldLevel, float newLevel, boolean isSpawn ) { ON_UPGRADE( 1 ) { p.setSprintScale( 1.1f ); } ON_UPGRADE( 2 ) { if ( isSpawn ) { p.setArmor( 0.2f ); } } ON_UPGRADE( 4 ) { p.vStartRegenThread(); } } void team_gdf::OnLightWeaponsUpgrade( entity p, float oldLevel, float newLevel, boolean isSpawn ) { ON_UPGRADE( 1 ) { UpgradeClip( p, g_ammoPistol, 10 ); UpgradeClip( p, g_ammoMachinePistol, 20 ); UpgradeClip( p, g_ammoAssaultRifle, 40 ); UpgradeClip( p, g_ammoShotgun, 10 ); UpgradeClip( p, g_ammoSniperRifle, 10 ); if ( isSpawn ) { UpgradeAmmo( p, g_ammoMachinePistol, 20 ); UpgradeAmmo( p, g_ammoAssaultRifle, 40 ); UpgradeAmmo( p, g_ammoShotgun, 10 ); UpgradeAmmo( p, g_ammoSniperRifle, 10 ); UpgradeAmmo( p, g_ammoPistol, 10 ); } } ON_UPGRADE( 2 ) { UpgradeClip( p, g_ammoGrenade, 1 ); if ( isSpawn ) { UpgradeAmmo( p, g_ammoGrenade, 1 ); } } } void team_gdf::OnCovertOpsUpgrade( entity p, float oldLevel, float newLevel, boolean isSpawn ) { ON_UPGRADE( 4 ) { float index; float limit = sys.getMaxClients(); for ( index = 0; index < limit; index++ ) { entity other = sys.getClient( index ); if ( other == $null_entity ) { continue; } other.vOnLocalTeamChanged(); } } } void team_gdf::GiveSpawnItems( entity p ) { OnSoldierUpgrade( p, 0, p.getProficiency( g_proficiencySoldier ), true ); OnMedicUpgrade( p, 0, p.getProficiency( g_proficiencyMedic ), true ); OnCovertOpsUpgrade( p, 0, p.getProficiency( g_proficiencyCovertOps ), true ); OnBattleSenseUpgrade( p, 0, p.getProficiency( g_proficiencyBattleSense ), true ); OnLightWeaponsUpgrade( p, 0, p.getProficiency( g_proficiencyLightWeapons ), true ); } void team_gdf::OnProficiencyUpgrade( entity p, float type, float oldLevel, float newLevel ) { if ( type == g_proficiencySoldier ) { OnSoldierUpgrade( p, oldLevel, newLevel, false ); } else if ( type == g_proficiencyMedic ) { OnMedicUpgrade( p, oldLevel, newLevel, false ); } else if ( type == g_proficiencyCovertOps ) { OnCovertOpsUpgrade( p, oldLevel, newLevel, false ); } else if ( type == g_proficiencyBattleSense ) { OnBattleSenseUpgrade( p, oldLevel, newLevel, false ); } else if ( type == g_proficiencyLightWeapons ) { OnLightWeaponsUpgrade( p, oldLevel, newLevel, false ); } } boolean team_gdf::HasConstructionBonus( entity p ) { return p.getProficiency( g_proficiencyEngineer ) >= 3; } boolean team_gdf::HasRepairBonus( entity p ) { return p.getProficiency( g_proficiencyEngineer ) >= 2; } boolean team_gdf::HasDisarmBonus( entity p ) { return p.getProficiency( g_proficiencyEngineer ) >= 3; } boolean team_gdf::HasChargeArmBonus( entity p ) { return p.getProficiency( g_proficiencySoldier ) >= 3; } boolean team_gdf::HasSelfArmingMines( entity p ) { return p.getProficiency( g_proficiencyEngineer ) >= 4; } boolean team_gdf::HasFastFireSupportLock( entity p ) { return p.getProficiency( g_proficiencyFieldOps ) >= 3; } boolean team_gdf::HasFastFireSupportRecharge( entity p ) { return p.getProficiency( g_proficiencyFieldOps ) >= 4; } boolean team_gdf::HasFastHackBonus( entity p ) { return p.getProficiency( g_proficiencyCovertOps ) >= 3; } boolean team_gdf::HasVehicleArmorBonus( entity p ) { return p.getProficiency( g_proficiencyVehicle ) >= 4; } boolean team_gdf::HasEnhancedRadar( entity p ) { return p.getProficiency( g_proficiencyCovertOps ) >= 2; } boolean team_gdf::HasPersonalJammer( entity p ) { if ( p.getPlayerClass() != g_playerClassCovertOps ) { return false; } return p.getProficiency( g_proficiencyCovertOps ) >= 4; } boolean team_gdf::HasFastTargetLock( entity p ) { return p.getProficiency( g_proficiencySoldier ) >= 1; } boolean team_gdf::CanRequestVehicle( entity p ) { return p.getProficiency( g_proficiencyVehicle ) >= 1; } boolean team_gdf::HasEfficientDecoys( entity p ) { return p.getProficiency( g_proficiencyVehicle ) >= 2; } boolean team_gdf::HasSpreadBonus( entity p ) { return p.getProficiency( g_proficiencyLightWeapons ) >= 3; } boolean team_gdf::CanStab( entity p ) { return ( p.getPlayerClass() == g_playerClassCovertOps ) || p.isDisguised(); } float team_gdf::GetMaxSupplies( entity p ) { if ( p.getProficiency( g_proficiencyMedic ) >= 2 ) { return 2.f; } return 1.f; } float team_gdf::GetWeaponSpeedBonus( entity p ) { if ( p.getPlayerClass() == g_playerClassSoldier ) { if ( p.getProficiency( g_proficiencySoldier ) >= 4 ) { return 0.5f; } } return 0.f; } float team_gdf::GetHealthBoost( entity p ) { float bonus = 0.f; float playerClass = p.getPlayerClass(); if ( playerClass == g_playerClassSoldier ) { bonus = bonus + 20.f; } float maxClients = sys.getMaxClients(); float index; float boost = 0; for ( index = 0; index < maxClients; index++ ) { entity other = sys.getClient( index ); if ( other == $null_entity ) { continue; } if ( other.getGameTeam() != self ) { continue; } if ( other.hasAbility( "healthBoost" ) ) { boost = boost + HEALTH_BOOST; if ( boost >= MAX_HEALTH_BOOST ) { boost = MAX_HEALTH_BOOST; break; } } } bonus = bonus + boost; return bonus; } void team_gdf::SetRespawnWait( float time ) { respawnWait = time; } void team_gdf::CreatePersonnelAuras( entity p ) { if ( !sys.isClient() ) { if ( p.getProficiency( g_proficiencyBattleSense ) >= 4 ) { p.vStartRegenThread(); } } } void team_gdf::RegenPulse( entity p ) { float current = p.getHealth(); float limit = p.getMaxHealth(); if ( current >= limit ) { return; } current = current + 1; if ( current > limit ) { current = limit; } p.setHealth( current ); } float team_gdf::GetFireSupportDelayScale() { float count = CountPlayersOfClass( g_playerClassFieldOps ) - 1; float scale = 1.f; if ( count > 0 ) { scale = scale + ( count * 0.5f ); } return scale; }