Исходник Немного пассивных способностей

iia3uk666

Друзья CG
18 Дек 2021
411
70
Проект
Ушел с CG
Добрый день господа, мододелы, вот вам небольшой сборник пассивных способностей
У вас уже должна быть база (какой то начальный проект)
Установка в 3х пунктах:
Берем из спойлера - Абилку, которая вам понравилась
1.1] Идем по пути: :\steam\steamapps\common\dota 2 beta\game\dota_addons\***\npc\ в файлик: npc_abilities_custom.txt
1.2] Вставляем абилку между фигурных скобок
"DOTAAbilities"
{
}
1.3] Строки:
"ScriptFile" "heroes/passive/legion_Armor" - ПУТЬ К LUA файлу (P.S. Если вы оставили скрипт в корне VSCRIPTS => Путь будет: "Ваше название скрипта, без расширения *.lua")
"AbilityTextureName" "specal/armor" - ПУТЬ К Иконке 128х128 .png (Полный путь: :\steam\steamapps\common\dota 2 beta\game\dota_addons\**\resource\flash3\images\spellicons\specal\)
Берем из спойлера - LUA, которая вам понравилась
2.1] Идем по пути: :\steam\steamapps\common\dota 2 beta\game\dota_addons\***\scripts\vscripts\ (* - диск, **** - ваша карта) p.s. По желанию можно разделить папками ваши абилки
Пример из сборника пассивок: :\steam\steamapps\common\dota 2 beta\game\dota_addons\***\scripts\vscripts\hero\Passive (Добавилась 1 папка и подпапка)
2.2] Создаем файл с расширением *.lua и вставляем в него код
2.3] Если у вас другие папки/подпапки или вовсе вы создали *.lua в корне vscripts то редактируем путь в коде:
Находим строчку: LinkLuaModifier("modifier_legion_Armor", "heroes/Passive/legion_Armor", LUA_MODIFIER_MOTION_NONE)
Меняем в кавычках путь: "heroes/Passive/legion_Armor" => "Ваш путь к LUA, без расширения *.lua"
P.S. Если вы оставили скрипт в корне VSCRIPTS => Путь будет: "Ваше название скрипта, без расширения *.lua"
P.s. содержание строки зависит от пассивки/модификатора, главное это путь к скрипту!
Берем из спойлера - Ру локаль, от абилки которая вам понравилась
3.1]Идем по пути: :\steam\steamapps\common\dota 2 beta\game\dota_addons\***\resource\ (* - диск, **** - ваша карта)
3.2] Открываем / создаем файлик: addon_russian.txt
3.3] Вставляем строки между:

"lang"
{
"Language" "russian"
"Tokens"
{
"addon_game_name" "Название вашей карты на ру"
Вот сюда уже строки
}
}

Код:
"passive_Legion_Armor"
   {
      "BaseClass"                "ability_lua"
      "ScriptFile"            "heroes/passive/legion_Armor"
      "AbilityTextureName"      "specal/armor"
      "MaxLevel"             "5"

      "AbilityType"           "DOTA_ABILITY_TYPE_BASIC"
      "AbilityBehavior"        "DOTA_ABILITY_BEHAVIOR_PASSIVE"

      "AbilitySpecial"
      {
         "01"
         {
            "var_type"       "FIELD_INTEGER"
            "bonus_armor"     "3 7 12 16 23"
         }
         "02"
         {
            "var_type"       "FIELD_INTEGER"
            "bonus_resist"    "4 8 12 16 20"
         }
      }
   }
Lua:
passive_Legion_Armor = class({})

LinkLuaModifier("modifier_passive_Legion_Armor", "heroes/passive/legion_Armor", LUA_MODIFIER_MOTION_NONE)

function passive_Legion_Armor:GetIntrinsicModifierName()
    return "modifier_passive_Legion_Armor"
end

modifier_passive_Legion_Armor = class({})

function modifier_passive_Legion_Armor:IsHidden() return true end
function modifier_passive_Legion_Armor:IsDebuff() return false end
function modifier_passive_Legion_Armor:IsPurgable() return false end
function modifier_passive_Legion_Armor:GetAttributes() return MODIFIER_ATTRIBUTE_PERMANENT + MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE end

function modifier_passive_Legion_Armor:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS,
        MODIFIER_PROPERTY_STATUS_RESISTANCE_STACKING,
    }
    return funcs
end

function modifier_passive_Legion_Armor:GetModifierPhysicalArmorBonus()
    return self:GetAbility():GetSpecialValueFor("bonus_armor")
end

function modifier_passive_Legion_Armor:GetModifierStatusResistanceStacking()
    return self:GetAbility():GetSpecialValueFor("bonus_resist")
end
Код:
        "DOTA_Tooltip_ability_Passive_Legion_Armor"                                    "Броня легиона"
        "DOTA_Tooltip_ability_Passive_Legion_Armor_Description"                        "Увеличивает броню на %bonus_armor% и сопротивление эффектам на %bonus_resist%%%."
        "DOTA_Tooltip_ability_Passive_Legion_Armor_lore"                            "Дарует вам броню Легендарного легиона, прошло уже более 1000 лет, а их сталь все ещё крепче любого металла!"
Код:
    "passive_honed_mastery_of_weapons"
        {
            "BaseClass"                    "ability_lua"
            "ScriptFile"                "heroes/passive/mastery_of_weapons"
            "AbilityTextureName"        "specal/war"
            "MaxLevel"                    "5"

            "AbilityType"                "DOTA_ABILITY_TYPE_BASIC"
            "AbilityBehavior"            "DOTA_ABILITY_BEHAVIOR_PASSIVE"

            "AbilitySpecial"
            {
                "01"
                {
                    "var_type"            "FIELD_INTEGER"
                    "bonus_dmg"            "3 10 23 28 30"
                }
            }
        }
Lua:
passive_honed_mastery_of_weapons = class({})

LinkLuaModifier("modifier_passive_honed_mastery_of_weapons", "heroes/passive/mastery_of_weapons", LUA_MODIFIER_MOTION_NONE)

function passive_honed_mastery_of_weapons:GetIntrinsicModifierName()
    return "modifier_passive_honed_mastery_of_weapons"
end





modifier_passive_honed_mastery_of_weapons = class({})

function modifier_passive_honed_mastery_of_weapons:IsHidden() return true end
function modifier_passive_honed_mastery_of_weapons:IsDebuff() return false end
function modifier_passive_honed_mastery_of_weapons:IsPurgable() return false end
function modifier_passive_honed_mastery_of_weapons:GetAttributes() return MODIFIER_ATTRIBUTE_PERMANENT + MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE end

function modifier_passive_honed_mastery_of_weapons:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_DAMAGEOUTGOING_PERCENTAGE
    }
    return funcs
end

function modifier_passive_honed_mastery_of_weapons:GetModifierDamageOutgoing_Percentage()
    return self:GetAbility():GetSpecialValueFor("bonus_dmg")
end

function modifier_passive_honed_mastery_of_weapons:CheckState()
    return {
        [MODIFIER_STATE_CANNOT_MISS] = true,
    }
end
Код:
        "DOTA_Tooltip_ability_passive_honed_mastery_of_weapons"                                    "Мастерство владения оружием"
        "DOTA_Tooltip_ability_passive_honed_mastery_of_weapons_Description"                        "Дарует <font color='#B694FF'> <b>атаки без промахов</b> </font> и %bonus_dmg%%% дополнительного урона."
        "DOTA_Tooltip_ability_passive_honed_mastery_of_weapons_lore"                                "Непрерывная тренировка оттачивает оружие воина в его собственное продолжение."
Код:
"passive_influx_of_life"
        {
            "BaseClass"                    "ability_lua"
            "ScriptFile"                "heroes/passive/influx_of_life"
            "AbilityTextureName"        "specal/heal"
            "MaxLevel"                    "5"

            "AbilityType"                "DOTA_ABILITY_TYPE_BASIC"
            "AbilityBehavior"            "DOTA_ABILITY_BEHAVIOR_PASSIVE"

            "AbilitySpecial"
            {
                "01"
                {
                    "var_type"            "FIELD_INTEGER"
                    "bonus_heal"        "3 6 9 12 16"
                }
                "02"
                {
                    "var_type"            "FIELD_INTEGER"
                    "percent_heal"        "1"
                }
            }
        }
Lua:
passive_influx_of_life = class({})

LinkLuaModifier("modifier_passive_influx_of_life", "heroes/passive/influx_of_life", LUA_MODIFIER_MOTION_NONE)

function passive_influx_of_life:GetIntrinsicModifierName()
    return "modifier_passive_influx_of_life"
end

modifier_passive_influx_of_life = class({})

function modifier_passive_influx_of_life:IsHidden() return true end
function modifier_passive_influx_of_life:IsDebuff() return false end
function modifier_passive_influx_of_life:IsPurgable() return false end
function modifier_passive_influx_of_life:GetAttributes() return MODIFIER_ATTRIBUTE_PERMANENT + MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE end

function modifier_passive_influx_of_life:OnCreated()
    self:OnRefresh()
end

function modifier_passive_influx_of_life:OnRefresh()
    self.bonus_heal = self:GetAbility():GetSpecialValueFor("bonus_heal")
    self.percent_heal = self:GetAbility():GetSpecialValueFor("percent_heal")
end

function modifier_passive_influx_of_life:DeclareFunctions()
    return {
        MODIFIER_PROPERTY_HEAL_AMPLIFY_PERCENTAGE_SOURCE,
        MODIFIER_PROPERTY_HP_REGEN_AMPLIFY_PERCENTAGE,
        MODIFIER_PROPERTY_HEALTH_REGEN_PERCENTAGE
    }
