NS 1.1 При plytransfer игрока в фракцию OTA возникает ошибка

Ares

Участник
#1
Здравствуйте, решил глянуть обновленную схему ns hl2rp, там добавили функцию смены имени при трансфере гражданского в ОТА и там возникает вот такая ошибка, хотел бы узнать как исправить
Lua:
[ERROR] gamemodes/hl2rp/schema/factions/sh_overwatch.lua:31: attempt to index local 'oldFaction' (a nil value)
  1. onTransfered - gamemodes/hl2rp/schema/factions/sh_overwatch.lua:31
   2. onRun - gamemodes/nutscript/gamemode/core/sh_commands.lua:674
    3. run - gamemodes/nutscript/gamemode/core/libs/sh_command.lua:156
     4. parse - gamemodes/nutscript/gamemode/core/libs/sh_command.lua:201
      5. Run - gamemodes/nutscript/gamemode/core/hooks/sv_hooks.lua:255
       6. unknown - gamemodes/nutscript/plugins/chatbox/sh_plugin.lua:69
        7. func - gamemodes/nutscript/gamemode/core/libs/thirdparty/sh_netstream2.lua:117
         8. unknown - lua/includes/extensions/net.lua:32
Код функции:
Lua:
function FACTION:onTransfered(client, oldFaction)
    local digits
    local inventory = client:getChar():getInv()
    if (oldFaction.index == FACTION_CITIZEN and inventory) then
        for _, item in pairs(inventory:getItems()) do
            if (item.uniqueID == "cid" and item:getData("id")) then
                digits = item:getData("id")
                break
            end
        end
    elseif (oldFaction.index == FACTION_CP) then
        digits = client:getDigits()
    elseif (oldFaction.index == FACTION_OW) then
        return
    end

    client:getChar():setName(self:onGetDefaultName(client, digits))
    hook.Run("PlayerLoadout", client)
end
Замена oldFaction.index на client:Team() или client:getChar():getFaction() особого результата не дало, ошибка исчезла, но имя персонажа не меняется.
 

Neon

Administrator
Команда форума
#2
Однозначно понятно, что переменная oldFaction равна nil. oldFaction.index в этом случае выдаёт ошибку, т.к. обращение невозможно.
Надо проверить что передаётся в качестве аргумента при вызове функции FACTION:eek:nTransfered(client, oldFaction)
Рискну предположить, что вызов происходит через команду чата.
Смотреть надо 2. onRun - gamemodes/nutscript/gamemode/core/sh_commands.lua:674
 

Ares

Участник
#3
Однозначно понятно, что переменная oldFaction равна nil. oldFaction.index в этом случае выдаёт ошибку, т.к. обращение невозможно.
Надо проверить что передаётся в качестве аргумента при вызове функции FACTION:eek:nTransfered(client, oldFaction)
Рискну предположить, что вызов происходит через команду чата.
Смотреть надо 2. onRun - gamemodes/nutscript/gamemode/core/sh_commands.lua:674
Тут передается только одно значение
Lua:
if (faction.onTransfered) then
    faction:onTransfered(target)
end
 

Neon

Administrator
Команда форума
#4
А должно 2. Но судя по коду скажу, что не критичные данные. Тут просто надо получить идентификатор предыдущей фракции
 

Ares

Участник
#5
А должно 2. Но судя по коду скажу, что не критичные данные. Тут просто надо получить идентификатор предыдущей фракции
А есть варианты его получения? Те способы что я описал в первом посте не помогли, ошибки нет, но имя не меняется. Теста ради убрал условие if (oldFaction.index == FACTION_CITIZEN and inventory) then и его else и все прекрасно работает, но оно нужно.
 

Neon

Administrator
Команда форума
#6
Попробуй добавить в sh_commands такой код:
Lua:
nut.command.add("plytransfer", {
    adminOnly = true,
    syntax = "<string name> <string faction>",
    onRun = function(client, arguments)
        local target = nut.command.findPlayer(client, arguments[1])
        local name = table.concat(arguments, " ", 2)

        if (IsValid(target) and target:getChar()) then
            local faction = nut.faction.teams[name]

            if (!faction) then
                for k, v in pairs(nut.faction.indices) do
                    if (nut.util.stringMatches(L(v.name, client), name)) then
                        faction = v

                        break
                    end
                end
            end

            if (faction) then
                local oldFaction = nut.faction.indices[target:getChar():getFaction()]
                target:getChar().vars.faction = faction.uniqueID
                target:getChar():setFaction(faction.index)

                if (faction.onTransfered) then
                    faction:onTransfered(target, oldFaction)
                end

                for k, v in ipairs(player.GetAll()) do
                    nut.util.notifyLocalized("cChangeFaction", v, client:Name(), target:Name(), L(faction.name, v))
                end
            else
                return "@invalidFaction"
            end
        end
    end
})
 

Ares

Участник
#7
Попробуй добавить в sh_commands такой код:
Lua:
nut.command.add("plytransfer", {
    adminOnly = true,
    syntax = "<string name> <string faction>",
    onRun = function(client, arguments)
        local target = nut.command.findPlayer(client, arguments[1])
        local name = table.concat(arguments, " ", 2)

        if (IsValid(target) and target:getChar()) then
            local faction = nut.faction.teams[name]

            if (!faction) then
                for k, v in pairs(nut.faction.indices) do
                    if (nut.util.stringMatches(L(v.name, client), name)) then
                        faction = v

                        break
                    end
                end
            end

            if (faction) then
                local oldFaction = nut.faction.indices[target:getChar():getFaction()]
                target:getChar().vars.faction = faction.uniqueID
                target:getChar():setFaction(faction.index)

                if (faction.onTransfered) then
                    faction:onTransfered(target, oldFaction)
                end

                for k, v in ipairs(player.GetAll()) do
                    nut.util.notifyLocalized("cChangeFaction", v, client:Name(), target:Name(), L(faction.name, v))
                end
            else
                return "@invalidFaction"
            end
        end
    end
})
О, спасибо, помогло!
 
Помощь Пользователи

Вы не присоединились ни к одной комнате.

    Вы не присоединились ни к одной комнате.
    Сверху