Voxelis/mods/ITEMS/vox_structural/init.lua
DesertMermaid 1708e2d461
All checks were successful
Error Check / luacheck_errcheck (push) Successful in 43s
Unit Tests / busted_unit_test (push) Successful in 49s
Last night's work
2024-12-12 12:35:15 -08:00

111 lines
3.2 KiB
Lua

-- Vox Structural System
vox_structural = {} -- Initialize the global table for the mod
local structural_shapes = {}
-- Register a new structural shape
function vox_structural.register_shape(shape_name, shape_def)
structural_shapes[shape_name] = shape_def
end
-- Register a block with structural shapes
function vox_structural.register_block_with_shapes(modname, base_block, options)
for shape_name, shape_def in pairs(structural_shapes) do
local base_node_name = modname .. ":" .. base_block
local shape_node_name = modname .. ":" .. base_block .. "_" .. shape_name
-- Create the new node definition
local base_def = minetest.registered_nodes[base_node_name]
if not base_def then
minetest.log("error", "[vox_structural] Base node not found: " .. base_node_name)
return
end
local new_node_def = table.copy(base_def)
new_node_def.description = base_def.description .. " (" .. shape_name:gsub("_", " ") .. ")"
new_node_def.tiles = shape_def.tiles or base_def.tiles
new_node_def.groups = table.copy(base_def.groups or {})
new_node_def.groups.shape = 1 -- Add a "shape" group
-- Apply shape-specific overrides
if shape_def.override then
for key, value in pairs(shape_def.override) do
new_node_def[key] = value
end
end
-- Register the new node
minetest.register_node(shape_node_name, new_node_def)
end
end
-- ---------------------------- Basic Shapes -------------------------- --
-- Slab
vox_structural.register_shape("slab", {
tiles = nil, -- Inherit tiles from the base block
override = {
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
},
},
})
-- Stairs
vox_structural.register_shape("stairs", {
tiles = nil,
override = {
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
{-0.5, 0, -0.5, 0.5, 0.5, 0},
},
},
},
})
-- ---------------------------- Functional -------------------------- --
-- Pressure Plate
vox_structural.register_shape("pressure_plate", {
tiles = nil,
override = {
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, -0.4375, 0.5},
},
},
},
})
-- ---------------------------- Doors and Variants -------------------------- --
vox_structural.register_shape("door_flush", {
override = {
drawtype = "mesh",
mesh = "door_flush.obj",
},
})
vox_structural.register_shape("door_half_window", {
override = {
drawtype = "mesh",
mesh = "door_half_window.obj",
},
})
-- Add mix-and-match for window materials
local window_variants = {"glass", "colored_glass", "paper", "colored_paper"}
for _, material in ipairs(window_variants) do
vox_structural.register_shape("door_half_window_" .. material, {
override = {
drawtype = "mesh",
mesh = "door_half_window.obj",
tiles = {"window_" .. material .. ".png"},
},
})
end