Помогите с настройками для кастомки

Spoof1x

Пользователь
16 Авг 2023
28
6
Проект
дота 2 кастомка
У меня есть 2 команды( тьма и свет) И всего 3 героя(тимбер, манки Кинг и Зевс) Мне нужно,чтобы за команду света нельзя было пикать тимбера ,а за команду тьмы манки Кинга и зевса.Пожалуйста
 
Последнее редактирование:
Хм, задача сложна ибо нет прямого API запрета, но можно сделать псевдорандом, чтобы команде света случайно дали либо зевса или макаку, а силам тьмы сразу давали тимбера
 
Ещё придумал
Силам тьмы сразу давать тимбера
Силам света на 10 секунд перед принудительным рандомным выбором, дать возможность через абилки у IO выбрать либо макаку либо зевса
 
Ещё придумал
Силам тьмы сразу давать тимбера
Силам света на 10 секунд перед принудительным рандомным выбором, дать возможность через абилки у IO выбрать либо макаку либо зевса
вот как , сделать , чтобы силам тьмы давали сразу тимбера? а силам света только мк( зевса убрал)
 
GameRules:SetHeroSelectionTime(0) -- Как долго мы должны позволять людям выбирать своего героя?
GameRules:SetStrategyTime(0) -- Как долго игроки находятся на сцене после выбора героя?
GameRules:SetShowcaseTime(0) -- Время демонстрации при запуске игры

GameRules:GetGameModeEntity():SetCustomGameForceHero("npc_dota_hero_wisp") -- Выдаст всем IO
ListenToGameEvent("npc_spawned", OnHeroSpawned, nil) -- слушатель

Lua:
function OnHeroSpawned(event)
    local hero = EntIndexToHScript(event.entindex)
    local playerID = hero:GetPlayerID()
    local team = PlayerResource:GetTeam(playerID)
    local heroName = hero:GetUnitName()

    if heroName == "npc_dota_hero_wisp" then
        if team == DOTA_TEAM_BADGUYS then
            PrecacheUnitByNameAsync("npc_dota_hero_timbersaw", function()
                PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_timbersaw", 0, 0)
            end)
        elseif team == DOTA_TEAM_GOODGUYS then
            PrecacheUnitByNameAsync("npc_dota_hero_monkey_king", function()
                PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_monkey_king", 0, 0)
            end)
        end
    end
end
 
Последнее редактирование:
Я чуть поправил код и добавил PrecacheUnitByNameAsync ибо вспомнил, что звук бы сломался, человек тут не так давно открыл для форума фикс
 
Я чуть поправил код и добавил PrecacheUnitByNameAsync ибо вспомнил, что звук бы сломался, человек тут не так давно открыл для форума фикс
а надо этот скрипт добавить просто в game mode? И в инитgame нужно что-то писать?
 
Все что там есть это и засовывается в инициализацию, кроме функции её отдельно в этом же файл.
Так, смотри я сделал, как ты сказал я сделал, но без слушателя у меня не получалось , создал слушателя и потом просто ппц. у меня начали спавнятся куча мк и все крашнулось
вот целевой код:

Код:
if Spoof1xVidModed == nil then
    Spoof1xVidModed = class({})
end

function Precache( context )
    --[[
        Precache things we know we'll use.  Possible file types include (but not limited to):
            PrecacheResource( "model", "*.vmdl", context )
            PrecacheResource( "soundfile", "*.vsndevts", context )
            PrecacheResource( "particle", "*.vpcf", context )
            PrecacheResource( "particle_folder", "particles/folder", context )
    ]]
end
function OnHeroSpawned(event)
    local hero = EntIndexToHScript(event.entindex)
    local playerID = hero:GetPlayerID()
    local team = PlayerResource:GetTeam(playerID)
    local heroName = hero:GetUnitName()
    if heroName == "npc_dota_hero_wisp" then
        if team == DOTA_TEAM_BADGUYS then
            PrecacheUnitByNameAsync("npc_dota_hero_timbersaw", function()
                PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_timbersaw", 0, 0)
            end)
        elseif team == DOTA_TEAM_GOODGUYS then
            PrecacheUnitByNameAsync("npc_dota_hero_monkey_king", function()
                PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_monkey_king", 0, 0)
            end)
        end
    end
end
    

        
-- Create the game mode when we activate
function Activate()
    GameRules.AddonTemplate = Spoof1xVidModed()
    GameRules.AddonTemplate:InitGameMode()
end

function Spoof1xVidModed:InitGameMode()
    print( "Template addon is loaded." )
    ListenToGameEvent("npc_spawned", OnHeroSpawned, nil)
    GameRules:GetGameModeEntity():SetThink( "OnThink", self, "GlobalThink", 2 )
end

-- Evaluate the state of the game
function Spoof1xVidModed:OnThink()
    if GameRules:State_Get() == DOTA_GAMERULES_STATE_GAME_IN_PROGRESS then
        --print( "Template addon script is running." )
    elseif GameRules:State_Get() >= DOTA_GAMERULES_STATE_POST_GAME then
        return nil
    end
    return 1
end
 
addon_game_mode.lua

Lua:
function Activate()
    GameRules:SetHeroSelectionTime(0) -- Как долго мы должны позволять людям выбирать своего героя?
    GameRules:SetStrategyTime(0) -- Как долго игроки находятся на сцене после выбора героя?
    GameRules:SetShowcaseTime(0) -- Время демонстрации при запуске игры
end
function CAddonTemplateGameMode:InitGameMode()
    ListenToGameEvent('npc_spawned', Dynamic_Wrap(self, 'OnNPCSpawned'), self)
    GameRules:GetGameModeEntity():SetCustomGameForceHero("npc_dota_hero_wisp") -- Выдаст всем IO
end