end

function modifier_passive_influx_of_life:GetModifierHealAmplify_PercentageSource()
    return self.bonus_heal or 0
end

function modifier_passive_influx_of_life:GetModifierHPRegenAmplify_Percentage()
    return self.bonus_heal or 0
end

function modifier_passive_influx_of_life:GetModifierHealthRegenPercentage()
    return self.percent_heal or 0
end
Код:
        "DOTA_Tooltip_ability_passive_influx_of_life"                                    "Приток жизни"
        "DOTA_Tooltip_ability_passive_influx_of_life_Description"                        "Увеличивает исходящее лечение и восстановление здоровья на %bonus_heal%%%."
        "DOTA_Tooltip_ability_passive_influx_of_life_lore"                                "Годы медитаций позволили вам восстанавливаться гораздо быстрее чем обычный человек"
Код:
"passive_magical_exhaustion"
        {
            "BaseClass"                    "ability_lua"
            "ScriptFile"                "heroes/passive/magical_exhaustion"
            "AbilityTextureName"        "specal/mag_debaf"
            "MaxLevel"                    "5"

            "AbilityType"                "DOTA_ABILITY_TYPE_BASIC"
            "AbilityBehavior"            "DOTA_ABILITY_BEHAVIOR_PASSIVE"

            "AbilitySpecial"
            {
                "01"
                {
                    "var_type"            "FIELD_INTEGER"
                    "magic_resist"        "8 14 17 22 25"
                }
                "02"
                {
                    "var_type"            "FIELD_INTEGER"
                    "status_resist"        "8 14 17 22 25"
                }
            }
        }
Lua:
passive_magical_exhaustion = class({})

LinkLuaModifier("modifier_passive_magical_exhaustion", "heroes/passive/magical_exhaustion", LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier("modifier_passive_magical_exhaustion_aura", "heroes/passive/magical_exhaustion", LUA_MODIFIER_MOTION_NONE)

function passive_magical_exhaustion:GetIntrinsicModifierName()
    return "modifier_passive_magical_exhaustion"
end

modifier_passive_magical_exhaustion = class({})

function modifier_passive_magical_exhaustion:IsHidden() return true end
function modifier_passive_magical_exhaustion:IsDebuff() return false end
function modifier_passive_magical_exhaustion:IsPurgable() return false end
function modifier_passive_magical_exhaustion:GetAttributes() return MODIFIER_ATTRIBUTE_PERMANENT + MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE end


function modifier_passive_magical_exhaustion:IsAura() return true end
function modifier_passive_magical_exhaustion:GetAuraRadius() return 1200 end
function modifier_passive_magical_exhaustion:GetAuraSearchTeam() return DOTA_UNIT_TARGET_TEAM_ENEMY end
function modifier_passive_magical_exhaustion:GetAuraSearchType() return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC end
function modifier_passive_magical_exhaustion:GetModifierAura() return "modifier_passive_magical_exhaustion_aura" end



modifier_passive_magical_exhaustion_aura = class({})

function modifier_passive_magical_exhaustion:IsDebuff() return false end
function modifier_passive_magical_exhaustion:IsPurgable() return false end

function modifier_passive_magical_exhaustion_aura:DeclareFunctions()
    return {
        MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS,
        MODIFIER_PROPERTY_STATUS_RESISTANCE_STACKING
    }
end

function modifier_passive_magical_exhaustion_aura:OnCreated()
    local ability = self:GetAbility()
    if (not ability) or ability:IsNull() then return end

    self.magic_resist = (-1) * ability:GetSpecialValueFor("magic_resist")
    self.status_resist = (-1) * ability:GetSpecialValueFor("status_resist")
end

function modifier_passive_magical_exhaustion_aura:GetModifierMagicalResistanceBonus()
    return self.magic_resist or 0
end

function modifier_passive_magical_exhaustion_aura:GetModifierStatusResistanceStacking()
    return self.status_resist or 0
end

function modifier_passive_magical_exhaustion_aura:GetEffectName()
    return "particles/dev/library/base_item_attachment_magic.vpcf"
end

function modifier_passive_magical_exhaustion_aura:GetEffectAttachType()
    return PATTACH_OVERHEAD_FOLLOW
end

function modifier_passive_magical_exhaustion_aura:ShouldUseOverheadOffset()
    return false
end
Код:
        "DOTA_Tooltip_ability_passive_magical_exhaustion"                                "Магическое подавление"
        "DOTA_Tooltip_ability_passive_magical_exhaustion_Description"                    "Вы уменьшаете у ближайших врагов магическое сопротивление на %magic_resist%%% и сопротивление эффектам на %status_resist%%%."
        "DOTA_Tooltip_ability_passive_magical_exhaustion_lore"                            "Отсутствие вашей души нервирует всех ближайших живых существ, снижая их естественную защиту от магии и странностей в целом."
        "DOTA_Tooltip_modifier_passive_magical_exhaustion_aura"                                "Магическое подавление"
        "DOTA_Tooltip_modifier_passive_magical_exhaustion_aura_Description"                            "Ваше магическое сопротивление и сопротивление эффектам снижено"
Код:
"passive_attack_speed"
        {
            "BaseClass"                    "ability_lua"
            "ScriptFile"                "heroes/passive/attack_speed"
            "AbilityTextureName"        "specal/add_speed_damage"
            "MaxLevel"                    "1"

            "AbilityType"                "DOTA_ABILITY_TYPE_BASIC"
            "AbilityBehavior"            "DOTA_ABILITY_BEHAVIOR_PASSIVE"

            "AbilitySpecial"
            {
                "01"
                {
                    "var_type"                    "FIELD_INTEGER"
                    "bonus_attack_speed"        "15"
                }
            }
        }
Lua:
passive_attack_speed = class({})

LinkLuaModifier("modifier_passive_attack_speed", "heroes/passive/attack_speed", LUA_MODIFIER_MOTION_NONE)

function passive_attack_speed:GetIntrinsicModifierName()
    return "modifier_passive_attack_speed"
end

modifier_passive_attack_speed = class({})

function modifier_passive_attack_speed:IsHidden() return true end
function modifier_passive_attack_speed:IsDebuff() return false end
function modifier_passive_attack_speed:IsPurgable() return false end
function modifier_passive_attack_speed:GetAttributes() return MODIFIER_ATTRIBUTE_PERMANENT + MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE end

function modifier_passive_attack_speed:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT,
    }
    return funcs
end

function modifier_passive_attack_speed:OnCreated()
    self.multiplier = self:GetAbility():GetLevelSpecialValueFor("bonus_attack_speed", 1)
    self.attack_speed_bonus = self:GetParent():GetAttackSpeed() * self.multiplier
    self:StartIntervalThink(1)
end

function modifier_passive_attack_speed:OnIntervalThink()
    self.attack_speed_bonus = (self:GetParent():GetAttackSpeed() - self.attack_speed_bonus * 0.01) * self.multiplier
end

function modifier_passive_attack_speed:GetModifierAttackSpeedBonus_Constant()
    return self.attack_speed_bonus
end
Код:
        "DOTA_Tooltip_ability_passive_attack_speed"                                    "Ускорение атак"
        "DOTA_Tooltip_ability_passive_attack_speed_Description"                        "Увеличивает скорость атаки на %bonus_attack_speed%%%."
        "DOTA_Tooltip_ability_passive_attack_speed_lore"                            "Когда вы тренируетесь вы оттачиваете мастерство скорости, что позволило вам быстрее производить атаки"
Код:
 "passive_fatal_wound"
        {
            "BaseClass"                    "ability_lua"
            "ScriptFile"                "heroes/passive/fatal_wound"
            "AbilityTextureName"        "specal/crit_hit"
            "MaxLevel"                    "5"

            "AbilityType"                "DOTA_ABILITY_TYPE_BASIC"
            "AbilityBehavior"            "DOTA_ABILITY_BEHAVIOR_PASSIVE"

            "AbilitySpecial"
            {
                "01"
                {
                    "var_type"                    "FIELD_FLOAT"
                    "pct_health_threshold"        "95.0"
                }
                "02"
                {
                    "var_type"                    "FIELD_FLOAT"
                    "damage_multiplier"            "100.0 200.0 300.0 400.0 500.0"
                }
            }
        }
Lua:
passive_fatal_wound = class({})

LinkLuaModifier("modifier_passive_fatal_wound", "heroes/passive/fatal_wound", LUA_MODIFIER_MOTION_NONE)

function passive_fatal_wound:GetIntrinsicModifierName()
    return "modifier_passive_fatal_wound"
end





modifier_passive_fatal_wound = class({})

function modifier_passive_fatal_wound:IsHidden() return true end
function modifier_passive_fatal_wound:IsDebuff() return false end
function modifier_passive_fatal_wound:IsPurgable() return false end
function modifier_passive_fatal_wound:GetAttributes() return MODIFIER_ATTRIBUTE_PERMANENT + MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE end

function modifier_passive_fatal_wound:GetMultiplier(victim)
    local ability = self:GetAbility()
    local damage_multiplier = 1

    if (ability and victim:GetTeam() == ability:GetTeam()) then
        return damage_multiplier
    end

    if ability and (not ability:IsNull()) and victim:GetHealthPercent() >= ability:GetSpecialValueFor("pct_health_threshold") then
        damage_multiplier = 0.01 * ability:GetSpecialValueFor("damage_multiplier")

        local blitz_pfx = ParticleManager:CreateParticle("particles/econ/items/void_spirit/void_spirit_immortal_2021/void_spirit_immortal_2021_astral_step_dmg_blood.vpcf", PATTACH_ABSORIGIN_FOLLOW, victim)
        ParticleManager:SetParticleControl(blitz_pfx, 0, victim:GetAbsOrigin())
        ParticleManager:ReleaseParticleIndex(blitz_pfx)
    end

    return damage_multiplier
