SwitchCraftCC / Plethora-Fabric

A peripheral provider for ComputerCraft, ported to Fabric
MIT License
16 stars 13 forks source link

Introspection module voids items when player is offline #85

Open lexi-the-cute opened 10 months ago

lexi-the-cute commented 10 months ago

When logging off on a server, items from the introspected chest inventory slot get voided

Reproduce:

Server Info:

Mods:

Relevant Information (also included in debug-server.zip):

function main()
    -- todo: implement way of detecting existing slots to top up
    -- todo: implement multi user support
    term.clear()
    print('"Item Shadowing" Running...')

    status, inv = xpcall(getInventory, errorHandler)
    while not status do
        status, inv = xpcall(getInventory, errorHandler)
        sleep(1)
    end

    while true do
        -- call function with error handler
        status = xpcall(shadowItems, errorHandler)

        -- sleep for 1 second
        sleep(1)
    end
end

function getInventory()
    local introspector = peripheral.wrap("top")
    return introspector.getInventory()
end

function shadowItems()
    -- chicken
    inv.pullItems("left", 1, 64, 9)

    -- rockets
    --inv.pullItems("right", 1, 64, 8)
end

function errorHandler(err)
    -- most likely the player went offline
    -- print("Error: " .. err)
end

main()
Lemmmy commented 10 months ago

Duplicate/regression of #31

Lemmmy commented 10 months ago

Can you share the code you used to reproduce as a code snippet in the issue?

Lemmmy commented 8 months ago

I know that a few players have run into this on SwitchCraft (especially recently), but I still can't reproduce this at all. Your world download isn't working for me, can you think of any other steps that might be involved?

This is the code I'm testing with:

local chest = peripheral.wrap("right")
local manip = peripheral.wrap("left")

sleep(5)

local status, inv = pcall(manip.getInventory)
while not status do
  status, inv = pcall(manip.getInventory)
  sleep(1)
end

while true do
  local ok, count = pcall(inv.pullItems, "right", 1, 64, 1)
  print("transferred", ok, count)
  sleep(1)
end

I've tried following your steps exactly. I've also tried logging off before getInventory is called, I've tried logging off after getInventory is called, I've tried logging off at different times, I've tried not dropping an item, I've tried having an empty inventory, I've tried saving after dropping but before logging off, I've tried saving after logging off.

In all my test cases, the game is correctly throwing "The entity is no longer there" when the player is offline, and not transferring/voiding any items.

scmcgowen commented 8 months ago

If you have a backup of my computer before I made the fix, you can use the program for that. it is known to trigger the bug

Lemmmy commented 8 months ago

An isolated case would be more helpful if possible

scmcgowen commented 8 months ago

if you could send me the file, I'll cut out anything that isn't related to my autofeeder. I wiped the computer before installing hopper.lua

scmcgowen commented 8 months ago
local function handleBaseSlot()
    while true do
        sleep(0.5)
        local lst = inv.list()
        --if lst[36] then
          --  inv.pushItems("left",36)
        --end
        if not lst[18] or lst[18].count < 64 then
            inv.pullItems("ender_storage_6461",1,64,18)
        end

    end
end

is the code, make sure the chunk this is running on is loaded

Lemmmy commented 8 months ago

Update from conversation on Discord: still no luck with the above program. Also tried ender storages, rebooting the computer instead of pcalling, far away chunks that weren't spawn loaded, partial slots (having half a stack before logging off)

This test program:

startup.lua

while true do
  parallel.waitForAny(function() shell.run("main.lua") end)
  sleep(2)
end

main.lua

local chest = peripheral.wrap("right")
local manip = peripheral.wrap("left")

local inv = manip.getInventory()

while true do
  sleep(0.5)
  local lst = inv.list()
  if not lst[18] or lst[18].count < 64 then
    inv.pullItems("right", 1, 64, 18)
  end
end