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

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
--------------------------------------------------------------------------------