Наложить модифаер на игрока

doozer

Пользователь
9 Сен 2018
46
2
Впринципе задаю тот же вопрос, который был раньше. Но уже что то имея.

Моя цель такова: Повесить модифаер на определенного игрока, на каком бы герое он не играл.
Открыл файлы Ангел Арены, нашел вроде бы то, что нужно.

А именно: Проверку игрока по его steamid, после чего выдавание ему модифаер.
Начал перекидывать в свою тестовую кастомку:

Сначало линканул модифаер:
Screenshot_1.png

Потом скопировал саму функцию из АА:
Screenshot_2.png

Но ничего не заработало, переделывал 3 раза. Ошибок не выдаёт, думал что ошибка в steamid,
проверял с обычным steamid и с steamid3.
Сам модифаер также существует в папке modfiers.
Скорее всего что то упустил.
 

Дикий Пёс

Друзья CG
28 Июн 2017
411
96
Проект
Petri Reborn
попробуй вывести steamid через print и посмотреть как он выглядит хотя бы, мб ты не правильно пишешь, ещё можешь попробовать в кавычки вставить стимид в проверке который
 
20 Дек 2016
892
170
Впринципе задаю тот же вопрос, который был раньше. Но уже что то имея.

Моя цель такова: Повесить модифаер на определенного игрока, на каком бы герое он не играл.
Открыл файлы Ангел Арены, нашел вроде бы то, что нужно.

А именно: Проверку игрока по его steamid, после чего выдавание ему модифаер.
Начал перекидывать в свою тестовую кастомку:

Сначало линканул модифаер:
Посмотреть вложение 198

Потом скопировал саму функцию из АА:
Посмотреть вложение 199

Но ничего не заработало, переделывал 3 раза. Ошибок не выдаёт, думал что ошибка в steamid,
проверял с обычным steamid и с steamid3.
Сам модифаер также существует в папке modfiers.
Скорее всего что то упустил.
автовызов OnHeroRespawn прописал? Отправь полный код InitGameMode
 

doozer

Пользователь
9 Сен 2018
46
2
попробуй вывести steamid через print и посмотреть как он выглядит хотя бы, мб ты не правильно пишешь, ещё можешь попробовать в кавычки вставить стимид в проверке который
Кавычки не помогли, да и в самом коде Ангел Арены все это без кавычек.
 

Вложения

  • Screenshot_2.png
    Screenshot_2.png
    25.6 KB · Просмотры: 9
20 Дек 2016
892
170
Barebones установлен? Если нет, то функция OnHeroRespawn просто не вызывается, так как ты не подключил слушателя
 
20 Дек 2016
892
170
Установлен и подключен
Хм, вообще функции OnHeroRespawn вроде нету там. Мне все-таки кажется что она вообще не вызывается. Проверь принтами, как посоветовали. Сразу после объявления steam_id
Lua:
print(steam_id)
И прочекай консоль на предмет голубого шрифта
 

doozer

Пользователь
9 Сен 2018
46
2
Хм, вообще функции OnHeroRespawn вроде нету там. Мне все-таки кажется что она вообще не вызывается. Проверь принтами, как посоветовали. Сразу после объявления steam_id
Lua:
print(steam_id)
И прочекай консоль на предмет голубого шрифта
Синий шрифт есть, а именно:
[Server] PR:SetPossibleHeroSelection 0:[U:1:185152995] npc_dota_hero_nevermore(11)
[Server] PR:SetSelectedHero 0:[U:1:185152995] npc_dota_hero_nevermore(11)

Может всё дело в содержании самого модифаера?
 

Вложения

  • Screenshot_3.png
    Screenshot_3.png
    13.5 KB · Просмотры: 10
Последнее редактирование:
20 Дек 2016
892
170
Если бы дело было в модифаере, то были бы баги либо ошибки в консоли, короче был бы хоть какой-то эффект.
[Server] PR:SetPossibleHeroSelection 0:[U:1:185152995] npc_dota_hero_nevermore(11)
[Server] PR:SetSelectedHero 0:[U:1:185152995] npc_dota_hero_nevermore(11)
Это не то. У тебя после каждый раз после спавна героя должно писаться стимИД в консоль.

Попробуй заменить 'OnHeroRespawn' на 'GameMode:OnHeroInGame'
А еще скинь полностью addon_game_mode, если не поможет (в блок кода, а не картинками)

P.S: цвет принтов такой:
цвет принтов.png
 
Последнее редактирование:

doozer

Пользователь
9 Сен 2018
46
2
Если бы дело было в модифаере, то были бы баги либо ошибки в консоли, короче был бы хоть какой-то эффект.

Это не то. У тебя после каждый раз после спавна героя должно писаться стимИД в консоль.

Попробуй заменить 'OnHeroRespawn' на 'GameMode:OnHeroInGame'
А еще скинь полностью addon_game_mode, если не поможет (в блок кода, а не картинками)

P.S: цвет принтов такой:
Посмотреть вложение 204
Код:
--########################################## BASIC SETTINGS #######################################
MAX_LEVEL                    = 50
KILLS_TO_END_GAME_FOR_TEAM     = 50

HERO_SELECTION_TIME         = 45.0
GOLD_PER_TICK                 = 4

END_GAME_ON_KILLS             = true
DISABLE_FOG_OF_WAR_ENTIRELY = false

-- [BUYBACK SETTINGS]
BUYBACK_ENABLED             = true
CUSTOM_BUYBACK_COST_ENABLED = false
CUSTOM_BUYBACK_COOLDOWN_ENABLED = true

--########################################## OTHER ################################################
require( 'timers' )
require( 'barebones' )
require( 'units' )

function Precache( context )
end

if TestMap == nil then
    _G.TestMap = class({})
end

function Activate()
    GameRules.TestMap = TestMap()
    GameRules.TestMap:InitGameMode()
end

function TestMap:InitGameMode()

    local GameMode = GameRules:GetGameModeEntity()

    GameRules:SetCustomVictoryMessage("Victory.")

    LinkLuaModifier( "modifier_player_gm", 'modifiers/modifier_player_gm', LUA_MODIFIER_MOTION_NONE )
end

function TestMap:OnHeroInGame(spawned_hero)
    local hero = spawned_hero
    local steam_id = PlayerResource:GetSteamAccountID(hero:GetPlayerOwnerID())
    print(steam_id)
    
    if not steam_id then return end

    if steam_id == "185152995" then
        hero:AddNewModifier(hero, nil, "modifier_player_gm", { duration = - 1 })
    end
end
 

HappyFeedFriends

Друзья CG
14 Авг 2017
540
32
Проект
Battle Heroes Arena
Код:
--########################################## BASIC SETTINGS #######################################
MAX_LEVEL                    = 50
KILLS_TO_END_GAME_FOR_TEAM     = 50

HERO_SELECTION_TIME         = 45.0
GOLD_PER_TICK                 = 4

END_GAME_ON_KILLS             = true
DISABLE_FOG_OF_WAR_ENTIRELY = false

-- [BUYBACK SETTINGS]
BUYBACK_ENABLED             = true
CUSTOM_BUYBACK_COST_ENABLED = false
CUSTOM_BUYBACK_COOLDOWN_ENABLED = true

--########################################## OTHER ################################################
require( 'timers' )
require( 'barebones' )
require( 'units' )

function Precache( context )
end

if TestMap == nil then
    _G.TestMap = class({})
end

function Activate()
    GameRules.TestMap = TestMap()
    GameRules.TestMap:InitGameMode()
end

function TestMap:InitGameMode()

    local GameMode = GameRules:GetGameModeEntity()

    GameRules:SetCustomVictoryMessage("Victory.")

    LinkLuaModifier( "modifier_player_gm", 'modifiers/modifier_player_gm', LUA_MODIFIER_MOTION_NONE )
end

function TestMap:OnHeroInGame(spawned_hero)
    local hero = spawned_hero
    local steam_id = PlayerResource:GetSteamAccountID(hero:GetPlayerOwnerID())
    print(steam_id)
   
    if not steam_id then return end

    if steam_id == "185152995" then
        hero:AddNewModifier(hero, nil, "modifier_player_gm", { duration = - 1 })
    end
end
Найди эвент респауна героя,и покажи его сюда. Если функция не подключена,то и работать не будет.
 
20 Дек 2016
892
170
Код:
--########################################## BASIC SETTINGS #######################################
MAX_LEVEL                    = 50
KILLS_TO_END_GAME_FOR_TEAM     = 50

HERO_SELECTION_TIME         = 45.0
GOLD_PER_TICK                 = 4

END_GAME_ON_KILLS             = true
DISABLE_FOG_OF_WAR_ENTIRELY = false

-- [BUYBACK SETTINGS]
BUYBACK_ENABLED             = true
CUSTOM_BUYBACK_COST_ENABLED = false
CUSTOM_BUYBACK_COOLDOWN_ENABLED = true

--########################################## OTHER ################################################
require( 'timers' )
require( 'barebones' )
require( 'units' )

function Precache( context )
end

if TestMap == nil then
    _G.TestMap = class({})
end

function Activate()
    GameRules.TestMap = TestMap()
    GameRules.TestMap:InitGameMode()
    GameMode:InitGameMode()
end

function TestMap:InitGameMode()

    local GameMode = GameRules:GetGameModeEntity()

    GameRules:SetCustomVictoryMessage("Victory.")

    LinkLuaModifier( "modifier_player_gm", 'modifiers/modifier_player_gm', LUA_MODIFIER_MOTION_NONE )
end

function GameMode:OnHeroInGame(spawned_hero)
    local hero = spawned_hero
    local steam_id = PlayerResource:GetSteamAccountID(hero:GetPlayerOwnerID())
    print(steam_id)
 
    if not steam_id then return end

    if steam_id == "185152995" then
        hero:AddNewModifier(hero, nil, "modifier_player_gm", { duration = - 1 })
    end
end
Вот. Это точно должно работать.
Иначе у тебя какой-то не такой barebones
 

doozer

Пользователь
9 Сен 2018
46
2
Код:
--########################################## BASIC SETTINGS #######################################
MAX_LEVEL                    = 50
KILLS_TO_END_GAME_FOR_TEAM     = 50

HERO_SELECTION_TIME         = 45.0
GOLD_PER_TICK                 = 4

END_GAME_ON_KILLS             = true
DISABLE_FOG_OF_WAR_ENTIRELY = false

-- [BUYBACK SETTINGS]
BUYBACK_ENABLED             = true
CUSTOM_BUYBACK_COST_ENABLED = false
CUSTOM_BUYBACK_COOLDOWN_ENABLED = true

--########################################## OTHER ################################################
require( 'timers' )
require( 'barebones' )
require( 'units' )

function Precache( context )
end

if TestMap == nil then
    _G.TestMap = class({})
end

function Activate()
    GameRules.TestMap = TestMap()
    GameRules.TestMap:InitGameMode()
    GameMode:InitGameMode()
end

function TestMap:InitGameMode()

    local GameMode = GameRules:GetGameModeEntity()

    GameRules:SetCustomVictoryMessage("Victory.")

    LinkLuaModifier( "modifier_player_gm", 'modifiers/modifier_player_gm', LUA_MODIFIER_MOTION_NONE )
end

function GameMode:OnHeroInGame(spawned_hero)
    local hero = spawned_hero
    local steam_id = PlayerResource:GetSteamAccountID(hero:GetPlayerOwnerID())
    print(steam_id)

    if not steam_id then return end

    if steam_id == "185152995" then
        hero:AddNewModifier(hero, nil, "modifier_player_gm", { duration = - 1 })
    end
