Надпись над головой игрока

GooDDarK

Активный
27 Окт 2017
100
2
steamcommunity.com
Проект
Naruto Wars Reborn
Хочу сделать надпись над полоской хп игрока, написал скрипт, но он не работает

Lua:
function GameMode:setPlayerHealthLabel( player )
    if PlayerResource:IsValidPlayerID(player:GetPlayerID()) then
        if not PlayerResource:IsBroadcaster(player:GetPlayerID()) then
          if PlayerResource:GetSteamAccountID(player:GetPlayerID()) == [B][[/B]DOTA ID[B]][/B] then
            if PlayerResource:GetPlayer(player:GetPlayerID()):GetAssignedHero() ~= nil then
              PlayerResource:GetPlayer(player:GetPlayerID()):GetAssignedHero():SetCustomHealthLabel("Сама надпись", 30, 144, 255)
            end
          end
        end
    end
end

То есть как не работает, один раз он заработал, но я не понял почему...
Я создавал союзных героев командой -createhero [название героя] и когда создал 5 союзных героев, то создался вражеский герой и этот скрипт вдруг заработал :confused:

Можете помочь с решением проблемы?
 

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
196
www.dotabuff.com
Проект
Roshan defense
Может дело в том , как вызывается эта функция у тебя ?
 

GooDDarK

Активный
27 Окт 2017
100
2
steamcommunity.com
Проект
Naruto Wars Reborn
Может дело в том , как вызывается эта функция у тебя ?

А, точно, вот что я забыл вчера написать...
Вот так вызывается в скрипте events

Lua:
function GameMode:OnPlayerPickHero(keys)

  GameMode:setPlayerHealthLabel(player)

end
 

vulkantsk

Супермодератор
Команда форума
21 Июн 2017
1,137
196
www.dotabuff.com
Проект
Roshan defense
Попробуй другое событие поставить например OnSpawn
 

GooDDarK

Активный
27 Окт 2017
100
2
steamcommunity.com
Проект
Naruto Wars Reborn
Попробуй другое событие поставить например OnSpawn

А, во, скрипт запускается, но теперь почему-то пишет, что локальная переменная player ровна нулю :rolleyes:

in function "setPlayerHealthLabel"
in function <scripts\vscripts\events.lua>
attempt to index local "player" (a nil value)
 

Вложения

  • error.jpg
    error.jpg
    18 KB · Просмотры: 23
Последнее редактирование:
20 Дек 2016
892
170
А, во, скрипт запускается, но теперь почему-то пишет, что локальная переменная player ровна нулю :rolleyes:

in function "setPlayerHealthLabel"
in function <scripts\vscripts\events.lua>
attempt to index local "player" (a nil value)
ноль ~= ниль
Плеера не идентифицирует, так как ты героя создаешь командой, и игрока (и уж тем более стим аккаунта) данный герой не имеет.
 

GooDDarK

Активный
27 Окт 2017
100
2
steamcommunity.com
Проект
Naruto Wars Reborn
ноль ~= ниль
Плеера не идентифицирует, так как ты героя создаешь командой, и игрока (и уж тем более стим аккаунта) данный герой не имеет.

Не, ну я ведь когда пикаю героя, то он должен же мой стим аккаунт видеть и идентифицировать меня как плеера...

Щас вот вернул все как было
Lua:
function GameMode:OnPlayerPickHero(keys)
    local player = EntIndexToHScript(keys.player)
    local hero = player:GetAssignedHero()
    local heroClass = keys.hero
    local heroEntity = EntIndexToHScript(keys.heroindex)

    GameMode:setPlayerHealthLabel(player)

end
Захожу, надписи нет, создаю ботов и на пятом созданном союзном боте этот скрипт вдруг начинает работать :confused:
 
Последнее редактирование:

EYEOFLIE

Активный
28 Янв 2018
137
4
player = игрок, ты же ботов делаешь, смени идентификацию на unit
 

GooDDarK

Активный
27 Окт 2017
100
2
steamcommunity.com
Проект
Naruto Wars Reborn
player = игрок, ты же ботов делаешь, смени идентификацию на unit

Да причем тут боты? Мне не нужно, чтобы надпись была у ботов. Я хочу, чтоб хотя бы у меня была эта надпись, я ведь должен индетифицироваться как игрок? Или я что-то не понимаю?..
 
Последнее редактирование:
20 Дек 2016
892
170
Не, ну я ведь когда пикаю героя, то он должен же мой стим аккаунт видеть и идентифицировать меня как плеера...

Щас вот вернул все как было
Lua:
function GameMode:OnPlayerPickHero(keys)
    local player = EntIndexToHScript(keys.player)
    local hero = player:GetAssignedHero()
    local heroClass = keys.hero
    local heroEntity = EntIndexToHScript(keys.heroindex)

    GameMode:setPlayerHealthLabel(player)

end
Захожу, надписи нет, создаю ботов и на пятом созданном союзном боте этот скрипт вдруг начинает работать :confused:
Добавь принты в эвент и в свою функцию и посмотри, на каком моменте исполнение прерывается
 

GooDDarK

Активный
27 Окт 2017
100
2
steamcommunity.com
Проект
Naruto Wars Reborn
Добавь принты в эвент и в свою функцию и посмотри, на каком моменте исполнение прерывается

По принтам выяснил, что в моей функции почему-то не срабатывает последняя проверка, которая
Lua:
if PlayerResource:GetPlayer(player:GetPlayerID()):GetAssignedHero() ~= nil then
end

НО, почему-то срабатывает после того, как я вызываю шестого бота...

В консоли после его призыва сервер пишет:
Cannot assign player to team 2, no space on team.
PR:SetSelectedHero called with bogus player id -1 for hero npc_dota_hero_antimage, ignoring
 
Последнее редактирование:
20 Дек 2016
892
170
PlayerResource:GetPlayer(player:GetPlayerID())
Вот это лучше замени просто на player, разницы никакой.

В случае с реальным игроком на момент пика он просто не имеет героя. Герой создается в начале непосредственно игры. Как работает этот ивент с ботами - не известно. Да и не особо то нужно это знать, если не будет работать с игроками.

В общем тебе нужно перенести вызов функции в ивент спавна героя, как предложили в самом начале, либо при смене стадии игры на прегейм применять ее ко всем плеерам (подобная задача неоднократно разбиралась на форуме)
 
  • Нравится
Реакции: GooDDarK

GooDDarK

Активный
27 Окт 2017
100
2
steamcommunity.com
Проект
Naruto Wars Reborn
Вот это лучше замени просто на player, разницы никакой.

В случае с реальным игроком на момент пика он просто не имеет героя. Герой создается в начале непосредственно игры. Как работает этот ивент с ботами - не известно. Да и не особо то нужно это знать, если не будет работать с игроками.

В общем тебе нужно перенести вызов функции в ивент спавна героя, как предложили в самом начале, либо при смене стадии игры на прегейм применять ее ко всем плеерам (подобная задача неоднократно разбиралась на форуме)

Если переносить вызов функции в OnNPCSpawned, то выдает такую ошибку
scripts\vscripts\events.lua: Parameter type mismatch
stack traceback
in function "EntIndexToHScript"
local player = EntIndexToHScript(keys.player) in function OnNPCSpawned


А можно ссылочку на эту задачу с применением функции ко всем плеерам при смене стадии игры на прегейм или хотя бы где примерно искать?
 

GooDDarK

Активный
27 Окт 2017
100
2
steamcommunity.com
Проект
Naruto Wars Reborn
Вот это лучше замени просто на player, разницы никакой.

В случае с реальным игроком на момент пика он просто не имеет героя. Герой создается в начале непосредственно игры. Как работает этот ивент с ботами - не известно. Да и не особо то нужно это знать, если не будет работать с игроками.

В общем тебе нужно перенести вызов функции в ивент спавна героя, как предложили в самом начале, либо при смене стадии игры на прегейм применять ее ко всем плеерам (подобная задача неоднократно разбиралась на форуме)
Нашел, но это не сильно помогло, т.к. мой скрипт срабатывает даже позже, после прегейма, когда герой уже появляется на карте...

Походу это тупик :(
 
Реклама: