From 0fd3cef04c04adb7c8aa368fda75e10a93462ec4 Mon Sep 17 00:00:00 2001 From: Respawn Date: Thu, 5 Jan 2023 15:37:45 +0100 Subject: Add sh_powerup.gnut from englishclient_mp_common --- .../mod/scripts/vscripts/sh_powerup.gnut | 292 +++++++++++++++++++++ 1 file changed, 292 insertions(+) create mode 100644 Northstar.CustomServers/mod/scripts/vscripts/sh_powerup.gnut (limited to 'Northstar.CustomServers/mod/scripts/vscripts') diff --git a/Northstar.CustomServers/mod/scripts/vscripts/sh_powerup.gnut b/Northstar.CustomServers/mod/scripts/vscripts/sh_powerup.gnut new file mode 100644 index 00000000..75002e81 --- /dev/null +++ b/Northstar.CustomServers/mod/scripts/vscripts/sh_powerup.gnut @@ -0,0 +1,292 @@ +global function SH_PowerUp_Init +global function GetPowerUpFromIndex +global function GetPowerUpFromItemRef + +//Proto Use Functions +global function PowerUp_Func_GiveEPG +global function PowerUp_Func_GiveHELL +global function PowerUp_Func_GiveLSTAR +global function PowerUp_Func_GiveSHOTGUN +global function PowerUp_Func_GiveArmorSmall +global function PowerUp_Func_GiveArmorMedium +global function PowerUp_Func_GiveArmorLarge +global function PowerUp_Func_TitanBuildTime +global function PowerUp_Func_PilotUpgrade +global function PowerUp_Func_GiveTicks + +global struct PowerUp +{ + int index + string name + asset icon + asset model + asset baseModel + string itemRef + vector modelOffset + vector modelAngles + float respawnDelay + vector glowColor + bool titanPickup + int maxInWorld + void functionref( entity ) destroyFunc + bool functionref() spawnFunc +} + +const bool TITAN_PICKUP = true +const bool PILOT_PICKUP = false + +struct +{ + array powerUps +}file + +const TEST_MODEL = $"models/communication/terminal_com_station.mdl" +const TEST_ICON = $"vgui/HUD/coop/minimap_coop_nuke_titan" + +void function SH_PowerUp_Init() +{ + #if SERVER || CLIENT + PrecacheWeapon( "mp_weapon_epg" ) + PrecacheWeapon( "mp_weapon_arena1" ) + PrecacheWeapon( "mp_weapon_arena2" ) + PrecacheWeapon( "mp_weapon_arena3" ) + PrecacheWeapon( "mp_weapon_lstar" ) + PrecacheWeapon( "mp_weapon_shotgun_doublebarrel" ) + PrecacheWeapon( "mp_weapon_frag_drone" ) + #endif + + file.powerUps.resize( ePowerUps.count ) + CreatePowerUp( ePowerUps.weaponEPG, "mp_weapon_epg", "EPG", 60.0, 0, DefaultShouldSpawnPowerUp, PowerUp_Func_GiveEPG, <255,0,0>, PILOT_PICKUP, $"vgui/HUD/op_ammo_mini", $"models/weapons/auto_rocket_launcher_ARL/w_ARL.mdl", $"models/communication/flag_base.mdl", < 0, 0, 32 >, < 0, 0, 0 > ) + CreatePowerUp( ePowerUps.weaponHELL, "mp_weapon_arena3", "HELL", 90.0, 0, DefaultShouldSpawnPowerUp, PowerUp_Func_GiveHELL, <255,0,0>, PILOT_PICKUP, $"vgui/HUD/op_ammo_mini", $"models/weapons/defender/w_defender.mdl", $"models/communication/flag_base.mdl", < 0, 0, 32 >, < 0, 0, 0 > ) + CreatePowerUp( ePowerUps.weaponLSTAR, "mp_weapon_lstar", "LSTAR", 45.0, 0, DefaultShouldSpawnPowerUp, PowerUp_Func_GiveLSTAR, <255,0,0>, PILOT_PICKUP, $"vgui/HUD/op_ammo_mini", $"models/weapons/lstar/w_lstar.mdl", $"models/communication/flag_base.mdl", < 0, 0, 32 >, < 0, 0, 0 > ) + CreatePowerUp( ePowerUps.weaponSHOTGUN, "mp_weapon_shotgun_doublebarrel", "Shrapnel Shotgun", 30.0, 0, DefaultShouldSpawnPowerUp, PowerUp_Func_GiveSHOTGUN, <255,0,0>, PILOT_PICKUP, $"vgui/HUD/op_ammo_mini", $"models/weapons/mastiff_stgn/w_mastiff.mdl", $"models/communication/flag_base.mdl", < 0, 0, 32 >, < 0, 0, 0 > ) + CreatePowerUp( ePowerUps.armorSmall, "mp_loot_armor_small", "Armor +5", 30.0, 0, DefaultShouldSpawnPowerUp, PowerUp_Func_GiveArmorSmall, <0,0,255>, PILOT_PICKUP, $"vgui/HUD/op_health_mini", $"models/gameplay/health_pickup_small.mdl", $"models/containers/plastic_pallet_01.mdl", < 0, 0, 32 >, < 0, 0, 0 > ) + CreatePowerUp( ePowerUps.armorMedium, "mp_loot_armor_medium", "Armor +25", 60.0, 0, DefaultShouldSpawnPowerUp, PowerUp_Func_GiveArmorMedium, <0,0,255>, PILOT_PICKUP, $"vgui/HUD/op_health_mini", $"models/gameplay/health_pickup_small.mdl", $"models/containers/plastic_pallet_01.mdl", < 0, 0, 32 >, < 0, 0, 0 > ) + CreatePowerUp( ePowerUps.armorLarge, "mp_loot_armor_large", "Armor +50", 120.0, 0, DefaultShouldSpawnPowerUp, PowerUp_Func_GiveArmorLarge, <0,0,255>, PILOT_PICKUP, $"vgui/HUD/op_health_mini", $"models/gameplay/health_pickup_large.mdl", $"models/containers/plastic_pallet_01.mdl", < 0, 0, 32 >, < 0, 0, 0 > ) + CreatePowerUp( ePowerUps.titanTimeReduction, "mp_loot_titan_build_credit", "Titan Build Time", 20.0, 2, FRAShouldSpawnPowerUp, PowerUp_Func_TitanBuildTime, <0,255,0>, PILOT_PICKUP, $"vgui/HUD/op_drone_mini", $"models/titans/medium/titan_medium_battery_static.mdl", $"models/communication/flag_base.mdl", < 0, 0, 32 >, < 0, 0, 0 > ) + CreatePowerUp( ePowerUps.LTS_TitanTimeReduction, "mp_loot_titan_build_credit_lts", "Titan Build Time", 60.0, 0, LTSShouldSpawnPowerUp, PowerUp_Func_TitanBuildTime, <0,255,0>, PILOT_PICKUP, $"vgui/HUD/op_drone_mini", $"models/titans/medium/titan_medium_battery_static.mdl", $"models/communication/flag_base.mdl", < 0, 0, 32 >, < 0, 0, 0 > ) + CreatePowerUp( ePowerUps.pilotUpgrade, "mp_loot_pilot_upgrade", "Can of Spinach", 120.0, 0, DefaultShouldSpawnPowerUp, PowerUp_Func_PilotUpgrade, <0,255,0>, PILOT_PICKUP, $"vgui/HUD/op_drone_mini", $"models/humans/pilots/pilot_light_ged_m.mdl", $"models/communication/flag_base.mdl", < 0, 0, 32 >, < 0, 0, 0 > ) + CreatePowerUp( ePowerUps.ticks, "mp_weapon_frag_drone", "Ticks", 60.0, 0, DefaultShouldSpawnPowerUp, PowerUp_Func_GiveTicks, <255,0,0>, PILOT_PICKUP, $"vgui/HUD/op_ammo_mini", $"models/robots/drone_frag/frag_drone_proj.mdl", $"models/robots/drone_frag/frag_drone_proj.mdl", < 0, 0, 32 >, < 0, 0, 0 > ) +} + +bool function FRAShouldSpawnPowerUp() +{ + return GAMETYPE == FREE_AGENCY +} + +bool function LTSShouldSpawnPowerUp() +{ + if ( HasIronRules() ) + return false + + return ( GAMETYPE == LAST_TITAN_STANDING || GAMETYPE == LTS_BOMB ) +} + +bool function DefaultShouldSpawnPowerUp() +{ + return GetCurrentPlaylistVarInt( "power_ups_enabled", 0 ) == 1 +} + +void function CreatePowerUp( int enumIndex, string item, string displayName, float respawnTime, int worldLimit, bool functionref() shouldSpawnFunction, void functionref( entity ) destroyFunction, vector color, bool canTitanPickup, asset worldIcon, asset worldModel, asset worldBase, vector worldModelOffset, vector worldModelAngle ) +{ + PowerUp power + power.index = enumIndex + power.name = displayName + power.icon = worldIcon + power.model = worldModel + power.baseModel = worldBase + power.itemRef = item + power.modelOffset = worldModelOffset + power.modelAngles = worldModelAngle + power.respawnDelay = respawnTime + power.destroyFunc = destroyFunction + power.spawnFunc = shouldSpawnFunction + power.glowColor = color + power.titanPickup = canTitanPickup + power.maxInWorld = worldLimit + file.powerUps[enumIndex] = power + + #if CLIENT + PrecacheHUDMaterial( worldIcon ) + #else + PrecacheModel( worldModel ) + PrecacheModel( worldBase ) + #if R1_VGUI_MINIMAP + Minimap_PrecacheMaterial( worldIcon ) + #endif + #endif +} + +PowerUp function GetPowerUpFromIndex( int index ) +{ + return file.powerUps[index] +} + +PowerUp function GetPowerUpFromItemRef( string ref ) +{ + foreach( power in file.powerUps ) + { + if ( power.itemRef == ref ) + return power + } + + Assert( false, "Power Up not found") + unreachable +} + +////////////////////////////////////////////// +// PROTO USE FUNCTIONS - Maybe should be a bunch of new item_ classes with their own healthkit callbacks? +////////////////////////////////////////////// +void function PowerUp_Func_GiveEPG( entity player ) +{ + #if SERVER + if ( player.IsTitan() ) + return + GiveWeaponPowerUp( player, "mp_weapon_arena2" ) + #endif +} + +void function PowerUp_Func_GiveHELL( entity player ) +{ + #if SERVER + if ( player.IsTitan() ) + return + GiveWeaponPowerUp( player, "mp_weapon_arena3" ) + #endif +} + +void function PowerUp_Func_GiveLSTAR( entity player ) +{ + #if SERVER + if ( player.IsTitan() ) + return + GiveWeaponPowerUp( player, "mp_weapon_arena1" ) + #endif +} + +void function PowerUp_Func_GiveSHOTGUN( entity player ) +{ + #if SERVER + if ( player.IsTitan() ) + return + GiveWeaponPowerUp( player, "mp_weapon_shotgun_doublebarrel" ) + #endif +} + +void function PowerUp_Func_GiveTicks( entity player ) +{ + #if SERVER + if ( player.IsTitan() ) + return + player.TakeOffhandWeapon( OFFHAND_ORDNANCE ) + player.GiveOffhandWeapon( "mp_weapon_frag_drone", OFFHAND_ORDNANCE ) + thread RestoreDefaultOffhandWeapon( player ) + #endif +} + +#if SERVER +void function RestoreDefaultOffhandWeapon( entity player ) +{ + player.EndSignal( "OnDeath" ) + player.EndSignal( "OnDestroy" ) + + while( true ) + { + player.WaitSignal( "ThrowGrenade" ) + + if ( player.IsTitan() ) + continue + + entity weapon = player.GetOffhandWeapon( OFFHAND_ORDNANCE ) + if ( weapon.GetWeaponPrimaryClipCount() == 0 ) + { + player.TakeOffhandWeapon( OFFHAND_ORDNANCE ) + int loadoutIndex = GetActivePilotLoadoutIndex( player ) + PilotLoadoutDef loadout = GetPilotLoadoutFromPersistentData( player, loadoutIndex ) + player.GiveOffhandWeapon( loadout.ordnance, OFFHAND_ORDNANCE ) + return + } + } +} + +void function GiveWeaponPowerUp( entity player, string newWeapon ) +{ + array weapons = player.GetMainWeapons() + string weaponToSwitch = player.GetLatestPrimaryWeapon().GetWeaponClassName() + + if ( player.GetActiveWeapon() != player.GetAntiTitanWeapon() ) + { + foreach ( weapon in weapons ) + { + string weaponClassName = weapon.GetWeaponClassName() + if ( weaponClassName == newWeapon ) + { + weaponToSwitch = weaponClassName + break + } + } + } + + player.TakeWeaponNow( weaponToSwitch ) + player.GiveWeapon( newWeapon ) + player.SetActiveWeaponByName( newWeapon ) +} +#endif + +void function PowerUp_Func_GiveArmorSmall( entity player ) +{ + GiveArmor( player, 5 ) +} + +void function PowerUp_Func_GiveArmorMedium( entity player ) +{ + GiveArmor( player, 25 ) +} + +void function PowerUp_Func_GiveArmorLarge( entity player ) +{ + GiveArmor( player, 50 ) +} + +void function GiveArmor( entity player, int amount ) +{ + #if SERVER + if ( player.IsTitan() ) + return + int currentShieldHealth = player.GetShieldHealth() + int currentMaxShieldHealth = player.GetShieldHealthMax() + player.SetShieldHealth( min( 200, amount + currentShieldHealth ) ) + player.SetShieldHealthMax( min( 200, amount + currentMaxShieldHealth ) ) + #endif +} + +void function PowerUp_Func_TitanBuildTime( entity player ) +{ + #if SERVER + entity battery = Rodeo_CreateBatteryPack() + battery.SetOrigin( player.GetOrigin() ) + #endif +} + + + +void function PowerUp_Func_PilotUpgrade( entity player ) +{ + #if SERVER + if ( player.IsTitan() ) + return + + int loadoutIndex = GetPersistentSpawnLoadoutIndex( player, "pilot" ) + + PilotLoadoutDef loadout = GetPilotLoadoutFromPersistentData( player, loadoutIndex ) + + loadout.primary = "mp_weapon_arena2" + loadout.secondary = "mp_weapon_mgl" + loadout.ordnance = "mp_weapon_grenade_emp" + + UpdateDerivedPilotLoadoutData( loadout ) + + GivePilotLoadout( player, loadout ) + SetActivePilotLoadoutIndex( player, loadoutIndex ) + #endif +} \ No newline at end of file -- cgit v1.2.3