function CAddonTemplateGameMode:OnNPCSpawned(event)
    local npc = EntIndexToHScript(event.entindex)   
    local heroName = npc:GetUnitName()
    local playerID = npc:GetPlayerOwnerID()
    local team = PlayerResource:GetTeam(playerID)

    if heroName == "npc_dota_hero_wisp" then
        if team == DOTA_TEAM_BADGUYS then
            PrecacheUnitByNameAsync("npc_dota_hero_shredder", function()
                PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_shredder", 0, 0)
            end)
        elseif team == DOTA_TEAM_GOODGUYS then
            PrecacheUnitByNameAsync("npc_dota_hero_monkey_king", function()
                PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_monkey_king", 0, 0)
            end)
        end
    end
end
 
addon_game_mode.lua

Lua:
function Activate()
    GameRules:SetHeroSelectionTime(0) -- Как долго мы должны позволять людям выбирать своего героя?
    GameRules:SetStrategyTime(0) -- Как долго игроки находятся на сцене после выбора героя?
    GameRules:SetShowcaseTime(0) -- Время демонстрации при запуске игры
end
function CAddonTemplateGameMode:InitGameMode()
    ListenToGameEvent('npc_spawned', Dynamic_Wrap(self, 'OnNPCSpawned'), self)
    GameRules:GetGameModeEntity():SetCustomGameForceHero("npc_dota_hero_wisp") -- Выдаст всем IO
end

function CAddonTemplateGameMode:OnNPCSpawned(event)
    local npc = EntIndexToHScript(event.entindex)  
    local heroName = npc:GetUnitName()
    local playerID = npc:GetPlayerOwnerID()
    local team = PlayerResource:GetTeam(playerID)

    if heroName == "npc_dota_hero_wisp" then
        if team == DOTA_TEAM_BADGUYS then
            PrecacheUnitByNameAsync("npc_dota_hero_shredder", function()
                PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_shredder", 0, 0)
            end)
        elseif team == DOTA_TEAM_GOODGUYS then
            PrecacheUnitByNameAsync("npc_dota_hero_monkey_king", function()
                PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_monkey_king", 0, 0)
            end)
        end
    end
end
Я щас лег спать , завтра впишу ,заранее спасибо.
 
addon_game_mode.lua

Lua:
function CAddonTemplateGameMode:OnNPCSpawned(event)
    local npc = EntIndexToHScript(event.entindex)  
    local heroName = npc:GetUnitName()
    local playerID = npc:GetPlayerOwnerID()
    local team = PlayerResource:GetTeam(playerID)

    if heroName == "npc_dota_hero_wisp" then
        if team == DOTA_TEAM_BADGUYS then
            PrecacheUnitByNameAsync("npc_dota_hero_shredder", function()
                PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_shredder", 0, 0)
            end)
        elseif team == DOTA_TEAM_GOODGUYS then
            PrecacheUnitByNameAsync("npc_dota_hero_monkey_king", function()
                PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_monkey_king", 0, 0)
            end)
        end
    end
end
Рекомендую в слушателе npc_spawned добавить проверку на IsRealHero, чтобы консоль лишними ошибками не засорялась
Код:
function OnHeroSpawned(event)
    local hero = EntIndexToHScript(event.entindex)
    if hero:IsRealHero() then
    local playerID = hero:GetPlayerID()
    local team = PlayerResource:GetTeam(playerID)
    local heroName = hero:GetUnitName()
    if heroName == "npc_dota_hero_wisp" then
        if team == DOTA_TEAM_BADGUYS then
            PrecacheUnitByNameAsync("npc_dota_hero_shredder", function()
                PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_shredder", 0, 0)
            end)
        elseif team == DOTA_TEAM_GOODGUYS then
            PrecacheUnitByNameAsync("npc_dota_hero_monkey_king", function()
                PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_monkey_king", 0, 0)
            end)
        end
    end
end
end
 
Рекомендую в слушателе npc_spawned добавить проверку на IsRealHero, чтобы консоль лишними ошибками не засорялась
Код:
function OnHeroSpawned(event)
    local hero = EntIndexToHScript(event.entindex)
    if hero:IsRealHero() then
    local playerID = hero:GetPlayerID()
    local team = PlayerResource:GetTeam(playerID)
    local heroName = hero:GetUnitName()
    if heroName == "npc_dota_hero_wisp" then
        if team == DOTA_TEAM_BADGUYS then
            PrecacheUnitByNameAsync("npc_dota_hero_shredder", function()
                PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_shredder", 0, 0)
            end)
        elseif team == DOTA_TEAM_GOODGUYS then
            PrecacheUnitByNameAsync("npc_dota_hero_monkey_king", function()
                PlayerResource:ReplaceHeroWith(playerID, "npc_dota_hero_monkey_king", 0, 0)
            end)
        end
    end
end
end
Она все равно будет работать в тупую если видит IO в игре который был отспавнен

не уверен что добавление этой "функции" позволит через команду -createhero wisp enemy (опять же ток в тестовом режим) выдавать того героя за которого он должен играть ибо по факту таким образом заспавненый персонаж не относится к реальному игроку
 
Она все равно будет работать в тупую если видит IO в игре который был отспавнен
Ага, знаю) Просто если потом чел захочет пофиксить какой-то баг и полезет в консоль, куча ошибок будут с толку сбивать)
 
Ага, знаю) Просто если потом чел захочет пофиксить какой-то баг и полезет в консоль, куча ошибок будут с толку сбивать)
Чел.. к тому времени когда он научится делать кастомки, он уже сам будет фиксить это и это будут не мои проблемы))

Я дал быстрое решение ибо по пути - кастомной panarama, что бы для сил света были определенные герои, а для тьмы другие, слишком сложно будет для него
 
Реклама: