Divergent/mods/Hideout Furniture/gamedata/scripts/stash_capacities.script

113 lines
3.4 KiB
Plaintext
Raw Normal View History

2024-03-17 20:18:03 -04:00
local function pr(...)
local debug = false
if debug then
printf("stash_capacities: " .. ...)
end
end
local stash_sections = {["inv_backpack"] = true, ["inventory_box"] = true}
local function itr_for_stashes(section)
pr("SECTION: " .. section)
local placeable_type = ini_sys:r_string_ex(section, "placeable_type") or "prop"
if placeable_type == "stash" then
stash_sections[section] = true
end
end
ini_sys:section_for_each(itr_for_stashes)
local weight_add = 0 -- used when moving items into a stash
local function getInvWeight(stash_id)
local stash = get_object_by_id(stash_id)
local weight = 0
stash:iterate_inventory_box( function(owner,itm)
weight = weight + itm:weight()
end)
return weight
end
-- Update Max Capacity of stash inventories
inventory_update = ui_inventory.UIInventory.UpdateWeight
function ui_inventory.UIInventory:UpdateWeight()
inventory_update(self)
local stash = self:GetPartner()
if not stash then return end
local section = stash:section()
pr("STASH SECTION: " .. section)
if not stash_sections[section] then return end
local capacity = ini_sys:r_float_ex(section,"capacity") or 30
pr("CAPACITY: " .. capacity)
self.npc_weight_max:SetText( strformat("(max %s %s)", capacity, game.translate_string("st_kg")) )
end
-- Make Max Capacity text visible for stashes
inventory_reset = ui_inventory.UIInventory.Reset
function ui_inventory.UIInventory:Reset(obj)
inventory_reset(self, obj)
if self:GetPartner() then
self.npc_weight_max:Show( (self.npc_is_companion and self.mode == "loot") or stash_sections[self:GetPartner():section()])
end
end
-- Make sure each item in Move_all
function ui_inventory.UIInventory:Action_Move_All(obj, bag)
obj = self:CheckItem(obj,"Action_Move_All")
pr("check if i override")
local ci = self.CC[bag]:GetCell_ID(obj:id())
for id,_ in pairs(ci.childs) do
if self:Cond_Move(id, bag) then
pr("UNO")
if id and bag then
self:Action_Move(id, bag)
if self:CheckItem(id):weight() then
weight_add = weight_add + self:CheckItem(id):weight()
else
weight_add = weight_add
end
end
else
pr("Would normally move, but COND_MOVE says no.")
end
end
if self:Cond_Move(obj, bag) then
pr("DUO")
self:Action_Move(obj, bag)
weight_add = weight_add + self:CheckItem(obj):weight()
else
pr("Would normally move, but COND_MOVE says no.")
end
weight_add = 0
end
local function actor_on_item_before_move(flags, npc_id, obj, mode, bag_from)
if (bag_from ~= EDDListType.iActorBag) then return end
if not obj then return end
if not npc_id then
pr("no npc id?")
return
end
if not get_object_by_id(npc_id) then
pr("cant get obejct?")
return
end
local section = get_object_by_id(npc_id):section()
pr("section: " .. section)
if not stash_sections[section] then return end
local capacity = ini_sys:r_float_ex(section,"capacity") or 30
local weight = getInvWeight(npc_id) + weight_add
pr("Weight: " .. weight)
if weight + obj:weight() > capacity then
flags.ret_value = false
pr("Cannot place object: Stash is too full. Capacity: " .. capacity)
end
end
function on_game_start()
RegisterScriptCallback("ActorMenu_on_item_before_move", actor_on_item_before_move)
end