local cable_tier = {} function technic.is_tier_cable(nodename, tier) return cable_tier[nodename] == tier end function technic.get_cable_tier(nodename) return cable_tier[nodename] end function technic.register_cable_tier(name, tier) assert(technic.machines[tier], "Tier does not exist") assert(type(name) == "string", "Invalid node name") cable_tier[name] = tier end local function item_place_override_node(itemstack, placer, pointed, node) -- Call the default on_place function with a fake itemstack local temp_itemstack = ItemStack(itemstack) temp_itemstack:set_name(node.name) local original_count = temp_itemstack:get_count() temp_itemstack = minetest.item_place(temp_itemstack, placer, pointed, node.param2) or temp_itemstack -- Remove the same number of items from the real itemstack itemstack:take_item(original_count - temp_itemstack:get_count()) return itemstack end local function cable_defaults(nodename, data) assert(data.tier, "Technic cable registration requires `tier` field") assert(data.size, "Technic cable registration requires `size` field") assert(data.description, "Technic cable registration requires `description` field") local def = table.copy(data) local tier = def.tier local ltier = string.lower(tier) local size = def.size local place_network_node = technic.place_network_node local remove_network_node = technic.remove_network_node def.connects_to = def.connects_to or { "group:technic_"..ltier.."_cable", "group:technic_"..ltier, "group:technic_all_tiers" } def.groups = def.groups or { snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, swordy = 1, axey = 1, handy = 1, ["technic_"..ltier.."_cable"] = 1 } def.is_ground_content = false def.drop = def.drop or nodename def.sounds = def.sounds or technic.sounds.node_sound_wood_defaults() def.on_construct = def.on_construct or function(pos) place_network_node(pos, {tier}, nodename) end def.on_destruct = def.on_destruct or function(pos) remove_network_node(pos, {tier}, nodename) end def.paramtype = def.paramtype or "light" def.sunlight_propagates = not (def.sunlight_propagates == false and true) def.drawtype = def.drawtype or "nodebox" def.node_box = def.node_box or { type = "connected", fixed = {-size, -size, -size, size, size, size}, connect_top = {-size, -size, -size, size, 0.5, size}, -- y+ connect_bottom = {-size, -0.5, -size, size, size, size}, -- y- connect_front = {-size, -size, -0.5, size, size, size}, -- z- connect_back = {-size, -size, size, size, size, 0.5 }, -- z+ connect_left = {-0.5, -size, -size, size, size, size}, -- x- connect_right = {-size, -size, -size, 0.5, size, size}, -- x+ } return def end function technic.register_cable_plate(nodename, data) local xyz = {"x","y","z"} local notconnects = {"left", "bottom", "front", "right", "top", "back"} local texture_basename = nodename:gsub(":", "_") for i = 1, 6 do -- Merge defaults and register cable plate local def = cable_defaults(nodename.."_"..i, data) local size = def.size def.tiles = def.tiles or {texture_basename..".png"} def.drop = nodename.."_1" def.node_box.fixed = { {-size, -size, -size, size, size, size}, {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5} } def.node_box.fixed[1][i] = 7/16 * (i-3.5)/math.abs(i-3.5) def.node_box.fixed[2][(i + 2) % 6 + 1] = 3/8 * (i-3.5)/math.abs(i-3.5) def.node_box["connect_"..notconnects[i]] = nil if i == 1 then def.on_place = function(itemstack, placer, pointed_thing) local count = 0 for axis in pairs(xyz) do count = count + (pointed_thing.under[axis] == pointed_thing.above[axis] and 0 or 1) if count > 1 then return itemstack end end local pointed_thing_diff = vector.direction(pointed_thing.under, pointed_thing.above) local index = pointed_thing_diff.x + (pointed_thing_diff.y*2) + (pointed_thing_diff.z*3) local num = index < 0 and -index + 3 or index local crtl = placer:get_player_control() if (crtl.aux1 or crtl.sneak) and not (crtl.aux1 and crtl.sneak) and index ~= 0 then local fine_pointed = minetest.pointed_thing_to_face_pos(placer, pointed_thing) fine_pointed = vector.direction(pointed_thing.above,fine_pointed) fine_pointed[xyz[index < 0 and -index or index]] = nil local key_a, a = next(fine_pointed) local key_b, b = next(fine_pointed, key_a) local far_key = math.abs(a) > math.abs(b) and key_a or key_b local far = fine_pointed[far_key] -- Plate facing -- X pair floor +X 4 -X 1 -> Z pair, Y pair -- Y pair floor +Y 5 -Y 2 -> X pair, Z pair -- Z pair floor +Z 6 -Z 3 -> X pair, Y pair if math.abs(far) < 0.3 then num = num < 4 and num + 3 or num - 3 elseif far_key == "x" then num = far < 0 and 1 or 4 elseif far_key == "y" then num = far < 0 and 2 or 5 else num = far < 0 and 3 or 6 end end local node = {name = nodename.."_"..(num ~= 0 and num or 1)} return item_place_override_node(itemstack, placer, pointed_thing, node) end else def.groups.not_in_creative_inventory = 1 def._mcl_blast_resistance = 1 def._mcl_hardness = 0.8 end def.on_rotate = function(pos, node, user, mode, new_param2) -- mode 1 is left-click, mode 2 is right-click local dir = mode == 1 and 1 or (mode == 2 and -1 or 0) local num = tonumber(node.name:sub(-1)) + dir - 1 minetest.swap_node(pos, {name = nodename.."_"..(num % 6 + 1)}) end minetest.register_node(nodename.."_"..i, def) cable_tier[nodename.."_"..i] = def.tier end end function technic.register_cable(nodename, data) -- Merge defaults and register cable local def = cable_defaults(nodename, data) local texture_basename = nodename:gsub(":", "_") def.tiles = def.tiles or {texture_basename..".png"} def.inventory_image = def.inventory_image or def.inventory_image ~= false and texture_basename.."_wield.png" or nil def.wield_image = def.wield_image or def.wield_image ~= false and texture_basename.."_wield.png" or nil def._mcl_blast_resistance = 1 def._mcl_hardness = 0.8 minetest.register_node(nodename, def) cable_tier[nodename] = def.tier end