Обновление скриптов без перезапуска кастомки

Devel

Пользователь
16 Апр 2023
20
3
Проект
Angel Arena Hypernova
Хочу поделиться одним лайфхаком, который наверняка облегчит жизнь многим. Лично мне облегчило.

Короче говоря, можно не перезагружать кастомку после каждого обновления скрипта, ведь есть замечательная консольная команда -
script_reload. Она хорошо работает с активными способностями, но есть минус: код уже существующих модификаторов (например, пассивных абилок) не обновляется, их нужно перенакладывать. Собственно, простенький код, который, надеюсь, поможет лишний раз не перезапускать кастомку:
Lua:
ListenToGameEvent("player_chat", function(keys)
    local text = keys.text
    local hero = PlayerResource:GetSelectedHeroEntity(keys.playerid)
    if hero and text and text == "-sr" then
            print('reloading scripts')
            local modifiers = hero:FindAllModifiers()
            local saved_modifiers = {}
            for k,v in pairs(modifiers) do
                if v:GetRemainingTime() <= -1 then
                table.insert(saved_modifiers, {
                        name = v:GetName(),
                        ability = v:GetAbility(),
                        parent = v:GetParent(),
                        stacks = v:GetStackCount()
                    })
                    hero:RemoveModifierByName(name)
                end
            end
            SendToServerConsole('script_reload')
            for k,v in pairs(saved_modifiers) do
                hero:AddNewModifier(v.parent, v.ability, v.name, {}):SetStackCount(v.stacks)
            end
            saved_modifiers = nil
    end
end)

Применение: вставить это в код кастомки и писать в чат команду '-sr' (в идеале несколько раз). Скрипты будут перезагружаться с внесенными в них изменениями (включая пассивные модификаторы). Не перезагружает keyvalues, и вряд ли существует команда, способная их обновить без перезапуска кастомки, увы и ах)
 
Последнее редактирование:
  • Нравится
Реакции: vulkantsk

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,147
196
www.dotabuff.com
Проект
Roshan defense
Если хочешь вставить код , то используй вставку спойлера и кода
1) спойлер необходим для того, чтобы сообщение лучше читалось и не занимать лишнего места
2) код учитывает отступы, чего нету в обычной вставке
Код:
    "item_blood_dagger"
    {
        "BaseClass"                        "item_lua"
        "ScriptFile"                    "items/neutral_items/blood_dagger"
        "AbilityBehavior"                "DOTA_ABILITY_BEHAVIOR_PASSIVE"
        "AbilityTextureName"            "neutral/blood_dagger"

        "ItemCost"                        "0"
        "ItemIsNeutralDrop"                "1"
        "ItemPurchasable"                "0"

        "Model"                            "models/custom/items/neutral_box_custom/neutral_box_custom.vmdl"
        "Effect"                        "particles/items5_fx/neutral_treasurebox_lvl2.vpcf"

        "AbilityValues"
        {
            "bonus_damage"            "25"
            "bonus_attack_speed"    "75"
            "hp_decrease"            "2500"
            "as_increase"            "100"
        }
    }
1684009349869.png
А так в целом, штука полезная )
Молодец :cool:
 

Devel

Пользователь
16 Апр 2023
20
3
Проект
Angel Arena Hypernova
Немного доработал код. Теперь команда не одна, а две: для релоада скриптов и перезагрузки модификаторов соответственно. + теперь перезагружаются все герои, а не только подконтрольный игроку, + корректно работает с датадрайвенскими модификаторами.
Lua:
ListenToGameEvent("player_chat", function(keys)
    local text = keys.text
    local hero = PlayerResource:GetSelectedHeroEntity(keys.playerid)
    if text and text == "-sr" then --перезагрузка скриптов
        SendToServerConsole('script_reload')
    end
   
    if hero and text and text == "-mr" then --перезагрузка модификаторов
            for i = 0, 23 do
                if PlayerResource:IsValidPlayerID(i) then local hero = PlayerResource:GetSelectedHeroEntity(i)
                local modifiers = hero:FindAllModifiers()
                for k,v in pairs(modifiers) do
                    if v:GetRemainingTime() <= -1 then
                        local ability = v:GetAbility()
                        local name = v:GetName()
                        local stacks = v:GetStackCount()
                        local caster = v:GetCaster()
                        local parent = v:GetParent()
                        hero:RemoveModifierByName(v:GetName())
                       
                        local mod = parent:AddNewModifier(caster, ability, name, {})
                        if not mod then
                            mod = ability:ApplyDataDrivenModifier(caster, parent, name, {})
                        end
                        if mod then
                            mod:SetStackCount(stacks)
                        end
                    end
                end
            end end
    end
end)
 
  • Нравится
Реакции: vulkantsk
Реклама: