• Приветствуем на сайте, Гость! Обязательно ознакомьтесь с условиями и правилами Публичной оферты Проекта NetZONA.org: https://netzona.org/help/public-offer/

  • Приветствуем на сайте, Гость! Обязательно ознакомьтесь с условиями и правилами использования Ваших файлов cookie на Проекте NetZONA.org: https://netzona.org/help/cookies/

  • Приветствуем на сайте, Гость! Обязательно ознакомьтесь с Политикой конфиденциальности Проекта NetZONA.org: https://netzona.org/pages/privacy-policy/

  • Ответы на основные вопросы: https://netzona.org/threads/populjarnye-voprosy-i-otvety-na-nix.6122/

  • Приветствуем на сайте, Гость! Приобрести (купить) Информационную услугу (в том числе группу "Проверенный") на Проекте NetZONA.org: https://netzona.org/account/upgrades

Проблема лут игрока

  • Автор темы Автор темы Hikka
  • Дата начала Дата начала
Статус
В этой теме нельзя размещать новые ответы.

Hikka

Модератор
Команда форума
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
31
Пол
Есть скрипт и бывает такой баг. Как решать?
p.s видос лагает из за моего гавнокомпа, да и возможно софт дерьмо.

Ошибка:
Код:
[ERROR] gamemodes/nutscript/gamemode/core/libs/sh_item.lua:283: attempt to concatenate local 'uniqueID' (a table value)

new - gamemodes/nutscript/gamemode/core/libs/sh_item.lua:283
unknown - gamemodes/nutscript/gamemode/core/libs/sh_item.lua:381
func - gamemodes/nutscript/gamemode/core/libs/thirdparty/sh_netstream2.lua:155
unknown - lua/includes/extensions/net.lua:32
 
Где в файле указан перенос всех файлов в новый инвентарь - там проблема в самом переносе. Поле
uniqueID должно быть только строкой, а где-то получается в виде таблицы. Надо отследить этот момент
 
Где в файле указан перенос всех файлов в новый инвентарь - там проблема в самом переносе. Поле
uniqueID должно быть только строкой, а где-то получается в виде таблицы. Надо отследить этот момент
Код:
function PLUGIN:PlayerDeath( ply, dmg, att )
    timer.Simple(0, function()
        if (IsValid(ply)) then
            local inv = ply:getChar():getInv():getItems()
            if inv && #inv < 1 then return end
        end
    end)
    
    local entity = ents.Create("nut_loot") --** Create World Container that should not be saved in the server.
    entity:SetPos( ply:GetPos() + Vector( 0, 0, 10 ) )
    entity:SetAngles(entity:GetAngles())
    entity:Spawn()
    entity:setNetVar("name", "Belongings" ) --** Yup.
    entity:setNetVar( "max", 5000 )
    entity:SetModel("models/props_junk/garbage_bag001a.mdl")
    entity:SetSolid(SOLID_VPHYSICS)
    entity:PhysicsInit(SOLID_VPHYSICS)

    local physObj = entity:GetPhysicsObject()

    if (IsValid(physObj)) then
        physObj:EnableMotion(true)
        physObj:Wake()
    end

    nut.item.newInv(0, "loot-"..math.random(0,9999), function(inventory)
        if (IsValid(entity)) then
            inventory:setSize(nut.config.get("invW"), nut.config.get("invH"))
            entity:setInventory(inventory)
        end
    end)

    for _, v in pairs(ply:getChar():getInv():getItems()) do
        v:transfer(entity:getNetVar("id"))
    end

    ply:StripAmmo() --** This is Normal.

end
получается transfer нужно править?
вот тут я не шарю.
ps. nutscript 1.1 брал с твоего репозитория.
 
Последнее редактирование:
1. Проверь что пересылается в инвентарь.
2. Проверь идентификатор инвентаря, куда пересылаются предметы.
3. Поправь тип инвентаря. Вместо "loot-"..math.random(0,9999) должен быть один идентификатор.
 
1. Проверь что пересылается в инвентарь.
2. Проверь идентификатор инвентаря, куда пересылаются предметы.
3. Поправь тип инвентаря. Вместо "loot-"..math.random(0,9999) должен быть один идентификатор.
1. print(nut.item.inventories[entity:getNetVar("id")]) - выдает 9, если я правильно сделал.
2/3. Как узнать какой идентификатор?
 
