mirror of
https://github.com/ShadMOrdre/lib_materials.git
synced 2025-12-22 15:35:50 +01:00
Add files via upload
This commit is contained in:
211
lib_materials_vessels.lua
Normal file
211
lib_materials_vessels.lua
Normal file
@@ -0,0 +1,211 @@
|
||||
|
||||
lib_materials.vessels = {}
|
||||
local S = lib_materials.intllib
|
||||
|
||||
|
||||
local function get_itemdef_field(nodename, fieldname)
|
||||
if not minetest.registered_items[nodename] then
|
||||
return nil
|
||||
end
|
||||
return minetest.registered_items[nodename][fieldname]
|
||||
end
|
||||
|
||||
function lib_materials.fluid_short(str)
|
||||
return string.lower(str):gsub("%s", "_")
|
||||
end
|
||||
|
||||
function lib_materials.vessels.get_is_vessel(stack)
|
||||
return minetest.get_item_group(stack:get_name(), "vessel") > 0
|
||||
end
|
||||
|
||||
function lib_materials.vessels.get_is_empty_vessel(stack)
|
||||
return minetest.get_item_group(stack:get_name(), "vessel_blank") > 0
|
||||
end
|
||||
|
||||
function lib_materials.vessels.get_vessel_contents(stack)
|
||||
if not lib_materials.vessels.get_is_vessel(stack) then return nil end
|
||||
local fcapacity = get_itemdef_field(stack:get_name(), "_vessel_capacity")
|
||||
local ffluid = get_itemdef_field(stack:get_name(), "_vessel_source")
|
||||
|
||||
local meta = stack:get_meta()
|
||||
local contents = meta:get_int("contents")
|
||||
if not contents then
|
||||
contents = 0
|
||||
end
|
||||
|
||||
return contents, ffluid, fcapacity
|
||||
end
|
||||
|
||||
local function update_vessel(stack)
|
||||
local def_desc = get_itemdef_field(stack:get_name(), "description")
|
||||
local meta = stack:get_meta()
|
||||
local contents, fluid_name, capacity = lib_materials.vessels.get_vessel_contents(stack)
|
||||
|
||||
meta:set_string("description", def_desc.."\nContains "..contents.."/"..capacity.." mB")
|
||||
|
||||
return stack
|
||||
end
|
||||
|
||||
function lib_materials.vessels.add_fluid(stack, source_name, amount)
|
||||
if not lib_materials.vessels.get_is_vessel(stack) then return nil end
|
||||
local source_node = minetest.registered_nodes[source_name]
|
||||
local fluid = fluid_lib.cleanse_node_description(source_name)
|
||||
local internal = lib_materials.fluid_short(fluid)
|
||||
local vesselname = stack:get_name()
|
||||
|
||||
if minetest.get_item_group(vesselname, "vessel_blank") > 0 then
|
||||
stack = ItemStack(vesselname.."_"..internal)
|
||||
end
|
||||
|
||||
local meta = stack:get_meta()
|
||||
local contents, fluid_name, capacity = lib_materials.vessels.get_vessel_contents(stack)
|
||||
|
||||
local remainder = 0
|
||||
|
||||
if contents + amount > capacity then
|
||||
remainder = (contents + amount) - capacity
|
||||
contents = capacity
|
||||
else
|
||||
contents = contents + amount
|
||||
end
|
||||
|
||||
meta:set_int("contents", contents)
|
||||
stack = update_vessel(stack)
|
||||
|
||||
return stack, remainder
|
||||
end
|
||||
|
||||
function lib_materials.vessels.take_fluid(stack, amount)
|
||||
if not lib_materials.vessels.get_is_vessel(stack) then return nil end
|
||||
|
||||
local meta = stack:get_meta()
|
||||
local contents, fluid_name, capacity = lib_materials.vessels.get_vessel_contents(stack)
|
||||
local blank = get_itemdef_field(stack:get_name(), "_vessel_blank")
|
||||
|
||||
local leftover = 0
|
||||
if contents - amount < 0 then
|
||||
leftover = (contents - amount) * -1
|
||||
contents = 0
|
||||
else
|
||||
contents = contents - amount
|
||||
end
|
||||
|
||||
if contents == 0 then
|
||||
stack = ItemStack(blank)
|
||||
else
|
||||
meta:set_int("contents", contents)
|
||||
stack = update_vessel(stack)
|
||||
end
|
||||
|
||||
return stack, leftover
|
||||
end
|
||||
|
||||
local function register_vesselfluid(data)
|
||||
|
||||
local source_node = minetest.registered_nodes[data.source_name]
|
||||
local fluid = fluid_lib.cleanse_node_description(data.source_name)
|
||||
local internal = lib_materials.fluid_short(fluid)
|
||||
|
||||
local itemname = data.mod_name..":"..data.vessel_name.."_"..internal
|
||||
|
||||
if minetest.registered_items[itemname] then
|
||||
return
|
||||
end
|
||||
|
||||
local stationary_name
|
||||
--local stationary_name = source_node.tiles[1].name:gsub("_source_animated", "")
|
||||
if string.find(source_node.tiles[1].name, "_animated") then
|
||||
stationary_name = source_node.tiles[1].name:gsub("_animated", "")
|
||||
else
|
||||
stationary_name = source_node.tiles[1].name
|
||||
end
|
||||
|
||||
-- Register base item
|
||||
minetest.register_craftitem(itemname, {
|
||||
description = data.vessel_description.." ("..fluid..")",
|
||||
inventory_image = stationary_name.."^[noalpha^"..data.textures[1].."^"..data.textures[2].."^[makealpha:255,0,0,",
|
||||
_vessel_capacity = data.capacity,
|
||||
_vessel_source = data.source_name,
|
||||
_vessel_blank = data.mod_name..":"..data.vessel_name,
|
||||
stack_max = 1,
|
||||
groups = {vessel = 1, not_in_creative_inventory = 1},
|
||||
})
|
||||
end
|
||||
|
||||
function lib_materials.vessels.register_vessel(data)
|
||||
local mod_name = data.mod_name or minetest.get_current_modname()
|
||||
local vessel_name = data.vessel_name or 'vessel'
|
||||
local vessel_desc = data.vessel_description or 'vessel'
|
||||
local textures = data.textures or {"lib_materials_vessel_glass_bottle.png", "lib_materials_vessel_glass_bottle_mask.png"}
|
||||
local capacity = data.capacity or 1000
|
||||
local item_name = mod_name..":"..vessel_name
|
||||
|
||||
if not minetest.registered_items[item_name] then
|
||||
-- Register base item
|
||||
minetest.register_craftitem(item_name, {
|
||||
description = vessel_desc.." (Empty)\nThis item holds millibuckets of fluid.",
|
||||
inventory_image = textures[1].."^"..textures[2].."^[makealpha:255,0,0,", --inventory_image = textures[1].."^[noalpha^"..textures[2].."^[makealpha:255,0,0,",
|
||||
_vessel_capacity = capacity,
|
||||
_vessel_source = nil,
|
||||
stack_max = 1,
|
||||
groups = {vessel = 1, vessel_blank = 1}
|
||||
})
|
||||
end
|
||||
|
||||
-- Register for all fluids
|
||||
if data.fluids then
|
||||
-- This tank only uses certain fluids
|
||||
for _, v in pairs(data.fluids) do
|
||||
register_vesselfluid({
|
||||
mod_name = mod_name,
|
||||
vessel_name = vessel_name,
|
||||
vessel_description = vessel_desc,
|
||||
textures = textures,
|
||||
capacity = capacity,
|
||||
source_name = v
|
||||
})
|
||||
end
|
||||
else
|
||||
-- Get all fluids and buckets and cache them
|
||||
for i, v in pairs(lib_materials.liquids) do
|
||||
if (i:find("source") ~= nil) then
|
||||
-- Add tank
|
||||
register_vesselfluid({
|
||||
mod_name = mod_name,
|
||||
vessel_name = vessel_name,
|
||||
vessel_description = vessel_desc,
|
||||
textures = textures,
|
||||
capacity = capacity,
|
||||
source_name = v["source"]
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
-- Register florbs for all fluids
|
||||
lib_materials.vessels.register_vessel({
|
||||
vessel_name = "vessel_glass_bottle",
|
||||
vessel_description = "Glass Bottle Vessel",
|
||||
capacity = 1000,
|
||||
tiles = {"lib_materials_vessel_glass_bottle.png", "lib_materials_vessel_glass_bottle_mask.png"}
|
||||
})
|
||||
|
||||
|
||||
|
||||
fluidity = {}
|
||||
fluidity.fluid_short = lib_materials.fluid_short
|
||||
|
||||
fluidity.florbs = {}
|
||||
fluidity.florbs.get_is_vessel = lib_materials.vessels.get_is_vessel
|
||||
fluidity.florbs.get_is_empty_vessel = lib_materials.vessels.get_is_empty_vessel
|
||||
fluidity.florbs.get_vessel_contents = lib_materials.vessels.get_vessel_contents
|
||||
fluidity.florbs.add_fluid = lib_materials.vessels.add_fluid
|
||||
fluidity.florbs.take_fluid = lib_materials.vessels.take_fluid
|
||||
fluidity.florbs.register_vessel = lib_materials.vessels.register_vessel
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user