end
Вот. Это точно должно работать.
Иначе у тебя какой-то не такой barebones
Не работает = |
Barebones брал отсюда: https://github.com/MNoya/barebones/tree/source2/game/dota_addons/barebones/scripts/vscripts
 
20 Дек 2016
892
170
Прочекал, при первом спавне героя почему-то не срабатывает евент OnNPCSpawned. Раньше это работало, поэтому предлагаю тебе сделать следующее.

1. Отключить старый вызов OnHeroInGame
В файле barebones.lua найди функцию OnNPCSpawned и удали из нее следующие строки:
Код:
if npc:IsRealHero() and npc.bFirstSpawned == nil then
    npc.bFirstSpawned = true
    GameMode:OnHeroInGame(npc)
end

2. Реализовать свой вызов
Уверен, что есть не один способ это сделать, но я предложу конкретный. Найди в barebones.lua функцию OnGameRulesStateChange и пропиши в самый ее конец это:
Код:
if newState == DOTA_GAMERULES_STATE_PRE_GAME then --Началась игра
    Timers:CreateTimer( 1, function()  --Герои игроков прогружаются не сразу, поэтому делаем таймер
        for i = 0, PlayerResource:GetPlayerCount() - 1 do --Перебор всех игроков
            if PlayerResource:IsValidPlayerID(i) then
                local hero = PlayerResource:GetSelectedHeroEntity(i)
                if hero then GameMode:OnHeroInGame(hero) end  --Вызов OnHeroInGame для героя каждого из игроков
            end
        end
    end )
end



Если че, это у меня сработало с твоими файлами
 
  • Нравится
Реакции: -ExotiC-
20 Дек 2016
892
170
И да, так как OnHeroInGame срабатывает только при первом спавне, тебе лучше добавить модификатору это. (чтобы он не снимался диспелами и при смерти)
Код:
function modifier_player_gm:GetAttributes()
    return MODIFIER_ATTRIBUTE_PERMANENT
end
 

doozer

Пользователь
9 Сен 2018
46
2
Прочекал, при первом спавне героя почему-то не срабатывает евент OnNPCSpawned. Раньше это работало, поэтому предлагаю тебе сделать следующее.

1. Отключить старый вызов OnHeroInGame
В файле barebones.lua найди функцию OnNPCSpawned и удали из нее следующие строки:
Код:
if npc:IsRealHero() and npc.bFirstSpawned == nil then
    npc.bFirstSpawned = true
    GameMode:OnHeroInGame(npc)
end

2. Реализовать свой вызов
Уверен, что есть не один способ это сделать, но я предложу конкретный. Найди в barebones.lua функцию OnGameRulesStateChange и пропиши в самый ее конец это:
Код:
if newState == DOTA_GAMERULES_STATE_PRE_GAME then --Началась игра
    Timers:CreateTimer( 1, function()  --Герои игроков прогружаются не сразу, поэтому делаем таймер
        for i = 0, PlayerResource:GetPlayerCount() - 1 do --Перебор всех игроков
            if PlayerResource:IsValidPlayerID(i) then
                local hero = PlayerResource:GetSelectedHeroEntity(i)
                if hero then GameMode:OnHeroInGame(hero) end  --Вызов OnHeroInGame для героя каждого из игроков
            end
        end
    end )
end



Если че, это у меня сработало с твоими файлами
Ошибка выскакивает:
[VScript] Script Runtime Error: ...ta_addons\testmap\scripts\vscripts\addon_game_mode.lua:22: module 'barebones' not found:
no field package.preload['barebones']scripts\vscripts\barebones.lua:516: 'end' expected (to close 'function' at line 297) near '<eof>'
stack traceback:
[C]: in function 'require'
...ta_addons\testmap\scripts\vscripts\addon_game_mode.lua:22: in main chunk
[VScript] Error running script named addon_game_mode
 
Реклама: