Как изменять значения AbilitySpecial через lua/ можно ли создавать вещи с рандомными свойствами и передавать эти свойства в файлы локализации?

Olezha

Пользователь
27 Сен 2020
10
1
Знающие ребята, хэлп!

Пытаюсь сделать выпадение предметов с рандомными свойствами.
К примеру, вещь, которая будет падать с уроном в интервале от 12 до 16, очевидно рандомно.
То есть:
Выпала первая - 13 урона, вторая - 16. И это всё еще предметы одного и того же типа.

Я смог сделать так, чтобы модификатор, который клеится к вещи выдавал случайное значение и по сути задача выполнена. Можно сделать таблицу и заносить туда значения для каждого такого типа предмета, чтобы модификатор давал своё значение урона для каждого...

Так же я знаю, что мы имеем "статичные" переменные(значения) AbilitySpecial, и, как я понял, мы можем их получать в lua через GetSpecialValueFor( cstring szName ) : table.
Но как их менять/отдавать обратно и можно ли вообще? Во всех примерах что я видел эти значения являются фундаментом.
Без них я не могу сделать нормальное описание предмета, естественно я не рассматриваю вариант вписывать все цифры вручную имея случайные значения из диапазонов. :rolleyes:
Можно ли как-то забивать/менять эти значения через луа?
Или же можно использовать обычные переменные, не из блока AbilitySpecial и получить такой же эффект?
Или даже использовать переменные из lua?
Или может моё представление в корне не верно?

Тем с подобными вопросами не нашел, поэтому прошу помощи!
 

Дикий Пёс

Друзья CG
28 Июн 2017
411
96
Проект
Petri Reborn
простой вариант:
в abilityspecial хранить минимальное и максимальное значение

тоже простой вариант но не для всех:
менять описание предмета в панораме через хак

JavaScript:
function Hack()
{
    // этот цикл находит самую верхнюю панель, с которой можно(в теории) добратся до и изменить любое содержимое любой панели или добавить в него чтото
    var parent = $.GetContextPanel().GetParent();
    while(parent.id != "Hud")
        parent = parent.GetParent();
  
    // эта штука находит нужную нам штуку по её id и меняет параметр(например text)
    parent.FindChildTraverse("ID_СЮДА").имя_параметра = "300 bucks"
  
    // эта функция запускает функцию Hack ещё раз, через 0.1 секунд(получается бесконечный цикл с небольшой задержкой)
    $.Schedule(0.1, Hack)
}

id и параметры дотовских панелей можно искать через PanoramaDebugger(уже не помню как его включать, поищи сам)
чтобы редактировать стили надо сохранять возвращаемую панель в переменную и прописать .style

JavaScript:
var panel = parent.FindChildTraverse("ID_СЮДА")
panel.style.fontSize = "16px";
panel.style.fontFamily = "Arial";
panel.style.textAlign = "center";
panel.style.width = "70%";
panel.style.height = "70%";

для удобства понимания какие стили и где используются можно прочекать дотовскую панораму туть

PS пишу чисто по памяти, мог и ошибица гдето так что сорри
 
  • Нравится
Реакции: Olezha

Olezha

Пользователь
27 Сен 2020
10
1
простой вариант:
в abilityspecial хранить минимальное и максимальное значение
Да, это понятно, это как раз не изменяемые значения и с ними проблем нет

тоже простой вариант но не для всех:
менять описание предмета в панораме через хак
Пока с панорамой не связывался тут, да и хотелось бы поменьше костылей, красивенько, через код на луа.
Но спасибо, возьму на заметку, если вдруг не выйдет так как я себе это вижу - попробую


Спасибо, именно то что было нужно, странно что вообще нигде не видел эти 2 функции.
Так и думал, что с эвента аганима можно нарыть, они ж еще и изменение скиллов с помощью покупаемых шардов месяц назад ввели, и в описании у них там всё как надо отображается

Пока вот что вышло (2 разные шмотки):
1602174003639.png
1602174158582.png
Рандом работает, значения переписываются, в описании всё выводится, бонус прибавляется, всё круто, но когда предмет не активен(лежит на земле, в доп слотах) снова берутся базовые значения, так как пропадает модификатор с персонажа, а функции GetModifierOverrideAbilitySpecial( params ) и GetModifierOverrideAbilitySpecialValue( params ) работают только для модификаторов согласно документации.
1602175002558.png
1602175020638.png

Можно ли как-то делать что-то подобное при именно создании (покупке, дропе) предмета или как-то еще это обойти?
Вот у модификаторов есть OnCreated(params) и там мы можем всякую логику добавлять при их создании, есть ли такие же для предметов, именно для спавна, а не эквипа?
Ниже мой говнокод
KV:
"item_spider_aura_sphere"
    {

        "AbilityTextureName"    "item_aura_spider_sphere"
        "ID"                    "1001"

        "BaseClass"                     "item_lua"
        "ScriptFile"                    "items/item_spider_aura_sphere"

        "ItemCost"                "20"
        "ItemKillable"            "0"
        "ItemSellable"            "1"
        "ItemPurchasable"        "1"
        "ItemDroppable"            "1"
        "ItemShareability"        "ITEM_NOT_SHAREABLE"
        "AbilityBehavior"        "DOTA_ABILITY_BEHAVIOR_PASSIVE"
        "AbilitySpecial"
        {
            "01"
            {
                "var_type"            "FIELD_INTEGER"
                "dmgMin"            "12"
                
            }
            "02"
            {
                "var_type"            "FIELD_INTEGER"
                "dmgMax"            "16"
            }
             "03"
            {
                "var_type"            "FIELD_INTEGER"
                "dmg"                "0"
            }
        }
    }
