X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=worktable.lua;h=192fb75a57ca1bff867b3d72982f78939d2dcf6f;hb=c36590b46fc2368982465a4c79ffabb126743c5f;hp=9d0cfd5885071f6b77a21ef0660eae30b3494ce5;hpb=9dfbe6e8afe3423153142afd1a8ea90cef887cff;p=xdecor.git diff --git a/worktable.lua b/worktable.lua index 9d0cfd5..192fb75 100644 --- a/worktable.lua +++ b/worktable.lua @@ -1,54 +1,48 @@ local worktable = {} screwdriver = screwdriver or {} -local nodes = { -- Nodes allowed to be cut. Registration format: [mod name] = [[ node names ]]. - ["default"] = [[ - wood tree cobble desert_stone - junglewood jungletree mossycobble stonebrick - pine_wood pine_tree desert_cobble sandstonebrick - acacia_wood acacia_tree stone desert_stonebrick - aspen_wood aspen_tree sandstone obsidianbrick - - coalblock mese obsidian - copperblock brick obsidian_glass - steelblock cactus - goldblock ice - bronzeblock meselamp - diamondblock glass - ]], - - ["xdecor"] = [[ - coalstone_tile hard_clay - desertstone_tile packed_ice - stone_rune moonbrick - stone_tile woodframed_glass - cactusbrick wood_tile - ]], -} +-- Nodes allowed to be cut. +-- Only the regular, solid blocks without formspec or explosivity can be cut. +function worktable.nodes(def) + return (def.drawtype == "normal" or def.drawtype:find("glass")) and + (def.groups.cracky or def.groups.choppy) and not + def.on_construct and not def.after_place_node and not + def.after_place_node and not def.on_rightclick and not + def.on_blast and not def.allow_metadata_inventory_take and not + (def.groups.not_in_creative_inventory == 1) and not + def.description:find("Ore") and not def.name:find("wool") and + def.description and def.description ~= "" and def.light_source == 0 +end -local defs = { +-- Nodeboxes definitions. +worktable.defs = { -- Name Yield X Y Z W H L {"nanoslab", 16, { 0, 0, 0, 8, 1, 8 }}, {"micropanel", 16, { 0, 0, 0, 16, 1, 8 }}, {"microslab", 8, { 0, 0, 0, 16, 1, 16 }}, {"thinstair", 8, { 0, 7, 0, 16, 1, 8 }, { 0, 15, 8, 16, 1, 8 }}, - {"cube", 4, { 0, 0, 8, 8, 8, 8 }}, + {"cube", 4, { 0, 0, 0, 8, 8, 8 }}, {"panel", 4, { 0, 0, 0, 16, 8, 8 }}, - {"slab", 2, { 0, 0, 0, 16, 8, 16 }}, + {"slab", 2, nil }, {"doublepanel", 2, { 0, 0, 0, 16, 8, 8 }, { 0, 8, 8, 16, 8, 8 }}, {"halfstair", 2, { 0, 0, 0, 8, 8, 16 }, { 0, 8, 8, 8, 8, 8 }}, {"outerstair", 1, { 0, 0, 0, 16, 8, 16 }, { 0, 8, 8, 8, 8, 8 }}, - {"stair", 1, { 0, 0, 0, 16, 8, 16 }, - { 0, 8, 8, 16, 8, 8 }}, + {"stair", 1, nil }, {"innerstair", 1, { 0, 0, 0, 16, 8, 16 }, { 0, 8, 8, 16, 8, 8 }, { 0, 8, 0, 8, 8, 8 }} } +-- Tools allowed to be repaired. +worktable.repairable_tools = [[ + pick, axe, shovel, sword, hoe + armor, shield +]] + function worktable.get_recipe(item) if item:find("^group:") then if item:find("wool$") or item:find("dye$") then @@ -268,7 +262,7 @@ function worktable.fields(pos, _, fields) worktable.craftguide_formspec(meta, pagenum, nil, 1, filter, tab_id) else for item in pairs(fields) do - if item:match(".-:") and minetest.get_craft_recipe(item).items then + if item:find(":") and minetest.get_craft_recipe(item).items then worktable.craftguide_formspec(meta, pagenum, item, 1, filter, tab_id) end end @@ -281,14 +275,6 @@ function worktable.dig(pos) inv:is_empty("tool") and inv:is_empty("storage") end -function worktable.allowed(mod, node) - if not mod then return end - for it in mod:gmatch("[%w_]+") do - if it == node then return true end - end - return false -end - local function trash_delete(pos) local inv = minetest.get_meta(pos):get_inventory() minetest.after(0, function() @@ -298,10 +284,11 @@ end function worktable.put(pos, listname, _, stack) local stackname = stack:get_name() - local mod, node = stackname:match("(.*):(.*)") - - if (listname == "tool" and stack:get_wear() > 0 and stackname ~= "xdecor:hammer") or - (listname == "input" and worktable.allowed(nodes[mod], node)) or + if listname == "tool" and stack:get_wear() > 0 and + worktable.repairable_tools:find(stackname:match(":(%w+)")) then + return stack:get_count() + end + if (listname == "input" and worktable.nodes(minetest.registered_nodes[stackname])) or (listname == "hammer" and stackname == "xdecor:hammer") or listname == "storage" or listname == "trash" then if listname == "trash" then trash_delete(pos) end @@ -332,16 +319,19 @@ function worktable.move(pos, _, _, to_list, _, count) return 0 end -function worktable.get_output(inv, stack) +function worktable.get_output(inv, input, name) if inv:is_empty("input") then inv:set_list("forms", {}) return end - local input, output = inv:get_stack("input", 1), {} - for _, n in pairs(defs) do + local output = {} + for _, n in pairs(worktable.defs) do local count = math.min(n[2] * input:get_count(), input:get_stack_max()) - output[#output+1] = stack:get_name().."_"..n[1].." "..count + local item = name.."_"..n[1] + if not n[3] then item = "stairs:"..n[1].."_"..name:match(":(.*)") end + + output[#output+1] = item.." "..count end inv:set_list("forms", output) @@ -350,24 +340,25 @@ end function worktable.on_put(pos, listname, _, stack) if listname == "input" then local inv = minetest.get_meta(pos):get_inventory() - worktable.get_output(inv, stack) + local input = inv:get_stack("input", 1) + worktable.get_output(inv, input, stack:get_name()) end end function worktable.on_take(pos, listname, index, stack) local inv = minetest.get_meta(pos):get_inventory() - local inputstack = inv:get_stack("input", 1) + local input = inv:get_stack("input", 1) if listname == "input" then - if stack:get_name() == inputstack:get_name() then - worktable.get_output(inv, stack) + if stack:get_name() == input:get_name() then + worktable.get_output(inv, input, stack:get_name()) else inv:set_list("forms", {}) end elseif listname == "forms" then - inputstack:take_item(math.ceil(stack:get_count() / defs[index][2])) - inv:set_stack("input", 1, inputstack) - worktable.get_output(inv, inputstack) + input:take_item(math.ceil(stack:get_count() / worktable.defs[index][2])) + inv:set_stack("input", 1, input) + worktable.get_output(inv, input, input:get_name()) end end @@ -391,45 +382,92 @@ xdecor.register("worktable", { allow_metadata_inventory_move = worktable.move }) -for _, d in pairs(defs) do -for mod, n in pairs(nodes) do -for name in n:gmatch("[%w_]+") do - local ndef = minetest.registered_nodes[mod..":"..name] - if ndef then - local groups, tiles, light = {}, {}, 0 +for node in pairs(minetest.registered_nodes) do +for _, d in pairs(worktable.defs) do + local def = minetest.registered_nodes[node] + if worktable.nodes(def) and d[3] then + local groups, tiles = {}, {def.tiles[1]} groups.not_in_creative_inventory = 1 - for k, v in pairs(ndef.groups) do + for k, v in pairs(def.groups) do if k ~= "wood" and k ~= "stone" and k ~= "level" then groups[k] = v end end - if #ndef.tiles > 1 and not ndef.drawtype:find("glass") then - tiles = ndef.tiles - else - tiles = {ndef.tiles[1]} + if #def.tiles > 1 and not def.drawtype:find("glass") then + tiles = def.tiles end - if ndef.light_source > 3 then - light = ndef.light_source - 1 - end + stairs.register_stair_and_slab(node:match(":(.*)"), node, groups, tiles, + def.description.." Stair", def.description.." Slab", def.sounds) - minetest.register_node(":"..mod..":"..name.."_"..d[1], { - description = ndef.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", - light_source = light, - sounds = ndef.sounds, + sounds = def.sounds, tiles = tiles, groups = groups, - node_box = xdecor.pixelnodebox(16, {d[3], d[4], d[5]}), + node_box = xdecor.pixelnodebox(16, {unpack(d, 3)}), sunlight_propagates = true, - on_place = minetest.rotate_node + on_place = minetest.rotate_node, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local player_name = clicker:get_player_name() + if minetest.is_protected(pos, player_name) then + minetest.record_protection_violation(pos, player_name) + return + end + + local T = { + {"nanoslab", nil, 2}, + {"micropanel", nil, 3}, + {"cube", nil, 6}, + {"cube", "panel", 9}, + {"cube", "outerstair", 11}, + {"cube", "halfstair", 7}, + {"cube", "innerstair", nil}, + {"panel", nil, 7}, + {"panel", "outerstair", 12}, + {"halfstair", nil, 11}, + {"halfstair", "outerstair", nil} + } + + local newnode, combined = def.name, false + if clicker:get_player_control().sneak then + local wield_item = clicker:get_wielded_item():get_name() + for _, x in pairs(T) do + if wield_item == newnode.."_"..x[1] then + if not x[2] then x[2] = x[1] end + local pointed_nodebox = minetest.get_node(pos).name:match("(%w+)$") + if x[2] == pointed_nodebox then + if x[3] then newnode = newnode.."_"..worktable.defs[x[3]][1] end + combined = true + minetest.set_node(pos, {name=newnode, param2=node.param2}) + end + end + end + else + minetest.item_place_node(itemstack, clicker, pointed_thing) + end + + if combined and not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack + end }) end -end + if node:find("meselamp") then + if d[3] then + minetest.register_alias("default:meselamp_"..d[1], "default:glass_"..d[1]) + else + minetest.register_alias("stairs:"..d[1].."_meselamp", "stairs:"..d[1].."_glass") + end + elseif worktable.nodes(def) and not d[3] then + minetest.register_alias(node.."_"..d[1], "stairs:"..d[1].."_"..node:match(":(.*)")) + end end end