RGON: Potential fix for BoC floor item desyncs

This commit is contained in:
Wofsauge committed 2024-02-29 21:05:52 +01:00
1 parent fde703a05b
commit 01788b0d11
2 files changed
+55 -24

No files matched your search

+32 -24
View File
@@ -588,11 +588,12 @@ function EID:BoCCheckForPickups()
end
end
EID:AddCallback(ModCallbacks.MC_POST_NEW_ROOM, function(_)
function EID:BoCOnNewRoom(_)
-- We're using the pickup indexes for quick checking, which reset on each new room
pickupsCollected = {}
recheckPickups = true
end)
end
EID:AddCallback(ModCallbacks.MC_POST_NEW_ROOM, EID.BoCOnNewRoom)
-- Using a Card/Pill will change our inventory craftable items, so force a refresh then
-- (Note: Items that directly add a card/pill to you, i.e. Bottle of Pills, also need a refresh, but aren't tracked for performance)
@@ -974,6 +975,34 @@ function EID:handleBagOfCraftingUpdating()
if (bagOfCraftingOffset >= numResults) then bagOfCraftingOffset = bagOfCraftingOffset - EID.Config["BagOfCraftingResults"] end
end
-- Check what pickups are available in this room
function EID:BoCGetRoomPickupList()
local currentRoomDesc = game:GetLevel():GetCurrentRoomDesc()
local curRoomIndex = currentRoomDesc.ListIndex
local pickups = Isaac.FindByType(5, -1, -1, true, false)
if EID.BoC.CurrentPickupCount ~= #pickups or recheckPickups then
local roomItems = {}
recheckPickups = false
for _, entity in ipairs(pickups) do
local craftingIDs = EID:getBagOfCraftingID(entity.Variant, entity.SubType)
if craftingIDs ~= nil and not entity:ToPickup():IsShopItem() and entity:GetSprite():GetAnimation() ~= "Collect" then
for _,v in ipairs(craftingIDs) do
table.insert(roomItems, v)
end
end
end
EID.BoC.RoomQueries[curRoomIndex .. ""] = { roomItems, currentRoomDesc.Data.Variant }
EID.BoC.CurrentPickupCount = #pickups
calcHeldItems()
calcFloorItems()
EID.RefreshBagTextbox = true
return roomItems
else
return EID.BoC.RoomQueries[curRoomIndex .. ""] and EID.BoC.RoomQueries[curRoomIndex .. ""][1] or {}
end
end
-- Called when needed based on EID.Config["RefreshRate"]
function EID:handleBagOfCraftingRendering(ignoreRefreshRate)
-- Determine if we should display anything at all
@@ -1017,28 +1046,7 @@ function EID:handleBagOfCraftingRendering(ignoreRefreshRate)
if (EID.Config["BagOfCraftingDisplayRecipesMode"] == "Preview Only") then return false end
-- Check what pickups are available in this room
local curRoomIndex = game:GetLevel():GetCurrentRoomDesc().ListIndex
local roomItems = {}
local pickups = Isaac.FindByType(5, -1, -1, true, false)
if EID.BoC.CurrentPickupCount ~= #pickups or recheckPickups then
recheckPickups = false
for _, entity in ipairs(pickups) do
local craftingIDs = EID:getBagOfCraftingID(entity.Variant, entity.SubType)
if craftingIDs ~= nil and not entity:ToPickup():IsShopItem() and entity:GetSprite():GetAnimation() ~= "Collect" then
for _,v in ipairs(craftingIDs) do
table.insert(roomItems, v)
end
end
end
EID.BoC.RoomQueries[curRoomIndex .. ""] = { roomItems, game:GetLevel():GetCurrentRoomDesc().Data.Variant }
EID.BoC.CurrentPickupCount = #pickups
calcHeldItems()
calcFloorItems()
EID.RefreshBagTextbox = true
else
roomItems = EID.BoC.RoomQueries[curRoomIndex .. ""] and EID.BoC.RoomQueries[curRoomIndex .. ""][1] or {}
end
local roomItems = EID:BoCGetRoomPickupList()
itemQuery = {}
local itemCount = {}
+23
View File
@@ -99,6 +99,29 @@ function EID:BoCTrackBagHolding() end
function EID:BoCDetectBagContentShift() end
-- read room items directly from room data when changing rooms, to ensure floor item counter doesnt desync
function EID:BoCOnNewRoom_Repentogon(_)
EID.BoCOnNewRoom(_)
local lastRoomDesc = game:GetLevel():GetLastRoomDesc()
local lastRoomEntities = lastRoomDesc:GetEntitiesSaveState()
local roomItems = {}
for id = 0, #lastRoomEntities - 1 do
local entitySaveState = lastRoomEntities:Get(id)
if entitySaveState:GetType() == 5 and entitySaveState:GetI3() == 0 then -- is pickup and not shop item
local craftingIDs = EID:getBagOfCraftingID(entitySaveState:GetVariant(), entitySaveState:GetSubType())
if craftingIDs ~= nil then
for _,v in ipairs(craftingIDs) do
table.insert(roomItems, v)
end
end
end
end
EID.BoC.RoomQueries[lastRoomDesc.ListIndex .. ""] = { roomItems, lastRoomDesc.Data.Variant }
end
EID:RemoveCallback(ModCallbacks.MC_POST_NEW_ROOM, EID.BoCOnNewRoom)
EID:AddCallback(ModCallbacks.MC_POST_NEW_ROOM, EID.BoCOnNewRoom_Repentogon)
-----------------------Descriptions & Modifiers --------------------------
local oldHasDescription = EID.hasDescription
function EID:hasDescription(entity)