Урок Увеличение радиуса способностей

ascento

Пользователь
11 Ноя 2021
23
5
ascento-rpg.ru
Проект
Ascento RPG
Буду краток.

В addon_game_mode.lua в удобное для вас место распологаем:
Lua:
function CacheAbilityKeyValues()
    for ability_name, ability_data in pairs(LoadKeyValues("scripts/npc/npc_abilities_custom.txt")) do
        if ability_data.AbilityValues then
            for special_value, value_data in pairs(ability_data.AbilityValues) do
                if type(value_data) == "table" and value_data.affected_by_aoe_increase then
                    _G.aoe_ability_values[ability_name] = _G.aoe_ability_values[ability_name] or {}
                    _G.aoe_ability_values[ability_name][special_value] = true
                    --print(ability_name)
                    --print(special_value)
                end
            end
        end
    end
    for ability_name, ability_data in pairs(LoadKeyValues("scripts/npc/npc_items_custom.txt")) do
      if ability_data.AbilityValues then
          for special_value, value_data in pairs(ability_data.AbilityValues) do
                  if type(value_data) == "table" and value_data.affected_by_aoe_increase then
                    _G.aoe_ability_values[ability_name] = _G.aoe_ability_values[ability_name] or {}
                    _G.aoe_ability_values[ability_name][special_value] = true
                    --print(ability_name)
                    --print(special_value)
                  end
              end
          end
    end
end

function Activate()
    barebones:InitGameMode()
    _G.aoe_ability_values = {}

    CacheAbilityKeyValues()
end

В addon_game_mode_client.lua также располагаем тот-же самый код:
Lua:
function CacheAbilityKeyValues()
    for ability_name, ability_data in pairs(LoadKeyValues("scripts/npc/npc_abilities_custom.txt")) do
        if ability_data.AbilityValues then
            for special_value, value_data in pairs(ability_data.AbilityValues) do
                if type(value_data) == "table" and value_data.affected_by_aoe_increase then
                    _G.aoe_ability_values[ability_name] = _G.aoe_ability_values[ability_name] or {}
                    _G.aoe_ability_values[ability_name][special_value] = true
                    --print(ability_name)
                    --print(special_value)
                end
            end
        end
    end
    for ability_name, ability_data in pairs(LoadKeyValues("scripts/npc/npc_items_custom.txt")) do
      if ability_data.AbilityValues then
          for special_value, value_data in pairs(ability_data.AbilityValues) do
                  if type(value_data) == "table" and value_data.affected_by_aoe_increase then
                    _G.aoe_ability_values[ability_name] = _G.aoe_ability_values[ability_name] or {}
                    _G.aoe_ability_values[ability_name][special_value] = true
                    --print(ability_name)
                    --print(special_value)
                  end
              end
          end
    end
end
_G.aoe_ability_values = {}
CacheAbilityKeyValues()

Если не расположить его в клиентской части, то в способностях не будут отображаться радиусы.

Далее в удобную вам способность, предмет, модификатор добавляем:
Lua:
function modifier_bloodstone_strygwyr:DeclareFunctions()
    local funcs = {
        MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL,
        MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE
    }
    return funcs
end

function modifier_bloodstone_strygwyr:GetModifierOverrideAbilitySpecial(keys)
    local ability = self:GetAbility()
    local target_ability = keys.ability
    local special_value_name = keys.ability_special_value

    if not ability or not target_ability or not special_value_name then
        return 0
    end

    local ability_name = target_ability:GetAbilityName()
    if _G.aoe_ability_values[ability_name] and _G.aoe_ability_values[ability_name][special_value_name] then
        if not self.aoe_values[special_value_name] then
            self.aoe_values[special_value_name] = true
        end
        return 1
    end
   
    return 0
end

function modifier_bloodstone_strygwyr:GetModifierOverrideAbilitySpecialValue(keys)
    local target_ability = keys.ability
    local special_value_name = keys.ability_special_value
    local special_level = keys.ability_special_level

    if target_ability and _G.aoe_ability_values[target_ability:GetAbilityName()] and _G.aoe_ability_values[target_ability:GetAbilityName()][special_value_name] then
        local base_value = target_ability:GetLevelSpecialValueNoOverride(special_value_name, special_level) --Тут базовый радиус скила
        local bonus_aoe = self:GetAbility():GetLevelSpecialValueFor("skill_range", (self:GetAbility():GetLevel() - 1)) + (self:GetAbility():GetLevelSpecialValueFor("aoe_per_charge", (self:GetAbility():GetLevel() - 1)) * self:GetAbility():GetCurrentCharges()) --Тут ваш бонус
        return base_value + bonus_aoe
    end
end

На этом собственно всё. Буду рад если это вам поможет.
 
Реклама: