diff --git a/.luacheckrc b/.luacheckrc index 718790b..c89cac7 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -7,6 +7,9 @@ read_globals = { "default", "stairs", "doors", "xpanes", "xdecor", "xbg", - table = { fields = { "copy" } }, + table = {fields = {"copy"}}, + string = {fields = {"split"}}, "unpack", + "stairsplus", + "mesecon" } diff --git a/handlers/animations.lua b/handlers/animations.lua index e70bf98..6c240b4 100644 --- a/handlers/animations.lua +++ b/handlers/animations.lua @@ -19,24 +19,29 @@ function xdecor.sit(pos, node, clicker, pointed_thing) if default.player_attached[player_name] then pos.y = pos.y - 0.5 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}) default.player_attached[player_name] = false default.player_set_animation(clicker, "stand", 30) 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:setpos(pos) default.player_attached[player_name] = true default.player_set_animation(clicker, "sit", 30) - if node.param2 == 0 then clicker:set_look_yaw(3.15) - elseif node.param2 == 1 then 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 + if node.param2 == 0 then + clicker:set_look_yaw(3.15) + elseif node.param2 == 1 then + 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 @@ -47,6 +52,7 @@ function xdecor.sit_dig(pos, digger) return false end end + return true end diff --git a/handlers/helpers.lua b/handlers/helpers.lua index cbb9113..c80d9ae 100644 --- a/handlers/helpers.lua +++ b/handlers/helpers.lua @@ -2,21 +2,31 @@ function xdecor.maxn(T) local n = 0 for k in pairs(T) do - if k > n then n = k end + if k > n then + n = k + end end + return n end -- Returns the length of an hash table. function xdecor.tablelen(T) local n = 0 - for _ in pairs(T) do n = n + 1 end + + for _ in pairs(T) do + n = n + 1 + end + return n end -- Deep copy of a table. Borrowed from mesecons mod (https://github.com/Jeija/minetest-mod-mesecons). 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 = {} for k, v in pairs(T) do @@ -26,6 +36,7 @@ function xdecor.tablecopy(T) new[k] = v end end + return new end diff --git a/handlers/nodeboxes.lua b/handlers/nodeboxes.lua index 63da57e..4a3d8ca 100644 --- a/handlers/nodeboxes.lua +++ b/handlers/nodeboxes.lua @@ -1,7 +1,13 @@ xdecor.box = { slab_y = function(height, shift) - return {-0.5, -0.5 + (shift or 0), -0.5, 0.5, -0.5 + height + - (shift or 0), 0.5} + return { + -0.5, + -0.5 + (shift or 0), + -0.5, + 0.5, + -0.5 + height + (shift or 0), + 0.5 + } end, slab_z = function(depth) return {-0.5, -0.5, -0.5 + depth, 0.5, 0.5, 0.5} @@ -15,16 +21,18 @@ xdecor.box = { } xdecor.nodebox = { - regular = {type="regular"}, - null = {type="fixed", fixed={0,0,0,0,0,0}} + regular = {type = "regular"}, + null = { + type = "fixed", fixed = {0,0,0,0,0,0} + } } xdecor.pixelbox = function(size, boxes) 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. local x, y, z, w, h, l = unpack(box) - fixed[#fixed+1] = { + fixed[#fixed + 1] = { (x / size) - 0.5, (y / size) - 0.5, (z / size) - 0.5, @@ -33,26 +41,27 @@ xdecor.pixelbox = function(size, boxes) ((z + l) / size) - 0.5 } end - return {type="fixed", fixed=fixed} + + return {type = "fixed", fixed = fixed} end local mt = {} + mt.__index = function(table, key) local ref = xdecor.box[key] local ref_type = type(ref) if ref_type == "function" then return function(...) - return {type="fixed", fixed=ref(...)} + return {type = "fixed", fixed = ref(...)} end elseif ref_type == "table" then - return {type="fixed", fixed=ref} + return {type = "fixed", fixed = ref} 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 - error("unexpected datatype "..tostring(type(ref)).." while looking for "..key) + error("unexpected datatype " .. tostring(type(ref)) .. " while looking for " .. key) end setmetatable(xdecor.nodebox, mt) - diff --git a/handlers/registration.lua b/handlers/registration.lua index cbeabdb..b16dc4b 100644 --- a/handlers/registration.lua +++ b/handlers/registration.lua @@ -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_formspecs = { @@ -6,30 +6,30 @@ local default_inventory_formspecs = { list[context;main;0,0;8,1;] list[current_player;main;0,2;8,4;] listring[current_player;main] - listring[context;main] ]] - ..default.get_hotbar_bg(0,2), + listring[context;main] ]] .. + default.get_hotbar_bg(0,2), ["16"] = [[ size[8,7] list[context;main;0,0;8,2;] list[current_player;main;0,3;8,4;] listring[current_player;main] - listring[context;main] ]] - ..default.get_hotbar_bg(0,3), + listring[context;main] ]] .. + default.get_hotbar_bg(0,3), ["24"] = [[ size[8,8] list[context;main;0,0;8,3;] list[current_player;main;0,4;8,4;] listring[current_player;main] - listring[context;main]" ]] - ..default.get_hotbar_bg(0,4), + listring[context;main]" ]] .. + default.get_hotbar_bg(0,4), ["32"] = [[ size[8,9] list[context;main;0,0.3;8,4;] list[current_player;main;0,4.85;8,1;] list[current_player;main;0,6.08;8,3;8] listring[current_player;main] - listring[context;main] ]] - ..default.get_hotbar_bg(0,4.85) + listring[context;main] ]] .. + default.get_hotbar_bg(0,4.85) } local function get_formspec_by_size(size) @@ -42,13 +42,13 @@ local default_can_dig = function(pos) return inv:is_empty("main") 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("(.*):(.*)") + for groupname, value in pairs(def.groups) do if groupname ~= "cracky" and groupname ~= "choppy" and groupname ~= "flammable" and groupname ~= "crumbly" and - groupname ~= "snappy" then + groupname ~= "snappy" then def.groups.groupname = nil end end @@ -65,17 +65,18 @@ function xdecor.register(name, def) sounds = def.sounds, } ) - elseif minetest.get_modpath("stairs") then + elseif minetest.get_modpath("stairs") then stairs.register_stair_and_slab(name,nodename, def.groups, def.tiles, ("%s Stair"):format(def.description), ("%s Slab"):format(def.description), def.sounds - ) - end + ) + end end +function xdecor.register(name, def) def.drawtype = def.drawtype or (def.mesh and "mesh") or (def.node_box and "nodebox") 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 inv = meta:get_inventory() + inv:set_size("main", size) - meta:set_string("formspec", (inventory.formspec or - get_formspec_by_size(size))..xbg) + meta:set_string("formspec", + (inventory.formspec or get_formspec_by_size(size)) .. xbg) end + def.can_dig = def.can_dig or default_can_dig + elseif infotext and not def.on_construct then def.on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -120,12 +124,12 @@ function xdecor.register(name, def) end end - minetest.register_node("xdecor:"..name, def) + minetest.register_node("xdecor:" .. name, def) local workbench = minetest.settings:get_bool("enable_xdecor_workbench") 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 xdecor_stairs_alternative("xdecor:"..name, def) end diff --git a/init.lua b/init.lua index 6509446..1399a1c 100644 --- a/init.lua +++ b/init.lua @@ -1,29 +1,15 @@ --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 = {} local modpath = minetest.get_modpath("xdecor") -dofile(modpath.."/handlers/animations.lua") -dofile(modpath.."/handlers/helpers.lua") -dofile(modpath.."/handlers/nodeboxes.lua") -dofile(modpath.."/handlers/registration.lua") +dofile(modpath .. "/handlers/animations.lua") +dofile(modpath .. "/handlers/helpers.lua") +dofile(modpath .. "/handlers/nodeboxes.lua") +dofile(modpath .. "/handlers/registration.lua") -dofile(modpath.."/src/alias.lua") -dofile(modpath.."/src/nodes.lua") -dofile(modpath.."/src/recipes.lua") +dofile(modpath .. "/src/nodes.lua") +dofile(modpath .. "/src/recipes.lua") local subpart = { "chess", @@ -34,13 +20,13 @@ local subpart = { "mailbox", "mechanisms", "rope", - "workbench" + "workbench", } -for _, name in pairs(subpart) do - local enable = minetest.settings:get_bool("enable_xdecor_"..name) +for _, name in ipairs(subpart) do + local enable = minetest.settings:get_bool("enable_xdecor_" .. name) if enable or enable == nil then - dofile(modpath.."/src/"..name..".lua") + dofile(modpath .. "/src/" .. name .. ".lua") end end diff --git a/src/alias.lua b/src/alias.lua deleted file mode 100644 index dc95741..0000000 --- a/src/alias.lua +++ /dev/null @@ -1 +0,0 @@ -minetest.register_alias("xdecor:crafting_guide", "craftguide:book") diff --git a/src/chess.lua b/src/chess.lua index dc42be3..a1364da 100644 --- a/src/chess.lua +++ b/src/chess.lua @@ -5,7 +5,9 @@ local function index_to_xy(idx) if not idx then return nil end + idx = idx - 1 + local x = idx % 8 local y = (idx - x) / 8 diff --git a/src/cooking.lua b/src/cooking.lua index 591b6c4..ec5d11e 100644 --- a/src/cooking.lua +++ b/src/cooking.lua @@ -17,7 +17,9 @@ cauldron.cbox = { function cauldron.stop_sound(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 function cauldron.idle_construct(pos) @@ -29,7 +31,10 @@ end function cauldron.boiling_construct(pos) local spos = minetest.hash_node_position(pos) sounds[spos] = minetest.sound_play("xdecor_boiling_water", { - pos=pos, max_hear_distance=5, gain=0.8, loop=true + pos = pos, + max_hear_distance = 5, + gain = 0.8, + loop = true }) local meta = minetest.get_meta(pos) @@ -57,23 +62,25 @@ function cauldron.filling(pos, node, clicker, itemstack) else itemstack:replace("bucket:bucket_water") 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 - 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") end + return itemstack end end 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 return true end 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 end @@ -82,13 +89,17 @@ local function eatable(itemstring) local item = itemstring:match("[%w_:]+") local on_use_def = minetest.registered_items[item].on_use if not on_use_def then return end + return string.format("%q", string.dump(on_use_def)):find("item_eat") end function cauldron.boiling_timer(pos) local node = minetest.get_node(pos) local objs = minetest.get_objects_inside_radius(pos, 0.5) - if not next(objs) then return true end + + if not next(objs) then + return true + end local ingredients = {} for _, obj in pairs(objs) do @@ -96,23 +107,29 @@ function cauldron.boiling_timer(pos) local itemstring = obj:get_luaentity().itemstring 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 - ingredients[#ingredients+1] = food break + ingredients[#ingredients + 1] = food + break end end end end if #ingredients >= 2 then - for _, obj in pairs(objs) do obj:remove() end - minetest.set_node(pos, {name="xdecor:cauldron_soup", param2=node.param2}) + for _, obj in pairs(objs) do + obj:remove() + end + + minetest.set_node(pos, {name = "xdecor:cauldron_soup", param2 = node.param2}) end - local node_under = {x=pos.x, y=pos.y-1, z=pos.z} + local node_under = {x = pos.x, y = pos.y - 1, z = pos.z} + if not minetest.get_node(node_under).name:find("fire") then - minetest.set_node(pos, {name="xdecor:cauldron_idle", param2=node.param2}) + minetest.set_node(pos, {name = "xdecor:cauldron_idle", param2 = node.param2}) end + return true end @@ -135,8 +152,9 @@ function cauldron.take_soup(pos, node, clicker, itemstack) itemstack:replace("xdecor:bowl_soup 1") end - minetest.set_node(pos, {name="xdecor:cauldron_empty", param2=node.param2}) + minetest.set_node(pos, {name = "xdecor:cauldron_empty", param2 = node.param2}) end + return itemstack end @@ -146,11 +164,11 @@ xdecor.register("cauldron_empty", { on_rotate = screwdriver.rotate_simple, tiles = {"xdecor_cauldron_top_empty.png", "xdecor_cauldron_sides.png"}, infotext = "Cauldron (empty)", + collision_box = xdecor.pixelbox(16, cauldron.cbox), + on_rightclick = cauldron.filling, on_construct = function(pos) cauldron.stop_sound(pos) end, - on_rightclick = cauldron.filling, - collision_box = xdecor.pixelbox(16, cauldron.cbox) }) xdecor.register("cauldron_idle", { @@ -162,7 +180,7 @@ xdecor.register("cauldron_idle", { collision_box = xdecor.pixelbox(16, cauldron.cbox), on_rightclick = cauldron.filling, on_construct = cauldron.idle_construct, - on_timer = cauldron.idle_timer + on_timer = cauldron.idle_timer, }) xdecor.register("cauldron_boiling", { @@ -171,32 +189,40 @@ xdecor.register("cauldron_boiling", { drop = "xdecor:cauldron_empty", infotext = "Cauldron (active) - Drop foods inside to make a soup", damage_per_second = 2, - tiles = {{name="xdecor_cauldron_top_anim_boiling_water.png", - animation={type="vertical_frames", length=3.0}}, - "xdecor_cauldron_sides.png"}, + tiles = { + { + name = "xdecor_cauldron_top_anim_boiling_water.png", + animation = {type = "vertical_frames", length = 3.0} + }, + "xdecor_cauldron_sides.png" + }, collision_box = xdecor.pixelbox(16, cauldron.cbox), on_rightclick = cauldron.filling, on_construct = cauldron.boiling_construct, + on_timer = cauldron.boiling_timer, on_destruct = function(pos) cauldron.stop_sound(pos) end, - on_timer = cauldron.boiling_timer }) 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, drop = "xdecor:cauldron_empty", infotext = "Cauldron (active) - Use a bowl to eat the soup", damage_per_second = 2, - tiles = {{name="xdecor_cauldron_top_anim_soup.png", - animation={type="vertical_frames", length=3.0}}, - "xdecor_cauldron_sides.png"}, + tiles = { + { + name = "xdecor_cauldron_top_anim_soup.png", + animation = {type = "vertical_frames", length = 3.0} + }, + "xdecor_cauldron_sides.png" + }, collision_box = xdecor.pixelbox(16, cauldron.cbox), on_rightclick = cauldron.take_soup, on_destruct = function(pos) cauldron.stop_sound(pos) - end + end, }) -- Craft items diff --git a/src/enchanting.lua b/src/enchanting.lua index 5e30d59..744dab4 100644 --- a/src/enchanting.lua +++ b/src/enchanting.lua @@ -1,5 +1,6 @@ screwdriver = screwdriver or {} local ceil, abs, random = math.ceil, math.abs, math.random +local reg_tools = minetest.registered_tools -- Cost in Mese crystal(s) for enchanting. local mese_cost = 1 @@ -11,13 +12,17 @@ local enchanting = { 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) return abs(ceil(((final_value - orig_value) / orig_value) * 100)) end function enchanting:get_tooltip(enchant, orig_caps, fleshy) - local bonus = {durable=0, efficiency=0, damages=0} + local bonus = {durable = 0, efficiency = 0, damages = 0} + if orig_caps then bonus.durable = to_percent(orig_caps.uses, orig_caps.uses * enchanting.uses) local sum_caps_times = 0 @@ -28,23 +33,25 @@ function enchanting:get_tooltip(enchant, orig_caps, fleshy) bonus.efficiency = to_percent(average_caps_time, average_caps_time - enchanting.times) end + if fleshy then bonus.damages = to_percent(fleshy, fleshy + enchanting.damages) end local specs = { -- not finished, to complete - durable = {"#00baff", " (+"..bonus.durable.."%)"}, - fast = {"#74ff49", " (+"..bonus.efficiency.."%)"}, - sharp = {"#ffff00", " (+"..bonus.damages.."%)"}, + durable = {"#00baff", " (+" .. bonus.durable .. "%)"}, + fast = {"#74ff49", " (+" .. bonus.efficiency .. "%)"}, + sharp = {"#ffff00", " (+" .. bonus.damages .. "%)"}, } + return minetest.colorize and minetest.colorize(specs[enchant][1], - "\n"..cap(enchant)..specs[enchant][2]) or - "\n"..cap(enchant)..specs[enchant][2] + "\n" .. cap(enchant) .. specs[enchant][2]) or + "\n" .. cap(enchant) .. specs[enchant][2] end local enchant_buttons = { - [[ 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,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,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] tooltip[sharp;Your weapon inflicts more damages] tooltip[durable;Your tool last longer] - tooltip[fast;Your tool digs faster] ]] - ..default.gui_slots..default.get_hotbar_bg(0.5,4.5) + tooltip[fast;Your tool digs faster] ]] .. + 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) end @@ -78,7 +85,7 @@ function enchanting.on_put(pos, listname, _, stack) "sword", } - for idx, tools in pairs(tool_groups) do + for idx, tools in ipairs(tool_groups) do if tools:find(stackname:match(":(%w+)")) then enchanting.formspec(pos, idx) end @@ -93,11 +100,14 @@ function enchanting.fields(pos, _, fields, sender) local mese = inv:get_stack("mese", 1) local orig_wear = tool:get_wear() local mod, name = tool:get_name():match("(.*):(.*)") - local enchanted_tool = (mod or "")..":enchanted_"..(name or "").."_"..next(fields) + 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", { - to_player=sender:get_player_name(), gain=0.8}) + to_player = sender:get_player_name(), + gain = 0.8 + }) + tool:replace(enchanted_tool) tool:add_wear(orig_wear) mese:take_item(mese_cost) @@ -112,11 +122,13 @@ function enchanting.dig(pos) end local function allowed(tool) - if not tool then return false end - for item in pairs(minetest.registered_tools) do - if item:find("enchanted_"..tool) then return true end + if not tool then return end + + for item in pairs(reg_tools) do + if item:find("enchanted_" .. tool) then + return true + end end - return false end function enchanting.put(_, listname, _, stack) @@ -126,23 +138,26 @@ function enchanting.put(_, listname, _, stack) elseif listname == "tool" and allowed(stackname:match("[^:]+$")) then return 1 end + return 0 end function enchanting.on_take(pos, listname) - if listname == "tool" then enchanting.formspec(pos, nil) end + if listname == "tool" then + enchanting.formspec(pos) + end end function enchanting.construct(pos) local meta = minetest.get_meta(pos) meta:set_string("infotext", "Enchantment Table") - enchanting.formspec(pos, nil) + enchanting.formspec(pos) local inv = meta:get_inventory() inv:set_size("tool", 1) inv:set_size("mese", 1) - minetest.add_entity({x=pos.x, y=pos.y+0.85, z=pos.z}, "xdecor:book_open") + minetest.add_entity({x = pos.x, y = pos.y + 0.85, z = pos.z}, "xdecor:book_open") local timer = minetest.get_node_timer(pos) timer:start(0.5) end @@ -160,39 +175,45 @@ end function enchanting.timer(pos) local num = #minetest.get_objects_inside_radius(pos, 0.9) 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 - 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 minp = {x = pos.x - 2, y = pos.y, z = pos.z - 2} + local maxp = {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2} + local bookshelves = minetest.find_nodes_in_area(minp, maxp, "default:bookshelf") - if #bookshelves == 0 then return true end + if #bookshelves == 0 then + return true + end local bookshelf_pos = bookshelves[random(1, #bookshelves)] local x = pos.x - bookshelf_pos.x local y = bookshelf_pos.y - pos.y local z = pos.z - bookshelf_pos.z - if tostring(x..z):find(2) then + if tostring(x .. z):find(2) then minetest.add_particle({ pos = bookshelf_pos, - velocity = {x=x, y=2-y, z=z}, - acceleration = {x=0, y=-2.2, z=0}, + velocity = {x = x, y = 2 - y, z = z}, + acceleration = {x = 0, y = -2.2, z = 0}, expirationtime = 1, size = 1.5, glow = 5, - texture = "xdecor_glyph"..random(1,18)..".png" + texture = "xdecor_glyph" .. random(1,18) .. ".png" }) end + return true end xdecor.register("enchantment_table", { description = "Enchantment Table", - tiles = {"xdecor_enchantment_top.png", "xdecor_enchantment_bottom.png", - "xdecor_enchantment_side.png", "xdecor_enchantment_side.png", - "xdecor_enchantment_side.png", "xdecor_enchantment_side.png"}, - groups = {cracky=1, level=1}, + tiles = { + "xdecor_enchantment_top.png", "xdecor_enchantment_bottom.png", + "xdecor_enchantment_side.png", "xdecor_enchantment_side.png", + "xdecor_enchantment_side.png", "xdecor_enchantment_side.png" + }, + groups = {cracky = 1, level = 1}, light_source = 6, sounds = default.node_sound_stone_defaults(), on_rotate = screwdriver.rotate_simple, @@ -204,7 +225,9 @@ xdecor.register("enchantment_table", { on_metadata_inventory_put = enchanting.on_put, on_metadata_inventory_take = enchanting.on_take, allow_metadata_inventory_put = enchanting.put, - allow_metadata_inventory_move = function() return 0 end + allow_metadata_inventory_move = function() + return 0 + end, }) minetest.register_entity("xdecor:book_open", { @@ -215,7 +238,7 @@ minetest.register_entity("xdecor:book_open", { textures = {"xdecor_book_open.png"}, on_activate = function(self) 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 self.object:remove() @@ -227,7 +250,7 @@ function enchanting:register_tools(mod, def) for tool in pairs(def.tools) do for material in def.materials:gmatch("[%w_]+") do for enchant in def.tools[tool].enchants:gmatch("[%w_]+") do - local original_tool = minetest.registered_tools[mod..":"..tool.."_"..material] + local original_tool = reg_tools[mod .. ":" .. tool .. "_" .. material] if not original_tool then break end local original_toolcaps = original_tool.tool_capabilities @@ -251,12 +274,12 @@ function enchanting:register_tools(mod, def) fleshy = fleshy + enchanting.damages end - minetest.register_tool(":"..mod..":enchanted_"..tool.."_"..material.."_"..enchant, { - description = "Enchanted "..cap(material).." "..cap(tool).. + minetest.register_tool(":" .. mod .. ":enchanted_" .. tool .. "_" .. material .. "_" .. enchant, { + description = "Enchanted " .. cap(material) .. " " .. cap(tool) .. 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, - groups = {not_in_creative_inventory=1}, + groups = {not_in_creative_inventory = 1}, tool_capabilities = { groupcaps = groupcaps, damage_groups = {fleshy = fleshy}, full_punch_interval = full_punch_interval, @@ -288,4 +311,4 @@ minetest.register_craft({ {"default:diamond", "default:obsidian", "default:diamond"}, {"default:obsidian", "default:obsidian", "default:obsidian"} } -}) \ No newline at end of file +}) diff --git a/src/hive.lua b/src/hive.lua index eb52901..a90d12e 100644 --- a/src/hive.lua +++ b/src/hive.lua @@ -12,8 +12,8 @@ function hive.construct(pos) list[context;honey;5,0;1,1;] list[current_player;main;0,1.35;8,4;] listring[current_player;main] - listring[context;honey] ]] - ..xbg..default.get_hotbar_bg(0,1.35) + listring[context;honey] ]] .. + xbg .. default.get_hotbar_bg(0,1.35) meta:set_string("formspec", formspec) meta:set_string("infotext", "Artificial Hive") @@ -25,7 +25,9 @@ end function hive.timer(pos) 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 honeystack = inv:get_stack("honey", 1) @@ -40,8 +42,10 @@ function hive.timer(pos) inv:add_item("honey", "xdecor:honey") elseif honey == honey_max then local timer = minetest.get_node_timer(pos) - timer:stop() return true + timer:stop() + return true end + return true end @@ -53,14 +57,20 @@ xdecor.register("hive", { groups = {choppy=3, oddly_breakable_by_hand=2, flammable=1}, on_construct = hive.construct, on_timer = hive.timer, + can_dig = function(pos) local inv = minetest.get_meta(pos):get_inventory() return inv:is_empty("honey") end, + on_punch = function(_, _, puncher) puncher:set_hp(puncher:get_hp() - 2) end, - allow_metadata_inventory_put = function() return 0 end, + + allow_metadata_inventory_put = function() + return 0 + end, + on_metadata_inventory_take = function(pos, _, _, stack) if stack:get_count() == honey_max then local timer = minetest.get_node_timer(pos) @@ -75,8 +85,13 @@ minetest.register_craftitem("xdecor:honey", { description = "Honey", inventory_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 diff --git a/src/itemframe.lua b/src/itemframe.lua index 5253224..0843b45 100644 --- a/src/itemframe.lua +++ b/src/itemframe.lua @@ -6,15 +6,18 @@ local function remove_item(pos, node) if not objs then return end for _, obj in pairs(objs) do - if obj and obj:get_luaentity() and - obj:get_luaentity().name == "xdecor:f_item" then + local ent = obj:get_luaentity() + if obj and ent and ent.name == "xdecor:f_item" then obj:remove() break end end end local facedir = { - [0] = {x=0, y=0, z=1}, {x=1, y=0, z=0}, {x=0, y=0, z=-1}, {x=-1, y=0, z=0} + [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) @@ -29,8 +32,8 @@ local function update_item(pos, node) tmp.texture = ItemStack(itemstring):get_name() local entity = minetest.add_entity(pos, "xdecor:f_item") - local yaw = math.pi*2 - node.param2 * math.pi/2 - entity:setyaw(yaw) + local yaw = (math.pi * 2) - node.param2 * (math.pi / 2) + entity:set_yaw(yaw) local timer = minetest.get_node_timer(pos) timer:start(15.0) @@ -53,7 +56,7 @@ function itemframe.after_place(pos, placer, itemstack) local meta = minetest.get_meta(pos) local name = placer:get_player_name() meta:set_string("owner", name) - meta:set_string("infotext", "Item Frame (owned by "..name..")") + meta:set_string("infotext", "Item Frame (owned by " .. name .. ")") end function itemframe.timer(pos) @@ -64,6 +67,7 @@ function itemframe.timer(pos) if num == 0 and meta:get_string("item") ~= "" then update_item(pos, node) end + return true end @@ -91,8 +95,9 @@ function itemframe.punch(pos, node, puncher) local owner = meta:get_string("owner") local admin = minetest.check_player_privs(player_name, "protection_bypass") - if not admin and player_name ~= owner then return end - drop_item(pos, node) + if admin and player_name == owner then + drop_item(pos, node) + end end function itemframe.dig(pos, player) @@ -107,14 +112,16 @@ end xdecor.register("itemframe", { 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(), on_rotate = screwdriver.disallow, sunlight_propagates = true, inventory_image = "xdecor_itemframe.png", node_box = xdecor.nodebox.slab_z(0.9375), - tiles = {"xdecor_wood.png", "xdecor_wood.png", "xdecor_wood.png", - "xdecor_wood.png", "xdecor_wood.png", "xdecor_itemframe.png"}, + tiles = { + "xdecor_wood.png", "xdecor_wood.png", "xdecor_wood.png", + "xdecor_wood.png", "xdecor_wood.png", "xdecor_itemframe.png" + }, after_place_node = itemframe.after_place, on_timer = itemframe.timer, on_rightclick = itemframe.rightclick, @@ -125,12 +132,12 @@ xdecor.register("itemframe", { minetest.register_entity("xdecor:f_item", { visual = "wielditem", - visual_size = {x=0.33, y=0.33}, + visual_size = {x = 0.33, y = 0.33}, collisionbox = {0}, physical = false, textures = {"air"}, 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 self.object:remove() end @@ -148,13 +155,16 @@ minetest.register_entity("xdecor:f_item", { end end if self.texture then - self.object:set_properties({textures={self.texture}}) + self.object:set_properties({ + textures = {self.texture} + }) end end, get_staticdata = function(self) if self.nodename and self.texture then - return self.nodename..";"..self.texture + return self.nodename .. ";" .. self.texture end + return "" end }) diff --git a/src/mailbox.lua b/src/mailbox.lua index 5c2dcd2..a3f5424 100644 --- a/src/mailbox.lua +++ b/src/mailbox.lua @@ -2,17 +2,25 @@ local mailbox = {} screwdriver = screwdriver or {} local function get_img(img) + if not img then return end local img_name = img:match("(.*)%.png") - if img_name then return img_name..".png" end + + if img_name then + return img_name .. ".png" + end end local function img_col(stack) local def = minetest.registered_items[stack] - if not def then return "" end + if not def then + return "" + end if def.inventory_image ~= "" then local img = get_img(def.inventory_image) - if img then return img end + if img then + return img + end end if def.tiles then @@ -22,30 +30,34 @@ local function img_col(stack) elseif type(tile) == "string" then img = get_img(tile) end - if img then return img end + + if img then + return img + end end return "" end function mailbox:formspec(pos, owner, is_owner) - local spos = pos.x..","..pos.y..","..pos.z + local spos = pos.x .. "," .. pos.y .. "," .. pos.z local meta = minetest.get_meta(pos) local giver, img = "", "" if is_owner then for i = 1, 7 do - local giving = meta:get_string("giver"..i) + local giving = meta:get_string("giver" .. i) 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 stack_name = stack:match("[%w_:]+") local stack_count = stack:match("%s(%d+)") or 1 - giver = giver.."#FFFF00,"..giver_name..","..i.. - ",#FFFFFF,x "..stack_count.."," - img = img..i.."=".. - img_col(stack_name).."^\\[resize:16x16," + giver = giver .. "#FFFF00," .. giver_name .. "," .. i .. + ",#FFFFFF,x " .. stack_count .. "," + + img = img .. i .. "=" .. + img_col(stack_name) .. "^\\[resize:16x16," end end @@ -55,20 +67,21 @@ function mailbox:formspec(pos, owner, is_owner) box[6,0.72;3.3,3.5;#555555] listring[current_player;main] list[current_player;main;0.75,5.25;8,4;] - tableoptions[background=#00000000;highlight=#00000000;border=false] ]].. - "tablecolumns[color;text;image,"..img.."0;color;text]".. - "table[6,0.75;3.3,4;givers;"..giver.."]".. - "list[nodemeta:"..spos..";mailbox;0,0.75;6,4;]".. - "listring[nodemeta:"..spos..";mailbox]".. - xbg..default.get_hotbar_bg(0.75,5.25) + tableoptions[background=#00000000;highlight=#00000000;border=false] ]] .. + "tablecolumns[color;text;image," .. img .. "0;color;text]" .. + "table[6,0.75;3.3,4;givers;" .. giver .. "]" .. + "list[nodemeta:" .. spos .. ";mailbox;0,0.75;6,4;]" .. + "listring[nodemeta:" .. spos .. ";mailbox]" .. + xbg .. default.get_hotbar_bg(0.75, 5.25) end - return [[ size[8,5] - list[current_player;main;0,1.25;8,4;] ]].. - "label[0,0;Send your goods to\n".. + + return "size[8,5]" .. + "list[current_player;main;0,1.25;8,4;]" .. + "label[0,0;Send your goods to\n" .. (minetest.colorize and - minetest.colorize("#FFFF00", owner) or owner).."]".. - "list[nodemeta:"..spos..";drop;3.5,0;1,1;]".. - xbg..default.get_hotbar_bg(0,1.25) + minetest.colorize("#FFFF00", owner) or owner) .. "]" .. + "list[nodemeta:" .. spos .. ";drop;3.5,0;1,1;]" .. + xbg .. default.get_hotbar_bg(0, 1.25) end function mailbox.dig(pos, player) @@ -85,10 +98,10 @@ function mailbox.after_place_node(pos, placer) local player_name = placer:get_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() - inv:set_size("mailbox", 6*4) + inv:set_size("mailbox", 6 * 4) inv:set_size("drop", 1) end @@ -97,8 +110,9 @@ function mailbox.rightclick(pos, node, clicker, itemstack, pointed_thing) local player = clicker:get_player_name() local owner = meta:get_string("owner") - minetest.show_formspec(player, "xdecor:mailbox", mailbox:formspec(pos, - owner, (player == owner))) + minetest.show_formspec(player, "xdecor:mailbox", + mailbox:formspec(pos, owner, (player == owner))) + return itemstack end @@ -109,9 +123,10 @@ function mailbox.put(pos, listname, _, stack, player) return -1 else minetest.chat_send_player(player:get_player_name(), - "The mailbox is full") + "The mailbox is full") end end + return 0 end @@ -124,8 +139,8 @@ function mailbox.on_put(pos, listname, _, stack, player) inv:add_item("mailbox", stack) for i = 7, 2, -1 do - meta:set_string("giver"..i, meta:get_string("giver"..(i-1))) - meta:set_string("stack"..i, meta:get_string("stack"..(i-1))) + meta:set_string("giver" .. i, meta:get_string("giver" .. (i - 1))) + meta:set_string("stack" .. i, meta:get_string("stack" .. (i - 1))) end meta:set_string("giver1", player:get_player_name()) @@ -139,6 +154,7 @@ function mailbox.allow_take(pos, listname, index, stack, player) if player:get_player_name() ~= meta:get_string("owner") then return 0 end + return stack:get_count() end @@ -151,7 +167,7 @@ xdecor.register("mailbox", { tiles = {"xdecor_mailbox_top.png", "xdecor_mailbox_bottom.png", "xdecor_mailbox_side.png", "xdecor_mailbox_side.png", "xdecor_mailbox.png", "xdecor_mailbox.png"}, - groups = {cracky=3, oddly_breakable_by_hand=1}, + groups = {cracky = 3, oddly_breakable_by_hand = 1}, on_rotate = screwdriver.rotate_simple, can_dig = mailbox.dig, on_rightclick = mailbox.rightclick, diff --git a/src/mechanisms.lua b/src/mechanisms.lua index b065c90..e453229 100644 --- a/src/mechanisms.lua +++ b/src/mechanisms.lua @@ -12,14 +12,14 @@ local function door_toggle(pos_actuator, pos_door, player) if actuator.name:sub(-4) == "_off" then minetest.set_node(pos_actuator, - {name=actuator.name:gsub("_off", "_on"), param2=actuator.param2}) + {name = actuator.name:gsub("_off", "_on"), param2 = actuator.param2}) end door:open(player) minetest.after(2, function() if minetest.get_node(pos_actuator).name:sub(-3) == "_on" then minetest.set_node(pos_actuator, - {name=actuator.name, param2=actuator.param2}) + {name = actuator.name, param2 = actuator.param2}) end -- Re-get player object (or nil) because 'player' could -- be an invalid object at this time (player left) @@ -35,25 +35,27 @@ end function plate.timer(pos) local objs = minetest.get_objects_inside_radius(pos, 0.8) if not next(objs) or not doors.get then return true end - local minp = {x=pos.x-2, y=pos.y, z=pos.z-2} - local maxp = {x=pos.x+2, y=pos.y, z=pos.z+2} + + local minp = {x = pos.x - 2, y = pos.y, z = pos.z - 2} + local maxp = {x = pos.x + 2, y = pos.y, z = pos.z + 2} local doors = minetest.find_nodes_in_area(minp, maxp, "group:door") for _, player in pairs(objs) do if player:is_player() then - for i=1, #doors do + for i = 1, #doors do door_toggle(pos, doors[i], player) end break end end + return true end function plate.register(material, desc, def) - xdecor.register("pressure_"..material.."_off", { - description = desc.." Pressure Plate", - tiles = {"xdecor_pressure_"..material..".png"}, + xdecor.register("pressure_" .. material .. "_off", { + description = desc .. " Pressure Plate", + tiles = {"xdecor_pressure_" .. material .. ".png"}, drawtype = "nodebox", node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 1, 14}}), groups = def.groups, @@ -63,13 +65,13 @@ function plate.register(material, desc, def) on_construct = plate.construct, on_timer = plate.timer }) - xdecor.register("pressure_"..material.."_on", { - tiles = {"xdecor_pressure_"..material..".png"}, + xdecor.register("pressure_" .. material .. "_on", { + tiles = {"xdecor_pressure_" .. material .. ".png"}, drawtype = "nodebox", node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 0.4, 14}}), groups = def.groups, sounds = def.sounds, - drop = "xdecor:pressure_"..material.."_off", + drop = "xdecor:pressure_" .. material .. "_off", sunlight_propagates = true, on_rotate = screwdriver.rotate_simple }) @@ -77,12 +79,12 @@ end plate.register("wood", "Wooden", { 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", { 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", { @@ -90,19 +92,21 @@ xdecor.register("lever_off", { tiles = {"xdecor_lever_off.png"}, drawtype = "nodebox", 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(), sunlight_propagates = true, on_rotate = screwdriver.rotate_simple, + on_rightclick = function(pos, node, clicker, itemstack) if not doors.get then return itemstack end - local minp = {x=pos.x-2, y=pos.y-1, z=pos.z-2} - local maxp = {x=pos.x+2, y=pos.y+1, z=pos.z+2} + local minp = {x = pos.x - 2, y = pos.y - 1, z = pos.z - 2} + local maxp = {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2} local doors = minetest.find_nodes_in_area(minp, maxp, "group:door") - for i=1, #doors do + for i = 1, #doors do door_toggle(pos, doors[i], clicker) end + return itemstack end }) @@ -111,7 +115,7 @@ xdecor.register("lever_on", { tiles = {"xdecor_lever_on.png"}, drawtype = "nodebox", node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}), - groups = {cracky=3, oddly_breakable_by_hand=2, not_in_creative_inventory=1}, + groups = {cracky = 3, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1}, sounds = default.node_sound_stone_defaults(), sunlight_propagates = true, on_rotate = screwdriver.rotate_simple, @@ -138,4 +142,4 @@ minetest.register_craft({ {"group:stick"}, {"group:stone"} } -}) \ No newline at end of file +}) diff --git a/src/nodes.lua b/src/nodes.lua index 7bf1a0f..258a801 100644 --- a/src/nodes.lua +++ b/src/nodes.lua @@ -3,12 +3,12 @@ screwdriver = screwdriver or {} local function register_pane(name, desc, def) xpanes.register_pane(name, { description = desc, - tiles = {"xdecor_"..name..".png"}, + tiles = {"xdecor_" .. name .. ".png"}, drawtype = "airlike", paramtype = "light", - textures = {"xdecor_"..name..".png", "xdecor_"..name..".png", "xpanes_space.png"}, - inventory_image = "xdecor_"..name..".png", - wield_image = "xdecor_"..name..".png", + textures = {"xdecor_" .. name .. ".png", "xdecor_" .. name .. ".png", "xpanes_space.png"}, + inventory_image = "xdecor_" .. name .. ".png", + wield_image = "xdecor_" .. name .. ".png", groups = def.groups, sounds = def.sounds or default.node_sound_defaults(), recipe = def.recipe @@ -16,33 +16,41 @@ local function register_pane(name, desc, def) end register_pane("bamboo_frame", "Bamboo Frame", { - groups = {choppy=3, oddly_breakable_by_hand=2, pane=1, flammable=2}, - recipe = {{"default:papyrus", "default:papyrus", "default:papyrus"}, - {"default:papyrus", "farming:cotton", "default:papyrus"}, - {"default:papyrus", "default:papyrus", "default:papyrus"}} + groups = {choppy = 3, oddly_breakable_by_hand = 2, pane = 1, flammable = 2}, + recipe = { + {"default:papyrus", "default:papyrus", "default:papyrus"}, + {"default:papyrus", "farming:cotton", "default:papyrus"}, + {"default:papyrus", "default:papyrus", "default:papyrus"} + } }) register_pane("chainlink", "Chainlink", { - groups = {cracky=3, oddly_breakable_by_hand=2, pane=1}, - recipe = {{"default:steel_ingot", "", "default:steel_ingot"}, - {"", "default:steel_ingot", ""}, - {"default:steel_ingot", "", "default:steel_ingot"}} + groups = {cracky = 3, oddly_breakable_by_hand = 2, pane = 1}, + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"", "default:steel_ingot", ""}, + {"default:steel_ingot", "", "default:steel_ingot"} + } }) register_pane("rusty_bar", "Rusty Iron Bars", { sounds = default.node_sound_stone_defaults(), - groups = {cracky=2, pane=1}, - recipe = {{"", "default:dirt", ""}, - {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, - {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}} + groups = {cracky = 2, pane = 1}, + recipe = { + {"", "default:dirt", ""}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"} + } }) register_pane("wood_frame", "Wood Frame", { sounds = default.node_sound_wood_defaults(), - groups = {choppy=2, pane=1, flammable=2}, - recipe = {{"group:wood", "group:stick", "group:wood"}, - {"group:stick", "group:stick", "group:stick"}, - {"group:wood", "group:stick", "group:wood"}} + groups = {choppy = 2, pane = 1, flammable = 2}, + recipe = { + {"group:wood", "group:stick", "group:wood"}, + {"group:stick", "group:stick", "group:stick"}, + {"group:wood", "group:stick", "group:wood"} + } }) xdecor.register("baricade", { @@ -51,7 +59,7 @@ xdecor.register("baricade", { paramtype2 = "facedir", inventory_image = "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, selection_box = xdecor.nodebox.slab_y(0.3), collision_box = xdecor.pixelbox(2, {{0, 0, 1, 2, 2, 0}}) @@ -61,38 +69,42 @@ xdecor.register("barrel", { description = "Barrel", tiles = {"xdecor_barrel_top.png", "xdecor_barrel_top.png", "xdecor_barrel_sides.png"}, on_place = minetest.rotate_node, - groups = {choppy=2, oddly_breakable_by_hand=1, flammable=2}, + groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, sounds = default.node_sound_wood_defaults() }) local function register_storage(name, desc, def) xdecor.register(name, { description = desc, - inventory = {size=def.inv_size or 24}, + inventory = {size = def.inv_size or 24}, infotext = desc, tiles = def.tiles, node_box = def.node_box, on_rotate = def.on_rotate, on_place = def.on_place, - groups = def.groups or {choppy=2, oddly_breakable_by_hand=1, flammable=2}, + groups = def.groups or {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, sounds = default.node_sound_wood_defaults() }) end register_storage("cabinet", "Wooden Cabinet", { on_rotate = screwdriver.rotate_simple, - tiles = {"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", - "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", - "xdecor_cabinet_sides.png", "xdecor_cabinet_front.png"} + tiles = { + "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", + "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", + "xdecor_cabinet_sides.png", "xdecor_cabinet_front.png" + } }) register_storage("cabinet_half", "Half Wooden Cabinet", { inv_size = 8, node_box = xdecor.nodebox.slab_y(0.5, 0.5), on_rotate = screwdriver.rotate_simple, - tiles = {"xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", - "xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_sides.png", - "xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_front.png"} + tiles = { + "xdecor_cabinet_sides.png", "xdecor_cabinet_sides.png", + "xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_sides.png", + "xdecor_half_cabinet_sides.png", "xdecor_half_cabinet_front.png" + } }) if minetest.get_modpath("moreblocks") then @@ -100,15 +112,19 @@ if minetest.get_modpath("moreblocks") then else register_storage("empty_shelf", "Empty Shelf", { on_rotate = screwdriver.rotate_simple, - tiles = {"default_wood.png", "default_wood.png", "default_wood.png", - "default_wood.png", "default_wood.png^xdecor_empty_shelf.png"} + tiles = { + "default_wood.png", "default_wood.png", "default_wood.png", + "default_wood.png", "default_wood.png^xdecor_empty_shelf.png" + } }) end register_storage("multishelf", "Multi Shelf", { on_rotate = screwdriver.rotate_simple, - tiles = {"default_wood.png", "default_wood.png", "default_wood.png", - "default_wood.png", "default_wood.png^xdecor_multishelf.png"}, + tiles = { + "default_wood.png", "default_wood.png", "default_wood.png", + "default_wood.png", "default_wood.png^xdecor_multishelf.png" + }, }) xdecor.register("candle", { @@ -119,13 +135,20 @@ xdecor.register("candle", { wield_image = "xdecor_candle_wield.png", paramtype2 = "wallmounted", walkable = false, - groups = {dig_immediate=3, attached_node=1}, - tiles = {{name = "xdecor_candle_floor.png", - animation = {type="vertical_frames", length=1.5}}, - {name = "xdecor_candle_floor.png", - animation = {type="vertical_frames", length=1.5}}, - {name = "xdecor_candle_wall.png", - animation = {type="vertical_frames", length=1.5}} + groups = {dig_immediate = 3, attached_node = 1}, + tiles = { + { + name = "xdecor_candle_floor.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 = { type = "wallmounted", @@ -139,12 +162,15 @@ xdecor.register("chair", { description = "Chair", tiles = {"xdecor_wood.png"}, 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, node_box = xdecor.pixelbox(16, { - {3, 0, 11, 2, 16, 2}, {11, 0, 11, 2, 16, 2}, - {5, 9, 11.5, 6, 6, 1}, {3, 0, 3, 2, 6, 2}, - {11, 0, 3, 2, 6, 2}, {3, 6, 3, 10, 2, 8} + {3, 0, 11, 2, 16, 2}, + {11, 0, 11, 2, 16, 2}, + {5, 9, 11.5, 6, 6, 1}, + {3, 0, 3, 2, 6, 2}, + {11, 0, 3, 2, 6, 2}, + {3, 6, 3, 10, 2, 8} }), can_dig = xdecor.sit_dig, on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) @@ -167,7 +193,7 @@ xdecor.register("cobweb", { liquid_range = 0, walkable = false, selection_box = {type = "regular"}, - groups = {snappy=3, liquid=3, flammable=3}, + groups = {snappy = 3, liquid = 3, flammable = 3}, sounds = default.node_sound_leaves_defaults() }) @@ -175,51 +201,53 @@ local curtain_colors = { "red", } -for _, c in pairs(curtain_colors) do - xdecor.register("curtain_"..c, { - description = c:gsub("^%l", string.upper).." Curtain", +for _, c in ipairs(curtain_colors) do + xdecor.register("curtain_" .. c, { + description = c:gsub("^%l", string.upper) .. " Curtain", walkable = false, tiles = {"wool_white.png"}, 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", - wield_image = "wool_white.png^[colorize:"..c..":170", + wield_image = "wool_white.png^[colorize:" .. c .. ":170", drawtype = "signlike", paramtype2 = "colorwallmounted", - groups = {dig_immediate=3, flammable=3}, - selection_box = {type="wallmounted"}, + groups = {dig_immediate = 3, flammable = 3}, + selection_box = {type = "wallmounted"}, on_rightclick = function(pos, node, _, itemstack) - minetest.set_node(pos, {name="xdecor:curtain_open_"..c, param2=node.param2}) + minetest.set_node(pos, {name = "xdecor:curtain_open_" .. c, param2 = node.param2}) return itemstack end }) - xdecor.register("curtain_open_"..c, { + xdecor.register("curtain_open_" .. c, { tiles = {"wool_white.png^xdecor_curtain_open_overlay.png^[makealpha:255,126,126"}, color = c, drawtype = "signlike", paramtype2 = "colorwallmounted", walkable = false, - groups = {dig_immediate=3, flammable=3, not_in_creative_inventory=1}, + groups = {dig_immediate = 3, flammable = 3, not_in_creative_inventory = 1}, selection_box = {type="wallmounted"}, - drop = "xdecor:curtain_"..c, + drop = "xdecor:curtain_" .. c, 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 end }) minetest.register_craft({ - output = "xdecor:curtain_"..c.." 4", - recipe = {{"", "wool:"..c, ""}, - {"", "wool:"..c, ""}} + output = "xdecor:curtain_" .. c .. " 4", + recipe = { + {"", "wool:" .. c, ""}, + {"", "wool:" .. c, ""} + } }) end xdecor.register("cushion", { description = "Cushion", 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, node_box = xdecor.nodebox.slab_y(0.5), can_dig = xdecor.sit_dig, @@ -233,7 +261,7 @@ xdecor.register("cushion", { xdecor.register("cushion_block", { description = "Cushion Block", 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) @@ -244,30 +272,37 @@ local xdecor_doors = { japanese = { {"group:wood", "default:paper"}, {"default:paper", "group:wood"}, - {"group:wood", "default:paper"} }, + {"group:wood", "default:paper"} + }, 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"} + }, 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"} + }, screen = { {"group:wood", "group:wood"}, {"xpanes:chainlink_flat", "xpanes:chainlink_flat"}, - {"group:wood", "group:wood"} }, + {"group:wood", "group:wood"} + }, slide = { {"default:paper", "default:paper"}, {"default:paper", "default:paper"}, - {"group:wood", "group:wood"} }, + {"group:wood", "group:wood"} + }, woodglass = { {"default:glass", "default:glass"}, {"group:wood", "group:wood"}, - {"group:wood", "group:wood"} } + {"group:wood", "group:wood"} + }, } local mesecons_register + if minetest.global_exists("mesecon") then mesecons_register = { effector = { action_on = function(pos, node) @@ -288,23 +323,27 @@ end for name, recipe in pairs(xdecor_doors) do if not doors.register then break end - doors.register(name.."_door", { - tiles = {{name = "xdecor_"..name.."_door.png", backface_culling=true}}, - description = name:gsub("%f[%w]%l", string.upper):gsub("_", " ").." Door", - inventory_image = "xdecor_"..name.."_door_inv.png", + doors.register(name .. "_door", { + tiles = { + {name = "xdecor_" .. name .. "_door.png", backface_culling = true} + }, + description = name:gsub("%f[%w]%l", string.upper):gsub("_", " ") .. " Door", + inventory_image = "xdecor_" .. name .. "_door_inv.png", 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, - mesecons = mesecons_register + mesecons = mesecons_register, }) end xdecor.register("enderchest", { description = "Ender Chest", - tiles = {"xdecor_enderchest_top.png", "xdecor_enderchest_top.png", - "xdecor_enderchest_side.png", "xdecor_enderchest_side.png", - "xdecor_enderchest_side.png", "xdecor_enderchest_front.png"}, - groups = {cracky=1, choppy=1}, + tiles = { + "xdecor_enderchest_top.png", "xdecor_enderchest_top.png", + "xdecor_enderchest_side.png", "xdecor_enderchest_side.png", + "xdecor_enderchest_side.png", "xdecor_enderchest_front.png" + }, + groups = {cracky = 1, choppy = 1}, sounds = default.node_sound_stone_defaults(), on_rotate = screwdriver.rotate_simple, on_construct = function(pos) @@ -314,7 +353,8 @@ xdecor.register("enderchest", { list[current_player;main;0,5;8,4;] listring[current_player;enderchest] listring[current_player;main] ]] - ..xbg..default.get_hotbar_bg(0,5)) + .. xbg .. default.get_hotbar_bg(0,5)) + meta:set_string("infotext", "Ender Chest") end }) @@ -329,7 +369,7 @@ xdecor.register("ivy", { drawtype = "signlike", walkable = false, 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", selection_box = {type="wallmounted"}, tiles = {"xdecor_ivy.png"}, @@ -346,38 +386,45 @@ xdecor.register("lantern", { wield_image = "xdecor_lantern_inv.png", paramtype2 = "wallmounted", walkable = false, - groups = {snappy=3, attached_node=1}, - tiles = {{name="xdecor_lantern.png", animation={type="vertical_frames", length=1.5}}}, + groups = {snappy = 3, attached_node = 1}, + tiles = { + { + name = "xdecor_lantern.png", + animation = {type="vertical_frames", length = 1.5} + } + }, selection_box = xdecor.pixelbox(16, {{4, 0, 4, 8, 16, 8}}) }) -for _, l in pairs({"iron", "wooden"}) do - xdecor.register(l.."_lightbox", { - description = l:gsub("^%l", string.upper).." Light Box", - tiles = {"xdecor_"..l.."_lightbox.png"}, - groups = {cracky=3, choppy=3, oddly_breakable_by_hand=2}, +for _, l in ipairs({"iron", "wooden"}) do + xdecor.register(l .. "_lightbox", { + description = l:gsub("^%l", string.upper) .. " Light Box", + tiles = {"xdecor_" .. l .. "_lightbox.png"}, + groups = {cracky = 3, choppy = 3, oddly_breakable_by_hand = 2}, light_source = 13, sounds = default.node_sound_glass_defaults() }) end -for _, f in pairs({"dandelion_white", "dandelion_yellow", "geranium", +for _, f in ipairs({"dandelion_white", "dandelion_yellow", "geranium", "rose", "tulip", "viola"}) do - xdecor.register("potted_"..f, { - description = "Potted "..f:gsub("%f[%w]%l", string.upper):gsub("_", " "), + xdecor.register("potted_" .. f, { + description = "Potted " .. f:gsub("%f[%w]%l", string.upper):gsub("_", " "), walkable = false, - groups = {snappy=3, flammable=3, plant=1, flower=1}, - tiles = {"xdecor_"..f.."_pot.png"}, - inventory_image = "xdecor_"..f.."_pot.png", + groups = {snappy = 3, flammable = 3, plant = 1, flower = 1}, + tiles = {"xdecor_" .. f .. "_pot.png"}, + inventory_image = "xdecor_" .. f .. "_pot.png", drawtype = "plantlike", sounds = default.node_sound_leaves_defaults(), selection_box = xdecor.nodebox.slab_y(0.3) }) minetest.register_craft({ - output = "xdecor:potted_"..f, - recipe = {{"default:clay_brick", "flowers:"..f, - "default:clay_brick"}, {"", "default:clay_brick", ""}} + output = "xdecor:potted_" .. f, + recipe = { + {"default:clay_brick", "flowers:" .. f, "default:clay_brick"}, + {"", "default:clay_brick", ""} + } }) end @@ -395,30 +442,37 @@ xdecor.register("painting_1", { wield_image = "xdecor_painting_empty.png", paramtype2 = "wallmounted", 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(), node_box = painting_box, node_placement_prediction = "", on_place = function(itemstack, placer, pointed_thing) local num = math.random(4) local leftover = minetest.item_place_node( - ItemStack("xdecor:painting_"..num), placer, pointed_thing) + ItemStack("xdecor:painting_" .. num), placer, pointed_thing) + if leftover:get_count() == 0 and not minetest.setting_getbool("creative_mode") then itemstack:take_item() end + return itemstack end }) for i = 2, 4 do - xdecor.register("painting_"..i, { - tiles = {"xdecor_painting_"..i..".png"}, + xdecor.register("painting_" .. i, { + tiles = {"xdecor_painting_" .. i .. ".png"}, paramtype2 = "wallmounted", drop = "xdecor:painting_1", sunlight_propagates = true, - groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2, - attached_node=1, not_in_creative_inventory=1}, + groups = { + choppy = 3, + oddly_breakable_by_hand = 2, + flammable = 2, + attached_node = 1, + not_in_creative_inventory = 1 + }, sounds = default.node_sound_wood_defaults(), node_box = painting_box }) @@ -427,7 +481,7 @@ end xdecor.register("stonepath", { description = "Garden Stone Path", tiles = {"default_stone.png"}, - groups = {snappy=3}, + groups = {snappy = 3}, on_rotate = screwdriver.rotate_simple, sounds = default.node_sound_stone_defaults(), sunlight_propagates = true, @@ -442,8 +496,8 @@ local function register_hard_node(name, desc, def) def = def or {} xdecor.register(name, { description = desc, - tiles = {"xdecor_"..name..".png"}, - groups = def.groups or {cracky=1}, + tiles = {"xdecor_" .. name .. ".png"}, + groups = def.groups or {cracky = 1}, sounds = def.sounds or default.node_sound_stone_defaults() }) end @@ -455,19 +509,21 @@ register_hard_node("hard_clay", "Hardened Clay") register_hard_node("moonbrick", "Moon Brick") register_hard_node("stone_tile", "Stone Tile") register_hard_node("stone_rune", "Runestone") + 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() }) + 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() }) xdecor.register("table", { description = "Table", 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(), node_box = xdecor.pixelbox(16, { {0, 14, 0, 16, 2, 16}, {5.5, 0, 5.5, 5, 14, 6} @@ -478,7 +534,7 @@ xdecor.register("tatami", { description = "Tatami", tiles = {"xdecor_tatami.png"}, wield_image = "xdecor_tatami.png", - groups = {snappy=3, flammable=3}, + groups = {snappy = 3, flammable = 3}, sunlight_propagates = true, node_box = xdecor.nodebox.slab_y(0.0625) }) @@ -486,22 +542,31 @@ xdecor.register("tatami", { xdecor.register("trampoline", { description = "Trampoline", 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), - sounds = {footstep = {name="xdecor_bouncy", gain=0.8}} + sounds = { + footstep = { + name = "xdecor_bouncy", + gain = 0.8 + } + } }) xdecor.register("tv", { description = "Television", light_source = 11, - groups = {cracky=3, oddly_breakable_by_hand=2}, + groups = {cracky = 3, oddly_breakable_by_hand = 2}, on_rotate = screwdriver.rotate_simple, - tiles = {"xdecor_television_left.png^[transformR270", - "xdecor_television_left.png^[transformR90", - "xdecor_television_left.png^[transformFX", - "xdecor_television_left.png", "xdecor_television_back.png", - {name="xdecor_television_front_animated.png", - animation = {type="vertical_frames", length=80.0}} } + tiles = { + "xdecor_television_left.png^[transformR270", + "xdecor_television_left.png^[transformR90", + "xdecor_television_left.png^[transformFX", + "xdecor_television_left.png", "xdecor_television_back.png", + { + name = "xdecor_television_front_animated.png", + animation = {type = "vertical_frames", length = 80.0} + } + } }) xdecor.register("woodframed_glass", { @@ -509,6 +574,6 @@ xdecor.register("woodframed_glass", { drawtype = "glasslike_framed", sunlight_propagates = true, 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() }) diff --git a/src/rope.lua b/src/rope.lua index b6d9452..8199db2 100644 --- a/src/rope.lua +++ b/src/rope.lua @@ -6,6 +6,7 @@ function rope.place(itemstack, placer, pointed_thing) local pos = pointed_thing.above local oldnode = minetest.get_node(pos) local stackname = itemstack:get_name() + if minetest.is_protected(pos, placer:get_player_name()) then return itemstack end @@ -18,12 +19,13 @@ function rope.place(itemstack, placer, pointed_thing) oldnode = minetest.get_node(pos) end end + return itemstack end function rope.remove(pos, oldnode, digger, rope_name) local num = 0 - local below = {x=pos.x, y=pos.y, z=pos.z} + local below = {x = pos.x, y = pos.y, z = pos.z} local digger_inv = digger:get_inventory() while minetest.get_node(below).name == rope_name do @@ -31,8 +33,10 @@ function rope.remove(pos, oldnode, digger, rope_name) below.y = below.y - 1 num = num + 1 end + if num == 0 then return end digger_inv:add_item("main", rope_name.." "..num) + return true end @@ -41,14 +45,16 @@ xdecor.register("rope", { drawtype = "plantlike", walkable = false, climbable = true, - groups = {snappy=3, flammable=3}, + groups = {snappy = 3, flammable = 3}, tiles = {"xdecor_rope.png"}, inventory_image = "xdecor_rope_inv.png", wield_image = "xdecor_rope_inv.png", selection_box = xdecor.pixelbox(8, {{3, 0, 3, 2, 8, 2}}), on_place = rope.place, + on_punch = function(pos, node, puncher, pointed_thing) local player_name = puncher:get_player_name() + if not minetest.is_protected(pos, player_name) or minetest.get_player_privs(player_name).protection_bypass then rope.remove(pos, node, puncher, "xdecor:rope") @@ -65,4 +71,4 @@ minetest.register_craft({ {"farming:string"}, {"farming:string"} } -}) \ No newline at end of file +}) diff --git a/src/workbench.lua b/src/workbench.lua index e948c62..097c585 100644 --- a/src/workbench.lua +++ b/src/workbench.lua @@ -9,7 +9,7 @@ local registered_nodes = minetest.registered_nodes local nodes = {} for node, def in pairs(registered_nodes) do if xdecor.stairs_valid_def(def) then - nodes[#nodes+1] = node + nodes[#nodes + 1] = node end end @@ -20,99 +20,117 @@ WB.custom_nodes_register = { setmetatable(nodes, { __concat = function(t1, t2) - for i=1, #t2 do - t1[#t1+1] = t2[i] + for i = 1, #t2 do + t1[#t1 + 1] = t2[i] end + return t1 end }) -nodes = nodes..WB.custom_nodes_register +nodes = nodes .. WB.custom_nodes_register -- Nodeboxes definitions workbench.defs = { - -- Name Yield X Y Z W H L + -- Name YieldX YZ WH L {"nanoslab", 16, { 0, 0, 0, 8, 1, 8 }}, {"micropanel", 16, { 0, 0, 0, 16, 1, 8 }}, {"microslab", 8, { 0, 0, 0, 16, 1, 16 }}, {"thinstair", 8, { 0, 7, 0, 16, 1, 8 }, - { 0, 15, 8, 16, 1, 8 }}, + { 0, 15, 8, 16, 1, 8 }}, {"cube", 4, { 0, 0, 0, 8, 8, 8 }}, {"panel", 4, { 0, 0, 0, 16, 8, 8 }}, {"slab", 2, nil }, {"doublepanel", 2, { 0, 0, 0, 16, 8, 8 }, - { 0, 8, 8, 16, 8, 8 }}, + { 0, 8, 8, 16, 8, 8 }}, {"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", 1, nil }, {"stair_inner", 1, nil } } +local repairable_tools = {"pick", "axe", "shovel", "sword", "hoe", "armor", "shield"} + -- Tools allowed to be repaired function workbench:repairable(stack) - local tools = {"pick", "axe", "shovel", "sword", "hoe", "armor", "shield"} - for _, t in pairs(tools) do - if stack:find(t) then return true end + for _, t in ipairs(repairable_tools) do + if stack:find(t) then + return true + end end - return false end function workbench:get_output(inv, input, name) local output = {} - for i=1, #self.defs do + for i = 1, #self.defs do local nbox = self.defs[i] local count = min(nbox[2] * input:get_count(), input:get_stack_max()) - local item = name.."_"..nbox[1] - item = nbox[3] and item or "stairs:"..nbox[1].."_"..name:match(":(.*)") - output[#output+1] = item.." "..count + local item = name .. "_" .. nbox[1] + + item = nbox[3] and item or "stairs:" .. nbox[1] .. "_" .. name:match(":(.*)") + output[#output + 1] = item .. " " .. count end inv:set_list("forms", output) 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 = { -- Main formspec - [[ 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] ]], + main_fs, + -- Crafting formspec - [[ 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] ]], + crafting_fs, + -- Storage formspec - [[ list[context;storage;0,1;8,2;] - button[0,0;1.5,1;back;< Back] - listring[context;storage] - listring[current_player;main] ]] + storage_fs, } function workbench:set_formspec(meta, id) meta:set_string("formspec", - "size[8,7;]list[current_player;main;0,3.25;8,4;]".. - formspecs[id]..xbg..default.get_hotbar_bg(0,3.25)) + "size[8,7;]list[current_player;main;0,3.25;8,4;]" .. + formspecs[id] .. xbg .. default.get_hotbar_bg(0,3.25)) end function workbench.construct(pos) @@ -131,11 +149,11 @@ end function workbench.fields(pos, _, fields) if fields.quit then return end + local meta = minetest.get_meta(pos) - local id = fields.back and 1 or - fields.craft and 2 or - fields.storage and 3 + local id = fields.back and 1 or fields.craft and 2 or fields.storage and 3 if not id then return end + workbench:set_formspec(meta, id) end @@ -156,24 +174,26 @@ function workbench.timer(pos) return end - -- Tool's wearing range: 0-65535 | 0 = new condition + -- Tool's wearing range: 0-65535; 0 = new condition tool:add_wear(-500) hammer:add_wear(700) inv:set_stack("tool", 1, tool) inv:set_stack("hammer", 1, hammer) + return true end function workbench.put(_, listname, _, stack) local stackname = stack:get_name() if (listname == "tool" and stack:get_wear() > 0 and - workbench:repairable(stackname)) or - (listname == "input" and registered_nodes[stackname.."_cube"]) or + workbench:repairable(stackname)) or + (listname == "input" and registered_nodes[stackname .. "_cube"]) or (listname == "hammer" and stackname == "xdecor:hammer") or listname == "storage" then return stack:get_count() end + return 0 end @@ -199,7 +219,7 @@ function workbench.on_take(pos, listname, index, stack, player) local stackname = stack:get_name() 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) else inv:set_list("forms", {}) @@ -221,11 +241,13 @@ end xdecor.register("workbench", { 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(), - tiles = {"xdecor_workbench_top.png", "xdecor_workbench_top.png", - "xdecor_workbench_sides.png", "xdecor_workbench_sides.png", - "xdecor_workbench_front.png", "xdecor_workbench_front.png"}, + tiles = { + "xdecor_workbench_top.png","xdecor_workbench_top.png", + "xdecor_workbench_sides.png", "xdecor_workbench_sides.png", + "xdecor_workbench_front.png", "xdecor_workbench_front.png" + }, on_rotate = screwdriver.rotate_simple, can_dig = workbench.dig, on_timer = workbench.timer, @@ -237,8 +259,8 @@ xdecor.register("workbench", { allow_metadata_inventory_move = workbench.move }) -for _, d in pairs(workbench.defs) do -for i=1, #nodes do +for _, d in ipairs(workbench.defs) do +for i = 1, #nodes do local node = nodes[i] local mod_name, item_name = node:match("^(.-):(.*)") local def = registered_nodes[node] @@ -264,14 +286,14 @@ for i=1, #nodes do tiles = {def.tile_images[1]} 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, - groups, tiles, def.description.." Stair", - def.description.." Slab", def.sounds) + groups, tiles, def.description .. " Stair", + def.description .. " Slab", def.sounds) end - minetest.register_node(":"..node.."_"..d[1], { - description = def.description.." "..d[1]:gsub("^%l", string.upper), + minetest.register_node(":" .. node .. "_" .. d[1], { + description = def.description .. " " .. d[1]:gsub("^%l", string.upper), paramtype = "light", paramtype2 = "facedir", drawtype = "nodebox", @@ -283,14 +305,15 @@ for i=1, #nodes do sunlight_propagates = true, on_place = minetest.rotate_node }) + elseif item_name and mod_name then minetest.register_alias_force( - ('%s:%s_innerstair'):format(mod_name, item_name), - ('stairs:stair_inner_%s'):format(item_name) + ("%s:%s_innerstair"):format(mod_name, item_name), + ("stairs:stair_inner_%s"):format(item_name) ) minetest.register_alias_force( - ('%s:%s_outerstair'):format(mod_name, item_name), - ('stairs:stair_outer_%s'):format(item_name) + ("%s:%s_outerstair"):format(mod_name, item_name), + ("stairs:stair_outer_%s"):format(item_name) ) end end @@ -302,7 +325,9 @@ minetest.register_tool("xdecor:hammer", { description = "Hammer", inventory_image = "xdecor_hammer.png", wield_image = "xdecor_hammer.png", - on_use = function() do return end end + on_use = function() do + return end + end }) -- Recipes