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

Dowakhin

Пользователь
14 Июл 2020
22
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
Но не работало.
 
У тебя 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
 
Я сдеалал так, но все-равно пока ничего не роботает, в консоли выбивает ошибку "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] не строка, а таблица
 
мне кажется твой heroes[hero] не строка, а таблица
Да, и вот главный вопрос, как вместо того значения что у меня есть в ReplaceHeroWith во втором аргументе вставить нужное? Я читал немного о массивах в Lua, но это немного не тот массив как я понимаю
 
Да, и вот главный вопрос, как вместо того значения что у меня есть в 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) можешь убрать или вставить свою функцию проверки
 
  • Нравится
Реакции: Sannin и Dowakhin
В принципе, все работает, но замена есть только один раз, то есть только после первой смерти она происходит. В консоли пишет:
"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
Еще я хотел бы добавить перенос предметов и опыта, но это совсем другая история.
 
В принципе, все работает, но замена есть только один раз, то есть только после первой смерти она происходит. В консоли пишет:
"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 из колва героев случае, может быть такое что просто ни один герой не выпадает и строчка остаётся пустой
 
у тебя в 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"
}
Тут ненужные герои закоментированы, поэтому проверки никакой не нужно
 
а как может быть что строчка пустая? ну 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 значит идём к следующему герою и тд
 
RandomInt возвращает случайное число от первого до второго, то есть от 1 до количества героев
В проходе по всем героям у каждого героя есть шанс того что он выпадет, а именно если randomint вернула 1, если она не возвращает 1 значит идём к следующему герою и тд
Хорошо, спасибо за объяснение. Тогда почему может не выпадать герой? Вроде все правильно же
 
инвентарь же передавать вот этими функциями, до замены копируешь(функция 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
поставь RandomInt как у меня то есть с 0 до 4
Я попробую, спасибо за совет. Я правда немного не понимаю, у тебя возвращает героя если рандомное число выпадает на 3? А если оно ниразу на 3 не выпадет?
 
Я попробую, спасибо за совет. Я правда немного не понимаю, у тебя возвращает героя если рандомное число выпадает на 3? А если оно ниразу на 3 не выпадет?
оно должно выпасть из 20 раз, хотя есть и получше способ, сначало записать всех героев в таблицу, а потом получить случайное значение от количества героев в этой таблице, но это делай сам ибо мне лень и тут не сложно
 
Реклама: