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

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


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

GooDDarK

Активный
27 Окт 2017
100
2
steamcommunity.com
Проект
Naruto Wars Reborn
20 Дек 2016
892
170
Да так же
Код:
    local player = EntIndexToHScript(keys.player)
    local hero = player:GetAssignedHero()
    local heroClass = keys.hero
    local heroEntity = EntIndexToHScript(keys.heroindex)

    GameMode:setPlayerHealthLabel(player)
В это событие передается единственный параметр keys.entindex и отвечает за ИД заспавненного юнита.
Соответственно с помощью этого параметра тебе нужно
  1. получить самого юнита
  2. Проверить является ли он героем
  3. Найти плеера-владельца
  4. Вызвать функцию для этого плеера
Справишься?
 
  • Нравится
Реакции: GooDDarK

GooDDarK

Активный
27 Окт 2017
100
2
steamcommunity.com
Проект
Naruto Wars Reborn
В это событие передается единственный параметр keys.entindex и отвечает за ИД заспавненного юнита.
Соответственно с помощью этого параметра тебе нужно
  1. получить самого юнита
  2. Проверить является ли он героем
  3. Найти плеера-владельца
  4. Вызвать функцию для этого плеера
Справишься?

Ааа, вот оно как... Да, думаю справлюсь, спасибо (но если не получится, то напишу) :з
 

GooDDarK

Активный
27 Окт 2017
100
2
steamcommunity.com
Проект
Naruto Wars Reborn
В это событие передается единственный параметр keys.entindex и отвечает за ИД заспавненного юнита.
Соответственно с помощью этого параметра тебе нужно
  1. получить самого юнита
  2. Проверить является ли он героем
  3. Найти плеера-владельца
  4. Вызвать функцию для этого плеера
Справишься?

В общем теперь делаю всё через OnNPCSpawned
Lua:
    local npc = EntIndexToHScript(keys.entindex)
 
    if npc then
    local player = "-1"
        if npc:IsRealHero() and npc:GetPlayerID() then
          if PlayerResource:GetSteamAccountID(npc:GetPlayerID()) == STEAM ID then
            if PlayerResource:GetPlayer(npc:GetPlayerID()):GetAssignedHero() ~= nil then
              PlayerResource:GetPlayer(npc:GetPlayerID()):GetAssignedHero():SetCustomHealthLabel("Надпись", 192, 30, 255)
            end
          end
        end
    end
Но проблема осталась, последняя проверка if PlayerResource:GetPlayer(npc:GetPlayerID()):GetAssignedHero() ~= nil then срабатывает только после призыва шестого бота :confused:

Это вставить в OnNPCSpawned не получится, а на что это заменить я не знаю, да и в это ли вообще дело?..
Lua:
local hero = player:GetAssignedHero()
local heroClass = keys.hero
local heroEntity = EntIndexToHScript(keys.heroindex)
 
20 Дек 2016
892
170
В общем теперь делаю всё через OnNPCSpawned
Lua:
    local npc = EntIndexToHScript(keys.entindex)

    if npc then
    local player = "-1"
        if npc:IsRealHero() and npc:GetPlayerID() then
          if PlayerResource:GetSteamAccountID(npc:GetPlayerID()) == STEAM ID then
            if PlayerResource:GetPlayer(npc:GetPlayerID()):GetAssignedHero() ~= nil then
              PlayerResource:GetPlayer(npc:GetPlayerID()):GetAssignedHero():SetCustomHealthLabel("Надпись", 192, 30, 255)
            end
          end
        end
    end
Но проблема осталась, последняя проверка if PlayerResource:GetPlayer(npc:GetPlayerID()):GetAssignedHero() ~= nil then срабатывает только после призыва шестого бота :confused:

Это вставить в OnNPCSpawned не получится, а на что это заменить я не знаю, да и в это ли вообще дело?..
Lua:
local hero = player:GetAssignedHero()
local heroClass = keys.hero
local heroEntity = EntIndexToHScript(keys.heroindex)
Ты вынуждаешь меня устанавливать доту, а мне это очень не нравится.

Ты уверен, что не срабатывает для основного игрока?
Ты уверен, что не проходит именно эту проверку?
Не выдает ли ошибки?

PlayerResource:GetPlayer(npc:GetPlayerID()):GetAssignedHero()
Подумай, какими тремя буквами это можно заменить. (с заменой точно работать будет)
Хотя по идее данное выражение должно возвращать либо ошибку, либо истину, без тестов я этого утверждать не возьмусь, ибо с этой дотой и не такое творится. Сейчас установится эта срань, все проверю у себя.
 

GooDDarK

Активный
27 Окт 2017
100
2
steamcommunity.com
Проект
Naruto Wars Reborn
Ты вынуждаешь меня устанавливать доту, а мне это очень не нравится.

Ты уверен, что не срабатывает для основного игрока?
Ты уверен, что не проходит именно эту проверку?
Не выдает ли ошибки?


Подумай, какими тремя буквами это можно заменить. (с заменой точно работать будет)
Хотя по идее данное выражение должно возвращать либо ошибку, либо истину, без тестов я этого утверждать не возьмусь, ибо с этой дотой и не такое творится. Сейчас установится эта срань, все проверю у себя.

Да, для основного срабатывает только после вызова ботов
По твоему совету с принтами вычислил, что именно эту проверку не проходит
Ошибок нету

Подумай, какими тремя буквами это можно заменить. (с заменой точно работать будет)
Пробовал заменить на npc, но тогда выдает ошибку
attempt to call method 'GetAssignedHero' (a nil value)
 
Последнее редактирование:
20 Дек 2016
892
170
Пробовал заменить на npc, но тогда выдает ошибку
attempt to call method 'GetAssignedHero' (a nil value)
Потому что ты пытаешься применить GetAssignedHero к юниту. Все же явно написано. Эта функция тебе вообще не нужна, npc это и есть герой, ты же даже сделал проверку
IsRealHero() кстати лучше заменить просто на IsHero(), иначе будут иллюзии палиться.

При первом спавне PlayerResource:GetPlayer(npc:GetPlayerID()):GetAssignedHero() действительно не находит героя, хз почему. При респавне работает. Можно было бы таймер создать, но делать этого не стоит.
Когда ты спавнишь героя командой, PlayerResource:GetPlayer(npc:GetPlayerID()) возвращает именно тебя (как игрока), поэтому при применении туда GetAssignedHero() получается твой основной герой. И надпись дается именно ему, а не боту.
При создании шестого бота происходит полуошибка, в результате которой владельцем героя становится "призрак", и у него уже только один герой, поэтому GetAssignedHero() для него срабатывает как надо.

Короче предыдущий блок текста можешь игнорировать, просто используй npc в качестве аргумента (последнюю проверку вообще выпыли), это решает обе проблемы (проверено).
 
Последнее редактирование:

GooDDarK

Активный
27 Окт 2017
100
2
steamcommunity.com
Проект
Naruto Wars Reborn
Потому что ты пытаешься применить GetAssignedHero к юниту. Все же явно написано. Эта функция тебе вообще не нужна, npc это и есть герой, ты же даже сделал проверку

IsRealHero() кстати лучше заменить просто на IsHero(), иначе будут иллюзии палиться.

При первом спавне PlayerResource:GetPlayer(npc:GetPlayerID()):GetAssignedHero() действительно не находит героя, хз почему. При респавне работает. Можно было бы таймер создать, но делать этого не стоит.
Когда ты спавнишь героя командой, PlayerResource:GetPlayer(npc:GetPlayerID()) возвращает именно тебя (как игрока), поэтому при применении туда GetAssignedHero() получается твой основной герой. И надпись дается именно ему, а не боту.
При создании шестого бота происходит полуошибка, в результате которой владельцем героя становится "призрак", и у него уже только один герой, поэтому GetAssignedHero() для него срабатывает как надо.
Черт, вот оно что... Почему-то не подумал


Короче предыдущий блок текста можешь игнорировать, просто используй npc в качестве аргумента (последнюю проверку вообще выпыли), это решает обе проблемы (проверено).

ОГРОМНЕЙШЕЕ СПАСИБО, всё заработало! :D
 
Реклама: