forked from mad-star-studio/Voxelis
111 lines
3.2 KiB
Lua
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
|