Namespacing pt. 1

This commit is contained in:
2022-11-22 00:44:34 -05:00
parent 750d6abc26
commit 293822f2a9
763 changed files with 0 additions and 0 deletions

View File

@@ -0,0 +1,267 @@
local cauldron, sounds = {}, {}
local S = minetest.get_translator("xdecor")
-- Add more ingredients here that make a soup.
local ingredients_list = {
"apple", "mushroom", "honey", "pumpkin", "egg", "bread", "meat",
"chicken", "carrot", "potato", "melon", "rhubarb", "cucumber",
"corn", "beans", "berries", "grapes", "tomato", "wheat"
}
cauldron.cbox = {
{0, 0, 0, 16, 16, 0},
{0, 0, 16, 16, 16, 0},
{0, 0, 0, 0, 16, 16},
{16, 0, 0, 0, 16, 16},
{0, 0, 0, 16, 8, 16}
}
function cauldron.stop_sound(pos)
local spos = minetest.hash_node_position(pos)
if sounds[spos] then
minetest.sound_stop(sounds[spos])
end
end
function cauldron.idle_construct(pos)
local timer = minetest.get_node_timer(pos)
timer:start(10.0)
cauldron.stop_sound(pos)
end
function cauldron.boiling_construct(pos)
local spos = minetest.hash_node_position(pos)
sounds[spos] = minetest.sound_play("xdecor_boiling_water", {
pos = pos,
max_hear_distance = 5,
gain = 0.8,
loop = true
})
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Cauldron (active) - Drop foods inside to make a soup"))
local timer = minetest.get_node_timer(pos)
timer:start(5.0)
end
function cauldron.filling(pos, node, clicker, itemstack)
local inv = clicker:get_inventory()
local wield_item = clicker:get_wielded_item():get_name()
if wield_item:sub(1,7) == "bucket:" then
if wield_item:sub(-6) == "_empty" and not (node.name:sub(-6) == "_empty") then
if itemstack:get_count() > 1 then
if inv:room_for_item("main", "bucket:bucket_water 1") then
itemstack:take_item()
inv:add_item("main", "bucket:bucket_water 1")
else
minetest.chat_send_player(clicker:get_player_name(),
S("No room in your inventory to add a bucket of water."))
return itemstack
end
else
itemstack:replace("bucket:bucket_water")
end
minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2})
elseif wield_item:sub(-6) == "_water" and node.name:sub(-6) == "_empty" then
minetest.set_node(pos, {name = "xdecor:cauldron_idle", param2 = node.param2})
itemstack:replace("bucket:bucket_empty")
end
return itemstack
end
end
function cauldron.idle_timer(pos)
local below_node = {x = pos.x, y = pos.y - 1, z = pos.z}
if not minetest.get_node(below_node).name:find("fire") then
return true
end
local node = minetest.get_node(pos)
minetest.set_node(pos, {name = "xdecor:cauldron_boiling", param2 = node.param2})
return true
end
-- Ugly hack to determine if an item has the function `minetest.item_eat` in its definition.
local function eatable(itemstring)
local item = itemstring:match("[%w_:]+")
local on_use_def = minetest.registered_items[item].on_use
if not on_use_def then return end
return string.format("%q", string.dump(on_use_def)):find("item_eat")
end
function cauldron.boiling_timer(pos)
local node = minetest.get_node(pos)
local objs = minetest.get_objects_inside_radius(pos, 0.5)
if not next(objs) then
return true
end
local ingredients = {}
for _, obj in pairs(objs) do
if obj and not obj:is_player() and obj:get_luaentity().itemstring then
local itemstring = obj:get_luaentity().itemstring
local food = itemstring:match(":([%w_]+)")
for _, ingredient in ipairs(ingredients_list) do
if food and (eatable(itemstring) or food:find(ingredient)) then
ingredients[#ingredients + 1] = food
break
end
end
end
end
if #ingredients >= 2 then
for _, obj in pairs(objs) do
obj:remove()
end
minetest.set_node(pos, {name = "xdecor:cauldron_soup", param2 = node.param2})
end
local node_under = {x = pos.x, y = pos.y - 1, z = pos.z}
if not minetest.get_node(node_under).name:find("fire") then
minetest.set_node(pos, {name = "xdecor:cauldron_idle", param2 = node.param2})
end
return true
end
function cauldron.take_soup(pos, node, clicker, itemstack)
local inv = clicker:get_inventory()
local wield_item = clicker:get_wielded_item()
local item_name = wield_item:get_name()
if item_name == "xdecor:bowl" or item_name == "farming:bowl" then
if wield_item:get_count() > 1 then
if inv:room_for_item("main", "xdecor:bowl_soup 1") then
itemstack:take_item()
inv:add_item("main", "xdecor:bowl_soup 1")
else
minetest.chat_send_player(clicker:get_player_name(),
S("No room in your inventory to add a bowl of soup."))
return itemstack
end
else
itemstack:replace("xdecor:bowl_soup 1")
end
minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2})
end
return itemstack
end
xdecor.register("cauldron_empty", {
description = S("Cauldron"),
groups = {cracky=2, oddly_breakable_by_hand=1},
on_rotate = screwdriver.rotate_simple,
tiles = {"xdecor_cauldron_top_empty.png", "xdecor_cauldron_sides.png"},
infotext = S("Cauldron (empty)"),
collision_box = xdecor.pixelbox(16, cauldron.cbox),
on_rightclick = cauldron.filling,
on_construct = function(pos)
cauldron.stop_sound(pos)
end,
})
xdecor.register("cauldron_idle", {
description = S("Cauldron (idle)"),
groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1},
on_rotate = screwdriver.rotate_simple,
tiles = {"xdecor_cauldron_top_idle.png", "xdecor_cauldron_sides.png"},
drop = "xdecor:cauldron_empty",
infotext = S("Cauldron (idle)"),
collision_box = xdecor.pixelbox(16, cauldron.cbox),
on_rightclick = cauldron.filling,
on_construct = cauldron.idle_construct,
on_timer = cauldron.idle_timer,
})
xdecor.register("cauldron_boiling", {
description = S("Cauldron (active)"),
groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1},
on_rotate = screwdriver.rotate_simple,
drop = "xdecor:cauldron_empty",
infotext = S("Cauldron (active) - Drop foods inside to make a soup"),
damage_per_second = 2,
tiles = {
{
name = "xdecor_cauldron_top_anim_boiling_water.png",
animation = {type = "vertical_frames", length = 3.0}
},
"xdecor_cauldron_sides.png"
},
collision_box = xdecor.pixelbox(16, cauldron.cbox),
on_rightclick = cauldron.filling,
on_construct = cauldron.boiling_construct,
on_timer = cauldron.boiling_timer,
on_destruct = function(pos)
cauldron.stop_sound(pos)
end,
})
xdecor.register("cauldron_soup", {
description = S("Cauldron (active)"),
groups = {cracky = 2, oddly_breakable_by_hand = 1, not_in_creative_inventory = 1},
on_rotate = screwdriver.rotate_simple,
drop = "xdecor:cauldron_empty",
infotext = S("Cauldron (active) - Use a bowl to eat the soup"),
damage_per_second = 2,
tiles = {
{
name = "xdecor_cauldron_top_anim_soup.png",
animation = {type = "vertical_frames", length = 3.0}
},
"xdecor_cauldron_sides.png"
},
collision_box = xdecor.pixelbox(16, cauldron.cbox),
on_rightclick = cauldron.take_soup,
on_destruct = function(pos)
cauldron.stop_sound(pos)
end,
})
-- Craft items
minetest.register_craftitem("xdecor:bowl", {
description = S("Bowl"),
inventory_image = "xdecor_bowl.png",
wield_image = "xdecor_bowl.png",
groups = {food_bowl = 1, flammable = 2},
})
minetest.register_craftitem("xdecor:bowl_soup", {
description = S("Bowl of soup"),
inventory_image = "xdecor_bowl_soup.png",
wield_image = "xdecor_bowl_soup.png",
groups = {not_in_creative_inventory=1},
stack_max = 1,
on_use = minetest.item_eat(30, "xdecor:bowl")
})
-- Recipes
minetest.register_craft({
output = "xdecor:bowl 3",
recipe = {
{"group:wood", "", "group:wood"},
{"", "group:wood", ""}
}
})
minetest.register_craft({
output = "xdecor:cauldron_empty",
recipe = {
{"default:iron_lump", "", "default:iron_lump"},
{"default:iron_lump", "", "default:iron_lump"},
{"default:iron_lump", "default:iron_lump", "default:iron_lump"}
}
})

View File

