Welcome to Сообщество игровых серверов NETZONA.ORG

Присоединяйтесь к нам сейчас, чтобы получить доступ ко всем нашим функциям. Зарегистрировавшись и войдя в систему, вы сможете создавать темы, публиковать ответы в существующих темах, давать репутацию другим участникам, получать собственный личный мессенджер и многое другое. Это также быстро и совершенно бесплатно, так чего же вы ждете?
  • Приветствуем на сайте, Гость! Обязательно ознакомьтесь с условиями и правилами Публичной оферты Проекта 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

Модератор
Команда форума
Проверенный
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
30
Пол
Есть скрипт и бывает такой баг. Как решать?
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
 

Neon

Создатель
Команда форума
Проверенный
Регистрация
9 Фев 2013
Сообщения
1,394
Реакции
3
Баллы
49
Где в файле указан перенос всех файлов в новый инвентарь - там проблема в самом переносе. Поле
uniqueID должно быть только строкой, а где-то получается в виде таблицы. Надо отследить этот момент
 

Hikka

Модератор
Команда форума
Проверенный
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
30
Пол
Где в файле указан перенос всех файлов в новый инвентарь - там проблема в самом переносе. Поле
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 брал с твоего репозитория.
 
Последнее редактирование:

Neon

Создатель
Команда форума
Проверенный
Регистрация
9 Фев 2013
Сообщения
1,394
Реакции
3
Баллы
49
1. Проверь что пересылается в инвентарь.
2. Проверь идентификатор инвентаря, куда пересылаются предметы.
3. Поправь тип инвентаря. Вместо "loot-"..math.random(0,9999) должен быть один идентификатор.
 

Hikka

Модератор
Команда форума
Проверенный
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
30
Пол
1. Проверь что пересылается в инвентарь.
2. Проверь идентификатор инвентаря, куда пересылаются предметы.
3. Поправь тип инвентаря. Вместо "loot-"..math.random(0,9999) должен быть один идентификатор.
1. print(nut.item.inventories[entity:getNetVar("id")]) - выдает 9, если я правильно сделал.
2/3. Как узнать какой идентификатор?
 
Последнее редактирование:

Neon

Создатель
Команда форума
Проверенный
Регистрация
9 Фев 2013
Сообщения
1,394
Реакции
3
Баллы
49
1. print(nut.item.inventories[entity:getNetVar("id")]) - выдает 9, если я правильно сделал.
2/3. Как узнать какой идентификатор?
1. Нужно смотреть что именно передаётся. В цикле.
2. inv:getID()
3. Сделай тип инвентаря размером как у игрока с помощью registerInv (забыл какая там функция). Назначь идентификатор потом текущему инвентарю.
 

Hikka

Модератор
Команда форума
Проверенный
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
30
Пол
1. Нужно смотреть что именно передаётся. В цикле.
2. inv:getID()
3. Сделай тип инвентаря размером как у игрока с помощью registerInv (забыл какая там функция). Назначь идентификатор потом текущему инвентарю.
Ни черта не понимаю ) скрипт то не я писал. Ну ладно попробую.
Кстате автор тоже хз как решить, ибо отписался и он тоже ищет решение.
Баг-репорт: https://github.com/Thadah/NSPlugins/issues/1
 

Hikka

Модератор
Команда форума
Проверенный
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
30
Пол
Сделал так
Код:
    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

Ошибка от этого не исправилась. Нужно что-то конкретное, дабы ее решить.
 
Последнее редактирование:

Neon

Создатель
Команда форума
Проверенный
Регистрация
9 Фев 2013
Сообщения
1,394
Реакции
3
Баллы
49
Ошибка от этого не исправится, но это ключ к её решению.
Но тут надо самому чекать код и смотреть что выходит. Я проверю его, что это за плагин?
 

Hikka

Модератор
Команда форума
Проверенный
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
30
Пол
Ошибка от этого не исправится, но это ключ к её решению.
Но тут надо самому чекать код и смотреть что выходит. Я проверю его, что это за плагин?
looting. https://github.com/Thadah/NSPlugins/tree/master/looting , мы так и не решили ее.
Очень нужно ее решить. Не могу дальше продолжать делать проект.
 

DrodA

Пользователь
Проверенный
Регистрация
16 Фев 2017
Сообщения
128
Реакции
0
Баллы
30
Адрес
Sweden
По данному поводу могу предложить следующее:
Попробуй минимизировать готовый плагин, сделав его максимально «пустым».
Т.е. для 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

Насколько оно работает исправно - совершенно без понятия. Краткий тест дал понять, что работает вполне устойчиво, но нужно уточнить.
 

Hikka

Модератор
Команда форума
Проверенный
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
30
Пол
По данному поводу могу предложить следующее:
Попробуй минимизировать готовый плагин, сделав его максимально «пустым».
Т.е. для 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. Подождем, пока неон глянет и попробует решить ошибку.
 

DrodA

Пользователь
Проверенный
Регистрация
16 Фев 2017
Сообщения
128
Реакции
0
Баллы
30
Адрес
Sweden
Код:
...core/libs/sh_item.lua:283
Если верить функции по 283-ей строке, а именно nut.item.new(), то можно предположить, что не идентифицируется какой-либо предмет.
Не столь уверен, что ошибка кроется в transfer-е предмета. Только если, конечно же, проблема не в самом предмете.

Данная проблемка возникает с каждым предметом, который находится в мешочке, иль же только при явлении определенных предметов?
 

Hikka

Модератор
Команда форума
Проверенный
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
30
Пол
Код:
...core/libs/sh_item.lua:283
Если верить функции по 283-ей строке, а именно nut.item.new(), то можно предположить, что не идентифицируется какой-либо предмет.
Не столь уверен, что ошибка кроется в transfer-е предмета. Только если, конечно же, проблема не в самом предмете.

Данная проблемка возникает с каждым предметом, который находится в мешочке, иль же только при явлении определенных предметов?
Да я тоже думал что проблема в nut.item.new.
Есть некая аномалия у данного скрипта. Например. Пару предметов штуки 2-3, ошибка не появляется (лично вызвать не получилось). Возможно эта ошибка заключается в каком-то кривом предмете (на что я и грешу). Сегодня проведу тщательный анализ и скажу точно при каких условиях появляется данная ошибка.
 

Hikka

Модератор
Команда форума
Проверенный
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
30
Пол
Баг появляется даже на чистой версии nutscript 1.1. Возникает он рандомно, например если купить 4 вещи
2 на 2. Т.е например две одинаковые книги и два одинаковых ботинка и этот баг появится с шансом 98%
 

Hikka

Модератор
Команда форума
Проверенный
Регистрация
29 Сен 2016
Сообщения
555
Реакции
1
Баллы
60
Возраст
30
Пол
Устал я париться с этой ошибкой. Сделал так:
Код:
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.
Немножк подредактирую и выложу кому нужно.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху Снизу