Factor out shop buyer and xpticker

This commit is contained in:
2025-03-30 14:39:17 +02:00
parent 482e44e7d6
commit b14df82d78
3 changed files with 91 additions and 147 deletions

View File

@@ -163,150 +163,3 @@ LuaUserData.MakeMethodAccessible(Descriptors["Barotrauma.CargoManager"], "GetCon
-- local repairButton = repairableComponent.RepairButton
-- return repairButton ~= nil and repairButton.Visible
-- end
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
---@return Barotrauma.Location.StoreInfo[], string?
local function getCurrentStore()
if not Game or not Game.GameSession or not Game.GameSession.Campaign then
return nil, "No game session found"
end
local map = Game.GameSession.Campaign.Map
if not map or not map.CurrentLocation or not map.CurrentLocation.Stores then
return nil, "No map found"
end
local location = map.CurrentLocation
-- Otherwise, determine which store is active by checking the cargo manager
local cargoManager = Game.GameSession.Campaign.CargoManager
if not cargoManager then
return nil, "No cargo manager found"
end
-- Find which store has items in the cart
local stores = {}
for _, store in pairs(location.Stores) do
if #cargoManager:GetBuyCrateItems(store) > 0 then
stores[#stores + 1] = store
end
end
return stores, nil
end
-- Example: Add a key binding to buy all items in the current store
-- when the 'B' key is pressed
Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable)
if not PlayerInput.KeyHit(CONFIG.MAX_BUY) then return end
local cargoManager = Game.GameSession.Campaign.CargoManager
if not cargoManager then
print("No cargo manager available")
return
end
local stores, err = getCurrentStore()
if err then
print(string.format("Error getting current store: %s", err))
return
end
for _, store in ipairs(stores) do
local toAdd = {}
-- Get items available at the store
local items = cargoManager:GetBuyCrateItems(store)
for item in items do
-- We have already added this many of item
toAdd[item.ItemPrefab.Identifier.Value] = {
quantity = -item.Quantity,
prefab = item.ItemPrefab -- Store the ItemPrefab object
}
end
for item in store.Stock do
-- So if we add the total amount available
-- We get the amount we have to add to buy entire stock
local idValue = item.ItemPrefab.Identifier.Value
if toAdd[idValue] then
toAdd[idValue].quantity = toAdd[idValue].quantity + item.Quantity
end
end
for idValue, info in pairs(toAdd) do
if info.quantity > 0 then
print(string.format("Adding %d of %s to the buy crate", info.quantity, idValue))
-- Use the stored ItemPrefab object, not the string identifier
cargoManager:ModifyItemQuantityInBuyCrate(store.Identifier, info.prefab, info.quantity)
end
end
end
end, Hook.HookMethodType.After)
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
local amountExperience = 600
local passiveExperienceDelay = 2
local passiveExperienceTimer = 0
Hook.Add("think", "examples.passiveExperience", function()
if Timer.GetTime() < passiveExperienceTimer then return end
for k, v in pairs(Character.CharacterList) do
if not v.IsDead and v.Info ~= nil then
v.Info.GiveExperience(amountExperience)
end
end
passiveExperienceTimer = Timer.GetTime() + passiveExperienceDelay
end)

View File

@@ -0,0 +1,76 @@
---@return Barotrauma.Location.StoreInfo[], string?
local function getCurrentStore()
if not Game or not Game.GameSession or not Game.GameSession.Campaign then
return nil, "No game session found"
end
local map = Game.GameSession.Campaign.Map
if not map or not map.CurrentLocation or not map.CurrentLocation.Stores then
return nil, "No map found"
end
local location = map.CurrentLocation
-- Otherwise, determine which store is active by checking the cargo manager
local cargoManager = Game.GameSession.Campaign.CargoManager
if not cargoManager then
return nil, "No cargo manager found"
end
-- Find which store has items in the cart
local stores = {}
for _, store in pairs(location.Stores) do
if #cargoManager:GetBuyCrateItems(store) > 0 then
stores[#stores + 1] = store
end
end
return stores, nil
end
-- Example: Add a key binding to buy all items in the current store
-- when the 'B' key is pressed
Hook.Patch("Barotrauma.Character", "ControlLocalPlayer", function(instance, ptable)
if not PlayerInput.KeyHit(MyModGlobal.CONFIG.MAX_BUY) then return end
local cargoManager = Game.GameSession.Campaign.CargoManager
if not cargoManager then
MyModGlobal.debugPrint("No cargo manager available")
return
end
local stores, err = getCurrentStore()
if err then
MyModGlobal.debugPrint(string.format("Error getting current store: %s", err))
return
end
for _, store in ipairs(stores) do
local toAdd = {}
-- Get items available at the store
local items = cargoManager:GetBuyCrateItems(store)
for item in items do
-- We have already added this many of item
toAdd[item.ItemPrefab.Identifier.Value] = {
quantity = -item.Quantity,
prefab = item.ItemPrefab -- Store the ItemPrefab object
}
end
for item in store.Stock do
-- So if we add the total amount available
-- We get the amount we have to add to buy entire stock
local idValue = item.ItemPrefab.Identifier.Value
if toAdd[idValue] then
toAdd[idValue].quantity = toAdd[idValue].quantity + item.Quantity
end
end
for idValue, info in pairs(toAdd) do
if info.quantity > 0 then
MyModGlobal.debugPrint(string.format("Adding %d of %s to the buy crate", info.quantity, idValue))
-- Use the stored ItemPrefab object, not the string identifier
cargoManager:ModifyItemQuantityInBuyCrate(store.Identifier, info.prefab, info.quantity)
end
end
end
end, Hook.HookMethodType.After)

View File

@@ -0,0 +1,15 @@
local amountExperience = 600
local passiveExperienceDelay = 2
local passiveExperienceTimer = 0
Hook.Add("think", "examples.passiveExperience", function()
if Timer.GetTime() < passiveExperienceTimer then return end
for k, v in pairs(Character.CharacterList) do
if not v.IsDead and v.Info ~= nil then
v.Info.GiveExperience(amountExperience)
end
end
passiveExperienceTimer = Timer.GetTime() + passiveExperienceDelay
end)