@@ -0,0 +1,336 @@
screwdriver = screwdriver or {}
local S = minetest.get_translator("xdecor")
local FS = function(...) return minetest.formspec_escape(S(...)) end
local ceil, abs, random = math.ceil, math.abs, math.random
local reg_tools = minetest.registered_tools
-- Cost in Mese crystal(s) for enchanting.
local mese_cost = 1
-- Force of the enchantments.
local enchanting = {
uses = 1.2, -- Durability
times = 0.1, -- Efficiency
damages = 1, -- Sharpness
}
local function cap(str) return
str:gsub("^%l", string.upper)
end
local function to_percent(orig_value, final_value)
return abs(ceil(((final_value - orig_value) / orig_value) * 100))
end
function enchanting:get_tooltip(enchant, orig_caps, fleshy)
local bonus = {durable = 0, efficiency = 0, damages = 0}
if orig_caps then
bonus.durable = to_percent(orig_caps.uses, orig_caps.uses * enchanting.uses)
local sum_caps_times = 0
for i=1, #orig_caps.times do
sum_caps_times = sum_caps_times + orig_caps.times[i]
end
local average_caps_time = sum_caps_times / #orig_caps.times
bonus.efficiency = to_percent(average_caps_time, average_caps_time -
enchanting.times)
end
if fleshy then
bonus.damages = to_percent(fleshy, fleshy + enchanting.damages)
end
local specs = { -- not finished, to complete
durable = {"#00baff", " (+" .. bonus.durable .. "%)"},
fast = {"#74ff49", " (+" .. bonus.efficiency .. "%)"},
sharp = {"#ffff00", " (+" .. bonus.damages .. "%)"},
}
local enchant_loc = {
fast = S("Efficiency"),
durable = S("Durability"),
sharp = S("Sharpness"),
}
return minetest.colorize and minetest.colorize(specs[enchant][1],
"\n" .. enchant_loc[enchant] .. specs[enchant][2]) or
"\n" .. enchant_loc[enchant] .. specs[enchant][2]
end
local enchant_buttons = {
"image_button[3.9,0.85;4,0.92;bg_btn.png;fast;"..FS("Efficiency").."]" ..
"image_button[3.9,1.77;4,1.12;bg_btn.png;durable;"..FS("Durability").."]",
"image_button[3.9,2.9;4,0.92;bg_btn.png;sharp;"..FS("Sharpness").."]",
}
function enchanting.formspec(pos, num)
local meta = minetest.get_meta(pos)
local formspec = [[
size[9,8.6;]
no_prepend[]
bgcolor[#080808BB;true]
listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]
background9[0,0;9,9;ench_ui.png;6]
list[context;tool;0.9,2.9;1,1;]
list[context;mese;2,2.9;1,1;]
list[current_player;main;0.55,4.5;8,4;]
listring[current_player;main]
listring[context;tool]
listring[current_player;main]
listring[context;mese]
image[2,2.9;1,1;mese_layout.png]
]]
.."tooltip[sharp;"..FS("Your weapon inflicts more damages").."]"
.."tooltip[durable;"..FS("Your tool last longer").."]"
.."tooltip[fast;"..FS("Your tool digs faster").."]"
..default.gui_slots .. default.get_hotbar_bg(0.55, 4.5)
formspec = formspec .. (enchant_buttons[num] or "")
meta:set_string("formspec", formspec)
end
function enchanting.on_put(pos, listname, _, stack)
if listname == "tool" then
local stackname = stack:get_name()
local tool_groups = {
"axe, pick, shovel",
"sword",
}
for idx, tools in ipairs(tool_groups) do
if tools:find(stackname:match(":(%w+)")) then
enchanting.formspec(pos, idx)
end
end
end
end
function enchanting.fields(pos, _, fields, sender)
if not next(fields) or fields.quit then return end
local inv = minetest.get_meta(pos):get_inventory()
local tool = inv:get_stack("tool", 1)
local mese = inv:get_stack("mese", 1)
local orig_wear = tool:get_wear()
local mod, name = tool:get_name():match("(.*):(.*)")
local enchanted_tool = (mod or "") .. ":enchanted_" .. (name or "") .. "_" .. next(fields)
if mese:get_count() >= mese_cost and reg_tools[enchanted_tool] then
minetest.sound_play("xdecor_enchanting", {
to_player = sender:get_player_name(),
gain = 0.8
})
tool:replace(enchanted_tool)
tool:add_wear(orig_wear)
mese:take_item(mese_cost)
inv:set_stack("mese", 1, mese)
inv:set_stack("tool", 1, tool)
end
end
function enchanting.dig(pos)
local inv = minetest.get_meta(pos):get_inventory()
return inv:is_empty("tool") and inv:is_empty("mese")
end
local function allowed(tool)
if not tool then return end
for item in pairs(reg_tools) do
if item:find("enchanted_" .. tool) then
return true
end
end
end
function enchanting.put(_, listname, _, stack)
local stackname = stack:get_name()
if listname == "mese" and (stackname == "default:mese_crystal" or
stackname == "imese:industrial_mese_crystal") then
return stack:get_count()
elseif listname == "tool" and allowed(stackname:match("[^:]+$")) then
return 1
end
return 0
end
function enchanting.on_take(pos, listname)
if listname == "tool" then
enchanting.formspec(pos)
end
end
function enchanting.construct(pos)
local meta = minetest.get_meta(pos)
meta:set_string("infotext", S("Enchantment Table"))
enchanting.formspec(pos)
local inv = meta:get_inventory()
inv:set_size("tool", 1)
inv:set_size("mese", 1)
minetest.add_entity({x = pos.x, y = pos.y + 0.85, z = pos.z}, "xdecor:book_open")
local timer = minetest.get_node_timer(pos)
timer:start(0.5)
end
function enchanting.destruct(pos)
for _, obj in pairs(minetest.get_objects_inside_radius(pos, 0.9)) do
if obj and obj:get_luaentity() and
obj:get_luaentity().name == "xdecor:book_open" then
obj:remove()
break
end
end
end
function enchanting.timer(pos)
local minp = {x = pos.x - 2, y = pos.y, z = pos.z - 2}
local maxp = {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2}
local bookshelves = minetest.find_nodes_in_area(minp, maxp, "default:bookshelf")
if #bookshelves == 0 then
return true
end
local bookshelf_pos = bookshelves[random(1, #bookshelves)]
local x = pos.x - bookshelf_pos.x
local y = bookshelf_pos.y - pos.y
local z = pos.z - bookshelf_pos.z
if tostring(x .. z):find(2) then
minetest.add_particle({
pos = bookshelf_pos,
velocity = {x = x, y = 2 - y, z = z},
acceleration = {x = 0, y = -2.2, z = 0},
expirationtime = 1,
size = 1.5,
glow = 5,
texture = "xdecor_glyph" .. random(1,18) .. ".png"
})
end
return true
end
xdecor.register("enchantment_table", {
description = S("Enchantment Table"),
tiles = {
"xdecor_enchantment_top.png", "xdecor_enchantment_bottom.png",
"xdecor_enchantment_side.png", "xdecor_enchantment_side.png",
"xdecor_enchantment_side.png", "xdecor_enchantment_side.png"
},
groups = {cracky = 1, level = 1},
light_source = 6,
sounds = default.node_sound_stone_defaults(),
on_rotate = screwdriver.rotate_simple,
can_dig = enchanting.dig,
on_timer = enchanting.timer,
on_construct = enchanting.construct,
on_destruct = enchanting.destruct,
on_receive_fields = enchanting.fields,
on_metadata_inventory_put = enchanting.on_put,
on_metadata_inventory_take = enchanting.on_take,
allow_metadata_inventory_put = enchanting.put,
allow_metadata_inventory_move = function()
return 0
end,
})
minetest.register_entity("xdecor:book_open", {
visual = "sprite",
visual_size = {x=0.75, y=0.75},
collisionbox = {0},
physical = false,
textures = {"xdecor_book_open.png"},
static_save = false,
})
minetest.register_lbm({
label = "recreate book entity",
name = "xdecor:create_book_entity",
nodenames = {"xdecor:enchantment_table"},
run_at_every_load = true,
action = function(pos, node)
local objs = minetest.get_objects_inside_radius(pos, 0.9)
for _, obj in ipairs(objs) do
local e = obj:get_luaentity()
if e and e.name == "xdecor:book_open" then
return
end
end
minetest.add_entity({x = pos.x, y = pos.y + 0.85, z = pos.z}, "xdecor:book_open")
end,
})
function enchanting:register_tools(mod, def)
for tool in pairs(def.tools) do
for material in def.materials:gmatch("[%w_]+") do
for enchant in def.tools[tool].enchants:gmatch("[%w_]+") do
local original_tool = reg_tools[mod .. ":" .. tool .. "_" .. material]
if not original_tool then break end
local original_toolcaps = original_tool.tool_capabilities
if original_toolcaps then
local original_damage_groups = original_toolcaps.damage_groups
local original_groupcaps = original_toolcaps.groupcaps
local groupcaps = table.copy(original_groupcaps)
local fleshy = original_damage_groups.fleshy
local full_punch_interval = original_toolcaps.full_punch_interval
local max_drop_level = original_toolcaps.max_drop_level
local group = next(original_groupcaps)
if enchant == "durable" then
groupcaps[group].uses = ceil(original_groupcaps[group].uses *
enchanting.uses)
elseif enchant == "fast" then
for i, time in pairs(original_groupcaps[group].times) do
groupcaps[group].times[i] = time - enchanting.times
end
elseif enchant == "sharp" then
fleshy = fleshy + enchanting.damages
end
minetest.register_tool(":" .. mod .. ":enchanted_" .. tool .. "_" .. material .. "_" .. enchant, {
description = S("Enchanted @1 @2 @3",
def.material_desc[material] or cap(material), def.tools[tool].desc or cap(tool),
self:get_tooltip(enchant, original_groupcaps[group], fleshy)),
inventory_image = original_tool.inventory_image .. "^[colorize:violet:50",
wield_image = original_tool.wield_image,
groups = {not_in_creative_inventory = 1},
tool_capabilities = {
groupcaps = groupcaps, damage_groups = {fleshy = fleshy},
full_punch_interval = full_punch_interval,
max_drop_level = max_drop_level
}
})
end
end
end
end
end
enchanting:register_tools("default", {
materials = "steel, bronze, mese, diamond",
material_desc = {steel = S("Steel"), bronze = S("Bronze"), mese = S("Mese"), diamond = S("Diamond")},
tools = {
axe = {enchants = "durable, fast", desc = S("Axe")},
pick = {enchants = "durable, fast", desc = S("Pickaxe")},
shovel = {enchants = "durable, fast", desc = S("Shovel")},
sword = {enchants = "sharp", desc = S("Sword")}
},
})
-- Recipes
minetest.register_craft({
output = "xdecor:enchantment_table",
recipe = {
{"", "default:book", ""},
{"default:diamond", "default:obsidian", "default:diamond"},
{"default:obsidian", "default:obsidian", "default:obsidian"}
}
})

108
mods/ip_xdecor/src/hive.lua Normal file
View File

@@ -0,0 +1,108 @@
local hive = {}
local S = minetest.get_translator("xdecor")
local FS = function(...) return minetest.formspec_escape(S(...)) end
local honey_max = 16
function hive.construct(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local formspec = "size[8,6;]"
.."label[0.5,0;"..FS("Bees are busy making honey…").."]"
..[[ image[6,1;1,1;hive_bee.png]
image[5,1;1,1;hive_layout.png]
list[context;honey;5,1;1,1;]
list[current_player;main;0,2.35;8,4;]
listring[current_player;main]
listring[context;honey] ]] ..
xbg .. default.get_hotbar_bg(0,2.35)
meta:set_string("formspec", formspec)
meta:set_string("infotext", S("Artificial Hive"))
inv:set_size("honey", 1)
local timer = minetest.get_node_timer(pos)
timer:start(math.random(64, 128))
end
function hive.timer(pos)
local time = (minetest.get_timeofday() or 0) * 24000
if time < 5500 or time > 18500 then
return true
end
local inv = minetest.get_meta(pos):get_inventory()
local honeystack = inv:get_stack("honey", 1)
local honey = honeystack:get_count()
local radius = 4
local minp = vector.add(pos, -radius)
local maxp = vector.add(pos, radius)
local flowers = minetest.find_nodes_in_area_under_air(minp, maxp, "group:flower")
if #flowers > 2 and honey < honey_max then
inv:add_item("honey", "xdecor:honey")
elseif honey == honey_max then
local timer = minetest.get_node_timer(pos)
timer:stop()
return true
end
return true
end
xdecor.register("hive", {
description = S("Artificial Hive"),
tiles = {"xdecor_hive_top.png", "xdecor_hive_top.png",
"xdecor_hive_side.png", "xdecor_hive_side.png",
"xdecor_hive_side.png", "xdecor_hive_front.png"},
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=1},
on_construct = hive.construct,
on_timer = hive.timer,
can_dig = function(pos)
local inv = minetest.get_meta(pos):get_inventory()
return inv:is_empty("honey")
end,
on_punch = function(_, _, puncher)
puncher:set_hp(puncher:get_hp() - 2)
end,
allow_metadata_inventory_put = function()
return 0
end,
on_metadata_inventory_take = function(pos, _, _, stack)
if stack:get_count() == honey_max then
local timer = minetest.get_node_timer(pos)
timer:start(math.random(64, 128))
end
end
})
-- Craft items
minetest.register_craftitem("xdecor:honey", {
description = S("Honey"),
inventory_image = "xdecor_honey.png",
wield_image = "xdecor_honey.png",
on_use = minetest.item_eat(2),
groups = {
food_honey = 1,
food_sugar = 1,
flammable = 2,
not_in_creative_inventory = 1,
},
})
-- Recipes
minetest.register_craft({
output = "xdecor:hive",
recipe = {
{"group:stick", "group:stick", "group:stick"},
{"default:paper", "default:paper", "default:paper"},
{"group:stick", "group:stick", "group:stick"}
}
})

View File

@@ -0,0 +1,186 @@
local itemframe, tmp = {}, {}
local S = minetest.get_translator("xdecor")
screwdriver = screwdriver or {}
local function remove_item(pos, node)
local objs = minetest.get_objects_inside_radius(pos, 0.5)
if not objs then return end
for _, obj in pairs(objs) do
local ent = obj:get_luaentity()
if obj and ent and ent.name == "xdecor:f_item" then
obj:remove() break
end
end
end
local facedir = {
[0] = {x = 0, y = 0, z = 1},
{x = 1, y = 0, z = 0},
{x = 0, y = 0, z = -1},
{x = -1, y = 0, z = 0}
}
local function update_item(pos, node)
remove_item(pos, node)
local meta = minetest.get_meta(pos)
local itemstring = meta:get_string("item")
local posad = facedir[node.param2]
if not posad or itemstring == "" then return end
pos = vector.add(pos, vector.multiply(posad, 6.5/16))
tmp.nodename = node.name
tmp.texture = ItemStack(itemstring):get_name()
local entity = minetest.add_entity(pos, "xdecor:f_item")
local yaw = (math.pi * 2) - node.param2 * (math.pi / 2)
entity:set_yaw(yaw)
local timer = minetest.get_node_timer(pos)
timer:start(15.0)
end
local function drop_item(pos, node)
local meta = minetest.get_meta(pos)
local item = meta:get_string("item")
if item == "" then return end
minetest.add_item(pos, item)
meta:set_string("item", "")
remove_item(pos, node)
local timer = minetest.get_node_timer(pos)
timer:stop()
end
function itemframe.after_place(pos, placer, itemstack)
local meta = minetest.get_meta(pos)
local name = placer:get_player_name()
meta:set_string("owner", name)
meta:set_string("infotext", S("@1 (owned by @2)", S("Item Frame"), name))
end
function itemframe.timer(pos)
local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos)
local num = #minetest.get_objects_inside_radius(pos, 0.5)
if num == 0 and meta:get_string("item") ~= "" then
update_item(pos, node)
end
return true
end
function itemframe.rightclick(pos, node, clicker, itemstack)
local meta = minetest.get_meta(pos)
local player_name = clicker:get_player_name()
local owner = meta:get_string("owner")
local admin = minetest.check_player_privs(player_name, "protection_bypass")
if not admin and (player_name ~= owner or not itemstack) then
return itemstack
end
drop_item(pos, node)
local itemstring = itemstack:take_item():to_string()
meta:set_string("item", itemstring)
update_item(pos, node)
if itemstring == "" then
meta:set_string("infotext", S("@1 (owned by @2)", S("Item Frame"), owner))
else
meta:set_string("infotext", S("@1 (owned by @2)", itemstring, owner))
end
return itemstack
end
function itemframe.punch(pos, node, puncher)
local meta = minetest.get_meta(pos)
local player_name = puncher:get_player_name()
local owner = meta:get_string("owner")
local admin = minetest.check_player_privs(player_name, "protection_bypass")
if admin and player_name == owner then
drop_item(pos, node)
end
end
function itemframe.dig(pos, player)
if not player then return end
local meta = minetest.get_meta(pos)
local player_name = player and player:get_player_name()
local owner = meta:get_string("owner")
local admin = minetest.check_player_privs(player_name, "protection_bypass")
return admin or player_name == owner
end
xdecor.register("itemframe", {
description = S("Item Frame"),
groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
sounds = default.node_sound_wood_defaults(),
on_rotate = screwdriver.disallow,
sunlight_propagates = true,
inventory_image = "xdecor_itemframe.png",
node_box = xdecor.nodebox.slab_z(0.9375),
tiles = {
"xdecor_wood.png", "xdecor_wood.png", "xdecor_wood.png",
"xdecor_wood.png", "xdecor_wood.png", "xdecor_itemframe.png"
},
after_place_node = itemframe.after_place,
on_timer = itemframe.timer,
on_rightclick = itemframe.rightclick,
on_punch = itemframe.punch,
can_dig = itemframe.dig,
after_destruct = remove_item
})
minetest.register_entity("xdecor:f_item", {
visual = "wielditem",
visual_size = {x = 0.33, y = 0.33},
collisionbox = {0},
physical = false,
textures = {"air"},
on_activate = function(self, staticdata)
local pos = self.object:get_pos()
if minetest.get_node(pos).name ~= "xdecor:itemframe" then
self.object:remove()
end
if tmp.nodename and tmp.texture then
self.nodename = tmp.nodename
tmp.nodename = nil
self.texture = tmp.texture
tmp.texture = nil
elseif staticdata and staticdata ~= "" then
local data = staticdata:split(";")
if data and data[1] and data[2] then
self.nodename = data[1]
self.texture = data[2]
end
end
if self.texture then
self.object:set_properties({
textures = {self.texture}
})
end
end,
get_staticdata = function(self)
if self.nodename and self.texture then
return self.nodename .. ";" .. self.texture
end
return ""
end
})
-- Recipes
minetest.register_craft({
output = "xdecor:itemframe",
recipe = {
{"group:stick", "group:stick", "group:stick"},
{"group:stick", "default:paper", "group:stick"},
{"group:stick", "group:stick", "group:stick"}
}
})

View File

@@ -0,0 +1,192 @@
local mailbox = {}
screwdriver = screwdriver or {}
local S = minetest.get_translator("xdecor")
local FS = function(...) return minetest.formspec_escape(S(...)) end
local function get_img(img)
if not img then return end
local img_name = img:match("(.*)%.png")
if img_name then
return img_name .. ".png"
end
end
local function img_col(stack)
local def = minetest.registered_items[stack]
if not def then
return ""
end
if def.inventory_image ~= "" then
local img = get_img(def.inventory_image)
if img then
return img
end
end
if def.tiles then
local tile, img = def.tiles[1]
if type(tile) == "table" then
img = get_img(tile.name)
elseif type(tile) == "string" then
img = get_img(tile)
end
if img then
return img
end
end
return ""
end
function mailbox:formspec(pos, owner, is_owner)
local spos = pos.x .. "," .. pos.y .. "," .. pos.z
local meta = minetest.get_meta(pos)
local giver, img = "", ""
if is_owner then
for i = 1, 7 do
local giving = meta:get_string("giver" .. i)
if giving ~= "" then
local stack = meta:get_string("stack" .. i)
local giver_name = giving:sub(1,12)
local stack_name = stack:match("[%w_:]+")
local stack_count = stack:match("%s(%d+)") or 1
giver = giver .. "#FFFF00," .. giver_name .. "," .. i ..
",#FFFFFF,x " .. stack_count .. ","
img = img .. i .. "=" ..
img_col(stack_name) .. "^\\[resize:16x16,"
end
end
return "size[9.5,9]"
.."label[0,0;"..FS("Mailbox").."]"
.."label[6,0;"..FS("Last donators").."]"
..[[ box[6,0.72;3.3,3.5;#555555]
listring[current_player;main]
list[current_player;main;0.75,5.25;8,4;]
tableoptions[background=#00000000;highlight=#00000000;border=false] ]] ..
"tablecolumns[color;text;image," .. img .. "0;color;text]" ..
"table[6,0.75;3.3,4;givers;" .. giver .. "]" ..
"list[nodemeta:" .. spos .. ";mailbox;0,0.75;6,4;]" ..
"listring[nodemeta:" .. spos .. ";mailbox]" ..
xbg .. default.get_hotbar_bg(0.75, 5.25)
end
return "size[8,5]" ..
"list[current_player;main;0,1.25;8,4;]" ..
"label[0,0;"..FS("Send your goods to\n@1",
(minetest.colorize and
minetest.colorize("#FFFF00", owner) or owner)) .. "]" ..
"list[nodemeta:" .. spos .. ";drop;3.5,0;1,1;]" ..
xbg .. default.get_hotbar_bg(0, 1.25)
end
function mailbox.dig(pos, player)
local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner")
local player_name = player and player:get_player_name()
local inv = meta:get_inventory()
return inv:is_empty("mailbox") and player_name == owner
end
function mailbox.after_place_node(pos, placer)
local meta = minetest.get_meta(pos)
local player_name = placer:get_player_name()
meta:set_string("owner", player_name)
meta:set_string("infotext", S("@1's Mailbox", player_name))
local inv = meta:get_inventory()
inv:set_size("mailbox", 6 * 4)
inv:set_size("drop", 1)
end
function mailbox.rightclick(pos, node, clicker, itemstack, pointed_thing)
local meta = minetest.get_meta(pos)
local player = clicker:get_player_name()
local owner = meta:get_string("owner")
minetest.show_formspec(player, "xdecor:mailbox",
mailbox:formspec(pos, owner, (player == owner)))
return itemstack
end
function mailbox.put(pos, listname, _, stack, player)
if listname == "drop" then
local inv = minetest.get_meta(pos):get_inventory()
if inv:room_for_item("mailbox", stack) then
return -1
else
minetest.chat_send_player(player:get_player_name(),
S("The mailbox is full."))
end
end
return 0
end
function mailbox.on_put(pos, listname, _, stack, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
if listname == "drop" and inv:room_for_item("mailbox", stack) then
inv:set_list("drop", {})
inv:add_item("mailbox", stack)
for i = 7, 2, -1 do
meta:set_string("giver" .. i, meta:get_string("giver" .. (i - 1)))
meta:set_string("stack" .. i, meta:get_string("stack" .. (i - 1)))
end
meta:set_string("giver1", player:get_player_name())
meta:set_string("stack1", stack:to_string())
end
end
function mailbox.allow_take(pos, listname, index, stack, player)
local meta = minetest.get_meta(pos)
if player:get_player_name() ~= meta:get_string("owner") then
return 0
end
return stack:get_count()
end
function mailbox.allow_move(pos)
return 0
end
xdecor.register("mailbox", {
description = S("Mailbox"),
tiles = {"xdecor_mailbox_top.png", "xdecor_mailbox_bottom.png",
"xdecor_mailbox_side.png", "xdecor_mailbox_side.png",
"xdecor_mailbox.png", "xdecor_mailbox.png"},
groups = {cracky = 3, oddly_breakable_by_hand = 1},
on_rotate = screwdriver.rotate_simple,
can_dig = mailbox.dig,
on_rightclick = mailbox.rightclick,
allow_metadata_inventory_take = mailbox.allow_take,
allow_metadata_inventory_move = mailbox.allow_move,
on_metadata_inventory_put = mailbox.on_put,
allow_metadata_inventory_put = mailbox.put,
after_place_node = mailbox.after_place_node
})
-- Recipes
minetest.register_craft({
output = "xdecor:mailbox",
recipe = {
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
{"dye:red", "default:paper", "dye:red"},
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}
}
})

View File

@@ -0,0 +1,153 @@
-- Thanks to sofar for helping with that code.
local plate = {}
screwdriver = screwdriver or {}
local S = minetest.get_translator("xdecor")
local ALPHA_OPAQUE = minetest.features.use_texture_alpha_string_modes and "opaque" or false
local function door_toggle(pos_actuator, pos_door, player)
local player_name = player:get_player_name()
local actuator = minetest.get_node(pos_actuator)
local door = doors.get(pos_door)
if not door then return end
if actuator.name:sub(-4) == "_off" then
minetest.set_node(pos_actuator,
{name = actuator.name:gsub("_off", "_on"), param2 = actuator.param2})
end
door:open(player)
minetest.after(2, function()
if minetest.get_node(pos_actuator).name:sub(-3) == "_on" then
minetest.set_node(pos_actuator,
{name = actuator.name, param2 = actuator.param2})
end
-- Re-get player object (or nil) because 'player' could
-- be an invalid object at this time (player left)
door:close(minetest.get_player_by_name(player_name))
end)
end
function plate.construct(pos)
local timer = minetest.get_node_timer(pos)
timer:start(0.1)
end
function plate.timer(pos)
local objs = minetest.get_objects_inside_radius(pos, 0.8)
if not next(objs) or not doors.get then return true end
local minp = {x = pos.x - 2, y = pos.y, z = pos.z - 2}
local maxp = {x = pos.x + 2, y = pos.y, z = pos.z + 2}
local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
for _, player in pairs(objs) do
if player:is_player() then
for i = 1, #doors do
door_toggle(pos, doors[i], player)
end
break
end
end
return true
end
function plate.register(material, desc, def)
xdecor.register("pressure_" .. material .. "_off", {
description = def.description or (desc .. " Pressure Plate"),
tiles = {"xdecor_pressure_" .. material .. ".png"},
use_texture_alpha = ALPHA_OPAQUE,
drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 1, 14}}),
groups = def.groups,
sounds = def.sounds,
sunlight_propagates = true,
on_rotate = screwdriver.rotate_simple,
on_construct = plate.construct,
on_timer = plate.timer
})
xdecor.register("pressure_" .. material .. "_on", {
tiles = {"xdecor_pressure_" .. material .. ".png"},
use_texture_alpha = ALPHA_OPAQUE,
drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 0.4, 14}}),
groups = def.groups,
sounds = def.sounds,
drop = "xdecor:pressure_" .. material .. "_off",
sunlight_propagates = true,
on_rotate = screwdriver.rotate_simple
})
end
plate.register("wood", "Wooden", {
sounds = default.node_sound_wood_defaults(),
groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2},
description = S("Wooden Pressure Plate"),
})
plate.register("stone", "Stone", {
sounds = default.node_sound_stone_defaults(),
groups = {cracky = 3, oddly_breakable_by_hand = 2},
description = S("Stone Pressure Plate"),
})
xdecor.register("lever_off", {
description = S("Lever"),
tiles = {"xdecor_lever_off.png"},
use_texture_alpha = ALPHA_OPAQUE,
drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}),
groups = {cracky = 3, oddly_breakable_by_hand = 2},
sounds = default.node_sound_stone_defaults(),
sunlight_propagates = true,
on_rotate = screwdriver.rotate_simple,
on_rightclick = function(pos, node, clicker, itemstack)
if not doors.get then return itemstack end
local minp = {x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}
local maxp = {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2}
local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
for i = 1, #doors do
door_toggle(pos, doors[i], clicker)
end
return itemstack
end
})
xdecor.register("lever_on", {
tiles = {"xdecor_lever_on.png"},
use_texture_alpha = ALPHA_OPAQUE,
drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}),
groups = {cracky = 3, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
sounds = default.node_sound_stone_defaults(),
sunlight_propagates = true,
on_rotate = screwdriver.rotate_simple,
drop = "xdecor:lever_off"
})
-- Recipes
minetest.register_craft({
output = "xdecor:pressure_stone_off",
type = "shapeless",
recipe = {"group:stone", "group:stone"}
})
minetest.register_craft({
output = "xdecor:pressure_wood_off",
type = "shapeless",
recipe = {"group:wood", "group:wood"}
})
minetest.register_craft({
output = "xdecor:lever_off",
recipe = {
{"group:stick"},
{"group:stone"}
}
})

View File

@@ -0,0 +1,744 @@
screwdriver = screwdriver or {}
local S = minetest.get_translator("xdecor")
local ALPHA_CLIP = minetest.features.use_texture_alpha_string_modes and "clip" or true
local ALPHA_OPAQUE = minetest.features.use_texture_alpha_string_modes and "opaque" or false
local function register_pane(name, desc, def)
xpanes.register_pane(name, {
description = desc,
tiles = {"xdecor_" .. name .. ".png"},
drawtype = "airlike",
paramtype = "light",
textures = {"xdecor_" .. name .. ".png", "" ,"xdecor_" .. name .. ".png"},
inventory_image = "xdecor_" .. name .. ".png",
wield_image = "xdecor_" .. name .. ".png",
groups = def.groups,
sounds = def.sounds or default.node_sound_defaults(),
recipe = def.recipe
})
end
register_pane("bamboo_frame", S("Bamboo Frame"), {
groups = {choppy = 3, oddly_breakable_by_hand = 2, pane = 1, flammable = 2},
recipe = {
{"default:papyrus", "default:papyrus", "default:papyrus"},
{"default:papyrus", "farming:cotton", "default:papyrus"},
{"default:papyrus", "default:papyrus", "default:papyrus"}
}
})
register_pane("chainlink", S("Chainlink"), {
groups = {cracky = 3, oddly_breakable_by_hand = 2, pane = 1},
recipe = {
{"default:steel_ingot", "", "default:steel_ingot"},
{"", "default:steel_ingot", ""},
{"default:steel_ingot", "", "default:steel_ingot"}
}
})
register_pane("rusty_bar", S("Rusty Iron Bars"), {
sounds = default.node_sound_stone_defaults(),
groups = {cracky = 2, pane = 1},
recipe = {
{"", "default:dirt", ""},
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}
}
})
register_pane("wood_frame", S("Wood Frame"), {
sounds = default.node_sound_wood_defaults(),
groups = {choppy = 2, pane = 1, flammable = 2},
recipe = {
{"group:wood", "group:stick", "group:wood"},
{"group:stick", "group:stick", "group:stick"},
{"group:wood", "group:stick", "group:wood"}
}
})
xdecor.register("baricade", {
description = S("Baricade"),
drawtype = "plantlike",
paramtype2 = "facedir",
inventory_image = "xdecor_baricade.png",
tiles = {"xdecor_baricade.png"},
groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
damage_per_second = 4,
selection_box = xdecor.nodebox.slab_y(0.3),
collision_box = xdecor.pixelbox(2, {{0, 0, 1, 2, 2, 0}})
})
xdecor.register("barrel", {
description = S("Barrel"),
tiles = {"xdecor_barrel_top.png", "xdecor_barrel_top.png", "xdecor_barrel_sides.png"},
on_place = minetest.rotate_node,
groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
sounds = default.node_sound_wood_defaults()
})
local function register_storage(name, desc, def)
xdecor.register(name, {
description = desc,
inventory = {size = def.inv_size or 24},
infotext = desc,
tiles = def.tiles,
use_texture_alpha = ALPHA_OPAQUE,
node_box = def.node_box,
on_rotate = def.on_rotate,
on_place = def.on_place,
groups = def.groups or {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
sounds = default.node_sound_wood_defaults()
})
end
register_storage("cabinet", S("Wooden Cabinet"), {
on_rotate = screwdriver.rotate_simple,
tiles = {
"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
"xdecor_cabinet_sides.png", "xdecor_cabinet_front.png"
}
})
register_storage("cabinet_half", S("Half Wooden Cabinet"), {
inv_size = 8,
node_box = xdecor.nodebox.slab_y(0.5, 0.5),
on_rotate = screwdriver.rotate_simple,
tiles = {
"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
"xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_sides.png",
"xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_front.png"
}
})
register_storage("empty_shelf", S("Empty Shelf"), {
on_rotate = screwdriver.rotate_simple,
tiles = {
"main_planks_oak.png", "main_planks_oak.png", "main_planks_oak.png",
"main_planks_oak.png", "main_planks_oak.png^xdecor_empty_shelf.png"
}
})
register_storage("multishelf", S("Multi Shelf"), {
on_rotate = screwdriver.rotate_simple,
tiles = {
"main_planks_oak.png", "main_planks_oak.png", "main_planks_oak.png",
"main_planks_oak.png", "main_planks_oak.png^xdecor_multishelf.png"
},
})
register_storage("bookshelf", S("Bookshelf"), {
on_rotate = screwdriver.rotate_simple,
tiles = {
"main_planks_oak.png", "main_planks_oak.png", "main_planks_oak.png",
"main_planks_oak.png", "main_planks_oak.png^xdecor_bookshelf.png"
},
})
register_storage("binder_shelf", S("Binder Shelf"), {
on_rotate = screwdriver.rotate_simple,
tiles = {
"main_planks_oak.png", "main_planks_oak.png", "main_planks_oak.png",
"main_planks_oak.png", "main_planks_oak.png^xdecor_bindershelf.png"
},
})
register_storage("vhs_shelf", S("VHS Shelf"), {
on_rotate = screwdriver.rotate_simple,
tiles = {
"main_planks_oak.png", "main_planks_oak.png", "main_planks_oak.png",
"main_planks_oak.png", "main_planks_oak.png^xdecor_vhsshelf.png"
},
})
xdecor.register("candle", {
description = S("Candle"),
light_source = 12,
drawtype = "torchlike",
inventory_image = "xdecor_candle_inv.png",
wield_image = "xdecor_candle_wield.png",
paramtype2 = "wallmounted",
walkable = false,
groups = {dig_immediate = 3, attached_node = 1},
tiles = {
{
name = "xdecor_candle_floor.png",
animation = {type="vertical_frames", length = 1.5}
},
{
name = "xdecor_candle_hanging.png",
animation = {type="vertical_frames", length = 1.5}
},
{
name = "xdecor_candle_wall.png",
animation = {type="vertical_frames", length = 1.5}
}
},
selection_box = {
type = "wallmounted",
wall_top = {-0.25, -0.3, -0.25, 0.25, 0.5, 0.25},
wall_bottom = {-0.25, -0.5, -0.25, 0.25, 0.1, 0.25},
wall_side = {-0.5, -0.35, -0.15, -0.15, 0.4, 0.15}
}
})
xdecor.register("chair", {
description = S("Chair"),
tiles = {"xdecor_wood.png"},
sounds = default.node_sound_wood_defaults(),
groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2},
on_rotate = screwdriver.rotate_simple,
node_box = xdecor.pixelbox(16, {
{3, 0, 11, 2, 16, 2},
{11, 0, 11, 2, 16, 2},
{5, 9, 11.5, 6, 6, 1},
{3, 0, 3, 2, 6, 2},
{11, 0, 3, 2, 6, 2},
{3, 6, 3, 10, 2, 8}
}),
})
xdecor.register("stacking_chair", {
description = S("Stacking Chair"),
tiles = {"xdecor_stacking_chair_topbottom.png", "xdecor_stacking_chair_topbottom.png", "xdecor_stacking_chair.png", "xdecor_stacking_chair.png", "xdecor_stacking_chair.png", "xdecor_stacking_chair.png"},
sounds = default.node_sound_wood_defaults(),
groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2},
on_rotate = screwdriver.rotate_simple,
node_box = {
type = "fixed",
fixed = {
{-0.25, -0.0625, -0.25, 0.25, 0, 0.25},
{-0.25, 0, -0.25, 0.25, 0.5, -0.1875},
{-0.25, -0.5, 0.1875, -0.1875, -0.0625, 0.25},
{-0.25, -0.125, -0.1875, -0.1875, -0.0625, 0.1875},
{0.1875, -0.125, -0.1875, 0.25, -0.0625, 0.1875},
{-0.25, -0.5, -0.25, -0.1875, -0.0625, -0.1875},
{0.1875, -0.5, -0.25, 0.25, -0.0625, -0.1875},
{0.1875, -0.5, 0.1875, 0.25, -0.0625, 0.25},
}
}
})
xdecor.register("cobweb", {
description = S("Cobweb"),
drawtype = "plantlike",
tiles = {"xdecor_cobweb.png"},
inventory_image = "xdecor_cobweb.png",
liquid_viscosity = 8,
liquidtype = "source",
liquid_alternative_flowing = "xdecor:cobweb",
liquid_alternative_source = "xdecor:cobweb",
liquid_renewable = false,
liquid_range = 0,
walkable = false,
selection_box = {type = "regular"},
groups = {snappy = 3, liquid = 3, flammable = 3},
sounds = default.node_sound_leaves_defaults()
})
local curtain_colors = {
red = S("Red Curtain"),
}
for c, desc in pairs(curtain_colors) do
xdecor.register("curtain_" .. c, {
description = desc,
walkable = false,
tiles = {"wool_white.png"},
color = c,
inventory_image = "wool_white.png^[colorize:" .. c ..
":170^xdecor_curtain_open_overlay.png^[makealpha:255,126,126",
wield_image = "wool_white.png^[colorize:" .. c .. ":170",
drawtype = "signlike",
paramtype2 = "colorwallmounted",
groups = {dig_immediate = 3, flammable = 3},
selection_box = {type = "wallmounted"},
on_rightclick = function(pos, node, _, itemstack)
minetest.set_node(pos, {name = "xdecor:curtain_open_" .. c, param2 = node.param2})
return itemstack
end
})
xdecor.register("curtain_open_" .. c, {
tiles = {"wool_white.png^xdecor_curtain_open_overlay.png^[makealpha:255,126,126"},
color = c,
drawtype = "signlike",
paramtype2 = "colorwallmounted",
walkable = false,
groups = {dig_immediate = 3, flammable = 3, not_in_creative_inventory = 1},
selection_box = {type="wallmounted"},
drop = "xdecor:curtain_" .. c,
on_rightclick = function(pos, node, _, itemstack)
minetest.set_node(pos, {name="xdecor:curtain_" .. c, param2 = node.param2})
return itemstack
end
})
minetest.register_craft({
output = "xdecor:curtain_" .. c .. " 4",
recipe = {
{"", "wool:" .. c, ""},
{"", "wool:" .. c, ""}
}
})
end
xdecor.register("cushion", {
description = S("Cushion"),
tiles = {"xdecor_cushion.png"},
groups = {snappy = 3, flammable = 3, fall_damage_add_percent = -50},
on_place = minetest.rotate_node,
node_box = xdecor.nodebox.slab_y(0.5),
can_dig = xdecor.sit_dig,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
pos.y = pos.y + 0 -- Sitting position
xdecor.sit(pos, node, clicker, pointed_thing)
return itemstack
end
})
xdecor.register("cushion_block", {
description = S("Cushion Block"),
tiles = {"xdecor_cushion.png"},
groups = {snappy = 3, flammable = 3, fall_damage_add_percent = -75, not_in_creative_inventory = 1}
})
local function door_access(name)
return name:find("prison")
end
local xdecor_doors = {
japanese = {
recipe = {
{"group:wood", "default:paper"},
{"default:paper", "group:wood"},
{"group:wood", "default:paper"}
},
desc = S("Japanese Door"),
},
prison = {
recipe = {
{"xpanes:bar_flat", "xpanes:bar_flat",},
{"xpanes:bar_flat", "xpanes:bar_flat",},
{"xpanes:bar_flat", "xpanes:bar_flat"}
},
desc = S("Prison Door"),
},
rusty_prison = {
recipe = {
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",},
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",},
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat"}
},
desc = S("Rusty Prison Door"),
},
screen = {
recipe = {
{"group:wood", "group:wood"},
{"xpanes:chainlink_flat", "xpanes:chainlink_flat"},
{"group:wood", "group:wood"}
},
desc = S("Screen Door"),
},
slide = {
recipe = {
{"default:paper", "default:paper"},
{"default:paper", "default:paper"},
{"group:wood", "group:wood"}
},
desc = S("Slide Door"),
},
woodglass = {
recipe = {
{"default:glass", "default:glass"},
{"group:wood", "group:wood"},
{"group:wood", "group:wood"}
},
desc = S("Woodglass Door"),
},
}
local mesecons_register
if minetest.global_exists("mesecon") then
mesecons_register = { effector = {
action_on = function(pos, node)
local door = doors.get(pos)
if door then
door:open()
end
end,
action_off = function(pos, node)
local door = doors.get(pos)
if door then
door:close()
end
end,
rules = mesecon.rules.pplate
}}
end
for name, def in pairs(xdecor_doors) do
if not doors.register then break end
doors.register(name .. "_door", {
tiles = {
{name = "xdecor_" .. name .. "_door.png", backface_culling = true}
},
description = def.desc,
inventory_image = "xdecor_" .. name .. "_door_inv.png",
protected = door_access(name),
groups = {choppy = 2, cracky = 2, oddly_breakable_by_hand = 1, door = 1},
recipe = def.recipe,
mesecons = mesecons_register,
})
end
xdecor.register("enderchest", {
description = S("Ender Chest"),
tiles = {
"xdecor_enderchest_top.png", "xdecor_enderchest_top.png",
"xdecor_enderchest_side.png", "xdecor_enderchest_side.png",
"xdecor_enderchest_side.png", "xdecor_enderchest_front.png"
},
groups = {cracky = 1, choppy = 1},
sounds = default.node_sound_stone_defaults(),
on_rotate = screwdriver.rotate_simple,
on_construct = function(pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", [[ size[8,9]
list[current_player;enderchest;0,0;8,4;]
list[current_player;main;0,5;8,4;]
listring[current_player;enderchest]
listring[current_player;main] ]]
.. xbg .. default.get_hotbar_bg(0,5))
meta:set_string("infotext", S("Ender Chest"))
end
})
minetest.register_on_joinplayer(function(player)
local inv = player:get_inventory()
inv:set_size("enderchest", 8*4)
end)
xdecor.register("ivy", {
description = S("Ivy"),
drawtype = "signlike",
walkable = false,
climbable = true,
groups = {snappy = 3, flora = 1, attached_node = 1, plant = 1, flammable = 3},
paramtype2 = "wallmounted",
selection_box = {type="wallmounted"},
tiles = {"xdecor_ivy.png"},
inventory_image = "xdecor_ivy.png",
wield_image = "xdecor_ivy.png",
sounds = default.node_sound_leaves_defaults()
})
xdecor.register("rooster", {
description = S("Rooster"),
drawtype = "torchlike",
inventory_image = "xdecor_rooster.png",
walkable = false,
groups = {snappy = 3, attached_node = 1},
tiles = {"xdecor_rooster.png"},
})
xdecor.register("lantern", {
description = S("Lantern"),
light_source = 13,
drawtype = "plantlike",
inventory_image = "xdecor_lantern_inv.png",
wield_image = "xdecor_lantern_inv.png",
paramtype2 = "wallmounted",
walkable = false,
groups = {snappy = 3, attached_node = 1},
tiles = {
{
name = "xdecor_lantern.png",
animation = {type="vertical_frames", length = 1.5}
}
},
selection_box = xdecor.pixelbox(16, {{4, 0, 4, 8, 16, 8}})
})
local xdecor_lightbox = {
iron = S("Iron Light Box"),
wooden = S("Wooden Light Box"),
wooden2 = S("Wooden Light Box 2"),
}
for l, desc in pairs(xdecor_lightbox) do
xdecor.register(l .. "_lightbox", {
description = desc,
tiles = {"xdecor_" .. l .. "_lightbox.png"},
groups = {cracky = 3, choppy = 3, oddly_breakable_by_hand = 2},
light_source = 13,
sounds = default.node_sound_glass_defaults()
})
end
local xdecor_potted = {
dandelion_white = S("Potted White Dandelion"),
dandelion_yellow = S("Potted Yellow Dandelion"),
geranium = S("Potted Geranium"),
rose = S("Potted Rose"),
tulip = S("Potted Tulip"),
viola = S("Potted Viola"),
}
for f, desc in pairs(xdecor_potted) do
xdecor.register("potted_" .. f, {
description = desc,
walkable = false,
groups = {snappy = 3, flammable = 3, plant = 1, flower = 1},
tiles = {"xdecor_" .. f .. "_pot.png"},
inventory_image = "xdecor_" .. f .. "_pot.png",
drawtype = "plantlike",
sounds = default.node_sound_leaves_defaults(),
selection_box = xdecor.nodebox.slab_y(0.3)
})
minetest.register_craft({
output = "xdecor:potted_" .. f,
recipe = {
{"default:clay_brick", "flowers:" .. f, "default:clay_brick"},
{"", "default:clay_brick", ""}
}
})
end
local painting_box = {
type = "wallmounted",
wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125},
wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125},
wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}
}
xdecor.register("painting_1", {
description = S("Painting"),
tiles = {"xdecor_painting_1.png"},
use_texture_alpha = ALPHA_OPAQUE,
inventory_image = "xdecor_painting_empty.png",
wield_image = "xdecor_painting_empty.png",
paramtype2 = "wallmounted",
sunlight_propagates = true,
groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2, attached_node = 1},
sounds = default.node_sound_wood_defaults(),
node_box = painting_box,
node_placement_prediction = "",
on_place = function(itemstack, placer, pointed_thing)
local num = math.random(4)
local leftover = minetest.item_place_node(
ItemStack("xdecor:painting_" .. num), placer, pointed_thing)
if leftover:get_count() == 0 and
not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
return itemstack
end
})
for i = 2, 4 do
xdecor.register("painting_" .. i, {
tiles = {"xdecor_painting_" .. i .. ".png"},
use_texture_alpha = ALPHA_OPAQUE,
paramtype2 = "wallmounted",
drop = "xdecor:painting_1",
sunlight_propagates = true,
groups = {
choppy = 3,
oddly_breakable_by_hand = 2,
flammable = 2,
attached_node = 1,
not_in_creative_inventory = 1
},
sounds = default.node_sound_wood_defaults(),
node_box = painting_box
})
end
xdecor.register("stonepath", {
description = S("Garden Stone Path"),
tiles = {"main_stone.png"},
groups = {snappy = 3},
on_rotate = screwdriver.rotate_simple,
sounds = default.node_sound_stone_defaults(),
sunlight_propagates = true,
node_box = xdecor.pixelbox(16, {
{8, 0, 8, 6, .5, 6}, {1, 0, 1, 6, .5, 6},
{1, 0, 10, 5, .5, 5}, {10, 0, 2, 4, .5, 4}
}),
selection_box = xdecor.nodebox.slab_y(0.05)
})
local function register_hard_node(name, desc, def)
def = def or {}
xdecor.register(name, {
description = desc,
tiles = {"xdecor_" .. name .. ".png"},
groups = def.groups or {cracky = 1},
sounds = def.sounds or default.node_sound_stone_defaults()
})
end
register_hard_node("cactusbrick", S("Cactus Brick"))
register_hard_node("coalstone_tile", S("Coal Stone Tile"))
register_hard_node("desertstone_tile", S("Desert Stone Tile"))
register_hard_node("hard_clay", S("Hardened Clay"))
register_hard_node("moonbrick", S("Moon Brick"))
register_hard_node("stone_tile", S("Stone Tile"))
register_hard_node("stone_rune", S("Runestone"))
register_hard_node("packed_ice", S("Packed Ice"), {
groups = {cracky = 1, puts_out_fire = 1, slippery = 3},
sounds = default.node_sound_glass_defaults()
})
register_hard_node("wood_tile", S("Wooden Tile"), {
groups = {choppy = 1, wood = 1, flammable = 2},
sounds = default.node_sound_wood_defaults()
})
register_hard_node("wood", S("XDecor Wood"), {
groups = {choppy = 1, wood = 1, flammable = 2},
sounds = default.node_sound_wood_defaults(),
paramtype2 = "none",
})
xdecor.register("table", {
description = S("Table"),
tiles = {"xdecor_wood.png"},
groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
sounds = default.node_sound_wood_defaults(),
node_box = xdecor.pixelbox(16, {
{0, 14, 0, 16, 2, 16}, {5.5, 0, 5.5, 5, 14, 6}
})
})
xdecor.register("tatami", {
description = S("Tatami"),
tiles = {"xdecor_tatami.png"},
wield_image = "xdecor_tatami.png",
groups = {snappy = 3, flammable = 3},
sunlight_propagates = true,
node_box = xdecor.nodebox.slab_y(0.0625)
})
xdecor.register("trampoline", {
description = S("Trampoline"),
tiles = {"xdecor_trampoline.png", "mailbox_blank16.png", "xdecor_trampoline_sides.png"},
use_texture_alpha = ALPHA_CLIP,
groups = {cracky = 3, oddly_breakable_by_hand = 1, fall_damage_add_percent = -80, bouncy = 90},
node_box = xdecor.nodebox.slab_y(0.5),
sounds = {
footstep = {
name = "xdecor_bouncy",
gain = 0.8
}
}
})
xdecor.register("tv", {
description = S("Television"),
light_source = 11,
groups = {cracky = 3, oddly_breakable_by_hand = 2},
on_rotate = screwdriver.rotate_simple,
tiles = {
"xdecor_television_left.png^[transformR270",
"xdecor_television_left.png^[transformR90",
"xdecor_television_left.png^[transformFX",
"xdecor_television_left.png",
"xdecor_television_back.png",
{
name = "xdecor_television_front_animated.png",
animation = {type = "vertical_frames", length = 80.0}
}
}
})
xdecor.register("tv_av", {
description = S("Television (AV)"),
light_source = 7,
groups = {cracky = 3, oddly_breakable_by_hand = 2},
on_rotate = screwdriver.rotate_simple,
tiles = {
"xdecor_television_left.png^[transformR270",
"xdecor_television_left.png^[transformR90",
"xdecor_television_left.png^[transformFX",
"xdecor_television_left.png",
"xdecor_television_back.png",
{
name = "xdecor_television_av_front_animated.png",
animation = {type = "vertical_frames", length = 1.0}
}
}
})
xdecor.register("tv1_imploded", {
description = S("Imploded Television"),
groups = {cracky = 3, oddly_breakable_by_hand = 2},
on_rotate = screwdriver.rotate_simple,
tiles = {
"xdecor_television_left.png^[transformR270",
"xdecor_television_left.png^[transformR90",
"xdecor_television_left.png^[transformFX",
"xdecor_television_left.png",
"xdecor_television_back.png",
"xdecor_television1_imploded.png",
}
})
xdecor.register("woodframed_glass", {
description = S("Wood Framed Glass"),
drawtype = "glasslike_framed",
sunlight_propagates = true,
tiles = {"xdecor_woodframed_glass.png", "xdecor_woodframed_glass_detail.png"},
use_texture_alpha = ALPHA_CLIP,
groups = {cracky = 2, oddly_breakable_by_hand = 1},
sounds = default.node_sound_glass_defaults()
})
minetest.register_node("xdecor:toilet", {
description = "Toilet",
tiles = {
"soviet_machine.png",
},
drawtype = "nodebox",
paramtype = "light",
paramtype2 = "facedir",
groups = {cracky = 2},
node_box =
{
type = "fixed",
fixed =
{
{-0.25, -0.5, -0.3125, 0.25, -0.3125, 0.3125},
{-0.3125, -0.3125, -0.375, 0.3125, -0.1875, 0.4375},
{-0.3125, -0.1875, -0.4375, 0.3125, 0, 0.5},
{-0.25, 0, 0.1875, 0.25, 0.5, 0.5},
}
}
})
for _, v in ipairs({"radio", "speaker"}) do
xdecor.register(v, {
description = v:gsub("^%l", string.upper),
on_rotate = screwdriver.rotate_simple,
tiles = {
"xdecor_" .. v .. "_top.png",
"xdecor_" .. v .. "_side.png",
"xdecor_" .. v .. "_side.png",
"xdecor_" .. v .. "_side.png",
"xdecor_" .. v .. "_back.png",
"xdecor_" .. v .. "_front.png",
},
groups = {cracky = 2, not_cuttable = 1},
})
end

View File

@@ -0,0 +1,75 @@
local rope = {}
local S = minetest.get_translator("xdecor")
-- Code by Mirko K. (modified by Temperest, Wulfsdad and kilbith) (License: GPL).
function rope.place(itemstack, placer, pointed_thing)
if pointed_thing.type == "node" then
local pos = pointed_thing.above
local oldnode = minetest.get_node(pos)
local stackname = itemstack:get_name()
if minetest.is_protected(pos, placer:get_player_name()) then
return itemstack
end
while oldnode.name == "air" and not itemstack:is_empty() do
local newnode = {name = stackname, param1 = 0}
minetest.set_node(pos, newnode)
itemstack:take_item()
pos.y = pos.y - 1
oldnode = minetest.get_node(pos)
end
end
return itemstack
end
function rope.remove(pos, oldnode, digger, rope_name)
local num = 0
local below = {x = pos.x, y = pos.y, z = pos.z}
local digger_inv = digger:get_inventory()
while minetest.get_node(below).name == rope_name do
minetest.remove_node(below)
below.y = below.y - 1
num = num + 1
end
if num == 0 then return end
digger_inv:add_item("main", rope_name.." "..num)
return true
end
xdecor.register("rope", {
description = S("Rope"),
drawtype = "plantlike",
walkable = false,
climbable = true,
groups = {snappy = 3, flammable = 3},
tiles = {"xdecor_rope.png"},
inventory_image = "xdecor_rope_inv.png",
wield_image = "xdecor_rope_inv.png",
selection_box = xdecor.pixelbox(8, {{3, 0, 3, 2, 8, 2}}),
on_place = rope.place,
on_punch = function(pos, node, puncher, pointed_thing)
local player_name = puncher:get_player_name()
if not minetest.is_protected(pos, player_name) or
minetest.get_player_privs(player_name).protection_bypass then
rope.remove(pos, node, puncher, "xdecor:rope")
end
end
})
-- Recipes
minetest.register_craft({
output = "xdecor:rope",
recipe = {
{"farming:string"},
{"farming:string"},
{"farming:string"}
}
})

