Хочу сделать способность, чтобы работала так: Когда у союзного героя здоровье меньше 40%, то наш герой получает бафф к скорости передвижения. Это работает нормально, только если у нас есть 1 союзник, но если их больше 2-х и у одного меньше 40%, а у другого больше 40%, то бафф начинает то появляться, то пропадать.
Код такой:
в Datadriven
в LUA
Код такой:
в Datadriven
Код:
"soraka_salvation"
{
"BaseClass" "ability_datadriven"
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"SpellImmunityType" "SPELL_IMMUNITY_ENEMIES_YES"
"AbilityTextureName" "Soraka_Passive"
"precache"
{
"particle" "particles/units/heroes/hero_bloodseeker/bloodseeker_thirst_owner.vpcf"
"particle" "particles/status_fx/status_effect_thirst_vision.vpcf"
"particle" "particles/units/heroes/hero_bloodseeker/bloodseeker_vision.vpcf"
}
// Special
//-------------------------------------------------------------------------------------------------------------
"AbilitySpecial"
{
"01"
{
"var_type" "FIELD_INTEGER"
"buff_threshold_pct" "40"
}
"02"
{
"var_type" "FIELD_INTEGER"
"bonus_movement_speed" "5 10 15 20"
}
"03"
{
"var_type" "FIELD_INTEGER"
"global_radius" "100000"
}
}
"Modifiers"
{
"modifier_soraka"
{
"IsHidden" "1"
"Passive" "1"
"Aura" "modifier_soraka_check_health"
"Aura_Radius" "%global_radius"
"Aura_Teams" "DOTA_UNIT_TARGET_TEAM_FRIENDLY"
"Aura_Types" "DOTA_UNIT_TARGET_HERO"
"Aura_Flags" "DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO"
"Aura_ApplyToCaster" "0"
}
"modifier_soraka_check_health"
{
"IsBuff" "1"
"IsPurgable" "0"
"IsHidden" "0"
"OnTakeDamage"
{
"RunScript"
{
"ScriptFile" "heroes/soraka/salvation.lua"
"Function" "CheckHealth"
}
}
"OnHealReceived"
{
"RunScript"
{
"ScriptFile" "heroes/soraka/salvation.lua"
"Function" "CheckHealth"
}
}
}
"modifier_soraka_buff"
{
"IsHidden" "0"
"Passive" "1"
"Properties"
{
"MODIFIER_PROPERTY_MOVESPEED_BONUS_PERCENTAGE" "%bonus_movement_speed"
}
}
}
}
Код:
function CheckHealth(keys)
local caster = keys.caster -- Hero
local ability = keys.ability
local buff_modifier = "modifier_soraka_buff"
local buff_threshold = ability:GetLevelSpecialValueFor( "buff_threshold_pct", ability:GetLevel() - 1 )/100
local target = keys.unit
local healthPercentage = target:GetHealth() / target:GetMaxHealth()
local previous_stacks = caster:GetModifierStackCount(buff_modifier, ability)
if target:IsAlive() and healthPercentage < buff_threshold then
caster:SetModifierStackCount(buff_modifier, ability, 2)
else
caster:SetModifierStackCount(buff_modifier, ability, 0)
end
end