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

.фи

Пользователь
21 Мар 2018
58
2
8
27
Реакции
2 0 0
#1
Всем привет.
Основы скриптинга, панорамы и создания ландшафта я уже прохавал, осталось дело за малым.

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

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

.фи

Пользователь
21 Мар 2018
58
2
8
27
Реакции
2 0 0
#2
Первые попытки закончились безрезультатно.
Скачал SpellLibrary и подкрутил свойства ульта.

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

Вкачиваю, использую на крипа (который таки прокнул заклинание) и ничего не происходит.
 
14 Авг 2017
505
43
28
18
Проект
Battle Heroes Arena
Реакции
42 0 1
#3
Всем привет.
Основы скриптинга, панорамы и создания ландшафта я уже прохавал, осталось дело за малым.

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

Подскажите, как это сделать.
На счёт выученного с 1 lvl заклинания, уже разобрался в соседних темах.
Также как и у героев,только с возможностью юзать на юнитов.
 
14 Авг 2017
505
43
28
18
Проект
Battle Heroes Arena
Реакции
42 0 1
#4
Первые попытки закончились безрезультатно.
Скачал SpellLibrary и подкрутил свойства ульта.

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

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

.фи

Пользователь
21 Мар 2018
58
2
8
27
Реакции
2 0 0
#5
Нужен именно юз абилки,в гайдах есть,как заставить юнита юзать абилку.
Happy, ты можешь добавить меня вк дабы узреть что я имею ввиду: vk.com/frigo
Крип все же юзает абилку (уточню - lua script), но скилл не появляется у меня в панораме (F button).

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

vulkantsk

Друзья CG
21 Июн 2017
677
84
28
18
https://steamcommunity.com/profiles/76561198307890
www.dotabuff.com
Проект
Roshan defense
Реакции
79 0 5
#6

.фи

Пользователь
21 Мар 2018
58
2
8
27
Реакции
2 0 0
#7

.фи

Пользователь
21 Мар 2018
58
2
8
27
Реакции
2 0 0
#9
Как ты вообще планируешь чтобы это работало ?
Ну как обычный ульт рубика, только чтоб и крипов можно было таргетить.

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

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

vulkantsk

Друзья CG
21 Июн 2017
677
84
28
18
https://steamcommunity.com/profiles/76561198307890
www.dotabuff.com
Проект
Roshan defense
Реакции
79 0 5
#10
Как вариант сделать слушателя абилок
когда абиока была использована , то назначить последнюю абилку юнита.
target = event.caster
targer.last_used_ability = event.ability
когда будет использван на крипа , то проверит targer.last_used_ability ~= nil
и сворует её ,а адальше дело техники
 
Реклама:

.фи

Пользователь
21 Мар 2018
58
2
8
27
Реакции
2 0 0
#11
Как вариант сделать слушателя абилок
когда абиока была использована , то назначить последнюю абилку юнита.
target = event.caster
targer.last_used_ability = event.ability
когда будет использван на крипа , то проверит targer.last_used_ability ~= nil
и сворует её ,а адальше дело техники
Спасибо.
Было бы неплохо, или даже лучше сказать здорово! если бы ты скинул пример, ссылку на туториал...
Но думаю, смогу найти сам, недавно читал.

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

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

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

.фи

Пользователь
21 Мар 2018
58
2
8
27
Реакции
2 0 0
#12
Однако я жду Ваших советов касательно скилла Рубика.
Он всё ещё не работает.

Код:
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
545
104
28
10
Проект
DI:LS
Реакции
104 0 0
#13
Я использую спеллайбрари только для того, чтобы смотреть имена звуковых и визуальных эффектов абилок, ибо ни для чего другого она уже почти не годна.
Сделай свой луа скилл с нормальной фильтрацией цели способности (пример можно посмотреть lua_abilities_example > lina_laguna_blade_lua).
И для записи последней абилки в луа не нужна никакая глобальная аура, но суть примерно та же, в эвенте MODIFIER_EVENT_ON_ABILITY_EXECUTED записываешь абилку куда-нибудь (можно прям в юнита).
До того момента, пока не придется воровать взаимосвязанные способности, проблем возникнуть не должно.
 

.фи

Пользователь
21 Мар 2018
58
2
8
27
Реакции
2 0 0
#14
Я решил проблему иначе. Просто модифицируя скилл дума, налеплю потом анимацию/текстуру ульта Рубика.
Однако, я не могу понять почему краденные скиллы не встают на свои места.

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

Вложения

Реклама:

.фи

Пользователь
21 Мар 2018
58
2
8
27
Реакции
2 0 0
#16

shesmu

Продвинутый
22 Фев 2018
156
33
18
23
Реакции
30 0 3
#17
У меня 4 и 5 слоты как были пустые, так и остались.

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

.фи

Пользователь
21 Мар 2018
58
2
8
27
Реакции
2 0 0
#18
думаю дум брингер свапает свои пустые абилки на абилки съеденного крипа, а у рубика свои пустые абилки (легко проверить 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
156
33
18
23
Реакции
30 0 3
#19
Так и что мне тут надо заменить в таком случае?:

Код:
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
58
2
8
27
Реакции
2 0 0
#20
хз, даже не представляю что хранится в 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 слоты.
 
Последнее редактирование:
Реклама:
Реклама:
//SNOW CHRISTMAS