Files
2HUCardTDGame/aghanim_singleplayer/scripts/vscripts/encounters/encounter_pangolier.lua
2021-10-24 15:36:18 -04:00

240 lines
8.3 KiB
Lua
Executable File

require( "map_encounter" )
require( "aghanim_utility_functions" )
require( "spawner" )
require( "encounters/encounter_bonus_base" )
--------------------------------------------------------------------------------
if CMapEncounter_Pangolier == nil then
CMapEncounter_Pangolier = class( {}, {}, CMapEncounter_BonusBase )
end
--------------------------------------------------------------------------------
function CMapEncounter_Pangolier:Precache( context )
CMapEncounter_BonusBase.Precache( self, context )
PrecacheModel( "models/heroes/pangolier/pangolier_gyroshell2.vmdl", context )
PrecacheModel( "models/items/rattletrap/mechanised_pilgrim_cog/mechanised_pilgrim_cog.vmdl", context )
PrecacheResource( "particle_folder", "particles/units/heroes/hero_pangolier", context )
PrecacheResource( "particle", "particles/units/heroes/hero_centaur/centaur_warstomp.vpcf", context )
PrecacheResource( "particle", "particles/creatures/greevil/greevil_prison_bottom_ring.vpcf", context )
PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_pangolier.vsndevts", context )
PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_obsidian_destroyer.vsndevts", context )
PrecacheResource( "particle_folder", "particles/units/heroes/hero_obsidian_destroyer", context )
LinkLuaModifier( "modifier_pango_bonus", "modifiers/modifier_pango_bonus", LUA_MODIFIER_MOTION_NONE )
end
--------------------------------------------------------------------------------
function CMapEncounter_Pangolier:constructor( hRoom, szEncounterName )
CMapEncounter_BonusBase.constructor( self, hRoom, szEncounterName )
self.bAllButtonsReady = false
self.nPlayersReady = 0
self.nHeroOnTrigger1 = 0
self.nHeroOnTrigger2 = 0
self.nHeroOnTrigger3 = 0
self.nHeroOnTrigger4 = 0
self.bCogsSpawned = false
self:AddSpawner( CDotaSpawner( "spawner_peon", "spawner_peon",
{
{
EntityName = "npc_dota_creature_bonus_greevil",
Team = DOTA_TEAM_BADGUYS,
Count = 3,
PositionNoise = 300.0,
},
} ) )
self:AddSpawner( CDotaSpawner( "spawner_captain", "spawner_captain",
{
{
EntityName = "npc_dota_creature_evil_greevil",
Team = DOTA_TEAM_BADGUYS,
Count = 1,
PositionNoise = 0.0,
},
} ) )
end
--------------------------------------------------------------------------------
function CMapEncounter_Pangolier:OnEncounterLoaded()
CMapEncounter_BonusBase.OnEncounterLoaded( self )
self:SetupBristlebackShop( false )
end
--------------------------------------------------------------------------------
function CMapEncounter_Pangolier:Transform()
local hHeroes = HeroList:GetAllHeroes()
for _, hHero in pairs ( hHeroes ) do
if hHero ~= nil and not hHero:IsNull() and hHero:IsRealHero() then
--printf( "Start - Transforming into gyroshell" )
local hAbility = hHero:AddAbility( "aghsfort_pangolier_gyroshell" )
hAbility:UpgradeAbility( true )
if hAbility ~= nil then
PlayerResource:SetCameraTarget( hHero:GetPlayerOwnerID(), hHero )
PlayerResource:SetOverrideSelectionEntity( hHero:GetPlayerOwnerID(), hHero )
hHero:AddNewModifier( hHero, hAbility, "modifier_pango_bonus", { duration = -1 } )
hHero:CastAbilityNoTarget( hAbility, hHero:GetPlayerOwnerID() )
--hHero:AddNewModifier( hHero, hAbility, "modifier_pangolier_gyroshell", { duration = -1 } )
else
printf( "Start - Can't find ability" )
end
end
end
if not self.bCogsSpawned then
self:SpawnCogs()
end
end
--------------------------------------------------------------------------------
function CMapEncounter_Pangolier:SpawnCogs()
--print("Spawning cogs")
local cogUnits = Entities:FindAllByName( "spawner_cog" )
for _, goalUnit in pairs(cogUnits) do
local cogPos = goalUnit:GetAbsOrigin()
local cogTable =
{
origin = "0 0 0",
angles = "0 0 0",
targetname = "bumper_cog",
model = "models/items/rattletrap/mechanised_pilgrim_cog/mechanised_pilgrim_cog.vmdl",
scales = "2 2 2",
defaultanim = "ACT_DOTA_IDLE"
}
local hUnit = SpawnEntityFromTableSynchronous( "prop_dynamic", cogTable )
hUnit:SetAbsOrigin( cogPos )
end
local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "arena_obstruction_enable_relay", false )
for _, hRelay in pairs( hRelays ) do
hRelay:Trigger( nil, nil )
end
self.bCogsSpawned = true
end
--------------------------------------------------------------------------------
function CMapEncounter_Pangolier:RemoveCogs()
--print("Removing cogs")
local cogUnits = Entities:FindAllByName( "bumper_cog" )
local vPos = nil
for _, cogUnit in pairs(cogUnits) do
vPos = cogUnit:GetAbsOrigin()
UTIL_Remove(cogUnit)
end
-- Remove Evil Greevils
local creatures = FindUnitsInRadius( DOTA_TEAM_BADGUYS, vPos, nil, FIND_UNITS_EVERYWHERE, DOTA_UNIT_TARGET_TEAM_FRIENDLY, DOTA_UNIT_TARGET_ALL, DOTA_UNIT_TARGET_FLAG_NONE, 0, false )
for _, hUnit in pairs(creatures) do
if hUnit:GetUnitName() == "npc_dota_creature_evil_greevil" then
--print("Removing an Evil Greevil")
UTIL_Remove(hUnit)
end
end
local hRelays = self:GetRoom():FindAllEntitiesInRoomByName( "arena_obstruction_disable_relay", false )
for _, hRelay in pairs( hRelays ) do
hRelay:Trigger( nil, nil )
end
end
--------------------------------------------------------------------------------
function CMapEncounter_Pangolier:GetPreviewUnit()
return "npc_dota_creature_bonus_greevil"
end
--------------------------------------------------------------------------------
function CMapEncounter_Pangolier:OnTriggerStartTouch( event )
CMapEncounter_BonusBase.OnTriggerStartTouch( self, event )
local szTriggerName = event.trigger_name
local hUnit = EntIndexToHScript( event.activator_entindex )
if self.bAllButtonsReady == true then
return
end
if self.bGameStarted == false then
if szTriggerName == "trigger_player_1" then
self.nHeroOnTrigger1 = 1
elseif szTriggerName == "trigger_player_2" then
self.nHeroOnTrigger2 = 1
elseif szTriggerName == "trigger_player_3" then
self.nHeroOnTrigger3 = 1
elseif szTriggerName == "trigger_player_4" then
self.nHeroOnTrigger4 = 1
end
self.nPlayersReady = self.nHeroOnTrigger1 + self.nHeroOnTrigger2 + self.nHeroOnTrigger3 + self.nHeroOnTrigger4
local vecPlayers = GameRules.Aghanim:GetConnectedPlayers()
if #vecPlayers > 0 then
if self.nPlayersReady == #vecPlayers then
--print("All players ready!")
self.bAllButtonsReady = true
self:GetSpawner( "spawner_peon" ):SpawnUnits()
self:GetSpawner( "spawner_captain" ):SpawnUnits()
self:StartBonusRound( 41.2 ) -- account for gyroshell cast time
self:Transform()
end
end
end
end
--------------------------------------------------------------------------------
function CMapEncounter_Pangolier:OnTriggerEndTouch( event )
CMapEncounter_BonusBase.OnTriggerEndTouch( self, event )
if self.bAllButtonsReady == true then
return
end
-- Get the trigger that activates the room
local szTriggerName = event.trigger_name
local hUnit = EntIndexToHScript( event.activator_entindex )
local hTriggerEntity = EntIndexToHScript( event.caller_entindex )
if szTriggerName == "trigger_player_1" then
self.nHeroOnTrigger1 = 0
elseif szTriggerName == "trigger_player_2" then
self.nHeroOnTrigger2 = 0
elseif szTriggerName == "trigger_player_3" then
self.nHeroOnTrigger3 = 0
elseif szTriggerName == "trigger_player_4" then
self.nHeroOnTrigger4 = 0
end
end
--------------------------------------------------------------------------------
--[[
function CMapEncounter_Pangolier:CheckForCompletion()
return self.bGameStarted == true and not self:HasRemainingEnemies()
end
]]
--------------------------------------------------------------------------------
function CMapEncounter_Pangolier:OnComplete()
CMapEncounter_BonusBase.OnComplete( self )
local hHeroes = HeroList:GetAllHeroes()
for _, hHero in pairs ( hHeroes ) do
if hHero ~= nil and not hHero:IsNull() and hHero:IsRealHero() then
hHero:RemoveAbility( "pangolier_gyroshell" )
hHero:RemoveModifierByName( "modifier_pangolier_gyroshell" )
hHero:RemoveModifierByName( "modifier_pango_bonus" )
PlayerResource:SetCameraTarget( hHero:GetPlayerOwnerID(), nil )
PlayerResource:SetOverrideSelectionEntity( hHero:GetPlayerOwnerID(), nil )
end
end
if self.bCogsSpawned then
self:RemoveCogs()
end
end
--------------------------------------------------------------------------------
return CMapEncounter_Pangolier