end


function modifier_passive_fatal_wound:DeclareFunctions()
    return {
        MODIFIER_PROPERTY_TOTALDAMAGEOUTGOING_PERCENTAGE,
    }
end

function modifier_passive_fatal_wound:GetModifierTotalDamageOutgoing_Percentage(params)
    local multiplier = self:GetMultiplier(params.target)
    if multiplier > 1 then
        SendOverheadEventMessage(nil, OVERHEAD_ALERT_CRITICAL, params.target, params.original_damage * multiplier, nil)
    end
    return (multiplier - 1) * 100
end
Код:
        "DOTA_Tooltip_ability_passive_fatal_wound"                                "Смертельный удар"
        "DOTA_Tooltip_ability_passive_fatal_wound_Description"                    "Любой урон нанесённый врагам с высоким уровнем больше %pct_health_threshold%%% здоровья, является автоматическим %damage_multiplier%%% критом."
        "DOTA_Tooltip_ability_passive_fatal_wound_lore"                            "Оттачивая своё мастерство вы уже наперед знаете и видите все слабые места противника"
Код:
"passive_armor_destroyer"
            {
                "BaseClass"                    "ability_lua"
                "ScriptFile"                "heroes/passive/armor_destroyer"
                "AbilityTextureName"        "specal/armorDebaf"
                "MaxLevel"                    "5"

                "AbilityType"                "DOTA_ABILITY_TYPE_BASIC"
                "AbilityBehavior"            "DOTA_ABILITY_BEHAVIOR_PASSIVE"

                "AbilitySpecial"
                {
                    "01"
                    {
                        "var_type"            "FIELD_FLOAT"
                        "armor_tear"        "0.2 0.5 0.8 1.0 1.3"
                    }
                }
            }
Lua:
passive_armor_destroyer = class({})

LinkLuaModifier("modifier_passive_armor_destroyer", "heroes/passive/armor_destroyer", LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier("modifier_passive_armor_destroyer_tear", "heroes/passive/armor_destroyer", LUA_MODIFIER_MOTION_NONE)

function passive_armor_destroyer:GetIntrinsicModifierName()
    return "modifier_passive_armor_destroyer"
end


modifier_passive_armor_destroyer = class({})

function modifier_passive_armor_destroyer:IsHidden() return true end
function modifier_passive_armor_destroyer:IsDebuff() return false end
function modifier_passive_armor_destroyer:IsPurgable() return false end
function modifier_passive_armor_destroyer:GetAttributes() return MODIFIER_ATTRIBUTE_PERMANENT + MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE end

function modifier_passive_armor_destroyer:DeclareFunctions()
    if IsServer() then return { MODIFIER_PROPERTY_PROCATTACK_FEEDBACK } end
end

function modifier_passive_armor_destroyer:OnCreated()
    if IsClient() then return end

    self:GetParent():SetRangedProjectileName("particles/items_fx/desolator_projectile.vpcf")
    
end

function modifier_passive_armor_destroyer:GetModifierProcAttack_Feedback(keys)
    if keys.target:GetTeamNumber() == keys.attacker:GetTeamNumber() then return end

    keys.target:EmitSound("Item_Desolator.Target")

    local modifier_rend = keys.target:AddNewModifier(keys.attacker, self:GetAbility(), "modifier_passive_armor_destroyer_tear", {})
    if modifier_rend and not modifier_rend:IsNull() then modifier_rend:IncrementStackCount() end
end



modifier_passive_armor_destroyer_tear = class({})

function modifier_passive_armor_destroyer_tear:IsHidden() return false end
function modifier_passive_armor_destroyer_tear:IsDebuff() return true end
function modifier_passive_armor_destroyer_tear:IsPurgable() return false end
function modifier_passive_armor_destroyer_tear:GetTexture() return "specal/armorDebaf" end

function modifier_passive_armor_destroyer_tear:DeclareFunctions()
    return {
        MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS
    }
end

function modifier_passive_armor_destroyer_tear:OnCreated()
    self.armor_tear = (-1) * self:GetAbility():GetSpecialValueFor("armor_tear")

    if IsClient() then return end

    self.rend_pfx = ParticleManager:CreateParticle("particles/units/heroes/hero_monkey_king/monkey_king_jump_armor_debuff_model.vpcf", PATTACH_OVERHEAD_FOLLOW, self:GetParent())
    ParticleManager:SetParticleControlEnt(self.rend_pfx, 0, self:GetParent(), PATTACH_OVERHEAD_FOLLOW, "follow_overhead", self:GetParent():GetAbsOrigin(), false)
    ParticleManager:SetParticleControl(self.rend_pfx, 2, Vector(1,0,0))
end

function modifier_passive_armor_destroyer_tear:OnStackCountChanged()
    if self.rend_pfx then
        ParticleManager:SetParticleControl(self.rend_pfx, 2, Vector(self:GetStackCount(), 0, 0))
    end
end

function modifier_passive_armor_destroyer_tear:OnDestroy()
    if self.rend_pfx then
        ParticleManager:DestroyParticle(self.rend_pfx, false)
        ParticleManager:ReleaseParticleIndex(self.rend_pfx)
    end
end

function modifier_passive_armor_destroyer_tear:GetModifierPhysicalArmorBonus()
    return self.armor_tear * self:GetStackCount()
end

function modifier_passive_armor_destroyer_tear:OnRoundEndForTeam(keys)
    self:OnPvpEndedForDuelists(keys)
end

function modifier_passive_armor_destroyer_tear:OnPvpEndedForDuelists(keys)
    if IsClient() then return end

    self:Destroy()
end
Код:
        "DOTA_Tooltip_ability_passive_armor_destroyer"                                        "Разрушитель брони"
        "DOTA_Tooltip_ability_passive_armor_destroyer_Description"                            "Ваши атаки уменьшают броню врага на %armor_tear% до конца его жизни.<br><br>Складывается бесконечно."
        "DOTA_Tooltip_ability_passive_armor_destroyer_lore"                                    "Рвать и метать... До самого конца!"
        "DOTA_Tooltip_modifier_passive_armor_destroyer_tear"                                "Броня сломана"
        "DOTA_Tooltip_modifier_passive_armor_destroyer_tear_Description"                    "Ваша броня поломана, без шанса на восстановление"
 
Привет. Не знаешь, как сделать так, чтобы пассивка добавляла стак, когда ты прожимаешь другой скилл? Например есть пассивка сларка, но она стакается не от атак, а например от прожатия паунса.
 
Привет. Не знаешь, как сделать так, чтобы пассивка добавляла стак, когда ты прожимаешь другой скилл? Например есть пассивка сларка, но она стакается не от атак, а например от прожатия паунса.
Берешь Lua паунса , берешь Lua пассивки, смотришь - что добавляет стаки , думоешь, копируешь нужные строки в новый паунс , готово

Написать за тебя скилл мне
1 - лениво
2 - доты у меня нет я давно в нее не захожу
 
Привет. Не знаешь, как сделать так, чтобы пассивка добавляла стак, когда ты прожимаешь другой скилл? Например есть пассивка сларка, но она стакается не от атак, а например от прожатия паунса.
сделай по аналгии, тот скрипт что в мрдифаере на событие OnAttack
Перенеси в OnSpellStart
единственное тебе нужно найти модифаер
modifier = caster:FindModifierByName
 
Добрый день господа, мододелы, вот вам небольшой сборник пассивных способностей
У вас уже должна быть база (какой то начальный проект)
Установка в 3х пунктах:
Берем из спойлера - Абилку, которая вам понравилась
1.1] Идем по пути: :\steam\steamapps\common\dota 2 beta\game\dota_addons\***\npc\ в файлик: npc_abilities_custom.txt
1.2] Вставляем абилку между фигурных скобок
"DOTAAbilities"
{
}
1.3] Строки:
"ScriptFile" "heroes/passive/legion_Armor" - ПУТЬ К LUA файлу (P.S. Если вы оставили скрипт в корне VSCRIPTS => Путь будет: "Ваше название скрипта, без расширения *.lua")
"AbilityTextureName" "specal/armor" - ПУТЬ К Иконке 128х128 .png (Полный путь: :\steam\steamapps\common\dota 2 beta\game\dota_addons\**\resource\flash3\images\spellicons\specal\)
Берем из спойлера - LUA, которая вам понравилась
2.1] Идем по пути: :\steam\steamapps\common\dota 2 beta\game\dota_addons\\scripts\vscripts\ ( - диск, ** - ваша карта) p.s. По желанию можно разделить папками ваши абилки
Пример из сборника пассивок: :\steam\steamapps\common\dota 2 beta\game\dota_addons\***\scripts\vscripts\hero\Passive (Добавилась 1 папка и подпапка)
2.2] Создаем файл с расширением *.lua и вставляем в него код
2.3] Если у вас другие папки/подпапки или вовсе вы создали *.lua в корне vscripts то редактируем путь в коде:
Находим строчку: LinkLuaModifier("modifier_legion_Armor", "heroes/Passive/legion_Armor", LUA_MODIFIER_MOTION_NONE)
Меняем в кавычках путь: "heroes/Passive/legion_Armor" => "Ваш путь к LUA, без расширения *.lua"
P.S. Если вы оставили скрипт в корне VSCRIPTS => Путь будет: "Ваше название скрипта, без расширения *.lua"
P.s. содержание строки зависит от пассивки/модификатора, главное это путь к скрипту!
Берем из спойлера - Ру локаль, от абилки которая вам понравилась
3.1]Идем по пути: :\steam\steamapps\common\dota 2 beta\game\dota_addons\\resource\ ( - диск, ** - ваша карта)
3.2] Открываем / создаем файлик: addon_russian.txt
3.3] Вставляем строки между:

"lang"
{
"Language" "russian"
"Tokens"
{
"addon_game_name" "Название вашей карты на ру"
Вот сюда уже строки
}
}

Код:
"passive_Legion_Armor"
   {
      "BaseClass"                "ability_lua"
      "ScriptFile"            "heroes/passive/legion_Armor"
      "AbilityTextureName"      "specal/armor"
      "MaxLevel"             "5"

      "AbilityType"           "DOTA_ABILITY_TYPE_BASIC"
      "AbilityBehavior"        "DOTA_ABILITY_BEHAVIOR_PASSIVE"

      "AbilitySpecial"
      {
         "01"
         {
            "var_type"       "FIELD_INTEGER"
            "bonus_armor"     "3 7 12 16 23"
         }
         "02"
         {
            "var_type"       "FIELD_INTEGER"
            "bonus_resist"    "4 8 12 16 20"
         }
      }
   }
Lua:
passive_Legion_Armor = class({})

LinkLuaModifier("modifier_passive_Legion_Armor", "heroes/passive/legion_Armor", LUA_MODIFIER_MOTION_NONE)

function passive_Legion_Armor:GetIntrinsicModifierName()
    return "modifier_passive_Legion_Armor"
end

modifier_passive_Legion_Armor = class({})

function modifier_passive_Legion_Armor:IsHidden() return true end
function modifier_passive_Legion_Armor:IsDebuff() return false end
function modifier_passive_Legion_Armor:IsPurgable() return false end
function modifier_passive_Legion_Armor:GetAttributes() return MODIFIER_ATTRIBUTE_PERMANENT + MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE end

function modifier_passive_Legion_Armor:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS,
        MODIFIER_PROPERTY_STATUS_RESISTANCE_STACKING,
    }
    return funcs
end

function modifier_passive_Legion_Armor:GetModifierPhysicalArmorBonus()
    return self:GetAbility():GetSpecialValueFor("bonus_armor")
end

function modifier_passive_Legion_Armor:GetModifierStatusResistanceStacking()
    return self:GetAbility():GetSpecialValueFor("bonus_resist")
end
Код:
        "DOTA_Tooltip_ability_Passive_Legion_Armor"                                    "Броня легиона"
        "DOTA_Tooltip_ability_Passive_Legion_Armor_Description"                        "Увеличивает броню на %bonus_armor% и сопротивление эффектам на %bonus_resist%%%."
        "DOTA_Tooltip_ability_Passive_Legion_Armor_lore"                            "Дарует вам броню Легендарного легиона, прошло уже более 1000 лет, а их сталь все ещё крепче любого металла!"
Код:
    "passive_honed_mastery_of_weapons"
        {
            "BaseClass"                    "ability_lua"
            "ScriptFile"                "heroes/passive/mastery_of_weapons"
            "AbilityTextureName"        "specal/war"
            "MaxLevel"                    "5"

            "AbilityType"                "DOTA_ABILITY_TYPE_BASIC"
            "AbilityBehavior"            "DOTA_ABILITY_BEHAVIOR_PASSIVE"

            "AbilitySpecial"
            {
                "01"
                {
                    "var_type"            "FIELD_INTEGER"
                    "bonus_dmg"            "3 10 23 28 30"
                }
            }
        }
Lua:
passive_honed_mastery_of_weapons = class({})

LinkLuaModifier("modifier_passive_honed_mastery_of_weapons", "heroes/passive/mastery_of_weapons", LUA_MODIFIER_MOTION_NONE)

function passive_honed_mastery_of_weapons:GetIntrinsicModifierName()
    return "modifier_passive_honed_mastery_of_weapons"
end





modifier_passive_honed_mastery_of_weapons = class({})

function modifier_passive_honed_mastery_of_weapons:IsHidden() return true end
function modifier_passive_honed_mastery_of_weapons:IsDebuff() return false end
function modifier_passive_honed_mastery_of_weapons:IsPurgable() return false end
function modifier_passive_honed_mastery_of_weapons:GetAttributes() return MODIFIER_ATTRIBUTE_PERMANENT + MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE end

function modifier_passive_honed_mastery_of_weapons:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_DAMAGEOUTGOING_PERCENTAGE
    }
    return funcs
end

function modifier_passive_honed_mastery_of_weapons:GetModifierDamageOutgoing_Percentage()
    return self:GetAbility():GetSpecialValueFor("bonus_dmg")
end

function modifier_passive_honed_mastery_of_weapons:CheckState()
    return {
        [MODIFIER_STATE_CANNOT_MISS] = true,
    }
end
Код:
        "DOTA_Tooltip_ability_passive_honed_mastery_of_weapons"                                    "Мастерство владения оружием"
        "DOTA_Tooltip_ability_passive_honed_mastery_of_weapons_Description"                        "Дарует <font color='#B694FF'> <b>атаки без промахов</b> </font> и %bonus_dmg%%% дополнительного урона."
        "DOTA_Tooltip_ability_passive_honed_mastery_of_weapons_lore"                                "Непрерывная тренировка оттачивает оружие воина в его собственное продолжение."
Код:
"passive_influx_of_life"
        {
            "BaseClass"                    "ability_lua"
            "ScriptFile"                "heroes/passive/influx_of_life"
            "AbilityTextureName"        "specal/heal"
            "MaxLevel"                    "5"

            "AbilityType"                "DOTA_ABILITY_TYPE_BASIC"
            "AbilityBehavior"            "DOTA_ABILITY_BEHAVIOR_PASSIVE"

            "AbilitySpecial"
            {
                "01"
                {
                    "var_type"            "FIELD_INTEGER"
                    "bonus_heal"        "3 6 9 12 16"
                }
                "02"
                {
                    "var_type"            "FIELD_INTEGER"
                    "percent_heal"        "1"
                }
            }
        }
Lua:
passive_influx_of_life = class({})

LinkLuaModifier("modifier_passive_influx_of_life", "heroes/passive/influx_of_life", LUA_MODIFIER_MOTION_NONE)

function passive_influx_of_life:GetIntrinsicModifierName()
    return "modifier_passive_influx_of_life"
end

modifier_passive_influx_of_life = class({})

function modifier_passive_influx_of_life:IsHidden() return true end
function modifier_passive_influx_of_life:IsDebuff() return false end
function modifier_passive_influx_of_life:IsPurgable() return false end
function modifier_passive_influx_of_life:GetAttributes() return MODIFIER_ATTRIBUTE_PERMANENT + MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE end

function modifier_passive_influx_of_life:OnCreated()
    self:OnRefresh()
end

function modifier_passive_influx_of_life:OnRefresh()
    self.bonus_heal = self:GetAbility():GetSpecialValueFor("bonus_heal")
    self.percent_heal = self:GetAbility():GetSpecialValueFor("percent_heal")
end

function modifier_passive_influx_of_life:DeclareFunctions()
    return {
        MODIFIER_PROPERTY_HEAL_AMPLIFY_PERCENTAGE_SOURCE,
        MODIFIER_PROPERTY_HP_REGEN_AMPLIFY_PERCENTAGE,
        MODIFIER_PROPERTY_HEALTH_REGEN_PERCENTAGE
    }
end

function modifier_passive_influx_of_life:GetModifierHealAmplify_PercentageSource()
    return self.bonus_heal or 0
end

function modifier_passive_influx_of_life:GetModifierHPRegenAmplify_Percentage()
    return self.bonus_heal or 0
end

function modifier_passive_influx_of_life:GetModifierHealthRegenPercentage()
    return self.percent_heal or 0
end
Код:
        "DOTA_Tooltip_ability_passive_influx_of_life"                                    "Приток жизни"
        "DOTA_Tooltip_ability_passive_influx_of_life_Description"                        "Увеличивает исходящее лечение и восстановление здоровья на %bonus_heal%%%."
        "DOTA_Tooltip_ability_passive_influx_of_life_lore"                                "Годы медитаций позволили вам восстанавливаться гораздо быстрее чем обычный человек"
Код:
"passive_magical_exhaustion"
        {
            "BaseClass"                    "ability_lua"
            "ScriptFile"                "heroes/passive/magical_exhaustion"
            "AbilityTextureName"        "specal/mag_debaf"
            "MaxLevel"                    "5"

            "AbilityType"                "DOTA_ABILITY_TYPE_BASIC"
            "AbilityBehavior"            "DOTA_ABILITY_BEHAVIOR_PASSIVE"

            "AbilitySpecial"
            {
                "01"
                {
                    "var_type"            "FIELD_INTEGER"
                    "magic_resist"        "8 14 17 22 25"
                }
                "02"
                {
                    "var_type"            "FIELD_INTEGER"
                    "status_resist"        "8 14 17 22 25"
                }
            }
        }
Lua:
passive_magical_exhaustion = class({})

