Global code style cleaning

master
Jean-Patrick Guerrero 2019-07-23 14:03:20 +02:00
parent f0860cb598
commit 61d9da63fa
17 changed files with 614 additions and 404 deletions

View File

@ -7,6 +7,9 @@ read_globals = {
"default", "default",
"stairs", "doors", "xpanes", "stairs", "doors", "xpanes",
"xdecor", "xbg", "xdecor", "xbg",
table = { fields = { "copy" } }, table = {fields = {"copy"}},
string = {fields = {"split"}},
"unpack", "unpack",
"stairsplus",
"mesecon"
} }

View File

@ -19,24 +19,29 @@ function xdecor.sit(pos, node, clicker, pointed_thing)
if default.player_attached[player_name] then if default.player_attached[player_name] then
pos.y = pos.y - 0.5 pos.y = pos.y - 0.5
clicker:setpos(pos) clicker:setpos(pos)
clicker:set_eye_offset({x=0, y=0, z=0}, {x=0, y=0, z=0}) clicker:set_eye_offset(vector.new(), vector.new())
clicker:set_physics_override({speed = 1, jump = 1, gravity = 1}) clicker:set_physics_override({speed = 1, jump = 1, gravity = 1})
default.player_attached[player_name] = false default.player_attached[player_name] = false
default.player_set_animation(clicker, "stand", 30) default.player_set_animation(clicker, "stand", 30)
elseif not default.player_attached[player_name] and node.param2 <= 3 and elseif not default.player_attached[player_name] and node.param2 <= 3 and
not ctrl.sneak and vector.equals(vel, {x=0,y=0,z=0}) then not ctrl.sneak and vector.equals(vel, vector.new()) then
clicker:set_eye_offset({x=0, y=-7, z=2}, {x=0, y=0, z=0}) clicker:set_eye_offset({x = 0, y = -7, z = 2}, vector.new())
clicker:set_physics_override({speed = 0, jump = 0, gravity = 1}) clicker:set_physics_override({speed = 0, jump = 0, gravity = 1})
clicker:setpos(pos) clicker:setpos(pos)
default.player_attached[player_name] = true default.player_attached[player_name] = true
default.player_set_animation(clicker, "sit", 30) default.player_set_animation(clicker, "sit", 30)
if node.param2 == 0 then clicker:set_look_yaw(3.15) if node.param2 == 0 then
elseif node.param2 == 1 then clicker:set_look_yaw(7.9) clicker:set_look_yaw(3.15)
elseif node.param2 == 2 then clicker:set_look_yaw(6.28) elseif node.param2 == 1 then
elseif node.param2 == 3 then clicker:set_look_yaw(4.75) end clicker:set_look_yaw(7.9)
elseif node.param2 == 2 then
clicker:set_look_yaw(6.28)
elseif node.param2 == 3 then
clicker:set_look_yaw(4.75)
end
end end
end end
@ -47,6 +52,7 @@ function xdecor.sit_dig(pos, digger)
return false return false
end end
end end
return true return true
end end

View File