View File

@@ -0,0 +1,361 @@
local workbench = {}
local nodes = {}
screwdriver = screwdriver or {}
local min, ceil = math.min, math.ceil
local S = minetest.get_translator("xdecor")
local FS = function(...) return minetest.formspec_escape(S(...)) end
-- Nodes allowed to be cut
-- Only the regular, solid blocks without metas or explosivity can be cut
for node, def in pairs(minetest.registered_nodes) do
if xdecor.stairs_valid_def(def) then
nodes[#nodes + 1] = node
end
end
-- Nodeboxes definitions
workbench.defs = {
-- Name YieldX YZ WH L
{"nanoslab", 16, { 0, 0, 0, 8, 1, 8 }},
{"micropanel", 16, { 0, 0, 0, 16, 1, 8 }},
{"microslab", 8, { 0, 0, 0, 16, 1, 16 }},
{"thinstair", 8, { 0, 7, 0, 16, 1, 8 },
{ 0, 15, 8, 16, 1, 8 }},
{"cube", 4, { 0, 0, 0, 8, 8, 8 }},
{"panel", 4, { 0, 0, 0, 16, 8, 8 }},
{"slab", 2, nil },
{"doublepanel", 2, { 0, 0, 0, 16, 8, 8 },
{ 0, 8, 8, 16, 8, 8 }},
{"halfstair", 2, { 0, 0, 0, 8, 8, 16 },
{ 0, 8, 8, 8, 8, 8 }},
{"stair_outer", 1, nil },
{"stair", 1, nil },
{"stair_inner", 1, nil }
}
local repairable_tools = {"pick", "axe", "shovel", "sword", "hoe", "armor", "shield"}
local custom_repairable = {}
function xdecor:register_repairable(item)
custom_repairable[item] = true
end
-- Tools allowed to be repaired
function workbench:repairable(stack)
if custom_repairable[stack] then return true end
for _, t in ipairs(repairable_tools) do
if stack:find(t) then
return true
end
end
end
-- method to allow other mods to check if an item is repairable
function xdecor:is_repairable(stack)
return workbench:repairable(stack)
end
function workbench:get_output(inv, input, name)
local output = {}
for i = 1, #self.defs do
local nbox = self.defs[i]
local count = min(nbox[2] * input:get_count(), input:get_stack_max())
local item = name .. "_" .. nbox[1]
item = nbox[3] and item or "stairs:" .. nbox[1] .. "_" .. name:match(":(.*)")
output[i] = item .. " " .. count
end
inv:set_list("forms", output)
end
local main_fs = "label[0.9,1.23;"..FS("Cut").."]"
.."label[0.9,2.23;"..FS("Repair").."]"
..[[ box[-0.05,1;2.05,0.9;#555555]
box[-0.05,2;2.05,0.9;#555555] ]]
.."button[0,0;2,1;craft;"..FS("Crafting").."]"
.."button[2,0;2,1;storage;"..FS("Storage").."]"
..[[ image[3,1;1,1;gui_arrow.png]
image[0,1;1,1;worktable_saw.png]
image[0,2;1,1;worktable_anvil.png]
image[3,2;1,1;hammer_layout.png]
list[context;input;2,1;1,1;]
list[context;tool;2,2;1,1;]
list[context;hammer;3,2;1,1;]
list[context;forms;4,0;4,3;]
listring[current_player;main]
listring[context;tool]
listring[current_player;main]
listring[context;hammer]
listring[current_player;main]
listring[context;forms]
listring[current_player;main]
listring[context;input]
]]
local crafting_fs = "image[5,1;1,1;gui_furnace_arrow_bg.png^[transformR270]"
.."button[0,0;1.5,1;back;< "..FS("Back").."]"
..[[ list[current_player;craft;2,0;3,3;]
list[current_player;craftpreview;6,1;1,1;]
listring[current_player;main]
listring[current_player;craft]
]]
local storage_fs = "list[context;storage;0,1;8,2;]"
.."button[0,0;1.5,1;back;< "..FS("Back").."]"
..[[listring[context;storage]
listring[current_player;main]
]]
local formspecs = {
-- Main formspec
main_fs,
-- Crafting formspec
crafting_fs,
-- Storage formspec
storage_fs,
}
function workbench:set_formspec(meta, id)
meta:set_string("formspec",
"size[8,7;]list[current_player;main;0,3.25;8,4;]" ..
formspecs[id] .. xbg .. default.get_hotbar_bg(0,3.25))
end
function workbench.construct(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size("tool", 1)
inv:set_size("input", 1)
inv:set_size("hammer", 1)
inv:set_size("forms", 4*3)
inv:set_size("storage", 8*2)
meta:set_string("infotext", S("Work Bench"))
workbench:set_formspec(meta, 1)
end
function workbench.fields(pos, _, fields)
if fields.quit then return end
local meta = minetest.get_meta(pos)
local id = fields.back and 1 or fields.craft and 2 or fields.storage and 3
if not id then return end
workbench:set_formspec(meta, id)
end
function workbench.dig(pos)
local inv = minetest.get_meta(pos):get_inventory()
return inv:is_empty("input") and inv:is_empty("hammer") and
inv:is_empty("tool") and inv:is_empty("storage")
end
function workbench.timer(pos)
local timer = minetest.get_node_timer(pos)
local inv = minetest.get_meta(pos):get_inventory()
local tool = inv:get_stack("tool", 1)
local hammer = inv:get_stack("hammer", 1)
if tool:is_empty() or hammer:is_empty() or tool:get_wear() == 0 then
timer:stop()
return
end
-- Tool's wearing range: 0-65535; 0 = new condition
tool:add_wear(-500)
hammer:add_wear(700)
inv:set_stack("tool", 1, tool)
inv:set_stack("hammer", 1, hammer)
return true
end
function workbench.allow_put(pos, listname, index, stack, player)
local stackname = stack:get_name()
if (listname == "tool" and stack:get_wear() > 0 and
workbench:repairable(stackname)) or
(listname == "input" and minetest.registered_nodes[stackname .. "_cube"]) or
(listname == "hammer" and stackname == "xdecor:hammer") or
listname == "storage" then
return stack:get_count()
end
return 0
end
function workbench.on_put(pos, listname, index, stack, player)
local inv = minetest.get_meta(pos):get_inventory()
if listname == "input" then
local input = inv:get_stack("input", 1)
workbench:get_output(inv, input, stack:get_name())
elseif listname == "tool" or listname == "hammer" then
local timer = minetest.get_node_timer(pos)
timer:start(3.0)
end
end
function workbench.allow_move(pos, from_list, from_index, to_list, to_index, count, player)
return (to_list == "storage" and from_list ~= "forms") and count or 0
end
function workbench.on_move(pos, from_list, from_index, to_list, to_index, count, player)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local from_stack = inv:get_stack(from_list, from_index)
local to_stack = inv:get_stack(to_list, to_index)
workbench.on_take(pos, from_list, from_index, from_stack, player)
workbench.on_put(pos, to_list, to_index, to_stack, player)
end
function workbench.allow_take(pos, listname, index, stack, player)
return stack:get_count()
end
function workbench.on_take(pos, listname, index, stack, player)
local inv = minetest.get_meta(pos):get_inventory()
local input = inv:get_stack("input", 1)
local inputname = input:get_name()
local stackname = stack:get_name()
if listname == "input" then
if stackname == inputname and minetest.registered_nodes[inputname .. "_cube"] then
workbench:get_output(inv, input, stackname)
else
inv:set_list("forms", {})
end
elseif listname == "forms" then
local fromstack = inv:get_stack(listname, index)
if not fromstack:is_empty() and fromstack:get_name() ~= stackname then
local player_inv = player:get_inventory()
if player_inv:room_for_item("main", fromstack) then
player_inv:add_item("main", fromstack)
end
end
input:take_item(ceil(stack:get_count() / workbench.defs[index][2]))
inv:set_stack("input", 1, input)
workbench:get_output(inv, input, inputname)
end
end
xdecor.register("workbench", {
description = S("Work Bench"),
groups = {cracky = 2, choppy = 2, oddly_breakable_by_hand = 1},
sounds = default.node_sound_wood_defaults(),
tiles = {
"xdecor_workbench_top.png","xdecor_workbench_top.png",
"xdecor_workbench_sides.png", "xdecor_workbench_sides.png",
"xdecor_workbench_front.png", "xdecor_workbench_front.png"
},
on_rotate = screwdriver.rotate_simple,
can_dig = workbench.dig,
on_timer = workbench.timer,
on_construct = workbench.construct,
on_receive_fields = workbench.fields,
on_metadata_inventory_put = workbench.on_put,
on_metadata_inventory_take = workbench.on_take,
on_metadata_inventory_move = workbench.on_move,
allow_metadata_inventory_put = workbench.allow_put,
allow_metadata_inventory_take = workbench.allow_take,
allow_metadata_inventory_move = workbench.allow_move
})
for _, d in ipairs(workbench.defs) do
for i = 1, #nodes do
local node = nodes[i]
local mod_name, item_name = node:match("^(.-):(.*)")
local def = minetest.registered_nodes[node]
if item_name and d[3] then
local groups = {}
local tiles
groups.not_in_creative_inventory = 1
for k, v in pairs(def.groups) do
if k ~= "wood" and k ~= "stone" and k ~= "level" then
groups[k] = v
end
end
if def.tiles then
if #def.tiles > 1 and (def.drawtype:sub(1,5) ~= "glass") then
tiles = def.tiles
else
tiles = {def.tiles[1]}
end
else
tiles = {def.tile_images[1]}
end
--TODO: Translation support for Stairs/Slab
if not minetest.registered_nodes["stairs:slab_" .. item_name] then
stairs.register_stair_and_slab(item_name, node,
groups, tiles, def.description .. " Stair",
def.description .. " Slab", def.sounds)
end
minetest.register_node(":" .. node .. "_" .. d[1], {
--TODO: Translation support
description = def.description .. " " .. d[1]:gsub("^%l", string.upper),
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
sounds = def.sounds,
tiles = tiles,
use_texture_alpha = def.use_texture_alpha,
groups = groups,
-- `unpack` has been changed to `table.unpack` in newest Lua versions
node_box = xdecor.pixelbox(16, {unpack(d, 3)}),
sunlight_propagates = true,
on_place = minetest.rotate_node
})
elseif item_name and mod_name then
minetest.register_alias_force(
("%s:%s_innerstair"):format(mod_name, item_name),
("stairs:stair_inner_%s"):format(item_name)
)
minetest.register_alias_force(
("%s:%s_outerstair"):format(mod_name, item_name),
("stairs:stair_outer_%s"):format(item_name)
)
end
end
end
-- Craft items
minetest.register_tool("xdecor:hammer", {
description = S("Hammer"),
inventory_image = "xdecor_hammer.png",
wield_image = "xdecor_hammer.png",
on_use = function() do
return end
end
})
-- Recipes
minetest.register_craft({
output = "xdecor:hammer",
recipe = {
{"default:steel_ingot", "group:stick", "default:steel_ingot"},
{"", "group:stick", ""}
}
})
minetest.register_craft({
output = "xdecor:workbench",
recipe = {
{"group:wood", "group:wood"},
{"group:wood", "group:wood"}
}
})