Последнее редактирование:
1. print(nut.item.inventories[entity:getNetVar("id")]) - выдает 9, если я правильно сделал.
2/3. Как узнать какой идентификатор?
1. Нужно смотреть что именно передаётся. В цикле.
2. inv:getID()
3. Сделай тип инвентаря размером как у игрока с помощью registerInv (забыл какая там функция). Назначь идентификатор потом текущему инвентарю.
 
1. Нужно смотреть что именно передаётся. В цикле.
2. inv:getID()
3. Сделай тип инвентаря размером как у игрока с помощью registerInv (забыл какая там функция). Назначь идентификатор потом текущему инвентарю.
Ни черта не понимаю ) скрипт то не я писал. Ну ладно попробую.
Кстате автор тоже хз как решить, ибо отписался и он тоже ищет решение.
Баг-репорт:
Эта ссылка скрыта от группы "Гость" (группа пользователей, которые еще не прошли регистрацию или авторизацию на Проекте). Чтобы увидеть эту ссылку Вам требуется авторизоваться или пройти регистрацию на Проекте (зарегистрироваться).
 
Сделал так
Код:
    local ran = math.random(0,9999)
    nut.item.registerInv(ran, nut.config.get("invW"), nut.config.get("invH"))
    nut.item.newInv(0, ran, function(inventory)
        if (IsValid(entity)) then
            entity:setInventory(inventory)
            print("inventory:getID() = "..inventory:getID())
        end
    end)
в print("inventory:getID() = "..inventory:getID()) = 3

Код:
    for _, v in pairs(ply:getChar():getInv():getItems()) do
        v:transfer(entity:getNetVar("id"))
        print("v:getID() = "..v:getID())
        print("entity:getNetVar(id) = "..entity:getNetVar("id"))
    end

print("v:getID() = "..v:getID()) = от 3 до 23
print("entity:getNetVar(id) = "..entity:getNetVar("id")) = 3

Ошибка от этого не исправилась. Нужно что-то конкретное, дабы ее решить.
 
Последнее редактирование:
Ошибка от этого не исправится, но это ключ к её решению.
Но тут надо самому чекать код и смотреть что выходит. Я проверю его, что это за плагин?
 
Ошибка от этого не исправится, но это ключ к её решению.
Но тут надо самому чекать код и смотреть что выходит. Я проверю его, что это за плагин?
looting.
Эта ссылка скрыта от группы "Гость" (группа пользователей, которые еще не прошли регистрацию или авторизацию на Проекте). Чтобы увидеть эту ссылку Вам требуется авторизоваться или пройти регистрацию на Проекте (зарегистрироваться).
, мы так и не решили ее.
Очень нужно ее решить. Не могу дальше продолжать делать проект.
 
По данному поводу могу предложить следующее:
Попробуй минимизировать готовый плагин, сделав его максимально «пустым».
Т.е. для entity-объекта оставь только функции: Initialize() ; setInventory(); Use() ; getInv() .
Что-то в этом роде:
Код:
if (SERVER) then
    function ENT:Initialize()
        --self:SetModel("models/Items/item_item_crate.mdl")
        self:SetSolid(SOLID_VPHYSICS)
        self:PhysicsInit(SOLID_VPHYSICS)
        self:SetUseType(SIMPLE_USE)
        self.receivers = {}

        local physObj = self:GetPhysicsObject()

        if (IsValid(physObj)) then
            physObj:EnableMotion(true)
            physObj:Wake()
        end
    end

    function ENT:setInventory(inventory)
        if (inventory) then
            self:setNetVar("id", inventory:getID())

            inventory.onAuthorizeTransfer = function(inventory, client, oldInventory, item)
                if (IsValid(client) and IsValid(self) and self.receivers[client]) then
                    return true
                end
            end

            inventory.getReceiver = function(inventory)
                local receivers = {}

                for k, v in pairs(self.receivers) do
                    if (IsValid(k)) then
                        receivers[#receivers + 1] = k
                    end
                end

                return #receivers > 0 and receivers or nil
            end
        end
    end

    function ENT:Use(activator)
        local inventory = self:getInv()

        if (inventory and (activator.nutNextOpen or 0) < CurTime()) then
            if (activator:getChar()) then
                activator:setAction("Opening...", 1, function()
                    if (activator:GetPos():Distance(self:GetPos()) <= 100) then
                        self.receivers[activator] = true
                        activator.nutBagEntity = self
                       
                        inventory:sync(activator)
                        netstream.Start(activator, "lootOpen", self, inventory:getID())
                    end
                end)
            end

            activator.nutNextOpen = CurTime() + 1.5
        end
    end

    function ENT:getInv()
        return nut.item.inventories[self:getNetVar("id", 0)]
    end

    function ENT:OnRemove()
    end
end
В функции PlayerDeath() оставь приблизительно все, как есть, но добавь инициализацию ресивера, дабы был определен «получатель/открыватель».
Выглядеть данное может следующим образом:
Акцентировать внимание стоит на strg.receivers = {}
Код:
function PLUGIN:PlayerDeath( player, damage, attacker )
    local character = player:getChar():getInv()

    local strg = ents.Create("nut_loot")
    strg:SetModel("models/props_junk/garbage_bag001a.mdl")
    strg:SetPos(player:GetPos() + Vector(0,0, 16))
    strg:SetAngles(player:GetAngles())
    strg:SetSolid(SOLID_VPHYSICS)
    strg:PhysicsInit(SOLID_VPHYSICS)
    strg.receivers = {}

    nut.item.newInv(0, "_itmstrg"..player:SteamID(), function(inventory)
        if IsValid(strg) then
            inventory:setSize(nut.config.get("invW"), nut.config.get("invH"))
            strg:setInventory(inventory)
        end
    end)

    local inv = character:getItems()
    local var = strg:getNetVar("id")
    for k, v in pairs(inv) do
        v:transfer(var)

        strg:Spawn()
    end

    if IsValid(strg) then
        timer.Simple(self.staytime, function()
            strg:Remove()
        end)
    end
end

Насколько оно работает исправно - совершенно без понятия. Краткий тест дал понять, что работает вполне устойчиво, но нужно уточнить.
 
По данному поводу могу предложить следующее:
Попробуй минимизировать готовый плагин, сделав его максимально «пустым».
Т.е. для entity-объекта оставь только функции: Initialize() ; setInventory(); Use() ; getInv() .
Что-то в этом роде:
Код:
if (SERVER) then
    function ENT:Initialize()
        --self:SetModel("models/Items/item_item_crate.mdl")
        self:SetSolid(SOLID_VPHYSICS)
        self:PhysicsInit(SOLID_VPHYSICS)
        self:SetUseType(SIMPLE_USE)
        self.receivers = {}

        local physObj = self:GetPhysicsObject()

        if (IsValid(physObj)) then
            physObj:EnableMotion(true)
            physObj:Wake()
        end
    end

    function ENT:setInventory(inventory)
        if (inventory) then
            self:setNetVar("id", inventory:getID())

            inventory.onAuthorizeTransfer = function(inventory, client, oldInventory, item)
                if (IsValid(client) and IsValid(self) and self.receivers[client]) then
                    return true
                end
            end

            inventory.getReceiver = function(inventory)
                local receivers = {}

                for k, v in pairs(self.receivers) do
                    if (IsValid(k)) then
                        receivers[#receivers + 1] = k
                    end
                end

                return #receivers > 0 and receivers or nil
            end
        end
    end

    function ENT:Use(activator)
        local inventory = self:getInv()

        if (inventory and (activator.nutNextOpen or 0) < CurTime()) then
            if (activator:getChar()) then
                activator:setAction("Opening...", 1, function()
                    if (activator:GetPos():Distance(self:GetPos()) <= 100) then
                        self.receivers[activator] = true
                        activator.nutBagEntity = self
                      
                        inventory:sync(activator)
                        netstream.Start(activator, "lootOpen", self, inventory:getID())
                    end
                end)
            end

            activator.nutNextOpen = CurTime() + 1.5
        end
    end

    function ENT:getInv()
        return nut.item.inventories[self:getNetVar("id", 0)]
    end

    function ENT:OnRemove()
    end
end
В функции PlayerDeath() оставь приблизительно все, как есть, но добавь инициализацию ресивера, дабы был определен «получатель/открыватель».
Выглядеть данное может следующим образом:
Акцентировать внимание стоит на strg.receivers = {}
Код:
function PLUGIN:PlayerDeath( player, damage, attacker )
    local character = player:getChar():getInv()

    local strg = ents.Create("nut_loot")
    strg:SetModel("models/props_junk/garbage_bag001a.mdl")
    strg:SetPos(player:GetPos() + Vector(0,0, 16))
    strg:SetAngles(player:GetAngles())
    strg:SetSolid(SOLID_VPHYSICS)
    strg:PhysicsInit(SOLID_VPHYSICS)
    strg.receivers = {}

    nut.item.newInv(0, "_itmstrg"..player:SteamID(), function(inventory)
        if IsValid(strg) then
            inventory:setSize(nut.config.get("invW"), nut.config.get("invH"))
            strg:setInventory(inventory)
        end
    end)

    local inv = character:getItems()
    local var = strg:getNetVar("id")
    for k, v in pairs(inv) do
        v:transfer(var)

        strg:Spawn()
    end

    if IsValid(strg) then
        timer.Simple(self.staytime, function()
            strg:Remove()
        end)
    end
end

Насколько оно работает исправно - совершенно без понятия. Краткий тест дал понять, что работает вполне устойчиво, но нужно уточнить.
Код:
[ERROR] gamemodes/nutscript/gamemode/core/libs/sh_item.lua:283: attempt to concatenate local 'uniqueID' (a table value)
  1. new - gamemodes/nutscript/gamemode/core/libs/sh_item.lua:283
   2. unknown - gamemodes/nutscript/gamemode/core/libs/sh_item.lua:381
    3. func - gamemodes/nutscript/gamemode/core/libs/thirdparty/sh_netstream2.lua:155
     4. unknown - lua/includes/extensions/net.lua:32
В итоге: все равно та же ошибка. Как скзаал НЕОН, тут нужно копать в сторону transfer. Подождем, пока неон глянет и попробует решить ошибку.
 
Код:
...core/libs/sh_item.lua:283
Если верить функции по 283-ей строке, а именно nut.item.new(), то можно предположить, что не идентифицируется какой-либо предмет.
Не столь уверен, что ошибка кроется в transfer-е предмета. Только если, конечно же, проблема не в самом предмете.

Данная проблемка возникает с каждым предметом, который находится в мешочке, иль же только при явлении определенных предметов?
 
Код:
...core/libs/sh_item.lua:283
Если верить функции по 283-ей строке, а именно nut.item.new(), то можно предположить, что не идентифицируется какой-либо предмет.
Не столь уверен, что ошибка кроется в transfer-е предмета. Только если, конечно же, проблема не в самом предмете.

Данная проблемка возникает с каждым предметом, который находится в мешочке, иль же только при явлении определенных предметов?
Да я тоже думал что проблема в nut.item.new.
Есть некая аномалия у данного скрипта. Например. Пару предметов штуки 2-3, ошибка не появляется (лично вызвать не получилось). Возможно эта ошибка заключается в каком-то кривом предмете (на что я и грешу). Сегодня проведу тщательный анализ и скажу точно при каких условиях появляется данная ошибка.
 
Баг появляется даже на чистой версии nutscript 1.1. Возникает он рандомно, например если купить 4 вещи
2 на 2. Т.е например две одинаковые книги и два одинаковых ботинка и этот баг появится с шансом 98%
 
Устал я париться с этой ошибкой. Сделал так:
Код:
nut.command.add("loot", {
    onRun = function(ply, arguments)
        for _, item in pairs(ply:getChar():getInv():getItems()) do
            item:spawn(ply:getItemDropPos())
        end
    end
})
Легкий выход из данной ситуации (команду привел лишь для проверки).
Такой способ выпадения вещей я видел в игрушке The War Z.
Немножк подредактирую и выложу кому нужно.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Главная Регистрация
Назад
Сверху