Не работает скрипт на изменение kv файла

edron

Пользователь
3 Окт 2023
20
1
Проект
Кастомка с системой талантов
Lua:
function CAddonTemplateGameMode:OnStiflingDagger_1( keys )
    local player = keys.playerID
    local ability = player:FindAbilityByName(keys.abilityName)

    ability:SetAbilitySpecialValue(4, 1000)
end
Выдаёт вот такую ошибку
...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:77: attempt to index local 'player' (a number value)
stack traceback:
...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:77: in function <...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:75>
Script Runtime Error: ...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:77: attempt to index local 'player' (a number value)
stack traceback:
...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:77: in function <...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:75>

Пытался еще использовать EntIndexToHScript для переменной player, но тогда появлялась другая ошибка. Что я делаю не так? Мне нужно просто изменять значение переменной в kv файле через lua скрипт
 
А данные в keys сначала идут из луа в js, потом из js в луа, и уже там я их использую
 
OnStiflingDagger_1(keys)
Функция откуда берет значение keys?
 
OnStiflingDagger_1(keys)
Функция откуда берет значение keys?
JavaScript:
function onBtnTestClick(buttonIndex){

    var plyID = Game.GetLocalPlayerID(); // Game - глобальная штука, смотри API JS

    $.Msg("Button index: "+ buttonIndex);
    var data = {        // Обьект для передачи в Луа
      playerID: eventData.player,
      talentID: buttonIndex,
      ability: eventData.ability,
      abilityName: eventData.abilityName,
      abilityLevel: eventData.abilityLevel,
      hero: eventData.hero
    }
    
    // кладем                        "придуманное_имя_события" и наш обьект
    GameEvents.SendCustomGameEventToServer( "learn_stifling_dagger_1", data);
    dotaH.FindChildrenWithClassTraverse("stat-tooltip-root")[0].ToggleClass("show");
    for(var i=0; i<talentPanels.length; i++) {
      talentPanels[i].DeleteAsync(0);
    }
    talentPanels = [];
  }

Отсюда. А сюда приходят данные из другой функции
 
Lua:
function CAddonTemplateGameMode:OnLearnAbility(keys)
    local player = EntIndexToHScript(keys.player)
    if player and not player:IsNull() then
    local hero = player:GetAssignedHero()
    local abilityName = keys.abilityname
    local ability = GetAbilityByName(hero, abilityName)
    local abilityLevel = ability:GetLevel()
    print('Ability: '..abilityName)
    local event_data = {
        player = player,
        ability = ability,
        hero = hero,
        abilityName = abilityName,
        abilityLevel = abilityLevel
    }
        if abilityLevel % 2 == 0 then
            if abilityName == 'phantom_assassin_stifling_dagger_lua' and abilityLevel == 2 then
                CustomGameEventManager:Send_ServerToAllClients( "Stifling_Dagger_1", event_data )
            end
            CustomGameEventManager:Send_ServerToPlayer(player, "show_my_panel", keys)
        end
    end
end

Из этой функции данные идут в onBtnTestClick
 
Ты не можешь передавать энтити игрока, героя и способности. Для игрока обычно передают player_id, для энтити - их айди.
Код:
local event_data = {
        player = player:GetPlayerID(),
        ability = ability:entindex(),
        hero = hero:entindex(),
        abilityName = abilityName,
        abilityLevel = abilityLevel
    }

Вообще тебе ид игрока даже передавать не нужно, ты же этот ивент всего одному клиенту отправляешь. Можно на стороне панорамы использовать GetLocalPlayer()
 
Ты не можешь передавать энтити игрока, героя и способности. Для игрока обычно передают player_id, для энтити - их айди.
Код:
local event_data = {
        player = player:GetPlayerID(),
        ability = ability:entindex(),
        hero = hero:entindex(),
        abilityName = abilityName,
        abilityLevel = abilityLevel
    }

Вообще тебе ид игрока даже передавать не нужно, ты же этот ивент всего одному клиенту отправляешь. Можно на стороне панорамы использовать GetLocalPlayer()
Такая ошибка на стороне панорамы, если использовать GetLocalPlayer():

B:\SteamLibrary\steamapps\common\dota 2 beta\content\dota_addons\dotacustommy\panorama\scripts\custom_game\talent\talent.js
line:62, col:16

> var plyID = GetLocalPlayer(); // Game - глобальная штука, смотри API JS

Uncaught ReferenceError: GetLocalPlayer is not defined
at onBtnTestClick
(B:\SteamLibrary\steamapps\common\dota 2 beta\content\dota_addons\dotacustommy\panorama\scripts\custom_game\talent\talent.js:62:17)
at (anonymous)
(B:\SteamLibrary\steamapps\common\dota 2 beta\content\dota_addons\dotacustommy\panorama\scripts\custom_game\talent\tale

А такая с первым вариантом:

Script Runtime Error: ...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:77: attempt to index local 'player' (a number value)
stack traceback:
...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:77: in function <...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:75>
 
OnStiflingDagger_1(keys)
Функция откуда берет значение keys?
Повторюсь, что ошибка связана с тем, что ты нихуя не передаешь в keys - он nil у тебя в дефолте т.к. эта функция созданная тобой
Ты не приложил ничего где у тебя передается информация в keys именно в эту функцию - P.s. Если все в одном LUA скрипте то ты объявляешь локальную и её передаешь
Если у тебя все на разных LUA файлах, то используй глобальную для хранения этого Keys и то переименуй её

Вот тебе небольшой пример на ивенте убийства существа, все находится в одном файле:
Lua:
ListenToGameEvent('entity_killed', Dynamic_Wrap(self, 'OnEntityKilled'), self) -- слушатель который содержит информацию и может быть взять в keys по частям
function NameADDON:OnEntityKilled( keys )
  local killedUnit = EntIndexToHScript( keys.entindex_killed )
end
function NameADDON:MyCustomEvent(killedUnit)
--тут всякая хуйня....
end


Lua:
--1. Объявите глобальную переменную, в которую вы будете сохранять значение keys.
storedKeys = {}

--2. В функции, где есть значение keys, сохраните его в глобальную переменную.
function YourFunctionName(keys)
   storedKeys = keys
end

--3. В функции OnStiflingDagger_1 сможешь получить значение keys из глобальной переменной storedKeys.
function CAddonTemplateGameMode:OnStiflingDagger_1()
   local player = storedKeys.playerID
   local ability = player:FindAbilityByName(storedKeys.abilityName)

   ability:SetAbilitySpecialValue(4, 1000)
end
 
Повторюсь, что ошибка связана с тем, что ты нихуя не передаешь в keys - он nil у тебя в дефолте т.к. эта функция созданная тобой
Ты не приложил ничего где у тебя передается информация в keys именно в эту функцию - P.s. Если все в одном LUA скрипте то ты объявляешь локальную и её передаешь
Если у тебя все на разных LUA файлах, то используй глобальную для хранения этого Keys и то переименуй её

Вот тебе небольшой пример на ивенте убийства существа, все находится в одном файле:
Lua:
ListenToGameEvent('entity_killed', Dynamic_Wrap(self, 'OnEntityKilled'), self) -- слушатель который содержит информацию и может быть взять в keys по частям
function NameADDON:OnEntityKilled( keys )
  local killedUnit = EntIndexToHScript( keys.entindex_killed )
end
function NameADDON:MyCustomEvent(killedUnit)
--тут всякая хуйня....
end


Lua:
--1. Объявите глобальную переменную, в которую вы будете сохранять значение keys.
storedKeys = {}

--2. В функции, где есть значение keys, сохраните его в глобальную переменную.
function YourFunctionName(keys)
   storedKeys = keys
end

--3. В функции OnStiflingDagger_1 сможешь получить значение keys из глобальной переменной storedKeys.
function CAddonTemplateGameMode:OnStiflingDagger_1()
   local player = storedKeys.playerID
   local ability = player:FindAbilityByName(storedKeys.abilityName)

   ability:SetAbilitySpecialValue(4, 1000)
end
Но я ведь там и так могу получить значения keys. Например keys.abilityName спокойно работает.А вот взять playerID и использовать в FindAbilityByName, я не могу
 
Вот например с помощью этого ability = ability:entindex(), у меня получается забрать оттуда способность в виде числа(888), Но при попытке сделать вот так
ability:SetAbilitySpecialValue(4, 1000), оно пишет, что тип number. А если сделать EntIndexToHScript, то пишет nil value
 
Для того чтобы получить героя из ид игрока можно использовать
PlayerResource:GetSelectedHeroEntity(player_id)
 
...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:77: attempt to index field 'playerID' (a number value)
stack traceback:
...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:77: in function <...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:75>
Script Runtime Error: ...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:77: attempt to index field 'playerID' (a number value)
stack traceback:
...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:77: in function <...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:75>

Опять же, нерешенная ошибка. У меня не получается это значение использовать в FindAbilityByName


Lua:
function CAddonTemplateGameMode:OnStiflingDagger_1(keys)
    print('Keys: '..keys.playerID)
    local ability = keys.playerID:FindAbilityByName(keys.abilityName)
    -- local ability = EntIndexToHScript(keys.ability)
    -- local player = data.playerID
    -- local ability = player:FindAbilityByName(data.abilityName)

    ability:SetAbilitySpecialValue(4, 1000)

end


JavaScript:
function onBtnTestClick(buttonIndex){

    // var plyID = GetLocalPlayer(); // Game - глобальная штука, смотри API JS

    $.Msg("Button index: "+ buttonIndex);
    var data = {        // Обьект для передачи в Луа
      playerID: Players.GetLocalPlayer(),
      talentID: buttonIndex,
      ability: eventData.ability,
      abilityName: eventData.abilityName,
      abilityLevel: eventData.abilityLevel,
      hero: eventData.hero
    }
    
    // кладем                        "придуманное_имя_события" и наш обьект
    GameEvents.SendCustomGameEventToServer( "learn_stifling_dagger_1", data);
    dotaH.FindChildrenWithClassTraverse("stat-tooltip-root")[0].ToggleClass("show");
    for(var i=0; i<talentPanels.length; i++) {
      talentPanels[i].DeleteAsync(0);
    }
    talentPanels = [];
  }
 
Lua:
function CAddonTemplateGameMode:OnStiflingDagger_1(keys)

    print('Keys: '..keys.playerID)

    local player = PlayerResource:GetPlayer(keys.playerID)

    if player then

        local ability = player:GetAssignedHero():FindAbilityByName(keys.abilityName)

        if ability then

            ability:SetAbilitySpecialValue(4, 1000)

        end

    end

end


JavaScript:
function onBtnTestClick(buttonIndex){

    var data = {

        playerID: Game.GetLocalPlayerID(),

        abilityName: eventData.abilityName

    }

    

    GameEvents.SendCustomGameEventToServer("learn_stifling_dagger_1", data);

    

    // остальной код

}


В этом примере, мы используем функцию PlayerResource:GetPlayer для получения объекта игрока по его идентификатору (keys.playerID). Затем, мы проверяем, что объект игрока существует и получаем его текущего героя с помощью функции player:GetAssignedHero(). Далее, мы ищем способность с заданным именем (keys.abilityName) и устанавливаем для нее значения.

В JS коде, мы используем Game.GetLocalPlayerID() для получения идентификатора локального игрока, который будет отправлен на сервер. Затем, мы создаем объект data, в котором указываем playerID и abilityName. Используя функцию GameEvents.SendCustomGameEventToServer, мы отправляем данные на сервер вместе с названием события ("learn_stifling_dagger_1").

Обратите внимание, что вам может потребоваться внести дополнительные изменения в ваш код, в зависимости от вашей конкретной ситуации. Это лишь пример, и вам нужно адаптировать его под свои потребности.
 
...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:81: attempt to call method 'SetAbilitySpecialValue' (a nil value)
stack traceback:
...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:81: in function <...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:75>
Script Runtime Error: ...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:81: attempt to call method 'SetAbilitySpecialValue' (a nil value)
stack traceback:
...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:81: in function <...addons\dotacustommy\scripts\vscripts\addon_game_mode.lua:75>
Lua:
function CAddonTemplateGameMode:OnStiflingDagger_1(keys)
    print('Keys: '..keys.playerID)
    local player = PlayerResource:GetPlayer(keys.playerID)
    if player then
        local ability = player:GetAssignedHero():FindAbilityByName(keys.abilityName)
        if ability then
            ability:SetAbilitySpecialValue(4,1000)
        end
    end

end

Опять же, абсолютно ничего не изменилось. Как приходил nil, так и приходит
 
У тебя уже проблема в
if ability then
ability:SetAbilitySpecialValue(4,1000)
end

Ошибка указывает на то, что метод SetAbilitySpecialValue вызывается для nil значения. Вероятно, это связано с тем, что способность с заданным именем не была найдена. Проверьте, что у вас есть правильное имя способности и что она существует у героя.

Убедитесь, что:

1. У вас есть объект игрока, который не равен nil, и у него есть герой, с которым связана способность.
2. Проверьте, что имя способности верное и соответствует имени способности в файле ресурсов Dota 2.

Если возникают проблемы с поиском способности, вы можете использовать другие методы для поиска, например, FindAbilityByName у героя или FindAbilityByName прямо у CDOTABaseAbility.

Пример использования метода FindAbilityByName у героя:

Lua:
local ability = player:GetAssignedHero():FindAbilityByName(keys.abilityName)


Пример использования метода FindAbilityByName у CDOTABaseAbility:

Lua:
local ability = EntIndexToHScript(keys.ability):FindAbilityByName(keys.abilityName)


Убедитесь, что вы используете правильные объекты и методы, и что у вас есть доступ к способности, прежде чем вызывать метод SetAbilitySpecialValue.
 
SetAbilitySpecialValue это вообще что за функция? Апи не могу найти
 
playerID приходит nil действительно. Герой приходит в виде таблицы и не может вывести в консоль
Вообще вот эти данные в консоли отображаются из js файла

{
playerID int( 0 = 0x0 )
talentID int( 2 = 0x2 )
ability int( 766 = 0x2FE )
abilityName phantom_assassin_stifling_dagger_lua
abilityLevel int( 2 = 0x2 )
hero int( 746 = 0x2EA )
}
Однако почему из js файла это возвращается, вообще не знаю
 
SetAbilitySpecialValue это вообще что за функция? Апи не могу найти
Это мне нейросеть выдала

Для изменения значений AbilitySpecial в KV-файле из Lua в Dota Workshop Tools вы можете использовать функции Lua-библиотеки, такие как Ability:SetAbilitySpecialValue, Ability:SetAbilitySpecialFloat, Ability:SetAbilitySpecialInt, Ability:SetAbilitySpecialString и другие.

Ниже приведен пример кода Lua, демонстрирующий, как изменить значение AbilitySpecial в KV-файле:
 
Это мне нейросеть выдала

Для изменения значений AbilitySpecial в KV-файле из Lua в Dota Workshop Tools вы можете использовать функции Lua-библиотеки, такие как Ability:SetAbilitySpecialValue, Ability:SetAbilitySpecialFloat, Ability:SetAbilitySpecialInt, Ability:SetAbilitySpecialString и другие.

Ниже приведен пример кода Lua, демонстрирующий, как изменить значение AbilitySpecial в KV-файле:
Какое значение ты вообще меняешь, что ты хочешь сделать?

Ибо таких функций в оприоре нет в доте
 
Реклама: