Rubick's Journey. Это моя тема, и тут мои вопросы для моей кастомки

.фи

Активный
21 Мар 2018
108
13
Всем привет.
Основы скриптинга, панорамы и создания ландшафта я уже прохавал, осталось дело за малым.

Меня интересует как изменить скилл рубика дабы он крал заклинания у крипов и (пускай даже ни разу использованные).
Иными словами, я бы хотел заспаунить (к примеру) овцу, у которой в Abilities прописан камуфляж monkey_king (или что-нибудь проще, в процессе я уже придумаю задания и их выполнения с помощью краденных абилок).

Подскажите, как это сделать.
На счёт выученного с 1 lvl заклинания, уже разобрался в соседних темах.
 

.фи

Активный
21 Мар 2018
108
13
Первые попытки закончились безрезультатно.
Скачал SpellLibrary и подкрутил свойства ульта.

Заменил
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_CREEP"
"AbilityType" "ABILITY_TYPE_BASIC"

Вкачиваю, использую на крипа (который таки прокнул заклинание) и ничего не происходит.
 

HappyFeedFriends

Друзья CG
14 Авг 2017
540
32
Проект
Battle Heroes Arena
Всем привет.
Основы скриптинга, панорамы и создания ландшафта я уже прохавал, осталось дело за малым.

Меня интересует как изменить скилл рубика дабы он крал заклинания у крипов и (пускай даже ни разу использованные).
Иными словами, я бы хотел заспаунить (к примеру) овцу, у которой в Abilities прописан камуфляж monkey_king (или что-нибудь проще, в процессе я уже придумаю задания и их выполнения с помощью краденных абилок).

Подскажите, как это сделать.
На счёт выученного с 1 lvl заклинания, уже разобрался в соседних темах.
Также как и у героев,только с возможностью юзать на юнитов.
 

HappyFeedFriends

Друзья CG
14 Авг 2017
540
32
Проект
Battle Heroes Arena
Первые попытки закончились безрезультатно.
Скачал SpellLibrary и подкрутил свойства ульта.

Заменил
"AbilityUnitTargetType" "DOTA_UNIT_TARGET_CREEP"
"AbilityType" "ABILITY_TYPE_BASIC"

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

.фи

Активный
21 Мар 2018
108
13
Нужен именно юз абилки,в гайдах есть,как заставить юнита юзать абилку.

Happy, ты можешь добавить меня вк дабы узреть что я имею ввиду: vk.com/frigo
Крип все же юзает абилку (уточню - lua script), но скилл не появляется у меня в панораме (F button).

...Видимо потому-что я использую кастомные абилки для крипа.
 

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
196
www.dotabuff.com
Проект
Roshan defense

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
196
www.dotabuff.com
Проект
Roshan defense
Как ты вообще планируешь чтобы это работало ?
 

.фи

Активный
21 Мар 2018
108
13
Как ты вообще планируешь чтобы это работало ?

Ну как обычный ульт рубика, только чтоб и крипов можно было таргетить.

Я только что изменил скилл Doom_Bringer и всё равно он не работает на крипов. Видимо SpellLibrary сломан.
Не вижу другого выхода как ждать ответа от специалистов Луа.

Даже в дискорде Америкосам написал, авось узнаю что к чему.
 

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
196
www.dotabuff.com
Проект
Roshan defense
Как вариант сделать слушателя абилок
когда абиока была использована , то назначить последнюю абилку юнита.
target = event.caster
targer.last_used_ability = event.ability
когда будет использван на крипа , то проверит targer.last_used_ability ~= nil
и сворует её ,а адальше дело техники
 

.фи

Активный
21 Мар 2018
108
13
Как вариант сделать слушателя абилок
когда абиока была использована , то назначить последнюю абилку юнита.
target = event.caster
targer.last_used_ability = event.ability
когда будет использван на крипа , то проверит targer.last_used_ability ~= nil
и сворует её ,а адальше дело техники

Спасибо.
Было бы неплохо, или даже лучше сказать здорово! если бы ты скинул пример, ссылку на туториал...
Но думаю, смогу найти сам, недавно читал.

Вот только куда именно пихать слушателя, ещё пока не знаю.

Добавил спустя минуту.
Погоди-ка. Сработало итак!

Оказывается, всё решалось свойствами абилки npc_abilities_custom. А именно:
"IsOnCastBar" "0 / 1"
 
  • Нравится
Реакции: vulkantsk

.фи

Активный
21 Мар 2018
108
13
Однако я жду Ваших советов касательно скилла Рубика.
Он всё ещё не работает.

Код:
function SpellSteal(keys)

    local caster = keys.caster
    local ability = keys.ability
    
    local new_ability_name = ability.new_steal:GetAbilityName()
    local new_ability_level = ability.new_steal:GetLevel()
    
    -- If the caster has no stolen spell, swap the new one with the empty spell
    if caster:HasModifier("modifier_spell_steal_datadriven") == false then
        caster:AddAbility(new_ability_name)
        caster:SwapAbilities("empty1_datadriven", new_ability_name, false, true)
        caster:FindAbilityByName(new_ability_name):SetLevel(new_ability_level)
    -- If the new stolen ability is not the same as the previous one, swap them
    elseif new_ability_name ~= ability.current_steal:GetAbilityName() then
        caster:AddAbility(new_ability_name)
        caster:SwapAbilities(ability.current_steal:GetAbilityName(), new_ability_name, false, true)
        caster:FindAbilityByName(new_ability_name):SetLevel(new_ability_level)
    end
    
    ability.current_steal = ability.new_steal
    ability:ApplyDataDrivenModifier(caster, caster, "modifier_spell_steal_datadriven", {})
end
 
20 Дек 2016
892
170
Я использую спеллайбрари только для того, чтобы смотреть имена звуковых и визуальных эффектов абилок, ибо ни для чего другого она уже почти не годна.
Сделай свой луа скилл с нормальной фильтрацией цели способности (пример можно посмотреть lua_abilities_example > lina_laguna_blade_lua).
И для записи последней абилки в луа не нужна никакая глобальная аура, но суть примерно та же, в эвенте MODIFIER_EVENT_ON_ABILITY_EXECUTED записываешь абилку куда-нибудь (можно прям в юнита).
До того момента, пока не придется воровать взаимосвязанные способности, проблем возникнуть не должно.
 

.фи

Активный
21 Мар 2018
108
13
Я решил проблему иначе. Просто модифицируя скилл дума, налеплю потом анимацию/текстуру ульта Рубика.
Однако, я не могу понять почему краденные скиллы не встают на свои места.

Вот скрин. Кто нибудь understood why?
 

Вложения

  • 1540053474975.png
    1540053474975.png
    273.1 KB · Просмотры: 17

shesmu

Продвинутый
22 Фев 2018
158
22
У меня 4 и 5 слоты как были пустые, так и остались.

Когда беру скиллы крипа, появляются 7 и 8. Вот чего я ною)
думаю дум брингер свапает свои пустые абилки на абилки съеденного крипа, а у рубика свои пустые абилки (легко проверить geroi:GetAbilityByIndex(int iIndex):GetAbilityName() )
 

.фи

Активный
21 Мар 2018
108
13
думаю дум брингер свапает свои пустые абилки на абилки съеденного крипа, а у рубика свои пустые абилки (легко проверить geroi:GetAbilityByIndex(int iIndex):GetAbilityName() )
Так и что мне тут надо заменить в таком случае?:

Код:
function Devour( keys )
    local caster = keys.caster
    local target = keys.target
    local ability = keys.ability
    local ability_level = ability:GetLevel() - 1

    -- Ability variables
    local target_hp = target:GetHealth()
    local health_per_second = ability:GetLevelSpecialValueFor("health_per_second", ability_level)
    local modifier = keys.modifier
    local modifier_duration = target_hp/health_per_second
    

        
        -- Apply the modifier and kill the target
    ability:ApplyDataDrivenModifier(caster, caster, modifier, {duration = modifier_duration})
    target:Kill(ability, caster)

    -- Setting up the table for allowed devour targets
    local devour_table = {}
    local doom_empty1 = keys.doom_empty1
    local doom_empty2 = keys.doom_empty2

    -- Insert the names of the units that you want to be valid targets for ability stealing
    table.insert(devour_table, "npc_dota_neutral_polar_furbolg_ursa_warrior") -- Red Hellbear
    table.insert(devour_table, "npc_dota_neutral_giant_wolf") -- Small wolf
    table.insert(devour_table, "npc_dota_creature_spider_medium") -- Big centaur
    table.insert(devour_table, "npc_dota_creature_qz") -- Qz

    -- Checks if the killed unit is in the table for allowed targets
    for _,v in ipairs(devour_table) do
        if target:GetUnitName() == v then
            -- Get the first two abilities
            local ability1 = target:GetAbilityByIndex(0)
            local ability2 = target:GetAbilityByIndex(1)

            -- If we already devoured a target and stole an ability from before then clear it
            if caster.devour_ability1 then
                caster:SwapAbilities(doom_empty1, caster.devour_ability1, true, false)
                caster:RemoveAbility(caster.devour_ability1)
            end

            if caster.devour_ability2 then
                caster:SwapAbilities(doom_empty2, caster.devour_ability2, true, false)
                caster:RemoveAbility(caster.devour_ability2)
            end

            -- Checks if the ability actually exist on the target
            if ability1 then
                -- Get the name and add it to the caster
                local ability1_name = ability1:GetAbilityName()
                caster:AddAbility(ability1_name)

                -- Make the stolen ability active, level it up and save it in the caster handle for later checks
                caster:SwapAbilities(doom_empty1, ability1_name, false, true)
                caster.devour_ability1 = ability1_name
                caster:FindAbilityByName(ability1_name):SetLevel(ability1:GetLevel())
            end

            -- Checks if the ability actually exist on the target
            if ability2 then
                -- Get the name and add it to the caster
                local ability2_name = ability2:GetAbilityName()
                caster:AddAbility(ability2_name)

                -- Make the stolen ability active, level it up and save it in the caster handle for later checks
                caster:SwapAbilities(doom_empty2, ability2_name, false, true)
                caster.devour_ability2 = ability2_name
                caster:FindAbilityByName(ability2_name):SetLevel(ability2:GetLevel())
            end
        end
    end