Lua:
item_spider_aura_sphere = class({})

LinkLuaModifier("modifier_aura", "items/item_spider_aura_sphere", LUA_MODIFIER_MOTION_NONE)

function item_spider_aura_sphere:GetIntrinsicModifierName()
    return "modifier_aura"
end

modifier_aura = class({
    IsHidden                = function(self) return false end,
    IsPurgable              = function(self) return false end,
    IsDebuff                = function(self) return false end,
    IsBuff                  = function(self) return true end,
    RemoveOnDeath           = function(self) return false end,
    DeclareFunctions        = function(self)
        return {
            MODIFIER_PROPERTY_PREATTACK_BONUS_DAMAGE,
            MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL,
            MODIFIER_PROPERTY_OVERRIDE_ABILITY_SPECIAL_VALUE
        }
    end,
})

function modifier_aura:OnCreated(params)
    dmgMin = self:GetAbility():GetSpecialValueFor("dmgMin")
    dmgMax = self:GetAbility():GetSpecialValueFor("dmgMax")
    if dmg==nil then
    dmg = RandomInt(dmgMin,dmgMax)
    end
    print("Dmg added")
end

function modifier_aura:GetModifierOverrideAbilitySpecial( params )
    if self:GetParent() == nil or params.ability == nil then
        return 0
    end

    local szAbilityName = params.ability:GetAbilityName()
    local szSpecialValueName = params.ability_special_value

    if szAbilityName ~= "item_spider_aura_sphere" then
        return 0
    end

    if szSpecialValueName == "dmg" then
        return 1
    end
    return 0
end

function modifier_aura:GetModifierOverrideAbilitySpecialValue( params )
    local szAbilityName = params.ability:GetAbilityName()
    if szAbilityName ~= "item_spider_aura_sphere" then
        return 0
    end

    local szSpecialValueName = params.ability_special_value
    if szSpecialValueName == "dmg" then
        local nSpecialLevel = params.ability_special_level
        local flBaseValue = params.ability:GetLevelSpecialValueNoOverride( szSpecialValueName, nSpecialLevel )
        return dmg
    end
    return 0
end

function modifier_aura:GetModifierPreAttack_BonusDamage()
    return dmg
end
 

Olezha

Пользователь
27 Сен 2020
10
1
Спасибо, правда позже я понял, что мне эта функция тут ничем не поможет((
Lua:
function item_spider_aura_sphere:Spawn()
end

В общем, решил что можно повесить вечный модификатор, который постоянно проверяет предметы и переписывает значения, но на предметах, которые неактивны он так же не срабатывает, хотя модификатор есть...
Я уже не понимаю, правильно ли я пытаюсь решить задачу, лол

Народ, нужны ваши идеи, все вопросы выше актуальны
Представьте, что можно будет сделать систему айтемов как в пое(Path of Exile) или диабло, это ж такие мапки можно будет делать, просто я этого нигде не припомню.
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Почему не поможет?
Ты в ней рандом делаешь, она один раз запускается при создании предмета
 

Olezha

Пользователь
27 Сен 2020
10
1
Рандом то сделать можно, но сами значения то как переписать?
Пока вещь не наденешь, те 2 функции работать не начнут, да и при снятии снова будет базовое значение
 
Последнее редактирование:

Olezha

Пользователь
27 Сен 2020
10
1
И вроде как не 1 раз запускается, а каждый раз когда выкладываешь и берешь предмет она срабатывает:
1602247892299.png
1602247936482.png
1602247976413.png
Но меня щас больше абилити спешл волнует
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Как-то так думаю
Lua:
function item_spider_aura_sphere:Spawn()
    if not self.randomValue then
        self.randomValue = RandomInt(1,10)
    end
end

function modifier_aura:GetModifierOverrideAbilitySpecialValue( params )
    local szAbilityName = params.ability:GetAbilityName()
    if szAbilityName ~= "item_spider_aura_sphere" then
        return 0
    end

    local szSpecialValueName = params.ability_special_value
    if szSpecialValueName == "dmg" then
        return params.ability.randomValue
    end
    return 0
end
 

Olezha

Пользователь
27 Сен 2020
10
1
Ну мы тем самым просто генерацию рандомного числа переносим в более подходящее место, но функция всё так же работает только когда предмет у тебя, а так по нулям всё показывает
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Даже если модификатор висит постоянно на юните?
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Тогда легче запилить кастомную систему с кастом тултипами
 

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Да, через него.
Нужно отлавливать ивент тултипа и менять содержимое панели с тултипом. Либо вообще его скрывать и показывать свой кастомный.

Больше особо помочь не могу, тут нужно разбираться)
 
  • Нравится
Реакции: Olezha

ZLOY

Администратор
Команда форума
27 Июн 2016
953
182
Когда-то в дискорде моддоты кидали скрины с переделанными тултипами. Попробуй там спросить.
 

Zachary Greenburg

Пользователь
18 Июл 2020
41
14
Друг, остановись... Ты не знаешь, на что они тебя послали... Прошу, пожалей себя
 
  • Хаха
Реакции: Olezha

Olezha

Пользователь
27 Сен 2020
10
1
Друг, остановись... Ты не знаешь, на что они тебя послали... Прошу, пожалей себя
Поздно)) Теперь меня может остановить только тот кто расскажет как этот клятый AbilitySpecial менять
1602268553315.png
 
Последнее редактирование:
  • Нравится
Реакции: Zachary Greenburg
Реклама: