Files
BarotraumaModServer/LocalMods/Neurotrauma/Lua/Scripts/Client/dynamicitems.lua
2026-06-09 00:42:10 +03:00

115 lines
4.0 KiBLFS
Lua
Executable File

local _Int32 = LuaUserData.RegisterType("System.Int32")
-- Stack specific items together; if you want only the left leg to be cheaper than a right one go fuck yourself
local ItemVariants = {
antibloodloss2 = "NT_ItemPrice_bloodpacks",
bloodpackoplus = "NT_ItemPrice_bloodpacks",
bloodpackaminus = "NT_ItemPrice_bloodpacks",
bloodpackaplus = "NT_ItemPrice_bloodpacks",
bloodpackbminus = "NT_ItemPrice_bloodpacks",
bloodpackbplus = "NT_ItemPrice_bloodpacks",
bloodpackabminus = "NT_ItemPrice_bloodpacks",
bloodpackabplus = "NT_ItemPrice_bloodpacks",
rarm = "NT_ItemPrice_arms",
larm = "NT_ItemPrice_arms",
rleg = "NT_ItemPrice_legs",
lleg = "NT_ItemPrice_legs",
rarmp = "NT_ItemPrice_bionicarms",
larmp = "NT_ItemPrice_bionicarms",
rlegp = "NT_ItemPrice_bioniclegs",
llegp = "NT_ItemPrice_bioniclegs",
}
-- Fetch config multipliers
local function GetItemMultiplier(identifier)
if identifier == nil then return 1.0 end
-- Add grouping so blood bags don't fucking kill me
local configKey = ItemVariants[identifier] or ("NT_ItemPrice_" .. identifier)
if NTConfig.Entries[configKey] == nil then return 1.0 end
local value = NTConfig.Get(configKey, 1.0)
return tonumber(value) or 1.0
end
-- PRICE CHANGING
-- Hook into the price-determining function and add a multiplier
Hook.Patch("Barotrauma.Location+StoreInfo", "GetAdjustedItemBuyPrice", function(instance, ptable)
local item = ptable["item"]
if item == nil or item.Identifier == nil then return end
local id = item.Identifier.Value
local mult = GetItemMultiplier(id)
-- Don't do extra math if the item value is unchanged
if mult == 1.0 then return end
-- Get the 'actual price' after the game is done with it's calculations
local base = ptable.OriginalReturnValue
if base == nil then return end
-- Apply config-determined multiplier
local result = math.floor(base * mult + 0.5)
ptable.ReturnValue = LuaUserData.CreateUserDataFromDescriptor(result, _Int32)
end, Hook.HookMethodType.After)
-- FABRICATOR CHANGES
-- You cannot fabricate the item; this is accomplished by taking the Filter that gets made whenever you open a fabricator, and hiding the specific item IDs we want to hide.
local fabricatorType = LuaUserData.RegisterType("Barotrauma.Items.Components.Fabricator")
LuaUserData.MakeFieldAccessible(fabricatorType, "itemList")
Hook.Patch("Barotrauma.Items.Components.Fabricator", "FilterEntities", function(instance, ptable)
Timer.Wait(function()
local blockedItems = HF.DynamicUnavailableItems()
for child in instance.itemList.Content.Children do
local recipe = child.UserData
if recipe and LuaUserData.IsTargetType(recipe, "Barotrauma.FabricationRecipe") then
local id = recipe.TargetItem.Identifier.Value
if blockedItems[id] then child.Visible = false end
end
end
end, 1)
end, Hook.HookMethodType.After)
-- STORE CHANGES
-- You cannot buy the item; we simply hook into store availability and hide the item.
-- Ensure the items CANNOT be specials.
local storeType = LuaUserData.RegisterType("Barotrauma.Store")
LuaUserData.MakeFieldAccessible(storeType, "storeBuyList")
LuaUserData.MakeFieldAccessible(storeType, "storeDailySpecialsGroup")
Hook.Patch("Barotrauma.Store", "FilterStoreItems", {
"Barotrauma.MapEntityCategory",
"System.String",
}, function(instance, ptable)
Timer.Wait(function()
-- Fetch items to hide
local blockedItems = HF.DynamicUnavailableItems()
local storeList = instance.storeBuyList
if storeList then
for child in storeList.Content.Children do
local item = child.UserData
if item and item.ItemPrefab then
local id = item.ItemPrefab.Identifier.Value
-- Hide items within the table every refresh
if blockedItems[id] then child.Visible = false end
end
end
end
end, 10)
end, Hook.HookMethodType.After)
-- Force config sync on level swap to ensure things go properly
Hook.Add("roundStart", "forcesyncconfig", function()
if Game.IsMultiplayer then
local msg = Networking.Start("NT.ConfigRequest")
Networking.Send(msg)
end
end)