LinkLuaModifier("modifier_passive_magical_exhaustion", "heroes/passive/magical_exhaustion", LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier("modifier_passive_magical_exhaustion_aura", "heroes/passive/magical_exhaustion", LUA_MODIFIER_MOTION_NONE)

function passive_magical_exhaustion:GetIntrinsicModifierName()
    return "modifier_passive_magical_exhaustion"
end

modifier_passive_magical_exhaustion = class({})

function modifier_passive_magical_exhaustion:IsHidden() return true end
function modifier_passive_magical_exhaustion:IsDebuff() return false end
function modifier_passive_magical_exhaustion:IsPurgable() return false end
function modifier_passive_magical_exhaustion:GetAttributes() return MODIFIER_ATTRIBUTE_PERMANENT + MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE end


function modifier_passive_magical_exhaustion:IsAura() return true end
function modifier_passive_magical_exhaustion:GetAuraRadius() return 1200 end
function modifier_passive_magical_exhaustion:GetAuraSearchTeam() return DOTA_UNIT_TARGET_TEAM_ENEMY end
function modifier_passive_magical_exhaustion:GetAuraSearchType() return DOTA_UNIT_TARGET_HERO + DOTA_UNIT_TARGET_BASIC end
function modifier_passive_magical_exhaustion:GetModifierAura() return "modifier_passive_magical_exhaustion_aura" end



modifier_passive_magical_exhaustion_aura = class({})

function modifier_passive_magical_exhaustion:IsDebuff() return false end
function modifier_passive_magical_exhaustion:IsPurgable() return false end

function modifier_passive_magical_exhaustion_aura:DeclareFunctions()
    return {
        MODIFIER_PROPERTY_MAGICAL_RESISTANCE_BONUS,
        MODIFIER_PROPERTY_STATUS_RESISTANCE_STACKING
    }
end

function modifier_passive_magical_exhaustion_aura:OnCreated()
    local ability = self:GetAbility()
    if (not ability) or ability:IsNull() then return end

    self.magic_resist = (-1) * ability:GetSpecialValueFor("magic_resist")
    self.status_resist = (-1) * ability:GetSpecialValueFor("status_resist")
end

function modifier_passive_magical_exhaustion_aura:GetModifierMagicalResistanceBonus()
    return self.magic_resist or 0
end

function modifier_passive_magical_exhaustion_aura:GetModifierStatusResistanceStacking()
    return self.status_resist or 0
end

function modifier_passive_magical_exhaustion_aura:GetEffectName()
    return "particles/dev/library/base_item_attachment_magic.vpcf"
end

function modifier_passive_magical_exhaustion_aura:GetEffectAttachType()
    return PATTACH_OVERHEAD_FOLLOW
end

function modifier_passive_magical_exhaustion_aura:ShouldUseOverheadOffset()
    return false
end
Код:
        "DOTA_Tooltip_ability_passive_magical_exhaustion"                                "Магическое подавление"
        "DOTA_Tooltip_ability_passive_magical_exhaustion_Description"                    "Вы уменьшаете у ближайших врагов магическое сопротивление на %magic_resist%%% и сопротивление эффектам на %status_resist%%%."
        "DOTA_Tooltip_ability_passive_magical_exhaustion_lore"                            "Отсутствие вашей души нервирует всех ближайших живых существ, снижая их естественную защиту от магии и странностей в целом."
        "DOTA_Tooltip_modifier_passive_magical_exhaustion_aura"                                "Магическое подавление"
        "DOTA_Tooltip_modifier_passive_magical_exhaustion_aura_Description"                            "Ваше магическое сопротивление и сопротивление эффектам снижено"
Код:
"passive_attack_speed"
        {
            "BaseClass"                    "ability_lua"
            "ScriptFile"                "heroes/passive/attack_speed"
            "AbilityTextureName"        "specal/add_speed_damage"
            "MaxLevel"                    "1"

            "AbilityType"                "DOTA_ABILITY_TYPE_BASIC"
            "AbilityBehavior"            "DOTA_ABILITY_BEHAVIOR_PASSIVE"

            "AbilitySpecial"
            {
                "01"
                {
                    "var_type"                    "FIELD_INTEGER"
                    "bonus_attack_speed"        "15"
                }
            }
        }
Lua:
passive_attack_speed = class({})

LinkLuaModifier("modifier_passive_attack_speed", "heroes/passive/attack_speed", LUA_MODIFIER_MOTION_NONE)

function passive_attack_speed:GetIntrinsicModifierName()
    return "modifier_passive_attack_speed"
end

modifier_passive_attack_speed = class({})

function modifier_passive_attack_speed:IsHidden() return true end
function modifier_passive_attack_speed:IsDebuff() return false end
function modifier_passive_attack_speed:IsPurgable() return false end
function modifier_passive_attack_speed:GetAttributes() return MODIFIER_ATTRIBUTE_PERMANENT + MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE end

function modifier_passive_attack_speed:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_ATTACKSPEED_BONUS_CONSTANT,
    }
    return funcs
end

function modifier_passive_attack_speed:OnCreated()
    self.multiplier = self:GetAbility():GetLevelSpecialValueFor("bonus_attack_speed", 1)
    self.attack_speed_bonus = self:GetParent():GetAttackSpeed() * self.multiplier
    self:StartIntervalThink(1)
end

function modifier_passive_attack_speed:OnIntervalThink()
    self.attack_speed_bonus = (self:GetParent():GetAttackSpeed() - self.attack_speed_bonus * 0.01) * self.multiplier
end

function modifier_passive_attack_speed:GetModifierAttackSpeedBonus_Constant()
    return self.attack_speed_bonus
end
Код:
        "DOTA_Tooltip_ability_passive_attack_speed"                                    "Ускорение атак"
        "DOTA_Tooltip_ability_passive_attack_speed_Description"                        "Увеличивает скорость атаки на %bonus_attack_speed%%%."
        "DOTA_Tooltip_ability_passive_attack_speed_lore"                            "Когда вы тренируетесь вы оттачиваете мастерство скорости, что позволило вам быстрее производить атаки"
Код:
 "passive_fatal_wound"
        {
            "BaseClass"                    "ability_lua"
            "ScriptFile"                "heroes/passive/fatal_wound"
            "AbilityTextureName"        "specal/crit_hit"
            "MaxLevel"                    "5"

            "AbilityType"                "DOTA_ABILITY_TYPE_BASIC"
            "AbilityBehavior"            "DOTA_ABILITY_BEHAVIOR_PASSIVE"

            "AbilitySpecial"
            {
                "01"
                {
                    "var_type"                    "FIELD_FLOAT"
                    "pct_health_threshold"        "95.0"
                }
                "02"
                {
                    "var_type"                    "FIELD_FLOAT"
                    "damage_multiplier"            "100.0 200.0 300.0 400.0 500.0"
                }
            }
        }
Lua:
passive_fatal_wound = class({})

LinkLuaModifier("modifier_passive_fatal_wound", "heroes/passive/fatal_wound", LUA_MODIFIER_MOTION_NONE)

function passive_fatal_wound:GetIntrinsicModifierName()
    return "modifier_passive_fatal_wound"
end





modifier_passive_fatal_wound = class({})

function modifier_passive_fatal_wound:IsHidden() return true end
function modifier_passive_fatal_wound:IsDebuff() return false end
function modifier_passive_fatal_wound:IsPurgable() return false end
function modifier_passive_fatal_wound:GetAttributes() return MODIFIER_ATTRIBUTE_PERMANENT + MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE end

function modifier_passive_fatal_wound:GetMultiplier(victim)
    local ability = self:GetAbility()
    local damage_multiplier = 1

    if (ability and victim:GetTeam() == ability:GetTeam()) then
        return damage_multiplier
    end

    if ability and (not ability:IsNull()) and victim:GetHealthPercent() >= ability:GetSpecialValueFor("pct_health_threshold") then
        damage_multiplier = 0.01 * ability:GetSpecialValueFor("damage_multiplier")

        local blitz_pfx = ParticleManager:CreateParticle("particles/econ/items/void_spirit/void_spirit_immortal_2021/void_spirit_immortal_2021_astral_step_dmg_blood.vpcf", PATTACH_ABSORIGIN_FOLLOW, victim)
        ParticleManager:SetParticleControl(blitz_pfx, 0, victim:GetAbsOrigin())
        ParticleManager:ReleaseParticleIndex(blitz_pfx)
    end

    return damage_multiplier
end


function modifier_passive_fatal_wound:DeclareFunctions()
    return {
        MODIFIER_PROPERTY_TOTALDAMAGEOUTGOING_PERCENTAGE,
    }
end

function modifier_passive_fatal_wound:GetModifierTotalDamageOutgoing_Percentage(params)
    local multiplier = self:GetMultiplier(params.target)
    if multiplier > 1 then
        SendOverheadEventMessage(nil, OVERHEAD_ALERT_CRITICAL, params.target, params.original_damage * multiplier, nil)
    end
    return (multiplier - 1) * 100
end
Код:
        "DOTA_Tooltip_ability_passive_fatal_wound"                                "Смертельный удар"
        "DOTA_Tooltip_ability_passive_fatal_wound_Description"                    "Любой урон нанесённый врагам с высоким уровнем больше %pct_health_threshold%%% здоровья, является автоматическим %damage_multiplier%%% критом."
        "DOTA_Tooltip_ability_passive_fatal_wound_lore"                            "Оттачивая своё мастерство вы уже наперед знаете и видите все слабые места противника"
Код:
"passive_armor_destroyer"
            {
                "BaseClass"                    "ability_lua"
                "ScriptFile"                "heroes/passive/armor_destroyer"
                "AbilityTextureName"        "specal/armorDebaf"
                "MaxLevel"                    "5"

                "AbilityType"                "DOTA_ABILITY_TYPE_BASIC"
                "AbilityBehavior"            "DOTA_ABILITY_BEHAVIOR_PASSIVE"

                "AbilitySpecial"
                {
                    "01"
                    {
                        "var_type"            "FIELD_FLOAT"
                        "armor_tear"        "0.2 0.5 0.8 1.0 1.3"
                    }
                }
            }
Lua:
passive_armor_destroyer = class({})

LinkLuaModifier("modifier_passive_armor_destroyer", "heroes/passive/armor_destroyer", LUA_MODIFIER_MOTION_NONE)
LinkLuaModifier("modifier_passive_armor_destroyer_tear", "heroes/passive/armor_destroyer", LUA_MODIFIER_MOTION_NONE)

function passive_armor_destroyer:GetIntrinsicModifierName()
    return "modifier_passive_armor_destroyer"
end


modifier_passive_armor_destroyer = class({})

function modifier_passive_armor_destroyer:IsHidden() return true end
function modifier_passive_armor_destroyer:IsDebuff() return false end
function modifier_passive_armor_destroyer:IsPurgable() return false end
function modifier_passive_armor_destroyer:GetAttributes() return MODIFIER_ATTRIBUTE_PERMANENT + MODIFIER_ATTRIBUTE_IGNORE_INVULNERABLE end

function modifier_passive_armor_destroyer:DeclareFunctions()
    if IsServer() then return { MODIFIER_PROPERTY_PROCATTACK_FEEDBACK } end
end

function modifier_passive_armor_destroyer:OnCreated()
    if IsClient() then return end

    self:GetParent():SetRangedProjectileName("particles/items_fx/desolator_projectile.vpcf")
   
end

function modifier_passive_armor_destroyer:GetModifierProcAttack_Feedback(keys)
    if keys.target:GetTeamNumber() == keys.attacker:GetTeamNumber() then return end

    keys.target:EmitSound("Item_Desolator.Target")

    local modifier_rend = keys.target:AddNewModifier(keys.attacker, self:GetAbility(), "modifier_passive_armor_destroyer_tear", {})
    if modifier_rend and not modifier_rend:IsNull() then modifier_rend:IncrementStackCount() end
end



modifier_passive_armor_destroyer_tear = class({})

function modifier_passive_armor_destroyer_tear:IsHidden() return false end
function modifier_passive_armor_destroyer_tear:IsDebuff() return true end
function modifier_passive_armor_destroyer_tear:IsPurgable() return false end
function modifier_passive_armor_destroyer_tear:GetTexture() return "specal/armorDebaf" end

function modifier_passive_armor_destroyer_tear:DeclareFunctions()
    return {
        MODIFIER_PROPERTY_PHYSICAL_ARMOR_BONUS
    }
end

function modifier_passive_armor_destroyer_tear:OnCreated()
    self.armor_tear = (-1) * self:GetAbility():GetSpecialValueFor("armor_tear")

    if IsClient() then return end

    self.rend_pfx = ParticleManager:CreateParticle("particles/units/heroes/hero_monkey_king/monkey_king_jump_armor_debuff_model.vpcf", PATTACH_OVERHEAD_FOLLOW, self:GetParent())
    ParticleManager:SetParticleControlEnt(self.rend_pfx, 0, self:GetParent(), PATTACH_OVERHEAD_FOLLOW, "follow_overhead", self:GetParent():GetAbsOrigin(), false)
    ParticleManager:SetParticleControl(self.rend_pfx, 2, Vector(1,0,0))
end

function modifier_passive_armor_destroyer_tear:OnStackCountChanged()
    if self.rend_pfx then
        ParticleManager:SetParticleControl(self.rend_pfx, 2, Vector(self:GetStackCount(), 0, 0))
    end
end

function modifier_passive_armor_destroyer_tear:OnDestroy()
    if self.rend_pfx then
        ParticleManager:DestroyParticle(self.rend_pfx, false)
        ParticleManager:ReleaseParticleIndex(self.rend_pfx)
    end
end

function modifier_passive_armor_destroyer_tear:GetModifierPhysicalArmorBonus()
    return self.armor_tear * self:GetStackCount()
end

function modifier_passive_armor_destroyer_tear:OnRoundEndForTeam(keys)
    self:OnPvpEndedForDuelists(keys)
end

function modifier_passive_armor_destroyer_tear:OnPvpEndedForDuelists(keys)
    if IsClient() then return end

    self:Destroy()
end
Код:
        "DOTA_Tooltip_ability_passive_armor_destroyer"                                        "Разрушитель брони"
        "DOTA_Tooltip_ability_passive_armor_destroyer_Description"                            "Ваши атаки уменьшают броню врага на %armor_tear% до конца его жизни.<br><br>Складывается бесконечно."
        "DOTA_Tooltip_ability_passive_armor_destroyer_lore"                                    "Рвать и метать... До самого конца!"
        "DOTA_Tooltip_modifier_passive_armor_destroyer_tear"                                "Броня сломана"
        "DOTA_Tooltip_modifier_passive_armor_destroyer_tear_Description"                    "Ваша броня поломана, без шанса на восстановление"
Знаете, как сделать, чтобы пассивка сларка стакалась ещё от крипов и нейралов, но давала меньше ловкости?
 
Знаете, как сделать, чтобы пассивка сларка стакалась ещё от крипов и нейралов, но давала меньше ловкости?
Открыть custom hero clash там найти абилку с пассивкой и взять код оттуда
И все счастливы и мне не придется думать
 
Последнее редактирование:
  • Нравится
Реакции: ArrLow
Открыть custom hero clash там найти абилку с пассивкой и взять код оттуда
И все счастливы и мне не придется думать
Мне нужно было, чтобы работало как в Mountain defense, код полностью скопировал и скилл, а в игре обычная пассивка
вот код:
Lua:
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local __TS__SourceMapTraceBack = ____lualib.__TS__SourceMapTraceBack
__TS__SourceMapTraceBack(debug.getinfo(1).short_src, {["8"] = 1,["9"] = 1,["10"] = 1,["11"] = 1,["12"] = 1,["13"] = 3,["14"] = 4,["15"] = 3,["16"] = 4,["18"] = 4,["19"] = 5,["20"] = 3,["21"] = 7,["22"] = 8,["23"] = 9,["24"] = 9,["25"] = 9,["26"] = 9,["27"] = 9,["28"] = 7,["29"] = 12,["30"] = 13,["31"] = 12,["32"] = 4,["33"] = 3,["34"] = 4,["36"] = 4,["37"] = 17,["38"] = 18,["39"] = 17,["40"] = 18,["42"] = 18,["43"] = 20,["44"] = 21,["45"] = 17,["46"] = 24,["47"] = 25,["48"] = 24,["49"] = 28,["50"] = 29,["51"] = 28,["52"] = 32,["53"] = 33,["54"] = 32,["55"] = 36,["56"] = 37,["57"] = 36,["58"] = 40,["59"] = 41,["60"] = 40,["61"] = 44,["62"] = 45,["63"] = 44,["64"] = 48,["65"] = 49,["66"] = 48,["67"] = 52,["68"] = 53,["69"] = 52,["70"] = 56,["71"] = 57,["74"] = 61,["75"] = 61,["76"] = 61,["77"] = 61,["78"] = 61,["79"] = 66,["80"] = 66,["81"] = 66,["82"] = 66,["83"] = 66,["84"] = 66,["85"] = 66,["86"] = 66,["87"] = 66,["88"] = 75,["89"] = 77,["90"] = 56,["91"] = 18,["92"] = 17,["93"] = 18,["95"] = 18});
local ____exports = {}
local ____dota_ts_adapter = require("libraries.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.slark_essence_shift_custom = __TS__Class()
local slark_essence_shift_custom = ____exports.slark_essence_shift_custom
slark_essence_shift_custom.name = "slark_essence_shift_custom"
__TS__ClassExtends(slark_essence_shift_custom, BaseAbility)
function slark_essence_shift_custom.prototype.____constructor(self, ...)
    BaseAbility.prototype.____constructor(self, ...)
    self.pathToOnDeathParticle = "particles/units/heroes/hero_slark/slark_essence_shift.vpcf"
end
function slark_essence_shift_custom.prototype.Precache(self, context)
    local caster = self:GetCaster()
    PrecacheResource(
        "particle",
        ParticleManager:GetParticleReplacement(self.pathToOnDeathParticle, caster),
        context
    )
end
function slark_essence_shift_custom.prototype.GetIntrinsicModifierName(self)
    return ____exports.modifier_slark_essence_shift_custom.name
end
slark_essence_shift_custom = __TS__Decorate(
    {registerAbility(nil)},
    slark_essence_shift_custom
)
____exports.slark_essence_shift_custom = slark_essence_shift_custom
____exports.modifier_slark_essence_shift_custom = __TS__Class()
local modifier_slark_essence_shift_custom = ____exports.modifier_slark_essence_shift_custom
modifier_slark_essence_shift_custom.name = "modifier_slark_essence_shift_custom"
__TS__ClassExtends(modifier_slark_essence_shift_custom, BaseModifier)
function modifier_slark_essence_shift_custom.prototype.____constructor(self, ...)
    BaseModifier.prototype.____constructor(self, ...)
    self.ability = self:GetAbility()
    self.parent = self:GetParent()
end
function modifier_slark_essence_shift_custom.prototype.IsHidden(self)
    return self:GetStackCount() == 0
end
function modifier_slark_essence_shift_custom.prototype.IsDebuff(self)
    return false
end
function modifier_slark_essence_shift_custom.prototype.IsPurgable(self)
    return false
end
function modifier_slark_essence_shift_custom.prototype.IsPurgeException(self)
    return false
end
function modifier_slark_essence_shift_custom.prototype.DeclareFunctions(self)
    return {MODIFIER_EVENT_ON_DEATH, MODIFIER_PROPERTY_STATS_AGILITY_BONUS}
end
function modifier_slark_essence_shift_custom.prototype.GetModifierBonusStats_Agility(self)
    return self:GetStackCount() * self.damagePerStack
end
function modifier_slark_essence_shift_custom.prototype.OnCreated(self)
    self:OnRefresh()
end
function modifier_slark_essence_shift_custom.prototype.OnRefresh(self)
    self.damagePerStack = self.ability:GetSpecialValueFor("dmg_gain")
end
function modifier_slark_essence_shift_custom.prototype.OnDeath(self, event)
    if event.attacker ~= self.parent then
        return
    end
    local particle = ParticleManager:CreateParticle(
        ParticleManager:GetParticleReplacement(self.ability.pathToOnDeathParticle, self.parent),
        PATTACH_POINT_FOLLOW,
        event.unit
    )
    ParticleManager:SetParticleControlEnt(
        particle,
        1,
        self.parent,
        PATTACH_POINT_FOLLOW,
        "attach_hitloc",
        Vector(0, 0, 0),
        true
    )
    ParticleManager:DestroyAndReleaseParticle(particle)
    self:IncrementStackCount()
end
modifier_slark_essence_shift_custom = __TS__Decorate(
    {registerModifier(nil)},
    modifier_slark_essence_shift_custom
)
____exports.modifier_slark_essence_shift_custom = modifier_slark_essence_shift_custom
return ____exports
Вот текст в файле npc_abilities_custom.txt:
Код:
"slark_essence_shift_custom"
    {
        "BaseClass"                            "ability_lua"
        "AbilityBehavior"                    "DOTA_ABILITY_BEHAVIOR_PASSIVE"
        "SpellImmunityType"                    "SPELL_IMMUNITY_ENEMIES_YES"
        "AbilityTextureName"                "essence_shift"
        "RequiredLevel"                        "1"
        "ScriptFile"                        "slark\essence_shift\slark_essence_shift"
        "MaxLevel"                            "12"
        "AbilitySpecial"
        {
                "01"
                {
                        "var_type"                            "FIELD_FLOAT"
                        "dmg_gain"                            "0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2"
                        "CalculateSpellDamageTooltip"     "0"
                }
        }
    }
Что не так?
 
Мне нужно было, чтобы работало как в Mountain defense, код полностью скопировал и скилл, а в игре обычная пассивка
вот код:
Lua:
local ____lualib = require("lualib_bundle")
local __TS__Class = ____lualib.__TS__Class
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
local __TS__Decorate = ____lualib.__TS__Decorate
local __TS__SourceMapTraceBack = ____lualib.__TS__SourceMapTraceBack
__TS__SourceMapTraceBack(debug.getinfo(1).short_src, {["8"] = 1,["9"] = 1,["10"] = 1,["11"] = 1,["12"] = 1,["13"] = 3,["14"] = 4,["15"] = 3,["16"] = 4,["18"] = 4,["19"] = 5,["20"] = 3,["21"] = 7,["22"] = 8,["23"] = 9,["24"] = 9,["25"] = 9,["26"] = 9,["27"] = 9,["28"] = 7,["29"] = 12,["30"] = 13,["31"] = 12,["32"] = 4,["33"] = 3,["34"] = 4,["36"] = 4,["37"] = 17,["38"] = 18,["39"] = 17,["40"] = 18,["42"] = 18,["43"] = 20,["44"] = 21,["45"] = 17,["46"] = 24,["47"] = 25,["48"] = 24,["49"] = 28,["50"] = 29,["51"] = 28,["52"] = 32,["53"] = 33,["54"] = 32,["55"] = 36,["56"] = 37,["57"] = 36,["58"] = 40,["59"] = 41,["60"] = 40,["61"] = 44,["62"] = 45,["63"] = 44,["64"] = 48,["65"] = 49,["66"] = 48,["67"] = 52,["68"] = 53,["69"] = 52,["70"] = 56,["71"] = 57,["74"] = 61,["75"] = 61,["76"] = 61,["77"] = 61,["78"] = 61,["79"] = 66,["80"] = 66,["81"] = 66,["82"] = 66,["83"] = 66,["84"] = 66,["85"] = 66,["86"] = 66,["87"] = 66,["88"] = 75,["89"] = 77,["90"] = 56,["91"] = 18,["92"] = 17,["93"] = 18,["95"] = 18});
local ____exports = {}
local ____dota_ts_adapter = require("libraries.dota_ts_adapter")
local BaseAbility = ____dota_ts_adapter.BaseAbility
local BaseModifier = ____dota_ts_adapter.BaseModifier
local registerAbility = ____dota_ts_adapter.registerAbility
local registerModifier = ____dota_ts_adapter.registerModifier
____exports.slark_essence_shift_custom = __TS__Class()
local slark_essence_shift_custom = ____exports.slark_essence_shift_custom
slark_essence_shift_custom.name = "slark_essence_shift_custom"
__TS__ClassExtends(slark_essence_shift_custom, BaseAbility)
function slark_essence_shift_custom.prototype.____constructor(self, ...)
    BaseAbility.prototype.____constructor(self, ...)
    self.pathToOnDeathParticle = "particles/units/heroes/hero_slark/slark_essence_shift.vpcf"
end
function slark_essence_shift_custom.prototype.Precache(self, context)
    local caster = self:GetCaster()
    PrecacheResource(
        "particle",
        ParticleManager:GetParticleReplacement(self.pathToOnDeathParticle, caster),
        context
    )
end
function slark_essence_shift_custom.prototype.GetIntrinsicModifierName(self)
    return ____exports.modifier_slark_essence_shift_custom.name
end
slark_essence_shift_custom = __TS__Decorate(
    {registerAbility(nil)},
    slark_essence_shift_custom
)
____exports.slark_essence_shift_custom = slark_essence_shift_custom
____exports.modifier_slark_essence_shift_custom = __TS__Class()
local modifier_slark_essence_shift_custom = ____exports.modifier_slark_essence_shift_custom
modifier_slark_essence_shift_custom.name = "modifier_slark_essence_shift_custom"
__TS__ClassExtends(modifier_slark_essence_shift_custom, BaseModifier)
function modifier_slark_essence_shift_custom.prototype.____constructor(self, ...)
    BaseModifier.prototype.____constructor(self, ...)
    self.ability = self:GetAbility()
    self.parent = self:GetParent()
end
function modifier_slark_essence_shift_custom.prototype.IsHidden(self)
    return self:GetStackCount() == 0
end
function modifier_slark_essence_shift_custom.prototype.IsDebuff(self)
    return false
end
function modifier_slark_essence_shift_custom.prototype.IsPurgable(self)
    return false
end
function modifier_slark_essence_shift_custom.prototype.IsPurgeException(self)
    return false
end
function modifier_slark_essence_shift_custom.prototype.DeclareFunctions(self)
    return {MODIFIER_EVENT_ON_DEATH, MODIFIER_PROPERTY_STATS_AGILITY_BONUS}
end
function modifier_slark_essence_shift_custom.prototype.GetModifierBonusStats_Agility(self)
    return self:GetStackCount() * self.damagePerStack
end
function modifier_slark_essence_shift_custom.prototype.OnCreated(self)
    self:OnRefresh()
end
function modifier_slark_essence_shift_custom.prototype.OnRefresh(self)
    self.damagePerStack = self.ability:GetSpecialValueFor("dmg_gain")
end
function modifier_slark_essence_shift_custom.prototype.OnDeath(self, event)
    if event.attacker ~= self.parent then
        return
    end
    local particle = ParticleManager:CreateParticle(
        ParticleManager:GetParticleReplacement(self.ability.pathToOnDeathParticle, self.parent),
        PATTACH_POINT_FOLLOW,
        event.unit
    )
    ParticleManager:SetParticleControlEnt(
        particle,
        1,
        self.parent,
        PATTACH_POINT_FOLLOW,
        "attach_hitloc",
        Vector(0, 0, 0),
        true
    )
    ParticleManager:DestroyAndReleaseParticle(particle)
    self:IncrementStackCount()
end
modifier_slark_essence_shift_custom = __TS__Decorate(
    {registerModifier(nil)},
    modifier_slark_essence_shift_custom
)
____exports.modifier_slark_essence_shift_custom = modifier_slark_essence_shift_custom
return ____exports
Вот текст в файле npc_abilities_custom.txt:
Код:
"slark_essence_shift_custom"
    {
        "BaseClass"                            "ability_lua"
        "AbilityBehavior"                    "DOTA_ABILITY_BEHAVIOR_PASSIVE"
        "SpellImmunityType"                    "SPELL_IMMUNITY_ENEMIES_YES"
        "AbilityTextureName"                "essence_shift"
        "RequiredLevel"                        "1"
        "ScriptFile"                        "slark\essence_shift\slark_essence_shift"
        "MaxLevel"                            "12"
        "AbilitySpecial"
        {
                "01"
                {
                        "var_type"                            "FIELD_FLOAT"
                        "dmg_gain"                            "0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2"
                        "CalculateSpellDamageTooltip"     "0"
                }
        }
    }
Что не так?
То что, это не достаточно просто скопипастить это, ещё тебе надо найти завязки, а именно
Строка local ____lualib = require("lualib_bundle") загружает модуль lualib_bundle и присваивает его результат переменной ____lualib, тебе надо найти все переменные которые написаны через ____ и переписать их в более понятный для тебя вид, либо же в тупую забрать ещё и lualib_bundle (а это фулл механика у них на все абилки), а ещё local ____dota_ts_adapter = require("libraries.dota_ts_adapter")
 
Тебе проще самостоятельно разобрать код и переписать его с 0, чем переписывать то, что уже кем то написано
но скажу прямо, разбирать этот код - каторга ибо я сейчас смотрю на него и голова пухнет

Повторюсь, что на CHC подобная механика, вдобавок она фулл LUA разборчивый код, без хуйни по типу обращений инклюдов и прочего что б было в падлу разбирать код
 
Последнее редактирование:
Тебе проще самостоятельно разобрать код и переписать его с 0, чем переписывать то, что уже кем то написано
но скажу прямо, разбирать этот код - каторга ибо я сейчас смотрю на него и голова пухнет

Повторюсь, что на CHC подобная механика, вдобавок она фулл LUA разборчивый код, без хуйни по типу обращений инклюдов и прочего что б было в падлу разбиратб
Что такое СНС?
 
Тебе проще самостоятельно разобрать код и переписать его с 0, чем переписывать то, что уже кем то написано
но скажу прямо, разбирать этот код - каторга ибо я сейчас смотрю на него и голова пухнет

Повторюсь, что на CHC подобная механика, вдобавок она фулл LUA разборчивый код, без хуйни по типу обращений инклюдов и прочего что б было в падлу разбирать код
Можешь тогда подсказать, как отнимать определённое кол-во атрибутов (на каждом уровне своё кол-во) и добавлять определённое кол-во агилити (на каждом уровне своё кол-во). Хотя бы команды или функции. И можно как-нибудь через модифаер так сделать, потому что я видел там OnAttack и OnProjectileHitUnit, но это эвенты, а чтобы отнимать и прибавлять нет действия:(?
 
Можешь тогда подсказать, как отнимать определённое кол-во атрибутов (на каждом уровне своё кол-во) и добавлять определённое кол-во агилити (на каждом уровне своё кол-во). Хотя бы команды или функции. И можно как-нибудь через модифаер так сделать, потому что я видел там OnAttack и OnProjectileHitUnit, но это эвенты, а чтобы отнимать и прибавлять нет действия:(?
Функция
Lua:
-- Функция для добавления атрибутов в зависимости от уровня
function addAttributes(hero, level)
    local attributePoints = 2 -- Количество очков атрибутов, которые получает герой на каждом уровне

    -- Проверяем, что герой существует и уровень больше 1
    if hero and level > 1 then
        -- Добавляем атрибуты в зависимости от уровня
        for i = 1, level - 1 do
            hero:ModifyAgility(attributePoints)
            hero:ModifyStrength(attributePoints)
            hero:ModifyIntellect(attributePoints)
        end
    end
end

-- Функция для отнятия атрибутов в зависимости от уровня
function removeAttributes(hero, level)
    local attributePoints = 2 -- Количество очков атрибутов, которые теряет герой на каждом уровне

    -- Проверяем, что герой существует и уровень больше 1
    if hero and level > 1 then
        -- Отнимаем атрибуты в зависимости от уровня
        for i = 1, level - 1 do
            hero:ModifyAgility(-attributePoints)
            hero:ModifyStrength(-attributePoints)
            hero:ModifyIntellect(-attributePoints)
        end
    end
end

-- Пример использования функций
local hero = GameRules:GetGameModeEntity():GetPlayer(0):GetAssignedHero() -- Получаем героя игрока 1
local level = hero:GetLevel() -- Получаем текущий уровень героя

addAttributes(hero, level) -- Добавляем атрибуты в зависимости от уровня
removeAttributes(hero, level) -- Отнимаем атрибуты в зависимости от уровня

Модификатор

Lua:
-- Создаем новый модификатор
modifier_example = class({})

-- Функция OnCreated вызывается при создании модификатора
function modifier_example:OnCreated()
    if not IsServer() then return end

    local hero = self:GetParent() -- Получаем героя, на которого был применен модификатор
    local level = hero:GetLevel() -- Получаем текущий уровень героя

    self.attributePoints = 2 -- Количество очков атрибутов, которые получает или теряет герой на каждом уровне

    -- Добавляем атрибуты в зависимости от уровня
    for i = 1, level - 1 do
        hero:ModifyAgility(self.attributePoints)
        hero:ModifyStrength(self.attributePoints)
        hero:ModifyIntellect(self.attributePoints)
    end
end

-- Функция OnDestroy вызывается при удалении модификатора
function modifier_example:OnDestroy()
    if not IsServer() then return end

    local hero = self:GetParent() -- Получаем героя, на которого был применен модификатор
    local level = hero:GetLevel() -- Получаем текущий уровень героя

    -- Отнимаем атрибуты в зависимости от уровня
    for i = 1, level - 1 do
        hero:ModifyAgility(-self.attributePoints)
        hero:ModifyStrength(-self.attributePoints)
        hero:ModifyIntellect(-self.attributePoints)
    end
end

-- Применяем модификатор к герою
function modifier_example:DeclareFunctions()
    local funcs = {
        MODIFIER_EVENT_ON_CREATED,
        MODIFIER_EVENT_ON_DESTROY
    }

    return funcs
end

-- Пример использования модификатора
LinkLuaModifier("modifier_example", "modifiers/modifier_example.lua", LUA_MODIFIER_MOTION_NONE) -- Подключаем модификатор

-- Применяем модификатор к герою
hero:AddNewModifier(nil, nil, "modifier_example", {})

Это все примеры и не факт что рабочие - они сгенерированы ChatGPT!


Custom Hero Clash кастомка
 
Функция
Lua:
-- Функция для добавления атрибутов в зависимости от уровня
function addAttributes(hero, level)
    local attributePoints = 2 -- Количество очков атрибутов, которые получает герой на каждом уровне

    -- Проверяем, что герой существует и уровень больше 1
    if hero and level > 1 then
        -- Добавляем атрибуты в зависимости от уровня
        for i = 1, level - 1 do
            hero:ModifyAgility(attributePoints)
            hero:ModifyStrength(attributePoints)
            hero:ModifyIntellect(attributePoints)
        end
    end
end

-- Функция для отнятия атрибутов в зависимости от уровня
function removeAttributes(hero, level)
    local attributePoints = 2 -- Количество очков атрибутов, которые теряет герой на каждом уровне

    -- Проверяем, что герой существует и уровень больше 1
    if hero and level > 1 then
        -- Отнимаем атрибуты в зависимости от уровня
        for i = 1, level - 1 do
            hero:ModifyAgility(-attributePoints)
            hero:ModifyStrength(-attributePoints)
            hero:ModifyIntellect(-attributePoints)
        end
    end
end

-- Пример использования функций
local hero = GameRules:GetGameModeEntity():GetPlayer(0):GetAssignedHero() -- Получаем героя игрока 1
local level = hero:GetLevel() -- Получаем текущий уровень героя

addAttributes(hero, level) -- Добавляем атрибуты в зависимости от уровня
removeAttributes(hero, level) -- Отнимаем атрибуты в зависимости от уровня

Модификатор

Lua:
-- Создаем новый модификатор
modifier_example = class({})

-- Функция OnCreated вызывается при создании модификатора
function modifier_example:OnCreated()
    if not IsServer() then return end

    local hero = self:GetParent() -- Получаем героя, на которого был применен модификатор
    local level = hero:GetLevel() -- Получаем текущий уровень героя

    self.attributePoints = 2 -- Количество очков атрибутов, которые получает или теряет герой на каждом уровне

    -- Добавляем атрибуты в зависимости от уровня
    for i = 1, level - 1 do
        hero:ModifyAgility(self.attributePoints)
        hero:ModifyStrength(self.attributePoints)
        hero:ModifyIntellect(self.attributePoints)
    end
end

-- Функция OnDestroy вызывается при удалении модификатора
function modifier_example:OnDestroy()
    if not IsServer() then return end

    local hero = self:GetParent() -- Получаем героя, на которого был применен модификатор
    local level = hero:GetLevel() -- Получаем текущий уровень героя

    -- Отнимаем атрибуты в зависимости от уровня
    for i = 1, level - 1 do
        hero:ModifyAgility(-self.attributePoints)
        hero:ModifyStrength(-self.attributePoints)
        hero:ModifyIntellect(-self.attributePoints)
    end
end

-- Применяем модификатор к герою
function modifier_example:DeclareFunctions()
    local funcs = {
        MODIFIER_EVENT_ON_CREATED,
        MODIFIER_EVENT_ON_DESTROY
    }

    return funcs
end

-- Пример использования модификатора
LinkLuaModifier("modifier_example", "modifiers/modifier_example.lua", LUA_MODIFIER_MOTION_NONE) -- Подключаем модификатор

-- Применяем модификатор к герою
hero:AddNewModifier(nil, nil, "modifier_example", {})

Это все примеры и не факт что рабочие - они сгенерированы ChatGPT!



Custom Hero Clash кастомка
А npc_abilities_custom.txt должен быть, как и в том сообщении, в котором я спрашивал? А так, чтото не работает
 
А npc_abilities_custom.txt должен быть, как и в том сообщении, в котором я спрашивал? А так, чтото не работает
причем тут npc_abilities_custom.txt, когда я дал код для примера - модификатора и функцию - которые никак не связаны с абилкой в npc_abilities_custom
 
причем тут npc_abilities_custom.txt, когда я дал код для примера - модификатора и функцию - которые никак не связаны с абилкой в npc_abilities_custom
Тогда нужно код запускать типо

Код:
        "modifiers"
        {
            }
            "OnAttack"
            {
                "RunScript"
                {
                    "ScriptFile"    "essence_shift"
                    "Function"        "AbilityName"
                    "Target"        "TARGET|CASTER"
                }
            }
        }
 
Реклама: