initial commit
This commit is contained in:
226
aghanim_singleplayer/scripts/vscripts/encounters/encounter_pudge_miniboss.lua
Executable file
226
aghanim_singleplayer/scripts/vscripts/encounters/encounter_pudge_miniboss.lua
Executable file
@@ -0,0 +1,226 @@
|
||||
require( "map_encounter" )
|
||||
require( "aghanim_utility_functions" )
|
||||
require( "spawner" )
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
if CMapEncounter_PudgeMiniboss == nil then
|
||||
CMapEncounter_PudgeMiniboss = class( {}, {}, CMapEncounter )
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapEncounter_PudgeMiniboss:constructor( hRoom, szEncounterName )
|
||||
|
||||
CMapEncounter.constructor( self, hRoom, szEncounterName )
|
||||
|
||||
self.flNextWaveSpawnTime = -1
|
||||
self.flSpawnInterval = 5
|
||||
self.flWaveDelay = 0
|
||||
self.nWaves = 16
|
||||
self.hHeroes = {}
|
||||
self:SetCalculateRewardsFromUnitCount( false )
|
||||
self.szPeonSpawner = "spawner_peon"
|
||||
self.szBossSpawner = "spawner_pudge"
|
||||
|
||||
self.hPudge = nil
|
||||
|
||||
self.bBossSpawned = false
|
||||
|
||||
self.nMaxZombies = 100
|
||||
|
||||
self.hPeonSpawner = self:AddSpawner( CDotaSpawner( self.szPeonSpawner, self.szPeonSpawner,
|
||||
{
|
||||
{
|
||||
EntityName = "npc_dota_creature_pudge_miniboss_minion",
|
||||
Team = DOTA_TEAM_BADGUYS,
|
||||
Count = 5,
|
||||
PositionNoise = 200.0,
|
||||
},
|
||||
} ) )
|
||||
|
||||
self.hBossSpawner = self:AddSpawner( CDotaSpawner( self.szBossSpawner, self.szBossSpawner,
|
||||
{
|
||||
{
|
||||
EntityName = "npc_dota_creature_pudge_miniboss",
|
||||
Team = DOTA_TEAM_BADGUYS,
|
||||
Count = 1,
|
||||
PositionNoise = 0.0,
|
||||
},
|
||||
} ) )
|
||||
|
||||
end
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
|
||||
function CMapEncounter_PudgeMiniboss:Precache( context )
|
||||
CMapEncounter.Precache( self, context )
|
||||
PrecacheResource( "particle_folder", "particles/units/heroes/hero_pudge", context )
|
||||
PrecacheResource( "soundfile", "soundevents/game_sounds_heroes/game_sounds_pudge.vsndevts", context )
|
||||
PrecacheResource( "soundfile", "soundevents/voscripts/game_sounds_vo_pudge.vsndevts", context )
|
||||
end
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapEncounter_PudgeMiniboss:GetPreviewUnit()
|
||||
return "npc_dota_creature_pudge_miniboss"
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapEncounter_PudgeMiniboss:OnThink()
|
||||
CMapEncounter.OnThink( self )
|
||||
self:CreateMinions()
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapEncounter_PudgeMiniboss:CreateMinions()
|
||||
if self.bCreatureSpawnsActivated ~= true then
|
||||
return
|
||||
end
|
||||
|
||||
if self.nWaves > 0 and GameRules:GetGameTime() > self.flNextWaveSpawnTime then
|
||||
|
||||
for _,Spawner in pairs ( self:GetSpawners() ) do
|
||||
if Spawner ~= self.hBossSpawner and self.hPudge ~= nil and self.hPudge:IsNull() == false and self.hPudge:IsAlive() then
|
||||
|
||||
local nSpawnedEnemies = #self.SpawnedEnemies + 1
|
||||
if self.nMaxZombies > nSpawnedEnemies then
|
||||
Spawner:SpawnUnits()
|
||||
else
|
||||
print( "Skipping zombie minion spawn; too many zombies!" )
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self.nWaves = self.nWaves - 1
|
||||
self.flNextWaveSpawnTime = GameRules:GetGameTime() + self.flSpawnInterval
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapEncounter_PudgeMiniboss:AggroPudgeMinions( Mobs )
|
||||
if Mobs == nil or #Mobs == 0 then
|
||||
return
|
||||
end
|
||||
|
||||
for _,Mob in pairs ( Mobs ) do
|
||||
local hEnemies = self.hRoom:GetPlayerUnitsInRoom()
|
||||
if #hEnemies > 0 then
|
||||
AttackTargetOrder( Mob, hEnemies[ RandomInt( 1, #hEnemies)] )
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapEncounter_PudgeMiniboss:OnSpawnerFinished( hSpawner, hSpawnedUnits )
|
||||
CMapEncounter.OnSpawnerFinished( self, hSpawner, hSpawnedUnits )
|
||||
|
||||
if hSpawner == self.hBossSpawner then
|
||||
return
|
||||
end
|
||||
|
||||
-- randomize zombie speed
|
||||
for _,Mob in pairs ( hSpawnedUnits ) do
|
||||
Mob:SetBaseMoveSpeed( Mob:GetBaseMoveSpeed() + RandomFloat( -100, 100 ) )
|
||||
end
|
||||
|
||||
self:AggroPudgeMinions( hSpawnedUnits )
|
||||
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapEncounter_PudgeMiniboss:GetMaxSpawnedUnitCount()
|
||||
local nCount = 0
|
||||
local hPeonSpawners = self:GetSpawner( self.szPeonSpawner )
|
||||
if hPeonSpawners then
|
||||
nCount = nCount + hPeonSpawners:GetSpawnPositionCount() * 3 * self.nWaves
|
||||
end
|
||||
|
||||
nCount = nCount + 1
|
||||
|
||||
return nCount
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapEncounter_PudgeMiniboss:CheckForCompletion()
|
||||
if self.bBossSpawned and not self:HasRemainingEnemies() then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapEncounter_PudgeMiniboss:OnComplete()
|
||||
CMapEncounter.OnComplete( self )
|
||||
|
||||
if self.nAbilityListener ~= nil then
|
||||
StopListeningToGameEvent( self.nAbilityListener )
|
||||
end
|
||||
end
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
function CMapEncounter_PudgeMiniboss:OnTriggerStartTouch( event )
|
||||
CMapEncounter.OnTriggerStartTouch( self, event )
|
||||
|
||||
-- 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 self.bCreatureSpawnsActivated == nil and szTriggerName == "trigger_spawn_creatures" then
|
||||
self.bCreatureSpawnsActivated = true
|
||||
|
||||
if not self.bBossSpawned then
|
||||
local hUnits = self.hBossSpawner:SpawnUnits()
|
||||
for _,hBoss in pairs ( hUnits) do
|
||||
EmitSoundOn( "pudge_pud_spawn_03", hBoss )
|
||||
self.hPudge = hBoss
|
||||
self.nAbilityListener = ListenToGameEvent( "dota_non_player_used_ability", Dynamic_Wrap( getclass( self ), 'OnNonPlayerUsedAbility' ), self )
|
||||
end
|
||||
self.bBossSpawned = true
|
||||
end
|
||||
|
||||
self.flNextWaveSpawnTime = GameRules:GetGameTime() + self.flWaveDelay
|
||||
EmitGlobalSound( "RoundStart" )
|
||||
end
|
||||
end
|
||||
|
||||
---------------------------------------------------------
|
||||
-- dota_non_player_used_ability
|
||||
-- * abilityname
|
||||
-- * caster_entindex
|
||||
---------------------------------------------------------
|
||||
function CMapEncounter_PudgeMiniboss:OnNonPlayerUsedAbility( event )
|
||||
|
||||
local hCaster = nil
|
||||
if event.caster_entindex ~= nil and event.abilityname ~= nil then
|
||||
hCaster = EntIndexToHScript( event.caster_entindex )
|
||||
if hCaster ~= nil and hCaster == self.hPudge and event.abilityname == "creature_pudge_dismember" then
|
||||
local nRandomInt = RandomInt( 1, 3 )
|
||||
if nRandomInt == 1 then
|
||||
EmitSoundOn( "pudge_pud_ability_devour_02", self.hPudge )
|
||||
end
|
||||
if nRandomInt == 2 then
|
||||
EmitSoundOn( "pudge_pud_ability_devour_03", self.hPudge )
|
||||
end
|
||||
if nRandomInt == 3 then
|
||||
EmitSoundOn( "pudge_pud_ability_devour_04", self.hPudge )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
return CMapEncounter_PudgeMiniboss
|
||||
Reference in New Issue
Block a user