end
 

shesmu

Продвинутый
22 Фев 2018
158
22
Так и что мне тут надо заменить в таком случае?:

Код:
function Devour( keys )
    local caster = keys.caster
    local target = keys.target
    local ability = keys.ability
    local ability_level = ability:GetLevel() - 1

    -- Ability variables
    local target_hp = target:GetHealth()
    local health_per_second = ability:GetLevelSpecialValueFor("health_per_second", ability_level)
    local modifier = keys.modifier
    local modifier_duration = target_hp/health_per_second
   

       
        -- Apply the modifier and kill the target
    ability:ApplyDataDrivenModifier(caster, caster, modifier, {duration = modifier_duration})
    target:Kill(ability, caster)

    -- Setting up the table for allowed devour targets
    local devour_table = {}
    local doom_empty1 = keys.doom_empty1
    local doom_empty2 = keys.doom_empty2

    -- Insert the names of the units that you want to be valid targets for ability stealing
    table.insert(devour_table, "npc_dota_neutral_polar_furbolg_ursa_warrior") -- Red Hellbear
    table.insert(devour_table, "npc_dota_neutral_giant_wolf") -- Small wolf
    table.insert(devour_table, "npc_dota_creature_spider_medium") -- Big centaur
    table.insert(devour_table, "npc_dota_creature_qz") -- Qz

    -- Checks if the killed unit is in the table for allowed targets
    for _,v in ipairs(devour_table) do
        if target:GetUnitName() == v then
            -- Get the first two abilities
            local ability1 = target:GetAbilityByIndex(0)
            local ability2 = target:GetAbilityByIndex(1)

            -- If we already devoured a target and stole an ability from before then clear it
            if caster.devour_ability1 then
                caster:SwapAbilities(doom_empty1, caster.devour_ability1, true, false)
                caster:RemoveAbility(caster.devour_ability1)
            end

            if caster.devour_ability2 then
                caster:SwapAbilities(doom_empty2, caster.devour_ability2, true, false)
                caster:RemoveAbility(caster.devour_ability2)
            end

            -- Checks if the ability actually exist on the target
            if ability1 then
                -- Get the name and add it to the caster
                local ability1_name = ability1:GetAbilityName()
                caster:AddAbility(ability1_name)

                -- Make the stolen ability active, level it up and save it in the caster handle for later checks
                caster:SwapAbilities(doom_empty1, ability1_name, false, true)
                caster.devour_ability1 = ability1_name
                caster:FindAbilityByName(ability1_name):SetLevel(ability1:GetLevel())
            end

            -- Checks if the ability actually exist on the target
            if ability2 then
                -- Get the name and add it to the caster
                local ability2_name = ability2:GetAbilityName()
                caster:AddAbility(ability2_name)

                -- Make the stolen ability active, level it up and save it in the caster handle for later checks
                caster:SwapAbilities(doom_empty2, ability2_name, false, true)
                caster.devour_ability2 = ability2_name
                caster:FindAbilityByName(ability2_name):SetLevel(ability2:GetLevel())
            end
        end
    end
end
хз, даже не представляю что хранится в keys, но думаю этого хватит:
local doom_empty1 = caster:GetAbilityByIndex(4)
local doom_empty2 = caster:GetAbilityByIndex(5)
надеюсь поймешь какие строчки заменять
 
  • Нравится
Реакции: .фи

.фи

Активный
21 Мар 2018
108
13
хз, даже не представляю что хранится в keys, но думаю этого хватит:
local doom_empty1 = caster:GetAbilityByIndex(4)
local doom_empty2 = caster:GetAbilityByIndex(5)
надеюсь поймешь какие строчки заменять

Спасибо, да я уловил ход мыслей. Но, увы и ах, не вышло.

Более того, теперь ворованный скилл ещё и не прокачан.
+ консоль ругается что Parameter Type mismatch stack traceback.

В keys хранится вот что:
Код:
"RunScript"
        {
            "ScriptFile"    "heroes/hero_doom_bringer/devour.lua"
            "Function"        "Devour"
            "modifier"        "modifier_devour_datadriven"
            "doom_empty1"    "doom_bringer_empty1_datadriven"
            "doom_empty2"    "doom_bringer_empty2_datadriven"

Даже не знаю как заставить эти ключи встать на 4 и 5 слоты.
 
Последнее редактирование:
Реклама: