204 lines
5.9 KiB
Lua
Executable File
204 lines
5.9 KiB
Lua
Executable File
|
|
--------------------------------------------------------------------------------
|
|
|
|
function Spawn( entityKeyValues )
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
|
|
if thisEntity == nil then
|
|
return
|
|
end
|
|
|
|
thisEntity.fOrigModelScale = thisEntity:GetModelScale()
|
|
|
|
thisEntity:AddNewModifier( nil, nil, "modifier_phased", { duration = -1 } )
|
|
|
|
thisEntity.hSunRayAbility = thisEntity:FindAbilityByName( "assault_captain_sun_ray" )
|
|
thisEntity.hChainsAbility = thisEntity:FindAbilityByName( "assault_captain_searing_chains" )
|
|
|
|
thisEntity:SetContextThink( "AssaultCaptainThink", AssaultCaptainThink, 0.5 )
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
function Precache( context )
|
|
PrecacheResource( "particle", "particles/creeps/lane_creeps/creep_dire_hulk_swipe_right.vpcf", context )
|
|
PrecacheResource( "particle", "particles/units/heroes/hero_ember_spirit/ember_spirit_searing_chains_start.vpcf", context )
|
|
PrecacheResource( "particle", "particles/units/heroes/hero_ember_spirit/ember_spirit_searing_chains_cast.vpcf", context )
|
|
PrecacheResource( "particle", "particles/units/heroes/hero_ember_spirit/ember_spirit_searing_chains_debuff.vpcf", context )
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
function AssaultCaptainThink()
|
|
if not IsServer() then
|
|
return
|
|
end
|
|
|
|
-- Search for items here instead of in Spawn, because they don't seem to exist yet when Spawn runs
|
|
if not thisEntity.bSearchedForItems then
|
|
SearchForItems()
|
|
thisEntity.bSearchedForItems = true
|
|
end
|
|
|
|
if ( not thisEntity:IsAlive() ) then
|
|
return -1
|
|
end
|
|
|
|
if GameRules:IsGamePaused() == true then
|
|
return 0.5
|
|
end
|
|
|
|
--[[
|
|
if thisEntity.fLastSearingCast then
|
|
print( "last searing cast: " .. thisEntity.fLastSearingCast )
|
|
end
|
|
|
|
if thisEntity.fLastSearingCast ~= nil and GameRules:GetGameTime() > ( thisEntity.fLastSearingCast + 1 ) then
|
|
ParticleManager:DestroyParticle( thisEntity.nPreviewFX, false )
|
|
thisEntity.fLastSearingCast = nil
|
|
end
|
|
]]
|
|
|
|
if thisEntity:HasModifier( "modifier_phoenix_sun_ray" ) then
|
|
return 0.25
|
|
else
|
|
thisEntity:SetModelScale( thisEntity.fOrigModelScale )
|
|
end
|
|
|
|
local hEnemies = FindUnitsInRadius( thisEntity:GetTeamNumber(), thisEntity:GetOrigin(), nil, 1200, DOTA_UNIT_TARGET_TEAM_ENEMY, DOTA_UNIT_TARGET_HERO, DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES + DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE, FIND_FARTHEST, false )
|
|
if #hEnemies == 0 then
|
|
return 0.5
|
|
end
|
|
|
|
if thisEntity.hChainsAbility ~= nil and thisEntity.hChainsAbility:IsFullyCastable() then
|
|
if ( thisEntity:GetHealthPercent() < 95 ) then
|
|
return CastSearingChains()
|
|
end
|
|
end
|
|
|
|
local hSunRayTarget = nil
|
|
for _, hEnemy in pairs( hEnemies ) do
|
|
if hEnemy and hEnemy:IsAlive() and hEnemy:IsRealHero() then
|
|
if hEnemy:HasModifier( "modifier_ember_spirit_searing_chains" ) or hEnemy:HasModifier( "modifier_rod_of_atos_debuff" ) then
|
|
hSunRayTarget = hEnemy
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
if hSunRayTarget ~= nil and thisEntity.hSunRayAbility ~= nil and thisEntity.hSunRayAbility:IsFullyCastable() then
|
|
if ( thisEntity:GetHealthPercent() < 95 ) then
|
|
return CastSunRay( hSunRayTarget )
|
|
end
|
|
end
|
|
|
|
--[[
|
|
if thisEntity.hRodOfAtosAbility and thisEntity.hRodOfAtosAbility:IsFullyCastable() then
|
|
if ( thisEntity:GetHealthPercent() < 100 ) then
|
|
print( "try to use atos" )
|
|
return UseRodOfAtos( hEnemies[ RandomInt( 1, #hEnemies ) ] )
|
|
end
|
|
end
|
|
]]
|
|
|
|
if thisEntity.hBlademailAbility and thisEntity.hBlademailAbility:IsFullyCastable() then
|
|
if ( thisEntity:GetHealthPercent() < 80 ) then
|
|
return UseBlademail()
|
|
end
|
|
end
|
|
|
|
return 0.5
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
function SearchForItems()
|
|
for i = 0, 5 do
|
|
local item = thisEntity:GetItemInSlot( i )
|
|
if item then
|
|
if item:GetAbilityName() == "item_blade_mail" then
|
|
thisEntity.hBlademailAbility = item
|
|
end
|
|
if item:GetAbilityName() == "item_rod_of_atos" then
|
|
thisEntity.hRodOfAtosAbility = item
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
function CastSunRay( hEnemy )
|
|
thisEntity:SetModelScale( 2 )
|
|
|
|
ExecuteOrderFromTable({
|
|
UnitIndex = thisEntity:entindex(),
|
|
OrderType = DOTA_UNIT_ORDER_CAST_POSITION,
|
|
Position = hEnemy:GetOrigin(),
|
|
AbilityIndex = thisEntity.hSunRayAbility:entindex(),
|
|
Queue = false,
|
|
})
|
|
|
|
return 0.5
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
|
|
function CastSearingChains()
|
|
if IsServer() then
|
|
--[[
|
|
print( "creating a warning particle" )
|
|
thisEntity.fLastSearingCast = GameRules:GetGameTime()
|
|
thisEntity.nPreviewFX = ParticleManager:CreateParticle( "particles/darkmoon_creep_warning.vpcf", PATTACH_ABSORIGIN_FOLLOW, thisEntity )
|
|
ParticleManager:SetParticleControlEnt( thisEntity.nPreviewFX, 0, thisEntity, PATTACH_ABSORIGIN_FOLLOW, nil, thisEntity:GetOrigin(), true )
|
|
ParticleManager:SetParticleControl( thisEntity.nPreviewFX, 1, Vector( 120, 120, 120 ) )
|
|
ParticleManager:SetParticleControl( thisEntity.nPreviewFX, 15, Vector( 180, 40, 10 ) )
|
|
]]
|
|
end
|
|
|
|
--thisEntity:SetSequence( "hit" )
|
|
|
|
ExecuteOrderFromTable({
|
|
UnitIndex = thisEntity:entindex(),
|
|
OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET,
|
|
AbilityIndex = thisEntity.hChainsAbility:entindex(),
|
|
Queue = false,
|
|
})
|
|
|
|
return 0.75
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
function UseRodOfAtos( hEnemy )
|
|
ExecuteOrderFromTable({
|
|
UnitIndex = thisEntity:entindex(),
|
|
OrderType = DOTA_UNIT_ORDER_CAST_TARGET,
|
|
TargetIndex = hEnemy:entindex(),
|
|
AbilityIndex = thisEntity.hRodOfAtosAbility:entindex(),
|
|
Queue = false,
|
|
})
|
|
|
|
return 1
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|
|
function UseBlademail()
|
|
|
|
ExecuteOrderFromTable({
|
|
UnitIndex = thisEntity:entindex(),
|
|
OrderType = DOTA_UNIT_ORDER_CAST_NO_TARGET,
|
|
AbilityIndex = thisEntity.hBlademailAbility:entindex(),
|
|
Queue = false,
|
|
})
|
|
|
|
return 2
|
|
end
|
|
|
|
--------------------------------------------------------------------------------
|
|
|