@ -2,21 +2,31 @@
function xdecor.maxn(T) function xdecor.maxn(T)
local n = 0 local n = 0
for k in pairs(T) do for k in pairs(T) do
if k > n then n = k end if k > n then
n = k
end
end end
return n return n
end end
-- Returns the length of an hash table. -- Returns the length of an hash table.
function xdecor.tablelen(T) function xdecor.tablelen(T)
local n = 0 local n = 0
for _ in pairs(T) do n = n + 1 end
for _ in pairs(T) do
n = n + 1
end
return n return n
end end
-- Deep copy of a table. Borrowed from mesecons mod (https://github.com/Jeija/minetest-mod-mesecons). -- Deep copy of a table. Borrowed from mesecons mod (https://github.com/Jeija/minetest-mod-mesecons).
function xdecor.tablecopy(T) function xdecor.tablecopy(T)
if type(T) ~= "table" then return T end -- No need to copy. if type(T) ~= "table" then
return T -- No need to copy.
end
local new = {} local new = {}
for k, v in pairs(T) do for k, v in pairs(T) do
@ -26,6 +36,7 @@ function xdecor.tablecopy(T)
new[k] = v new[k] = v
end end
end end
return new return new
end end

View File

@ -1,7 +1,13 @@
xdecor.box = { xdecor.box = {
slab_y = function(height, shift) slab_y = function(height, shift)
return {-0.5, -0.5 + (shift or 0), -0.5, 0.5, -0.5 + height + return {
(shift or 0), 0.5} -0.5,
-0.5 + (shift or 0),
-0.5,
0.5,
-0.5 + height + (shift or 0),
0.5
}
end, end,
slab_z = function(depth) slab_z = function(depth)
return {-0.5, -0.5, -0.5 + depth, 0.5, 0.5, 0.5} return {-0.5, -0.5, -0.5 + depth, 0.5, 0.5, 0.5}
@ -15,16 +21,18 @@ xdecor.box = {
} }
xdecor.nodebox = { xdecor.nodebox = {
regular = {type="regular"}, regular = {type = "regular"},
null = {type="fixed", fixed={0,0,0,0,0,0}} null = {
type = "fixed", fixed = {0,0,0,0,0,0}
}
} }
xdecor.pixelbox = function(size, boxes) xdecor.pixelbox = function(size, boxes)
local fixed = {} local fixed = {}
for _, box in pairs(boxes) do for _, box in ipairs(boxes) do
-- `unpack` has been changed to `table.unpack` in newest Lua versions. -- `unpack` has been changed to `table.unpack` in newest Lua versions.
local x, y, z, w, h, l = unpack(box) local x, y, z, w, h, l = unpack(box)
fixed[#fixed+1] = { fixed[#fixed + 1] = {
(x / size) - 0.5, (x / size) - 0.5,
(y / size) - 0.5, (y / size) - 0.5,
(z / size) - 0.5, (z / size) - 0.5,
@ -33,26 +41,27 @@ xdecor.pixelbox = function(size, boxes)
((z + l) / size) - 0.5 ((z + l) / size) - 0.5
} }
end end
return {type="fixed", fixed=fixed}
return {type = "fixed", fixed = fixed}
end end
local mt = {} local mt = {}
mt.__index = function(table, key) mt.__index = function(table, key)
local ref = xdecor.box[key] local ref = xdecor.box[key]
local ref_type = type(ref) local ref_type = type(ref)
if ref_type == "function" then if ref_type == "function" then
return function(...) return function(...)
return {type="fixed", fixed=ref(...)} return {type = "fixed", fixed = ref(...)}
end end
elseif ref_type == "table" then elseif ref_type == "table" then
return {type="fixed", fixed=ref} return {type = "fixed", fixed = ref}
elseif ref_type == "nil" then elseif ref_type == "nil" then
error(key.."could not be found among nodebox presets and functions") error(key .. "could not be found among nodebox presets and functions")
end end
error("unexpected datatype "..tostring(type(ref)).." while looking for "..key) error("unexpected datatype " .. tostring(type(ref)) .. " while looking for " .. key)
end end
setmetatable(xdecor.nodebox, mt) setmetatable(xdecor.nodebox, mt)

View File

@ -1,4 +1,4 @@
xbg = default.gui_bg..default.gui_bg_img..default.gui_slots xbg = default.gui_bg .. default.gui_bg_img .. default.gui_slots
local default_inventory_size = 32 local default_inventory_size = 32
local default_inventory_formspecs = { local default_inventory_formspecs = {
@ -6,30 +6,30 @@ local default_inventory_formspecs = {
list[context;main;0,0;8,1;] list[context;main;0,0;8,1;]
list[current_player;main;0,2;8,4;] list[current_player;main;0,2;8,4;]
listring[current_player;main] listring[current_player;main]
listring[context;main] ]] listring[context;main] ]] ..
..default.get_hotbar_bg(0,2), default.get_hotbar_bg(0,2),
["16"] = [[ size[8,7] ["16"] = [[ size[8,7]
list[context;main;0,0;8,2;] list[context;main;0,0;8,2;]
list[current_player;main;0,3;8,4;] list[current_player;main;0,3;8,4;]
listring[current_player;main] listring[current_player;main]
listring[context;main] ]] listring[context;main] ]] ..
..default.get_hotbar_bg(0,3), default.get_hotbar_bg(0,3),
["24"] = [[ size[8,8] ["24"] = [[ size[8,8]
list[context;main;0,0;8,3;] list[context;main;0,0;8,3;]
list[current_player;main;0,4;8,4;] list[current_player;main;0,4;8,4;]
listring[current_player;main] listring[current_player;main]
listring[context;main]" ]] listring[context;main]" ]] ..
..default.get_hotbar_bg(0,4), default.get_hotbar_bg(0,4),
["32"] = [[ size[8,9] ["32"] = [[ size[8,9]
list[context;main;0,0.3;8,4;] list[context;main;0,0.3;8,4;]
list[current_player;main;0,4.85;8,1;] list[current_player;main;0,4.85;8,1;]
list[current_player;main;0,6.08;8,3;8] list[current_player;main;0,6.08;8,3;8]
listring[current_player;main] listring[current_player;main]
listring[context;main] ]] listring[context;main] ]] ..
..default.get_hotbar_bg(0,4.85) default.get_hotbar_bg(0,4.85)
} }
local function get_formspec_by_size(size) local function get_formspec_by_size(size)
@ -42,13 +42,13 @@ local default_can_dig = function(pos)
return inv:is_empty("main") return inv:is_empty("main")
end end
function xdecor.register(name, def) local function xdecor_stairs_alternative(nodename, def)
local function xdecor_stairs_alternative(nodename, def)
local mod, name = nodename:match("(.*):(.*)") local mod, name = nodename:match("(.*):(.*)")
for groupname, value in pairs(def.groups) do for groupname, value in pairs(def.groups) do
if groupname ~= "cracky" and groupname ~= "choppy" and if groupname ~= "cracky" and groupname ~= "choppy" and
groupname ~= "flammable" and groupname ~= "crumbly" and groupname ~= "flammable" and groupname ~= "crumbly" and
groupname ~= "snappy" then groupname ~= "snappy" then
def.groups.groupname = nil def.groups.groupname = nil
end end
end end
@ -65,17 +65,18 @@ function xdecor.register(name, def)
sounds = def.sounds, sounds = def.sounds,
} }
) )
elseif minetest.get_modpath("stairs") then elseif minetest.get_modpath("stairs") then
stairs.register_stair_and_slab(name,nodename, stairs.register_stair_and_slab(name,nodename,
def.groups, def.groups,
def.tiles, def.tiles,
("%s Stair"):format(def.description), ("%s Stair"):format(def.description),
("%s Slab"):format(def.description), ("%s Slab"):format(def.description),
def.sounds def.sounds
) )
end end
end end
function xdecor.register(name, def)
def.drawtype = def.drawtype or (def.mesh and "mesh") or (def.node_box and "nodebox") def.drawtype = def.drawtype or (def.mesh and "mesh") or (def.node_box and "nodebox")
def.sounds = def.sounds or default.node_sound_defaults() def.sounds = def.sounds or default.node_sound_defaults()
@ -108,11 +109,14 @@ function xdecor.register(name, def)
local size = inventory.size or default_inventory_size local size = inventory.size or default_inventory_size
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size("main", size) inv:set_size("main", size)
meta:set_string("formspec", (inventory.formspec or meta:set_string("formspec",
get_formspec_by_size(size))..xbg) (inventory.formspec or get_formspec_by_size(size)) .. xbg)
end end
def.can_dig = def.can_dig or default_can_dig def.can_dig = def.can_dig or default_can_dig
elseif infotext and not def.on_construct then elseif infotext and not def.on_construct then
def.on_construct = function(pos) def.on_construct = function(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
@ -120,12 +124,12 @@ function xdecor.register(name, def)
end end
end end
minetest.register_node("xdecor:"..name, def) minetest.register_node("xdecor:" .. name, def)
local workbench = minetest.settings:get_bool("enable_xdecor_workbench") local workbench = minetest.settings:get_bool("enable_xdecor_workbench")
if workbench == false and if workbench == false and
(minetest.get_modpath("moreblocks") or minetest.get_modpath("stairs")) then (minetest.get_modpath("moreblocks") or minetest.get_modpath("stairs")) then
if xdecor.stairs_valid_def(def) then if xdecor.stairs_valid_def(def) then
xdecor_stairs_alternative("xdecor:"..name, def) xdecor_stairs_alternative("xdecor:"..name, def)
end end

View File

@ -1,29 +1,15 @@
--local t = os.clock() --local t = os.clock()
local mver_major, mver_minor, mver_patch = 0, 4, 16 -- Minetest 0.4.16 minimum.
local client_version = minetest.get_version().string
local major, minor, patch = client_version:match("(%d+).(%d+).(%d+)")
if (major and minor and patch) and
((tonumber(major) < mver_major) or
(mver_major == tonumber(major) and tonumber(minor) < mver_minor) or
(mver_minor == tonumber(minor) and tonumber(patch) < mver_patch)) then
minetest.log("error", "[xdecor] Your Minetest client is too old to run this mod. Disabling.")
return
end
xdecor = {} xdecor = {}
local modpath = minetest.get_modpath("xdecor") local modpath = minetest.get_modpath("xdecor")
dofile(modpath.."/handlers/animations.lua") dofile(modpath .. "/handlers/animations.lua")
dofile(modpath.."/handlers/helpers.lua") dofile(modpath .. "/handlers/helpers.lua")
dofile(modpath.."/handlers/nodeboxes.lua") dofile(modpath .. "/handlers/nodeboxes.lua")
dofile(modpath.."/handlers/registration.lua") dofile(modpath .. "/handlers/registration.lua")
dofile(modpath.."/src/alias.lua") dofile(modpath .. "/src/nodes.lua")
dofile(modpath.."/src/nodes.lua") dofile(modpath .. "/src/recipes.lua")
dofile(modpath.."/src/recipes.lua")
local subpart = { local subpart = {
"chess", "chess",
@ -34,13 +20,13 @@ local subpart = {
"mailbox", "mailbox",
"mechanisms", "mechanisms",
"rope", "rope",
"workbench" "workbench",
} }
for _, name in pairs(subpart) do for _, name in ipairs(subpart) do
local enable = minetest.settings:get_bool("enable_xdecor_"..name) local enable = minetest.settings:get_bool("enable_xdecor_" .. name)
if enable or enable == nil then if enable or enable == nil then
dofile(modpath.."/src/"..name..".lua") dofile(modpath .. "/src/" .. name .. ".lua")
end end
end end

View File

@ -1 +0,0 @@
minetest.register_alias("xdecor:crafting_guide", "craftguide:book")

View File

@ -5,7 +5,9 @@ local function index_to_xy(idx)
if not idx then if not idx then
return nil return nil
end end
idx = idx - 1 idx = idx - 1
local x = idx % 8 local x = idx % 8
local y = (idx - x) / 8 local y = (idx - x) / 8

View File

@ -17,7 +17,9 @@ cauldron.cbox = {
function cauldron.stop_sound(pos) function cauldron.stop_sound(pos)
local spos = minetest.hash_node_position(pos) local spos = minetest.hash_node_position(pos)
if sounds[spos] then minetest.sound_stop(sounds[spos]) end if sounds[spos] then
minetest.sound_stop(sounds[spos])
end
end end
function cauldron.idle_construct(pos) function cauldron.idle_construct(pos)
@ -29,7 +31,10 @@ end
function cauldron.boiling_construct(pos) function cauldron.boiling_construct(pos)
local spos = minetest.hash_node_position(pos) local spos = minetest.hash_node_position(pos)
sounds[spos] = minetest.sound_play("xdecor_boiling_water", { sounds[spos] = minetest.sound_play("xdecor_boiling_water", {
pos=pos, max_hear_distance=5, gain=0.8, loop=true pos = pos,
max_hear_distance = 5,
gain = 0.8,
loop = true
}) })
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
@ -57,23 +62,25 @@ function cauldron.filling(pos, node, clicker, itemstack)
else else
itemstack:replace("bucket:bucket_water") itemstack:replace("bucket:bucket_water")
end end
minetest.set_node(pos, {name="xdecor:cauldron_empty", param2=node.param2}) minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2})
elseif wield_item:sub(-6) == "_water" and node.name:sub(-6) == "_empty" then elseif wield_item:sub(-6) == "_water" and node.name:sub(-6) == "_empty" then
minetest.set_node(pos, {name="xdecor:cauldron_idle", param2=node.param2}) minetest.set_node(pos, {name = "xdecor:cauldron_idle", param2 = node.param2})
itemstack:replace("bucket:bucket_empty") itemstack:replace("bucket:bucket_empty")
end end
return itemstack return itemstack
end end
end end
function cauldron.idle_timer(pos) function cauldron.idle_timer(pos)
local below_node = {x=pos.x, y=pos.y-1, z=pos.z} local below_node = {x = pos.x, y = pos.y - 1, z = pos.z}
if not minetest.get_node(below_node).name:find("fire") then if not minetest.get_node(below_node).name:find("fire") then
return true return true
end end
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
minetest.set_node(pos, {name="xdecor:cauldron_boiling", param2=node.param2}) minetest.set_node(pos, {name = "xdecor:cauldron_boiling", param2 = node.param2})
return true return true
end end
@ -82,13 +89,17 @@ local function eatable(itemstring)
local item = itemstring:match("[%w_:]+") local item = itemstring:match("[%w_:]+")
local on_use_def = minetest.registered_items[item].on_use local on_use_def = minetest.registered_items[item].on_use
if not on_use_def then return end if not on_use_def then return end
return string.format("%q", string.dump(on_use_def)):find("item_eat") return string.format("%q", string.dump(on_use_def)):find("item_eat")
end end
function cauldron.boiling_timer(pos) function cauldron.boiling_timer(pos)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
local objs = minetest.get_objects_inside_radius(pos, 0.5) local objs = minetest.get_objects_inside_radius(pos, 0.5)
if not next(objs) then return true end
if not next(objs) then
return true
end
local ingredients = {} local ingredients = {}
for _, obj in pairs(objs) do for _, obj in pairs(objs) do
@ -96,23 +107,29 @@ function cauldron.boiling_timer(pos)
local itemstring = obj:get_luaentity().itemstring local itemstring = obj:get_luaentity().itemstring
local food = itemstring:match(":([%w_]+)") local food = itemstring:match(":([%w_]+)")
for _, ingredient in pairs(ingredients_list) do for _, ingredient in ipairs(ingredients_list) do
if food and (eatable(itemstring) or food:find(ingredient)) then if food and (eatable(itemstring) or food:find(ingredient)) then
ingredients[#ingredients+1] = food break ingredients[#ingredients + 1] = food
break
end end
end end
end end
end end
if #ingredients >= 2 then if #ingredients >= 2 then
for _, obj in pairs(objs) do obj:remove() end for _, obj in pairs(objs) do
minetest.set_node(pos, {name="xdecor:cauldron_soup", param2=node.param2}) obj:remove()
end
minetest.set_node(pos, {name = "xdecor:cauldron_soup", param2 = node.param2})
end end
local node_under = {x=pos.x, y=pos.y-1, z=pos.z} local node_under = {x = pos.x, y = pos.y - 1, z = pos.z}
if not minetest.get_node(node_under).name:find("fire") then if not minetest.get_node(node_under).name:find("fire") then
minetest.set_node(pos, {name="xdecor:cauldron_idle", param2=node.param2}) minetest.set_node(pos, {name = "xdecor:cauldron_idle", param2 = node.param2})
end end
return true return true
end end
@ -135,8 +152,9 @@ function cauldron.take_soup(pos, node, clicker, itemstack)
itemstack:replace("xdecor:bowl_soup 1") itemstack:replace("xdecor:bowl_soup 1")
end end
minetest.set_node(pos, {name="xdecor:cauldron_empty", param2=node.param2}) minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2})
end end
return itemstack return itemstack
end end
@ -146,11 +164,11 @@ xdecor.register("cauldron_empty", {
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
tiles = {"xdecor_cauldron_top_empty.png", "xdecor_cauldron_sides.png"}, tiles = {"xdecor_cauldron_top_empty.png", "xdecor_cauldron_sides.png"},
infotext = "Cauldron (empty)", infotext = "Cauldron (empty)",
collision_box = xdecor.pixelbox(16, cauldron.cbox),
on_rightclick = cauldron.filling,
on_construct = function(pos) on_construct = function(pos)
cauldron.stop_sound(pos) cauldron.stop_sound(pos)
end, end,
on_rightclick = cauldron.filling,
collision_box = xdecor.pixelbox(16, cauldron.cbox)
}) })
xdecor.register("cauldron_idle", { xdecor.register("cauldron_idle", {
@ -162,7 +180,7 @@ xdecor.register("cauldron_idle", {
collision_box = xdecor.pixelbox(16, cauldron.cbox), collision_box = xdecor.pixelbox(16, cauldron.cbox),
on_rightclick = cauldron.filling, on_rightclick = cauldron.filling,
on_construct = cauldron.idle_construct, on_construct = cauldron.idle_construct,
on_timer = cauldron.idle_timer on_timer = cauldron.idle_timer,
}) })
xdecor.register("cauldron_boiling", { xdecor.register("cauldron_boiling", {
@ -171,32 +189,40 @@ xdecor.register("cauldron_boiling", {
drop = "xdecor:cauldron_empty", drop = "xdecor:cauldron_empty",
infotext = "Cauldron (active) - Drop foods inside to make a soup", infotext = "Cauldron (active) - Drop foods inside to make a soup",
damage_per_second = 2, damage_per_second = 2,
tiles = {{name="xdecor_cauldron_top_anim_boiling_water.png", tiles = {
animation={type="vertical_frames", length=3.0}}, {
"xdecor_cauldron_sides.png"}, 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), collision_box = xdecor.pixelbox(16, cauldron.cbox),
on_rightclick = cauldron.filling, on_rightclick = cauldron.filling,
on_construct = cauldron.boiling_construct, on_construct = cauldron.boiling_construct,
on_timer = cauldron.boiling_timer,
on_destruct = function(pos) on_destruct = function(pos)
cauldron.stop_sound(pos) cauldron.stop_sound(pos)
end, end,
on_timer = cauldron.boiling_timer
}) })
xdecor.register("cauldron_soup", { xdecor.register("cauldron_soup", {
groups = {cracky=2, oddly_breakable_by_hand=1, not_in_creative_inventory=1}, groups = {cracky = 2, oddly_breakable_by_hand = 1, not_in_creative_inventory = 1},
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
drop = "xdecor:cauldron_empty", drop = "xdecor:cauldron_empty",
infotext = "Cauldron (active) - Use a bowl to eat the soup", infotext = "Cauldron (active) - Use a bowl to eat the soup",
damage_per_second = 2, damage_per_second = 2,
tiles = {{name="xdecor_cauldron_top_anim_soup.png", tiles = {
animation={type="vertical_frames", length=3.0}}, {
"xdecor_cauldron_sides.png"}, 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), collision_box = xdecor.pixelbox(16, cauldron.cbox),
on_rightclick = cauldron.take_soup, on_rightclick = cauldron.take_soup,
on_destruct = function(pos) on_destruct = function(pos)
cauldron.stop_sound(pos) cauldron.stop_sound(pos)
end end,
}) })
-- Craft items -- Craft items

View File

@ -1,5 +1,6 @@
screwdriver = screwdriver or {} screwdriver = screwdriver or {}
local ceil, abs, random = math.ceil, math.abs, math.random local ceil, abs, random = math.ceil, math.abs, math.random
local reg_tools = minetest.registered_tools
-- Cost in Mese crystal(s) for enchanting. -- Cost in Mese crystal(s) for enchanting.
local mese_cost = 1 local mese_cost = 1
@ -11,13 +12,17 @@ local enchanting = {
damages = 1, -- Sharpness damages = 1, -- Sharpness
} }
local function cap(S) return S:gsub("^%l", string.upper) end local function cap(S) return
S:gsub("^%l", string.upper)
end
local function to_percent(orig_value, final_value) local function to_percent(orig_value, final_value)
return abs(ceil(((final_value - orig_value) / orig_value) * 100)) return abs(ceil(((final_value - orig_value) / orig_value) * 100))
end end
function enchanting:get_tooltip(enchant, orig_caps, fleshy) function enchanting:get_tooltip(enchant, orig_caps, fleshy)
local bonus = {durable=0, efficiency=0, damages=0} local bonus = {durable = 0, efficiency = 0, damages = 0}
if orig_caps then if orig_caps then
bonus.durable = to_percent(orig_caps.uses, orig_caps.uses * enchanting.uses) bonus.durable = to_percent(orig_caps.uses, orig_caps.uses * enchanting.uses)
local sum_caps_times = 0 local sum_caps_times = 0
@ -28,23 +33,25 @@ function enchanting:get_tooltip(enchant, orig_caps, fleshy)
bonus.efficiency = to_percent(average_caps_time, average_caps_time - bonus.efficiency = to_percent(average_caps_time, average_caps_time -
enchanting.times) enchanting.times)
end end
if fleshy then if fleshy then
bonus.damages = to_percent(fleshy, fleshy + enchanting.damages) bonus.damages = to_percent(fleshy, fleshy + enchanting.damages)
end end
local specs = { -- not finished, to complete local specs = { -- not finished, to complete
durable = {"#00baff", " (+"..bonus.durable.."%)"}, durable = {"#00baff", " (+" .. bonus.durable .. "%)"},
fast = {"#74ff49", " (+"..bonus.efficiency.."%)"}, fast = {"#74ff49", " (+" .. bonus.efficiency .. "%)"},
sharp = {"#ffff00", " (+"..bonus.damages.."%)"}, sharp = {"#ffff00", " (+" .. bonus.damages .. "%)"},
} }
return minetest.colorize and minetest.colorize(specs[enchant][1], return minetest.colorize and minetest.colorize(specs[enchant][1],
"\n"..cap(enchant)..specs[enchant][2]) or "\n" .. cap(enchant) .. specs[enchant][2]) or
"\n"..cap(enchant)..specs[enchant][2] "\n" .. cap(enchant) .. specs[enchant][2]
end end
local enchant_buttons = { local enchant_buttons = {
[[ image_button[3.9,0.85;4,0.92;bg_btn.png;fast;Efficiency] "image_button[3.9,0.85;4,0.92;bg_btn.png;fast;Efficiency]" ..
image_button[3.9,1.77;4,1.12;bg_btn.png;durable;Durability] ]], "image_button[3.9,1.77;4,1.12;bg_btn.png;durable;Durability]",
"image_button[3.9,2.9;4,0.92;bg_btn.png;sharp;Sharpness]", "image_button[3.9,2.9;4,0.92;bg_btn.png;sharp;Sharpness]",
} }
@ -63,10 +70,10 @@ function enchanting.formspec(pos, num)
image[2,2.9;1,1;mese_layout.png] image[2,2.9;1,1;mese_layout.png]
tooltip[sharp;Your weapon inflicts more damages] tooltip[sharp;Your weapon inflicts more damages]
tooltip[durable;Your tool last longer] tooltip[durable;Your tool last longer]
tooltip[fast;Your tool digs faster] ]] tooltip[fast;Your tool digs faster] ]] ..
..default.gui_slots..default.get_hotbar_bg(0.5,4.5) default.gui_slots .. default.get_hotbar_bg(0.5,4.5)
formspec = formspec..(enchant_buttons[num] or "") formspec = formspec .. (enchant_buttons[num] or "")
meta:set_string("formspec", formspec) meta:set_string("formspec", formspec)
end end
@ -78,7 +85,7 @@ function enchanting.on_put(pos, listname, _, stack)
"sword", "sword",
} }
for idx, tools in pairs(tool_groups) do for idx, tools in ipairs(tool_groups) do
if tools:find(stackname:match(":(%w+)")) then if tools:find(stackname:match(":(%w+)")) then
enchanting.formspec(pos, idx) enchanting.formspec(pos, idx)
end end
@ -93,11 +100,14 @@ function enchanting.fields(pos, _, fields, sender)
local mese = inv:get_stack("mese", 1) local mese = inv:get_stack("mese", 1)
local orig_wear = tool:get_wear() local orig_wear = tool:get_wear()
local mod, name = tool:get_name():match("(.*):(.*)") local mod, name = tool:get_name():match("(.*):(.*)")
local enchanted_tool = (mod or "")..":enchanted_"..(name or "").."_"..next(fields) local enchanted_tool = (mod or "") .. ":enchanted_" .. (name or "") .. "_" .. next(fields)
if mese:get_count() >= mese_cost and minetest.registered_tools[enchanted_tool] then if mese:get_count() >= mese_cost and reg_tools[enchanted_tool] then
minetest.sound_play("xdecor_enchanting", { minetest.sound_play("xdecor_enchanting", {
to_player=sender:get_player_name(), gain=0.8}) to_player = sender:get_player_name(),
gain = 0.8
})
tool:replace(enchanted_tool) tool:replace(enchanted_tool)
tool:add_wear(orig_wear) tool:add_wear(orig_wear)
mese:take_item(mese_cost) mese:take_item(mese_cost)
@ -112,11 +122,13 @@ function enchanting.dig(pos)
end end
local function allowed(tool) local function allowed(tool)
if not tool then return false end if not tool then return end
for item in pairs(minetest.registered_tools) do
if item:find("enchanted_"..tool) then return true end for item in pairs(reg_tools) do
if item:find("enchanted_" .. tool) then
return true
end
end end
return false
end end
function enchanting.put(_, listname, _, stack) function enchanting.put(_, listname, _, stack)
@ -126,23 +138,26 @@ function enchanting.put(_, listname, _, stack)
elseif listname == "tool" and allowed(stackname:match("[^:]+$")) then elseif listname == "tool" and allowed(stackname:match("[^:]+$")) then
return 1 return 1
end end
return 0 return 0
end end
function enchanting.on_take(pos, listname) function enchanting.on_take(pos, listname)
if listname == "tool" then enchanting.formspec(pos, nil) end if listname == "tool" then
enchanting.formspec(pos)
end
end end
function enchanting.construct(pos) function enchanting.construct(pos)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
meta:set_string("infotext", "Enchantment Table") meta:set_string("infotext", "Enchantment Table")
enchanting.formspec(pos, nil) enchanting.formspec(pos)
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size("tool", 1) inv:set_size("tool", 1)
inv:set_size("mese", 1) inv:set_size("mese", 1)
minetest.add_entity({x=pos.x, y=pos.y+0.85, z=pos.z}, "xdecor:book_open") minetest.add_entity({x = pos.x, y = pos.y + 0.85, z = pos.z}, "xdecor:book_open")
local timer = minetest.get_node_timer(pos) local timer = minetest.get_node_timer(pos)
timer:start(0.5) timer:start(0.5)
end end
@ -160,39 +175,45 @@ end
function enchanting.timer(pos) function enchanting.timer(pos)
local num = #minetest.get_objects_inside_radius(pos, 0.9) local num = #minetest.get_objects_inside_radius(pos, 0.9)
if num == 0 then if num == 0 then
minetest.add_entity({x=pos.x, y=pos.y+0.85, z=pos.z}, "xdecor:book_open") minetest.add_entity({x = pos.x, y = pos.y + 0.85, z = pos.z}, "xdecor:book_open")
end end
local minp = {x=pos.x-2, y=pos.y, z=pos.z-2} 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 maxp = {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2}
local bookshelves = minetest.find_nodes_in_area(minp, maxp, "default:bookshelf") local bookshelves = minetest.find_nodes_in_area(minp, maxp, "default:bookshelf")
if #bookshelves == 0 then return true end if #bookshelves == 0 then
return true
end
local bookshelf_pos = bookshelves[random(1, #bookshelves)] local bookshelf_pos = bookshelves[random(1, #bookshelves)]
local x = pos.x - bookshelf_pos.x local x = pos.x - bookshelf_pos.x
local y = bookshelf_pos.y - pos.y local y = bookshelf_pos.y - pos.y
local z = pos.z - bookshelf_pos.z local z = pos.z - bookshelf_pos.z
if tostring(x..z):find(2) then if tostring(x .. z):find(2) then
minetest.add_particle({ minetest.add_particle({
pos = bookshelf_pos, pos = bookshelf_pos,
velocity = {x=x, y=2-y, z=z}, velocity = {x = x, y = 2 - y, z = z},
acceleration = {x=0, y=-2.2, z=0}, acceleration = {x = 0, y = -2.2, z = 0},
expirationtime = 1, expirationtime = 1,
size = 1.5, size = 1.5,
glow = 5, glow = 5,
texture = "xdecor_glyph"..random(1,18)..".png" texture = "xdecor_glyph" .. random(1,18) .. ".png"
}) })
end end
return true return true
end end
xdecor.register("enchantment_table", { xdecor.register("enchantment_table", {
description = "Enchantment Table", description = "Enchantment Table",
tiles = {"xdecor_enchantment_top.png", "xdecor_enchantment_bottom.png", tiles = {
"xdecor_enchantment_side.png", "xdecor_enchantment_side.png", "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}, "xdecor_enchantment_side.png", "xdecor_enchantment_side.png"
},
groups = {cracky = 1, level = 1},
light_source = 6, light_source = 6,
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
@ -204,7 +225,9 @@ xdecor.register("enchantment_table", {
on_metadata_inventory_put = enchanting.on_put, on_metadata_inventory_put = enchanting.on_put,
on_metadata_inventory_take = enchanting.on_take, on_metadata_inventory_take = enchanting.on_take,
allow_metadata_inventory_put = enchanting.put, allow_metadata_inventory_put = enchanting.put,
allow_metadata_inventory_move = function() return 0 end allow_metadata_inventory_move = function()
return 0
end,
}) })
minetest.register_entity("xdecor:book_open", { minetest.register_entity("xdecor:book_open", {
@ -215,7 +238,7 @@ minetest.register_entity("xdecor:book_open", {
textures = {"xdecor_book_open.png"}, textures = {"xdecor_book_open.png"},
on_activate = function(self) on_activate = function(self)
local pos = self.object:getpos() local pos = self.object:getpos()
local pos_under = {x=pos.x, y=pos.y-1, z=pos.z} local pos_under = {x = pos.x, y = pos.y - 1, z = pos.z}
if minetest.get_node(pos_under).name ~= "xdecor:enchantment_table" then if minetest.get_node(pos_under).name ~= "xdecor:enchantment_table" then
self.object:remove() self.object:remove()
@ -227,7 +250,7 @@ function enchanting:register_tools(mod, def)
for tool in pairs(def.tools) do for tool in pairs(def.tools) do
for material in def.materials:gmatch("[%w_]+") do for material in def.materials:gmatch("[%w_]+") do
for enchant in def.tools[tool].enchants:gmatch("[%w_]+") do for enchant in def.tools[tool].enchants:gmatch("[%w_]+") do
local original_tool = minetest.registered_tools[mod..":"..tool.."_"..material] local original_tool = reg_tools[mod .. ":" .. tool .. "_" .. material]
if not original_tool then break end if not original_tool then break end
local original_toolcaps = original_tool.tool_capabilities local original_toolcaps = original_tool.tool_capabilities
@ -251,12 +274,12 @@ function enchanting:register_tools(mod, def)
fleshy = fleshy + enchanting.damages fleshy = fleshy + enchanting.damages
end end
minetest.register_tool(":"..mod..":enchanted_"..tool.."_"..material.."_"..enchant, { minetest.register_tool(":" .. mod .. ":enchanted_" .. tool .. "_" .. material .. "_" .. enchant, {
description = "Enchanted "..cap(material).." "..cap(tool).. description = "Enchanted " .. cap(material) .. " " .. cap(tool) ..
self:get_tooltip(enchant, original_groupcaps[group], fleshy), self:get_tooltip(enchant, original_groupcaps[group], fleshy),
inventory_image = original_tool.inventory_image.."^[colorize:violet:50", inventory_image = original_tool.inventory_image .. "^[colorize:violet:50",
wield_image = original_tool.wield_image, wield_image = original_tool.wield_image,
groups = {not_in_creative_inventory=1}, groups = {not_in_creative_inventory = 1},
tool_capabilities = { tool_capabilities = {
groupcaps = groupcaps, damage_groups = {fleshy = fleshy}, groupcaps = groupcaps, damage_groups = {fleshy = fleshy},
full_punch_interval = full_punch_interval, full_punch_interval = full_punch_interval,
@ -288,4 +311,4 @@ minetest.register_craft({
{"default:diamond", "default:obsidian", "default:diamond"}, {"default:diamond", "default:obsidian", "default:diamond"},
{"default:obsidian", "default:obsidian", "default:obsidian"} {"default:obsidian", "default:obsidian", "default:obsidian"}
} }
}) })

View File

@ -12,8 +12,8 @@ function hive.construct(pos)
list[context;honey;5,0;1,1;] list[context;honey;5,0;1,1;]
list[current_player;main;0,1.35;8,4;] list[current_player;main;0,1.35;8,4;]
listring[current_player;main] listring[current_player;main]
listring[context;honey] ]] listring[context;honey] ]] ..
..xbg..default.get_hotbar_bg(0,1.35) xbg .. default.get_hotbar_bg(0,1.35)
meta:set_string("formspec", formspec) meta:set_string("formspec", formspec)
meta:set_string("infotext", "Artificial Hive") meta:set_string("infotext", "Artificial Hive")
@ -25,7 +25,9 @@ end
function hive.timer(pos) function hive.timer(pos)
local time = (minetest.get_timeofday() or 0) * 24000 local time = (minetest.get_timeofday() or 0) * 24000
if time < 5500 or time > 18500 then return true end if time < 5500 or time > 18500 then
return true
end
local inv = minetest.get_meta(pos):get_inventory() local inv = minetest.get_meta(pos):get_inventory()
local honeystack = inv:get_stack("honey", 1) local honeystack = inv:get_stack("honey", 1)
@ -40,8 +42,10 @@ function hive.timer(pos)
inv:add_item("honey", "xdecor:honey") inv:add_item("honey", "xdecor:honey")
elseif honey == honey_max then elseif honey == honey_max then
local timer = minetest.get_node_timer(pos) local timer = minetest.get_node_timer(pos)
timer:stop() return true timer:stop()
return true
end end
return true return true
end end
@ -53,14 +57,20 @@ xdecor.register("hive", {
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=1}, groups = {choppy=3, oddly_breakable_by_hand=2, flammable=1},
on_construct = hive.construct, on_construct = hive.construct,
on_timer = hive.timer, on_timer = hive.timer,
can_dig = function(pos) can_dig = function(pos)
local inv = minetest.get_meta(pos):get_inventory() local inv = minetest.get_meta(pos):get_inventory()
return inv:is_empty("honey") return inv:is_empty("honey")
end, end,
on_punch = function(_, _, puncher) on_punch = function(_, _, puncher)
puncher:set_hp(puncher:get_hp() - 2) puncher:set_hp(puncher:get_hp() - 2)
end, end,
allow_metadata_inventory_put = function() return 0 end,
allow_metadata_inventory_put = function()
return 0
end,
on_metadata_inventory_take = function(pos, _, _, stack) on_metadata_inventory_take = function(pos, _, _, stack)
if stack:get_count() == honey_max then if stack:get_count() == honey_max then
local timer = minetest.get_node_timer(pos) local timer = minetest.get_node_timer(pos)
@ -75,8 +85,13 @@ minetest.register_craftitem("xdecor:honey", {
description = "Honey", description = "Honey",
inventory_image = "xdecor_honey.png", inventory_image = "xdecor_honey.png",
wield_image = "xdecor_honey.png", wield_image = "xdecor_honey.png",
groups = {food_honey = 1, food_sugar = 1, flammable = 2, not_in_creative_inventory=1}, on_use = minetest.item_eat(2),
on_use = minetest.item_eat(2) groups = {
food_honey = 1,
food_sugar = 1,
flammable = 2,
not_in_creative_inventory = 1,
},
}) })
-- Recipes -- Recipes

View File

@ -6,15 +6,18 @@ local function remove_item(pos, node)
if not objs then return end if not objs then return end
for _, obj in pairs(objs) do for _, obj in pairs(objs) do
if obj and obj:get_luaentity() and local ent = obj:get_luaentity()
obj:get_luaentity().name == "xdecor:f_item" then if obj and ent and ent.name == "xdecor:f_item" then
obj:remove() break obj:remove() break
end end
end end
end end
local facedir = { 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} [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) local function update_item(pos, node)
@ -29,8 +32,8 @@ local function update_item(pos, node)
tmp.texture = ItemStack(itemstring):get_name() tmp.texture = ItemStack(itemstring):get_name()
local entity = minetest.add_entity(pos, "xdecor:f_item") local entity = minetest.add_entity(pos, "xdecor:f_item")
local yaw = math.pi*2 - node.param2 * math.pi/2 local yaw = (math.pi * 2) - node.param2 * (math.pi / 2)
entity:setyaw(yaw) entity:set_yaw(yaw)
local timer = minetest.get_node_timer(pos) local timer = minetest.get_node_timer(pos)
timer:start(15.0) timer:start(15.0)
@ -53,7 +56,7 @@ function itemframe.after_place(pos, placer, itemstack)
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local name = placer:get_player_name() local name = placer:get_player_name()
meta:set_string("owner", name) meta:set_string("owner", name)
meta:set_string("infotext", "Item Frame (owned by "..name..")") meta:set_string("infotext", "Item Frame (owned by " .. name .. ")")
end end
function itemframe.timer(pos) function itemframe.timer(pos)
@ -64,6 +67,7 @@ function itemframe.timer(pos)
if num == 0 and meta:get_string("item") ~= "" then if num == 0 and meta:get_string("item") ~= "" then
update_item(pos, node) update_item(pos, node)
end end
return true return true
end end
@ -91,8 +95,9 @@ function itemframe.punch(pos, node, puncher)
local owner = meta:get_string("owner") local owner = meta:get_string("owner")
local admin = minetest.check_player_privs(player_name, "protection_bypass") local admin = minetest.check_player_privs(player_name, "protection_bypass")
if not admin and player_name ~= owner then return end if admin and player_name == owner then
drop_item(pos, node) drop_item(pos, node)
end
end end
function itemframe.dig(pos, player) function itemframe.dig(pos, player)
@ -107,14 +112,16 @@ end
xdecor.register("itemframe", { xdecor.register("itemframe", {
description = "Item Frame", description = "Item Frame",
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=3}, groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
on_rotate = screwdriver.disallow, on_rotate = screwdriver.disallow,
sunlight_propagates = true, sunlight_propagates = true,
inventory_image = "xdecor_itemframe.png", inventory_image = "xdecor_itemframe.png",
node_box = xdecor.nodebox.slab_z(0.9375), node_box = xdecor.nodebox.slab_z(0.9375),
tiles = {"xdecor_wood.png", "xdecor_wood.png", "xdecor_wood.png", tiles = {
"xdecor_wood.png", "xdecor_wood.png", "xdecor_itemframe.png"}, "xdecor_wood.png", "xdecor_wood.png", "xdecor_wood.png",
"xdecor_wood.png", "xdecor_wood.png", "xdecor_itemframe.png"
},
after_place_node = itemframe.after_place, after_place_node = itemframe.after_place,
on_timer = itemframe.timer, on_timer = itemframe.timer,
on_rightclick = itemframe.rightclick, on_rightclick = itemframe.rightclick,
@ -125,12 +132,12 @@ xdecor.register("itemframe", {
minetest.register_entity("xdecor:f_item", { minetest.register_entity("xdecor:f_item", {
visual = "wielditem", visual = "wielditem",
visual_size = {x=0.33, y=0.33}, visual_size = {x = 0.33, y = 0.33},
collisionbox = {0}, collisionbox = {0},
physical = false, physical = false,
textures = {"air"}, textures = {"air"},
on_activate = function(self, staticdata) on_activate = function(self, staticdata)
local pos = self.object:getpos() local pos = self.object:get_pos()
if minetest.get_node(pos).name ~= "xdecor:itemframe" then if minetest.get_node(pos).name ~= "xdecor:itemframe" then
self.object:remove() self.object:remove()
end end
@ -148,13 +155,16 @@ minetest.register_entity("xdecor:f_item", {
end end
end end
if self.texture then if self.texture then
self.object:set_properties({textures={self.texture}}) self.object:set_properties({
textures = {self.texture}
})
end end
end, end,
get_staticdata = function(self) get_staticdata = function(self)
if self.nodename and self.texture then if self.nodename and self.texture then
return self.nodename..";"..self.texture return self.nodename .. ";" .. self.texture
end end
return "" return ""
end end
}) })

View File

@ -2,17 +2,25 @@ local mailbox = {}
screwdriver = screwdriver or {} screwdriver = screwdriver or {}
local function get_img(img) local function get_img(img)
if not img then return end
local img_name = img:match("(.*)%.png") local img_name = img:match("(.*)%.png")
if img_name then return img_name..".png" end
if img_name then
return img_name .. ".png"
end
end end
local function img_col(stack) local function img_col(stack)
local def = minetest.registered_items[stack] local def = minetest.registered_items[stack]
if not def then return "" end if not def then
return ""
end
if def.inventory_image ~= "" then if def.inventory_image ~= "" then
local img = get_img(def.inventory_image) local img = get_img(def.inventory_image)
if img then return img end if img then
return img
end
end end
if def.tiles then if def.tiles then
@ -22,30 +30,34 @@ local function img_col(stack)
elseif type(tile) == "string" then elseif type(tile) == "string" then
img = get_img(tile) img = get_img(tile)
end end
if img then return img end
if img then
return img
end
end end
return "" return ""
end end
function mailbox:formspec(pos, owner, is_owner) function mailbox:formspec(pos, owner, is_owner)
local spos = pos.x..","..pos.y..","..pos.z local spos = pos.x .. "," .. pos.y .. "," .. pos.z
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local giver, img = "", "" local giver, img = "", ""
if is_owner then if is_owner then
for i = 1, 7 do for i = 1, 7 do
local giving = meta:get_string("giver"..i) local giving = meta:get_string("giver" .. i)
if giving ~= "" then if giving ~= "" then
local stack = meta:get_string("stack"..i) local stack = meta:get_string("stack" .. i)
local giver_name = giving:sub(1,12) local giver_name = giving:sub(1,12)
local stack_name = stack:match("[%w_:]+") local stack_name = stack:match("[%w_:]+")
local stack_count = stack:match("%s(%d+)") or 1 local stack_count = stack:match("%s(%d+)") or 1
giver = giver.."#FFFF00,"..giver_name..","..i.. giver = giver .. "#FFFF00," .. giver_name .. "," .. i ..
",#FFFFFF,x "..stack_count.."," ",#FFFFFF,x " .. stack_count .. ","
img = img..i.."="..
img_col(stack_name).."^\\[resize:16x16," img = img .. i .. "=" ..
img_col(stack_name) .. "^\\[resize:16x16,"
end end
end end
@ -55,20 +67,21 @@ function mailbox:formspec(pos, owner, is_owner)
box[6,0.72;3.3,3.5;#555555] box[6,0.72;3.3,3.5;#555555]
listring[current_player;main] listring[current_player;main]
list[current_player;main;0.75,5.25;8,4;] list[current_player;main;0.75,5.25;8,4;]
tableoptions[background=#00000000;highlight=#00000000;border=false] ]].. tableoptions[background=#00000000;highlight=#00000000;border=false] ]] ..
"tablecolumns[color;text;image,"..img.."0;color;text]".. "tablecolumns[color;text;image," .. img .. "0;color;text]" ..
"table[6,0.75;3.3,4;givers;"..giver.."]".. "table[6,0.75;3.3,4;givers;" .. giver .. "]" ..
"list[nodemeta:"..spos..";mailbox;0,0.75;6,4;]".. "list[nodemeta:" .. spos .. ";mailbox;0,0.75;6,4;]" ..
"listring[nodemeta:"..spos..";mailbox]".. "listring[nodemeta:" .. spos .. ";mailbox]" ..
xbg..default.get_hotbar_bg(0.75,5.25) xbg .. default.get_hotbar_bg(0.75, 5.25)
end end
return [[ size[8,5]
list[current_player;main;0,1.25;8,4;] ]].. return "size[8,5]" ..
"label[0,0;Send your goods to\n".. "list[current_player;main;0,1.25;8,4;]" ..
"label[0,0;Send your goods to\n" ..
(minetest.colorize and (minetest.colorize and
minetest.colorize("#FFFF00", owner) or owner).."]".. minetest.colorize("#FFFF00", owner) or owner) .. "]" ..
"list[nodemeta:"..spos..";drop;3.5,0;1,1;]".. "list[nodemeta:" .. spos .. ";drop;3.5,0;1,1;]" ..
xbg..default.get_hotbar_bg(0,1.25) xbg .. default.get_hotbar_bg(0, 1.25)
end end
function mailbox.dig(pos, player) function mailbox.dig(pos, player)
@ -85,10 +98,10 @@ function mailbox.after_place_node(pos, placer)
local player_name = placer:get_player_name() local player_name = placer:get_player_name()
meta:set_string("owner", player_name) meta:set_string("owner", player_name)
meta:set_string("infotext", player_name.."'s Mailbox") meta:set_string("infotext", player_name .. "'s Mailbox")
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size("mailbox", 6*4) inv:set_size("mailbox", 6 * 4)
inv:set_size("drop", 1) inv:set_size("drop", 1)
end end
@ -97,8 +110,9 @@ function mailbox.rightclick(pos, node, clicker, itemstack, pointed_thing)
local player = clicker:get_player_name() local player = clicker:get_player_name()
local owner = meta:get_string("owner") local owner = meta:get_string("owner")
minetest.show_formspec(player, "xdecor:mailbox", mailbox:formspec(pos, minetest.show_formspec(player, "xdecor:mailbox",
owner, (player == owner))) mailbox:formspec(pos, owner, (player == owner)))
return itemstack return itemstack
end end
@ -109,9 +123,10 @@ function mailbox.put(pos, listname, _, stack, player)
return -1 return -1
else else
minetest.chat_send_player(player:get_player_name(), minetest.chat_send_player(player:get_player_name(),
"The mailbox is full") "The mailbox is full")
end end
end end
return 0 return 0
end end
@ -124,8 +139,8 @@ function mailbox.on_put(pos, listname, _, stack, player)
inv:add_item("mailbox", stack) inv:add_item("mailbox", stack)
for i = 7, 2, -1 do for i = 7, 2, -1 do
meta:set_string("giver"..i, meta:get_string("giver"..(i-1))) meta:set_string("giver" .. i, meta:get_string("giver" .. (i - 1)))
meta:set_string("stack"..i, meta:get_string("stack"..(i-1))) meta:set_string("stack" .. i, meta:get_string("stack" .. (i - 1)))
end end
meta:set_string("giver1", player:get_player_name()) meta:set_string("giver1", player:get_player_name())
@ -139,6 +154,7 @@ function mailbox.allow_take(pos, listname, index, stack, player)
if player:get_player_name() ~= meta:get_string("owner") then if player:get_player_name() ~= meta:get_string("owner") then
return 0 return 0
end end
return stack:get_count() return stack:get_count()
end end
@ -151,7 +167,7 @@ xdecor.register("mailbox", {
tiles = {"xdecor_mailbox_top.png", "xdecor_mailbox_bottom.png", tiles = {"xdecor_mailbox_top.png", "xdecor_mailbox_bottom.png",
"xdecor_mailbox_side.png", "xdecor_mailbox_side.png", "xdecor_mailbox_side.png", "xdecor_mailbox_side.png",
"xdecor_mailbox.png", "xdecor_mailbox.png"}, "xdecor_mailbox.png", "xdecor_mailbox.png"},
groups = {cracky=3, oddly_breakable_by_hand=1}, groups = {cracky = 3, oddly_breakable_by_hand = 1},
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
can_dig = mailbox.dig, can_dig = mailbox.dig,
on_rightclick = mailbox.rightclick, on_rightclick = mailbox.rightclick,

View File

@ -12,14 +12,14 @@ local function door_toggle(pos_actuator, pos_door, player)
if actuator.name:sub(-4) == "_off" then if actuator.name:sub(-4) == "_off" then
minetest.set_node(pos_actuator, minetest.set_node(pos_actuator,
{name=actuator.name:gsub("_off", "_on"), param2=actuator.param2}) {name = actuator.name:gsub("_off", "_on"), param2 = actuator.param2})
end end
door:open(player) door:open(player)
minetest.after(2, function() minetest.after(2, function()
if minetest.get_node(pos_actuator).name:sub(-3) == "_on" then if minetest.get_node(pos_actuator).name:sub(-3) == "_on" then
minetest.set_node(pos_actuator, minetest.set_node(pos_actuator,
{name=actuator.name, param2=actuator.param2}) {name = actuator.name, param2 = actuator.param2})
end end
-- Re-get player object (or nil) because 'player' could -- Re-get player object (or nil) because 'player' could
-- be an invalid object at this time (player left) -- be an invalid object at this time (player left)
@ -35,25 +35,27 @@ end
function plate.timer(pos) function plate.timer(pos)
local objs = minetest.get_objects_inside_radius(pos, 0.8) local objs = minetest.get_objects_inside_radius(pos, 0.8)
if not next(objs) or not doors.get then return true end 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 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") local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
for _, player in pairs(objs) do for _, player in pairs(objs) do
if player:is_player() then if player:is_player() then
for i=1, #doors do for i = 1, #doors do
door_toggle(pos, doors[i], player) door_toggle(pos, doors[i], player)
end end
break break
end end
end end
return true return true
end end
function plate.register(material, desc, def) function plate.register(material, desc, def)
xdecor.register("pressure_"..material.."_off", { xdecor.register("pressure_" .. material .. "_off", {
description = desc.." Pressure Plate", description = desc .. " Pressure Plate",
tiles = {"xdecor_pressure_"..material..".png"}, tiles = {"xdecor_pressure_" .. material .. ".png"},
drawtype = "nodebox", drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 1, 14}}), node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 1, 14}}),
groups = def.groups, groups = def.groups,
@ -63,13 +65,13 @@ function plate.register(material, desc, def)
on_construct = plate.construct, on_construct = plate.construct,
on_timer = plate.timer on_timer = plate.timer
}) })
xdecor.register("pressure_"..material.."_on", { xdecor.register("pressure_" .. material .. "_on", {
tiles = {"xdecor_pressure_"..material..".png"}, tiles = {"xdecor_pressure_" .. material .. ".png"},
drawtype = "nodebox", drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 0.4, 14}}), node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 0.4, 14}}),
groups = def.groups, groups = def.groups,
sounds = def.sounds, sounds = def.sounds,
drop = "xdecor:pressure_"..material.."_off", drop = "xdecor:pressure_" .. material .. "_off",
sunlight_propagates = true, sunlight_propagates = true,
on_rotate = screwdriver.rotate_simple on_rotate = screwdriver.rotate_simple
}) })
@ -77,12 +79,12 @@ end
plate.register("wood", "Wooden", { plate.register("wood", "Wooden", {
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2} groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2}
}) })
plate.register("stone", "Stone", { plate.register("stone", "Stone", {
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
groups = {cracky=3, oddly_breakable_by_hand=2} groups = {cracky = 3, oddly_breakable_by_hand = 2}
}) })
xdecor.register("lever_off", { xdecor.register("lever_off", {
@ -90,19 +92,21 @@ xdecor.register("lever_off", {
tiles = {"xdecor_lever_off.png"}, tiles = {"xdecor_lever_off.png"},
drawtype = "nodebox", drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}), node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}),
groups = {cracky=3, oddly_breakable_by_hand=2}, groups = {cracky = 3, oddly_breakable_by_hand = 2},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
sunlight_propagates = true, sunlight_propagates = true,
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
on_rightclick = function(pos, node, clicker, itemstack) on_rightclick = function(pos, node, clicker, itemstack)
if not doors.get then return itemstack end if not doors.get then return itemstack end
local minp = {x=pos.x-2, y=pos.y-1, z=pos.z-2} 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 maxp = {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2}
local doors = minetest.find_nodes_in_area(minp, maxp, "group:door") local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
for i=1, #doors do for i = 1, #doors do
door_toggle(pos, doors[i], clicker) door_toggle(pos, doors[i], clicker)
end end
return itemstack return itemstack
end end
}) })
@ -111,7 +115,7 @@ xdecor.register("lever_on", {
tiles = {"xdecor_lever_on.png"}, tiles = {"xdecor_lever_on.png"},
drawtype = "nodebox", drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}), node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}),
groups = {cracky=3, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, groups = {cracky = 3, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
sunlight_propagates = true, sunlight_propagates = true,
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
@ -138,4 +142,4 @@ minetest.register_craft({
{"group:stick"}, {"group:stick"},
{"group:stone"} {"group:stone"}
} }
}) })

View File

@ -3,12 +3,12 @@ screwdriver = screwdriver or {}
local function register_pane(name, desc, def) local function register_pane(name, desc, def)
xpanes.register_pane(name, { xpanes.register_pane(name, {
description = desc, description = desc,
tiles = {"xdecor_"..name..".png"}, tiles = {"xdecor_" .. name .. ".png"},
drawtype = "airlike", drawtype = "airlike",
paramtype = "light", paramtype = "light",
textures = {"xdecor_"..name..".png", "xdecor_"..name..".png", "xpanes_space.png"}, textures = {"xdecor_" .. name .. ".png", "xdecor_" .. name .. ".png", "xpanes_space.png"},
inventory_image = "xdecor_"..name..".png", inventory_image = "xdecor_" .. name .. ".png",
wield_image = "xdecor_"..name..".png", wield_image = "xdecor_" .. name .. ".png",
groups = def.groups, groups = def.groups,
sounds = def.sounds or default.node_sound_defaults(), sounds = def.sounds or default.node_sound_defaults(),
recipe = def.recipe recipe = def.recipe
@ -16,33 +16,41 @@ local function register_pane(name, desc, def)
end end
register_pane("bamboo_frame", "Bamboo Frame", { register_pane("bamboo_frame", "Bamboo Frame", {
groups = {choppy=3, oddly_breakable_by_hand=2, pane=1, flammable=2}, groups = {choppy = 3, oddly_breakable_by_hand = 2, pane = 1, flammable = 2},
recipe = {{"default:papyrus", "default:papyrus", "default:papyrus"}, recipe = {
{"default:papyrus", "farming:cotton", "default:papyrus"}, {"default:papyrus", "default:papyrus", "default:papyrus"},
{"default:papyrus", "default:papyrus", "default:papyrus"}} {"default:papyrus", "farming:cotton", "default:papyrus"},
{"default:papyrus", "default:papyrus", "default:papyrus"}
}
}) })
register_pane("chainlink", "Chainlink", { register_pane("chainlink", "Chainlink", {
groups = {cracky=3, oddly_breakable_by_hand=2, pane=1}, groups = {cracky = 3, oddly_breakable_by_hand = 2, pane = 1},
recipe = {{"default:steel_ingot", "", "default:steel_ingot"}, recipe = {
{"", "default:steel_ingot", ""}, {"default:steel_ingot", "", "default:steel_ingot"},
{"default:steel_ingot", "", "default:steel_ingot"}} {"", "default:steel_ingot", ""},
{"default:steel_ingot", "", "default:steel_ingot"}
}
}) })
register_pane("rusty_bar", "Rusty Iron Bars", { register_pane("rusty_bar", "Rusty Iron Bars", {
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
groups = {cracky=2, pane=1}, groups = {cracky = 2, pane = 1},
recipe = {{"", "default:dirt", ""}, recipe = {
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, {"", "default:dirt", ""},
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}} {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"},
{"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}
}
}) })
register_pane("wood_frame", "Wood Frame", { register_pane("wood_frame", "Wood Frame", {
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
groups = {choppy=2, pane=1, flammable=2}, groups = {choppy = 2, pane = 1, flammable = 2},
recipe = {{"group:wood", "group:stick", "group:wood"}, recipe = {
{"group:stick", "group:stick", "group:stick"}, {"group:wood", "group:stick", "group:wood"},
{"group:wood", "group:stick", "group:wood"}} {"group:stick", "group:stick", "group:stick"},
{"group:wood", "group:stick", "group:wood"}
}
}) })
xdecor.register("baricade", { xdecor.register("baricade", {
@ -51,7 +59,7 @@ xdecor.register("baricade", {
paramtype2 = "facedir", paramtype2 = "facedir",
inventory_image = "xdecor_baricade.png", inventory_image = "xdecor_baricade.png",
tiles = {"xdecor_baricade.png"}, tiles = {"xdecor_baricade.png"},
groups = {choppy=2, oddly_breakable_by_hand=1, flammable=2}, groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
damage_per_second = 4, damage_per_second = 4,
selection_box = xdecor.nodebox.slab_y(0.3), selection_box = xdecor.nodebox.slab_y(0.3),
collision_box = xdecor.pixelbox(2, {{0, 0, 1, 2, 2, 0}}) collision_box = xdecor.pixelbox(2, {{0, 0, 1, 2, 2, 0}})
@ -61,38 +69,42 @@ xdecor.register("barrel", {
description = "Barrel", description = "Barrel",
tiles = {"xdecor_barrel_top.png", "xdecor_barrel_top.png", "xdecor_barrel_sides.png"}, tiles = {"xdecor_barrel_top.png", "xdecor_barrel_top.png", "xdecor_barrel_sides.png"},
on_place = minetest.rotate_node, on_place = minetest.rotate_node,
groups = {choppy=2, oddly_breakable_by_hand=1, flammable=2}, groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
sounds = default.node_sound_wood_defaults() sounds = default.node_sound_wood_defaults()
}) })
local function register_storage(name, desc, def) local function register_storage(name, desc, def)
xdecor.register(name, { xdecor.register(name, {
description = desc, description = desc,
inventory = {size=def.inv_size or 24}, inventory = {size = def.inv_size or 24},
infotext = desc, infotext = desc,
tiles = def.tiles, tiles = def.tiles,
node_box = def.node_box, node_box = def.node_box,
on_rotate = def.on_rotate, on_rotate = def.on_rotate,
on_place = def.on_place, on_place = def.on_place,
groups = def.groups or {choppy=2, oddly_breakable_by_hand=1, flammable=2}, groups = def.groups or {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
sounds = default.node_sound_wood_defaults() sounds = default.node_sound_wood_defaults()
}) })
end end
register_storage("cabinet", "Wooden Cabinet", { register_storage("cabinet", "Wooden Cabinet", {
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
tiles = {"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", 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"} "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
"xdecor_cabinet_sides.png", "xdecor_cabinet_front.png"
}
}) })
register_storage("cabinet_half", "Half Wooden Cabinet", { register_storage("cabinet_half", "Half Wooden Cabinet", {
inv_size = 8, inv_size = 8,
node_box = xdecor.nodebox.slab_y(0.5, 0.5), node_box = xdecor.nodebox.slab_y(0.5, 0.5),
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
tiles = {"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", tiles = {
"xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_sides.png", "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png",
"xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_front.png"} "xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_sides.png",
"xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_front.png"
}
}) })
if minetest.get_modpath("moreblocks") then if minetest.get_modpath("moreblocks") then
@ -100,15 +112,19 @@ if minetest.get_modpath("moreblocks") then
else else
register_storage("empty_shelf", "Empty Shelf", { register_storage("empty_shelf", "Empty Shelf", {
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
tiles = {"default_wood.png", "default_wood.png", "default_wood.png", tiles = {
"default_wood.png", "default_wood.png^xdecor_empty_shelf.png"} "default_wood.png", "default_wood.png", "default_wood.png",
"default_wood.png", "default_wood.png^xdecor_empty_shelf.png"
}
}) })
end end
register_storage("multishelf", "Multi Shelf", { register_storage("multishelf", "Multi Shelf", {
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
tiles = {"default_wood.png", "default_wood.png", "default_wood.png", tiles = {
"default_wood.png", "default_wood.png^xdecor_multishelf.png"}, "default_wood.png", "default_wood.png", "default_wood.png",
"default_wood.png", "default_wood.png^xdecor_multishelf.png"
},
}) })
xdecor.register("candle", { xdecor.register("candle", {
@ -119,13 +135,20 @@ xdecor.register("candle", {
wield_image = "xdecor_candle_wield.png", wield_image = "xdecor_candle_wield.png",
paramtype2 = "wallmounted", paramtype2 = "wallmounted",
walkable = false, walkable = false,
groups = {dig_immediate=3, attached_node=1}, groups = {dig_immediate = 3, attached_node = 1},
tiles = {{name = "xdecor_candle_floor.png", tiles = {
animation = {type="vertical_frames", length=1.5}}, {
{name = "xdecor_candle_floor.png", name = "xdecor_candle_floor.png",
animation = {type="vertical_frames", length=1.5}}, animation = {type="vertical_frames", length = 1.5}
{name = "xdecor_candle_wall.png", },
animation = {type="vertical_frames", length=1.5}} {
name = "xdecor_candle_floor.png",
animation = {type="vertical_frames", length = 1.5}
},
{
name = "xdecor_candle_wall.png",
animation = {type="vertical_frames", length = 1.5}
}
}, },
selection_box = { selection_box = {
type = "wallmounted", type = "wallmounted",
@ -139,12 +162,15 @@ xdecor.register("chair", {
description = "Chair", description = "Chair",
tiles = {"xdecor_wood.png"}, tiles = {"xdecor_wood.png"},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2}, groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2},
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
node_box = xdecor.pixelbox(16, { node_box = xdecor.pixelbox(16, {
{3, 0, 11, 2, 16, 2}, {11, 0, 11, 2, 16, 2}, {3, 0, 11, 2, 16, 2},
{5, 9, 11.5, 6, 6, 1}, {3, 0, 3, 2, 6, 2}, {11, 0, 11, 2, 16, 2},
{11, 0, 3, 2, 6, 2}, {3, 6, 3, 10, 2, 8} {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}
}), }),
can_dig = xdecor.sit_dig, can_dig = xdecor.sit_dig,
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
@ -167,7 +193,7 @@ xdecor.register("cobweb", {
liquid_range = 0, liquid_range = 0,
walkable = false, walkable = false,
selection_box = {type = "regular"}, selection_box = {type = "regular"},
groups = {snappy=3, liquid=3, flammable=3}, groups = {snappy = 3, liquid = 3, flammable = 3},
sounds = default.node_sound_leaves_defaults() sounds = default.node_sound_leaves_defaults()
}) })
@ -175,51 +201,53 @@ local curtain_colors = {
"red", "red",
} }
for _, c in pairs(curtain_colors) do for _, c in ipairs(curtain_colors) do
xdecor.register("curtain_"..c, { xdecor.register("curtain_" .. c, {
description = c:gsub("^%l", string.upper).." Curtain", description = c:gsub("^%l", string.upper) .. " Curtain",
walkable = false, walkable = false,
tiles = {"wool_white.png"}, tiles = {"wool_white.png"},
color = c, color = c,
inventory_image = "wool_white.png^[colorize:"..c.. inventory_image = "wool_white.png^[colorize:" .. c ..
":170^xdecor_curtain_open_overlay.png^[makealpha:255,126,126", ":170^xdecor_curtain_open_overlay.png^[makealpha:255,126,126",
wield_image = "wool_white.png^[colorize:"..c..":170", wield_image = "wool_white.png^[colorize:" .. c .. ":170",
drawtype = "signlike", drawtype = "signlike",
paramtype2 = "colorwallmounted", paramtype2 = "colorwallmounted",
groups = {dig_immediate=3, flammable=3}, groups = {dig_immediate = 3, flammable = 3},
selection_box = {type="wallmounted"}, selection_box = {type = "wallmounted"},
on_rightclick = function(pos, node, _, itemstack) on_rightclick = function(pos, node, _, itemstack)
minetest.set_node(pos, {name="xdecor:curtain_open_"..c, param2=node.param2}) minetest.set_node(pos, {name = "xdecor:curtain_open_" .. c, param2 = node.param2})
return itemstack return itemstack
end end
}) })
xdecor.register("curtain_open_"..c, { xdecor.register("curtain_open_" .. c, {
tiles = {"wool_white.png^xdecor_curtain_open_overlay.png^[makealpha:255,126,126"}, tiles = {"wool_white.png^xdecor_curtain_open_overlay.png^[makealpha:255,126,126"},
color = c, color = c,
drawtype = "signlike", drawtype = "signlike",
paramtype2 = "colorwallmounted", paramtype2 = "colorwallmounted",
walkable = false, walkable = false,
groups = {dig_immediate=3, flammable=3, not_in_creative_inventory=1}, groups = {dig_immediate = 3, flammable = 3, not_in_creative_inventory = 1},
selection_box = {type="wallmounted"}, selection_box = {type="wallmounted"},
drop = "xdecor:curtain_"..c, drop = "xdecor:curtain_" .. c,
on_rightclick = function(pos, node, _, itemstack) on_rightclick = function(pos, node, _, itemstack)
minetest.set_node(pos, {name="xdecor:curtain_"..c, param2=node.param2}) minetest.set_node(pos, {name="xdecor:curtain_" .. c, param2 = node.param2})
return itemstack return itemstack
end end
}) })
minetest.register_craft({ minetest.register_craft({
output = "xdecor:curtain_"..c.." 4", output = "xdecor:curtain_" .. c .. " 4",
recipe = {{"", "wool:"..c, ""}, recipe = {
{"", "wool:"..c, ""}} {"", "wool:" .. c, ""},
{"", "wool:" .. c, ""}
}
}) })
end end
xdecor.register("cushion", { xdecor.register("cushion", {
description = "Cushion", description = "Cushion",
tiles = {"xdecor_cushion.png"}, tiles = {"xdecor_cushion.png"},
groups = {snappy=3, flammable=3, fall_damage_add_percent=-50}, groups = {snappy = 3, flammable = 3, fall_damage_add_percent = -50},
on_place = minetest.rotate_node, on_place = minetest.rotate_node,
node_box = xdecor.nodebox.slab_y(0.5), node_box = xdecor.nodebox.slab_y(0.5),
can_dig = xdecor.sit_dig, can_dig = xdecor.sit_dig,
@ -233,7 +261,7 @@ xdecor.register("cushion", {
xdecor.register("cushion_block", { xdecor.register("cushion_block", {
description = "Cushion Block", description = "Cushion Block",
tiles = {"xdecor_cushion.png"}, tiles = {"xdecor_cushion.png"},
groups = {snappy=3, flammable=3, fall_damage_add_percent=-75, not_in_creative_inventory=1} groups = {snappy = 3, flammable = 3, fall_damage_add_percent = -75, not_in_creative_inventory = 1}
}) })
local function door_access(name) local function door_access(name)
@ -244,30 +272,37 @@ local xdecor_doors = {
japanese = { japanese = {
{"group:wood", "default:paper"}, {"group:wood", "default:paper"},
{"default:paper", "group:wood"}, {"default:paper", "group:wood"},
{"group:wood", "default:paper"} }, {"group:wood", "default:paper"}
},
prison = { prison = {
{"xpanes:bar_flat", "xpanes:bar_flat",}, {"xpanes:bar_flat", "xpanes:bar_flat",},
{"xpanes:bar_flat", "xpanes:bar_flat",}, {"xpanes:bar_flat", "xpanes:bar_flat",},
{"xpanes:bar_flat", "xpanes:bar_flat"} }, {"xpanes:bar_flat", "xpanes:bar_flat"}
},
rusty_prison = { rusty_prison = {
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",}, {"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",},
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",}, {"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat",},
{"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat"} }, {"xpanes:rusty_bar_flat", "xpanes:rusty_bar_flat"}
},
screen = { screen = {
{"group:wood", "group:wood"}, {"group:wood", "group:wood"},
{"xpanes:chainlink_flat", "xpanes:chainlink_flat"}, {"xpanes:chainlink_flat", "xpanes:chainlink_flat"},
{"group:wood", "group:wood"} }, {"group:wood", "group:wood"}
},
slide = { slide = {
{"default:paper", "default:paper"}, {"default:paper", "default:paper"},
{"default:paper", "default:paper"}, {"default:paper", "default:paper"},
{"group:wood", "group:wood"} }, {"group:wood", "group:wood"}
},
woodglass = { woodglass = {
{"default:glass", "default:glass"}, {"default:glass", "default:glass"},
{"group:wood", "group:wood"}, {"group:wood", "group:wood"},
{"group:wood", "group:wood"} } {"group:wood", "group:wood"}
},
} }
local mesecons_register local mesecons_register
if minetest.global_exists("mesecon") then if minetest.global_exists("mesecon") then
mesecons_register = { effector = { mesecons_register = { effector = {
action_on = function(pos, node) action_on = function(pos, node)
@ -288,23 +323,27 @@ end
for name, recipe in pairs(xdecor_doors) do for name, recipe in pairs(xdecor_doors) do
if not doors.register then break end if not doors.register then break end
doors.register(name.."_door", { doors.register(name .. "_door", {
tiles = {{name = "xdecor_"..name.."_door.png", backface_culling=true}}, tiles = {
description = name:gsub("%f[%w]%l", string.upper):gsub("_", " ").." Door", {name = "xdecor_" .. name .. "_door.png", backface_culling = true}
inventory_image = "xdecor_"..name.."_door_inv.png", },
description = name:gsub("%f[%w]%l", string.upper):gsub("_", " ") .. " Door",
inventory_image = "xdecor_" .. name .. "_door_inv.png",
protected = door_access(name), protected = door_access(name),
groups = {choppy=2, cracky=2, oddly_breakable_by_hand=1, door=1}, groups = {choppy = 2, cracky = 2, oddly_breakable_by_hand = 1, door = 1},
recipe = recipe, recipe = recipe,
mesecons = mesecons_register mesecons = mesecons_register,
}) })
end end
xdecor.register("enderchest", { xdecor.register("enderchest", {
description = "Ender Chest", description = "Ender Chest",
tiles = {"xdecor_enderchest_top.png", "xdecor_enderchest_top.png", tiles = {
"xdecor_enderchest_side.png", "xdecor_enderchest_side.png", "xdecor_enderchest_top.png", "xdecor_enderchest_top.png",
"xdecor_enderchest_side.png", "xdecor_enderchest_front.png"}, "xdecor_enderchest_side.png", "xdecor_enderchest_side.png",
groups = {cracky=1, choppy=1}, "xdecor_enderchest_side.png", "xdecor_enderchest_front.png"
},
groups = {cracky = 1, choppy = 1},
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
on_construct = function(pos) on_construct = function(pos)
@ -314,7 +353,8 @@ xdecor.register("enderchest", {
list[current_player;main;0,5;8,4;] list[current_player;main;0,5;8,4;]
listring[current_player;enderchest] listring[current_player;enderchest]
listring[current_player;main] ]] listring[current_player;main] ]]
..xbg..default.get_hotbar_bg(0,5)) .. xbg .. default.get_hotbar_bg(0,5))
meta:set_string("infotext", "Ender Chest") meta:set_string("infotext", "Ender Chest")
end end
}) })
@ -329,7 +369,7 @@ xdecor.register("ivy", {
drawtype = "signlike", drawtype = "signlike",
walkable = false, walkable = false,
climbable = true, climbable = true,
groups = {snappy=3, flora=1, attached_node=1, plant=1, flammable=3}, groups = {snappy = 3, flora = 1, attached_node = 1, plant = 1, flammable = 3},
paramtype2 = "wallmounted", paramtype2 = "wallmounted",
selection_box = {type="wallmounted"}, selection_box = {type="wallmounted"},
tiles = {"xdecor_ivy.png"}, tiles = {"xdecor_ivy.png"},
@ -346,38 +386,45 @@ xdecor.register("lantern", {
wield_image = "xdecor_lantern_inv.png", wield_image = "xdecor_lantern_inv.png",
paramtype2 = "wallmounted", paramtype2 = "wallmounted",
walkable = false, walkable = false,
groups = {snappy=3, attached_node=1}, groups = {snappy = 3, attached_node = 1},
tiles = {{name="xdecor_lantern.png", animation={type="vertical_frames", length=1.5}}}, tiles = {
{
name = "xdecor_lantern.png",
animation = {type="vertical_frames", length = 1.5}
}
},
selection_box = xdecor.pixelbox(16, {{4, 0, 4, 8, 16, 8}}) selection_box = xdecor.pixelbox(16, {{4, 0, 4, 8, 16, 8}})
}) })
for _, l in pairs({"iron", "wooden"}) do for _, l in ipairs({"iron", "wooden"}) do
xdecor.register(l.."_lightbox", { xdecor.register(l .. "_lightbox", {
description = l:gsub("^%l", string.upper).." Light Box", description = l:gsub("^%l", string.upper) .. " Light Box",
tiles = {"xdecor_"..l.."_lightbox.png"}, tiles = {"xdecor_" .. l .. "_lightbox.png"},
groups = {cracky=3, choppy=3, oddly_breakable_by_hand=2}, groups = {cracky = 3, choppy = 3, oddly_breakable_by_hand = 2},
light_source = 13, light_source = 13,
sounds = default.node_sound_glass_defaults() sounds = default.node_sound_glass_defaults()
}) })
end end
for _, f in pairs({"dandelion_white", "dandelion_yellow", "geranium", for _, f in ipairs({"dandelion_white", "dandelion_yellow", "geranium",
"rose", "tulip", "viola"}) do "rose", "tulip", "viola"}) do
xdecor.register("potted_"..f, { xdecor.register("potted_" .. f, {
description = "Potted "..f:gsub("%f[%w]%l", string.upper):gsub("_", " "), description = "Potted " .. f:gsub("%f[%w]%l", string.upper):gsub("_", " "),
walkable = false, walkable = false,
groups = {snappy=3, flammable=3, plant=1, flower=1}, groups = {snappy = 3, flammable = 3, plant = 1, flower = 1},
tiles = {"xdecor_"..f.."_pot.png"}, tiles = {"xdecor_" .. f .. "_pot.png"},
inventory_image = "xdecor_"..f.."_pot.png", inventory_image = "xdecor_" .. f .. "_pot.png",
drawtype = "plantlike", drawtype = "plantlike",
sounds = default.node_sound_leaves_defaults(), sounds = default.node_sound_leaves_defaults(),
selection_box = xdecor.nodebox.slab_y(0.3) selection_box = xdecor.nodebox.slab_y(0.3)
}) })
minetest.register_craft({ minetest.register_craft({
output = "xdecor:potted_"..f, output = "xdecor:potted_" .. f,
recipe = {{"default:clay_brick", "flowers:"..f, recipe = {
"default:clay_brick"}, {"", "default:clay_brick", ""}} {"default:clay_brick", "flowers:" .. f, "default:clay_brick"},
{"", "default:clay_brick", ""}
}
}) })
end end
@ -395,30 +442,37 @@ xdecor.register("painting_1", {
wield_image = "xdecor_painting_empty.png", wield_image = "xdecor_painting_empty.png",
paramtype2 = "wallmounted", paramtype2 = "wallmounted",
sunlight_propagates = true, sunlight_propagates = true,
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2, attached_node=1}, groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2, attached_node = 1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
node_box = painting_box, node_box = painting_box,
node_placement_prediction = "", node_placement_prediction = "",
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
local num = math.random(4) local num = math.random(4)
local leftover = minetest.item_place_node( local leftover = minetest.item_place_node(
ItemStack("xdecor:painting_"..num), placer, pointed_thing) ItemStack("xdecor:painting_" .. num), placer, pointed_thing)
if leftover:get_count() == 0 and if leftover:get_count() == 0 and
not minetest.setting_getbool("creative_mode") then not minetest.setting_getbool("creative_mode") then
itemstack:take_item() itemstack:take_item()
end end
return itemstack return itemstack
end end
}) })
for i = 2, 4 do for i = 2, 4 do
xdecor.register("painting_"..i, { xdecor.register("painting_" .. i, {
tiles = {"xdecor_painting_"..i..".png"}, tiles = {"xdecor_painting_" .. i .. ".png"},
paramtype2 = "wallmounted", paramtype2 = "wallmounted",
drop = "xdecor:painting_1", drop = "xdecor:painting_1",
sunlight_propagates = true, sunlight_propagates = true,
groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2, groups = {
attached_node=1, not_in_creative_inventory=1}, choppy = 3,
oddly_breakable_by_hand = 2,
flammable = 2,
attached_node = 1,
not_in_creative_inventory = 1
},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
node_box = painting_box node_box = painting_box
}) })
@ -427,7 +481,7 @@ end
xdecor.register("stonepath", { xdecor.register("stonepath", {
description = "Garden Stone Path", description = "Garden Stone Path",
tiles = {"default_stone.png"}, tiles = {"default_stone.png"},
groups = {snappy=3}, groups = {snappy = 3},
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
sounds = default.node_sound_stone_defaults(), sounds = default.node_sound_stone_defaults(),
sunlight_propagates = true, sunlight_propagates = true,
@ -442,8 +496,8 @@ local function register_hard_node(name, desc, def)
def = def or {} def = def or {}
xdecor.register(name, { xdecor.register(name, {
description = desc, description = desc,
tiles = {"xdecor_"..name..".png"}, tiles = {"xdecor_" .. name .. ".png"},
groups = def.groups or {cracky=1}, groups = def.groups or {cracky = 1},
sounds = def.sounds or default.node_sound_stone_defaults() sounds = def.sounds or default.node_sound_stone_defaults()
}) })
end end
@ -455,19 +509,21 @@ register_hard_node("hard_clay", "Hardened Clay")
register_hard_node("moonbrick", "Moon Brick") register_hard_node("moonbrick", "Moon Brick")
register_hard_node("stone_tile", "Stone Tile") register_hard_node("stone_tile", "Stone Tile")
register_hard_node("stone_rune", "Runestone") register_hard_node("stone_rune", "Runestone")
register_hard_node("packed_ice", "Packed Ice", { register_hard_node("packed_ice", "Packed Ice", {
groups = {cracky=1, puts_out_fire=1, slippery=3}, groups = {cracky = 1, puts_out_fire = 1, slippery = 3},
sounds = default.node_sound_glass_defaults() sounds = default.node_sound_glass_defaults()
}) })
register_hard_node("wood_tile", "Wooden Tile", { register_hard_node("wood_tile", "Wooden Tile", {
groups = {choppy=1, wood=1, flammable=2}, groups = {choppy = 1, wood = 1, flammable = 2},
sounds = default.node_sound_wood_defaults() sounds = default.node_sound_wood_defaults()
}) })
xdecor.register("table", { xdecor.register("table", {
description = "Table", description = "Table",
tiles = {"xdecor_wood.png"}, tiles = {"xdecor_wood.png"},
groups = {choppy=2, oddly_breakable_by_hand=1, flammable=2}, groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
node_box = xdecor.pixelbox(16, { node_box = xdecor.pixelbox(16, {
{0, 14, 0, 16, 2, 16}, {5.5, 0, 5.5, 5, 14, 6} {0, 14, 0, 16, 2, 16}, {5.5, 0, 5.5, 5, 14, 6}
@ -478,7 +534,7 @@ xdecor.register("tatami", {
description = "Tatami", description = "Tatami",
tiles = {"xdecor_tatami.png"}, tiles = {"xdecor_tatami.png"},
wield_image = "xdecor_tatami.png", wield_image = "xdecor_tatami.png",
groups = {snappy=3, flammable=3}, groups = {snappy = 3, flammable = 3},
sunlight_propagates = true, sunlight_propagates = true,
node_box = xdecor.nodebox.slab_y(0.0625) node_box = xdecor.nodebox.slab_y(0.0625)
}) })
@ -486,22 +542,31 @@ xdecor.register("tatami", {
xdecor.register("trampoline", { xdecor.register("trampoline", {
description = "Trampoline", description = "Trampoline",
tiles = {"xdecor_trampoline.png", "mailbox_blank16.png", "xdecor_trampoline_sides.png"}, tiles = {"xdecor_trampoline.png", "mailbox_blank16.png", "xdecor_trampoline_sides.png"},
groups = {cracky=3, oddly_breakable_by_hand=1, fall_damage_add_percent=-80, bouncy=90}, groups = {cracky = 3, oddly_breakable_by_hand = 1, fall_damage_add_percent = -80, bouncy = 90},
node_box = xdecor.nodebox.slab_y(0.5), node_box = xdecor.nodebox.slab_y(0.5),
sounds = {footstep = {name="xdecor_bouncy", gain=0.8}} sounds = {
footstep = {
name = "xdecor_bouncy",
gain = 0.8
}
}
}) })
xdecor.register("tv", { xdecor.register("tv", {
description = "Television", description = "Television",
light_source = 11, light_source = 11,
groups = {cracky=3, oddly_breakable_by_hand=2}, groups = {cracky = 3, oddly_breakable_by_hand = 2},
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
tiles = {"xdecor_television_left.png^[transformR270", tiles = {
"xdecor_television_left.png^[transformR90", "xdecor_television_left.png^[transformR270",
"xdecor_television_left.png^[transformFX", "xdecor_television_left.png^[transformR90",
"xdecor_television_left.png", "xdecor_television_back.png", "xdecor_television_left.png^[transformFX",
{name="xdecor_television_front_animated.png", "xdecor_television_left.png", "xdecor_television_back.png",
animation = {type="vertical_frames", length=80.0}} } {
name = "xdecor_television_front_animated.png",
animation = {type = "vertical_frames", length = 80.0}
}
}
}) })
xdecor.register("woodframed_glass", { xdecor.register("woodframed_glass", {
@ -509,6 +574,6 @@ xdecor.register("woodframed_glass", {
drawtype = "glasslike_framed", drawtype = "glasslike_framed",
sunlight_propagates = true, sunlight_propagates = true,
tiles = {"xdecor_woodframed_glass.png", "xdecor_woodframed_glass_detail.png"}, tiles = {"xdecor_woodframed_glass.png", "xdecor_woodframed_glass_detail.png"},
groups = {cracky=2, oddly_breakable_by_hand=1}, groups = {cracky = 2, oddly_breakable_by_hand = 1},
sounds = default.node_sound_glass_defaults() sounds = default.node_sound_glass_defaults()
}) })

View File

@ -6,6 +6,7 @@ function rope.place(itemstack, placer, pointed_thing)
local pos = pointed_thing.above local pos = pointed_thing.above
local oldnode = minetest.get_node(pos) local oldnode = minetest.get_node(pos)
local stackname = itemstack:get_name() local stackname = itemstack:get_name()
if minetest.is_protected(pos, placer:get_player_name()) then if minetest.is_protected(pos, placer:get_player_name()) then
return itemstack return itemstack
end end
@ -18,12 +19,13 @@ function rope.place(itemstack, placer, pointed_thing)
oldnode = minetest.get_node(pos) oldnode = minetest.get_node(pos)
end end
end end
return itemstack return itemstack
end end
function rope.remove(pos, oldnode, digger, rope_name) function rope.remove(pos, oldnode, digger, rope_name)
local num = 0 local num = 0
local below = {x=pos.x, y=pos.y, z=pos.z} local below = {x = pos.x, y = pos.y, z = pos.z}
local digger_inv = digger:get_inventory() local digger_inv = digger:get_inventory()
while minetest.get_node(below).name == rope_name do while minetest.get_node(below).name == rope_name do
@ -31,8 +33,10 @@ function rope.remove(pos, oldnode, digger, rope_name)
below.y = below.y - 1 below.y = below.y - 1
num = num + 1 num = num + 1
end end
if num == 0 then return end if num == 0 then return end
digger_inv:add_item("main", rope_name.." "..num) digger_inv:add_item("main", rope_name.." "..num)
return true return true
end end
@ -41,14 +45,16 @@ xdecor.register("rope", {
drawtype = "plantlike", drawtype = "plantlike",
walkable = false, walkable = false,
climbable = true, climbable = true,
groups = {snappy=3, flammable=3}, groups = {snappy = 3, flammable = 3},
tiles = {"xdecor_rope.png"}, tiles = {"xdecor_rope.png"},
inventory_image = "xdecor_rope_inv.png", inventory_image = "xdecor_rope_inv.png",
wield_image = "xdecor_rope_inv.png", wield_image = "xdecor_rope_inv.png",
selection_box = xdecor.pixelbox(8, {{3, 0, 3, 2, 8, 2}}), selection_box = xdecor.pixelbox(8, {{3, 0, 3, 2, 8, 2}}),
on_place = rope.place, on_place = rope.place,
on_punch = function(pos, node, puncher, pointed_thing) on_punch = function(pos, node, puncher, pointed_thing)
local player_name = puncher:get_player_name() local player_name = puncher:get_player_name()
if not minetest.is_protected(pos, player_name) or if not minetest.is_protected(pos, player_name) or
minetest.get_player_privs(player_name).protection_bypass then minetest.get_player_privs(player_name).protection_bypass then
rope.remove(pos, node, puncher, "xdecor:rope") rope.remove(pos, node, puncher, "xdecor:rope")
@ -65,4 +71,4 @@ minetest.register_craft({
{"farming:string"}, {"farming:string"},
{"farming:string"} {"farming:string"}
} }
}) })

View File

@ -9,7 +9,7 @@ local registered_nodes = minetest.registered_nodes
local nodes = {} local nodes = {}
for node, def in pairs(registered_nodes) do for node, def in pairs(registered_nodes) do
if xdecor.stairs_valid_def(def) then if xdecor.stairs_valid_def(def) then
nodes[#nodes+1] = node nodes[#nodes + 1] = node
end end
end end
@ -20,99 +20,117 @@ WB.custom_nodes_register = {
setmetatable(nodes, { setmetatable(nodes, {
__concat = function(t1, t2) __concat = function(t1, t2)
for i=1, #t2 do for i = 1, #t2 do
t1[#t1+1] = t2[i] t1[#t1 + 1] = t2[i]
end end
return t1 return t1
end end
}) })
nodes = nodes..WB.custom_nodes_register nodes = nodes .. WB.custom_nodes_register
-- Nodeboxes definitions -- Nodeboxes definitions
workbench.defs = { workbench.defs = {
-- Name Yield X Y Z W H L -- Name YieldX YZ WH L
{"nanoslab", 16, { 0, 0, 0, 8, 1, 8 }}, {"nanoslab", 16, { 0, 0, 0, 8, 1, 8 }},
{"micropanel", 16, { 0, 0, 0, 16, 1, 8 }}, {"micropanel", 16, { 0, 0, 0, 16, 1, 8 }},
{"microslab", 8, { 0, 0, 0, 16, 1, 16 }}, {"microslab", 8, { 0, 0, 0, 16, 1, 16 }},
{"thinstair", 8, { 0, 7, 0, 16, 1, 8 }, {"thinstair", 8, { 0, 7, 0, 16, 1, 8 },
{ 0, 15, 8, 16, 1, 8 }}, { 0, 15, 8, 16, 1, 8 }},
{"cube", 4, { 0, 0, 0, 8, 8, 8 }}, {"cube", 4, { 0, 0, 0, 8, 8, 8 }},
{"panel", 4, { 0, 0, 0, 16, 8, 8 }}, {"panel", 4, { 0, 0, 0, 16, 8, 8 }},
{"slab", 2, nil }, {"slab", 2, nil },
{"doublepanel", 2, { 0, 0, 0, 16, 8, 8 }, {"doublepanel", 2, { 0, 0, 0, 16, 8, 8 },
{ 0, 8, 8, 16, 8, 8 }}, { 0, 8, 8, 16, 8, 8 }},
{"halfstair", 2, { 0, 0, 0, 8, 8, 16 }, {"halfstair", 2, { 0, 0, 0, 8, 8, 16 },
{ 0, 8, 8, 8, 8, 8 }}, { 0, 8, 8, 8, 8, 8 }},
{"stair_outer", 1, nil }, {"stair_outer", 1, nil },
{"stair", 1, nil }, {"stair", 1, nil },
{"stair_inner", 1, nil } {"stair_inner", 1, nil }
} }
local repairable_tools = {"pick", "axe", "shovel", "sword", "hoe", "armor", "shield"}
-- Tools allowed to be repaired -- Tools allowed to be repaired
function workbench:repairable(stack) function workbench:repairable(stack)
local tools = {"pick", "axe", "shovel", "sword", "hoe", "armor", "shield"} for _, t in ipairs(repairable_tools) do
for _, t in pairs(tools) do if stack:find(t) then
if stack:find(t) then return true end return true
end
end end
return false
end end
function workbench:get_output(inv, input, name) function workbench:get_output(inv, input, name)
local output = {} local output = {}
for i=1, #self.defs do for i = 1, #self.defs do
local nbox = self.defs[i] local nbox = self.defs[i]
local count = min(nbox[2] * input:get_count(), input:get_stack_max()) local count = min(nbox[2] * input:get_count(), input:get_stack_max())
local item = name.."_"..nbox[1] local item = name .. "_" .. nbox[1]
item = nbox[3] and item or "stairs:"..nbox[1].."_"..name:match(":(.*)")
output[#output+1] = item.." "..count item = nbox[3] and item or "stairs:" .. nbox[1] .. "_" .. name:match(":(.*)")
output[#output + 1] = item .. " " .. count
end end
inv:set_list("forms", output) inv:set_list("forms", output)
end end
local main_fs = [[
label[0.9,1.23;Cut]
label[0.9,2.23;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;Crafting]
button[2,0;2,1;storage;Storage]
image[3,1;1,1;gui_furnace_arrow_bg.png^[transformR270]
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;< 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;< Back]
listring[context;storage]
listring[current_player;main]
]]
local formspecs = { local formspecs = {
-- Main formspec -- Main formspec
[[ label[0.9,1.23;Cut] main_fs,
label[0.9,2.23;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;Crafting]
button[2,0;2,1;storage;Storage]
image[3,1;1,1;gui_furnace_arrow_bg.png^[transformR270]
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] ]],
-- Crafting formspec -- Crafting formspec
[[ image[5,1;1,1;gui_furnace_arrow_bg.png^[transformR270] crafting_fs,
button[0,0;1.5,1;back;< 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] ]],
-- Storage formspec -- Storage formspec
[[ list[context;storage;0,1;8,2;] storage_fs,
button[0,0;1.5,1;back;< Back]
listring[context;storage]
listring[current_player;main] ]]
} }
function workbench:set_formspec(meta, id) function workbench:set_formspec(meta, id)
meta:set_string("formspec", meta:set_string("formspec",
"size[8,7;]list[current_player;main;0,3.25;8,4;]".. "size[8,7;]list[current_player;main;0,3.25;8,4;]" ..
formspecs[id]..xbg..default.get_hotbar_bg(0,3.25)) formspecs[id] .. xbg .. default.get_hotbar_bg(0,3.25))
end end
function workbench.construct(pos) function workbench.construct(pos)
@ -131,11 +149,11 @@ end
function workbench.fields(pos, _, fields) function workbench.fields(pos, _, fields)
if fields.quit then return end if fields.quit then return end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local id = fields.back and 1 or local id = fields.back and 1 or fields.craft and 2 or fields.storage and 3
fields.craft and 2 or
fields.storage and 3
if not id then return end if not id then return end
workbench:set_formspec(meta, id) workbench:set_formspec(meta, id)
end end
@ -156,24 +174,26 @@ function workbench.timer(pos)
return return
end end
-- Tool's wearing range: 0-65535 | 0 = new condition -- Tool's wearing range: 0-65535; 0 = new condition
tool:add_wear(-500) tool:add_wear(-500)
hammer:add_wear(700) hammer:add_wear(700)
inv:set_stack("tool", 1, tool) inv:set_stack("tool", 1, tool)
inv:set_stack("hammer", 1, hammer) inv:set_stack("hammer", 1, hammer)
return true return true
end end
function workbench.put(_, listname, _, stack) function workbench.put(_, listname, _, stack)
local stackname = stack:get_name() local stackname = stack:get_name()
if (listname == "tool" and stack:get_wear() > 0 and if (listname == "tool" and stack:get_wear() > 0 and
workbench:repairable(stackname)) or workbench:repairable(stackname)) or
(listname == "input" and registered_nodes[stackname.."_cube"]) or (listname == "input" and registered_nodes[stackname .. "_cube"]) or
(listname == "hammer" and stackname == "xdecor:hammer") or (listname == "hammer" and stackname == "xdecor:hammer") or
listname == "storage" then listname == "storage" then
return stack:get_count() return stack:get_count()
end end
return 0 return 0
end end
@ -199,7 +219,7 @@ function workbench.on_take(pos, listname, index, stack, player)
local stackname = stack:get_name() local stackname = stack:get_name()
if listname == "input" then if listname == "input" then
if stackname == inputname and registered_nodes[inputname.."_cube"] then if stackname == inputname and registered_nodes[inputname .. "_cube"] then
workbench:get_output(inv, input, stackname) workbench:get_output(inv, input, stackname)
else else
inv:set_list("forms", {}) inv:set_list("forms", {})
@ -221,11 +241,13 @@ end
xdecor.register("workbench", { xdecor.register("workbench", {
description = "Work Bench", description = "Work Bench",
groups = {cracky=2, choppy=2, oddly_breakable_by_hand=1}, groups = {cracky = 2, choppy = 2, oddly_breakable_by_hand = 1},
sounds = default.node_sound_wood_defaults(), sounds = default.node_sound_wood_defaults(),
tiles = {"xdecor_workbench_top.png", "xdecor_workbench_top.png", tiles = {
"xdecor_workbench_sides.png", "xdecor_workbench_sides.png", "xdecor_workbench_top.png","xdecor_workbench_top.png",
"xdecor_workbench_front.png", "xdecor_workbench_front.png"}, "xdecor_workbench_sides.png", "xdecor_workbench_sides.png",
"xdecor_workbench_front.png", "xdecor_workbench_front.png"
},
on_rotate = screwdriver.rotate_simple, on_rotate = screwdriver.rotate_simple,
can_dig = workbench.dig, can_dig = workbench.dig,
on_timer = workbench.timer, on_timer = workbench.timer,
@ -237,8 +259,8 @@ xdecor.register("workbench", {
allow_metadata_inventory_move = workbench.move allow_metadata_inventory_move = workbench.move
}) })
for _, d in pairs(workbench.defs) do for _, d in ipairs(workbench.defs) do
for i=1, #nodes do for i = 1, #nodes do
local node = nodes[i] local node = nodes[i]
local mod_name, item_name = node:match("^(.-):(.*)") local mod_name, item_name = node:match("^(.-):(.*)")
local def = registered_nodes[node] local def = registered_nodes[node]
@ -264,14 +286,14 @@ for i=1, #nodes do
tiles = {def.tile_images[1]} tiles = {def.tile_images[1]}
end end
if not registered_nodes["stairs:slab_"..item_name] then if not registered_nodes["stairs:slab_" .. item_name] then
stairs.register_stair_and_slab(item_name, node, stairs.register_stair_and_slab(item_name, node,
groups, tiles, def.description.." Stair", groups, tiles, def.description .. " Stair",
def.description.." Slab", def.sounds) def.description .. " Slab", def.sounds)
end end
minetest.register_node(":"..node.."_"..d[1], { minetest.register_node(":" .. node .. "_" .. d[1], {
description = def.description.." "..d[1]:gsub("^%l", string.upper), description = def.description .. " " .. d[1]:gsub("^%l", string.upper),
paramtype = "light", paramtype = "light",
paramtype2 = "facedir", paramtype2 = "facedir",
drawtype = "nodebox", drawtype = "nodebox",
@ -283,14 +305,15 @@ for i=1, #nodes do
sunlight_propagates = true, sunlight_propagates = true,
on_place = minetest.rotate_node on_place = minetest.rotate_node
}) })
elseif item_name and mod_name then elseif item_name and mod_name then
minetest.register_alias_force( minetest.register_alias_force(
('%s:%s_innerstair'):format(mod_name, item_name), ("%s:%s_innerstair"):format(mod_name, item_name),
('stairs:stair_inner_%s'):format(item_name) ("stairs:stair_inner_%s"):format(item_name)
) )
minetest.register_alias_force( minetest.register_alias_force(
('%s:%s_outerstair'):format(mod_name, item_name), ("%s:%s_outerstair"):format(mod_name, item_name),
('stairs:stair_outer_%s'):format(item_name) ("stairs:stair_outer_%s"):format(item_name)
) )
end end
end end
@ -302,7 +325,9 @@ minetest.register_tool("xdecor:hammer", {
description = "Hammer", description = "Hammer",
inventory_image = "xdecor_hammer.png", inventory_image = "xdecor_hammer.png",
wield_image = "xdecor_hammer.png", wield_image = "xdecor_hammer.png",
on_use = function() do return end end on_use = function() do
return end
end
}) })
-- Recipes -- Recipes