Как сделать режим по типу дезматча?

Dowakhin

Пользователь
14 Июл 2020
20
1
Как сделать режим для кастомки, где после смерти игроку выдается рандомный герой. Аналогичный есть в самой доте, я хотел бы добавить такой себе в кастомку.

делал что-то по типу этого:
Код:
if hero:IsRealHero() == true then
            if GetMapName() == "8_teams_hero_estafeta" then
                local heroes = LoadKeyValues("scripts/npc/herolist.txt")
                local id = hero:GetPlayerOwner():GetPlayerID()
                local hero = RandomInt(1, #HEROES)

                PlayerResource:ReplaceHeroWith(id, hero, 700, 0)
                UTIL_Remove(PlayerResource:GetPlayer(id):GetAssignedHero())
                local new_hero = PlayerResource:GetPlayer(id):GetAssignedHero()
                PlayerResource:SetCameraTarget(new_hero:GetPlayerOwnerID(), new_hero)
            end
        end
Но не работало.
 

Dowakhin

Пользователь
14 Июл 2020
20
1
У тебя hero имеет значение number, попробуй
Lua:
local hero = heroes[RandomInt(1, #heroes)]
Я сдеалал так, но все-равно пока ничего не роботает, в консоли выбивает ошибку "ReplaceHeroWith failed as the unit (null) is invalid."
Я так понимаю, "unit" здесь это второе поле в "ReplaceHeroWith", то есть:
Код:
ReplaceHeroWith(iPlayerID, pszHeroClass, nGold, nXP)
Вот что сейчас у меня:
Код:
if player:IsRealHero() == true then
            if GetMapName() == "8_teams_hero_estafeta" then
                local heroes = LoadKeyValues("scripts/npc/herolist.txt")
                local id = player:GetPlayerOwner():GetPlayerID()
                local hero = heroes[RandomInt(1, #heroes)]

                --UTIL_Remove(PlayerResource:GetPlayer(id):GetAssignedHero())
                PlayerResource:ReplaceHeroWith(id, heroes[hero], player:GetGold(), player:GetCurrentXP())
            end
        end
 

Дикий Пёс

Друзья CG
28 Июн 2017
411
92
Проект
Petri Reborn
Я сдеалал так, но все-равно пока ничего не роботает, в консоли выбивает ошибку "ReplaceHeroWith failed as the unit (null) is invalid."
Я так понимаю, "unit" здесь это второе поле в "ReplaceHeroWith", то есть:
Код:
ReplaceHeroWith(iPlayerID, pszHeroClass, nGold, nXP)
Вот что сейчас у меня:
Код:
if player:IsRealHero() == true then
            if GetMapName() == "8_teams_hero_estafeta" then
                local heroes = LoadKeyValues("scripts/npc/herolist.txt")
                local id = player:GetPlayerOwner():GetPlayerID()
                local hero = heroes[RandomInt(1, #heroes)]

                --UTIL_Remove(PlayerResource:GetPlayer(id):GetAssignedHero())
                PlayerResource:ReplaceHeroWith(id, heroes[hero], player:GetGold(), player:GetCurrentXP())
            end
        end
мне кажется твой heroes[hero] не строка, а таблица
 

Dowakhin

Пользователь
14 Июл 2020
20
1
мне кажется твой heroes[hero] не строка, а таблица
Да, и вот главный вопрос, как вместо того значения что у меня есть в ReplaceHeroWith во втором аргументе вставить нужное? Я читал немного о массивах в Lua, но это немного не тот массив как я понимаю
 

Дикий Пёс

Друзья CG
28 Июн 2017
411
92
Проект
Petri Reborn
Да, и вот главный вопрос, как вместо того значения что у меня есть в ReplaceHeroWith во втором аргументе вставить нужное? Я читал немного о массивах в Lua, но это немного не тот массив как я понимаю
вот функция которая возвращает имя героя, я её использовал при создании своих ботов
Lua:
function ZBots:GetRandomHero()
    local kv = LoadKeyValues(ZBots.HERO_LIST_PATH)
    local hero = ""
    for k,v in pairs(kv) do
        hero = k
        local rand = RandomInt(0, 4)
       
        if v == 1 and rand == 3 and not ZBots:HeroPicked(k) then
            return hero
        end
    end
end
там где ZBots.HERO_LIST_PATH соответственно путь к твоему файлу с героями
and not ZBots:HeroPicked(k) можешь убрать или вставить свою функцию проверки
 
  • Нравится
Реакции: Dowakhin

Dowakhin

Пользователь
14 Июл 2020
20
1
В принципе, все работает, но замена есть только один раз, то есть только после первой смерти она происходит. В консоли пишет:
"ReplaceHeroWith failed as player has no current hero to replace."
Может этого нового героя нужно как-нибудь привязать к игроку?
Вот как сейчас у меня выглядит код (вызывается в слушателе OnNPCSpawned):
Код:
if player:IsRealHero() == true then
            if GetMapName() == "8_teams_hero_estafeta" then
                local heroes = LoadKeyValues("scripts/npc/herolist.txt")
                local id = player:GetPlayerOwner():GetPlayerID()

                local gold = player:GetGold()
                local xp = player:GetCurrentXP()

                local rand = RandomInt(1, #heroes)
                local hero = ""
                local i = 1
                for k,v in pairs(heroes) do
                    if rand == i then
                        hero = k
                    end
                    i = i + 1
                end

                PlayerResource:ReplaceHeroWith(id, hero, gold, xp)
            end
        end
Еще я хотел бы добавить перенос предметов и опыта, но это совсем другая история.
 

Дикий Пёс

Друзья CG
28 Июн 2017
411
92
Проект
Petri Reborn
В принципе, все работает, но замена есть только один раз, то есть только после первой смерти она происходит. В консоли пишет:
"ReplaceHeroWith failed as player has no current hero to replace."
Может этого нового героя нужно как-нибудь привязать к игроку?
Вот как сейчас у меня выглядит код (вызывается в слушателе OnNPCSpawned):
Код:
if player:IsRealHero() == true then
            if GetMapName() == "8_teams_hero_estafeta" then
                local heroes = LoadKeyValues("scripts/npc/herolist.txt")
                local id = player:GetPlayerOwner():GetPlayerID()

                local gold = player:GetGold()
                local xp = player:GetCurrentXP()

                local rand = RandomInt(1, #heroes)
                local hero = ""
                local i = 1
                for k,v in pairs(heroes) do
                    if rand == i then
                        hero = k
                    end
                    i = i + 1
                end

                PlayerResource:ReplaceHeroWith(id, hero, gold, xp)
            end
        end
Еще я хотел бы добавить перенос предметов и опыта, но это совсем другая история.
у тебя в RandomInt получается что герой выпадет в 1 из колва героев случае, может быть такое что просто ни один герой не выпадает и строчка остаётся пустой
 

Dowakhin

Пользователь
14 Июл 2020
20
1
у тебя в RandomInt получается что герой выпадет в 1 из колва героев случае, может быть такое что просто ни один герой не выпадает и строчка остаётся пустой
а как может быть что строчка пустая? ну RandomInt с 1 начинается (так ведь?), а вот herolist:
Код:
"CustomHeroList"
{
    "npc_dota_hero_abaddon"                "1"
    //"npc_dota_hero_alchemist"                "0"
    //"npc_dota_hero_ancient_apparition"     "0"
    "npc_dota_hero_antimage"            "1"
    //"npc_dota_hero_arc_warden"            "0"
    "npc_dota_hero_axe"                    "1"
    //"npc_dota_hero_bane"                    "0"
    //"npc_dota_hero_batrider"                "0"
    "npc_dota_hero_beastmaster"            "1"
    //"npc_dota_hero_bloodseeker"            "0"
    "npc_dota_hero_bounty_hunter"        "1"
    "npc_dota_hero_brewmaster"            "1"
    "npc_dota_hero_bristleback"            "1"
    "npc_dota_hero_broodmother"            "1"
    //"npc_dota_hero_centaur"                "0"
    "npc_dota_hero_chaos_knight"        "1"
    //"npc_dota_hero_chen"                    "0"
    "npc_dota_hero_clinkz"                "1"
    "npc_dota_hero_rattletrap"            "1"
    "npc_dota_hero_crystal_maiden"        "1"
    "npc_dota_hero_dark_seer"            "1"
    //"npc_dota_hero_dark_willow"            "0"
    //"npc_dota_hero_dazzle"                "0"
    //"npc_dota_hero_death_prophet"            "0"
    //"npc_dota_hero_disruptor"                "0"
    "npc_dota_hero_doom_bringer"        "1"
    "npc_dota_hero_dragon_knight"        "1"
    //"npc_dota_hero_drow_ranger"            "0"
    //"npc_dota_hero_earth_spirit"            "0"
    //"npc_dota_hero_earthshaker"            "0"
    //"npc_dota_hero_elder_titan"            "0"
    //"npc_dota_hero_ember_spirit"            "0"
    //"npc_dota_hero_enchantress"            "0"
    //"npc_dota_hero_enigma"                "0"
    "npc_dota_hero_faceless_void"        "1"
    //"npc_dota_hero_grimstroke"            "0"
    //"npc_dota_hero_gyrocopter"            "0"
    //"npc_dota_hero_huskar"                "0"
    "npc_dota_hero_invoker"                "1"
    //"npc_dota_hero_wisp"                    "0"
    //"npc_dota_hero_jakiro"                "0"
    //"npc_dota_hero_juggernaut"            "0"
    "npc_dota_hero_keeper_of_the_light"    "1"
    "npc_dota_hero_kunkka"                "1"
    "npc_dota_hero_legion_commander"    "1"
    //"npc_dota_hero_leshrac"                "0"
    //"npc_dota_hero_lich"                    "0"
    "npc_dota_hero_life_stealer"        "1"
    //"npc_dota_hero_lina"                    "0"
    //"npc_dota_hero_lion"                    "0"
    //"npc_dota_hero_lone_druid"            "0"
    //"npc_dota_hero_luna"                    "0"
    "npc_dota_hero_lycan"                "1"
    "npc_dota_hero_magnataur"            "1"
    //"npc_dota_hero_medusa"                "0"
    "npc_dota_hero_meepo"                "1"
    "npc_dota_hero_mirana"                "1"
    //"npc_dota_hero_morphling"                "0"
    //"npc_dota_hero_monkey_king"            "0"
    //"npc_dota_hero_naga_siren"            "0"
    "npc_dota_hero_furion"                "1"
    //"npc_dota_hero_necrolyte"                "0"
    "npc_dota_hero_night_stalker"        "1"
    //"npc_dota_hero_nyx_assassin"            "0"
    //"npc_dota_hero_ogre_magi"                "0"
    "npc_dota_hero_omniknight"            "1"
    //"npc_dota_hero_oracle"                "0"
    "npc_dota_hero_obsidian_destroyer"    "1"
    //"npc_dota_hero_phantom_assassin"        "0"
    //"npc_dota_hero_phantom_lancer"        "0"
    "npc_dota_hero_pangolier"            "1"
    "npc_dota_hero_phoenix"                "1"
    //"npc_dota_hero_puck"                    "0"
    "npc_dota_hero_pudge"                "1"
    //"npc_dota_hero_pugna"                    "0"
    //"npc_dota_hero_queenofpain"            "0"
    //"npc_dota_hero_razor"                    "0"
    "npc_dota_hero_riki"                "1"
    //"npc_dota_hero_rubick"                "0"
    //"npc_dota_hero_sand_king"                "0"
    //"npc_dota_hero_shadow_demon"            "0"
    //"npc_dota_hero_nevermore"                "0"
    //"npc_dota_hero_shadow_shaman"            "0"
    //"npc_dota_hero_silencer"                "0"
    //"npc_dota_hero_skywrath_mage"            "0"
    //"npc_dota_hero_slardar"                "0"
    "npc_dota_hero_slark"                "1"
    //"npc_dota_hero_sniper"                "0"
    //"npc_dota_hero_spectre"                "0"
    //"npc_dota_hero_spirit_breaker"        "0"
    //"npc_dota_hero_storm_spirit"            "0"
    "npc_dota_hero_sven"                "1"
    //"npc_dota_hero_techies"                "0"
    //"npc_dota_hero_templar_assassin"        "0"
    //"npc_dota_hero_terrorblade"            "0"
    //"npc_dota_hero_tidehunter"            "0"
    //"npc_dota_hero_shredder"                "0"
    //"npc_dota_hero_tinker"                "0"
    //"npc_dota_hero_tiny"                    "0"
    "npc_dota_hero_treant"                "1"
    //"npc_dota_hero_troll_warlord"            "0"
    //"npc_dota_hero_tusk"                    "0"
    //"npc_dota_hero_abyssal_underlord"        "0"
    //"npc_dota_hero_undying"                "0"
    //"npc_dota_hero_ursa"                    "0"
    //"npc_dota_hero_vengefulspirit"        "0"
    //"npc_dota_hero_venomancer"            "0"
    //"npc_dota_hero_viper"                    "0"
    //"npc_dota_hero_visage"                "0"
    "npc_dota_hero_warlock"                "1"
    //"npc_dota_hero_weaver"                "0"
    "npc_dota_hero_windrunner"            "1"
    //"npc_dota_hero_winter_wyvern"            "0"
    //"npc_dota_hero_witch_doctor"            "0"
    "npc_dota_hero_skeleton_king"        "1"
    //"npc_dota_hero_zuus"                    "0"
    "npc_dota_hero_void_spirit"            "1"
}
Тут ненужные герои закоментированы, поэтому проверки никакой не нужно
 

Дикий Пёс

Друзья CG
28 Июн 2017
411
92
Проект
Petri Reborn
а как может быть что строчка пустая? ну RandomInt с 1 начинается (так ведь?), а вот herolist:
Код:
"CustomHeroList"
{
    "npc_dota_hero_abaddon"                "1"
    //"npc_dota_hero_alchemist"                "0"
    //"npc_dota_hero_ancient_apparition"     "0"
    "npc_dota_hero_antimage"            "1"
    //"npc_dota_hero_arc_warden"            "0"
    "npc_dota_hero_axe"                    "1"
    //"npc_dota_hero_bane"                    "0"
    //"npc_dota_hero_batrider"                "0"
    "npc_dota_hero_beastmaster"            "1"
    //"npc_dota_hero_bloodseeker"            "0"
    "npc_dota_hero_bounty_hunter"        "1"
    "npc_dota_hero_brewmaster"            "1"
    "npc_dota_hero_bristleback"            "1"
    "npc_dota_hero_broodmother"            "1"
    //"npc_dota_hero_centaur"                "0"
    "npc_dota_hero_chaos_knight"        "1"
    //"npc_dota_hero_chen"                    "0"
    "npc_dota_hero_clinkz"                "1"
    "npc_dota_hero_rattletrap"            "1"
    "npc_dota_hero_crystal_maiden"        "1"
    "npc_dota_hero_dark_seer"            "1"
    //"npc_dota_hero_dark_willow"            "0"
    //"npc_dota_hero_dazzle"                "0"
    //"npc_dota_hero_death_prophet"            "0"
    //"npc_dota_hero_disruptor"                "0"
    "npc_dota_hero_doom_bringer"        "1"
    "npc_dota_hero_dragon_knight"        "1"
    //"npc_dota_hero_drow_ranger"            "0"
    //"npc_dota_hero_earth_spirit"            "0"
    //"npc_dota_hero_earthshaker"            "0"
    //"npc_dota_hero_elder_titan"            "0"
    //"npc_dota_hero_ember_spirit"            "0"
    //"npc_dota_hero_enchantress"            "0"
    //"npc_dota_hero_enigma"                "0"
    "npc_dota_hero_faceless_void"        "1"
    //"npc_dota_hero_grimstroke"            "0"
    //"npc_dota_hero_gyrocopter"            "0"
    //"npc_dota_hero_huskar"                "0"
    "npc_dota_hero_invoker"                "1"
    //"npc_dota_hero_wisp"                    "0"
    //"npc_dota_hero_jakiro"                "0"
    //"npc_dota_hero_juggernaut"            "0"
    "npc_dota_hero_keeper_of_the_light"    "1"
    "npc_dota_hero_kunkka"                "1"
    "npc_dota_hero_legion_commander"    "1"
    //"npc_dota_hero_leshrac"                "0"
    //"npc_dota_hero_lich"                    "0"
    "npc_dota_hero_life_stealer"        "1"
    //"npc_dota_hero_lina"                    "0"
    //"npc_dota_hero_lion"                    "0"
    //"npc_dota_hero_lone_druid"            "0"
    //"npc_dota_hero_luna"                    "0"
    "npc_dota_hero_lycan"                "1"
    "npc_dota_hero_magnataur"            "1"
    //"npc_dota_hero_medusa"                "0"
    "npc_dota_hero_meepo"                "1"
    "npc_dota_hero_mirana"                "1"
    //"npc_dota_hero_morphling"                "0"
    //"npc_dota_hero_monkey_king"            "0"
    //"npc_dota_hero_naga_siren"            "0"
    "npc_dota_hero_furion"                "1"
    //"npc_dota_hero_necrolyte"                "0"
    "npc_dota_hero_night_stalker"        "1"
    //"npc_dota_hero_nyx_assassin"            "0"
    //"npc_dota_hero_ogre_magi"                "0"
    "npc_dota_hero_omniknight"            "1"
    //"npc_dota_hero_oracle"                "0"
    "npc_dota_hero_obsidian_destroyer"    "1"
    //"npc_dota_hero_phantom_assassin"        "0"
    //"npc_dota_hero_phantom_lancer"        "0"
    "npc_dota_hero_pangolier"            "1"
    "npc_dota_hero_phoenix"                "1"
    //"npc_dota_hero_puck"                    "0"
    "npc_dota_hero_pudge"                "1"
    //"npc_dota_hero_pugna"                    "0"
    //"npc_dota_hero_queenofpain"            "0"
    //"npc_dota_hero_razor"                    "0"
    "npc_dota_hero_riki"                "1"
    //"npc_dota_hero_rubick"                "0"
    //"npc_dota_hero_sand_king"                "0"
    //"npc_dota_hero_shadow_demon"            "0"
    //"npc_dota_hero_nevermore"                "0"
    //"npc_dota_hero_shadow_shaman"            "0"
    //"npc_dota_hero_silencer"                "0"
    //"npc_dota_hero_skywrath_mage"            "0"
    //"npc_dota_hero_slardar"                "0"
    "npc_dota_hero_slark"                "1"
    //"npc_dota_hero_sniper"                "0"
    //"npc_dota_hero_spectre"                "0"
    //"npc_dota_hero_spirit_breaker"        "0"
    //"npc_dota_hero_storm_spirit"            "0"
    "npc_dota_hero_sven"                "1"
    //"npc_dota_hero_techies"                "0"
    //"npc_dota_hero_templar_assassin"        "0"
    //"npc_dota_hero_terrorblade"            "0"
    //"npc_dota_hero_tidehunter"            "0"
    //"npc_dota_hero_shredder"                "0"
    //"npc_dota_hero_tinker"                "0"
    //"npc_dota_hero_tiny"                    "0"
    "npc_dota_hero_treant"                "1"
    //"npc_dota_hero_troll_warlord"            "0"
    //"npc_dota_hero_tusk"                    "0"
    //"npc_dota_hero_abyssal_underlord"        "0"
    //"npc_dota_hero_undying"                "0"
    //"npc_dota_hero_ursa"                    "0"
    //"npc_dota_hero_vengefulspirit"        "0"
    //"npc_dota_hero_venomancer"            "0"
    //"npc_dota_hero_viper"                    "0"
    //"npc_dota_hero_visage"                "0"
    "npc_dota_hero_warlock"                "1"
    //"npc_dota_hero_weaver"                "0"
    "npc_dota_hero_windrunner"            "1"
    //"npc_dota_hero_winter_wyvern"            "0"
    //"npc_dota_hero_witch_doctor"            "0"
    "npc_dota_hero_skeleton_king"        "1"
    //"npc_dota_hero_zuus"                    "0"
    "npc_dota_hero_void_spirit"            "1"
}
Тут ненужные герои закоментированы, поэтому проверки никакой не нужно
RandomInt возвращает случайное число от первого до второго, то есть от 1 до количества героев
В проходе по всем героям у каждого героя есть шанс того что он выпадет, а именно если randomint вернула 1, если она не возвращает 1 значит идём к следующему герою и тд
 

Dowakhin

Пользователь
14 Июл 2020
20
1
RandomInt возвращает случайное число от первого до второго, то есть от 1 до количества героев
В проходе по всем героям у каждого героя есть шанс того что он выпадет, а именно если randomint вернула 1, если она не возвращает 1 значит идём к следующему герою и тд
Хорошо, спасибо за объяснение. Тогда почему может не выпадать герой? Вроде все правильно же
 

Дикий Пёс

Друзья CG
28 Июн 2017
411
92
Проект
Petri Reborn
инвентарь же передавать вот этими функциями, до замены копируешь(функция CopyInventory возвращает таблицу с предметами), после вставляешь
правда учти что все эти функции я писал несколько лет назад и всегда есть шанс что за это время чтото сломалось
Lua:
function CopyInventory(hero)
    local returnTable = {}
    local arrI = 0   
    
    for i = 0, 20 do
        local item = hero:GetItemInSlot(i)
        if item then
            returnTable[arrI] = {name = item:GetAbilityName(), cd = item:GetCooldownTimeRemaining(), slot = item:GetItemSlot(), charges1 = item:GetCurrentCharges(), charges2 = item:GetSecondaryCharges(),}
            arrI = arrI + 1
        end
    end
        
    return returnTable
end

function PasteInventory(hero, inventory)
    for i = 0, #inventory-1 do
        local item = CreateItem(inventory[i].name, hero, hero)
        hero:AddItem(item)
        item:StartCooldown(inventory[i].cd)
        item:SetCurrentCharges(inventory[i].charges1)
        item:SetSecondaryCharges(inventory[i].charges2)
            
        hero:SwapItems(item:GetItemSlot(), inventory[i].slot)
    end
end
 
  • Нравится
Реакции: Dowakhin

Dowakhin

Пользователь
14 Июл 2020
20
1
поставь RandomInt как у меня то есть с 0 до 4
Я попробую, спасибо за совет. Я правда немного не понимаю, у тебя возвращает героя если рандомное число выпадает на 3? А если оно ниразу на 3 не выпадет?
 

Дикий Пёс

Друзья CG
28 Июн 2017
411
92
Проект
Petri Reborn
Я попробую, спасибо за совет. Я правда немного не понимаю, у тебя возвращает героя если рандомное число выпадает на 3? А если оно ниразу на 3 не выпадет?
оно должно выпасть из 20 раз, хотя есть и получше способ, сначало записать всех героев в таблицу, а потом получить случайное значение от количества героев в этой таблице, но это делай сам ибо мне лень и тут не сложно
 
Реклама: