From 547e44d1b510b21d32afb49d7fb7d0d8b5937151 Mon Sep 17 00:00:00 2001 From: Vanessa Dannenberg <vanessa.e.dannenberg@gmail.com> Date: Fri, 26 Mar 2021 23:43:35 -0400 Subject: [PATCH] update homedecor and unified dyes --- build-date | 2 +- mods/homedecor_common/nodeboxes.lua | 7 +- mods/homedecor_furniture/init.lua | 254 --- mods/homedecor_furniture_medieval/init.lua | 18 + mods/homedecor_kitchen/init.lua | 274 ++- .../models/homedecor_kitchen_cabinet.obj | 50 + .../models/homedecor_kitchen_cabinet_half.obj | 52 + .../models/homedecor_kitchen_sink.obj | 265 ++- .../homedecor_kitchen_cabinet_bevel.png | Bin 87 -> 112 bytes ...omedecor_kitchen_cabinet_colored_front.png | Bin 0 -> 244 bytes ...cor_kitchen_cabinet_colored_front_half.png | Bin 0 -> 190 bytes ...hen_cabinet_colored_front_with_drawers.png | Bin 0 -> 254 bytes .../homedecor_kitchen_cabinet_front.png | Bin 315 -> 532 bytes .../homedecor_kitchen_cabinet_front_half.png | Bin 265 -> 381 bytes ...cor_kitchen_cabinet_front_with_drawers.png | Bin 0 -> 561 bytes .../homedecor_kitchen_cabinet_half_bevel.png | Bin 0 -> 109 bytes .../textures/homedecor_kitchen_sink_top.png | Bin 358 -> 286 bytes mods/homedecor_lighting/init.lua | 8 + mods/homedecor_tables/misc.lua | 357 ++-- mods/homedecor_tables/mod.conf | 1 + .../models/homedecor_table_large_square.obj | 107 + .../models/homedecor_table_small_round.obj | 1754 ++++++++++++++--- .../models/homedecor_table_small_square.obj | 180 +- .../textures/homedecor_glass_face_clean.png | Bin 74 -> 0 bytes ...es.png => homedecor_glass_table_edges.png} | Bin .../homedecor_glass_table_large_inv.png | Bin 2457 -> 0 bytes .../homedecor_glass_table_large_square.png | Bin 0 -> 604 bytes ...homedecor_glass_table_large_square_inv.png | Bin 0 -> 315 bytes .../homedecor_glass_table_large_tb.png | Bin 146 -> 0 bytes .../homedecor_glass_table_small_round.png | Bin 241 -> 597 bytes .../homedecor_glass_table_small_round_inv.png | Bin 3865 -> 713 bytes .../homedecor_glass_table_small_square.png | Bin 358 -> 642 bytes ...homedecor_glass_table_small_square_inv.png | Bin 3938 -> 334 bytes .../textures/homedecor_table_legs_brass.png | Bin 331 -> 476 bytes .../textures/homedecor_table_legs_wood.png | Bin 0 -> 357 bytes .../homedecor_table_legs_wrought_iron.png | Bin 325 -> 439 bytes .../homedecor_utility_table_edges.png | Bin 465 -> 0 bytes .../textures/homedecor_utility_table_legs.png | Bin 338 -> 0 bytes .../homedecor_utility_table_legs_inv.png | Bin 4371 -> 0 bytes .../textures/homedecor_utility_table_tb.png | Bin 576 -> 0 bytes .../textures/homedecor_wood_table_edges.png | Bin 0 -> 204 bytes .../homedecor_wood_table_large_edges.png | Bin 465 -> 0 bytes .../homedecor_wood_table_large_inv.png | Bin 4095 -> 0 bytes .../homedecor_wood_table_large_square.png | Bin 0 -> 1217 bytes .../homedecor_wood_table_large_square_inv.png | Bin 0 -> 652 bytes .../homedecor_wood_table_large_tb.png | Bin 529 -> 0 bytes .../homedecor_wood_table_small_round.png | Bin 573 -> 2294 bytes .../homedecor_wood_table_small_round_inv.png | Bin 5201 -> 2007 bytes .../homedecor_wood_table_small_square.png | Bin 982 -> 1467 bytes .../homedecor_wood_table_small_square_inv.png | Bin 4200 -> 901 bytes mods/unifieddyes/airbrush.lua | 498 +++++ mods/unifieddyes/aliases.lua | 23 + mods/unifieddyes/api.lua | 494 +++++ mods/unifieddyes/color-tables.lua | 237 +++ mods/unifieddyes/dyes-crafting.lua | 309 +++ mods/unifieddyes/init.lua | 1568 +-------------- 56 files changed, 4016 insertions(+), 2442 deletions(-) create mode 100644 mods/homedecor_kitchen/models/homedecor_kitchen_cabinet.obj create mode 100644 mods/homedecor_kitchen/models/homedecor_kitchen_cabinet_half.obj create mode 100644 mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front.png create mode 100644 mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front_half.png create mode 100644 mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front_with_drawers.png create mode 100644 mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_front_with_drawers.png create mode 100644 mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_half_bevel.png create mode 100644 mods/homedecor_tables/models/homedecor_table_large_square.obj delete mode 100644 mods/homedecor_tables/textures/homedecor_glass_face_clean.png rename mods/homedecor_tables/textures/{homedecor_glass_table_large_edges.png => homedecor_glass_table_edges.png} (100%) delete mode 100644 mods/homedecor_tables/textures/homedecor_glass_table_large_inv.png create mode 100644 mods/homedecor_tables/textures/homedecor_glass_table_large_square.png create mode 100644 mods/homedecor_tables/textures/homedecor_glass_table_large_square_inv.png delete mode 100644 mods/homedecor_tables/textures/homedecor_glass_table_large_tb.png create mode 100644 mods/homedecor_tables/textures/homedecor_table_legs_wood.png delete mode 100644 mods/homedecor_tables/textures/homedecor_utility_table_edges.png delete mode 100644 mods/homedecor_tables/textures/homedecor_utility_table_legs.png delete mode 100644 mods/homedecor_tables/textures/homedecor_utility_table_legs_inv.png delete mode 100644 mods/homedecor_tables/textures/homedecor_utility_table_tb.png create mode 100644 mods/homedecor_tables/textures/homedecor_wood_table_edges.png delete mode 100644 mods/homedecor_tables/textures/homedecor_wood_table_large_edges.png delete mode 100644 mods/homedecor_tables/textures/homedecor_wood_table_large_inv.png create mode 100644 mods/homedecor_tables/textures/homedecor_wood_table_large_square.png create mode 100644 mods/homedecor_tables/textures/homedecor_wood_table_large_square_inv.png delete mode 100644 mods/homedecor_tables/textures/homedecor_wood_table_large_tb.png create mode 100644 mods/unifieddyes/airbrush.lua create mode 100644 mods/unifieddyes/aliases.lua create mode 100644 mods/unifieddyes/api.lua create mode 100644 mods/unifieddyes/color-tables.lua create mode 100644 mods/unifieddyes/dyes-crafting.lua diff --git a/build-date b/build-date index b412a4f0..c5ec98b1 100644 --- a/build-date +++ b/build-date @@ -1 +1 @@ -20210325-1929 +20210326-2343 diff --git a/mods/homedecor_common/nodeboxes.lua b/mods/homedecor_common/nodeboxes.lua index 0fafe1ab..6960072b 100644 --- a/mods/homedecor_common/nodeboxes.lua +++ b/mods/homedecor_common/nodeboxes.lua @@ -9,16 +9,17 @@ homedecor.box = { -- bottom slab (starting from -y) with height optionally shifted upwards 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 } end, -- slab starting from -z (+z with negative depth) - slab_z = function(depth) + slab_z = function(depth, shift) -- for consistency with the other functions here, we have to assume that a "z" slab starts from -z and extends by depth, -- but since conventionally a lot of nodes place slabs against +z for player convenience, we define -- a "negative" depth as a depth extending from the other side, i.e. +z + local s = shift or 0 if depth > 0 then -- slab starting from -z - return { -0.5, -0.5, -0.5, 0.5, 0.5, -0.5+depth } + return { -0.5, -0.5, -0.5+s, 0.5, 0.5, -0.5+depth+s } else -- slab starting from +z (z1=0.5-(-depth)) - return { -0.5, -0.5, 0.5+depth, 0.5, 0.5, 0.5 } + return { -0.5, -0.5, 0.5+depth+s, 0.5, 0.5, 0.5+s } end end, bar_y = function(radius) return {-radius, -0.5, -radius, radius, 0.5, radius} end, diff --git a/mods/homedecor_furniture/init.lua b/mods/homedecor_furniture/init.lua index 5c317ddb..bcb9dea4 100644 --- a/mods/homedecor_furniture/init.lua +++ b/mods/homedecor_furniture/init.lua @@ -1,38 +1,5 @@ local S = minetest.get_translator("homedecor_furniture") -local table_colors = { - { "", S("Table"), homedecor.plain_wood }, - { "_mahogany", S("Mahogany Table"), homedecor.mahogany_wood }, - { "_white", S("White Table"), homedecor.white_wood } -} - -for _, t in ipairs(table_colors) do - local suffix, desc, texture = unpack(t) - - homedecor.register("table"..suffix, { - description = desc, - tiles = { texture }, - node_box = { - type = "fixed", - fixed = { - { -0.4, -0.5, -0.4, -0.3, 0.4, -0.3 }, - { 0.3, -0.5, -0.4, 0.4, 0.4, -0.3 }, - { -0.4, -0.5, 0.3, -0.3, 0.4, 0.4 }, - { 0.3, -0.5, 0.3, 0.4, 0.4, 0.4 }, - { -0.5, 0.4, -0.5, 0.5, 0.5, 0.5 }, - { -0.4, -0.2, -0.3, -0.3, -0.1, 0.3 }, - { 0.3, -0.2, -0.4, 0.4, -0.1, 0.3 }, - { -0.3, -0.2, -0.4, 0.4, -0.1, -0.3 }, - { -0.3, -0.2, 0.3, 0.3, -0.1, 0.4 }, - }, - }, - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, - sounds = default.node_sound_wood_defaults(), - }) -end - - - local ob_cbox = { type = "fixed", fixed = { -0.5, -0.5, 0, 0.5, 0.5, 0.5 } @@ -69,224 +36,3 @@ homedecor.register("wall_shelf", { } } }) - --- Crafts - - -minetest.register_craft({ - output = "homedecor:table", - recipe = { - { "group:wood","group:wood", "group:wood" }, - { "group:stick", "", "group:stick" }, - }, -}) - -minetest.register_craft({ - type = "shapeless", - output = "homedecor:table_mahogany", - recipe = { - "homedecor:table", - "dye:brown", - }, -}) - -minetest.register_craft({ - type = "shapeless", - output = "homedecor:table_mahogany", - recipe = { - "homedecor:table", - "unifieddyes:dark_orange", - }, -}) - -minetest.register_craft({ - type = "shapeless", - output = "homedecor:table_white", - recipe = { - "homedecor:table", - "dye:white", - }, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "homedecor:table", - burntime = 30, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "homedecor:table_mahogany", - burntime = 30, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "homedecor:table_white", - burntime = 30, -}) - -minetest.register_craft({ - output = "homedecor:standing_lamp_off", - recipe = { - {"homedecor:table_lamp_off"}, - {"group:stick"}, - {"group:stick"}, - }, -}) - -unifieddyes.register_color_craft({ - output = "homedecor:standing_lamp_off", - palette = "extended", - type = "shapeless", - neutral_node = "homedecor:standing_lamp_off", - recipe = { - "NEUTRAL_NODE", - "MAIN_DYE" - } -}) - -minetest.register_craft({ - type = "fuel", - recipe = "homedecor:table_lamp_off", - burntime = 10, -}) - -minetest.register_craft({ - output = "homedecor:table_lamp_off", - recipe = { - { "wool:white", "default:torch", "wool:white"}, - { "", "group:stick", ""}, - { "", "stairs:slab_wood", "" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:table_lamp_off", - recipe = { - { "cottages:wool", "default:torch", "cottages:wool"}, - { "", "group:stick", ""}, - { "", "stairs:slab_wood", "" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:table_lamp_off", - recipe = { - { "wool:white", "default:torch", "wool:white"}, - { "", "group:stick", ""}, - { "", "moreblocks:slab_wood", "" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:table_lamp_off", - recipe = { - { "cottages:wool", "default:torch", "cottages:wool"}, - { "", "group:stick", ""}, - { "", "moreblocks:slab_wood", "" }, - }, -}) - -unifieddyes.register_color_craft({ - output = "homedecor:table_lamp_off", - palette = "extended", - type = "shapeless", - neutral_node = "homedecor:table_lamp_off", - recipe = { - "NEUTRAL_NODE", - "MAIN_DYE" - } -}) - -minetest.register_craft({ - output = "homedecor:toilet", - recipe = { - { "","","bucket:bucket_water"}, - { "group:marble","group:marble", "group:marble" }, - { "", "bucket:bucket_empty", "" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:sink", - recipe = { - { "group:marble","bucket:bucket_empty", "group:marble" }, - { "", "group:marble", "" } - }, -}) - -minetest.register_craft({ - output = "homedecor:taps", - recipe = { - { "default:steel_ingot","bucket:bucket_water", "default:steel_ingot" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:taps_brass", - recipe = { - { "technic:brass_ingot","bucket:bucket_water", "technic:brass_ingot" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:shower_tray", - recipe = { - { "group:marble","bucket:bucket_empty", "group:marble" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:shower_head", - recipe = { - {"default:steel_ingot", "bucket:bucket_water"}, - }, -}) - -minetest.register_craft({ - output = "homedecor:bathtub_clawfoot_brass_taps", - recipe = { - { "homedecor:taps_brass", "", "" }, - { "group:marble", "", "group:marble" }, - {"default:steel_ingot", "group:marble", "default:steel_ingot"}, - }, -}) - -minetest.register_craft({ - output = "homedecor:bathtub_clawfoot_chrome_taps", - recipe = { - { "homedecor:taps", "", "" }, - { "group:marble", "", "group:marble" }, - {"default:steel_ingot", "group:marble", "default:steel_ingot"}, - }, -}) - -minetest.register_craft({ - output = "homedecor:bars 6", - recipe = { - { "default:steel_ingot","default:steel_ingot","default:steel_ingot" }, - { "homedecor:pole_wrought_iron","homedecor:pole_wrought_iron","homedecor:pole_wrought_iron" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:L_binding_bars 3", - recipe = { - { "homedecor:bars","" }, - { "homedecor:bars","homedecor:bars" }, - }, -}) - -minetest.register_craft({ - output = "homedecor:torch_wall 10", - recipe = { - { "default:coal_lump" }, - { "default:steel_ingot" }, - }, -}) - --- Aliases for 3dforniture mod. - -minetest.register_alias("3dforniture:table", "homedecor:table") -minetest.register_alias('table', 'homedecor:table') diff --git a/mods/homedecor_furniture_medieval/init.lua b/mods/homedecor_furniture_medieval/init.lua index efb331f0..7db474ac 100644 --- a/mods/homedecor_furniture_medieval/init.lua +++ b/mods/homedecor_furniture_medieval/init.lua @@ -57,6 +57,24 @@ homedecor.register("chains", { sounds = default.node_sound_stone_defaults(), }) +-- Crafts + +minetest.register_craft({ + output = "homedecor:bars 6", + recipe = { + { "default:steel_ingot","default:steel_ingot","default:steel_ingot" }, + { "homedecor:pole_wrought_iron","homedecor:pole_wrought_iron","homedecor:pole_wrought_iron" }, + }, +}) + +minetest.register_craft({ + output = "homedecor:L_binding_bars 3", + recipe = { + { "homedecor:bars","" }, + { "homedecor:bars","homedecor:bars" }, + }, +}) + minetest.register_alias("3dforniture:bars", "homedecor:bars") minetest.register_alias("3dforniture:L_binding_bars", "homedecor:L_binding_bars") minetest.register_alias("3dforniture:chains", "homedecor:chains") diff --git a/mods/homedecor_kitchen/init.lua b/mods/homedecor_kitchen/init.lua index 7197b8a6..d4d7303c 100644 --- a/mods/homedecor_kitchen/init.lua +++ b/mods/homedecor_kitchen/init.lua @@ -137,13 +137,20 @@ homedecor.register("dishwasher_"..m, { end local cabinet_sides = "(default_wood.png^[transformR90)^homedecor_kitchen_cabinet_bevel.png" -local cabinet_bottom = "(default_wood.png^[colorize:#000000:100)" - .."^(homedecor_kitchen_cabinet_bevel.png^[colorize:#46321580)" +local cabinet_sides_colored = "(homedecor_generic_wood_plain.png^[transformR90)^homedecor_kitchen_cabinet_bevel.png" + +local ic_cabinet_sides = string.gsub(cabinet_sides, "%^", "&") +local ic_cabinet_sides_colored = string.gsub(cabinet_sides_colored, "%^", "&") + +local cabinet_bottom = "(default_wood.png^[colorize:#000000:100)^homedecor_kitchen_cabinet_bevel.png" +local cabinet_bottom_colored = "homedecor_generic_wood_plain.png^homedecor_kitchen_cabinet_bevel.png" local function N_(x) return x end local counter_materials = { "", N_("granite"), N_("marble"), N_("steel") } +homedecor.kitchen_convert_nodes = {} + for _, mat in ipairs(counter_materials) do local desc = S("Kitchen Cabinet") @@ -151,29 +158,138 @@ for _, mat in ipairs(counter_materials) do if mat ~= "" then desc = S("Kitchen Cabinet (@1 top)", S(mat)) + desc2 = S("Kitchen Cabinet with drawers (@1 top)", S(mat)) material = "_"..mat end - homedecor.register("kitchen_cabinet"..material, { + homedecor.register("kitchen_cabinet_colorable"..material, { description = desc, - tiles = { 'homedecor_kitchen_cabinet_top'..material..'.png', - cabinet_bottom, - cabinet_sides, - cabinet_sides, - cabinet_sides, - 'homedecor_kitchen_cabinet_front.png'}, - groups = { snappy = 3 }, + tiles = { + 'homedecor_kitchen_cabinet_top'..material..'.png', + cabinet_bottom, + cabinet_sides, + cabinet_sides, + cabinet_sides, + 'homedecor_kitchen_cabinet_front.png^homedecor_kitchen_cabinet_bevel.png' + }, + inventory_image = "[inventorycube" + .."{homedecor_kitchen_cabinet_top"..material..".png" + .."{homedecor_kitchen_cabinet_front.png" + .."{"..ic_cabinet_sides, + mesh = "homedecor_kitchen_cabinet.obj", + paramtype2 = "wallmounted", + palette = "unifieddyes_palette_colorwallmounted.png", + airbrush_replacement_node = "homedecor:kitchen_cabinet_colored"..material, + place_param2 = 0, + groups = { snappy = 3, ud_param2_colorable = 1}, sounds = default.node_sound_wood_defaults(), infotext=S("Kitchen Cabinet"), inventory = { size=24, lockable=true, }, + after_place_node = function(pos, placer, itemstack, pointed_thing) + unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) + end }) + + homedecor.register("kitchen_cabinet_colored"..material, { + description = desc, + tiles = { + {name = 'homedecor_kitchen_cabinet_top'..material..'.png', color = 0xFFFFFFFF}, + {name = cabinet_bottom, color = 0xFFFFFFFF }, + cabinet_sides_colored, + cabinet_sides_colored, + cabinet_sides_colored, + 'homedecor_kitchen_cabinet_colored_front.png^homedecor_kitchen_cabinet_bevel.png' + }, + inventory_image = "[inventorycube" + .."{homedecor_kitchen_cabinet_top"..material..".png" + .."{homedecor_kitchen_cabinet_front.png" + .."{"..ic_cabinet_sides_colored, + mesh = "homedecor_kitchen_cabinet.obj", + paramtype2 = "colorwallmounted", + palette = "unifieddyes_palette_colorwallmounted.png", + groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = 1 }, + sounds = default.node_sound_wood_defaults(), + infotext=S("Kitchen Cabinet"), + inventory = { + size=24, + lockable=true, + }, + after_place_node = function(pos, placer, itemstack, pointed_thing) + unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) + end + }) + + homedecor.register("kitchen_cabinet_colorable_with_drawers"..material, { + description = desc2, + tiles = { + 'homedecor_kitchen_cabinet_top'..material..'.png', + cabinet_bottom, + cabinet_sides, + cabinet_sides, + cabinet_sides, + 'homedecor_kitchen_cabinet_front_with_drawers.png^homedecor_kitchen_cabinet_bevel.png' + }, + inventory_image = "[inventorycube" + .."{homedecor_kitchen_cabinet_top"..material..".png" + .."{homedecor_kitchen_cabinet_front_with_drawers.png" + .."{"..ic_cabinet_sides, + mesh = "homedecor_kitchen_cabinet.obj", + paramtype2 = "wallmounted", + palette = "unifieddyes_palette_colorwallmounted.png", + airbrush_replacement_node = "homedecor:kitchen_cabinet_colored_with_drawers"..material, + place_param2 = 0, + groups = { snappy = 3, ud_param2_colorable = 1}, + sounds = default.node_sound_wood_defaults(), + infotext=S("Kitchen Cabinet with drawers"), + inventory = { + size=24, + lockable=true, + }, + after_place_node = function(pos, placer, itemstack, pointed_thing) + unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) + end + }) + + homedecor.register("kitchen_cabinet_colored_with_drawers"..material, { + description = desc2, + tiles = { + {name = 'homedecor_kitchen_cabinet_top'..material..'.png', color = 0xFFFFFFFF}, + {name = cabinet_bottom, color = 0xFFFFFFFF }, + cabinet_sides_colored, + cabinet_sides_colored, + cabinet_sides_colored, + 'homedecor_kitchen_cabinet_colored_front_with_drawers.png^homedecor_kitchen_cabinet_bevel.png' + }, + inventory_image = "[inventorycube" + .."{homedecor_kitchen_cabinet_top"..material..".png" + .."{homedecor_kitchen_cabinet_colored_front_with_drawers.png" + .."{"..ic_cabinet_sides_colored, + mesh = "homedecor_kitchen_cabinet.obj", + paramtype2 = "colorwallmounted", + palette = "unifieddyes_palette_colorwallmounted.png", + groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = 1 }, + sounds = default.node_sound_wood_defaults(), + infotext=S("Kitchen Cabinet with drawers"), + inventory = { + size=24, + lockable=true, + }, + after_place_node = function(pos, placer, itemstack, pointed_thing) + unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) + end + }) + + homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1] = "homedecor:kitchen_cabinet"..material + homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1] = "homedecor:kitchen_cabinet_locked"..material + end -local kitchen_cabinet_half_box = homedecor.nodebox.slab_y(0.5, 0.5) -homedecor.register("kitchen_cabinet_half", { +local kitchen_cabinet_half_box = homedecor.nodebox.slab_z(0.5, 0.5) + +homedecor.register("kitchen_cabinet_colorable_half", { description = S('Half-height Kitchen Cabinet (on ceiling)'), tiles = { cabinet_sides, @@ -181,29 +297,77 @@ homedecor.register("kitchen_cabinet_half", { cabinet_sides, cabinet_sides, cabinet_sides, - 'homedecor_kitchen_cabinet_front_half.png' + 'homedecor_kitchen_cabinet_front_half.png^homedecor_kitchen_cabinet_half_bevel.png' }, + mesh = "homedecor_kitchen_cabinet_half.obj", + paramtype2 = "wallmounted", + palette = "unifieddyes_palette_colorwallmounted.png", + airbrush_replacement_node = "homedecor:kitchen_cabinet_colored_half", + place_param2 = 0, selection_box = kitchen_cabinet_half_box, node_box = kitchen_cabinet_half_box, - groups = { snappy = 3 }, + groups = { snappy = 3, ud_param2_colorable = 1 }, sounds = default.node_sound_wood_defaults(), infotext=S("Kitchen Cabinet"), inventory = { size=12, lockable=true, }, + after_place_node = function(pos, placer, itemstack, pointed_thing) + unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) + end }) -homedecor.register("kitchen_cabinet_with_sink", { +homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1] = "homedecor:kitchen_cabinet_half" +homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1] = "homedecor:kitchen_cabinet_half_locked" + +homedecor.register("kitchen_cabinet_colored_half", { + description = S('Half-height Kitchen Cabinet (on ceiling)'), + tiles = { + { name = cabinet_sides, color = 0xFFFFFFFF }, + cabinet_bottom_colored, + cabinet_sides_colored, + cabinet_sides_colored, + cabinet_sides_colored, + 'homedecor_kitchen_cabinet_colored_front_half.png^homedecor_kitchen_cabinet_half_bevel.png' + }, + mesh = "homedecor_kitchen_cabinet_half.obj", + paramtype2 = "colorwallmounted", + palette = "unifieddyes_palette_colorwallmounted.png", + selection_box = kitchen_cabinet_half_box, + node_box = kitchen_cabinet_half_box, + groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = 1 }, + sounds = default.node_sound_wood_defaults(), + infotext=S("Kitchen Cabinet"), + inventory = { + size=12, + lockable=true, + }, + after_place_node = function(pos, placer, itemstack, pointed_thing) + unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) + end +}) + +homedecor.register("kitchen_cabinet_colorable_with_sink", { description = S("Kitchen Cabinet with sink"), mesh = "homedecor_kitchen_sink.obj", tiles = { "homedecor_kitchen_sink_top.png", - "homedecor_kitchen_cabinet_front.png", + cabinet_bottom, cabinet_sides, - cabinet_bottom + cabinet_sides, + cabinet_sides, + "homedecor_kitchen_cabinet_front.png^homedecor_kitchen_cabinet_bevel.png" }, - groups = { snappy = 3 }, + inventory_image = "[inventorycube" + .."{homedecor_kitchen_sink_top.png" + .."{homedecor_kitchen_cabinet_front.png" + .."{"..ic_cabinet_sides, + paramtype2 = "wallmounted", + palette = "unifieddyes_palette_colorwallmounted.png", + airbrush_replacement_node = "homedecor:kitchen_cabinet_colored_with_sink", + place_param2 = 0, + groups = { snappy = 3, ud_param2_colorable = 1 }, sounds = default.node_sound_wood_defaults(), infotext=S("Under-sink cabinet"), inventory = { @@ -222,6 +386,54 @@ homedecor.register("kitchen_cabinet_with_sink", { }, on_destruct = function(pos) homedecor.stop_particle_spawner({x=pos.x, y=pos.y+1, z=pos.z}) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) + end +}) + +homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1] = "homedecor:kitchen_cabinet_with_sink" +homedecor.kitchen_convert_nodes[#homedecor.kitchen_convert_nodes + 1] = "homedecor:kitchen_cabinet_with_sink_locked" + +homedecor.register("kitchen_cabinet_colored_with_sink", { + description = S("Kitchen Cabinet with sink"), + mesh = "homedecor_kitchen_sink.obj", + tiles = { + { name = "homedecor_kitchen_sink_top.png", color = 0xFFFFFFFF }, + { name = cabinet_bottom, color = 0xFFFFFFFF}, + cabinet_sides_colored, + cabinet_sides_colored, + cabinet_sides_colored, + "homedecor_kitchen_cabinet_colored_front.png^homedecor_kitchen_cabinet_bevel.png", + }, + inventory_image = "[inventorycube" + .."{homedecor_kitchen_sink_top.png" + .."{homedecor_kitchen_cabinet_front.png" + .."{"..ic_cabinet_sides_colored, + paramtype2 = "colorwallmounted", + palette = "unifieddyes_palette_colorwallmounted.png", + groups = { snappy = 3, ud_param2_colorable = 1, not_in_creative_inventory = 1 }, + sounds = default.node_sound_wood_defaults(), + infotext=S("Under-sink cabinet"), + inventory = { + size=16, + lockable=true, + }, + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, -8/16, 8/16, 6/16, 8/16 }, + { -8/16, 6/16, -8/16, -6/16, 8/16, 8/16 }, + { 6/16, 6/16, -8/16, 8/16, 8/16, 8/16 }, + { -8/16, 6/16, -8/16, 8/16, 8/16, -6/16 }, + { -8/16, 6/16, 6/16, 8/16, 8/16, 8/16 }, + } + }, + on_destruct = function(pos) + homedecor.stop_particle_spawner({x=pos.x, y=pos.y+1, z=pos.z}) + end, + after_place_node = function(pos, placer, itemstack, pointed_thing) + unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) end }) @@ -555,3 +767,29 @@ minetest.register_craft({ { "homedecor:toilet_paper", "homedecor:toilet_paper" } }, }) + +minetest.register_lbm({ + name = ":homedecor:convert_kitchen_cabinets", + label = "Convert homedecor kitchen cabinets to use [color]wallmounted", + run_at_every_load = false, + nodenames = homedecor.kitchen_convert_nodes, + action = function(pos, node) + local name = node.name + local newname = string.gsub(name, "_cabinet", "_cabinet_colorable") + + local old_fdir = math.floor(node.param2 % 32) + local new_fdir = 3 + + if old_fdir == 0 then + new_fdir = 3 + elseif old_fdir == 1 then + new_fdir = 4 + elseif old_fdir == 2 then + new_fdir = 2 + elseif old_fdir == 3 then + new_fdir = 5 + end + + minetest.swap_node(pos, { name = newname, param2 = new_fdir }) + end +}) diff --git a/mods/homedecor_kitchen/models/homedecor_kitchen_cabinet.obj b/mods/homedecor_kitchen/models/homedecor_kitchen_cabinet.obj new file mode 100644 index 00000000..86f0be0b --- /dev/null +++ b/mods/homedecor_kitchen/models/homedecor_kitchen_cabinet.obj @@ -0,0 +1,50 @@ +# Blender v2.83.5 OBJ File: 'kitchen_cabinet.blend' +# www.blender.org +o Cube_Cube.001 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v -0.500000 0.500000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt -0.000000 0.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt -0.000000 0.000000 +vt 1.000000 -0.000000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +g Cube_Cube.001_top +s off +f 8/1/1 4/2/1 2/3/1 6/4/1 +g Cube_Cube.001_bottom +f 7/5/2 5/6/2 1/7/2 3/8/2 +g Cube_Cube.001_right +f 5/9/3 7/5/3 8/1/3 6/10/3 +g Cube_Cube.001_left +f 4/2/4 3/8/4 1/11/4 2/12/4 +g Cube_Cube.001_back +f 7/13/5 3/14/5 4/15/5 8/16/5 +g Cube_Cube.001_front +f 6/17/6 2/18/6 1/19/6 5/20/6 diff --git a/mods/homedecor_kitchen/models/homedecor_kitchen_cabinet_half.obj b/mods/homedecor_kitchen/models/homedecor_kitchen_cabinet_half.obj new file mode 100644 index 00000000..39c0b0e4 --- /dev/null +++ b/mods/homedecor_kitchen/models/homedecor_kitchen_cabinet_half.obj @@ -0,0 +1,52 @@ +# Blender v2.83.5 OBJ File: 'kitchen_cabinet_half.blend' +# www.blender.org +o Cube_Cube.001 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.000000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.500000 -0.000000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.000000 +v -0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt -0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt -0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt -0.000000 0.500000 +vt 1.000000 0.500000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 -0.0000 -1.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 -1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 -0.0000 0.0000 +g Cube_Cube.001_top +s off +f 1/1/1 5/2/1 7/3/1 3/4/1 +g Cube_Cube.001_bottom +f 2/5/2 6/6/2 4/7/2 8/8/2 +g Cube_Cube.001_right +f 7/3/3 5/9/3 4/10/3 6/11/3 +g Cube_Cube.001_left +f 1/12/4 3/4/4 2/13/4 8/14/4 +g Cube_Cube.001_back +f 3/15/5 7/16/5 6/17/5 2/18/5 +g Cube_Cube.001_front +f 5/19/6 1/20/6 8/21/6 4/22/6 diff --git a/mods/homedecor_kitchen/models/homedecor_kitchen_sink.obj b/mods/homedecor_kitchen/models/homedecor_kitchen_sink.obj index 832fae10..bb80812d 100644 --- a/mods/homedecor_kitchen/models/homedecor_kitchen_sink.obj +++ b/mods/homedecor_kitchen/models/homedecor_kitchen_sink.obj @@ -1,101 +1,166 @@ -v -0.5 -0.5 -0.5 -v 0.5 -0.5 -0.5 -v 0.5 -0.5 0.5 -v -0.5 -0.5 0.5 -v -0.5 0.5 0.5 -v -0.5 0.5 -0.5 -v 0.5 0.5 -0.5 -v 0.5 0.5 0.5 -v -0.387 0.5 0.388 -v -0.387 0.5 -0.387 -v 0.388 0.5 -0.387 -v 0.388 0.5 0.388 -v -0.387 0.4 0.388 -v -0.387 0.4 -0.387 -v 0.388 0.4 -0.387 -v 0.388 0.4 0.388 -v 0.063 0.4 -0.062 -v 0.063 0.4 0.063 -v -0.062 0.4 -0.062 -v -0.062 0.4 0.063 -v 0.063 0.313 0.063 -v 0.063 0.313 -0.062 -v -0.062 0.313 0.063 -v -0.062 0.313 -0.062 -vt 0.469 0.906 -vt 0.469 0.531 -vt 0.531 0.469 -vt 0.531 0.969 -vt 0.031 0.969 -vt 0.094 0.906 -vt 0.031 0.469 -vt 0.094 0.531 -vt 0.813 0.5 -vt 0.813 0.938 -vt 0.781 0.938 -vt 0.781 0.5 -vt 0.688 0.5 -vt 0.719 0.5 -vt 0.719 0.938 -vt 0.688 0.938 -vt 0.906 0.5 -vt 0.906 0.938 -vt 0.875 0.938 -vt 0.875 0.5 -vt 0.594 0.5 -vt 0.625 0.5 -vt 0.625 0.938 -vt 0.594 0.938 -vt 0.313 0.75 -vt 0.313 0.688 -vt 0.25 0.688 -vt 0.25 0.75 -vt 0.219 0.375 -vt 0.219 0.313 -vt 0.25 0.313 -vt 0.25 0.375 -vt 0.25 0.406 -vt 0.313 0.375 -vt 0.313 0.406 -vt 0.313 0.313 -vt 0.344 0.313 -vt 0.344 0.375 -vt 0.25 0.281 -vt 0.313 0.281 -vt 0 0 -vt 1 0 -vt 1 1 -vt 0 1 -vn 0 1 0 -vn -1 0 0 -vn 0 0 -1 -vn 1 0 0 -vn 0 0 1 -vn 0 -1 0 -g 1 +# Blender v2.83.5 OBJ File: 'kitchen_sink.blend' +# www.blender.org +o Cube_Cube.001 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v -0.500000 0.500000 0.500000 +v 0.000000 -0.500000 0.500000 +v 0.000000 0.500000 0.500000 +v 0.000000 0.062500 0.437500 +v -0.062500 0.062500 0.375000 +v 0.062500 0.062500 0.375000 +v 0.062500 -0.062500 0.437500 +v 0.000000 -0.062500 0.437500 +v 0.062500 -0.062500 0.375000 +v -0.062500 -0.062500 0.437500 +v -0.062500 0.062500 0.437500 +v -0.062500 -0.062500 0.375000 +v 0.000000 0.375000 0.437500 +v 0.062500 0.062500 0.437500 +v 0.000000 -0.375000 0.437500 +v -0.375000 -0.375000 0.437500 +v -0.375000 0.375000 0.500000 +v -0.375000 0.375000 0.437500 +v 0.375000 0.375000 0.437500 +v 0.000000 0.375000 0.500000 +v 0.375000 0.375000 0.500000 +v 0.000000 -0.375000 0.500000 +v 0.375000 -0.375000 0.500000 +v 0.375000 -0.375000 0.437500 +v -0.375000 -0.375000 0.500000 +vt 0.437500 0.375000 +vt 0.562500 0.437500 +vt 0.437500 0.437500 +vt 0.125000 0.875000 +vt 0.875000 0.875000 +vt 1.000000 1.000000 +vt 0.625000 0.500000 +vt 0.625000 0.562500 +vt 0.562500 0.562500 +vt 0.875000 0.062500 +vt 0.125000 0.125000 +vt 0.125000 0.062500 +vt 0.875000 0.875000 +vt 0.437500 0.562500 +vt 0.562500 0.562500 +vt 0.875000 0.125000 +vt 0.125000 0.125000 +vt 0.000000 0.000000 +vt 0.375000 0.500000 +vt 0.375000 0.437500 +vt 0.437500 0.625000 +vt 0.437500 0.562500 +vt 0.875000 0.500000 +vt 0.875000 0.125000 +vt 0.937500 0.500000 +vt 0.125000 0.500000 +vt 0.125000 0.875000 +vt 0.062500 0.875000 +vt 0.562500 0.437500 +vt 0.437500 0.437500 +vt 0.125000 0.937500 +vt 0.875000 0.937500 +vt 0.937500 0.125000 +vt 0.937500 0.875000 +vt 0.062500 0.500000 +vt 0.062500 0.125000 +vt 0.562500 0.375000 +vt 0.625000 0.437500 +vt 0.375000 0.562500 +vt 0.562500 0.625000 +vt 0.562500 0.500000 +vt 0.437500 0.500000 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 0.125000 0.500000 +vt 0.875000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.500000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.500000 1.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt -0.000000 0.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt -0.000000 0.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn -0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +g Cube_Cube.001_top s off -f 9/1/1 10/2/1 6/3/1 5/4/1 -f 5/4/1 8/5/1 12/6/1 9/1/1 -f 7/7/1 6/3/1 10/2/1 11/8/1 -f 8/5/1 7/7/1 11/8/1 12/6/1 -f 15/9/2 16/10/2 12/11/2 11/12/2 -f 16/13/3 13/14/3 9/15/3 12/16/3 -f 13/17/4 14/18/4 10/19/4 9/20/4 -f 14/21/5 15/22/5 11/23/5 10/24/5 -f 13/2/1 16/1/1 18/25/1 20/26/1 -f 19/27/1 14/8/1 13/2/1 20/26/1 -f 17/28/1 15/6/1 14/8/1 19/27/1 -f 16/1/1 15/6/1 17/28/1 18/25/1 -f 17/29/2 22/30/2 21/31/2 18/32/2 -f 18/33/3 21/32/3 23/34/3 20/35/3 -f 20/34/4 23/36/4 24/37/4 19/38/4 -f 19/31/5 24/39/5 22/40/5 17/36/5 -f 24/27/1 23/26/1 21/25/1 22/28/1 -g 2 -f 2/41/3 1/42/3 6/43/3 7/44/3 -g 3 -f 1/41/2 4/42/2 5/43/2 6/44/2 -f 2/42/4 7/43/4 8/44/4 3/41/4 -f 4/41/5 3/42/5 8/43/5 5/44/5 -g 4 -f 1/43/6 2/44/6 3/41/6 4/42/6 +f 14/1/1 13/2/1 16/3/1 +f 32/4/2 24/5/2 8/6/2 +f 11/7/3 18/8/3 12/9/3 +f 28/10/1 31/11/1 30/12/1 +f 25/13/2 17/14/2 18/15/2 +f 28/16/2 30/17/2 2/18/2 +f 15/19/4 14/20/4 16/3/4 +f 12/9/5 17/21/5 19/22/5 +f 20/23/3 26/24/3 27/25/3 +f 22/26/4 23/27/4 32/28/4 +f 26/24/2 21/29/2 14/30/2 +f 32/31/5 25/13/5 24/32/5 +f 12/9/2 19/22/2 16/3/2 13/2/2 +f 28/10/1 26/24/1 31/11/1 +f 26/24/3 28/33/3 27/25/3 +f 27/25/3 24/34/3 20/23/3 +f 24/34/3 25/13/3 20/23/3 +f 32/28/4 29/35/4 22/26/4 +f 29/35/4 30/36/4 22/26/4 +f 30/36/4 31/11/4 22/26/4 +f 32/31/5 23/27/5 25/13/5 +f 14/1/1 21/37/1 13/2/1 +f 12/9/3 13/2/3 11/7/3 +f 13/2/3 21/38/3 11/7/3 +f 16/3/4 19/22/4 15/19/4 +f 19/22/4 17/39/4 15/19/4 +f 12/9/5 18/40/5 17/21/5 +f 11/41/2 20/23/2 18/15/2 +f 20/23/2 25/13/2 18/15/2 +f 25/13/2 23/27/2 17/14/2 +f 23/27/2 22/26/2 17/14/2 +f 22/26/2 15/42/2 17/14/2 +f 14/30/2 15/42/2 22/26/2 +f 22/26/2 31/11/2 14/30/2 +f 31/11/2 26/24/2 14/30/2 +f 26/24/2 20/23/2 21/29/2 +f 20/23/2 11/41/2 21/29/2 +f 4/43/2 9/44/2 32/4/2 +f 9/44/2 29/45/2 32/4/2 +f 27/46/2 10/47/2 24/5/2 +f 10/47/2 8/6/2 24/5/2 +f 4/43/2 32/4/2 8/6/2 +f 6/48/2 10/47/2 28/16/2 +f 10/47/2 27/46/2 28/16/2 +f 29/45/2 9/44/2 30/17/2 +f 9/44/2 2/18/2 30/17/2 +f 6/48/2 28/16/2 2/18/2 +g Cube_Cube.001_bottom +f 5/49/6 1/50/6 3/51/6 7/52/6 +g Cube_Cube.001_right +f 8/6/4 10/53/4 6/54/4 5/55/4 7/52/4 +g Cube_Cube.001_left +f 9/56/3 4/43/3 3/51/3 1/57/3 2/58/3 +g Cube_Cube.001_back +f 7/59/1 3/60/1 4/61/1 8/62/1 +g Cube_Cube.001_front +f 1/63/5 5/64/5 6/65/5 2/66/5 diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_bevel.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_bevel.png index 137eb3ee750b2d69316cd0941548b144ec44c8d7..ad6dac3fec5290bfa327063df43aade63ce49e44 100644 GIT binary patch delta 81 zcmV-X0IvU6aF8TSH%UZ6R5;7+%&`psAP7alhoN;mR`~lT7L-`H0k+%#XH~Unk`xYL nW~X`N;?o2ZOz^m*0J0lg9Rmp<|Gl=&00000NkvXXu0mjfTiGDK delta 56 zcmXR2pP*ta=jq}YVsSc|V^jD%56(0O;gqI8W;b35(}r7Y0ZojXXZYw^eQ1+n00K`} KKbLh*2~7a;&k<Vy diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front.png new file mode 100644 index 0000000000000000000000000000000000000000..382026f39e981dbfe95631394e4e0e8dead76466 GIT binary patch literal 244 zcmV<Q01N+#P)<h;3K|Lk000e1NJLTq000mG000mO00000I+&on0002HNkl<Z7}Hga zEepa>07cKX$0i#V4Z|Y7AP5Q;o5?8nUrlDkCOGrJF!2MOAO`hKhx!bDpK{@H57!9p zmr}oaBW$ggNpo8u&_|tUJxK0Ho#@_DK<LjMf5k+}d2vxU(SD5Jg9#`y{{?seZuBj> zF);pF<Q1rwa((6wQc1+@xj0CWHpuj)G_auok?oj(%MYe7VjqB$0{8s_a0YNJBRGWF uy~yHi()?b~7I?MNuzYc*opo+h!Fm7?ML@p<=9D}D0000<MNUMnLSTaBS7WpQ literal 0 HcmV?d00001 diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front_half.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front_half.png new file mode 100644 index 0000000000000000000000000000000000000000..0c180fa5e42a210a1fcae340db08d836ad1d7b16 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wBx*Bp9q_EZ7UAT0LDHLnJPrJ-Csp$wB78!};x3 z1q5|v^#Y5XoueHUOup?p`;|$(FYi=phNFOr9NXRfYtvu+W_rB)XXa1E?$wua-wV1) z6)L4amo6;QaXzs{_Jy|R?hTtydnx{MW17IUpkbPvJy(P60X23GpT9L4_vLxB?`3_m nYUx=XD;FNSua9fD_7CxR?z^UI1@-rT06EOl)z4*}Q$iB}33*2J literal 0 HcmV?d00001 diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front_with_drawers.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_colored_front_with_drawers.png new file mode 100644 index 0000000000000000000000000000000000000000..c367510a196df2cf6bf214a4e70fb63a463520ae GIT binary patch literal 254 zcmV<a00IArP)<h;3K|Lk000e1NJLTq000mG000mO00000I+&on0002RNkl<Z7}G_} zF-rnr0D$4=@&o0hL4?kRM8{~Tz^$pZ|64&zP*ac=P2r-I5oZX2d3j-XEk@7&zEQu( zJC}Pu9*^H9Uq{nz{bKF2D2noQ5=0YRnKgIBUiO3KGdeoRtpqo(%xHp!pw}ZNi^*IF z;sIp3ES6J2p5u;(L#%{Vt&O&kDp6w`oPA*ay}k-g%7{f>3Fp;dIq+|^6+*3@X6|ti zC&q$Bn$QKQc_pYP>0gl8Y;L%HY7NU}Ic$}U>-XKtFJ(ng=Qj=7Q2+n{07*qoM6N<$ Ef~in!B>(^b literal 0 HcmV?d00001 diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_front.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_front.png index 406739f8a8780ac3d5dae8b7679389b5e94305f7..8f66ff6450f3871dbf9dc37de99a190080cb3b72 100644 GIT binary patch delta 517 zcmV+g0{Z>C0+a-h8Gi-<001BJ|6u?C0ozGLK~y-)os&yz6JZpFpGhY(xsK5!%#hT= zV9`J{pcE8b>8b=5UFgD9{Q>?Ae?>uXZ=tv<y09wh!kUfL+SuxZNg5LqtxhMGnWT-2 zkkF7;qGxq(-^2SJ_=E@d=X=6|jnlG8=?Rvf=ec?@LHDo+K!0xY8@F#>z^GV!HGg8a zJ7lk)qg1oeH3bo1Av@2OxkoY<WKqp9n+#E|H&|U;XYuYG{1V8q4hz}S?CjdiCPTb@ z^b}pA4*=NScuh-<lQ%6kWjL!Ulu89)j@<fNtfot=79($3?9V8a%mQRC;Q`pK*-Wc( zO4S+wg4fTa;eR<={B8;WDDvU|0S2K2<?&uX;-gWY46wA4qgb^@dTZ~E$rWhPAXd{I z)<^R(fZI7Zaaj4$80KxaOInWs46SS#<>M9n+INP_0BJpjPZCG!w%a|~!i_l{VC2!D zH&Eb{L}Y)c4-n{kJQe8iui=rrQzYVNC{`_|)%dYXR(``7IiwPhfWKH6132SrKG}!p z5&D1O;o}!<d@_iHWxnq@NFqeSGLf*%^6DF^<sI5Cd@0t4bLgT)gMC0W*ydU~N=i@g z<kdEr^D0iuM)rsJ@VUahTbD5^7Fxv5vv&oqq%;7$Qy%^R=XI@vLd}~100000NkvXX Hu0mjfc(VDt delta 299 zcmV+`0o4AK1iJ!|8Gi!+001a04^sdD0Blf9R7F`qACGT7VMrxTHyT$!A6i2qYEmwA zS~ZStK59}hWlk+%ODsz^8HZ^;lypT`LM2T&8F*eeP&yh;IU1yZOn6^7P&*t~LLqlu zH;8IKbXqZ4Kplu_H<oopSwkUYN+wb~9C=?jvWrrYb404h5PuN>004?fL_t(|+Evd3 z5(GgE1<+oO?H2Oyf5tJ3sTVWHhlUqT5H@qfJ;z*Ygkd_*#ZPEc&7cY7!<JAHNIU?N zM9=yKUedNwfnYX>)C@E%;1(dL&bHkNI3QiYnH{oZhWG-TDUdv7)Y4iU5T78o!^{E0 x9Z*^%*r3uzza(}3(ck^K|N4Fy@PczbxCy!r8_teTljQ&a002ovPDHLkV1iJmaN_^~ diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_front_half.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_front_half.png index 2e6a60ca241fffa2852578e0b384aaf0337a400b..d5d8e31b7cdd3318cd05d81737bbfead189b6f21 100644 GIT binary patch delta 355 zcmV-p0i6Dc0{sGzBYy!zNkl<ZD9`Q7%}c@n00r>3wVa}^jLF2QAlV0G1`$Pdh@^w< z<e`Et`49AG^oMlp;5DR6B4ihlI+QeuTw{LW7tQI+kJcdw>(IGFztejU9&vIUA%@zU zuFd=1@k?<n=pMWq0J6E#UU)8FR-fgD*6j<M(@ItIyBG>URDXy($W5NL#<);`w-syc zL^2aQ+_#uOv;C;xcq(WC-j+JO@Vh_(0PuKsrE^YER&zAG9HS@_u#(MOtDT-+Wkp$S z`4~l(5LzSw6snqsb1Ic8faHyW5$W3(d`Etz*A4-|Od0qU`J*4~ER5FOjhXv=ZFHdk zoSmn&W~p3nlUyW~$_~sXYSK=}6X{A(0?_RZNRkpI`tvXrUJY1@2Jf2kvZj_kJQ9Kv zjKyI^p<G{I@@y~rY-Xd|H=<j!=J6rxu;bsK@By+ydq5GQkZ}M2002ovPDHLkV1gGz Bs!0F< delta 238 zcmV<K01^NF0*L~UBYyzUNkl<Zc-rldL!v`56hPlLzJ=MhZQDkT>GKMzQMr(=uqRE8 zd6nb}CsORcb?tK@9Ne?=j`h2a6MUTa+|J;Xs%Y(Vg-}86w+7vp(;xdoLLZEL9F5(q z_p!))9*v{PP`cgd7l8S*Mx2d3vf}D-MnAEBmL9hU*#(EaNoUFuOc@|90dI$662JjS zX(v?xg4YC?3I%pc0C#H)=${J!EcJ7VP?o}hwKBkK<g?I@^C|i0+clAV+aIZYG!lHA ot@&2|l%JI$S}uA7&>Jl=a-q<Fq&a8~g8%>k07*qoM6N<$g3C>D{{R30 diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_front_with_drawers.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_front_with_drawers.png new file mode 100644 index 0000000000000000000000000000000000000000..510243b22ab2d3d2a6e10d78c56faddaf9a6ce4c GIT binary patch literal 561 zcmV-10?z%3P)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0005_Nkl<ZD9>$C zU2oE07(Fj5RG_U8R;Y}X5lp~nWYa`0h&P&;#cO|nKVVn>hF$vyyzz1|#u$xeF~&rf zZAM2%Of*0YAhdj>n{%bmwXotvYlq6YdfxLs=XuY0AF{r-N=`LH*RrYj(|48pmH612 z04RRz+`E;jchy?+r*<;BTS!ZamJ&F!zP5Vf+A?OLua8*27XX3D2AM}s-rl|%q5v%L z%zp8s+xOx_89?`NAVh-c#d!c+zz3k!Y{3?Mm$gb$bp@HFIDpL3*;7LU0L(D}PypWV z>`7AFzUv+i>_UhH|8W=%(~h8!&mo_)S=;n<0J{e8Y;)HUuzqjx^Um}zb!Y;(oSJuz z14A`DO1BQIPylq(acN^~zit=1U*wxBDVI0L6adN`onBmE`XYB0TFe3XT0Z~~pdFGB z5)ISkdYc09@bR1eQQH;#>KiBKcxG-V!-M;GWJM$1bF9x|1HN+eC@Y2m$ci@Iy76k8 z_D`HW?0xzxbg4LF@wHkb9Zga`?_4bG%ZQxRQ;vrOz;@|}+f-Oio)1hCF&;pr@n;Y6 z!9eOMi5Q;%rhn5#tEbx8C=a0kWW}(q@HYED2#m!T4<N+SLL}$`@ci{=wIL-1rc~`% zuykFuV3n$!q`+9P_z?GUt0F7M*Dqc0&Ut<VNodCRN}8{G00000NkvXXu0mjf0?h@Y literal 0 HcmV?d00001 diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_half_bevel.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_cabinet_half_bevel.png new file mode 100644 index 0000000000000000000000000000000000000000..1c12493c7b9083211f961c5400686b97ef1d47f1 GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`CY~;iAr`0Ko-yQQFyL@K=zch= zGUCU-$$ULmnAgl{*t}|&i6<Ak!RG5WpA5Dz?pVSwX)BwZJR7Hg=CsN6K>ZA!u6{1- HoD!M<MBE`= literal 0 HcmV?d00001 diff --git a/mods/homedecor_kitchen/textures/homedecor_kitchen_sink_top.png b/mods/homedecor_kitchen/textures/homedecor_kitchen_sink_top.png index fc70835ca83a5302bc25499461f75db52dd01d2a..ccb117ea7956ddd76cdfb1ffa8d49d728488cdbc 100644 GIT binary patch literal 286 zcmV+(0pb3MP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0002xNkl<ZD9?>j zK~BUl47A7YM(qjp1BkcrCO*M$xFH@9ZlT*a_8uY?M4{Wc*`67X;_&Osvxr25s+yU* z1BeJ_jtCK9=2|O&)|!Z@h<toL(Fv&P<Mgh*n5OBjpr_D?=ygizfDNFOLPW~UTlc>` zW@ctYRBMHZ&}pbDT5J13&N=72@4LGKIAG87{Bv}<T(B1$pp>HfNSo^~dm<7M{nKer z?HGmu%d(u0#LPO5BbD#>J{GvUy8Cv^y8<)Q@^$SWq+k9R%hhyQ+XKCMaR_=!t0n>l kz*yH+2W{4vDWznMZd3nsaJ^_JXaE2J07*qoM6N<$f;3EmkpKVy literal 358 zcmV-s0h#`ZP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{0003kNkl<Zc-rlh z19n9*00pzn+FV2rzipe9cGx-pmU%@|YtDVf#0HK^8>iLnlgidbV~;(T?2pTv+Mm^S z&g;9nd01R$Z@l13Ux6IiY?eI~i$&{1kFMd@B;rOQk-$W<HxvWhKC%Tl2l$K%5l%!c zfGtp!C8$12y<Ybc*fo%#{{-!JTLQX)cnIiN;x15u-k}D1DJWoE5f1@FkXQm9AI#vy z5?nU-iHATRxC<uvRpKGgsBmv0%>!?Ndnc<&Jp|+23UL=`)V;ow+fVZj6RrL%uk3?C zW`(edW!>nfS4i=Opy2kA5slcQQVY-Pq#0kThUOa41y0(D70x-~X+1LEORsT<++Upe zsdb`9clZj-yAYaTK8VmgKKAe8M+y9!=<7TApMU<j0?O2RV!lp<UH||907*qoM6N<$ Ef)vA{ga7~l diff --git a/mods/homedecor_lighting/init.lua b/mods/homedecor_lighting/init.lua index ab473868..6d7ba80f 100644 --- a/mods/homedecor_lighting/init.lua +++ b/mods/homedecor_lighting/init.lua @@ -1789,6 +1789,14 @@ unifieddyes.register_color_craft({ } }) + +minetest.register_craft({ + output = "homedecor:torch_wall 10", + recipe = { + { "default:coal_lump" }, + { "default:steel_ingot" }, + }, +}) -- aliases minetest.register_alias("chains:chain_top", "homedecor:chain_steel_top") diff --git a/mods/homedecor_tables/misc.lua b/mods/homedecor_tables/misc.lua index 51fb3993..de062240 100644 --- a/mods/homedecor_tables/misc.lua +++ b/mods/homedecor_tables/misc.lua @@ -2,25 +2,58 @@ local S = minetest.get_translator("homedecor_tables") -local materials = { +-- Various kinds of table legs + +local table_shapes = {"large_square", "small_square", "small_round"} + +local tabletop_materials = { { "glass", - S("Small square glass table"), - S("Small round glass table"), - S("Large glass table piece"), + S("Small square glass tabletop"), + S("Small round glass tabletop"), + S("Large glass tabletop piece"), }, { "wood", - S("Small square wooden table"), - S("Small round wooden table"), - S("Large wooden table piece"), + S("Small square wooden tabletop"), + S("Small round wooden tabletop"), + S("Large wooden tabletop piece"), } } +leg_materials = { + { "brass", S("brass") }, + { "wrought_iron", S("wrought iron") }, + { "wood", S("wood") } +} + +for _, t in ipairs(leg_materials) do + local name, desc = unpack(t) + homedecor.register("table_legs_"..name, { + description = S("Table Legs (@1)", desc), + drawtype = "plantlike", + tiles = {"homedecor_table_legs_"..name..".png"}, + inventory_image = "homedecor_table_legs_"..name..".png", + wield_image = "homedecor_table_legs_"..name..".png", + walkable = false, + groups = {snappy=3}, + sounds = default.node_sound_wood_defaults(), + selection_box = { + type = "fixed", + fixed = { -0.37, -0.5, -0.37, 0.37, 0.5, 0.37 } + }, + }) +end + +minetest.register_alias("homedecor:utility_table_legs", "homedecor:table_legs_wood") +minetest.register_alias("homedecor:utility_table_top", "homedecor:wood_table_small_square") + +-- table tops and combined tables + local tables_cbox = { type = "fixed", fixed = { -0.5, -0.5, -0.5, 0.5, -0.4375, 0.5 }, } -for i, mat in ipairs(materials) do +for i, mat in ipairs(tabletop_materials) do local m, small_s, small_r, large = unpack(mat) local s @@ -30,179 +63,102 @@ for i, mat in ipairs(materials) do s = default.node_sound_wood_defaults() end --- small square tables + for _, shape in ipairs(table_shapes) do - homedecor.register(m.."_table_small_square", { - description = small_s, - mesh = "homedecor_table_small_square.obj", - tiles = { 'homedecor_'..m..'_table_small_square.png' }, - wield_image = 'homedecor_'..m..'_table_small_square_inv.png', - inventory_image = 'homedecor_'..m..'_table_small_square_inv.png', - groups = { snappy = 3 }, - sounds = s, - selection_box = tables_cbox, - collision_box = tables_cbox, - on_place = minetest.rotate_node - }) + homedecor.register(m.."_table_"..shape, { + description = shape.." "..m.." tabletop", + mesh = "homedecor_table_"..shape..".obj", + tiles = { + 'homedecor_'..m..'_table_'..shape..'.png', + 'homedecor_'..m..'_table_edges.png', + 'homedecor_blanktile.png', + 'homedecor_blanktile.png', + 'homedecor_blanktile.png', + }, + wield_image = 'homedecor_'..m..'_table_'..shape..'_inv.png', + groups = { snappy = 3 }, + sounds = s, + selection_box = tables_cbox, + collision_box = tables_cbox, + on_place = function(itemstack, placer, pointed_thing) + local player_name = placer:get_player_name() + if minetest.is_protected(pointed_thing.under, player_name) then return end + local node = minetest.get_node(pointed_thing.under) + if string.find(node.name, "homedecor:table_legs") then + local newname = string.format("homedecor:%s_table_%s_with_%s_legs", + m, shape, string.sub(node.name, 22)) + minetest.set_node(pointed_thing.under, {name = newname}) + if not creative.is_enabled_for(player_name) then + itemstack:take_item() + return itemstack + end + else + return minetest.rotate_node(itemstack, placer, pointed_thing) + end + end + }) --- small round tables + for _, l in ipairs(leg_materials) do + local leg_mat, desc = unpack(l) - homedecor.register(m..'_table_small_round', { - description = small_r, - mesh = "homedecor_table_small_round.obj", - tiles = { "homedecor_"..m.."_table_small_round.png" }, - wield_image = 'homedecor_'..m..'_table_small_round_inv.png', - inventory_image = 'homedecor_'..m..'_table_small_round_inv.png', - groups = { snappy = 3 }, - sounds = s, - selection_box = tables_cbox, - collision_box = tables_cbox, - on_place = minetest.rotate_node - }) - --- Large square table pieces - - homedecor.register(m..'_table_large', { - description = large, - tiles = { - 'homedecor_'..m..'_table_large_tb.png', - 'homedecor_'..m..'_table_large_tb.png', - 'homedecor_'..m..'_table_large_edges.png', - 'homedecor_'..m..'_table_large_edges.png', - 'homedecor_'..m..'_table_large_edges.png', - 'homedecor_'..m..'_table_large_edges.png' - }, - wield_image = 'homedecor_'..m..'_table_large_inv.png', - inventory_image = 'homedecor_'..m..'_table_large_inv.png', - groups = { snappy = 3 }, - sounds = s, - node_box = { - type = "fixed", - fixed = { -0.5, -0.5, -0.5, 0.5, -0.4375, 0.5 }, - }, - selection_box = tables_cbox, - on_place = minetest.rotate_node - }) + homedecor.register(string.format("%s_table_%s_with_%s_legs", m, shape, leg_mat), { + description = string.format("%s %s table with %s legs", shape, m, leg_mat), + mesh = "homedecor_table_"..shape..".obj", + tiles = { + 'homedecor_blanktile.png', + 'homedecor_blanktile.png', + 'homedecor_'..m..'_table_'..shape..'.png', + 'homedecor_'..m..'_table_edges.png', + "homedecor_table_legs_"..leg_mat..".png", + }, + groups = { snappy = 3 }, + sounds = s, + }) + end + end minetest.register_alias('homedecor:'..m..'_table_large_b', 'homedecor:'..m..'_table_large') minetest.register_alias('homedecor:'..m..'_table_small_square_b', 'homedecor:'..m..'_table_small_square') minetest.register_alias('homedecor:'..m..'_table_small_round_b', 'homedecor:'..m..'_table_small_round') + minetest.register_alias('homedecor:'..m..'_table_large', 'homedecor:'..m..'_table_large_square') end --- conversion routines for old non-6dfacedir tables +-- old-style tables that used to be from 3dforniture. -local tlist_s = {} -local tlist_t = {} -local dirs2 = { 9, 18, 7, 12 } - -for i in ipairs(materials) do - local m = materials[i][1] - table.insert(tlist_s, "homedecor:"..m.."_table_large_s") - table.insert(tlist_s, "homedecor:"..m.."_table_small_square_s") - table.insert(tlist_s, "homedecor:"..m.."_table_small_round_s") - - table.insert(tlist_t, "homedecor:"..m.."_table_large_t") - table.insert(tlist_t, "homedecor:"..m.."_table_small_square_t") - table.insert(tlist_t, "homedecor:"..m.."_table_small_round_t") -end - -minetest.register_abm({ - nodenames = tlist_s, - interval = 1, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local newnode = string.sub(node.name, 1, -3) -- strip the "_s" from the name - local fdir = node.param2 or 0 - minetest.set_node(pos, {name = newnode, param2 = dirs2[fdir+1]}) - end -}) - -minetest.register_abm({ - nodenames = tlist_t, - interval = 1, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local newnode = string.sub(node.name, 1, -3) -- strip the "_t" from the name - minetest.set_node(pos, { name = newnode, param2 = 20 }) - end -}) - --- other tables - -homedecor.register("utility_table_top", { - description = S("Utility Table"), - tiles = { - 'homedecor_utility_table_tb.png', - 'homedecor_utility_table_tb.png', - 'homedecor_utility_table_edges.png', - 'homedecor_utility_table_edges.png', - 'homedecor_utility_table_edges.png', - 'homedecor_utility_table_edges.png' - }, - wield_image = 'homedecor_utility_table_tb.png', - inventory_image = 'homedecor_utility_table_tb.png', - groups = { snappy = 3 }, - sounds = default.node_sound_wood_defaults(), - paramtype2 = "wallmounted", - node_box = { - type = "wallmounted", - wall_bottom = { -0.5, -0.5, -0.5, 0.5, -0.4375, 0.5 }, - wall_top = { -0.5, 0.4375, -0.5, 0.5, 0.5, 0.5 }, - wall_side = { -0.5, -0.5, -0.5, -0.4375, 0.5, 0.5 }, - }, - selection_box = { - type = "wallmounted", - wall_bottom = { -0.5, -0.5, -0.5, 0.5, -0.4375, 0.5 }, - wall_top = { -0.5, 0.4375, -0.5, 0.5, 0.5, 0.5 }, - wall_side = { -0.5, -0.5, -0.5, -0.4375, 0.5, 0.5 }, - }, -}) - --- Various kinds of table legs - --- local above -materials = { - { "brass", S("brass") }, - { "wrought_iron", S("wrought iron") }, +local table_colors = { + { "", S("Table"), homedecor.plain_wood }, + { "_mahogany", S("Mahogany Table"), homedecor.mahogany_wood }, + { "_white", S("White Table"), homedecor.white_wood } } -for _, t in ipairs(materials) do -local name, desc = unpack(t) -homedecor.register("table_legs_"..name, { - description = S("Table Legs (@1)", desc), - drawtype = "plantlike", - tiles = {"homedecor_table_legs_"..name..".png"}, - inventory_image = "homedecor_table_legs_"..name..".png", - wield_image = "homedecor_table_legs_"..name..".png", - walkable = false, - groups = {snappy=3}, - sounds = default.node_sound_wood_defaults(), - selection_box = { - type = "fixed", - fixed = { -0.37, -0.5, -0.37, 0.37, 0.5, 0.37 } - }, -}) +for _, t in ipairs(table_colors) do + local suffix, desc, texture = unpack(t) + + homedecor.register("table"..suffix, { + description = desc, + tiles = { texture }, + node_box = { + type = "fixed", + fixed = { + { -0.4, -0.5, -0.4, -0.3, 0.4, -0.3 }, + { 0.3, -0.5, -0.4, 0.4, 0.4, -0.3 }, + { -0.4, -0.5, 0.3, -0.3, 0.4, 0.4 }, + { 0.3, -0.5, 0.3, 0.4, 0.4, 0.4 }, + { -0.5, 0.4, -0.5, 0.5, 0.5, 0.5 }, + { -0.4, -0.2, -0.3, -0.3, -0.1, 0.3 }, + { 0.3, -0.2, -0.4, 0.4, -0.1, 0.3 }, + { -0.3, -0.2, -0.4, 0.4, -0.1, -0.3 }, + { -0.3, -0.2, 0.3, 0.3, -0.1, 0.4 }, + }, + }, + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + sounds = default.node_sound_wood_defaults(), + }) end -homedecor.register("utility_table_legs", { - description = S("Legs for Utility Table"), - drawtype = "plantlike", - tiles = { 'homedecor_utility_table_legs.png' }, - inventory_image = 'homedecor_utility_table_legs_inv.png', - wield_image = 'homedecor_utility_table_legs.png', - walkable = false, - groups = { snappy = 3 }, - sounds = default.node_sound_wood_defaults(), - selection_box = { - type = "fixed", - fixed = { -0.37, -0.5, -0.37, 0.37, 0.5, 0.37 } - }, -}) - -- crafting - minetest.register_craft( { output = "homedecor:glass_table_small_round_b 15", recipe = { @@ -226,8 +182,6 @@ minetest.register_craft( { } }) --- - minetest.register_craft( { output = "homedecor:wood_table_small_round_b 15", recipe = { @@ -305,7 +259,73 @@ minetest.register_craft({ burntime = 30, }) +for _, shape in ipairs (table_shapes) do + for _, leg in ipairs(leg_materials) do + for _, mat in ipairs(tabletop_materials) do + minetest.register_craft({ + output = "homedecor:"..mat[1].."_table_"..shape.."_with_"..leg[1].."_legs", + type = "shapeless", + recipe = { + "homedecor:"..mat[1].."_table_"..shape, + "homedecor:table_legs_"..leg[1] + }, + }) + end + end +end +minetest.register_craft({ + output = "homedecor:table", + recipe = { + { "group:wood","group:wood", "group:wood" }, + { "group:stick", "", "group:stick" }, + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = "homedecor:table_mahogany", + recipe = { + "homedecor:table", + "dye:brown", + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = "homedecor:table_mahogany", + recipe = { + "homedecor:table", + "unifieddyes:dark_orange", + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = "homedecor:table_white", + recipe = { + "homedecor:table", + "dye:white", + }, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "homedecor:table", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "homedecor:table_mahogany", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "homedecor:table_white", + burntime = 30, +}) -- recycling @@ -368,3 +388,8 @@ minetest.register_craft({ "homedecor:wood_table_large" } }) + +-- Aliases for the above 3dforniture-like tables + +minetest.register_alias("3dforniture:table", "homedecor:table") +minetest.register_alias('table', 'homedecor:table') diff --git a/mods/homedecor_tables/mod.conf b/mods/homedecor_tables/mod.conf index a652f4c6..32011ac5 100644 --- a/mods/homedecor_tables/mod.conf +++ b/mods/homedecor_tables/mod.conf @@ -1,3 +1,4 @@ name = homedecor_tables description = Homedecor mod: tables depends = homedecor_common, default, basic_materials +optional_depends = creative diff --git a/mods/homedecor_tables/models/homedecor_table_large_square.obj b/mods/homedecor_tables/models/homedecor_table_large_square.obj new file mode 100644 index 00000000..e570fdd7 --- /dev/null +++ b/mods/homedecor_tables/models/homedecor_table_large_square.obj @@ -0,0 +1,107 @@ +# Blender v2.83.5 OBJ File: 'homedecor table with legs.blend' +# www.blender.org +o Cube_Cube.001 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 0.437500 -0.500000 +v -0.353553 -0.500000 0.353554 +v -0.353553 0.437515 0.353554 +v 0.353553 -0.500000 -0.353553 +v 0.353553 0.437515 -0.353553 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.437500 -0.500000 +v 0.500000 -0.437500 0.500000 +v -0.500000 -0.437500 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.437500 0.500000 +v 0.500000 0.437500 -0.500000 +v 0.500000 0.437500 0.500000 +v -0.500000 0.500000 -0.500000 +v -0.500000 0.437500 0.500000 +v -0.500000 0.500000 0.500000 +v 0.353553 -0.500000 0.353554 +v 0.353553 0.437515 0.353554 +v -0.353553 -0.500000 -0.353553 +v -0.353553 0.437515 -0.353553 +vt -0.000000 -0.000000 +vt 1.000000 -0.000000 +vt 1.000000 0.500000 +vt -0.000000 0.500000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt -0.000000 0.500000 +vt 1.000000 0.500000 +vt -0.000000 1.000000 +vt -0.000000 0.937500 +vt 1.000000 0.937500 +vt -0.000000 0.937500 +vt 1.000000 0.937500 +vt 1.000000 1.000000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt -0.000000 0.937500 +vt 1.000000 0.937500 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt -0.000000 0.937500 +vt 1.000000 0.937500 +vt -0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt 1.000000 -0.000000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 -0.000000 +vt -0.000000 1.000000 +vt -0.000000 0.937500 +vt 1.000000 0.937500 +vt 1.000000 1.000000 +vt -0.000000 1.000000 +vt -0.000000 0.937500 +vt 1.000000 0.937500 +vt 1.000000 0.937500 +vt 1.000000 1.000000 +vt -0.000000 0.937500 +vt -0.000000 1.000000 +vt -0.000000 0.937500 +vt 1.000000 0.937500 +vt 1.000000 1.000000 +vt -0.000000 0.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt -0.000000 0.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +g Cube_Cube.001_top-bottom +s off +f 14/1/1 2/2/1 10/3/1 1/4/1 +f 11/5/2 13/6/2 15/7/2 12/8/2 +g Cube_Cube.001_edges +f 11/5/3 12/9/3 10/10/3 2/11/3 +f 13/6/4 14/12/4 1/13/4 15/14/4 +f 12/15/5 15/16/5 1/17/5 10/18/5 +f 13/19/6 11/20/6 2/21/6 14/22/6 +g Cube_Cube.001_top-bot_with_legs +f 20/23/2 3/24/2 4/25/2 18/26/2 +f 16/27/1 17/28/1 19/29/1 5/30/1 +g Cube_Cube.001_edges_with_legs +f 20/31/5 19/32/5 17/33/5 3/34/5 +f 4/25/3 3/35/3 17/36/3 16/37/3 +f 19/38/4 20/39/4 18/26/4 5/40/4 +f 4/41/6 16/42/6 5/43/6 18/44/6 +g Cube_Cube.001_legs +f 21/45/7 23/46/7 24/47/7 22/48/7 +f 6/49/8 8/50/8 9/51/8 7/52/8 diff --git a/mods/homedecor_tables/models/homedecor_table_small_round.obj b/mods/homedecor_tables/models/homedecor_table_small_round.obj index 41bd5e8a..8e7ddeb5 100644 --- a/mods/homedecor_tables/models/homedecor_table_small_round.obj +++ b/mods/homedecor_tables/models/homedecor_table_small_round.obj @@ -1,300 +1,1456 @@ -v 0.049 -0.499 -0.498 -v 0.049 -0.453 -0.498 -v 0.145 -0.499 -0.478 -v 0.145 -0.453 -0.478 -v 0.236 -0.499 -0.441 -v 0.236 -0.453 -0.441 -v 0.317 -0.499 -0.387 -v 0.317 -0.453 -0.387 -v 0.387 -0.499 -0.317 -v 0.387 -0.453 -0.317 -v 0.441 -0.499 -0.236 -v 0.441 -0.453 -0.236 -v 0.478 -0.499 -0.145 -v 0.478 -0.453 -0.145 -v 0.498 -0.499 -0.049 -v 0.498 -0.453 -0.049 -v 0.498 -0.499 0.049 -v 0.498 -0.453 0.049 -v 0.478 -0.499 0.145 -v 0.478 -0.453 0.145 -v 0.441 -0.499 0.236 -v 0.441 -0.453 0.236 -v 0.387 -0.499 0.317 -v 0.387 -0.453 0.317 -v 0.317 -0.499 0.387 -v 0.317 -0.453 0.387 -v 0.236 -0.499 0.441 -v 0.236 -0.453 0.441 -v 0.145 -0.499 0.478 -v 0.145 -0.453 0.478 -v 0.049 -0.499 0.498 -v 0.049 -0.453 0.498 -v -0.049 -0.499 0.498 -v -0.049 -0.453 0.498 -v -0.145 -0.499 0.478 -v -0.145 -0.453 0.478 -v -0.236 -0.499 0.441 -v -0.236 -0.453 0.441 -v -0.317 -0.499 0.387 -v -0.317 -0.453 0.387 -v -0.387 -0.499 0.317 -v -0.387 -0.453 0.317 -v -0.441 -0.499 0.236 -v -0.441 -0.453 0.236 -v -0.478 -0.499 0.145 -v -0.478 -0.453 0.145 -v -0.498 -0.499 0.049 -v -0.498 -0.453 0.049 -v -0.498 -0.499 -0.049 -v -0.498 -0.453 -0.049 -v -0.478 -0.499 -0.145 -v -0.478 -0.453 -0.145 -v -0.441 -0.499 -0.236 -v -0.441 -0.453 -0.236 -v -0.387 -0.499 -0.317 -v -0.387 -0.453 -0.317 -v -0.317 -0.499 -0.387 -v -0.317 -0.453 -0.387 -v -0.236 -0.499 -0.441 -v -0.236 -0.453 -0.441 -v -0.145 -0.499 -0.478 -v -0.145 -0.453 -0.478 -v -0.049 -0.499 -0.498 -v -0.049 -0.453 -0.498 -v 0.046 -0.437 -0.469 -v 0.137 -0.437 -0.451 -v 0.222 -0.437 -0.416 -v 0.299 -0.437 -0.364 -v 0.364 -0.437 -0.299 -v 0.416 -0.437 -0.222 -v 0.451 -0.437 -0.137 -v 0.469 -0.437 -0.046 -v 0.469 -0.437 0.046 -v 0.451 -0.437 0.137 -v 0.416 -0.437 0.222 -v 0.364 -0.437 0.299 -v 0.299 -0.437 0.364 -v 0.222 -0.437 0.416 -v 0.137 -0.437 0.451 -v 0.046 -0.437 0.469 -v -0.046 -0.437 0.469 -v -0.137 -0.437 0.451 -v -0.222 -0.437 0.416 -v -0.299 -0.437 0.364 -v -0.364 -0.437 0.299 -v -0.416 -0.437 0.222 -v -0.451 -0.437 0.137 -v -0.469 -0.437 0.046 -v -0.469 -0.437 -0.046 -v -0.451 -0.437 -0.137 -v -0.416 -0.437 -0.222 -v -0.364 -0.437 -0.299 -v -0.299 -0.437 -0.364 -v -0.222 -0.437 -0.416 -v -0.137 -0.437 -0.451 -v -0.046 -0.437 -0.469 -vt 0.277 0.123 -vt 0.277 0.096 -vt 0.333 0.096 -vt 0.333 0.123 -vt 0.389 0.096 -vt 0.389 0.123 -vt 0.444 0.096 -vt 0.444 0.123 -vt 0.5 0.096 -vt 0.5 0.123 -vt 0.556 0.096 -vt 0.556 0.123 -vt 0.611 0.096 -vt 0.611 0.123 -vt 0.667 0.096 -vt 0.667 0.123 -vt 0.723 0.096 -vt 0.723 0.123 -vt 0.277 0.404 -vt 0.277 0.377 -vt 0.333 0.377 -vt 0.333 0.404 -vt 0.389 0.377 -vt 0.389 0.404 -vt 0.444 0.377 -vt 0.444 0.404 -vt 0.5 0.377 -vt 0.5 0.404 -vt 0.556 0.377 -vt 0.556 0.404 -vt 0.611 0.377 -vt 0.611 0.404 -vt 0.667 0.377 -vt 0.667 0.404 -vt 0.723 0.377 -vt 0.723 0.404 -vt 0.277 0.311 -vt 0.277 0.283 -vt 0.333 0.283 -vt 0.333 0.311 -vt 0.389 0.283 -vt 0.389 0.311 -vt 0.444 0.283 -vt 0.444 0.311 -vt 0.5 0.283 -vt 0.5 0.311 -vt 0.556 0.283 -vt 0.556 0.311 -vt 0.611 0.283 -vt 0.611 0.311 -vt 0.667 0.283 -vt 0.667 0.311 -vt 0.723 0.283 -vt 0.723 0.311 -vt 0.277 0.217 -vt 0.277 0.189 -vt 0.333 0.189 -vt 0.333 0.217 -vt 0.389 0.189 -vt 0.389 0.217 -vt 0.444 0.189 -vt 0.444 0.217 -vt 0.5 0.189 -vt 0.5 0.217 -vt 0.556 0.189 -vt 0.556 0.217 -vt 0.611 0.189 -vt 0.611 0.217 -vt 0.667 0.217 -vt 0.667 0.189 -vt 0.723 0.189 -vt 0.723 0.217 -vt 0.728 0.526 -vt 0.685 0.535 -vt 0.644 0.552 -vt 0.607 0.576 -vt 0.576 0.607 -vt 0.552 0.644 -vt 0.535 0.685 -vt 0.526 0.728 -vt 0.526 0.772 -vt 0.535 0.815 -vt 0.552 0.856 -vt 0.576 0.893 -vt 0.607 0.924 -vt 0.644 0.948 -vt 0.685 0.965 -vt 0.728 0.974 -vt 0.772 0.974 -vt 0.815 0.965 -vt 0.856 0.948 -vt 0.893 0.924 -vt 0.924 0.893 -vt 0.948 0.856 -vt 0.965 0.815 -vt 0.974 0.772 -vt 0.974 0.728 -vt 0.965 0.685 -vt 0.948 0.644 -vt 0.924 0.607 -vt 0.893 0.576 -vt 0.856 0.552 -vt 0.815 0.535 -vt 0.772 0.526 -vt 0.192 0.558 -vt 0.23 0.551 -vt 0.27 0.551 -vt 0.308 0.558 -vt 0.344 0.573 -vt 0.377 0.595 -vt 0.405 0.623 -vt 0.427 0.656 -vt 0.442 0.692 -vt 0.449 0.73 -vt 0.449 0.77 -vt 0.442 0.808 -vt 0.427 0.844 -vt 0.405 0.877 -vt 0.377 0.905 -vt 0.344 0.927 -vt 0.308 0.942 -vt 0.27 0.949 -vt 0.23 0.949 -vt 0.192 0.942 -vt 0.156 0.927 -vt 0.123 0.905 -vt 0.095 0.877 -vt 0.073 0.844 -vt 0.058 0.808 -vt 0.051 0.77 -vt 0.051 0.73 -vt 0.058 0.692 -vt 0.073 0.656 -vt 0.095 0.623 -vt 0.123 0.595 -vt 0.156 0.573 -g 1 +# Blender v2.83.5 OBJ File: 'homedecor round table with legs.blend' +# www.blender.org +o Cube_Cube.001 +v 0.277785 -0.500000 -0.415735 +v -0.500000 -0.468750 0.000000 +v 0.277785 0.468750 0.415735 +v -0.500000 -0.500000 0.000000 +v 0.317196 0.468750 0.386505 +v 0.497592 -0.500000 -0.049009 +v 0.297348 0.500000 0.362320 +v 0.490393 -0.500000 -0.097545 +v 0.235698 -0.500000 -0.440961 +v 0.353553 0.468750 0.353554 +v 0.478470 -0.500000 -0.145142 +v -0.235699 0.468750 0.440960 +v 0.490393 -0.500000 0.097545 +v 0.478470 -0.500000 0.145142 +v 0.440961 -0.500000 0.235699 +v -0.277786 0.468750 0.415735 +v 0.461940 -0.500000 0.191342 +v -0.317197 0.468750 0.386505 +v 0.497592 -0.500000 0.049009 +v -0.297348 0.500000 0.362319 +v 0.461940 -0.500000 -0.191342 +v 0.145142 -0.500000 -0.478470 +v 0.317197 0.468750 -0.386505 +v -0.277786 -0.500000 -0.415734 +v 0.353553 0.468750 -0.353553 +v 0.191342 -0.500000 -0.461940 +v 0.331430 0.500000 -0.331430 +v 0.500000 -0.500000 0.000000 +v -0.490393 0.468750 0.097545 +v -0.497592 -0.500000 0.049009 +v -0.459706 0.500000 0.091441 +v 0.415735 -0.500000 0.277785 +v 0.386505 -0.500000 0.317197 +v -0.461940 0.468750 0.191342 +v -0.415735 -0.500000 -0.277784 +v -0.440961 -0.500000 -0.235698 +v -0.440961 0.468750 0.235698 +v -0.490393 -0.500000 -0.097545 +v -0.386506 -0.500000 -0.317196 +v 0.145142 0.468750 0.478470 +v -0.353554 -0.500000 -0.353553 +v 0.191341 0.468750 0.461940 +v -0.317198 -0.500000 -0.386505 +v 0.179368 0.500000 0.433034 +v -0.191343 -0.500000 -0.461939 +v 0.220949 0.500000 0.413367 +v -0.235700 -0.500000 -0.440960 +v 0.235698 0.468750 0.440961 +v -0.461940 -0.500000 -0.191341 +v -0.478470 -0.500000 -0.145142 +v 0.097545 0.468750 0.490393 +v -0.497592 -0.500000 -0.049008 +v -0.191342 0.468750 0.461940 +v -0.097547 -0.500000 -0.490392 +v -0.179369 0.500000 0.433034 +v -0.145144 -0.500000 -0.478470 +v -0.049010 -0.500000 -0.497592 +v -0.097546 0.468750 0.490393 +v 0.000000 -0.500000 -0.500000 +v -0.478470 0.468750 0.145142 +v -0.386506 -0.500000 0.317196 +v -0.415735 -0.500000 0.277785 +v -0.145143 0.468750 0.478470 +v 0.049008 -0.500000 0.497592 +v -0.000000 -0.500000 0.500000 +v 0.362320 0.500000 -0.297348 +v -0.353554 -0.500000 0.353553 +v 0.386505 0.468750 -0.317197 +v -0.049009 -0.500000 0.497592 +v 0.389720 0.500000 -0.260403 +v 0.049009 -0.500000 -0.497592 +v 0.415735 0.468750 -0.277785 +v 0.097545 -0.500000 -0.490393 +v 0.440961 -0.500000 -0.235698 +v 0.440961 0.468750 -0.235698 +v 0.415735 -0.500000 -0.277785 +v 0.097545 0.468750 -0.490393 +v 0.386505 -0.500000 -0.317197 +v 0.091441 0.500000 -0.459706 +v -0.145143 -0.500000 0.478470 +v -0.478470 -0.500000 0.145142 +v 0.049009 0.468750 -0.497592 +v -0.097546 -0.500000 0.490393 +v -0.049009 0.468750 0.497592 +v -0.191342 -0.500000 0.461940 +v -0.045942 0.500000 0.466455 +v 0.097545 -0.500000 0.490393 +v 0.235698 -0.500000 0.440961 +v -0.353554 0.468750 0.353553 +v 0.191341 -0.500000 0.461940 +v -0.000000 0.468750 0.500000 +v 0.145142 -0.500000 0.478470 +v -0.440961 -0.500000 0.235698 +v -0.461940 -0.500000 0.191342 +v 0.049008 0.468750 0.497592 +v -0.490393 -0.500000 0.097545 +v -0.415735 0.468750 0.277785 +v 0.353553 -0.500000 -0.353553 +v -0.389720 0.500000 0.260402 +v 0.317197 -0.500000 -0.386505 +v -0.317197 -0.500000 0.386505 +v -0.386506 0.468750 0.317196 +v -0.277786 -0.500000 0.415735 +v 0.000000 0.468750 -0.500000 +v -0.235699 -0.500000 0.440960 +v 0.353553 -0.500000 0.353554 +v -0.045943 0.500000 -0.466455 +v 0.317196 -0.500000 0.386505 +v -0.049010 0.468750 -0.497592 +v 0.277785 -0.500000 0.415735 +v -0.136061 0.500000 -0.448529 +v 0.277785 0.437500 0.415735 +v -0.145144 0.468750 -0.478470 +v -0.500000 0.437500 0.000000 +v -0.097547 0.468750 -0.490392 +v -0.091443 0.500000 -0.459706 +v 0.490393 0.437500 -0.097545 +v -0.497592 0.468750 -0.049008 +v 0.478470 0.437500 -0.145142 +v -0.478470 0.468750 -0.145142 +v -0.461940 0.468750 -0.191341 +v 0.440961 0.437500 0.235699 +v -0.433034 0.500000 -0.179368 +v 0.461940 0.437500 0.191342 +v 0.497592 0.437500 0.049009 +v -0.235700 0.468750 -0.440960 +v -0.191343 0.468750 -0.461939 +v 0.145142 0.437500 -0.478470 +v -0.179370 0.500000 -0.433033 +v -0.297349 0.500000 -0.362319 +v 0.191342 0.437500 -0.461940 +v -0.317198 0.468750 -0.386505 +v 0.500000 0.437500 0.000000 +v -0.353554 0.468750 -0.353553 +v -0.331430 0.500000 -0.331429 +v 0.415735 0.437500 0.277785 +v -0.386506 0.468750 -0.317196 +v -0.415735 0.437500 -0.277784 +v -0.490393 0.468750 -0.097545 +v -0.440961 0.468750 -0.235698 +v -0.415735 0.468750 -0.277784 +v -0.389720 0.500000 -0.260402 +v 0.386505 0.468750 0.317197 +v 0.362319 0.500000 0.297348 +v -0.461940 0.437500 -0.191341 +v 0.415735 0.468750 0.277785 +v -0.478470 0.437500 -0.145142 +v 0.389720 0.500000 0.260403 +v -0.497592 0.437500 -0.049008 +v -0.466455 0.500000 0.045942 +v -0.497592 0.468750 0.049009 +v 0.500000 0.468750 0.000000 +v -0.049010 0.437500 -0.497592 +v 0.468712 0.500000 0.000000 +v 0.000000 0.437500 -0.500000 +v 0.179368 0.500000 -0.433034 +v -0.386506 0.437500 0.317196 +v 0.191342 0.468750 -0.461940 +v -0.415735 0.437500 0.277785 +v -0.277786 0.468750 -0.415734 +v -0.260403 0.500000 -0.389720 +v -0.000000 0.437500 0.500000 +v 0.136060 0.500000 -0.448530 +v 0.145142 0.468750 -0.478470 +v -0.049009 0.437500 0.497592 +v 0.461940 0.468750 -0.191342 +v 0.049009 0.437500 -0.497592 +v 0.097545 0.437500 -0.490393 +v 0.497592 0.468750 0.049009 +v 0.415735 0.437500 -0.277785 +v 0.433034 0.500000 0.179369 +v 0.386505 0.437500 -0.317197 +v 0.461940 0.468750 0.191342 +v 0.440961 0.468750 0.235699 +v 0.478470 0.468750 0.145142 +v -0.191342 0.437500 0.461940 +v 0.459706 0.500000 0.091441 +v 0.490393 0.468750 0.097545 +v 0.448530 0.500000 -0.136060 +v 0.478470 0.468750 -0.145142 +v -0.440961 0.437500 0.235698 +v 0.235698 0.468750 -0.440961 +v 0.490393 0.468750 -0.097545 +v 0.317197 0.437500 -0.386505 +v 0.497592 0.468750 -0.049009 +v -0.317197 0.437500 0.386505 +v 0.466455 0.500000 -0.045942 +v -0.500000 0.468750 0.000000 +v -0.235699 0.437500 0.440960 +v 0.277785 0.468750 -0.415735 +v 0.260403 0.500000 -0.389720 +v 0.260403 -0.437500 -0.389720 +v 0.277785 -0.468750 -0.415735 +v -0.468712 -0.437500 0.000000 +v 0.466455 -0.437500 -0.045942 +v 0.497592 -0.468750 -0.049009 +v 0.490393 -0.468750 -0.097545 +v 0.459706 -0.437500 -0.091441 +v 0.235698 -0.468750 -0.440961 +v 0.220950 -0.437500 -0.413367 +v 0.478470 -0.468750 -0.145142 +v 0.448530 -0.437500 -0.136060 +v 0.490393 -0.468750 0.097545 +v 0.459706 -0.437500 0.091441 +v 0.448530 -0.437500 0.136060 +v 0.478470 -0.468750 0.145142 +v 0.413367 -0.437500 0.220949 +v 0.440961 -0.468750 0.235699 +v 0.461940 -0.468750 0.191342 +v 0.433034 -0.437500 0.179369 +v 0.497592 -0.468750 0.049009 +v 0.466455 -0.437500 0.045942 +v 0.433034 -0.437500 -0.179368 +v 0.461940 -0.468750 -0.191342 +v 0.145142 -0.468750 -0.478470 +v 0.136060 -0.437500 -0.448530 +v -0.260403 -0.437500 -0.389720 +v -0.277786 -0.468750 -0.415734 +v 0.191342 -0.468750 -0.461940 +v 0.179368 -0.437500 -0.433034 +v 0.468712 -0.437500 0.000000 +v 0.500000 -0.468750 0.000000 +v -0.497592 -0.468750 0.049009 +v -0.466455 -0.437500 0.045942 +v 0.389720 -0.437500 0.260403 +v 0.415735 -0.468750 0.277785 +v 0.362319 -0.437500 0.297348 +v 0.386505 -0.468750 0.317197 +v -0.389720 -0.437500 -0.260402 +v -0.415735 -0.468750 -0.277784 +v -0.440961 -0.468750 -0.235698 +v -0.413368 -0.437500 -0.220949 +v -0.459706 -0.437500 -0.091441 +v -0.490393 -0.468750 -0.097545 +v -0.362320 -0.437500 -0.297347 +v -0.386506 -0.468750 -0.317196 +v -0.331430 -0.437500 -0.331429 +v -0.353554 -0.468750 -0.353553 +v -0.317198 -0.468750 -0.386505 +v -0.297349 -0.437500 -0.362319 +v -0.179370 -0.437500 -0.433033 +v -0.191343 -0.468750 -0.461939 +v -0.235700 -0.468750 -0.440960 +v -0.220951 -0.437500 -0.413367 +v -0.433034 -0.437500 -0.179368 +v -0.461940 -0.468750 -0.191341 +v -0.478470 -0.468750 -0.145142 +v -0.448530 -0.437500 -0.136059 +v -0.497592 -0.468750 -0.049008 +v -0.466455 -0.437500 -0.045942 +v -0.091443 -0.437500 -0.459706 +v -0.097547 -0.468750 -0.490392 +v -0.145144 -0.468750 -0.478470 +v -0.136061 -0.437500 -0.448529 +v -0.049010 -0.468750 -0.497592 +v -0.045943 -0.437500 -0.466455 +v -0.000000 -0.437500 -0.468712 +v 0.000000 -0.468750 -0.500000 +v -0.386506 -0.468750 0.317196 +v -0.362320 -0.437500 0.297348 +v -0.389720 -0.437500 0.260402 +v -0.415735 -0.468750 0.277785 +v 0.049008 -0.468750 0.497592 +v 0.045942 -0.437500 0.466455 +v -0.000000 -0.437500 0.468712 +v -0.000000 -0.468750 0.500000 +v -0.353554 -0.468750 0.353553 +v -0.331430 -0.437500 0.331429 +v -0.045942 -0.437500 0.466455 +v -0.049009 -0.468750 0.497592 +v 0.049009 -0.468750 -0.497592 +v 0.045942 -0.437500 -0.466455 +v 0.091441 -0.437500 -0.459706 +v 0.097545 -0.468750 -0.490393 +v 0.440961 -0.468750 -0.235698 +v 0.413367 -0.437500 -0.220950 +v 0.415735 -0.468750 -0.277785 +v 0.389720 -0.437500 -0.260403 +v 0.386505 -0.468750 -0.317197 +v 0.362320 -0.437500 -0.297348 +v -0.136061 -0.437500 0.448530 +v -0.145143 -0.468750 0.478470 +v -0.448530 -0.437500 0.136060 +v -0.478470 -0.468750 0.145142 +v -0.097546 -0.468750 0.490393 +v -0.091442 -0.437500 0.459706 +v -0.179369 -0.437500 0.433034 +v -0.191342 -0.468750 0.461940 +v 0.097545 -0.468750 0.490393 +v 0.091441 -0.437500 0.459706 +v 0.235698 -0.468750 0.440961 +v 0.220949 -0.437500 0.413367 +v 0.179368 -0.437500 0.433034 +v 0.191341 -0.468750 0.461940 +v 0.145142 -0.468750 0.478470 +v 0.136060 -0.437500 0.448530 +v -0.440961 -0.468750 0.235698 +v -0.413368 -0.437500 0.220949 +v -0.461940 -0.468750 0.191342 +v -0.433034 -0.437500 0.179369 +v -0.459706 -0.437500 0.091441 +v -0.490393 -0.468750 0.097545 +v 0.331430 -0.437500 -0.331430 +v 0.353553 -0.468750 -0.353553 +v 0.317197 -0.468750 -0.386505 +v 0.297348 -0.437500 -0.362319 +v -0.297348 -0.437500 0.362319 +v -0.317197 -0.468750 0.386505 +v -0.277786 -0.468750 0.415735 +v -0.260403 -0.437500 0.389720 +v -0.220950 -0.437500 0.413367 +v -0.235699 -0.468750 0.440960 +v 0.353553 -0.468750 0.353554 +v 0.331430 -0.437500 0.331430 +v 0.297348 -0.437500 0.362320 +v 0.317196 -0.468750 0.386505 +v 0.277785 -0.468750 0.415735 +v 0.260403 -0.437500 0.389720 +v 0.317196 0.437500 0.386505 +v -0.468712 0.500000 0.000000 +v 0.353553 0.437500 0.353554 +v -0.277786 0.437500 0.415735 +v 0.459706 0.500000 -0.091441 +v 0.220950 0.500000 -0.413367 +v 0.353553 0.437500 -0.353553 +v 0.448530 0.500000 0.136060 +v -0.490393 0.437500 0.097545 +v 0.413367 0.500000 0.220949 +v -0.461940 0.437500 0.191342 +v 0.145142 0.437500 0.478470 +v 0.466455 0.500000 0.045942 +v 0.433034 0.500000 -0.179368 +v 0.191341 0.437500 0.461940 +v 0.235698 0.437500 0.440961 +v 0.097545 0.437500 0.490393 +v -0.097546 0.437500 0.490393 +v -0.478470 0.437500 0.145142 +v -0.145143 0.437500 0.478470 +v 0.440961 0.437500 -0.235698 +v -0.413368 0.500000 -0.220949 +v -0.459706 0.500000 -0.091441 +v -0.362320 0.500000 -0.297347 +v -0.353554 0.437500 0.353553 +v 0.049008 0.437500 0.497592 +v -0.220951 0.500000 -0.413367 +v -0.448530 0.500000 -0.136059 +v -0.466455 0.500000 -0.045942 +v -0.145144 0.437500 -0.478470 +v -0.097547 0.437500 -0.490392 +v -0.000000 0.500000 -0.468712 +v -0.362320 0.500000 0.297348 +v -0.235700 0.437500 -0.440960 +v 0.045942 0.500000 0.466455 +v -0.000000 0.500000 0.468712 +v -0.191343 0.437500 -0.461939 +v -0.317198 0.437500 -0.386505 +v -0.331430 0.500000 0.331429 +v -0.353554 0.437500 -0.353553 +v -0.386506 0.437500 -0.317196 +v 0.045942 0.500000 -0.466455 +v -0.490393 0.437500 -0.097545 +v -0.440961 0.437500 -0.235698 +v 0.413367 0.500000 -0.220950 +v 0.386505 0.437500 0.317197 +v -0.136061 0.500000 0.448530 +v -0.448530 0.500000 0.136060 +v -0.497592 0.437500 0.049009 +v -0.091442 0.500000 0.459706 +v -0.277786 0.437500 -0.415734 +v 0.091441 0.500000 0.459706 +v 0.461940 0.437500 -0.191342 +v 0.136060 0.500000 0.448530 +v -0.413368 0.500000 0.220949 +v -0.433034 0.500000 0.179369 +v 0.478470 0.437500 0.145142 +v 0.490393 0.437500 0.097545 +v 0.297348 0.500000 -0.362319 +v 0.235698 0.437500 -0.440961 +v -0.260403 0.500000 0.389720 +v -0.220950 0.500000 0.413367 +v 0.497592 0.437500 -0.049009 +v 0.331430 0.500000 0.331430 +v 0.277785 0.437500 -0.415735 +v 0.260403 0.500000 0.389720 +v -0.353553 -0.500000 0.353554 +v -0.353553 0.437515 0.353554 +v 0.353553 -0.500000 -0.353553 +v 0.353553 0.437515 -0.353553 +v 0.353553 -0.500000 0.353554 +v 0.353553 0.437515 0.353554 +v -0.353553 -0.500000 -0.353553 +v -0.353553 0.437515 -0.353553 +vt 0.500000 0.000000 +vt 0.549008 0.001204 +vt 0.597545 0.004804 +vt 0.645142 0.010765 +vt 0.691342 0.019030 +vt 0.735698 0.029520 +vt 0.777785 0.042133 +vt 0.817197 0.056747 +vt 0.853553 0.073223 +vt 0.886505 0.091402 +vt 0.915735 0.111107 +vt 0.940961 0.132151 +vt 0.961940 0.154329 +vt 0.978470 0.177429 +vt 0.990393 0.201227 +vt 0.997592 0.225496 +vt 1.000000 0.250000 +vt 0.997592 0.274504 +vt 0.990393 0.298773 +vt 0.978470 0.322571 +vt 0.961940 0.345671 +vt 0.940960 0.367849 +vt 0.915735 0.388893 +vt 0.886505 0.408598 +vt 0.853553 0.426777 +vt 0.817196 0.443253 +vt 0.777785 0.457868 +vt 0.735698 0.470480 +vt 0.691341 0.480970 +vt 0.645142 0.489235 +vt 0.597545 0.495196 +vt 0.549008 0.498796 +vt 0.500000 0.500000 +vt 0.450991 0.498796 +vt 0.402454 0.495196 +vt 0.354857 0.489235 +vt 0.308658 0.480970 +vt 0.264301 0.470480 +vt 0.222215 0.457867 +vt 0.182803 0.443252 +vt 0.146446 0.426776 +vt 0.113495 0.408598 +vt 0.084265 0.388892 +vt 0.059039 0.367849 +vt 0.038060 0.345671 +vt 0.021530 0.322571 +vt 0.009607 0.298773 +vt 0.002408 0.274504 +vt 0.000000 0.250000 +vt 0.002408 0.225496 +vt 0.009607 0.201228 +vt 0.021530 0.177429 +vt 0.038060 0.154329 +vt 0.059039 0.132151 +vt 0.084265 0.111108 +vt 0.113494 0.091402 +vt 0.146446 0.073224 +vt 0.182803 0.056748 +vt 0.222214 0.042133 +vt 0.264300 0.029520 +vt 0.308657 0.019030 +vt 0.354856 0.010765 +vt 0.402453 0.004804 +vt 0.450990 0.001204 +vt 0.454057 0.983227 +vt 0.408557 0.979853 +vt 0.363939 0.974265 +vt 0.320630 0.966516 +vt 0.279049 0.956683 +vt 0.239597 0.944860 +vt 0.202651 0.931159 +vt 0.168569 0.915714 +vt 0.137680 0.898673 +vt 0.110280 0.880201 +vt 0.086632 0.860474 +vt 0.066966 0.839684 +vt 0.051470 0.818030 +vt 0.040294 0.795721 +vt 0.033545 0.772970 +vt 0.031287 0.750000 +vt 0.033545 0.727029 +vt 0.040294 0.704280 +vt 0.051470 0.681970 +vt 0.066967 0.660316 +vt 0.086633 0.639526 +vt 0.110280 0.619799 +vt 0.137680 0.601326 +vt 0.168570 0.584285 +vt 0.202652 0.568840 +vt 0.239597 0.555140 +vt 0.279050 0.543316 +vt 0.320631 0.533483 +vt 0.363939 0.525735 +vt 0.408558 0.520147 +vt 0.454058 0.516772 +vt 0.500000 0.515644 +vt 0.545941 0.516772 +vt 0.591441 0.520147 +vt 0.636059 0.525735 +vt 0.679368 0.533483 +vt 0.720949 0.543316 +vt 0.760403 0.555140 +vt 0.797348 0.568840 +vt 0.831429 0.584285 +vt 0.862319 0.601326 +vt 0.889720 0.619799 +vt 0.913368 0.639525 +vt 0.933034 0.660315 +vt 0.948529 0.681970 +vt 0.959706 0.704280 +vt 0.966455 0.727029 +vt 0.968712 0.750000 +vt 0.966455 0.772971 +vt 0.959706 0.795721 +vt 0.948530 0.818030 +vt 0.933034 0.839684 +vt 0.913367 0.860475 +vt 0.889720 0.880201 +vt 0.862320 0.898674 +vt 0.831430 0.915715 +vt 0.797348 0.931160 +vt 0.760403 0.944860 +vt 0.720950 0.956684 +vt 0.679368 0.966517 +vt 0.636060 0.974265 +vt 0.591441 0.979853 +vt 0.545942 0.983228 +vt 0.500000 0.984356 +vt 0.156250 0.937500 +vt 0.187500 0.937500 +vt 0.187500 0.968750 +vt 0.156250 0.968750 +vt 0.718750 0.937500 +vt 0.750000 0.937500 +vt 0.750000 0.968750 +vt 0.718750 0.968750 +vt 0.031250 0.968750 +vt -0.000000 0.968750 +vt -0.000000 0.937500 +vt 0.031250 0.937500 +vt 0.250000 0.937500 +vt 0.281250 0.937500 +vt 0.281250 0.968750 +vt 0.250000 0.968750 +vt 0.125000 0.937500 +vt 0.125000 0.968750 +vt 0.312500 0.937500 +vt 0.312500 0.968750 +vt 0.031250 0.968750 +vt 0.000000 0.968750 +vt 0.000000 0.937500 +vt 0.031250 0.937500 +vt 0.656250 0.937500 +vt 0.687500 0.937500 +vt 0.687500 0.968750 +vt 0.656250 0.968750 +vt 0.781250 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.968750 +vt 0.781250 0.968750 +vt 0.406250 0.937500 +vt 0.437500 0.937500 +vt 0.437500 0.968750 +vt 0.406250 0.968750 +vt 0.593750 0.937500 +vt 0.625000 0.937500 +vt 0.625000 0.968750 +vt 0.593750 0.968750 +vt 0.625000 0.937500 +vt 0.625000 0.968750 +vt 0.218750 0.937500 +vt 0.250000 0.937500 +vt 0.250000 0.968750 +vt 0.218750 0.968750 +vt 0.218750 0.937500 +vt 0.218750 0.968750 +vt 0.875000 0.937500 +vt 0.906250 0.937500 +vt 0.906250 0.968750 +vt 0.875000 0.968750 +vt 0.125000 0.937500 +vt 0.156250 0.937500 +vt 0.156250 0.968750 +vt 0.125000 0.968750 +vt 0.062500 0.937500 +vt 0.093750 0.937500 +vt 0.093750 0.968750 +vt 0.062500 0.968750 +vt 0.375000 0.937500 +vt 0.406250 0.937500 +vt 0.406250 0.968750 +vt 0.375000 0.968750 +vt 0.937500 0.937500 +vt 0.968750 0.937500 +vt 0.968750 0.968750 +vt 0.937500 0.968750 +vt 0.343750 0.937500 +vt 0.343750 0.968750 +vt 0.843750 0.937500 +vt 0.843750 0.968750 +vt 0.656250 0.937500 +vt 0.687500 0.937500 +vt 0.687500 0.968750 +vt 0.656250 0.968750 +vt 0.281250 0.937500 +vt 0.312500 0.937500 +vt 0.312500 0.968750 +vt 0.281250 0.968750 +vt 0.500000 0.937500 +vt 0.531250 0.937500 +vt 0.531250 0.968750 +vt 0.500000 0.968750 +vt 0.906250 0.937500 +vt 0.906250 0.968750 +vt 0.718750 0.937500 +vt 0.750000 0.937500 +vt 0.750000 0.968750 +vt 0.718750 0.968750 +vt 0.937500 0.937500 +vt 0.937500 0.968750 +vt 0.843750 0.937500 +vt 0.875000 0.937500 +vt 0.875000 0.968750 +vt 0.843750 0.968750 +vt 0.562500 0.937500 +vt 0.593750 0.937500 +vt 0.593750 0.968750 +vt 0.562500 0.968750 +vt 0.187500 0.937500 +vt 0.187500 0.968750 +vt 0.062500 0.937500 +vt 0.093750 0.937500 +vt 0.093750 0.968750 +vt 0.062500 0.968750 +vt 0.343750 0.937500 +vt 0.343750 0.968750 +vt 0.968750 0.937500 +vt 1.000000 0.937500 +vt 1.000000 0.968750 +vt 0.968750 0.968750 +vt 0.375000 0.937500 +vt 0.375000 0.968750 +vt 0.781250 0.937500 +vt 0.812500 0.937500 +vt 0.812500 0.968750 +vt 0.781250 0.968750 +vt 0.437500 0.937500 +vt 0.437500 0.968750 +vt 0.562500 0.937500 +vt 0.562500 0.968750 +vt 0.531250 0.937500 +vt 0.531250 0.968750 +vt 0.468750 0.937500 +vt 0.468750 0.968750 +vt 0.468750 0.937500 +vt 0.468750 0.968750 +vt 0.500000 0.937500 +vt 0.500000 0.968750 +vt 1.000000 0.937500 +vt 1.000000 0.968750 +vt 0.343750 1.000000 +vt 0.312500 1.000000 +vt 0.062500 1.000000 +vt 0.031250 1.000000 +vt 0.093750 1.000000 +vt 0.375000 1.000000 +vt 0.937500 1.000000 +vt 0.906250 1.000000 +vt 0.875000 1.000000 +vt 0.843750 1.000000 +vt 0.968750 1.000000 +vt 1.000000 1.000000 +vt 0.156250 1.000000 +vt 0.125000 1.000000 +vt 0.718750 1.000000 +vt 0.687500 1.000000 +vt 0.406250 1.000000 +vt 0.031250 1.000000 +vt -0.000000 1.000000 +vt 0.812500 1.000000 +vt 0.000000 1.000000 +vt 0.781250 1.000000 +vt 0.843750 1.000000 +vt 0.812500 1.000000 +vt 0.781250 1.000000 +vt 0.750000 1.000000 +vt 0.656250 1.000000 +vt 0.625000 1.000000 +vt 0.968750 1.000000 +vt 0.937500 1.000000 +vt 0.906250 1.000000 +vt 0.875000 1.000000 +vt 1.000000 1.000000 +vt 0.593750 1.000000 +vt 0.562500 1.000000 +vt 0.531250 1.000000 +vt 0.500000 1.000000 +vt 0.218750 1.000000 +vt 0.187500 1.000000 +vt 0.531250 1.000000 +vt 0.500000 1.000000 +vt 0.250000 1.000000 +vt 0.468750 1.000000 +vt 0.468750 1.000000 +vt 0.437500 1.000000 +vt 0.187500 1.000000 +vt 0.218750 1.000000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.125000 1.000000 +vt 0.093750 1.000000 +vt 0.375000 1.000000 +vt 0.562500 1.000000 +vt 0.656250 1.000000 +vt 0.625000 1.000000 +vt 0.593750 1.000000 +vt 0.156250 1.000000 +vt 0.062500 1.000000 +vt 0.281250 1.000000 +vt 0.250000 1.000000 +vt 0.312500 1.000000 +vt 0.281250 1.000000 +vt 0.343750 1.000000 +vt 0.750000 1.000000 +vt 0.718750 1.000000 +vt 0.687500 1.000000 +vt 0.454057 0.983227 +vt 0.408557 0.979853 +vt 0.363939 0.974265 +vt 0.320630 0.966516 +vt 0.279049 0.956683 +vt 0.239597 0.944860 +vt 0.202651 0.931159 +vt 0.168569 0.915714 +vt 0.137680 0.898673 +vt 0.110280 0.880201 +vt 0.086632 0.860474 +vt 0.066966 0.839684 +vt 0.051470 0.818030 +vt 0.040294 0.795721 +vt 0.033545 0.772970 +vt 0.031287 0.750000 +vt 0.033545 0.727029 +vt 0.040294 0.704280 +vt 0.051470 0.681970 +vt 0.066967 0.660316 +vt 0.086633 0.639526 +vt 0.110280 0.619799 +vt 0.137680 0.601326 +vt 0.168570 0.584285 +vt 0.202652 0.568840 +vt 0.239597 0.555140 +vt 0.279050 0.543316 +vt 0.320631 0.533483 +vt 0.363939 0.525735 +vt 0.408558 0.520147 +vt 0.454058 0.516772 +vt 0.500000 0.515644 +vt 0.545941 0.516772 +vt 0.591441 0.520147 +vt 0.636059 0.525735 +vt 0.679368 0.533483 +vt 0.720949 0.543316 +vt 0.760403 0.555140 +vt 0.797348 0.568840 +vt 0.831429 0.584285 +vt 0.862319 0.601326 +vt 0.889720 0.619799 +vt 0.913368 0.639525 +vt 0.933034 0.660315 +vt 0.948529 0.681970 +vt 0.959706 0.704280 +vt 0.966455 0.727029 +vt 0.968712 0.750000 +vt 0.966455 0.772971 +vt 0.959706 0.795721 +vt 0.948530 0.818030 +vt 0.933034 0.839684 +vt 0.913367 0.860475 +vt 0.889720 0.880201 +vt 0.862320 0.898674 +vt 0.831430 0.915715 +vt 0.797348 0.931160 +vt 0.760403 0.944860 +vt 0.720950 0.956684 +vt 0.679368 0.966517 +vt 0.636060 0.974265 +vt 0.591441 0.979853 +vt 0.545942 0.983228 +vt 0.500000 0.984356 +vt 0.500000 0.000000 +vt 0.549008 0.001204 +vt 0.597545 0.004804 +vt 0.645142 0.010765 +vt 0.691342 0.019030 +vt 0.735698 0.029520 +vt 0.777785 0.042133 +vt 0.817197 0.056747 +vt 0.853553 0.073223 +vt 0.886505 0.091402 +vt 0.915735 0.111107 +vt 0.940961 0.132151 +vt 0.961940 0.154329 +vt 0.978470 0.177429 +vt 0.990393 0.201227 +vt 0.997592 0.225496 +vt 1.000000 0.250000 +vt 0.997592 0.274504 +vt 0.990393 0.298773 +vt 0.978470 0.322571 +vt 0.961940 0.345671 +vt 0.940960 0.367849 +vt 0.915735 0.388893 +vt 0.886505 0.408598 +vt 0.853553 0.426777 +vt 0.817196 0.443253 +vt 0.777785 0.457868 +vt 0.735698 0.470480 +vt 0.691341 0.480970 +vt 0.645142 0.489235 +vt 0.597545 0.495196 +vt 0.549008 0.498796 +vt 0.500000 0.500000 +vt 0.450991 0.498796 +vt 0.402454 0.495196 +vt 0.354857 0.489235 +vt 0.308658 0.480970 +vt 0.264301 0.470480 +vt 0.222215 0.457867 +vt 0.182803 0.443252 +vt 0.146446 0.426776 +vt 0.113495 0.408598 +vt 0.084265 0.388892 +vt 0.059039 0.367849 +vt 0.038060 0.345671 +vt 0.021530 0.322571 +vt 0.009607 0.298773 +vt 0.002408 0.274504 +vt 0.000000 0.250000 +vt 0.002408 0.225496 +vt 0.009607 0.201228 +vt 0.021530 0.177429 +vt 0.038060 0.154329 +vt 0.059039 0.132151 +vt 0.084265 0.111108 +vt 0.113494 0.091402 +vt 0.146446 0.073224 +vt 0.182803 0.056748 +vt 0.222214 0.042133 +vt 0.264300 0.029520 +vt 0.308657 0.019030 +vt 0.354856 0.010765 +vt 0.402453 0.004804 +vt 0.450990 0.001204 +vt 0.687500 0.968750 +vt 0.718750 0.968750 +vt 0.718750 1.000000 +vt 0.687500 1.000000 +vt 0.750000 0.968750 +vt 0.781250 0.968750 +vt 0.781250 1.000000 +vt 0.750000 1.000000 +vt 0.656250 0.968750 +vt 0.656250 1.000000 +vt 0.312500 0.968750 +vt 0.343750 0.968750 +vt 0.343750 1.000000 +vt 0.312500 1.000000 +vt 0.250000 0.968750 +vt 0.281250 0.968750 +vt 0.281250 1.000000 +vt 0.250000 1.000000 +vt 0.375000 0.968750 +vt 0.375000 1.000000 +vt 0.281250 0.968750 +vt 0.312500 0.968750 +vt 0.312500 1.000000 +vt 0.281250 1.000000 +vt 0.218750 0.968750 +vt 0.250000 0.968750 +vt 0.250000 1.000000 +vt 0.218750 1.000000 +vt 0.406250 0.968750 +vt 0.437500 0.968750 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.031250 0.968750 +vt 0.062500 0.968750 +vt 0.062500 1.000000 +vt 0.031250 1.000000 +vt 0.156250 0.968750 +vt 0.187500 0.968750 +vt 0.187500 1.000000 +vt 0.156250 1.000000 +vt 0.093750 0.968750 +vt 0.093750 1.000000 +vt 0.125000 0.968750 +vt 0.125000 1.000000 +vt 0.593750 0.968750 +vt 0.625000 0.968750 +vt 0.625000 1.000000 +vt 0.593750 1.000000 +vt 0.562500 0.968750 +vt 0.562500 1.000000 +vt 0.531250 0.968750 +vt 0.531250 1.000000 +vt 0.406250 0.968750 +vt 0.406250 1.000000 +vt 0.437500 0.968750 +vt 0.468750 0.968750 +vt 0.468750 1.000000 +vt 0.437500 1.000000 +vt 0.187500 0.968750 +vt 0.187500 1.000000 +vt 0.468750 0.968750 +vt 0.500000 0.968750 +vt 0.500000 1.000000 +vt 0.468750 1.000000 +vt 0.156250 0.968750 +vt 0.156250 1.000000 +vt 0.500000 0.968750 +vt 0.500000 1.000000 +vt 0.218750 0.968750 +vt 0.218750 1.000000 +vt 0.875000 0.968750 +vt 0.906250 0.968750 +vt 0.906250 1.000000 +vt 0.875000 1.000000 +vt 0.531250 0.968750 +vt 0.562500 0.968750 +vt 0.562500 1.000000 +vt 0.531250 1.000000 +vt 0.593750 0.968750 +vt 0.625000 0.968750 +vt 0.625000 1.000000 +vt 0.593750 1.000000 +vt 0.656250 0.968750 +vt 0.687500 0.968750 +vt 0.687500 1.000000 +vt 0.656250 1.000000 +vt 0.906250 0.968750 +vt 0.937500 0.968750 +vt 0.937500 1.000000 +vt 0.906250 1.000000 +vt 0.843750 0.968750 +vt 0.875000 0.968750 +vt 0.875000 1.000000 +vt 0.843750 1.000000 +vt 0.968750 0.968750 +vt 1.000000 0.968750 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 0.718750 0.968750 +vt 0.750000 0.968750 +vt 0.750000 1.000000 +vt 0.718750 1.000000 +vt 0.781250 0.968750 +vt 0.781250 1.000000 +vt 0.812500 0.968750 +vt 0.812500 1.000000 +vt 0.812500 0.968750 +vt 0.812500 1.000000 +vt 0.000000 0.968750 +vt 0.031250 0.968750 +vt 0.031250 1.000000 +vt 0.000000 1.000000 +vt 0.843750 0.968750 +vt 0.843750 1.000000 +vt -0.000000 1.000000 +vt -0.000000 0.968750 +vt 0.375000 0.968750 +vt 0.375000 1.000000 +vt 0.093750 0.968750 +vt 0.125000 0.968750 +vt 0.125000 1.000000 +vt 0.093750 1.000000 +vt 0.968750 0.968750 +vt 1.000000 0.968750 +vt 1.000000 1.000000 +vt 0.968750 1.000000 +vt 0.937500 0.968750 +vt 0.937500 1.000000 +vt 0.343750 0.968750 +vt 0.343750 1.000000 +vt 0.062500 0.968750 +vt 0.062500 1.000000 +vt 0.625000 0.937500 +vt 0.656250 0.937500 +vt 0.562500 0.937500 +vt 0.593750 0.937500 +vt 0.968750 0.937500 +vt 1.000000 0.937500 +vt 0.500000 0.937500 +vt 0.531250 0.937500 +vt 0.468750 0.937500 +vt 0.812500 0.937500 +vt 0.843750 0.937500 +vt 0.468750 0.937500 +vt 0.500000 0.937500 +vt 0.437500 0.937500 +vt 0.937500 0.937500 +vt 0.968750 0.937500 +vt 0.312500 0.937500 +vt 0.343750 0.937500 +vt 0.687500 0.937500 +vt 0.718750 0.937500 +vt 0.437500 0.937500 +vt 0.562500 0.937500 +vt 0.750000 0.937500 +vt 0.781250 0.937500 +vt 0.593750 0.937500 +vt 0.625000 0.937500 +vt 0.531250 0.937500 +vt 0.343750 0.937500 +vt 0.375000 0.937500 +vt 0.406250 0.937500 +vt 0.687500 0.937500 +vt 0.718750 0.937500 +vt 0.093750 0.937500 +vt 0.125000 0.937500 +vt 0.875000 0.937500 +vt 0.906250 0.937500 +vt 0.406250 0.937500 +vt 0.187500 0.937500 +vt 0.218750 0.937500 +vt 0.093750 0.937500 +vt 0.125000 0.937500 +vt 1.000000 0.937500 +vt 0.312500 0.937500 +vt 0.031250 0.937500 +vt 0.062500 0.937500 +vt 0.156250 0.937500 +vt 0.906250 0.937500 +vt 0.250000 0.937500 +vt 0.281250 0.937500 +vt 0.843750 0.937500 +vt 0.875000 0.937500 +vt 0.937500 0.937500 +vt 0.218750 0.937500 +vt 0.250000 0.937500 +vt 0.812500 0.937500 +vt 0.375000 0.937500 +vt 0.031250 0.937500 +vt 0.062500 0.937500 +vt 0.187500 0.937500 +vt 0.656250 0.937500 +vt 0.750000 0.937500 +vt 0.781250 0.937500 +vt 0.000000 0.937500 +vt 0.281250 0.937500 +vt 0.156250 0.937500 +vt -0.000000 0.937500 +vt -0.000000 0.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt -0.000000 0.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn -0.8577 0.0000 0.5141 +vn 0.6716 0.0000 0.7410 +vn -0.9988 0.0000 0.0491 +vn -0.6716 -0.0000 0.7410 +vn -0.9040 0.0000 0.4276 +vn -0.5957 0.0000 0.8032 +vn 0.9988 0.0000 -0.0491 +vn 0.5141 0.0000 0.8577 +vn 0.8032 0.0000 0.5957 +vn 0.7410 0.0000 0.6716 +vn 0.2430 0.0000 -0.9700 +vn -0.3369 -0.0000 -0.9415 +vn 0.4276 0.0000 0.9040 +vn 0.7410 0.0000 -0.6716 +vn -0.8032 0.0000 0.5957 +vn 0.9415 0.0000 0.3369 +vn 0.9040 0.0000 -0.4276 +vn 0.9700 0.0000 -0.2430 +vn -0.3369 0.0000 0.9415 +vn 0.9892 0.0000 -0.1467 +vn -0.9892 0.0000 -0.1467 +vn -0.4276 0.0000 0.9040 +vn 0.8577 -0.0000 0.5141 +vn -0.5141 0.0000 -0.8577 +vn 0.5957 0.0000 -0.8032 +vn -0.0491 0.0000 -0.9988 +vn -0.7410 -0.0000 0.6716 +vn -0.9700 0.0000 -0.2430 +vn 0.9040 -0.0000 0.4276 +vn -0.6716 0.0000 -0.7409 +vn 0.6716 -0.0000 -0.7410 +vn 0.9700 -0.0000 0.2430 +vn -0.9040 0.0000 -0.4276 +vn 0.2430 0.0000 0.9700 +vn 0.8577 0.0000 -0.5141 +vn -0.9700 0.0000 0.2430 +vn -0.9892 0.0000 0.1467 +vn 0.5141 0.0000 -0.8577 +vn 0.9988 0.0000 0.0491 +vn 0.9415 0.0000 -0.3369 +vn 0.8032 0.0000 -0.5957 +vn 0.3369 0.0000 -0.9415 +vn -0.9415 0.0000 -0.3369 +vn -0.9415 0.0000 0.3369 +vn -0.8032 0.0000 -0.5957 +vn 0.5957 0.0000 0.8032 +vn -0.2430 0.0000 0.9700 +vn 0.4276 0.0000 -0.9040 +vn -0.1467 0.0000 -0.9892 +vn 0.3369 0.0000 0.9415 +vn -0.7410 0.0000 -0.6716 +vn 0.1467 0.0000 0.9892 +vn 0.1467 0.0000 -0.9892 +vn -0.5957 0.0000 -0.8032 +vn -0.5141 0.0000 0.8577 +vn 0.9892 0.0000 0.1467 +vn -0.1467 0.0000 0.9892 +vn 0.0491 0.0000 -0.9988 +vn -0.8577 0.0000 -0.5141 +vn -0.0491 0.0000 0.9988 +vn 0.0491 -0.0000 0.9988 +vn -0.9988 0.0000 -0.0491 +vn -0.2430 -0.0000 -0.9700 +vn -0.4276 0.0000 -0.9040 +vn 0.3635 0.7071 -0.6065 +vn 0.6995 0.7071 -0.1038 +vn 0.6859 0.7071 -0.1718 +vn 0.3023 0.7071 -0.6392 +vn 0.6859 0.7071 0.1718 +vn 0.6392 0.7071 0.3023 +vn 0.6995 0.7071 0.1038 +vn 0.7063 0.7071 0.0347 +vn 0.6392 0.7071 -0.3023 +vn -0.4212 0.7071 -0.5680 +vn 0.6658 0.7071 -0.2382 +vn 0.2382 0.7071 -0.6658 +vn -0.7063 0.7071 0.0347 +vn 0.6065 0.7071 0.3635 +vn 0.7063 0.7071 -0.0347 +vn 0.5680 0.7071 0.4212 +vn -0.6065 0.7071 -0.3635 +vn -0.5680 0.7071 -0.4212 +vn -0.5239 0.7071 -0.4749 +vn -0.4749 0.7071 -0.5239 +vn -0.3023 0.7071 -0.6392 +vn -0.6995 0.7071 -0.1038 +vn -0.6658 0.7071 -0.2382 +vn -0.7063 0.7071 -0.0347 +vn -0.6392 0.7071 -0.3023 +vn -0.6859 0.7071 -0.1718 +vn -0.1718 0.7071 -0.6859 +vn -0.3635 0.7071 -0.6065 +vn -0.2382 0.7071 -0.6658 +vn -0.0347 0.7071 -0.7063 +vn -0.1038 0.7071 -0.6995 +vn 0.6658 0.7071 0.2382 +vn -0.5680 0.7071 0.4212 +vn 0.0347 0.7071 0.7063 +vn -0.5239 0.7071 0.4749 +vn -0.0347 0.7071 0.7063 +vn 0.1038 0.7071 -0.6995 +vn 0.6065 0.7071 -0.3635 +vn 0.0347 0.7071 -0.7063 +vn 0.5680 0.7071 -0.4212 +vn -0.1718 0.7071 0.6859 +vn -0.6658 0.7071 0.2382 +vn -0.1038 0.7071 0.6995 +vn -0.2382 0.7071 0.6658 +vn 0.1038 0.7071 0.6995 +vn 0.3023 0.7071 0.6392 +vn 0.1718 0.7071 0.6859 +vn 0.2382 0.7071 0.6658 +vn -0.6392 0.7071 0.3023 +vn -0.6859 0.7071 0.1718 +vn -0.6065 0.7071 0.3635 +vn -0.6995 0.7071 0.1038 +vn 0.4749 0.7071 -0.5239 +vn 0.1718 0.7071 -0.6859 +vn 0.5239 0.7071 -0.4749 +vn 0.4212 0.7071 -0.5680 +vn -0.4212 0.7071 0.5680 +vn -0.3023 0.7071 0.6392 +vn -0.4749 0.7071 0.5239 +vn -0.3635 0.7071 0.6065 +vn 0.4749 0.7071 0.5239 +vn 0.3635 0.7071 0.6065 +vn 0.5239 0.7071 0.4749 +vn 0.4212 0.7071 0.5680 +vn -0.6716 0.0000 -0.7410 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +g Cube_Cube.001_top-bottom s off -f 1/1 2/2 4/3 3/4 -f 3/4 4/3 6/5 5/6 -f 5/6 6/5 8/7 7/8 -f 7/8 8/7 10/9 9/10 -f 9/10 10/9 12/11 11/12 -f 11/12 12/11 14/13 13/14 -f 13/14 14/13 16/15 15/16 -f 15/16 16/15 18/17 17/18 -f 17/19 18/20 20/21 19/22 -f 19/22 20/21 22/23 21/24 -f 21/24 22/23 24/25 23/26 -f 23/26 24/25 26/27 25/28 -f 25/28 26/27 28/29 27/30 -f 27/30 28/29 30/31 29/32 -f 29/32 30/31 32/33 31/34 -f 31/34 32/33 34/35 33/36 -f 33/37 34/38 36/39 35/40 -f 35/40 36/39 38/41 37/42 -f 37/42 38/41 40/43 39/44 -f 39/44 40/43 42/45 41/46 -f 41/46 42/45 44/47 43/48 -f 43/48 44/47 46/49 45/50 -f 45/50 46/49 48/51 47/52 -f 47/52 48/51 50/53 49/54 -f 49/55 50/56 52/57 51/58 -f 51/58 52/57 54/59 53/60 -f 53/60 54/59 56/61 55/62 -f 55/62 56/61 58/63 57/64 -f 57/64 58/63 60/65 59/66 -f 59/66 60/65 62/67 61/68 -f 54/59 52/57 90/57 91/59 -f 63/69 64/70 2/71 1/72 -f 61/68 62/67 64/70 63/69 -f 1/73 3/74 5/75 7/76 9/77 11/78 13/79 15/80 17/81 19/82 21/83 23/84 25/85 27/86 29/87 31/88 33/89 35/90 37/91 39/92 41/93 43/94 45/95 47/96 49/97 51/98 53/99 55/100 57/101 59/102 61/103 63/104 -f 66/105 65/106 96/107 95/108 94/109 93/110 92/111 91/112 90/113 89/114 88/115 87/116 86/117 85/118 84/119 83/120 82/121 81/122 80/123 79/124 78/125 77/126 76/127 75/128 74/129 73/130 72/131 71/132 70/133 69/134 68/135 67/136 -f 10/9 8/7 68/7 69/9 -f 32/33 30/31 79/31 80/33 -f 60/65 58/63 93/63 94/65 -f 38/41 36/39 82/39 83/41 -f 16/15 14/13 71/13 72/15 -f 2/71 64/70 96/70 65/71 -f 44/47 42/45 85/45 86/47 -f 22/23 20/21 74/21 75/23 -f 50/53 48/51 88/51 89/53 -f 6/5 4/3 66/3 67/5 -f 28/29 26/27 77/27 78/29 -f 56/61 54/59 91/59 92/61 -f 12/11 10/9 69/9 70/11 -f 34/35 32/33 80/33 81/35 -f 62/67 60/65 94/65 95/67 -f 40/43 38/41 83/41 84/43 -f 4/3 2/2 65/2 66/3 -f 18/17 16/15 72/15 73/17 -f 46/49 44/47 86/47 87/49 -f 24/25 22/23 75/23 76/25 -f 52/57 50/56 89/56 90/57 -f 8/7 6/5 67/5 68/7 -f 30/31 28/29 78/29 79/31 -f 58/63 56/61 92/61 93/63 -f 36/39 34/38 81/38 82/39 -f 14/13 12/11 70/11 71/13 -f 64/70 62/67 95/67 96/70 -f 42/45 40/43 84/43 85/45 -f 20/21 18/20 73/20 74/21 -f 48/51 46/49 87/49 88/51 -f 26/27 24/25 76/25 77/27 +f 59/1/1 71/2/1 73/3/1 22/4/1 26/5/1 9/6/1 1/7/1 100/8/1 98/9/1 78/10/1 76/11/1 74/12/1 21/13/1 11/14/1 8/15/1 6/16/1 28/17/1 19/18/1 13/19/1 14/20/1 17/21/1 15/22/1 32/23/1 33/24/1 106/25/1 108/26/1 110/27/1 88/28/1 90/29/1 92/30/1 87/31/1 64/32/1 65/33/1 69/34/1 83/35/1 80/36/1 85/37/1 105/38/1 103/39/1 101/40/1 67/41/1 61/42/1 62/43/1 93/44/1 94/45/1 81/46/1 96/47/1 30/48/1 4/49/1 52/50/1 38/51/1 50/52/1 49/53/1 36/54/1 35/55/1 39/56/1 41/57/1 43/58/1 24/59/1 47/60/1 45/61/1 56/62/1 54/63/1 57/64/1 +f 256/65/2 251/66/2 254/67/2 241/68/2 244/69/2 217/70/2 240/71/2 237/72/2 235/73/2 229/74/2 232/75/2 245/76/2 248/77/2 233/78/2 250/79/2 194/80/2 224/81/2 301/82/2 283/83/2 300/84/2 298/85/2 261/86/2 260/87/2 268/88/2 307/89/2 310/90/2 311/91/2 287/92/2 281/93/2 286/94/2 269/95/2 265/96/2 264/97/2 290/98/2 296/99/2 293/100/2 292/101/2 318/102/2 315/103/2 314/104/2 227/105/2 225/106/2 207/107/2 210/108/2 205/109/2 204/110/2 212/111/2 221/112/2 195/113/2 198/114/2 202/115/2 213/116/2 276/117/2 278/118/2 280/119/2 303/120/2 306/121/2 192/122/2 200/123/2 220/124/2 216/125/2 273/126/2 272/127/2 257/128/2 +g Cube_Cube.001_edges +f 93/129/3 62/130/3 262/131/3 297/132/3 +f 108/133/4 106/134/4 313/135/4 316/136/4 +f 223/137/5 2/138/5 4/139/5 30/140/5 +f 67/141/6 101/142/6 308/143/6 267/144/6 +f 94/145/7 93/129/7 297/132/7 299/146/7 +f 101/142/8 103/147/8 309/148/8 308/143/8 +f 196/149/9 222/150/9 28/151/9 6/152/9 +f 88/153/10 110/154/10 317/155/10 291/156/10 +f 33/157/11 32/158/11 226/159/11 228/160/11 +f 106/134/12 33/157/12 228/160/12 313/135/12 +f 22/161/13 73/162/13 274/163/13 215/164/13 +f 56/165/14 45/166/14 242/167/14 253/168/14 +f 90/169/15 88/153/15 291/156/15 294/170/15 +f 78/171/16 98/172/16 304/173/16 279/174/16 +f 62/130/17 61/175/17 259/176/17 262/131/17 +f 17/177/18 14/178/18 206/179/18 209/180/18 +f 21/181/19 74/182/19 275/183/19 214/184/19 +f 8/185/20 11/186/20 201/187/20 197/188/20 +f 85/189/21 80/190/21 282/191/21 288/192/21 +f 6/152/22 8/185/22 197/188/22 196/149/22 +f 38/193/23 52/194/23 249/195/23 234/196/23 +f 105/197/24 85/189/24 288/192/24 312/198/24 +f 32/158/25 15/199/25 208/200/25 226/159/25 +f 47/201/26 24/202/26 218/203/26 243/204/26 +f 100/205/27 1/206/27 193/207/27 305/208/27 +f 59/209/28 57/210/28 255/211/28 258/212/28 +f 61/175/29 67/141/29 267/144/29 259/176/29 +f 50/213/30 38/193/30 234/196/30 247/214/30 +f 15/199/31 17/177/31 209/180/31 208/200/31 +f 43/215/32 41/216/32 238/217/32 239/218/32 +f 98/172/33 100/205/33 305/208/33 304/173/33 +f 14/178/34 13/219/34 203/220/34 206/179/34 +f 36/221/35 49/222/35 246/223/35 231/224/35 +f 87/225/36 92/226/36 295/227/36 289/228/36 +f 74/182/37 76/229/37 277/230/37 275/183/37 +f 96/231/38 81/232/38 284/233/38 302/234/38 +f 30/140/39 96/231/39 302/234/39 223/137/39 +f 1/206/40 9/235/40 199/236/40 193/207/40 +f 19/237/41 28/238/41 222/239/41 211/240/41 +f 11/186/42 21/181/42 214/184/42 201/187/42 +f 76/229/43 78/171/43 279/174/43 277/230/43 +f 26/241/44 22/161/44 215/164/44 219/242/44 +f 49/222/45 50/213/45 247/214/45 246/223/45 +f 81/232/46 94/145/46 299/146/46 284/233/46 +f 39/243/47 35/244/47 230/245/47 236/246/47 +f 110/154/48 108/133/48 316/136/48 317/155/48 +f 80/190/49 83/247/49 285/248/49 282/191/49 +f 9/235/50 26/241/50 219/242/50 199/236/50 +f 57/210/51 54/249/51 252/250/51 255/211/51 +f 92/226/52 90/169/52 294/170/52 295/227/52 +f 41/216/53 39/243/53 236/246/53 238/217/53 +f 64/251/54 87/225/54 289/228/54 263/252/54 +f 73/162/55 71/253/55 271/254/55 274/163/55 +f 24/202/56 43/215/56 239/218/56 218/203/56 +f 103/147/57 105/197/57 312/198/57 309/148/57 +f 13/219/58 19/237/58 211/240/58 203/220/58 +f 83/247/59 69/255/59 270/256/59 285/248/59 +f 71/253/60 59/209/60 258/212/60 271/254/60 +f 35/244/61 36/221/61 231/224/61 230/245/61 +f 69/255/62 65/257/62 266/258/62 270/256/62 +f 263/252/63 266/258/63 65/257/63 64/251/63 +f 52/194/64 4/259/64 2/260/64 249/195/64 +f 54/249/65 56/165/65 253/168/65 252/250/65 +f 45/166/66 47/201/66 243/204/66 242/167/66 +f 193/207/67 199/236/67 200/261/67 192/262/67 +f 196/149/68 197/188/68 198/263/68 195/264/68 +f 197/188/69 201/187/69 202/265/69 198/263/69 +f 199/236/70 219/242/70 220/266/70 200/261/70 +f 206/179/71 203/220/71 204/267/71 205/268/71 +f 208/200/72 209/180/72 210/269/72 207/270/72 +f 203/220/73 211/240/73 212/271/73 204/267/73 +f 211/240/74 222/239/74 221/272/74 212/271/74 +f 214/184/75 275/183/75 276/273/75 213/274/75 +f 218/203/76 239/218/76 240/275/76 217/276/76 +f 201/187/77 214/184/77 213/274/77 202/265/77 +f 219/242/78 215/164/78 216/277/78 220/266/78 +f 224/278/79 194/279/79 2/138/79 223/137/79 +f 226/159/80 208/200/80 207/270/80 225/280/80 +f 222/150/81 196/149/81 195/264/81 221/281/81 +f 228/160/82 226/159/82 225/280/82 227/282/82 +f 230/245/83 231/224/83 232/283/83 229/284/83 +f 236/246/84 230/245/84 229/284/84 235/285/84 +f 238/217/85 236/246/85 235/285/85 237/286/85 +f 239/218/86 238/217/86 237/286/86 240/275/86 +f 242/167/87 243/204/87 244/287/87 241/288/87 +f 234/196/88 249/195/88 250/289/88 233/290/88 +f 246/223/89 247/214/89 248/291/89 245/292/89 +f 249/195/90 2/260/90 194/293/90 250/289/90 +f 231/224/91 246/223/91 245/292/91 232/283/91 +f 247/214/92 234/196/92 233/290/92 248/291/92 +f 252/250/93 253/168/93 254/294/93 251/295/93 +f 243/204/94 218/203/94 217/276/94 244/287/94 +f 253/168/95 242/167/95 241/288/95 254/294/95 +f 258/212/96 255/211/96 256/296/96 257/297/96 +f 255/211/97 252/250/97 251/295/97 256/296/97 +f 209/180/98 206/179/98 205/268/98 210/269/98 +f 262/131/99 259/176/99 260/298/99 261/299/99 +f 264/300/100 265/301/100 266/258/100 263/252/100 +f 259/176/101 267/144/101 268/302/101 260/298/101 +f 270/256/102 266/258/102 265/301/102 269/303/102 +f 274/163/103 271/254/103 272/304/103 273/305/103 +f 275/183/104 277/230/104 278/306/104 276/273/104 +f 271/254/105 258/212/105 257/297/105 272/304/105 +f 277/230/106 279/174/106 280/307/106 278/306/106 +f 282/191/107 285/248/107 286/308/107 281/309/107 +f 284/233/108 299/146/108 300/310/108 283/311/108 +f 285/248/109 270/256/109 269/303/109 286/308/109 +f 288/192/110 282/191/110 281/309/110 287/312/110 +f 263/252/111 289/228/111 290/313/111 264/300/111 +f 294/170/112 291/156/112 292/314/112 293/315/112 +f 289/228/113 295/227/113 296/316/113 290/313/113 +f 295/227/114 294/170/114 293/315/114 296/316/114 +f 299/146/115 297/132/115 298/317/115 300/310/115 +f 302/234/116 284/233/116 283/311/116 301/318/116 +f 297/132/117 262/131/117 261/299/117 298/317/117 +f 223/137/118 302/234/118 301/318/118 224/278/118 +f 304/173/119 305/208/119 306/319/119 303/320/119 +f 215/164/120 274/163/120 273/305/120 216/277/120 +f 279/174/121 304/173/121 303/320/121 280/307/121 +f 305/208/122 193/207/122 192/262/122 306/319/122 +f 308/143/123 309/148/123 310/321/123 307/322/123 +f 312/198/124 288/192/124 287/312/124 311/323/124 +f 267/144/125 308/143/125 307/322/125 268/302/125 +f 309/148/126 312/198/126 311/323/126 310/321/126 +f 316/136/127 313/135/127 314/324/127 315/325/127 +f 291/156/128 317/155/128 318/326/128 292/314/128 +f 313/135/129 228/160/129 227/282/129 314/324/129 +f 317/155/130 316/136/130 315/325/130 318/326/130 +g Cube_Cube.001_top-bot_with_legs +f 107/327/2 116/328/2 111/329/2 129/330/2 345/331/2 161/332/2 130/333/2 135/334/2 342/335/2 142/336/2 340/337/2 123/338/2 346/339/2 341/340/2 347/341/2 320/342/2 150/343/2 31/344/2 366/345/2 374/346/2 373/347/2 99/348/2 351/349/2 357/350/2 20/351/2 379/352/2 380/353/2 55/354/2 365/355/2 368/356/2 86/357/2 354/358/2 353/359/2 370/360/2 372/361/2 44/362/2 46/363/2 384/364/2 7/365/2 382/366/2 144/367/2 148/368/2 328/369/2 171/370/2 326/371/2 177/372/2 331/373/2 154/374/2 187/375/2 323/376/2 179/377/2 332/378/2 363/379/2 70/380/2 66/381/2 27/382/2 377/383/2 191/384/2 324/385/2 156/386/2 163/387/2 79/388/2 360/389/2 350/390/2 +f 155/391/1 167/392/1 168/393/1 128/394/1 131/395/1 378/396/1 383/397/1 184/398/1 325/399/1 172/400/1 170/401/1 339/402/1 371/403/1 119/404/1 117/405/1 381/406/1 133/407/1 125/408/1 376/409/1 375/410/1 124/411/1 122/412/1 136/413/1 364/414/1 321/415/1 319/416/1 112/417/1 334/418/1 333/419/1 330/420/1 335/421/1 344/422/1 162/423/1 165/424/1 336/425/1 338/426/1 176/427/1 189/428/1 322/429/1 186/430/1 343/431/1 157/432/1 159/433/1 181/434/1 329/435/1 337/436/1 327/437/1 367/438/1 114/439/1 149/440/1 361/441/1 147/442/1 145/443/1 362/444/1 138/445/1 359/446/1 358/447/1 356/448/1 369/449/1 352/450/1 355/451/1 348/452/1 349/453/1 153/454/1 +g Cube_Cube.001_edges_with_legs +f 3/455/130 5/456/130 7/457/130 384/458/130 +f 10/459/129 143/460/129 144/461/129 382/462/129 +f 48/463/128 3/455/128 384/458/128 46/464/128 +f 5/456/127 10/459/127 382/462/127 7/457/127 +f 16/465/126 12/466/126 380/467/126 379/468/126 +f 89/469/125 18/470/125 20/471/125 357/472/125 +f 12/466/124 53/473/124 55/474/124 380/467/124 +f 18/470/123 16/465/123 379/468/123 20/471/123 +f 23/475/122 190/476/122 191/477/122 377/478/122 +f 68/479/121 25/480/121 27/481/121 66/482/121 +f 164/483/120 77/484/120 79/485/120 163/486/120 +f 25/480/119 23/475/119 377/478/119 27/481/119 +f 151/487/118 29/488/118 31/489/118 150/490/118 +f 37/491/117 97/492/117 99/493/117 373/494/117 +f 29/488/116 60/495/116 366/496/116 31/489/116 +f 34/497/115 37/491/115 373/494/115 374/498/115 +f 40/499/114 42/500/114 44/501/114 372/502/114 +f 51/503/113 40/499/113 372/502/113 370/504/113 +f 42/500/112 48/463/112 46/464/112 44/501/112 +f 95/505/111 51/503/111 370/504/111 353/506/111 +f 53/473/110 63/507/110 365/508/110 55/474/110 +f 58/509/109 84/510/109 86/511/109 368/512/109 +f 60/495/108 34/497/108 374/498/108 366/496/108 +f 63/507/107 58/509/107 368/512/107 365/508/107 +f 72/513/106 68/479/106 66/482/106 70/514/106 +f 82/515/105 104/516/105 350/517/105 360/518/105 +f 75/519/104 72/513/104 70/514/104 363/520/104 +f 77/484/103 82/515/103 360/518/103 79/485/103 +f 84/510/102 91/521/102 354/522/102 86/511/102 +f 102/523/101 89/469/101 357/472/101 351/524/101 +f 353/506/100 354/522/100 91/521/100 95/505/100 +f 97/492/99 102/523/99 351/524/99 99/493/99 +f 173/525/98 175/526/98 326/527/98 171/528/98 +f 109/529/97 115/530/97 116/531/97 107/532/97 +f 104/516/96 109/529/96 107/532/96 350/517/96 +f 113/533/95 127/534/95 129/535/95 111/536/95 +f 126/537/94 160/538/94 161/539/94 345/540/94 +f 115/530/93 113/533/93 111/536/93 116/531/93 +f 120/541/92 139/542/92 341/543/92 346/544/92 +f 140/545/91 121/546/91 123/547/91 340/548/91 +f 118/549/90 188/550/90 320/551/90 347/552/90 +f 121/546/89 120/541/89 346/544/89 123/547/89 +f 139/542/88 118/549/88 347/552/88 341/543/88 +f 127/534/87 126/537/87 345/540/87 129/535/87 +f 132/553/86 134/554/86 135/555/86 130/556/86 +f 134/554/85 137/557/85 342/558/85 135/555/85 +f 137/557/84 141/559/84 142/560/84 342/558/84 +f 141/559/83 140/545/83 340/548/83 142/560/83 +f 143/460/82 146/561/82 148/562/82 144/461/82 +f 152/563/81 185/564/81 187/565/81 154/566/81 +f 146/561/80 174/567/80 328/568/80 148/562/80 +f 150/490/79 320/569/79 188/570/79 151/487/79 +f 158/571/78 164/483/78 163/486/78 156/572/78 +f 180/573/77 166/574/77 332/575/77 179/576/77 +f 160/538/76 132/553/76 130/556/76 161/539/76 +f 166/574/75 75/519/75 363/520/75 332/575/75 +f 169/577/74 152/578/74 154/579/74 331/580/74 +f 178/581/73 169/577/73 331/580/73 177/582/73 +f 174/567/72 173/525/72 171/528/72 328/568/72 +f 175/526/71 178/581/71 177/582/71 326/527/71 +f 182/583/70 158/571/70 156/572/70 324/584/70 +f 183/585/69 180/573/69 179/576/69 323/586/69 +f 185/564/68 183/585/68 323/586/68 187/565/68 +f 190/476/67 182/583/67 324/584/67 191/477/67 +f 355/587/66 352/588/66 126/537/66 127/534/66 +f 349/589/65 348/590/65 113/533/65 115/530/65 +f 149/591/64 114/592/64 188/550/64 118/549/64 +f 95/505/63 91/521/63 162/593/63 344/594/63 +f 165/595/62 162/593/62 91/521/62 84/510/62 +f 138/596/61 362/597/61 140/545/61 141/559/61 +f 167/598/60 155/599/60 104/516/60 82/515/60 +f 336/600/59 165/595/59 84/510/59 58/509/59 +f 376/601/58 125/602/58 169/577/58 178/581/58 +f 322/603/57 189/604/57 12/466/57 16/465/57 +f 369/605/56 356/606/56 132/553/56 160/538/56 +f 168/607/55 167/598/55 82/515/55 77/484/55 +f 344/594/54 335/608/54 51/503/54 95/505/54 +f 358/609/53 359/610/53 137/557/53 134/554/53 +f 330/611/52 333/612/52 42/500/52 40/499/52 +f 153/613/51 349/589/51 115/530/51 109/529/51 +f 378/614/50 131/615/50 158/571/50 182/583/50 +f 338/616/49 336/600/49 58/509/49 63/507/49 +f 112/617/48 319/618/48 5/456/48 3/455/48 +f 359/610/47 138/596/47 141/559/47 137/557/47 +f 337/619/46 329/620/46 34/497/46 60/495/46 +f 145/621/45 147/622/45 120/541/45 121/546/45 +f 131/615/44 128/623/44 164/483/44 158/571/44 +f 170/624/43 172/625/43 68/479/43 72/513/43 +f 119/626/42 371/627/42 166/574/42 180/573/42 +f 125/602/41 133/628/41 152/578/41 169/577/41 +f 383/629/40 378/614/40 182/583/40 190/476/40 +f 367/630/39 327/631/39 29/488/39 151/487/39 +f 327/631/38 337/619/38 60/495/38 29/488/38 +f 339/632/37 170/624/37 72/513/37 75/519/37 +f 335/608/36 330/611/36 40/499/36 51/503/36 +f 362/597/35 145/621/35 121/546/35 140/545/35 +f 375/633/34 376/601/34 178/581/34 175/526/34 +f 325/634/33 184/635/33 23/475/33 25/480/33 +f 356/606/131 358/609/131 134/554/131 132/553/131 +f 122/636/31 124/637/31 173/525/31 174/567/31 +f 147/622/30 361/638/30 139/542/30 120/541/30 +f 157/639/29 343/640/29 89/469/29 102/523/29 +f 155/599/28 153/613/28 109/529/28 104/516/28 +f 184/635/27 383/629/27 190/476/27 23/475/27 +f 352/588/26 369/605/26 160/538/26 126/537/26 +f 136/641/25 122/636/25 174/567/25 146/561/25 +f 189/604/24 176/642/24 53/473/24 12/466/24 +f 361/638/23 149/591/23 118/549/23 139/542/23 +f 381/643/22 117/644/22 183/585/22 185/564/22 +f 176/642/21 338/616/21 63/507/21 53/473/21 +f 117/644/20 119/626/20 180/573/20 183/585/20 +f 371/627/19 339/632/19 75/519/19 166/574/19 +f 124/637/18 375/633/18 175/526/18 173/525/18 +f 159/645/17 157/639/17 102/523/17 97/492/17 +f 172/625/16 325/634/16 25/480/16 68/479/16 +f 333/612/15 334/646/15 48/463/15 42/500/15 +f 348/590/14 355/587/14 127/534/14 113/533/14 +f 128/623/13 168/607/13 77/484/13 164/483/13 +f 321/647/12 364/648/12 143/460/12 10/459/12 +f 364/648/11 136/641/11 146/561/11 143/460/11 +f 334/646/10 112/617/10 3/455/10 48/463/10 +f 185/564/9 152/563/9 133/649/9 381/643/9 +f 186/650/8 322/603/8 16/465/8 18/470/8 +f 329/620/7 181/651/7 37/491/7 34/497/7 +f 343/640/6 186/650/6 18/470/6 89/469/6 +f 151/487/5 188/570/5 114/652/5 367/630/5 +f 319/618/4 321/647/4 10/459/4 5/456/4 +f 181/651/3 159/645/3 97/492/3 37/491/3 +g Cube_Cube.001_legs +f 389/653/132 391/654/132 392/655/132 390/656/132 +f 385/657/133 387/658/133 388/659/133 386/660/133 diff --git a/mods/homedecor_tables/models/homedecor_table_small_square.obj b/mods/homedecor_tables/models/homedecor_table_small_square.obj index 5bb07ee3..bec5c536 100644 --- a/mods/homedecor_tables/models/homedecor_table_small_square.obj +++ b/mods/homedecor_tables/models/homedecor_table_small_square.obj @@ -1,43 +1,139 @@ -v 0.499 -0.499 -0.499 -v 0.499 -0.499 0.499 -v -0.499 -0.499 0.499 -v -0.499 -0.499 -0.499 -v 0.499 -0.469 -0.499 -v 0.499 -0.469 0.499 -v -0.499 -0.469 0.499 -v -0.499 -0.469 -0.499 -v 0.469 -0.437 -0.469 -v 0.469 -0.437 0.469 -v -0.469 -0.437 0.469 -v -0.469 -0.437 -0.469 -vt 0.5 0.029 -vt 0.971 0.029 -vt 0.971 0.5 -vt 0.5 0.5 -vt 0.015 0.985 -vt 0.015 0.515 -vt 0.029 0.529 -vt 0.029 0.971 -vt 0.985 0.5 -vt 0.985 0.029 -vt 0.5 0.515 -vt 0.971 0.515 -vt 0.485 0.029 -vt 0.485 0.5 -vt 0.971 0.015 -vt 0.5 0.015 -vt 0.471 0.971 -vt 0.471 0.529 -vt 0.485 0.515 -vt 0.485 0.985 +# Blender v2.83.5 OBJ File: 'homedecor small square table with legs.blend' +# www.blender.org +o Cube_Cube.001 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 0.437500 -0.500000 +v -0.353553 -0.500000 0.353554 +v -0.353553 0.437515 0.353554 +v 0.353553 -0.500000 -0.353553 +v 0.353553 0.437515 -0.353553 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 0.437500 -0.500000 +v 0.500000 0.437500 0.500000 +v -0.500000 0.437500 0.500000 +v 0.353553 -0.500000 0.353554 +v 0.353553 0.437515 0.353554 +v -0.353553 -0.500000 -0.353553 +v -0.353553 0.437515 -0.353553 +v 0.468750 0.500000 0.468750 +v 0.500000 0.468750 0.500000 +v 0.500000 0.468750 -0.500000 +v 0.468750 0.500000 -0.468750 +v 0.500000 -0.468750 -0.500000 +v 0.468750 -0.437500 -0.468750 +v 0.500000 -0.468750 0.500000 +v 0.468750 -0.437500 0.468750 +v -0.500000 -0.468750 -0.500000 +v -0.468750 -0.437500 -0.468750 +v -0.468750 -0.437500 0.468750 +v -0.500000 -0.468750 0.500000 +v -0.468750 0.500000 -0.468750 +v -0.500000 0.468750 -0.500000 +v -0.468750 0.500000 0.468750 +v -0.500000 0.468750 0.500000 +vt -0.000000 -0.000000 +vt 1.000000 -0.000000 +vt 1.000000 0.500000 +vt -0.000000 0.500000 +vt 0.968750 0.984375 +vt 0.031250 0.984375 +vt 0.031250 0.515625 +vt 0.968750 0.515625 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.968750 +vt 0.000000 0.968750 +vt 0.000000 0.937500 +vt 1.000000 0.937500 +vt 1.000000 0.968750 +vt 0.000000 0.968750 +vt 0.000000 0.937500 +vt 1.000000 0.937500 +vt 0.000000 0.968750 +vt 0.000000 0.937500 +vt 1.000000 0.937500 +vt 1.000000 0.968750 +vt 1.000000 0.968750 +vt 0.000000 0.968750 +vt 0.000000 0.937500 +vt 1.000000 0.937500 +vt 1.000000 -0.000000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 -0.000000 +vt 0.031250 0.515625 +vt 0.968750 0.515625 +vt 0.968750 0.984375 +vt 0.031250 0.984375 +vt 0.000000 1.000000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 0.968750 +vt 0.000000 0.937500 +vt 1.000000 0.937500 +vt 1.000000 0.968750 +vt 0.000000 0.968750 +vt 0.000000 0.937500 +vt 1.000000 0.937500 +vt 1.000000 0.968750 +vt 1.000000 0.937500 +vt 1.000000 0.968750 +vt 0.000000 0.968750 +vt 0.000000 0.937500 +vt 1.000000 0.968750 +vt 0.000000 0.968750 +vt 0.000000 0.937500 +vt 1.000000 0.937500 +vt -0.000000 0.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt -0.000000 0.000000 +vt 1.000000 -0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn 0.0000 0.7071 0.7071 +vn 0.7071 0.7071 0.0000 +vn 0.0000 0.7071 -0.7071 +vn -0.7071 0.7071 0.0000 +vn 0.0000 0.0000 1.0000 +vn 0.0000 0.0000 -1.0000 +vn -1.0000 0.0000 0.0000 +vn 1.0000 0.0000 0.0000 +vn 0.7071 0.0000 -0.7071 +vn 0.7071 0.0000 0.7071 +g Cube_Cube.001_top-bottom s off -f 1/1 2/2 3/3 4/4 -f 8/5 7/6 11/7 12/8 -f 1/9 5/3 6/2 2/10 -f 2/11 6/4 7/3 3/12 -f 3/13 7/1 8/4 4/14 -f 5/15 1/2 4/1 8/16 -f 9/17 12/8 11/7 10/18 -f 7/6 6/19 10/18 11/7 -f 5/20 8/5 12/8 9/17 -f 6/19 5/20 9/17 10/18 +f 9/1/1 2/2/1 8/3/1 1/4/1 +f 22/5/2 26/6/2 27/7/2 24/8/2 +f 24/8/3 27/7/3 28/9/3 23/10/3 +f 22/5/4 24/8/4 23/10/4 21/11/4 +f 26/6/5 22/5/5 21/11/5 25/12/5 +f 27/7/6 26/6/6 25/12/6 28/9/6 +g Cube_Cube.001_edges +f 23/13/7 28/14/7 1/15/7 8/16/7 +f 25/17/8 21/18/8 2/19/8 9/20/8 +f 25/21/9 9/22/9 1/23/9 28/24/9 +f 21/25/10 23/26/10 8/27/10 2/28/10 +g Cube_Cube.001_top-bot_with_legs +f 10/29/1 11/30/1 12/31/1 3/32/1 +f 31/33/2 17/34/2 20/35/2 29/36/2 +f 31/33/6 29/36/6 30/37/6 32/38/6 +f 20/35/4 17/34/4 18/39/4 19/40/4 +f 17/34/3 31/33/3 32/38/3 18/39/3 +f 29/36/5 20/35/5 19/40/5 30/37/5 +g Cube_Cube.001_edges_with_legs +f 32/41/7 12/42/7 11/43/7 18/44/7 +f 19/45/8 10/46/8 3/47/8 30/48/8 +f 12/49/9 32/50/9 30/51/9 3/52/9 +f 19/53/10 18/54/10 11/55/10 10/56/10 +g Cube_Cube.001_legs +f 13/57/11 15/58/11 16/59/11 14/60/11 +f 4/61/12 6/62/12 7/63/12 5/64/12 diff --git a/mods/homedecor_tables/textures/homedecor_glass_face_clean.png b/mods/homedecor_tables/textures/homedecor_glass_face_clean.png deleted file mode 100644 index d955612af8b238e80f589bdb2e3aa17cbb58d972..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`f}SppAr-fhC0G|Hi1aXNFfgzP WFfc0XXw(BG89ZJ6T-G@yGywqPlnzY* diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_large_edges.png b/mods/homedecor_tables/textures/homedecor_glass_table_edges.png similarity index 100% rename from mods/homedecor_tables/textures/homedecor_glass_table_large_edges.png rename to mods/homedecor_tables/textures/homedecor_glass_table_edges.png diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_large_inv.png b/mods/homedecor_tables/textures/homedecor_glass_table_large_inv.png deleted file mode 100644 index c8bc85751b8d25fed1e4f3ea1f8e67eb44e533d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2457 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 Xk%Z@P<<(h{00000NkvXXu0mjfOOUu5 diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_large_square.png b/mods/homedecor_tables/textures/homedecor_glass_table_large_square.png new file mode 100644 index 0000000000000000000000000000000000000000..3f58b48f6d9a23b3cb85150daf218c1fb8a42780 GIT binary patch literal 604 zcmV-i0;BzjP)<h;3K|Lk000e1NJLTq001BW002M;1ONa4(TBYy0006bNkl<ZSi`kf zF>)I*3|w&T8=gFa58xkCyK$HH+AG-V32s!Ua_fQ*xbZX6XVRrainBx#1R%<qT*uSw zVnHl$5PdKndKMs){qqleci}%d$XBO36@(sk0{9CAC#;t<uXLZ10HDHA;j07M#}wo} z^zfZ~c(e%);SwInf(rsoc!eLrqh19&?+TA<QVqfC_(8&JQlpVrQxnZQ34O#9uVfeT z5FSZ&;_AS6C9)u>a47I-!U6i=-{e{K+fcZ^8yC0@ySs4H%GK>rasLE?jO*zL9(>2n zx6%koovUn)bn6y^-F4tdP~d%Y2dnE~)Lr@^SY0;<A1=|)SaYKwxEF33X%;?BV8JH| zZ1^NWq`RAG{-O6rKkt7ZRIvQPtCQgio?ZCcxF6)N?FV@hURWi_*sd=&mnxB@2ra0E zZ-$0MK)L0E1D>z3N}mRjO^_QM8yyrqpg#!$DSV?Ru7E>F8u!FcFoVXtf6=oVxt>Ce z)-QP3$-6y;R&eGEP$rWa9~hUI4+?C^Y!$H}QQ@RJajS7jZmXpcF0B-*fi7{kYXRGg ztMHzJ&J1@ycp3`VcjE%LVT%iQMp}`#e;<L2>*-iLcmV(grP&n9AUkPAWrLt}|5iTX zNaGOc&u8w;!qql<)Y6^b_)1_;J*_(CR4&TYyHSlZ&&*!S3(9vvpS`vh0;a~dZ6)*T q+){W>bUyEi<UIO6`@#9a{oo&DbLfs!@>6vH0000<MNUMnLSTX(1QSjG literal 0 HcmV?d00001 diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_large_square_inv.png b/mods/homedecor_tables/textures/homedecor_glass_table_large_square_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..24ea176c042daf428512e376e614fd5504a6a579 GIT binary patch literal 315 zcmV-B0mS}^P)<h;3K|Lk000e1NJLTq001BW001Be1ONa4*>kdg00033Nkl<ZNXMm> z!41PO2t_|Advpvo=@h+sfnL2yH|Pjfcj*fB5LK=T5U24iiQe}IJ_@}Qr_KW0DgJ!J zHN_vw_EkOTfJdwX`iDS8`95o*V@?=A$I<bUKy6!s?Zb#S9dU^TR^t{Iif|*~8SnUN zT>L4-b$49cqJ9KQk_U_TqP9U&&y9pV;qk_*h2kNu#)aG@mIQCk%|@W(aBvB6fL{8h zEUK5y;KprSkS=UX@i59g?c$_=Lcrde`QQw1Xu4MhJ9F-~RcNmZ9B&;|2o63jH%D8C zVD2^#9BthkzG-4!v6n_8a1;-NG>cCQMEImYj86&(9bTsSL(h}H_Yc<TXcEdvOL71J N002ovPDHLkV1mv#g@phB literal 0 HcmV?d00001 diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_large_tb.png b/mods/homedecor_tables/textures/homedecor_glass_table_large_tb.png deleted file mode 100644 index ca9a14ef807e2f52f778ad74f49642f282b38144..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k)AG&Ar-fhEeanUsrNFt(GYUC zgsteqwYAZl(gkmCZT-)}>k!^^PCbLc@#u`UBq@ikG$S5|47Ch~orw++#)-@Zrjv6S s{w6cV3hvwp6nL80kjXG(0ShyO*OV2nuBq&>0b0V~>FVdQ&MBb@0Ks4|jQ{`u diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_small_round.png b/mods/homedecor_tables/textures/homedecor_glass_table_small_round.png index 1932f0fe5171a8e9e5e1b14122f3a7ed08f333ba..1329b1b53edb21fbf1277e896d7b896020d96359 100644 GIT binary patch literal 597 zcmV-b0;>IqP)<h;3K|Lk000e1NJLTq001BW002M;1ONa4(TBYy0006UNkl<ZSi`lK zF>)I*3`IXUx`rpm-~o7t)NazH-F6GMx`gUfYF+REJ3dDGOuCdvv6e`J0K~P%>L|_o z_#i&HD|*LspA(RspMT=Ji~mB9U!4y+2t9TN_!9zWEVnf;bj(QrP;pdzaiDE%LGDA3 zZ`|Y27TAqTJd%YA0nK>DcjHl?g57t;quNv>usC^;cx`G75^HXvxhJ8oc;<!dA@0Uo zyh-BX;G0re2vi&j9!(secl>dq`fV6oe;QA45A5dRW|V8%qmup!0a@4c5j=du#*f+v z%ABihj`V03f_>`1k)YuH;SScRgE4oRhhUw$Iegeezhf<pLf|NF25A<b7O?P10UMtb zu<-+XV14NA*~k08=id*!$LJ5dy7*<>gZ#PogFJ~BRs}NF`xmP#l}Jj27HaX;@Q?^7 zk8-f%`ChB^Z6MhKx$&{mF3|)1N(e~fE4^?9b{}cX!3WHsvG3pXs#dP6P^<MXc-iT@ zU4_<g<{K!RNlgxnP0YIlR%Et@Sdgf2(v!H>x+LFLOJiI{DbxVn>aO<zwjEdFy#!tH z*G>P+Fu49Sp5PwX;^NMgR^;v<6OeU1A14nl0KlL$+d>&^CvB)~2$b&M$_I`#ULyVa z+J}W}Z1k$7TVJYxed}q{F>mFf+<FhDah<w*tt?#h9B3}AECftl-*%MDr*kXeCDD1j jCzAKk*SsHGo)q{Gtc}@u8DJ^L00000NkvXXu0mjf6fz&x literal 241 zcmV<N01p3&P)<h;3K|Lk000e1NJLTq001Na001Ni1ONa4O9@aD0002ENkl<Zc-rlf z<#mHW5Cc;~`v0AnnVFfX20yo87^{OlGfKy+Hy{3dlvZn(%*`<>Ugc!DF(b-6_5tn8 z(_!xaGirTyX0pxy8WAJ&)f=cspAI7$RH!mxOjG-w)*ZQpGsXbPcfBJiLxuzqf+V$y zYn>;oF@^`NTtRUxP?5Xdku+pXP43WTK%ar!przG>9s^g<1Pj#Wu6HEG$Pp(=UUPy! rjWJT{NlK(;M@#_&B;W9kzOr=$j=YY=;}JXp00000NkvXXu0mjfkUe0G diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_small_round_inv.png b/mods/homedecor_tables/textures/homedecor_glass_table_small_round_inv.png index 0d868375b0aa6a09a93a2ef40bbf832196f29eb4..d6af47720b41d24ecd21210385133bc283ecb13a 100644 GIT binary patch literal 713 zcmV;)0yh1LP)<h;3K|Lk000e1NJLTq001BW001Be1ONa4*>kdg0007zNkl<ZNXLzp zF-RLx7{`D2DmWDM)!-OP@Rlw*Xt+(3f`h~1ASq5Rfp)04m`-tNv&AKpZb9fIO&!V! z1p}fu^@t8SSvbv*F<2i$hl1sGxSp50+(q9FclYl7zW06afA9T`7X57|!y>axk>eR~ zLz^>>`F?WUKh|jRKGNajDN^8oLr%Hm7cj;I)6Dad26Y*kvB6LT9;d`I+f3RWzvnFl z=+fl}pH!ArzNlTQvKunOzf}QejvYqYIlB_z(Iz{x!U7}gsJU2xDkYpHHrf06dff;^ zCIs>18}`^#OF_>NKnZ7#HFoSewE!=X)?`inW=$!1bf1AUP8r9p2Sehxt0Qm7Iu2zu z9<D(N&#r}u$8pQ(#VtVA@cdx{oIJ~Hr6nHXE&x{WVT)yz_cJK6ZF^~Thqx69D?PR; zf|$ur;B$ZCQ5E92WdNTkEMx?W9Q5j5)k(!9;K&XKEDB~h3}>wBl94W=uSU<39x^MK z;xs_ga5q5>08W__<hY~<CjqyTakwOB=sSj+e^Y-uo=57BHuZ!*hQ4E1rUq~a;C=wX z4P!}QboJfj2xHs`+Dtq&Z)zSBv;}8Or{ONH9$3aSXM$tqV>*XvYs(n83iBKrI)lfg z?DX$Cl7#CKRAo8G6erg-Snc0+58=Qnjpj8ibY5R+a}@u&V06HBp@S!F>MNb!M}Tax z%f@4Lj}*DVu51M-QWaCJ$9LTzT&-jJ`%eJKE){H5<gs`Wn~Lua|BXc+Dao38Dr=9L z-R7fzCKEc7{H7FT^@1(wrQ^zE1CtK{e(y|v7OZefQ<YUV>0DG<Ri?=;D<MwQ8)cVw v>MKRgRhqfJk}*3s_7f^zNU`^3g1!F(*~1ds5v0}e00000NkvXXu0mjf@*YE` literal 3865 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 bs#f(sjH-iy2wRT=00000NkvXXu0mjf4Iiq) diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_small_square.png b/mods/homedecor_tables/textures/homedecor_glass_table_small_square.png index 66baf21bf497433350960eee88133e23596dae88..e89ea540b97c84dc8567060f9a308b49933e0ef0 100644 GIT binary patch literal 642 zcmV-|0)737P)<h;3K|Lk000e1NJLTq001BW002M;1ONa4(TBYy0006>Nkl<ZSi_}P zF^=0X5S%5{2KNFZ&)@_2hpVqimsYI`wJxtrb4Zyg4=^8~X9Vd3-x)}E*eht8%N3WV zPihPrn%UXiS(2gyW79JL4;$crFaW?z`L8`j@xpgJHsHS)a2MG1_s*1@ipnFElwAZ_ zbcT-&(4q<Squ~peaBmYN;TrDAf-8cW@C;AFeXRzqyffTalM)1DC7HT#nbfL?d#<VR zW=&ifanB>!O-#ZiTsU!Tz?Vv7MUdgBz`Y3v=)e#7N4D#}t{NwY>6E7Nv0+-@GYhuc zeZ~D91Uha@hikzXEPN{sSLt(>&7N*m!P!#>_Jj(&9ByY#9gMzfKR9dZ`rxY~wll7| zQ4!n=H;vQ_?<TO|odh<#lfXBol@9#A;cz`+IBq-LG5p_3@QU3A_!|b`h##UzGbZuE zH#{}qzw`ZIM)_+!k*jT#QKu$VAWh*UNWv#WLm(jDGE#!i*I2Pk1HmSkg^r05MF}WZ zia-mWXvZ0lbcFRi@eF3rI`6;qRE?ZhE=Mabcyl9fxpGqQ%om_eCI}xGMVu1_Cd_O# zF(OdpY7x(kOF+`M)hL8(E4gf-OWf(&K$&qCUQ*CAe*qdh&TiE>IZSV<jrPRF2E4f^ zMqT~;2z1<*j-dsQ0KlNon?hX44z;GTK@f|tl`|Y+y@?cSCxxe1bpgxHM@{+6FWlbs zYTdc`;3vD9+wXCOA_&!uv(-%3xA)p!aOm2;Z7Z3_yRQ5v?gxReYN%o5mrs7dAK@?n cr%lKE2OuT!R=rR+Z2$lO07*qoM6N<$f{oxMjQ{`u literal 358 zcmV-s0h#`ZP)<h;3K|Lk000e1NJLTq002Y)002Y?1ONa4k{Vk%0003kNkl<Zc-rmQ z$9Y3B3<P2JU&d=d6}SOK07~V+<DAXUUY<a4ZjQfF+Sb}#Dy^~&IWR=XD2mEhXdtBh z^DI+BJU!=xy#3QYqCTYmPru^oL;ix86Vkuq)`#>TwlhNB5I0Eg+#sIb`T9JNK4K<F zA2A=KgP0O>duCnbA~XoHQW+Fvw51~%o#^=7%lCKWWVCxO=!K#(R0uWwM20-|7>$64 zjAabO(&We8o=QRFg~g~2gsW9pSSmt1U0zrYR0qNzkrx)DQV@AzIZ+)*WXKE4nMy(A zg=I%|AlJOgZv%|#Kq5n4Sawtg;_33jvZqoId0{cC1L10w7nTDRfCwM3YC|GJo_d0Y zKwu1k=r<1SX-8{v+ELJ+jGPW+bRefQ#T!FEDx`7l0S9=?yGt}tIsgCw07*qoM6N<$ Eg6O-K1^@s6 diff --git a/mods/homedecor_tables/textures/homedecor_glass_table_small_square_inv.png b/mods/homedecor_tables/textures/homedecor_glass_table_small_square_inv.png index f768314d4b8f507965e1b35d5a29e09dc70d9e44..aa4079c4bbaf9ae99341e33c3ffffffbe8676255 100644 GIT binary patch literal 334 zcmV-U0kQsxP)<h;3K|Lk000e1NJLTq001BW001Be1ONa4*>kdg0003MNkl<ZNXMm> z!41MN3`M`A-Wh>0yh*3vngzIa6K3cF8G{875@%!%6(n_SH>kZ-s`|da9e;&p!J%gW zP6zNi1^~EH{WKvrKU^>d_)UQH#eVNUTS}^`WLish2~^V+&jD1lfPOSyWR0^guo%}k zlZPt-%Xq~X<7~|!>bv4>Hq{7ZqZ!+H+tg-=lUQ!pok?0(oFtQfh>P(SZ#FRpcrhv~ zfr`Vx*~I~x<%9?MTX)_ZTpOm>lEyJuTJFh$zwK;ne}{ms8~I2PUQlGOjbxm2wJl70 zQ%HX5AWSgub-0t4IymR9_aS+y>%%ugj61frQ3?EuyNlF|cMEuUr+|-l3UH8Cn&o}q ga(!WV9=qM~0hM-bLdVkU0RR9107*qoM6N<$g5l1NxBvhE literal 3938 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 diff --git a/mods/homedecor_tables/textures/homedecor_table_legs_brass.png b/mods/homedecor_tables/textures/homedecor_table_legs_brass.png index f0e8bf950ab85b689743b03dcb3cc22085996087..ab80ee76501fc8b9075d395d8db87bac8e0b3c45 100644 GIT binary patch delta 461 zcmV;;0W$u}0^9?T8Gi-<001BJ|6u?C0i#JoK~y-)osvIH6hRcme*=TNcaq(sFmZvS z(8LZCDQ*2%5^YQf30j$rcEp0lM0*MnjTSVT(^9b2!b%$o5=g+D{7EFagNTQhy+OIz z<53)JghM><t0wck_sjR*4D3tx#XoekP8}TPrbZ+-WqwCx3V+2C-+x4e&sG$`%;Z(k zX%C(DaQpz*@1bwtfl2^#QzNpvQebfOLjue_ydZr+hLl%tyfpMS@jkyFmu%2Uw*Q{e z02gn*R7ayK?Ig{`@?r1t^-)DLntgLi=BMwRxR<t*%!8R*1~`6z+tu4T!1a63j^7&K z+w4>6Nc+^{3V+L=9?O3N+EW=~yG=FPpjz4dYl35+qwpmsHEYN(ED~>*2r`P;lo=SF zZm8GC0b*<Ty12lV+Y<`l-S{;*bGp{t2y62%#767HW-GbdF%gAgiRbsvHS9v=KaPph z)k}x#QL7rN(FRNTWp3PkbtvwW;jEkwQgolq(COEIs76kE==F+2yZyzkEn&?j)@(I2 z13b#Dsn=uu@^eQMMQvycr*_@C8HS;RVJI}IKkN4ZHYlsqJ!ML300000NkvXXu0mjf DCV=Ff delta 315 zcmV-B0mS~?1Iq%C8Gix*005AYXf^-<00wkYPE!B?00000Zl(v300031Nkl<Zc-mut zfd62?fDUlWURoc2Zb`tg>5gma^rvSlK?G0FaXG&%=<<eyTl*^?otuK9dSkCEoV%n{ z?NFZ?L^WLS*sk8kmuF&kz|u-xi0W<Ap&AGSh)WoV2M~9Ypnn16%L`LU&;SgRXV;ey zt@`|w=QkEVzC7dZ(MF;)JiW057=m|?HD2GDOIY<Yu<E@l3wF+rgTy8w_W)I|%7?Il zv3YEU6F$`-cOPp6nhoKuYO+{UZvamzh!A{uVd^uWFE0Uo2~mvzO);`dOV#%Gn!(c* z!=cR$M|brc-Za|0Z&f}-HD*d#-)6O`-wl{j_AJQ&31xx-Uauk4003{WopaleneYGr N002ovPDHLkV1oMZh^PPn diff --git a/mods/homedecor_tables/textures/homedecor_table_legs_wood.png b/mods/homedecor_tables/textures/homedecor_table_legs_wood.png new file mode 100644 index 0000000000000000000000000000000000000000..c8c658eb3b6bf6c2662ef88d2cb6661a730a07b1 GIT binary patch literal 357 zcmV-r0h<1aP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0003jNkl<ZILn=q zF-inM5Jg{Ach8QlvaYbKiFyFR)Xdx)cnuF^VCV@<1Tl6oF*GrdU2s+%RB)!dr`sC{ zGcW&-|BI5#i?ckNj@cS-a(lPH6^6R@%=c&P&3BoMgu*JT&zARfMZNwZB{)4j#<vZ2 zI&oaxKVyr6$3?~Vc*N_v=BP?cc4|ZgQy5|sSuVd=eS8D(Ldp5b0k(7{2wdMh2mloT zygfbhA1C=RJLk|Y2FmdkeKFPnphgT`47~+*RG`M9fj~~Ve*-n-oKe9Mz3(mXzClFL zruF39zd>kPf^Sjdgxn37;2bF>bi+E3-g#6NMbY0j3=*U+@!144#18B1070Zn8O;b? z>==p`RtNooh)`NZeN2#t-QcTD=x@w4vA-be1|;|cMbCp>u`Twz00000NkvXXu0mjf Dqu`k* literal 0 HcmV?d00001 diff --git a/mods/homedecor_tables/textures/homedecor_table_legs_wrought_iron.png b/mods/homedecor_tables/textures/homedecor_table_legs_wrought_iron.png index 8d7eec55533742ddcdcef2a0d8b7acf9de692782..94e8bc1ae789d5860dbeace45a0cceb66046a6e4 100644 GIT binary patch delta 424 zcmV;Z0ayOT0=EN@8Gi-<001BJ|6u?C0e(qDK~y-)os&hRP%pPtF~d~AMzppamc zagDf|5J@fp1qojC=5O@s#XsOtM3hVt3~Lezo;-*Qo9U_PE)Pl8uiZ)XJrz{-!&`6B zaHg^>wJb~J0{uB>&Wi_k2ingw@+>FGQf$xi;^iv?@MwKSn}0?K8gPx^8ex0?z)S!e z_m{PH4exgLC%|W04|QBshzQ;XUcdb?=`CKpqG_72H##zAmesZ4ZS5x(fUn=av;FbY z)Y)hj;LZCT<3nJ4;$}YX1OWID@F8@D+6fS8X?@!XnCohe>zWYs{~Qc&Evbk<t8eH( z0~+x}QA8X?M1Ql7H61XxzMzUCjo?EdO)Z;iL%qBM18wUW9e**qqa))QVZJ|qIR}HK z1?|nn*xt{4t+ix%&hw{F{&HbfmkVvZ=cINR1Btar>)9P0{<iqz%?-_xgsQ4Q15N~0 z#oS!Hrp^gbWQgOKUL3P`@Of%#>-X+x?P^p36lqVdL?KZWS`@{FU-?|W&i?=ahOtxv SjYYBm0000<MNUMnLSTZsCC7~b delta 309 zcmV-50m}Zj1H}T68Gix*005AYXf^-<00wkYPE!B?00000Zl(v30002`Nkl<Zc-oDU zgJFd+5P)xs-?k#vwvENRPp@`gzL-aN;o%wh!JnswbQ|;HXk+>EaQpu3@MUvzUM!1g zkq>gH$0~z&7WlyX>V0{(x3RON*9}{d<b5*@+_p&IS2XSMHh<Q!&cTuuMa<NJJ&R(L zLj(5csikcJ_6$|py_jeNZHqdM@BwX0u%Ro`Hc!SX<6UKOJ5SKxMd+ghjL)j3Grv#D zBz&2Rp*~z+nsJ*nd0(b4%XvOt9q!zo9>8bN-)J0K*<=xE3N+yJ>CWoH>CXD*g2KF7 zlGCCXp-RKpb1pDdia2Pq_@~%;HnOgyE!N^yc=HVW%ln;29NaXl%g?-<00000NkvXX Hu0mjf+0>ZQ diff --git a/mods/homedecor_tables/textures/homedecor_utility_table_edges.png b/mods/homedecor_tables/textures/homedecor_utility_table_edges.png deleted file mode 100644 index c2b3d96e801a7b3608054d7bbfa8af3145c1864b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmV;?0WSWDP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0004)Nkl<Zc-lRY zw;4o5421uYwD0hc5t2~@&Cm(`;=Q|jyVBtKlxn;_`}7k@C}0AHSS!yxBd&^b$TUM< zI(yFRE~1cdta4S2&$%Jv%24R7B@`Ljd)ETJQIT;K;mmZ;gzC*V+&EM#Rhrv+s5>h} zCH3<c-)?KA_ZC6o)2x!h3=S~>$1sek9ZGwnEGq?C3t*aBjO~!^C5+sz=dU15PgR^V z8J6<C#}*KQJwRM|qj0_R0Spi-OEr6dx0ROf8z4eJ6+z9MziRE-8OzGPcdbw^9G=%c zJMxMMAg@Q?FS$$cc=Ni(Fud{J^?z>nx*k`CkI@K@1<H{7uj>|ew|AdCp~*~|i0e^* z;wmE_*IJRa_wU<*rb)|^JRNm~=<%yNGd*o2{MXVyegBjM03-#rm9Gr<h(TeM<^W{4 z_EW$#JqB_qLc&=JuszM-2p9<Jcx)joM<NYMBikKdCI|tHz|=<{f5@4r7zhziD^Anh zt1>fznc1huaHf9$>1U(5s=IMiq345`Anf6JqQcWa_Za;Fj>Q)Yis1M)00000NkvXX Hu0mjfYCP3V diff --git a/mods/homedecor_tables/textures/homedecor_utility_table_legs.png b/mods/homedecor_tables/textures/homedecor_utility_table_legs.png deleted file mode 100644 index 121f2f23c681c4e5259803e4d60132924c481b77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 338 zcmV-Y0j>UtP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM00006bW%=J00000 z003^L2ax~(0S8G$K~#9!jS;n3g)#8%lHl&X0NT;L3a!yKSOFOWTLG)k{(UTfySv51 zKf*=M{cv$+w7$Buth8i%FRu#3`@3yyuWxFssVu|-Nq2AN<@xFT`8!6)<$A2qvbs{O z9vsPng2Vh%d1>MG^Lyu0tgL!RLQx>R_P4j6cduUna1KS&{T;BiFgZ5R3yd>9*ta%2 zE`xVPrDec4LaGdsK#}<X<H*7S5|SLa6cZ~0iIfr{C~qw=j<p&QNgJCID}&R<Swli$ z3cQk(iZN2LRDi%al${Lx8OL;pA--uRoexq;o`VlDQ3A{eU>_=w#M}cS7D*!OBP4DQ kpC;0uPuc_LBr1jo|61gJ-l#yVO8@`>07*qoM6N<$f|c`&7XSbN diff --git a/mods/homedecor_tables/textures/homedecor_utility_table_legs_inv.png b/mods/homedecor_tables/textures/homedecor_utility_table_legs_inv.png deleted file mode 100644 index 799477a48f9912cc6ae7642cbe97e1d2a7ae2235..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4371 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 N002ovPDHLkV1lvj0M!5h diff --git a/mods/homedecor_tables/textures/homedecor_utility_table_tb.png b/mods/homedecor_tables/textures/homedecor_utility_table_tb.png deleted file mode 100644 index b3ba2be505e010b6d950d9143f479a0b9c51ee88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 576 zcmV-G0>Ax<P)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM00069Nkl<Zc-keA z<#iY_5QG;b9hjM@f<OiSpK?-ADhV}^2Et5czB|!op0i@u`Q}Od?CF!WrJ328{>AGz zKIp|o+}K;&+*n>{I5_!zKAoN%U!2_3N{5FJ<21UZ1;4qsDj{sI^$SZ2pFSQv-k)FG zSY&0LomsiO`KIxE$|SUTu=?%Y4{3c%N~A(W)d=^lCv#m731+222o*+eWZruzIk}lx zX@fc*r<hY6Q_aI2v9K|;5TzPUMI7b=as|;U7M=I#b0sW|3waUmhFCx-*`yDm&Lv7v zfSy+mM>vZ)TQ+t|mFf^HiGafloSDI$uQ4JA-WoMnLd0}Ov6h<wyFtmR6ta>hWC?sD z53Yc_xW1!I+l#H&#>lu+_Bz{0sdi5rQ=CLSgHTf}#(j^+5ijOudsw1et(Nn_a1K%S z9&qWLXN2;2H%_H=jUL@*!?7s(ayyh#tQg3+BqTCSiGom}5JZKG*j%f)M-0^>T_8}h zrDB%L`IubFMP2j%*WeX$FpWEu2w~aAIL1_&82Pv$2B`#|;22WD3w~Pr=KkpjW~mYa z5cCKMPQZeA=-QYv#NeflnVljBRYag7o&af`NX+n&;2{p9SN4txdSyT_>R3G{7{P(= z)l}V(?fdU@@2*ZSrfkE_WiHM6wXH9WCwRo8v-th@Wf^R$<>>DP(*6N?&T8iaOIkqy O0000<MNUMnLSTaQIS1?j diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_edges.png b/mods/homedecor_tables/textures/homedecor_wood_table_edges.png new file mode 100644 index 0000000000000000000000000000000000000000..3e3f98e79739a628532b8b1baf3cc0f5e64586a5 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ$(}BbArXh)p4-iP$U&gx;eWY; zXE74I7kR%bs&q3%Cal?eT*!f)Z_b+|#*5F#>Zc!dZ!_GyPh7@pCGW&mn-spo9pBuh zifT@sB6Lf7X`RIpVTR~$9}Rt5W=#0qt0mj8ZvTDN{U0j4GFu*W96#|#B!J)H^2`T! xmhEN!_qF!XO-nX|21cF)24;x^3@~O5qy6pps*K->CxFgl@O1TaS?83{1OOyDPB#Dm literal 0 HcmV?d00001 diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_large_edges.png b/mods/homedecor_tables/textures/homedecor_wood_table_large_edges.png deleted file mode 100644 index c2b3d96e801a7b3608054d7bbfa8af3145c1864b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmV;?0WSWDP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0004)Nkl<Zc-lRY zw;4o5421uYwD0hc5t2~@&Cm(`;=Q|jyVBtKlxn;_`}7k@C}0AHSS!yxBd&^b$TUM< zI(yFRE~1cdta4S2&$%Jv%24R7B@`Ljd)ETJQIT;K;mmZ;gzC*V+&EM#Rhrv+s5>h} zCH3<c-)?KA_ZC6o)2x!h3=S~>$1sek9ZGwnEGq?C3t*aBjO~!^C5+sz=dU15PgR^V z8J6<C#}*KQJwRM|qj0_R0Spi-OEr6dx0ROf8z4eJ6+z9MziRE-8OzGPcdbw^9G=%c zJMxMMAg@Q?FS$$cc=Ni(Fud{J^?z>nx*k`CkI@K@1<H{7uj>|ew|AdCp~*~|i0e^* z;wmE_*IJRa_wU<*rb)|^JRNm~=<%yNGd*o2{MXVyegBjM03-#rm9Gr<h(TeM<^W{4 z_EW$#JqB_qLc&=JuszM-2p9<Jcx)joM<NYMBikKdCI|tHz|=<{f5@4r7zhziD^Anh zt1>fznc1huaHf9$>1U(5s=IMiq345`Anf6JqQcWa_Za;Fj>Q)Yis1M)00000NkvXX Hu0mjfYCP3V diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_large_inv.png b/mods/homedecor_tables/textures/homedecor_wood_table_large_inv.png deleted file mode 100644 index 2c4b3e8e8d96c17c0a1798a2a894b094b354f5c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4095 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 diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_large_square.png b/mods/homedecor_tables/textures/homedecor_wood_table_large_square.png new file mode 100644 index 0000000000000000000000000000000000000000..3c64e3cc193e3c8843907fe0aeda8af87817dfc7 GIT binary patch literal 1217 zcmV;y1U~zTP)<h;3K|Lk000e1NJLTq001BW002M;0ssI2^z7pK000DtNkl<ZSi|ks zy^bVF6^7yO{6u7Cb$4|S+k?>f7#J&IAq+5amuuiQxEbyT69+7W!3b$I8iwks%8WSY z#KGv@wl~d{D%^aGR2bhI^p`*XkqJcwfU0^7VQMWRgCN!~9wRer(RFKxasTwR%j;AN zD>Gr5rdpMfw%(JrTIVX<t@;?5$>76Xh*Eg&^7^;G{sRCDh$u!1Q&M8U2at$}5pV+) z0w9^wB)hx{Q$|u!cnT2{gm?&skCC7uVS|7QW(I)0UZ0-T4FFg%Y{VcD(t_4`_+Vy_ zfq~Z(Bae^!yxu*$Tkh{NlZc4Lt&i|hBqIBIm0H|~GKU*Tkq**bUZ0+xrdfzZK(C+I z%UUNMWBA=&W&)th&AhO9jw-s#YjbO7J1n&gz_ud9O5L19rpkfDK<iO!B_x9PdUfky z?aABqN=WnQ{d$-WWxiX7dEdJEG)+0ed@Z`XUjL8x`uWo*(W(FEqxS(|Bmi6wX9k;v z2x-;R*N$WWktZSA<@M9YEwYKGHvk}^ump@5%Oa660;P)eE=4d99=p80`=*p4$YCRk z2y&?K+M*PROra8)!^cQw!bmXjF0bA(EWl9V7%9TuMqvue)}j;|2@FgVHOon8?YYbA zZ+`#l$P}XcignOI&;!l0x2+bnNXk%Ev-Ief9?wt5U0(lpx>SV<H#tP)*Uh?lL^cay zuZmKqmrHA&IU+~w^?E&hjl<nCmoHyVV3?;0Z>=+PspYbEx?V?uxF9`zT-&<Kt1kBm zm?wx-G%<uprAEfOrCa}D-|^OiUH;aCTMuqMxb@)HgP%qZKK|?POqhxSD5aQ(3a_hs zIzjt(GLMlt*K)b8@bUQmd6(B^s$4`E%d$*U;iSvf23;QK<E*l^$;QZ$41PGe7IquE zJbm{J03slU2UL&*1Z)5acZ9<_r~-f{mSvw;Wu$``-k=O2h+rsU#Yj-VI|!Ho5dhfj zpFhAF07yY}ct90p!n$D?m|+3L+rH!7H~YLEpO*W_<M;b6YQ2TqRK-2F%ZtvF^(Z24 z4OEZ@D!aVCfB$|tD6uG5=h|&tPUm@%h_K`FZQrl0S5eC`YuV-HcfXw1%~WXXzS&CX zATo<&UaC@IVeXMyiU@g%S=;5+dV`cL<$8W0WH;ZomxsecJsdBi+jiZ$Ez6SO&CXM~ zf4%-6@99t9LJPJI+wivUcMlMtHK?M@um&UmctUBX|Mx%P16pD0>%Jp8USB@<cko0w zrWtL6R$#zwpVy!N0<{8(9;gZ=isG`O*6;t<6T=Wk2q6+eJN>T?2!jWdFapdN9l~(O zb^#J@NXJsq4U1sg_Idroci(!Z5<Sj12R$e@$7Z>$*SVG!NyBR?t*7~RYX0H*XS=+9 z{&JcNipr|@;raR6w`Lw=ZJ}awL7kWXp4QbehiCX+FTefZ$tuF9)4H|od}&Brt}77^ zv%Z|$dO7vpkih6}-Y@4}Ud#RC0J<fJik3vEaM9V*&)2lxe%N=s^<bC3_2AZnTMuqM fxb@&C(S!d3=rYeuD-HEW00000NkvXXu0mjfyK!Ak literal 0 HcmV?d00001 diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_large_square_inv.png b/mods/homedecor_tables/textures/homedecor_wood_table_large_square_inv.png new file mode 100644 index 0000000000000000000000000000000000000000..88bb82926a0a80ca056c29df6e1f6d4068a70d03 GIT binary patch literal 652 zcmV;70(1R|P)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00070Nkl<ZNXPBf zIgT7h5QX6vOJ?;lBAXx&B1@jmp!?`Dx{pj*x&R?yKoG+wyQ?x|lQ9r&mMNgajn4`r ze){A0-<Z%;0H~@*3ey-76$G()^T?{|P1kK8^67Hf<#p+em6@<COYcfW+nhyP?}sit zt$SuwG5B;2Q3|hJUjO>@ZvZSHqR0}aqC&zGC`3dC+(3;0NY%2)F0aB=QB)LOLc|0i zPC<HRfl|VffDUE`fW2NXAJh#1Sdo^IBtqISCZ{Jedn6LC6IpNG?(=&7>D}?^TvbFw zEN(NyTa$>I>s@+tPh}1_kfI!<yS!d5m*pVDBB0mxdRzO#nd#?qRRN%?&AhRAWf$G$ zb-0ahb~^TvfNf2Pm8Lm~ES&>|#F){0ClrGBdUcy%oyFVzPAK!3^L{#<+TpyW`P`=Y zvMiNhzBWC+p8v<aetLcuUFJU@eI|e`0JxvNG1x3bNV{HNCW-+>U4>|u*XNI0)DSHn z06;=v1sF4qM~R9Iv@SNMG(jRfc6ojGzO^Q(w5%qAN)=v5v?fs{)S@aqvzQ54VB%d~ zeIhNuP~pfDVISF;!fK3Yjk18mve2+vgw|QRy#Dg*&ru~rPaSL0NiYM$YmTiqwJ54k zRkQM#w;3NUZ+3b8a=mqh3J*C&)XQemJfen$uy;l4%h%f&UX@W9d%fPTFL62_5AE~k zD;Vab!rPe4+<LpMlkWE{5I2;E=Y6cZyz23(0P_NoiWX9sRC-jbTe;2u{yV<+V3&XN m;L(Fe4<0>u^x%KdgMR@9&8(n)slIXm0000<MNUMnLSTY=sWD6d literal 0 HcmV?d00001 diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_large_tb.png b/mods/homedecor_tables/textures/homedecor_wood_table_large_tb.png deleted file mode 100644 index 559b895e18f05610a9b687b5d4fd1cf20647e4ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 529 zcmV+s0`C2ZP)<h;3K|Lk000e1NJLTq000mG000mO0ssI2kdbIM0005lNkl<Zc-k$I z#{m>E3`M^r+mpySG{A`?4NwvFP!2av^g#~0Gh-_t!k=J;_fDp_Z(gsr?%ck$y?^(i zG<^L$9zCBQJbF}Wn@aum?c3$&*KeQHJYK$farVK}y0rp}U_z~8K~g4g0Wi(7+}Ly= zEC6ufWO$it5f;i42$vFl9P_rWOCy$uL_v}zl1`L$_`0q)8nPZ9dP2J&m#aGjl;Hxi z$YPo%0G!XT*qs1W5&R7yz%H#4iw_qf^JuMPcxaf8RUnd>laL37S`|`t9o;-F2onXV zITztRv>RZawT%GK`_+v0%kHKklyp!Wy=TG4+0EkA0AoK5z_Q9ZukPL^u2o8f6W}<G z<2;Qs=dgYr=9Ft@<WuL3MA9*fvqwK&9j!GB<7G~YS}kc?#Ind37H&;g4Sl~R>j4B> zauB}my%i)=D+!T>iIDcg5E*HencZM!edy>HrWmzN6y^bo$X#hAcW`7>UCn!UH>i8o zoZNBrQc4o8UYqFXc}HhAiYUzg&4KtECa$N(7%@$h^5}-(a3i8)s3i!r%2bKLtrkXT zuGRWE(uPz4FmxwGWdRic%*dp^A1AAN3YTt^kO$zfh+39z&~SvB2LOqXLNNag+nQhg TCY1&p00000NkvXXu0mjf3ccv9 diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_small_round.png b/mods/homedecor_tables/textures/homedecor_wood_table_small_round.png index 874227c3b615cb462671c382a9b6cb02191feb38..1cfeb9b12a40ab62c7c88f76768a764929b1c373 100644 GIT binary patch literal 2294 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 QJpcdz07*qoM6N<$f_1uMo&W#< delta 561 zcmV-10?z&R5xoSE7k?lK0ssI2{21+{00066Nkl<Zc-mr`UFf{DK6p!STwQ=(Q<z?% zvu1mo;p`Ik`IWxQYJ;ZbI&~))R{Q8yc<C%_2$^5y4`{DG5@1JRAb^%6z@h*Bk2xvX z2!+vv3$X8!BRtl%>)UaEMuTTEp?C2#X$QCgI8M2Ke184u=YRABfgAI}u5Z`bo3Idp zfedM>>pegBpdgma1VBPe$%LZ4(Uxahao_ikf%;yNHenj?pMOO_KoxFq&-yry1Hi85 zn&tTf0q7$5H-rR-j7}`ELWn$aj8@t8ye!?;Ef6UdBov8d-i6G<mU<8igo%>OW7l&N z)@AB|M}7NB0Dr1~xzqFK6K*0@Iw@b(`q=gSPIb>|3C1(M^mWU9-Vrel?p<0(5D<9Z zcTV5+T$#&tz8+ND%&6(-heRU6J*TG5u)r9@)3^O~mZH(yoVA<RC2M(x4`FlY^H<qO zATi28c0K>~=x8X@I|-4ei;(H-$cl{4%;9i%UAFYkU4PG%tB-@yBjK6hXrt900u{3` z57h{VMb!7M=W_3>t+f(i(TCX5<2a@|Wj5yjPcG!Y+4YUMPs?-VanST!>d2nqMD*(N zg23pk2nLV7?HOscZLV`A6QoOtWe*`c3#b8LMrD~l@7(ol78(Ah`XLkv1U$31OC6Sh zG><GTnJUr<9=jgjJ}Cd~gKr;v`{3IL-#+*o88?rL1LY9}00000NkvXXu0mjfDa9Jj diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_small_round_inv.png b/mods/homedecor_tables/textures/homedecor_wood_table_small_round_inv.png index b1d1a909db388127cfcb749d2e2b80f2abf15efe..44ad6593df02a88b933a040f4309f3c8da6bf9b8 100644 GIT binary patch literal 2007 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 literal 5201 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 LNkvXXu0mjfBdh~b diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_small_square.png b/mods/homedecor_tables/textures/homedecor_wood_table_small_square.png index 0a0d0722f04dc5c5f9ab7b897ee456e5f3de8e00..c5af8fc76f739c175932c2fcff2e82382a8e2d87 100644 GIT binary patch literal 1467 zcmV;s1w{IZP)<h;3K|Lk000e1NJLTq001BW002M;0ssI2^z7pK000GoNkl<ZSi|ks zJC9^X8OHJFy;Pmkmz`Og*|oI@<NyZ_ED;irk|BQw0zNX?3S_{nL1sPM)7|G()q5cr zvuRIDBuG=~`2|N6JpZCU{{GiQ5M}@(?2$}l7Lft4+v<@(sz@ILk@I$Ul~+~y`DeF8 zsHK)7l+<kW)=N=kHgn5BCV|aE1nyv=C;ET>_@IA%``z*TfB)ju{!HYN!jzN<SO5uk z4~Gp<Apnv&O#*-g7yY~Y(}&}t%)|gCxup;>L5M>T7LlM3A3;C`GXsDyrRP)pL?q0* zeIeVO?r)V9F~WmHNDEr$uwZ8MK;ZFs<jt+x0Dy~rHZDdwZ+3T|-+lJx6CxrO8$H}g z5%=uNS!yv0Wp*1NMH)yq`(0*U^e5IKtlRBwx2-R4_X2wSyquOgaYWc|mze-4a~)P# zETf7}vk=Qgzdz>v;%aWEb01^00LEH`Sg8*qk*TsH5oq0Ot%QVgv(b)YyQ!DGFi6zh zETSi`=QAOPdGF`#ye;!?iD7;1!=`D<@L@~Q&Exey#XlVHeGGj#9JY#Y-!9ezKqLU1 zw?_t#;Uc6}5BD9(06Y&uBs%qX-(B>_!|B6^ML)dnSWl&=H2@$X9|;U*Y&PQQ;V4x` z?@|N-H}`C!m;HyMoer+Mz21FVUf<ObSwxVb!b|f~#50A8XNE;2Ga(X8T#6v$qCZAE z8*3QG8m*-Yd!z_ki^Ak1Tk}#V5(rEawULw1(ldsGanWa>0Q#%1zWDs^=BqDW?<<y| zt)M%aWp8UOIy@;|RmVv4e(HYr^2RfT=%UY?cYpc*UeD)sv^v_-Wb2;y>*&MWvke!v zswj1OIJIV(;TitnaH<LwzUY_c>7i{ox4t!x_wNs23`-SWTW97{%W3I!K1YJMAk8h# zZSn1HGndOgM!2ceIYGk`L@JsHVN$7{zN~4Zn@48Wf@N*+*uQ+4z*GErZKDrWl{yuz zI!#lpN=a+)No%ch74D;2L}oI0yK_-;OIBvWMSpwS){viiaQ?@?=*k|@a}S<-@Z5vv z9{jI+@Ta$bo9Eda;Wo@7(9MNN1zKwFqkAGE!@sTfMIb^?@{c|E_MO)v?)M<LCo>N- zBC17tH^4JNBtW<aBFZ#9(T9ira(7_DR1^iJlwq#I%VL&B&>n|j9+`73r}F}f+gEp2 zdEHEviwI-0*-TU6q|@4hPPg;Ttg^OgL}Vm`U)-1$wh>o(`sNM*L_iF4s2~Y&i~tg5 zaKq@J3ILkeY_9XFj5H9#8k8Xf5ro1QM1maFLBI@%0KnD$?hQr*04eYebEu+BSXRUU zGlm2Hu?P6%XV-bXdAZr&-u$%hqN6vrF;y|k_4J_gG`bfN8x2&D15~c^`s&rI%~pv; z!8+GI;&eF98*%q>bMtZE&#hO{kuhtz%FA!RoR@W|(AsSs3!#H(3{U1wRVpmZ-BU{u zAxjyfUFCK31}SUG`S?J{K5ShdUTj~~?ae9rSkG%8o6RQO+Bi;S|9JgR_w<Lap#^Kl zSn+Y+cP}77Yfwd*F&dBnU<suw{onr#3uwhy9`_yI@%ZxD?_dcxOf%XFtw6xWbzWb8 zj#`04cT@!uMR8hC>rek{i5T!32*DFVSNgBE@BwouAsozz4q=#KJpl<DNW-S04{QYM zdY#wbee<<tD$(tXqtgq;YFJ0E%XzM)c~V#{rS%-P9-6(m`}8WWKfFK81x01iy<7fp z?rR(7u{2j1b3vUqKOUB4WQL{NwO)Sn#*$Tp4~J!K>+#f(IGq<FY-fEqw&ir_y&-|< zHmskHS9vY_+W`7V5EU&6SK*?wr5(>Xdi(Fb<6{r5^3OeZ?!j{po_p}zga3;j{0F$@ V^9&(V#+3j7002ovPDHLkV1hN>%PIf> literal 982 zcmV;{11bE8P)<h;3K|Lk000e1NJLTq002Y)002Y?0{{R356xqM00054P)t-s0001+ zbVr|fNuPO5o_9!~cu1*&Q=ocIo_I{Ae^R1+P^W-Vr+!hZgHxh=PMdK<pL$QAd{U=? zQ?H0ws)ACaeo~=)QK*4btAtgtiCMIbUb&E8uZC5ne^a1+P_Kqrw2NA>hgPnJR=bg3 z!IWROkzc@*Ua^c_hgL6uQ!a;CFMv@lf>bVjPc4L2Fo#(&eo!ueRW5>7E`(Yzhg&g= zT``ARFM?PubVn?7Ni1<hDRxRMb4Mw5NGxqXDQi6`ZbB+?Mk#SaDTG}xhh8y<UoVSf zHH2F*iC{B_U@?AHE`V1qiefmHa6X)NN|kRzk!(Geaz~qXOQV5RtA<smgH)`AQm2AZ zq<c`Ug;l41Q?Q9#v4>f%hghb4QkHB!mTf|ra6^@DL78$xoOMW=b4H+hP<>G?gjg_( zU@?hbF?L2QbVMv}KPq%ZEO<#QfKM)cO)Yy$EqhEYdPyv9L@IVmEP72WdQU8SPAzy$ zEO<&Rsf1OgfK;o5SE_|pw2WM?iCVCWT)2^9w~}F~gjSPkKa*`imT*LuaYdkdQlfiO zse)CigI1w?PnObvEdT%k<Vi$9RCwCG)-#|bNf?09^RI2&w(W44tu2IWTZ%VYM{C;{ z8|m1>b3b*BjT+Xy-5ph*mcFp$U)xkz{@)<`i;zJy6hgLQE3t}ygPj;x2swaRb`e6O z?QNp6^+KZA_L`Vj2sz4fr?pFMO9`Deu{nbaAtw{kLMSc37A})o&A>v)Sr!AE2q6$^ z<};h{XCdTLg5_>|0+p>*{9XtNF894Fgm3LA%yyN~Z8IVHic|>MnaXY|n>x=xr}|N+ ztA*b*>xS+^$d+8=Gh6G%);e7-guh%OblIGb3L&>xe4{N`={<LtVlVI7T&J7(pb&Bo z|AMWYsjqN`eoiycY5L-H-YJAU03i?tImJIN5|-R<-Y$e(!l~$^%O;X@#lnA5+YDYV zggmw6H89el!f?k6;bYg@LdA=PkXHyJ940*Gb+33*Xt0x~@Uj<}y&;fCG6QA{uVlug zM>7K&Qpo&v)R+mFMrDxwP0Iw#v_i-}Hp>LeW`&TGRGEOO3L&RRnSe=!kV~{?0;aVP za+#C~m{bS}*?=j8Y-)#0!0b>6x!EU~fcc~la;uaHm{bV4Pn`*vx)Ac9DibhOA>>KD zG6B=85c0H?37Av}*(uv6j}$`e)R0MwN1w<eB7-!T0|7RlX3eOAQUCw|07*qoM6N<$ Ef+kU^WB>pF diff --git a/mods/homedecor_tables/textures/homedecor_wood_table_small_square_inv.png b/mods/homedecor_tables/textures/homedecor_wood_table_small_square_inv.png index a36081d32e7789fff90197c6c628ec4907e7d094..9b84a0f0af9b326172d377cd9962af8fb2ea78bd 100644 GIT binary patch literal 901 zcmV;01A6?4P)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{0009_Nkl<ZNXPBf zy>47p6o%n%{p@|lX9n9KlSCk-6f|^P2)Dr{(?vo71qUR;csw)b?7i0yh3UtUD81VC zRA2Mb&p-W01Yrgs!XC*)W)T?xyR9Axq>A)05V@JRpXF6mzI}Z|gj#ATLP^a=Z@m;% zW;3@8WD?jsMBok<dZz#LpGW=e-G}4HzrXu>cP8>kVM<B_EP#Z&hr<S_5CF-XCIP^L zi~fFpdN?l1Obk$xTM7{qgg69Y5eW+M5d>5)GXMxvdOpWbM8d4|7cy^kccZL`5gsH$ zTF^R&1v8rm0#E0W*Eebd051BCaWT@()%Nbq-Rp0@BqCz5(Zj72anHV-r53YLX14)S zq=EEmx6RCp{=_<jb)L7|x!&IF1oZS?PD`CQB5b?OOaPR*4l68{QAMYX5X(isJLZ0I zHMi5bk1<*RV=Y3g)Q6GCRN0XTwC=T5Lc+P(XvZ;M)yrNOB<gM!(UaHnnUKT0_w&4& z%VxX8u)g+T(==uHu%+nL)BMlzkH@`_p^t~dta$%!u^s>-0pL6z89auIkXAkHJCXr- z9)w7A>h~Wm`s3mB@UZB^r;hbhdRhYj67rG2V8+#zczQTWmC?HtLBP#Do9Jc#aJ19G zb-UBMuga^tIwFe*GE{hJUW$08Q1Q&Lh-4;2f{9BJWL)&eXlG*$!&sxWRAG-4VQW#C zd}M203Pl2eX`(iA5?Xr3a4;_V3=}}W|KaVMyXzm`zS>nRL9?Jcnq_ZmEjm0YT~)_O z^M2}ncYE!bLUhsR_5H6O_j*3Bqt(%tCbN6)*U^W$XB#eTRZ;5ncxufu!!!KhaH<Lw zzUY_c>7i{ow?3Q4r%wkkhNTLxtuu3}<+OA<pCdtBkmeTWw)nig+LX&aM!2ceO@f9c zh*UHY!lY6?eOc2+H;>G$1<TstvAexZ;5q)hw$X>GN}Y;Uou;W)rKGj@q_x&f74D;2 zL}oI0-nuBcB`Y)GqQALmYsh~+IREh%eP$2nr3WuPc<I4Q5B~2S{POPi&1Peca2sY3 z=;lJC0xh-o(LE87;qU9d2t?>v{;3D=@4Xgr--F<u%skA9s21tn0M7)G0O1~pDAV*z bA0Gb#QxMV0kgq_!00000NkvXXu0mjfW1G7E literal 4200 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 diff --git a/mods/unifieddyes/airbrush.lua b/mods/unifieddyes/airbrush.lua new file mode 100644 index 00000000..44f155f0 --- /dev/null +++ b/mods/unifieddyes/airbrush.lua @@ -0,0 +1,498 @@ +-- This file supplies all the code related to the airbrush + +local S = minetest.get_translator("unifieddyes") + +function unifieddyes.on_airbrush(itemstack, player, pointed_thing) + local player_name = player:get_player_name() + local painting_with = nil + + if unifieddyes.player_current_dye[player_name] then + painting_with = unifieddyes.player_current_dye[player_name] + end + + if not painting_with then + minetest.chat_send_player(player_name, "*** You need to set a color first.") + minetest.chat_send_player(player_name, "*** Right-click any random node to open the color selector,") + minetest.chat_send_player(player_name, "*** or shift+right-click a colorized node to use its color.") + minetest.chat_send_player(player_name, "*** Be sure to click \"Accept\", or the color you select will be ignored.") + return + end + + local pos = minetest.get_pointed_thing_position(pointed_thing) + if not pos then + local look_angle = player:get_look_vertical() + if look_angle > -1.55 then + minetest.chat_send_player(player_name, "*** No node selected") + else + local hexcolor = unifieddyes.get_color_from_dye_name(painting_with) + if hexcolor then + local r = tonumber(string.sub(hexcolor,1,2),16) + local g = tonumber(string.sub(hexcolor,3,4),16) + local b = tonumber(string.sub(hexcolor,5,6),16) + player:set_sky({r=r,g=g,b=b,a=255},"plain") + end + end + return + end + + local node = minetest.get_node(pos) + local def = minetest.registered_items[node.name] + if not def then return end + + if minetest.is_protected(pos, player_name) then + minetest.chat_send_player(player_name, "*** Sorry, someone else owns that node.") + return + end + + if not (def.groups and def.groups.ud_param2_colorable and def.groups.ud_param2_colorable > 0) then + minetest.chat_send_player(player_name, "*** That node can't be colored.") + return + end + + local palette = nil + local fdir = 0 + if not def or not def.palette then + minetest.chat_send_player(player_name, "*** That node can't be colored -- it's either undefined or has no palette.") + return + elseif def.palette == "unifieddyes_palette_extended.png" then + palette = "extended" + elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then + palette = "wallmounted" + fdir = node.param2 % 8 + elseif def.palette ~= "unifieddyes_palette_extended.png" + and def.palette ~= "unifieddyes_palette_colorwallmounted.png" + and string.find(def.palette, "unifieddyes_palette_") then + palette = "split" + fdir = node.param2 % 32 + else + minetest.chat_send_player(player_name, "*** That node can't be colored -- it has an invalid color mode.") + return + end + + local idx, hue = unifieddyes.getpaletteidx(painting_with, palette) + local inv = player:get_inventory() + if (not creative or not creative.is_enabled_for(player_name)) and not inv:contains_item("main", painting_with) then + local suff = "" + if not idx then + suff = " Besides, "..string.sub(painting_with, 5).." can't be applied to that node." + end + minetest.chat_send_player(player_name, "*** You're in survival mode, and you're out of "..string.sub(painting_with, 5).."."..suff) + return + end + + if not idx then + minetest.chat_send_player(player_name, "*** "..string.sub(painting_with, 5).." can't be applied to that node.") + return + end + + local oldidx = node.param2 - fdir + local name = def.airbrush_replacement_node or node.name + + if palette == "split" then + + local modname = string.sub(name, 1, string.find(name, ":")-1) + local nodename2 = string.sub(name, string.find(name, ":")+1) + local oldcolor = "snozzberry" + local newcolor = "razzberry" -- intentionally misspelled ;-) + + if def.ud_color_start and def.ud_color_end then + oldcolor = string.sub(node.name, def.ud_color_start, def.ud_color_end) + newcolor = string.sub(painting_with, 5) + else + if hue ~= 0 then + newcolor = unifieddyes.HUES_EXTENDED[hue][1] + else + newcolor = "grey" + end + + if def.airbrush_replacement_node then + oldcolor = "grey" + else + local s = string.sub(def.palette, 21) + oldcolor = string.sub(s, 1, string.find(s, "s.png")-1) + end + end + + name = modname..":"..string.gsub(nodename2, oldcolor, newcolor) + + if not minetest.registered_items[name] then + minetest.chat_send_player(player_name, "*** "..string.sub(painting_with, 5).." can't be applied to that node.") + return + end + elseif idx == oldidx then + return + end + minetest.swap_node(pos, {name = name, param2 = fdir + idx}) + if not creative or not creative.is_enabled_for(player_name) then + inv:remove_item("main", painting_with) + return + end +end + +local hps = 0.6 -- horizontal position scale +local vps = 1.3 -- vertical position scale +local vs = 0.1 -- vertical shift/offset + +local color_button_size = ";0.75,0.75;" +local color_square_size = ";0.69,0.69;" + +function unifieddyes.make_readable_color(color) + -- is this a low saturation color? + local has_low_saturtation = string.find(color, "s50"); + + -- remove _s50 tag, we care about that later again + local s = string.gsub(color, "_s50", "") + + -- replace underscores with spaces to make it look nicer + local s = string.gsub(s, "_", " ") + + -- capitalize words, you know, looks nicer ;) + s = string.gsub(s, "(%l)(%w*)", function(a,b) return string.upper(a)..b end) + + -- add the word dye, this is what the translations expect + s = s.." Dye" + + -- if it is a low sat color, append an appropriate string + if has_low_saturtation then + s = s.." (low saturation)" + end + + return s +end + +function unifieddyes.make_colored_square(hexcolor, colorname, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist) + + local dye = "dye:"..colorname + + local overlay = "" + local colorize = minetest.formspec_escape("^[colorize:#"..hexcolor..":255") + + if not creative and inv:contains_item("main", dye) then + overlay = "^unifieddyes_onhand_overlay.png" + end + + local unavail_overlay = "" + if not showall and not unifieddyes.palette_has_color[nodepalette.."_"..colorname] + or (explist and not explist[colorname]) then + if overlay == "" then + unavail_overlay = "^unifieddyes_unavailable_overlay.png" + else + unavail_overlay = "^unifieddyes_onhand_unavailable_overlay.png" + end + end + + local tooltip = "tooltip["..colorname..";".. + S(unifieddyes.make_readable_color(colorname)).. + "\n(dye:"..colorname..")]" + + if dye == painting_with then + overlay = "^unifieddyes_select_overlay.png" + selindic = "unifieddyes_white_square.png"..colorize..overlay..unavail_overlay.."]"..tooltip + end + + local form + if unavail_overlay == "" then + form = "image_button[".. + (hp*hps)..","..(v2*vps+vs).. + color_button_size.. + "unifieddyes_white_square.png"..colorize..overlay..unavail_overlay..";".. + colorname..";]".. + tooltip + else + form = "image[".. + (hp*hps)..","..(v2*vps+vs).. + color_square_size.. + "unifieddyes_white_square.png"..colorize..overlay..unavail_overlay.."]".. + tooltip + end + + return form, selindic +end + +function unifieddyes.show_airbrush_form(player) + if not player then return end + + local t = {} + + local player_name = player:get_player_name() + local painting_with = unifieddyes.player_selected_dye[player_name] or unifieddyes.player_current_dye[player_name] + local creative = creative and creative.is_enabled_for(player_name) + local inv = player:get_inventory() + local nodepalette = "extended" + local showall = unifieddyes.player_showall[player_name] + + t[1] = "size[14.5,8.5]label[7,-0.3;"..S("Select a color:").."]" + local selindic = "unifieddyes_select_overlay.png^unifieddyes_question.png]" + + local last_right_click = unifieddyes.player_last_right_clicked[player_name] + if last_right_click then + if last_right_click.def and last_right_click.def.palette then + if last_right_click.def.palette == "unifieddyes_palette_colorwallmounted.png" then + nodepalette = "wallmounted" + elseif last_right_click.def.palette == "unifieddyes_palette_extended.png" then + t[#t+1] = "label[0.5,8.25;"..S("(Right-clicked a node that supports all 256 colors, showing them all)").."]" + showall = true + elseif last_right_click.def.palette ~= "unifieddyes_palette_extended.png" + and last_right_click.def.palette ~= "unifieddyes_palette_colorwallmounted.png" + and string.find(last_right_click.def.palette, "unifieddyes_palette_") then + nodepalette = "split" + end + end + end + + if not last_right_click.def.groups + or not last_right_click.def.groups.ud_param2_colorable + or not last_right_click.def.palette + or not string.find(last_right_click.def.palette, "unifieddyes_palette_") then + t[#t+1] = "label[0.5,8.25;"..S("(Right-clicked a node not supported by the Airbrush, showing all colors)").."]" + end + + local explist = last_right_click.def.explist + + for v = 0, 6 do + local val = unifieddyes.VALS_EXTENDED[v+1] + + local sat = "" + local v2=(v/2) + + for hi, h in ipairs(unifieddyes.HUES_EXTENDED) do + local hue = h[1] + local hp=hi-1 + + local r = h[2] + local g = h[3] + local b = h[4] + + local factor = 40 + if v > 3 then + factor = 75 + v2 = (v-2) + end + + local r2 = math.max(math.min(r + (4-v)*factor, 255), 0) + local g2 = math.max(math.min(g + (4-v)*factor, 255), 0) + local b2 = math.max(math.min(b + (4-v)*factor, 255), 0) + + local hexcolor = string.format("%02x", r2)..string.format("%02x", g2)..string.format("%02x", b2) + local f + f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist) + t[#t+1] = f + end + + if v > 3 then + sat = "_s50" + v2 = (v-1.5) + + for hi, h in ipairs(unifieddyes.HUES_EXTENDED) do + local hue = h[1] + local hp=hi-1 + + local r = h[2] + local g = h[3] + local b = h[4] + + local factor = 75 + + local pr = 0.299 + local pg = 0.587 + local pb = 0.114 + + local r2 = math.max(math.min(r + (4-v)*factor, 255), 0) + local g2 = math.max(math.min(g + (4-v)*factor, 255), 0) + local b2 = math.max(math.min(b + (4-v)*factor, 255), 0) + + local p = math.sqrt(r2*r2*pr + g2*g2*pg + b2*b2*pb) + local r3 = math.floor(p+(r2-p)*0.5) + local g3 = math.floor(p+(g2-p)*0.5) + local b3 = math.floor(p+(b2-p)*0.5) + + local hexcolor = string.format("%02x", r3)..string.format("%02x", g3)..string.format("%02x", b3) + local f + f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist) + t[#t+1] = f + end + end + end + + local v2=5 + for y = 0, 15 do + + local hp=15-y + + local hexgrey = string.format("%02x", y*17)..string.format("%02x", y*17)..string.format("%02x", y*17) + local grey = "grey_"..y + + if y == 0 then grey = "black" + elseif y == 4 then grey = "dark_grey" + elseif y == 8 then grey = "grey" + elseif y == 11 then grey = "light_grey" + elseif y == 15 then grey = "white" + end + + local f + f, selindic = unifieddyes.make_colored_square(hexgrey, grey, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist) + t[#t+1] = f + + end + + if not creative then + t[#t+1] = "image[10," + t[#t+1] = (vps*5.55+vs) + t[#t+1] = color_button_size + t[#t+1] = "unifieddyes_onhand_overlay.png]label[10.7," + t[#t+1] = (vps*5.51+vs) + t[#t+1] = ";"..S("Dyes").."]" + t[#t+1] = "label[10.7," + t[#t+1] = (vps*5.67+vs) + t[#t+1] = ";on hand]" + + end + + t[#t+1] = "image[10," + t[#t+1] = (vps*5+vs) + t[#t+1] = color_button_size + t[#t+1] = selindic + + if painting_with then + t[#t+1] = "label[10.7," + t[#t+1] = (vps*4.90+vs) + t[#t+1] = ";"..S("Your selection:").."]" + t[#t+1] = "label[10.7," + t[#t+1] = (vps*5.07+vs) + t[#t+1] = ";" + t[#t+1] = S(unifieddyes.make_readable_color(string.sub(painting_with, 5))) + t[#t+1] = "]label[10.7," + t[#t+1] = (vps*5.24+vs) + t[#t+1] = ";(" + t[#t+1] = painting_with + t[#t+1] = ")]" + else + t[#t+1] = "label[10.7," + t[#t+1] = (vps*5.07+vs) + t[#t+1] = ";"..S("Your selection").."]" + end + + t[#t+1] = "button_exit[10.5,8;2,1;cancel;"..S("Cancel").."]button_exit[12.5,8;2,1;accept;"..S("Accept").."]" + + + if last_right_click and last_right_click.def and nodepalette ~= "extended" then + if showall then + t[#t+1] = "button[0,8;2,1;show_avail;"..S("Show Available").."]" + t[#t+1] = "label[2,8.25;"..S("(Currently showing all 256 colors)").."]" + else + t[#t+1] = "button[0,8;2,1;show_all;"..S("Show All Colors").."]" + t[#t+1] = "label[2,8.25;"..S("(Currently only showing what the right-clicked node can use)").."]" + end + end + + minetest.show_formspec(player_name, "unifieddyes:dye_select_form", table.concat(t)) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + + if formname == "unifieddyes:dye_select_form" then + + local player_name = player:get_player_name() + local nodepalette = "extended" + local showall = unifieddyes.player_showall[player_name] + + local last_right_click = unifieddyes.player_last_right_clicked[player_name] + if last_right_click and last_right_click.def then + if last_right_click.def.palette then + if last_right_click.def.palette == "unifieddyes_palette_colorwallmounted.png" then + nodepalette = "wallmounted" + elseif last_right_click.def.palette ~= "unifieddyes_palette_extended.png" then + nodepalette = "split" + end + end + end + + if fields.show_all then + unifieddyes.player_showall[player_name] = true + unifieddyes.show_airbrush_form(player) + return + elseif fields.show_avail then + unifieddyes.player_showall[player_name] = false + unifieddyes.show_airbrush_form(player) + return + elseif fields.quit then + if fields.accept then + local dye = unifieddyes.player_selected_dye[player_name] + if not dye then + minetest.chat_send_player(player_name, "*** Clicked \"Accept\", but no color was selected!") + return + elseif not showall + and not unifieddyes.palette_has_color[nodepalette.."_"..string.sub(dye, 5)] then + minetest.chat_send_player(player_name, "*** Clicked \"Accept\", but the selected color can't be used on the") + minetest.chat_send_player(player_name, "*** node that was right-clicked (and \"Show All\" wasn't in effect).") + if unifieddyes.player_current_dye[player_name] then + minetest.chat_send_player(player_name, "*** Ignoring it and sticking with "..string.sub(unifieddyes.player_current_dye[player_name], 5)..".") + else + minetest.chat_send_player(player_name, "*** Ignoring it.") + end + return + else + unifieddyes.player_current_dye[player_name] = dye + unifieddyes.player_selected_dye[player_name] = nil + minetest.chat_send_player(player_name, "*** Selected "..string.sub(dye, 5).." for the airbrush.") + return + end + else -- assume "Cancel" or Esc. + unifieddyes.player_selected_dye[player_name] = nil + return + end + else + local s1 = string.sub(minetest.serialize(fields), 11) + local s3 = string.sub(s1,1, string.find(s1, '"')-1) + + local inv = player:get_inventory() + local creative = creative and creative.is_enabled_for(player_name) + local dye = "dye:"..s3 + + if (showall or unifieddyes.palette_has_color[nodepalette.."_"..s3]) and + (minetest.registered_items[dye] and (creative or inv:contains_item("main", dye))) then + unifieddyes.player_selected_dye[player_name] = dye + unifieddyes.show_airbrush_form(player) + end + end + end +end) + +minetest.register_tool("unifieddyes:airbrush", { + description = S("Dye Airbrush"), + inventory_image = "unifieddyes_airbrush.png", + use_texture_alpha = true, + tool_capabilities = { + full_punch_interval=0.1, + }, + range = 12, + on_use = unifieddyes.on_airbrush, + on_place = function(itemstack, placer, pointed_thing) + local keys = placer:get_player_control() + local player_name = placer:get_player_name() + local pos = minetest.get_pointed_thing_position(pointed_thing) + local node + local def + + if pos then node = minetest.get_node(pos) end + if node then def = minetest.registered_items[node.name] end + + unifieddyes.player_last_right_clicked[player_name] = {pos = pos, node = node, def = def} + + if not keys.aux1 then + unifieddyes.show_airbrush_form(placer) + elseif keys.aux1 then + if not pos or not def then return end + local newcolor = unifieddyes.color_to_name(node.param2, def) + + if newcolor and string.find(def.paramtype2, "color") then + minetest.chat_send_player(player_name, "*** Switching to "..newcolor.." for the airbrush, to match that node.") + unifieddyes.player_current_dye[player_name] = "dye:"..newcolor + else + minetest.chat_send_player(player_name, "*** That node is uncolored.") + end + elseif def.on_rightclick then + return def.on_rightclick(pos, node, placer, itemstack, pointed_thing) + end + end +}) diff --git a/mods/unifieddyes/aliases.lua b/mods/unifieddyes/aliases.lua new file mode 100644 index 00000000..785eb588 --- /dev/null +++ b/mods/unifieddyes/aliases.lua @@ -0,0 +1,23 @@ +minetest.register_alias("dye:light_red", "dye:pink") +minetest.register_alias("dye:medium_orange", "dye:brown") + +minetest.register_alias("unifieddyes:black", "dye:black") +minetest.register_alias("unifieddyes:dark_grey", "dye:dark_grey") +minetest.register_alias("unifieddyes:grey", "dye:grey") +minetest.register_alias("unifieddyes:light_grey", "dye:light_grey") +minetest.register_alias("unifieddyes:white", "dye:white") + +minetest.register_alias("unifieddyes:grey_0", "dye:black") +minetest.register_alias("unifieddyes:grey_4", "dye:dark_grey") +minetest.register_alias("unifieddyes:grey_8", "dye:grey") +minetest.register_alias("unifieddyes:grey_11", "dye:light_grey") +minetest.register_alias("unifieddyes:grey_15", "dye:white") + +minetest.register_alias("unifieddyes:white_paint", "dye:white") +minetest.register_alias("unifieddyes:titanium_dioxide", "dye:white") +minetest.register_alias("unifieddyes:lightgrey_paint", "dye:light_grey") +minetest.register_alias("unifieddyes:grey_paint", "dye:grey") +minetest.register_alias("unifieddyes:darkgrey_paint", "dye:dark_grey") +minetest.register_alias("unifieddyes:carbon_black", "dye:black") + +minetest.register_alias("unifieddyes:brown", "dye:brown") diff --git a/mods/unifieddyes/api.lua b/mods/unifieddyes/api.lua new file mode 100644 index 00000000..8b4eb14f --- /dev/null +++ b/mods/unifieddyes/api.lua @@ -0,0 +1,494 @@ +-- This file supplies the majority of Unified Dyes' API + +local S = minetest.get_translator("unifieddyes") + +unifieddyes.player_current_dye = {} +unifieddyes.player_selected_dye = {} +unifieddyes.player_last_right_clicked = {} +unifieddyes.palette_has_color = {} +unifieddyes.player_showall = {} + +-- if a node with a palette is placed in the world, +-- but the itemstack used to place it has no palette_index (color byte), +-- create something appropriate to make it officially white. + +minetest.register_on_placenode( + function(pos, newnode, placer, oldnode, itemstack, pointed_thing) + local def = minetest.registered_items[newnode.name] + + if not def + or not def.palette + or def.after_place_node + or not placer then + return false + end + + local param2 + if not string.find(itemstack:to_string(), "palette_index") then + if def.palette == "unifieddyes_palette_extended.png" + and def.paramtype2 == "color" then + param2 = 240 + elseif def.palette == "unifieddyes_palette_colorwallmounted.png" + and def.paramtype2 == "colorwallmounted" then + param2 = newnode.param2 % 8 + elseif string.find(def.palette, "unifieddyes_palette_") + and def.paramtype2 == "colorfacedir" then -- it's a split palette + param2 = newnode.param2 % 32 + end + + if param2 then + minetest.swap_node(pos, {name = newnode.name, param2 = param2}) + end + end + + if def.palette ~= "" then + minetest.get_meta(pos):set_int("palette_index", param2 or 240) + end + end +) + +-- The complementary function: strip-off the color if the node being dug is still white/neutral + +local function move_item(item, pos, inv, digger, fix_color) + if not (digger and digger:is_player()) then return end + local creative = creative_mode or minetest.check_player_privs(digger, "creative") + item = unifieddyes.fix_bad_color_info(item, fix_color) + if inv:room_for_item("main", item) + and (not creative or not inv:contains_item("main", item, true)) then + inv:add_item("main", item) + elseif not creative then + minetest.item_drop(ItemStack(item), digger, pos) + end + minetest.remove_node(pos) +end + +function unifieddyes.on_dig(pos, node, digger) + if not digger then return end + local playername = digger:get_player_name() + if minetest.is_protected(pos, playername) then + minetest.record_protection_violation(pos, playername) + return + end + + local oldparam2 = minetest.get_node(pos).param2 + local def = minetest.registered_items[node.name] + local fix_color + + if def.paramtype2 == "color" and oldparam2 == 240 and def.palette == "unifieddyes_palette_extended.png" then + fix_color = 240 + elseif def.paramtype2 == "color" and oldparam2 == 0 and def.palette == "unifieddyes_palette_extended.png" then + fix_color = 0 + elseif def.paramtype2 == "colorwallmounted" and math.floor(oldparam2 / 8) == 0 and def.palette == "unifieddyes_palette_colorwallmounted.png" then + fix_color = 0 + elseif def.paramtype2 == "colorfacedir" and math.floor(oldparam2 / 32) == 0 and string.find(def.palette, "unifieddyes_palette_") then + fix_color = 0 + end + + local inv = digger:get_inventory() + if fix_color then + move_item(node.name, pos, inv, digger, fix_color) + else + return minetest.node_dig(pos, node, digger) + end +end + +-- just stubs to keep old mods from crashing when expecting auto-coloring +-- or getting back the dye on dig. + +function unifieddyes.recolor_on_place(foo) +end + +function unifieddyes.after_dig_node(foo) +end + +-- This helper function creates multiple copies of the passed node, +-- for the split palette - one per hue, plus grey - and assigns +-- proper palettes and other attributes + +function unifieddyes.generate_split_palette_nodes(name, def, drop) + for _, color in ipairs(unifieddyes.HUES_WITH_GREY) do + local def2 = table.copy(def) + local desc_color = string.gsub(string.upper(string.sub(color, 1, 1))..string.sub(color, 2), "_", " ") + if string.sub(def2.description, -1) == ")" then + def2.description = string.sub(def2.description, 1, -2)..", "..desc_color.." shades)" + else + def2.description = def2.description.."("..desc_color.." shades)" + end + def2.palette = "unifieddyes_palette_"..color.."s.png" + def2.paramtype2 = "colorfacedir" + def2.groups.ud_param2_colorable = 1 + + if drop then + def2.drop = { + items = { + {items = {drop.."_"..color}, inherit_color = true }, + } + } + end + + minetest.register_node(":"..name.."_"..color, def2) + end +end + +-- This helper function creates a colored itemstack + +function unifieddyes.fix_bad_color_info(item, paletteidx) + local stack=minetest.itemstring_with_color(item, paletteidx) + return string.gsub(stack, "u0001color", "u0001palette_index") +end + +function unifieddyes.make_colored_itemstack(item, palette, color) + local paletteidx = unifieddyes.getpaletteidx(color, palette) + return unifieddyes.fix_bad_color_info(item, paletteidx), paletteidx +end + +-- these helper functions register all of the recipes needed to create colored +-- nodes with any of the dyes supported by that node's palette. + +local function register_c(craft, h, sat, val) + local hue = (type(h) == "table") and h[1] or h + local color = "" + if val then + if craft.palette == "wallmounted" then + color = val..hue..sat + else + color = val..hue..sat + end + else + color = hue -- if val is nil, then it's grey. + end + + local dye = "dye:"..color + local recipe = minetest.serialize(craft.recipe) + recipe = string.gsub(recipe, "MAIN_DYE", dye) + recipe = string.gsub(recipe, "NEUTRAL_NODE", craft.neutral_node) + local newrecipe = minetest.deserialize(recipe) + + local coutput = craft.output or "" + local output = coutput + if craft.output_prefix then + if craft.palette ~= "split" then + output = craft.output_prefix..color..craft.output_suffix..coutput + else + if hue == "white" or hue == "black" or string.find(hue, "grey") then + output = craft.output_prefix.."grey"..craft.output_suffix..coutput + elseif hue == "pink" then + dye = "dye:light_red" + output = craft.output_prefix.."red"..craft.output_suffix..coutput + else + output = craft.output_prefix..hue..craft.output_suffix..coutput + end + end + end + + local colored_itemstack = + unifieddyes.make_colored_itemstack(output, craft.palette, dye) + + minetest.register_craft({ + output = colored_itemstack, + type = craft.type, + recipe = newrecipe + }) + +end + +function unifieddyes.register_color_craft(craft) + local hues_table = unifieddyes.HUES_EXTENDED + local sats_table = unifieddyes.SATS + local vals_table = unifieddyes.VALS_SPLIT + local greys_table = unifieddyes.GREYS + + if craft.palette == "wallmounted" then + register_c(craft, "green", "", "light_") + register_c(craft, "blue", "", "light_") + hues_table = unifieddyes.HUES_WALLMOUNTED + sats_table = {""} + vals_table = unifieddyes.VALS + elseif craft.palette == "extended" then + vals_table = unifieddyes.VALS_EXTENDED + greys_table = unifieddyes.GREYS_EXTENDED + end + + for _, hue in ipairs(hues_table) do + for _, val in ipairs(vals_table) do + for _, sat in ipairs(sats_table) do + + if sat == "_s50" and val ~= "" and val ~= "medium_" and val ~= "dark_" then break end + register_c(craft, hue, sat, val) + + end + end + end + + for _, grey in ipairs(greys_table) do + register_c(craft, grey) + end + + register_c(craft, "pink") + +end + +-- code borrowed from homedecor +-- call this function to reset the rotation of a "wallmounted" object on place + +function unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing) + local node = minetest.get_node(pos) + local colorbits = node.param2 - (node.param2 % 8) + + local yaw = placer:get_look_horizontal() + local dir = minetest.yaw_to_dir(yaw) -- -1.5) + local pitch = placer:get_look_vertical() + + local fdir = minetest.dir_to_wallmounted(dir) + + if pitch < -(math.pi/8) then + fdir = 0 + elseif pitch > math.pi/8 then + fdir = 1 + end + minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits }) +end + +-- use this when you have a "wallmounted" node that should never be oriented +-- to floor or ceiling... + +function unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) + local node = minetest.get_node(pos) + local colorbits = node.param2 - (node.param2 % 8) + local yaw = placer:get_look_horizontal() + local dir = minetest.yaw_to_dir(yaw+1.5) + local fdir = minetest.dir_to_wallmounted(dir) + + minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits }) +end + +-- ... and use this one to force that kind of node off of floor/ceiling +-- orientation after the screwdriver rotates it. + +function unifieddyes.fix_after_screwdriver_nsew(pos, node, user, mode, new_param2) + local new_fdir = new_param2 % 8 + local color = new_param2 - new_fdir + if new_fdir < 2 then + new_fdir = 2 + minetest.swap_node(pos, { name = node.name, param2 = new_fdir + color }) + return true + end +end + +function unifieddyes.is_buildable_to(placer_name, ...) + for _, pos in ipairs({...}) do + local node = minetest.get_node_or_nil(pos) + local def = node and minetest.registered_nodes[node.name] + if not (def and def.buildable_to) or minetest.is_protected(pos, placer_name) then + return false + end + end + return true +end + +function unifieddyes.get_hsv(name) -- expects a node/item name + local hue = "" + local a,b + for _, i in ipairs(unifieddyes.HUES_EXTENDED) do + a,b = string.find(name, "_"..i[1]) + if a then + hue = i[1] + break + end + end + + if string.find(name, "_light_grey") then hue = "light_grey" + elseif string.find(name, "_lightgrey") then hue = "light_grey" + elseif string.find(name, "_dark_grey") then hue = "dark_grey" + elseif string.find(name, "_darkgrey") then hue = "dark_grey" + elseif string.find(name, "_grey") then hue = "grey" + elseif string.find(name, "_white") then hue = "white" + elseif string.find(name, "_black") then hue = "black" + end + + local sat = "" + if string.find(name, "_s50") then sat = "_s50" end + + local val = "" + if string.find(name, "dark_") then val = "dark_" end + if string.find(name, "medium_") then val = "medium_" end + if string.find(name, "light_") then val = "light_" end + + return hue, sat, val +end + +-- code partially borrowed from cheapie's plasticbox mod + +-- in the function below, color is just a color string, while +-- palette_type can be: +-- +-- "extended" = 256 color palette +-- "split" = 200 color palette split into pieces for colorfacedir +-- "wallmounted" = 32-color abridged palette + +function unifieddyes.getpaletteidx(color, palette_type) + + local origcolor = color + + if string.sub(color,1,4) == "dye:" then + color = string.sub(color,5,-1) + elseif string.sub(color,1,12) == "unifieddyes:" then + color = string.sub(color,13,-1) + else + return + end + + if palette_type == "wallmounted" then + if unifieddyes.gpidx_grayscale_wallmounted[color] then + return (unifieddyes.gpidx_grayscale_wallmounted[color] * 8), 0 + end + elseif palette_type == "split" then + if unifieddyes.gpidx_grayscale[color] then + return (unifieddyes.gpidx_grayscale[color] * 32), 0 + end + elseif palette_type == "extended" then + if unifieddyes.gpidx_grayscale_extended[color] then + return unifieddyes.gpidx_grayscale_extended[color]+240, 0 + end + end + + local shade = "" -- assume full + if string.sub(color,1,6) == "faint_" then + shade = "faint" + color = string.sub(color,7,-1) + elseif string.sub(color,1,7) == "pastel_" then + shade = "pastel" + color = string.sub(color,8,-1) + elseif string.sub(color,1,6) == "light_" then + shade = "light" + color = string.sub(color,7,-1) + elseif string.sub(color,1,7) == "bright_" then + shade = "bright" + color = string.sub(color,8,-1) + elseif string.sub(color,1,7) == "medium_" then + shade = "medium" + color = string.sub(color,8,-1) + elseif string.sub(color,1,5) == "dark_" then + shade = "dark" + color = string.sub(color,6,-1) + end + if string.sub(color,-4,-1) == "_s50" then + shade = shade.."s50" + color = string.sub(color,1,-5) + end + + if palette_type == "wallmounted" then + if color == "green" and shade == "light" then return 48,3 + elseif color == "brown" then return 17,1 + elseif color == "pink" then return 56,7 + elseif color == "blue" and shade == "light" then return 40,5 + elseif unifieddyes.gpidx_hues_wallmounted[color] and unifieddyes.gpidx_shades_wallmounted[shade] then + return (unifieddyes.gpidx_shades_wallmounted[shade] * 64 + unifieddyes.gpidx_hues_wallmounted[color] * 8), unifieddyes.gpidx_hues_wallmounted[color] + end + else + if color == "brown" then + color = "orange" + shade = "medium" + elseif color == "pink" then + color = "red" + shade = "light" + end + if palette_type == "split" then -- it's colorfacedir + if unifieddyes.gpidx_hues_extended[color] and unifieddyes.gpidx_shades_split[shade] then + return (unifieddyes.gpidx_shades_split[shade] * 32), unifieddyes.gpidx_hues_extended[color]+1 + end + elseif palette_type == "extended" then + if unifieddyes.gpidx_hues_extended[color] and unifieddyes.gpidx_shades_extended[shade] then + return (unifieddyes.gpidx_hues_extended[color] + unifieddyes.gpidx_shades_extended[shade]*24), unifieddyes.gpidx_hues_extended[color] + end + end + end +end + +function unifieddyes.get_color_from_dye_name(name) + if name == "dye:black" then + return "000000" + elseif name == "dye:white" then + return "ffffff" + end + local item = minetest.registered_items[name] + if not item then return end + local inv_image = item.inventory_image + if not inv_image then return end + return string.match(inv_image,"colorize:#(......):200") +end + +-- get a node's dye color based on its palette and param2 + +function unifieddyes.color_to_name(param2, def) + if not param2 or not def or not def.palette then return end + + if def.palette == "unifieddyes_palette_extended.png" then + local color = param2 + + local v = 0 + local s = 1 + if color < 24 then v = 1 + elseif color > 23 and color < 48 then v = 2 + elseif color > 47 and color < 72 then v = 3 + elseif color > 71 and color < 96 then v = 4 + elseif color > 95 and color < 120 then v = 5 + elseif color > 119 and color < 144 then v = 5 s = 2 + elseif color > 143 and color < 168 then v = 6 + elseif color > 167 and color < 192 then v = 6 s = 2 + elseif color > 191 and color < 216 then v = 7 + elseif color > 215 and color < 240 then v = 7 s = 2 + end + + if color > 239 then + if color == 240 then return "white" + elseif color == 244 then return "light_grey" + elseif color == 247 then return "grey" + elseif color == 251 then return "dark_grey" + elseif color == 255 then return "black" + else return "grey_"..15-(color-240) + end + else + local h = color - math.floor(color/24)*24 + return unifieddyes.VALS_EXTENDED[v]..unifieddyes.HUES_EXTENDED[h+1][1]..unifieddyes.SATS[s] + end + + elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then + local color = math.floor(param2 / 8) + if color == 0 then return "white" + elseif color == 1 then return "light_grey" + elseif color == 2 then return "grey" + elseif color == 3 then return "dark_grey" + elseif color == 4 then return "black" + elseif color == 5 then return "light_blue" + elseif color == 6 then return "light_green" + elseif color == 7 then return "pink" + end + local v = math.floor(color/8) + local h = color - v * 8 + return unifieddyes.VALS[v]..unifieddyes.HUES_WALLMOUNTED[h+1] + + elseif string.find(def.palette, "unifieddyes_palette") then -- it's the split palette + -- palette names in this mode are always "unifieddyes_palette_COLORs.png" + + local s = string.sub(def.palette, 21) + local color = string.sub(s, 1, string.find(s, "s.png")-1) + + local v = math.floor(param2/32) + if color ~= "grey" then + if v == 0 then return "faint_"..color + elseif v == 1 then return color + elseif v == 2 then return color.."_s50" + elseif v == 3 then return "light_"..color + elseif v == 4 then return "medium_"..color + elseif v == 5 then return "medium_"..color.."_s50" + elseif v == 6 then return "dark_"..color + elseif v == 7 then return "dark_"..color.."_s50" + end + else + if v > 0 and v < 6 then return unifieddyes.GREYS[v] + else return "white" + end + end + end +end diff --git a/mods/unifieddyes/color-tables.lua b/mods/unifieddyes/color-tables.lua new file mode 100644 index 00000000..12eaa325 --- /dev/null +++ b/mods/unifieddyes/color-tables.lua @@ -0,0 +1,237 @@ + +-- the names of the various colors here came from http://www.procato.com/rgb+index/ + +unifieddyes.HUES_EXTENDED = { + { "red", 0xff, 0x00, 0x00 }, + { "vermilion", 0xff, 0x40, 0x00 }, + { "orange", 0xff, 0x80, 0x00 }, + { "amber", 0xff, 0xbf, 0x00 }, + { "yellow", 0xff, 0xff, 0x00 }, + { "lime", 0xbf, 0xff, 0x00 }, + { "chartreuse", 0x80, 0xff, 0x00 }, + { "harlequin", 0x40, 0xff, 0x00 }, + { "green", 0x00, 0xff, 0x00 }, + { "malachite", 0x00, 0xff, 0x40 }, + { "spring", 0x00, 0xff, 0x80 }, + { "turquoise", 0x00, 0xff, 0xbf }, + { "cyan", 0x00, 0xff, 0xff }, + { "cerulean", 0x00, 0xbf, 0xff }, + { "azure", 0x00, 0x80, 0xff }, + { "sapphire", 0x00, 0x40, 0xff }, + { "blue", 0x00, 0x00, 0xff }, + { "indigo", 0x40, 0x00, 0xff }, + { "violet", 0x80, 0x00, 0xff }, + { "mulberry", 0xbf, 0x00, 0xff }, + { "magenta", 0xff, 0x00, 0xff }, + { "fuchsia", 0xff, 0x00, 0xbf }, + { "rose", 0xff, 0x00, 0x80 }, + { "crimson", 0xff, 0x00, 0x40 } +} + +unifieddyes.HUES_WITH_GREY = {} + +for _,i in ipairs(unifieddyes.HUES_EXTENDED) do + table.insert(unifieddyes.HUES_WITH_GREY, i[1]) +end +table.insert(unifieddyes.HUES_WITH_GREY, "grey") + +unifieddyes.HUES_WALLMOUNTED = { + "red", + "orange", + "yellow", + "green", + "cyan", + "blue", + "violet", + "magenta" +} + +unifieddyes.SATS = { + "", + "_s50" +} + +unifieddyes.VALS = { + "", + "medium_", + "dark_" +} + +unifieddyes.VALS_SPLIT = { + "faint_", + "light_", + "", + "medium_", + "dark_" +} + +unifieddyes.VALS_EXTENDED = { + "faint_", + "pastel_", + "light_", + "bright_", + "", + "medium_", + "dark_" +} + +unifieddyes.GREYS = { + "white", + "light_grey", + "grey", + "dark_grey", + "black" +} + +unifieddyes.GREYS_EXTENDED = table.copy(unifieddyes.GREYS) + +for i = 1, 14 do + if i ~= 0 and i ~= 4 and i ~= 8 and i ~= 11 and i ~= 15 then + table.insert(unifieddyes.GREYS_EXTENDED, "grey_"..i) + end +end + +local default_dyes = { + "black", + "blue", + "brown", + "cyan", + "dark_green", + "dark_grey", + "green", + "grey", + "magenta", + "orange", + "pink", + "red", + "violet", + "white", + "yellow" +} + +-- reverse lookups for getpaletteidx() + +unifieddyes.gpidx_aliases = { + ["pink"] = "light_red", + ["brown"] = "medium_orange", + ["azure"] = "light_blue" +} + +unifieddyes.gpidx_grayscale = { + ["white"] = 1, + ["light_grey"] = 2, + ["grey"] = 3, + ["dark_grey"] = 4, + ["black"] = 5, +} + +unifieddyes.gpidx_grayscale_extended = { + ["white"] = 0, + ["grey_14"] = 1, + ["grey_13"] = 2, + ["grey_12"] = 3, + ["light_grey"] = 4, + ["grey_11"] = 4, + ["grey_10"] = 5, + ["grey_9"] = 6, + ["grey_8"] = 7, + ["grey"] = 7, + ["grey_7"] = 8, + ["grey_6"] = 9, + ["grey_5"] = 10, + ["grey_4"] = 11, + ["dark_grey"] = 11, + ["grey_3"] = 12, + ["grey_2"] = 13, + ["grey_1"] = 14, + ["black"] = 15, +} + +unifieddyes.gpidx_grayscale_wallmounted = { + ["white"] = 0, + ["light_grey"] = 1, + ["grey"] = 2, + ["dark_grey"] = 3, + ["black"] = 4, +} + +unifieddyes.gpidx_hues_extended = { + ["red"] = 0, + ["vermilion"] = 1, + ["orange"] = 2, + ["amber"] = 3, + ["yellow"] = 4, + ["lime"] = 5, + ["chartreuse"] = 6, + ["harlequin"] = 7, + ["green"] = 8, + ["malachite"] = 9, + ["spring"] = 10, + ["aqua"] = 10, + ["turquoise"] = 11, + ["cyan"] = 12, + ["cerulean"] = 13, + ["azure"] = 14, + ["skyblue"] = 14, + ["sapphire"] = 15, + ["blue"] = 16, + ["indigo"] = 17, + ["violet"] = 18, + ["mulberry"] = 19, + ["magenta"] = 20, + ["fuchsia"] = 21, + ["rose"] = 22, + ["redviolet"] = 22, + ["crimson"] = 23, +} + +unifieddyes.gpidx_hues_wallmounted = { + ["red"] = 0, + ["orange"] = 1, + ["yellow"] = 2, + ["green"] = 3, + ["cyan"] = 4, + ["blue"] = 5, + ["violet"] = 6, + ["magenta"] = 7 +} + +unifieddyes.gpidx_shades = { + [""] = 1, + ["s50"] = 2, + ["light"] = 3, + ["medium"] = 4, + ["mediums50"] = 5, + ["dark"] = 6, + ["darks50"] = 7, +} + +unifieddyes.gpidx_shades_split = { + ["faint"] = 0, + [""] = 1, + ["s50"] = 2, + ["light"] = 3, + ["medium"] = 4, + ["mediums50"] = 5, + ["dark"] = 6, + ["darks50"] = 7, +} + +unifieddyes.gpidx_shades_extended = { + ["faint"] = 0, + ["pastel"] = 1, + ["light"] = 2, + ["bright"] = 3, + [""] = 4, + ["s50"] = 5, + ["medium"] = 6, + ["mediums50"] = 7, + ["dark"] = 8, + ["darks50"] = 9 +} + +unifieddyes.gpidx_shades_wallmounted = { + [""] = 1, + ["medium"] = 2, + ["dark"] = 3 +} diff --git a/mods/unifieddyes/dyes-crafting.lua b/mods/unifieddyes/dyes-crafting.lua new file mode 100644 index 00000000..2c11c41b --- /dev/null +++ b/mods/unifieddyes/dyes-crafting.lua @@ -0,0 +1,309 @@ +-- crafting! + +-- Generate all dyes that are not part of the default minetest_game dyes mod + +local S = minetest.get_translator("unifieddyes") + +for _, h in ipairs(unifieddyes.HUES_EXTENDED) do + local hue = h[1] + local r = h[2] + local g = h[3] + local b = h[4] + + for v = 0, 6 do + local val = unifieddyes.VALS_EXTENDED[v+1] + + local factor = 40 + if v > 3 then factor = 75 end + + local r2 = math.max(math.min(r + (4-v)*factor, 255), 0) + local g2 = math.max(math.min(g + (4-v)*factor, 255), 0) + local b2 = math.max(math.min(b + (4-v)*factor, 255), 0) + + -- full-sat color + + local desc = hue:gsub("%a", string.upper, 1).." Dye" + + if val ~= "" then + desc = val:sub(1, -2):gsub("%a", string.upper, 1) .." "..desc + end + + local color = string.format("%02x", r2)..string.format("%02x", g2)..string.format("%02x", b2) + if minetest.registered_items["dye:"..val..hue] then + minetest.override_item("dye:"..val..hue, { + inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200", + }) + else + if (val..hue) ~= "medium_orange" + and (val..hue) ~= "light_red" then + minetest.register_craftitem(":dye:"..val..hue, { + description = S(desc), + inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200", + groups = { dye=1, not_in_creative_inventory=1 }, + }) + end + end + minetest.register_alias("unifieddyes:"..val..hue, "dye:"..val..hue) + + if v > 3 then -- also register the low-sat version + + local pr = 0.299 + local pg = 0.587 + local pb = 0.114 + + local p = math.sqrt(r2*r2*pr + g2*g2*pg + b2*b2*pb) + local r3 = math.floor(p+(r2-p)*0.5) + local g3 = math.floor(p+(g2-p)*0.5) + local b3 = math.floor(p+(b2-p)*0.5) + + local color = string.format("%02x", r3)..string.format("%02x", g3)..string.format("%02x", b3) + + minetest.register_craftitem(":dye:"..val..hue.."_s50", { + description = S(desc.." (low saturation)"), + inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200", + groups = { dye=1, not_in_creative_inventory=1 }, + }) + minetest.register_alias("unifieddyes:"..val..hue.."_s50", "dye:"..val..hue.."_s50") + end + end +end + +-- register the greyscales too :P + +for y = 1, 14 do -- colors 0 and 15 are black and white, default dyes + + if y ~= 4 and y ~= 8 and y~= 11 then -- don't register the three greys, they're done separately. + + local rgb = string.format("%02x", y*17)..string.format("%02x", y*17)..string.format("%02x", y*17) + local name = "grey_"..y + local desc = "Grey Dye #"..y + + minetest.register_craftitem(":dye:"..name, { + description = S(desc), + inventory_image = "unifieddyes_dye.png^[colorize:#"..rgb..":200", + groups = { dye=1, not_in_creative_inventory=1 }, + }) + minetest.register_alias("unifieddyes:"..name, "dye:"..name) + end +end + +minetest.override_item("dye:grey", { + inventory_image = "unifieddyes_dye.png^[colorize:#888888:200", +}) + +minetest.override_item("dye:dark_grey", { + inventory_image = "unifieddyes_dye.png^[colorize:#444444:200", +}) + +minetest.register_craftitem(":dye:light_grey", { + description = S("Light grey Dye"), + inventory_image = "unifieddyes_dye.png^[colorize:#cccccc:200", + groups = { dye=1, not_in_creative_inventory=1 }, +}) + +-- build a table of color <-> palette associations to reduce the need for +-- realtime lookups with getpaletteidx() + +for _, palette in ipairs({"extended", "split", "wallmounted"}) do + local palette2 = palette + + for i in ipairs(unifieddyes.SATS) do + local sat = (palette == "wallmounted") and "" or unifieddyes.SATS[i] + for _, hue in ipairs(unifieddyes.HUES_EXTENDED) do + for _, val in ipairs(unifieddyes.VALS_EXTENDED) do + local color = val..hue[1]..sat + if unifieddyes.getpaletteidx("dye:"..color, palette2) then + unifieddyes.palette_has_color[palette.."_"..color] = true + end + end + end + end + + for y = 0, 15 do + local grey = "grey_"..y + + if y == 0 then grey = "black" + elseif y == 4 then grey = "dark_grey" + elseif y == 8 then grey = "grey" + elseif y == 11 then grey = "light_grey" + elseif y == 15 then grey = "white" + end + if unifieddyes.getpaletteidx("dye:"..grey, palette2) then + unifieddyes.palette_has_color[palette.."_"..grey] = true + end + end +end + +unifieddyes.palette_has_color["wallmounted_light_red"] = true + +unifieddyes.base_color_crafts = { + { "red", "flowers:rose", nil, nil, nil, nil, 4 }, + { "vermilion", "dye:red", "dye:orange", nil, nil, nil, 3 }, + { "orange", "flowers:tulip", nil, nil, nil, nil, 4 }, + { "orange", "dye:red", "dye:yellow", nil, nil, nil, 2 }, + { "amber", "dye:orange", "dye:yellow", nil, nil, nil, 2 }, + { "yellow", "flowers:dandelion_yellow", nil, nil, nil, nil, 4 }, + { "lime", "dye:yellow", "dye:chartreuse", nil, nil, nil, 2 }, + { "lime", "dye:yellow", "dye:yellow", "dye:green", nil, nil, 3 }, + { "chartreuse", "dye:yellow", "dye:green", nil, nil, nil, 2 }, + { "harlequin", "dye:chartreuse", "dye:green", nil, nil, nil, 2 }, + { "harlequin", "dye:yellow", "dye:green", "dye:green", nil, nil, 3 }, + { "green", "default:cactus", nil, nil, nil, nil, 4 }, + { "green", "dye:yellow", "dye:blue", nil, nil, nil, 2 }, + { "malachite", "dye:green", "dye:spring", nil, nil, nil, 2 }, + { "malachite", "dye:green", "dye:green", "dye:cyan", nil, nil, 3 }, + { "malachite", "dye:green", "dye:green", "dye:green", "dye:blue", nil, 4 }, + { "spring", "dye:green", "dye:cyan", nil, nil, nil, 2 }, + { "spring", "dye:green", "dye:green", "dye:blue", nil, nil, 3 }, + { "turquoise", "dye:spring", "dye:cyan", nil, nil, nil, 2 }, + { "turquoise", "dye:green", "dye:cyan", "dye:cyan", nil, nil, 3 }, + { "turquoise", "dye:green", "dye:green", "dye:green", "dye:blue", "dye:blue", 5 }, + { "cyan", "dye:green", "dye:blue", nil, nil, nil, 2 }, + { "cerulean", "dye:cyan", "dye:azure", nil, nil, nil, 2 }, + { "cerulean", "dye:cyan", "dye:cyan", "dye:blue", nil, nil, 3 }, + { "cerulean", "dye:green", "dye:green", "dye:blue", "dye:blue", "dye:blue", 5 }, + { "azure", "dye:cyan", "dye:blue", nil, nil, nil, 2 }, + { "azure", "dye:green", "dye:blue", "dye:blue", nil, nil, 3 }, + { "sapphire", "dye:azure", "dye:blue", nil, nil, nil, 2 }, + { "sapphire", "dye:cyan", "dye:blue", "dye:blue", nil, nil, 3 }, + { "sapphire", "dye:green", "dye:blue", "dye:blue", "dye:blue", nil, 4 }, + { "blue", "flowers:geranium", nil, nil, nil, nil, 4 }, + { "indigo", "dye:blue", "dye:violet", nil, nil, nil, 2 }, + { "violet", "flowers:viola", nil, nil, nil, nil, 4 }, + { "violet", "dye:blue", "dye:magenta", nil, nil, nil, 2 }, + { "mulberry", "dye:violet", "dye:magenta", nil, nil, nil, 2 }, + { "mulberry", "dye:violet", "dye:blue", "dye:red", nil, nil, 3 }, + { "magenta", "dye:blue", "dye:red", nil, nil, nil, 2 }, + { "fuchsia", "dye:magenta", "dye:rose", nil, nil, nil, 2 }, + { "fuchsia", "dye:blue", "dye:red", "dye:rose", nil, nil, 3 }, + { "fuchsia", "dye:red", "dye:violet", nil, nil, nil, 2 }, + { "rose", "dye:magenta", "dye:red", nil, nil, nil, 2 }, + { "rose", "dye:red", "dye:red", "dye:blue", nil, nil, 3 }, + { "crimson", "dye:rose", "dye:red", nil, nil, nil, 2 }, + { "crimson", "dye:magenta", "dye:red", "dye:red", nil, nil, 3 }, + { "crimson", "dye:red", "dye:red", "dye:red", "dye:blue", nil, 4 }, + + { "black", "default:coal_lump", nil, nil, nil, nil, 4 }, + { "white", "flowers:dandelion_white", nil, nil, nil, nil, 4 }, +} + +unifieddyes.shade_crafts = { + { "faint_", "", "dye:white", "dye:white", "dye:white", 4 }, + { "pastel_", "", "dye:white", "dye:white", nil, 3 }, + { "light_", "", "dye:white", nil, nil, 2 }, + { "bright_", "", "color", "dye:white", nil, 3 }, + { "", "_s50", "dye:light_grey", nil, nil, 2 }, + { "", "_s50", "dye:black", "dye:white", "dye:white", 3 }, + { "medium_", "", "dye:black", nil, nil, 2 }, + { "medium_", "_s50", "dye:grey", nil, nil, 2 }, + { "medium_", "_s50", "dye:black", "dye:white", nil, 3 }, + { "dark_", "", "dye:black", "dye:black", nil, 3 }, + { "dark_", "_s50", "dye:dark_grey", nil, nil, 2 }, + { "dark_", "_s50", "dye:black", "dye:black", "dye:white", 4 }, +} + +for _,i in ipairs(unifieddyes.base_color_crafts) do + local color = i[1] + local yield = i[7] + + minetest.register_craft( { + type = "shapeless", + output = "dye:"..color.." "..yield, + recipe = { + i[2], + i[3], + i[4], + i[5], + i[6], + }, + }) + + for _,j in ipairs(unifieddyes.shade_crafts) do + local firstdye = j[3] + if firstdye == "color" then firstdye = "dye:"..color end + + -- ignore black, white, anything containing the word "grey" + + if color ~= "black" and color ~= "white" and not string.find(color, "grey") then + + minetest.register_craft( { + type = "shapeless", + output = "dye:"..j[1]..color..j[2].." "..j[6], + recipe = { + "dye:"..color, + firstdye, + j[4], + j[5] + }, + }) + end + end +end + +-- greys + +unifieddyes.greymixes = { + { 1, "dye:black", "dye:black", "dye:black", "dye:dark_grey", 4 }, + { 2, "dye:black", "dye:black", "dye:dark_grey", nil, 3 }, + { 3, "dye:black", "dye:dark_grey", nil, nil, 2 }, + { 4, "dye:white", "dye:black", "dye:black", nil, 3 }, + { 5, "dye:dark_grey", "dye:dark_grey", "dye:grey", nil, 3 }, + { 6, "dye:dark_grey", "dye:grey", nil, nil, 2 }, + { 7, "dye:dark_grey", "dye:grey", "dye:grey", nil, 3 }, + { 8, "dye:white", "dye:black", nil, nil, 2 }, + { 9, "dye:grey", "dye:grey", "dye:light_grey", nil, 3 }, + { 10, "dye:grey", "dye:light_grey", "dye:light_grey", nil, 3 }, + { 11, "dye:white", "dye:white", "dye:black", nil, 3 }, + { 12, "dye:light_grey", "dye:light_grey", "dye:white", nil, 3 }, + { 13, "dye:light_grey", "dye:white", nil, nil, 2 }, + { 14, "dye:white", "dye:white", "dye:light_grey", nil, 3 }, +} + +for _, i in ipairs(unifieddyes.greymixes) do + local shade = i[1] + local dye1 = i[2] + local dye2 = i[3] + local dye3 = i[4] + local dye4 = i[5] + local yield = i[6] + local color = "grey_"..shade + if shade == 4 then + color = "dark_grey" + elseif shade == 8 then + color = "grey" + elseif shade == 11 then + color = "light_grey" + end + + minetest.register_craft( { + type = "shapeless", + output = "dye:"..color.." "..yield, + recipe = { + dye1, + dye2, + dye3, + dye4, + }, + }) +end + +-- other crafts +-- we can't make dark orange anymore because brown/medium orange conflicts + +minetest.register_craft( { + type = "shapeless", + output = "dye:dark_orange", + recipe = { + "dye:brown", + "dye:brown" + }, +}) + +minetest.register_craft( { + output = "unifieddyes:airbrush", + recipe = { + { "basic_materials:brass_ingot", "", "basic_materials:plastic_sheet" }, + { "", "default:steel_ingot", "" }, + { "", "", "default:steel_ingot" } + }, +}) diff --git a/mods/unifieddyes/init.lua b/mods/unifieddyes/init.lua index dcebc786..a8e5092b 100644 --- a/mods/unifieddyes/init.lua +++ b/mods/unifieddyes/init.lua @@ -2,12 +2,12 @@ Unified Dyes -This mod provides an extension to the Minetest 0.4.x dye system +This mod provides an extension to the Minetest dye system ============================================================================== -Copyright (C) 2012-2013, Vanessa Ezekowitz -Email: vanessaezekowitz@gmail.com +Copyright (C) 2012-2013, Vanessa Dannenberg +Email: vanessa.e.dannenberg@gmail.com This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -34,1562 +34,12 @@ unifieddyes = {} local creative_mode = minetest.settings:get_bool("creative_mode") local S = minetest.get_translator("unifieddyes") +local modpath=minetest.get_modpath(minetest.get_current_modname()) --- the names of the various colors here came from http://www.procato.com/rgb+index/ - -unifieddyes.HUES_EXTENDED = { - { "red", 0xff, 0x00, 0x00 }, - { "vermilion", 0xff, 0x40, 0x00 }, - { "orange", 0xff, 0x80, 0x00 }, - { "amber", 0xff, 0xbf, 0x00 }, - { "yellow", 0xff, 0xff, 0x00 }, - { "lime", 0xbf, 0xff, 0x00 }, - { "chartreuse", 0x80, 0xff, 0x00 }, - { "harlequin", 0x40, 0xff, 0x00 }, - { "green", 0x00, 0xff, 0x00 }, - { "malachite", 0x00, 0xff, 0x40 }, - { "spring", 0x00, 0xff, 0x80 }, - { "turquoise", 0x00, 0xff, 0xbf }, - { "cyan", 0x00, 0xff, 0xff }, - { "cerulean", 0x00, 0xbf, 0xff }, - { "azure", 0x00, 0x80, 0xff }, - { "sapphire", 0x00, 0x40, 0xff }, - { "blue", 0x00, 0x00, 0xff }, - { "indigo", 0x40, 0x00, 0xff }, - { "violet", 0x80, 0x00, 0xff }, - { "mulberry", 0xbf, 0x00, 0xff }, - { "magenta", 0xff, 0x00, 0xff }, - { "fuchsia", 0xff, 0x00, 0xbf }, - { "rose", 0xff, 0x00, 0x80 }, - { "crimson", 0xff, 0x00, 0x40 } -} - -unifieddyes.HUES_WITH_GREY = {} - -for _,i in ipairs(unifieddyes.HUES_EXTENDED) do - table.insert(unifieddyes.HUES_WITH_GREY, i[1]) -end -table.insert(unifieddyes.HUES_WITH_GREY, "grey") - -unifieddyes.HUES_WALLMOUNTED = { - "red", - "orange", - "yellow", - "green", - "cyan", - "blue", - "violet", - "magenta" -} - -unifieddyes.SATS = { - "", - "_s50" -} - -unifieddyes.VALS = { - "", - "medium_", - "dark_" -} - -unifieddyes.VALS_SPLIT = { - "faint_", - "light_", - "", - "medium_", - "dark_" -} - -unifieddyes.VALS_EXTENDED = { - "faint_", - "pastel_", - "light_", - "bright_", - "", - "medium_", - "dark_" -} - -unifieddyes.GREYS = { - "white", - "light_grey", - "grey", - "dark_grey", - "black" -} - -unifieddyes.GREYS_EXTENDED = table.copy(unifieddyes.GREYS) - -for i = 1, 14 do - if i ~= 0 and i ~= 4 and i ~= 8 and i ~= 11 and i ~= 15 then - table.insert(unifieddyes.GREYS_EXTENDED, "grey_"..i) - end -end - -local default_dyes = { - "black", - "blue", - "brown", - "cyan", - "dark_green", - "dark_grey", - "green", - "grey", - "magenta", - "orange", - "pink", - "red", - "violet", - "white", - "yellow" -} - -unifieddyes.player_current_dye = {} -unifieddyes.player_selected_dye = {} -unifieddyes.player_last_right_clicked = {} -unifieddyes.palette_has_color = {} -unifieddyes.player_showall = {} - --- if a node with a palette is placed in the world, --- but the itemstack used to place it has no palette_index (color byte), --- create something appropriate to make it officially white. - -minetest.register_on_placenode( - function(pos, newnode, placer, oldnode, itemstack, pointed_thing) - local def = minetest.registered_items[newnode.name] - - if not def - or not def.palette - or def.after_place_node - or not placer then - return false - end - - local param2 - if not string.find(itemstack:to_string(), "palette_index") then - if def.palette == "unifieddyes_palette_extended.png" - and def.paramtype2 == "color" then - param2 = 240 - elseif def.palette == "unifieddyes_palette_colorwallmounted.png" - and def.paramtype2 == "colorwallmounted" then - param2 = newnode.param2 % 8 - elseif string.find(def.palette, "unifieddyes_palette_") - and def.paramtype2 == "colorfacedir" then -- it's a split palette - param2 = newnode.param2 % 32 - end - - if param2 then - minetest.swap_node(pos, {name = newnode.name, param2 = param2}) - end - end - - if def.palette ~= "" then - minetest.get_meta(pos):set_int("palette_index", param2 or 240) - end - end -) - --- The complementary function: strip-off the color if the node being dug is still white/neutral - -local function move_item(item, pos, inv, digger, fix_color) - if not (digger and digger:is_player()) then return end - local creative = creative_mode or minetest.check_player_privs(digger, "creative") - item = unifieddyes.fix_bad_color_info(item, fix_color) - if inv:room_for_item("main", item) - and (not creative or not inv:contains_item("main", item, true)) then - inv:add_item("main", item) - elseif not creative then - minetest.item_drop(ItemStack(item), digger, pos) - end - minetest.remove_node(pos) -end - -function unifieddyes.on_dig(pos, node, digger) - if not digger then return end - local playername = digger:get_player_name() - if minetest.is_protected(pos, playername) then - minetest.record_protection_violation(pos, playername) - return - end - - local oldparam2 = minetest.get_node(pos).param2 - local def = minetest.registered_items[node.name] - local fix_color - - if def.paramtype2 == "color" and oldparam2 == 240 and def.palette == "unifieddyes_palette_extended.png" then - fix_color = 240 - elseif def.paramtype2 == "color" and oldparam2 == 0 and def.palette == "unifieddyes_palette_extended.png" then - fix_color = 0 - elseif def.paramtype2 == "colorwallmounted" and math.floor(oldparam2 / 8) == 0 and def.palette == "unifieddyes_palette_colorwallmounted.png" then - fix_color = 0 - elseif def.paramtype2 == "colorfacedir" and math.floor(oldparam2 / 32) == 0 and string.find(def.palette, "unifieddyes_palette_") then - fix_color = 0 - end - - local inv = digger:get_inventory() - if fix_color then - move_item(node.name, pos, inv, digger, fix_color) - else - return minetest.node_dig(pos, node, digger) - end -end - --- just stubs to keep old mods from crashing when expecting auto-coloring --- or getting back the dye on dig. - -function unifieddyes.recolor_on_place(foo) -end - -function unifieddyes.after_dig_node(foo) -end - --- This helper function creates multiple copies of the passed node, --- for the split palette - one per hue, plus grey - and assigns --- proper palettes and other attributes - -function unifieddyes.generate_split_palette_nodes(name, def, drop) - for _, color in ipairs(unifieddyes.HUES_WITH_GREY) do - local def2 = table.copy(def) - local desc_color = string.gsub(string.upper(string.sub(color, 1, 1))..string.sub(color, 2), "_", " ") - if string.sub(def2.description, -1) == ")" then - def2.description = string.sub(def2.description, 1, -2)..", "..desc_color.." shades)" - else - def2.description = def2.description.."("..desc_color.." shades)" - end - def2.palette = "unifieddyes_palette_"..color.."s.png" - def2.paramtype2 = "colorfacedir" - def2.groups.ud_param2_colorable = 1 - - if drop then - def2.drop = { - items = { - {items = {drop.."_"..color}, inherit_color = true }, - } - } - end - - minetest.register_node(":"..name.."_"..color, def2) - end -end - --- This helper function creates a colored itemstack - -function unifieddyes.fix_bad_color_info(item, paletteidx) - local stack=minetest.itemstring_with_color(item, paletteidx) - return string.gsub(stack, "u0001color", "u0001palette_index") -end - -function unifieddyes.make_colored_itemstack(item, palette, color) - local paletteidx = unifieddyes.getpaletteidx(color, palette) - return unifieddyes.fix_bad_color_info(item, paletteidx), paletteidx -end - --- these helper functions register all of the recipes needed to create colored --- nodes with any of the dyes supported by that node's palette. - -local function register_c(craft, h, sat, val) - local hue = (type(h) == "table") and h[1] or h - local color = "" - if val then - if craft.palette == "wallmounted" then - color = val..hue..sat - else - color = val..hue..sat - end - else - color = hue -- if val is nil, then it's grey. - end - - local dye = "dye:"..color - local recipe = minetest.serialize(craft.recipe) - recipe = string.gsub(recipe, "MAIN_DYE", dye) - recipe = string.gsub(recipe, "NEUTRAL_NODE", craft.neutral_node) - local newrecipe = minetest.deserialize(recipe) - - local coutput = craft.output or "" - local output = coutput - if craft.output_prefix then - if craft.palette ~= "split" then - output = craft.output_prefix..color..craft.output_suffix..coutput - else - if hue == "white" or hue == "black" or string.find(hue, "grey") then - output = craft.output_prefix.."grey"..craft.output_suffix..coutput - elseif hue == "pink" then - dye = "dye:light_red" - output = craft.output_prefix.."red"..craft.output_suffix..coutput - else - output = craft.output_prefix..hue..craft.output_suffix..coutput - end - end - end - - local colored_itemstack = - unifieddyes.make_colored_itemstack(output, craft.palette, dye) - - minetest.register_craft({ - output = colored_itemstack, - type = craft.type, - recipe = newrecipe - }) - -end - -function unifieddyes.register_color_craft(craft) - local hues_table = unifieddyes.HUES_EXTENDED - local sats_table = unifieddyes.SATS - local vals_table = unifieddyes.VALS_SPLIT - local greys_table = unifieddyes.GREYS - - if craft.palette == "wallmounted" then - register_c(craft, "green", "", "light_") - register_c(craft, "blue", "", "light_") - hues_table = unifieddyes.HUES_WALLMOUNTED - sats_table = {""} - vals_table = unifieddyes.VALS - elseif craft.palette == "extended" then - vals_table = unifieddyes.VALS_EXTENDED - greys_table = unifieddyes.GREYS_EXTENDED - end - - for _, hue in ipairs(hues_table) do - for _, val in ipairs(vals_table) do - for _, sat in ipairs(sats_table) do - - if sat == "_s50" and val ~= "" and val ~= "medium_" and val ~= "dark_" then break end - register_c(craft, hue, sat, val) - - end - end - end - - for _, grey in ipairs(greys_table) do - register_c(craft, grey) - end - - register_c(craft, "pink") - -end - --- code borrowed from homedecor --- call this function to reset the rotation of a "wallmounted" object on place - -function unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing) - local node = minetest.get_node(pos) - local colorbits = node.param2 - (node.param2 % 8) - - local yaw = placer:get_look_horizontal() - local dir = minetest.yaw_to_dir(yaw) -- -1.5) - local pitch = placer:get_look_vertical() - - local fdir = minetest.dir_to_wallmounted(dir) - - if pitch < -(math.pi/8) then - fdir = 0 - elseif pitch > math.pi/8 then - fdir = 1 - end - minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits }) -end - --- use this when you have a "wallmounted" node that should never be oriented --- to floor or ceiling... - -function unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing) - local node = minetest.get_node(pos) - local colorbits = node.param2 - (node.param2 % 8) - local yaw = placer:get_look_horizontal() - local dir = minetest.yaw_to_dir(yaw+1.5) - local fdir = minetest.dir_to_wallmounted(dir) - - minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits }) -end - --- ... and use this one to force that kind of node off of floor/ceiling --- orientation after the screwdriver rotates it. - -function unifieddyes.fix_after_screwdriver_nsew(pos, node, user, mode, new_param2) - local new_fdir = new_param2 % 8 - local color = new_param2 - new_fdir - if new_fdir < 2 then - new_fdir = 2 - minetest.swap_node(pos, { name = node.name, param2 = new_fdir + color }) - return true - end -end - -function unifieddyes.is_buildable_to(placer_name, ...) - for _, pos in ipairs({...}) do - local node = minetest.get_node_or_nil(pos) - local def = node and minetest.registered_nodes[node.name] - if not (def and def.buildable_to) or minetest.is_protected(pos, placer_name) then - return false - end - end - return true -end - -function unifieddyes.get_hsv(name) -- expects a node/item name - local hue = "" - local a,b - for _, i in ipairs(unifieddyes.HUES_EXTENDED) do - a,b = string.find(name, "_"..i[1]) - if a then - hue = i[1] - break - end - end - - if string.find(name, "_light_grey") then hue = "light_grey" - elseif string.find(name, "_lightgrey") then hue = "light_grey" - elseif string.find(name, "_dark_grey") then hue = "dark_grey" - elseif string.find(name, "_darkgrey") then hue = "dark_grey" - elseif string.find(name, "_grey") then hue = "grey" - elseif string.find(name, "_white") then hue = "white" - elseif string.find(name, "_black") then hue = "black" - end - - local sat = "" - if string.find(name, "_s50") then sat = "_s50" end - - local val = "" - if string.find(name, "dark_") then val = "dark_" end - if string.find(name, "medium_") then val = "medium_" end - if string.find(name, "light_") then val = "light_" end - - return hue, sat, val -end - --- code partially borrowed from cheapie's plasticbox mod - --- in the function below, color is just a color string, while --- palette_type can be: --- --- "extended" = 256 color palette --- "split" = 200 color palette split into pieces for colorfacedir --- "wallmounted" = 32-color abridged palette - - -function unifieddyes.getpaletteidx(color, palette_type) - - local origcolor = color - local aliases = { - ["pink"] = "light_red", - ["brown"] = "medium_orange", - ["azure"] = "light_blue" - } - - local grayscale = { - ["white"] = 1, - ["light_grey"] = 2, - ["grey"] = 3, - ["dark_grey"] = 4, - ["black"] = 5, - } - - local grayscale_extended = { - ["white"] = 0, - ["grey_14"] = 1, - ["grey_13"] = 2, - ["grey_12"] = 3, - ["light_grey"] = 4, - ["grey_11"] = 4, - ["grey_10"] = 5, - ["grey_9"] = 6, - ["grey_8"] = 7, - ["grey"] = 7, - ["grey_7"] = 8, - ["grey_6"] = 9, - ["grey_5"] = 10, - ["grey_4"] = 11, - ["dark_grey"] = 11, - ["grey_3"] = 12, - ["grey_2"] = 13, - ["grey_1"] = 14, - ["black"] = 15, - } - - local grayscale_wallmounted = { - ["white"] = 0, - ["light_grey"] = 1, - ["grey"] = 2, - ["dark_grey"] = 3, - ["black"] = 4, - } - - local hues_extended = { - ["red"] = 0, - ["vermilion"] = 1, - ["orange"] = 2, - ["amber"] = 3, - ["yellow"] = 4, - ["lime"] = 5, - ["chartreuse"] = 6, - ["harlequin"] = 7, - ["green"] = 8, - ["malachite"] = 9, - ["spring"] = 10, - ["aqua"] = 10, - ["turquoise"] = 11, - ["cyan"] = 12, - ["cerulean"] = 13, - ["azure"] = 14, - ["skyblue"] = 14, - ["sapphire"] = 15, - ["blue"] = 16, - ["indigo"] = 17, - ["violet"] = 18, - ["mulberry"] = 19, - ["magenta"] = 20, - ["fuchsia"] = 21, - ["rose"] = 22, - ["redviolet"] = 22, - ["crimson"] = 23, - } - - local hues_wallmounted = { - ["red"] = 0, - ["orange"] = 1, - ["yellow"] = 2, - ["green"] = 3, - ["cyan"] = 4, - ["blue"] = 5, - ["violet"] = 6, - ["magenta"] = 7 - } - - local shades = { - [""] = 1, - ["s50"] = 2, - ["light"] = 3, - ["medium"] = 4, - ["mediums50"] = 5, - ["dark"] = 6, - ["darks50"] = 7, - } - - local shades_split = { - ["faint"] = 0, - [""] = 1, - ["s50"] = 2, - ["light"] = 3, - ["medium"] = 4, - ["mediums50"] = 5, - ["dark"] = 6, - ["darks50"] = 7, - } - - local shades_extended = { - ["faint"] = 0, - ["pastel"] = 1, - ["light"] = 2, - ["bright"] = 3, - [""] = 4, - ["s50"] = 5, - ["medium"] = 6, - ["mediums50"] = 7, - ["dark"] = 8, - ["darks50"] = 9 - } - - local shades_wallmounted = { - [""] = 1, - ["medium"] = 2, - ["dark"] = 3 - } - - if string.sub(color,1,4) == "dye:" then - color = string.sub(color,5,-1) - elseif string.sub(color,1,12) == "unifieddyes:" then - color = string.sub(color,13,-1) - else - return - end - - if palette_type == "wallmounted" then - if grayscale_wallmounted[color] then - return (grayscale_wallmounted[color] * 8), 0 - end - elseif palette_type == "split" then - if grayscale[color] then - return (grayscale[color] * 32), 0 - end - elseif palette_type == "extended" then - if grayscale_extended[color] then - return grayscale_extended[color]+240, 0 - end - end - - local shade = "" -- assume full - if string.sub(color,1,6) == "faint_" then - shade = "faint" - color = string.sub(color,7,-1) - elseif string.sub(color,1,7) == "pastel_" then - shade = "pastel" - color = string.sub(color,8,-1) - elseif string.sub(color,1,6) == "light_" then - shade = "light" - color = string.sub(color,7,-1) - elseif string.sub(color,1,7) == "bright_" then - shade = "bright" - color = string.sub(color,8,-1) - elseif string.sub(color,1,7) == "medium_" then - shade = "medium" - color = string.sub(color,8,-1) - elseif string.sub(color,1,5) == "dark_" then - shade = "dark" - color = string.sub(color,6,-1) - end - if string.sub(color,-4,-1) == "_s50" then - shade = shade.."s50" - color = string.sub(color,1,-5) - end - - if palette_type == "wallmounted" then - if color == "green" and shade == "light" then return 48,3 - elseif color == "brown" then return 17,1 - elseif color == "pink" then return 56,7 - elseif color == "blue" and shade == "light" then return 40,5 - elseif hues_wallmounted[color] and shades_wallmounted[shade] then - return (shades_wallmounted[shade] * 64 + hues_wallmounted[color] * 8), hues_wallmounted[color] - end - else - if color == "brown" then - color = "orange" - shade = "medium" - elseif color == "pink" then - color = "red" - shade = "light" - end - if palette_type == "split" then -- it's colorfacedir - if hues_extended[color] and shades_split[shade] then - return (shades_split[shade] * 32), hues_extended[color]+1 - end - elseif palette_type == "extended" then - if hues_extended[color] and shades_extended[shade] then - return (hues_extended[color] + shades_extended[shade]*24), hues_extended[color] - end - end - end -end - -function unifieddyes.get_color_from_dye_name(name) - if name == "dye:black" then - return "000000" - elseif name == "dye:white" then - return "ffffff" - end - local item = minetest.registered_items[name] - if not item then return end - local inv_image = item.inventory_image - if not inv_image then return end - return string.match(inv_image,"colorize:#(......):200") -end - --- punch-to-recolor using the airbrush - -function unifieddyes.on_airbrush(itemstack, player, pointed_thing) - local player_name = player:get_player_name() - local painting_with = nil - - if unifieddyes.player_current_dye[player_name] then - painting_with = unifieddyes.player_current_dye[player_name] - end - - if not painting_with then - minetest.chat_send_player(player_name, "*** You need to set a color first.") - minetest.chat_send_player(player_name, "*** Right-click any random node to open the color selector,") - minetest.chat_send_player(player_name, "*** or shift+right-click a colorized node to use its color.") - minetest.chat_send_player(player_name, "*** Be sure to click \"Accept\", or the color you select will be ignored.") - return - end - - local pos = minetest.get_pointed_thing_position(pointed_thing) - if not pos then - local look_angle = player:get_look_vertical() - if look_angle > -1.55 then - minetest.chat_send_player(player_name, "*** No node selected") - else - local hexcolor = unifieddyes.get_color_from_dye_name(painting_with) - if hexcolor then - local r = tonumber(string.sub(hexcolor,1,2),16) - local g = tonumber(string.sub(hexcolor,3,4),16) - local b = tonumber(string.sub(hexcolor,5,6),16) - player:set_sky({r=r,g=g,b=b,a=255},"plain") - end - end - return - end - - local node = minetest.get_node(pos) - local def = minetest.registered_items[node.name] - if not def then return end - - if minetest.is_protected(pos, player_name) then - minetest.chat_send_player(player_name, "*** Sorry, someone else owns that node.") - return - end - - if not (def.groups and def.groups.ud_param2_colorable and def.groups.ud_param2_colorable > 0) then - minetest.chat_send_player(player_name, "*** That node can't be colored.") - return - end - - local palette = nil - local fdir = 0 - if not def or not def.palette then - minetest.chat_send_player(player_name, "*** That node can't be colored -- it's either undefined or has no palette.") - return - elseif def.palette == "unifieddyes_palette_extended.png" then - palette = "extended" - elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then - palette = "wallmounted" - fdir = node.param2 % 8 - elseif def.palette ~= "unifieddyes_palette_extended.png" - and def.palette ~= "unifieddyes_palette_colorwallmounted.png" - and string.find(def.palette, "unifieddyes_palette_") then - palette = "split" - fdir = node.param2 % 32 - else - minetest.chat_send_player(player_name, "*** That node can't be colored -- it has an invalid color mode.") - return - end - - local idx, hue = unifieddyes.getpaletteidx(painting_with, palette) - local inv = player:get_inventory() - if (not creative or not creative.is_enabled_for(player_name)) and not inv:contains_item("main", painting_with) then - local suff = "" - if not idx then - suff = " Besides, "..string.sub(painting_with, 5).." can't be applied to that node." - end - minetest.chat_send_player(player_name, "*** You're in survival mode, and you're out of "..string.sub(painting_with, 5).."."..suff) - return - end - - if not idx then - minetest.chat_send_player(player_name, "*** "..string.sub(painting_with, 5).." can't be applied to that node.") - return - end - - local oldidx = node.param2 - fdir - local name = def.airbrush_replacement_node or node.name - - if palette == "split" then - - local modname = string.sub(name, 1, string.find(name, ":")-1) - local nodename2 = string.sub(name, string.find(name, ":")+1) - local oldcolor = "snozzberry" - local newcolor = "razzberry" -- intentionally misspelled ;-) - - if def.ud_color_start and def.ud_color_end then - oldcolor = string.sub(node.name, def.ud_color_start, def.ud_color_end) - newcolor = string.sub(painting_with, 5) - else - if hue ~= 0 then - newcolor = unifieddyes.HUES_EXTENDED[hue][1] - else - newcolor = "grey" - end - - if def.airbrush_replacement_node then - oldcolor = "grey" - else - local s = string.sub(def.palette, 21) - oldcolor = string.sub(s, 1, string.find(s, "s.png")-1) - end - end - - name = modname..":"..string.gsub(nodename2, oldcolor, newcolor) - - if not minetest.registered_items[name] then - minetest.chat_send_player(player_name, "*** "..string.sub(painting_with, 5).." can't be applied to that node.") - return - end - elseif idx == oldidx then - return - end - minetest.swap_node(pos, {name = name, param2 = fdir + idx}) - if not creative or not creative.is_enabled_for(player_name) then - inv:remove_item("main", painting_with) - return - end -end - --- get a node's dye color based on its palette and param2 - -function unifieddyes.color_to_name(param2, def) - if not param2 or not def or not def.palette then return end - - if def.palette == "unifieddyes_palette_extended.png" then - local color = param2 - - local v = 0 - local s = 1 - if color < 24 then v = 1 - elseif color > 23 and color < 48 then v = 2 - elseif color > 47 and color < 72 then v = 3 - elseif color > 71 and color < 96 then v = 4 - elseif color > 95 and color < 120 then v = 5 - elseif color > 119 and color < 144 then v = 5 s = 2 - elseif color > 143 and color < 168 then v = 6 - elseif color > 167 and color < 192 then v = 6 s = 2 - elseif color > 191 and color < 216 then v = 7 - elseif color > 215 and color < 240 then v = 7 s = 2 - end - - if color > 239 then - if color == 240 then return "white" - elseif color == 244 then return "light_grey" - elseif color == 247 then return "grey" - elseif color == 251 then return "dark_grey" - elseif color == 255 then return "black" - else return "grey_"..15-(color-240) - end - else - local h = color - math.floor(color/24)*24 - return unifieddyes.VALS_EXTENDED[v]..unifieddyes.HUES_EXTENDED[h+1][1]..unifieddyes.SATS[s] - end - - elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then - local color = math.floor(param2 / 8) - if color == 0 then return "white" - elseif color == 1 then return "light_grey" - elseif color == 2 then return "grey" - elseif color == 3 then return "dark_grey" - elseif color == 4 then return "black" - elseif color == 5 then return "light_blue" - elseif color == 6 then return "light_green" - elseif color == 7 then return "pink" - end - local v = math.floor(color/8) - local h = color - v * 8 - return unifieddyes.VALS[v]..unifieddyes.HUES_WALLMOUNTED[h+1] - - elseif string.find(def.palette, "unifieddyes_palette") then -- it's the split palette - -- palette names in this mode are always "unifieddyes_palette_COLORs.png" - - local s = string.sub(def.palette, 21) - local color = string.sub(s, 1, string.find(s, "s.png")-1) - - local v = math.floor(param2/32) - if color ~= "grey" then - if v == 0 then return "faint_"..color - elseif v == 1 then return color - elseif v == 2 then return color.."_s50" - elseif v == 3 then return "light_"..color - elseif v == 4 then return "medium_"..color - elseif v == 5 then return "medium_"..color.."_s50" - elseif v == 6 then return "dark_"..color - elseif v == 7 then return "dark_"..color.."_s50" - end - else - if v > 0 and v < 6 then return unifieddyes.GREYS[v] - else return "white" - end - end - end -end - -local hps = 0.6 -- horizontal position scale -local vps = 1.3 -- vertical position scale -local vs = 0.1 -- vertical shift/offset - -local color_button_size = ";0.75,0.75;" -local color_square_size = ";0.69,0.69;" - -function unifieddyes.make_readable_color(color) - -- is this a low saturation color? - local has_low_saturtation = string.find(color, "s50"); - - -- remove _s50 tag, we care about that later again - local s = string.gsub(color, "_s50", "") - - -- replace underscores with spaces to make it look nicer - local s = string.gsub(s, "_", " ") - - -- capitalize words, you know, looks nicer ;) - s = string.gsub(s, "(%l)(%w*)", function(a,b) return string.upper(a)..b end) - - -- add the word dye, this is what the translations expect - s = s.." Dye" - - -- if it is a low sat color, append an appropriate string - if has_low_saturtation then - s = s.." (low saturation)" - end - - return s -end - -function unifieddyes.make_colored_square(hexcolor, colorname, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist) - - local dye = "dye:"..colorname - - local overlay = "" - local colorize = minetest.formspec_escape("^[colorize:#"..hexcolor..":255") - - if not creative and inv:contains_item("main", dye) then - overlay = "^unifieddyes_onhand_overlay.png" - end - - local unavail_overlay = "" - if not showall and not unifieddyes.palette_has_color[nodepalette.."_"..colorname] - or (explist and not explist[colorname]) then - if overlay == "" then - unavail_overlay = "^unifieddyes_unavailable_overlay.png" - else - unavail_overlay = "^unifieddyes_onhand_unavailable_overlay.png" - end - end - - local tooltip = "tooltip["..colorname..";".. - S(unifieddyes.make_readable_color(colorname)).. - "\n(dye:"..colorname..")]" - - if dye == painting_with then - overlay = "^unifieddyes_select_overlay.png" - selindic = "unifieddyes_white_square.png"..colorize..overlay..unavail_overlay.."]"..tooltip - end - - local form - if unavail_overlay == "" then - form = "image_button[".. - (hp*hps)..","..(v2*vps+vs).. - color_button_size.. - "unifieddyes_white_square.png"..colorize..overlay..unavail_overlay..";".. - colorname..";]".. - tooltip - else - form = "image[".. - (hp*hps)..","..(v2*vps+vs).. - color_square_size.. - "unifieddyes_white_square.png"..colorize..overlay..unavail_overlay.."]".. - tooltip - end - - return form, selindic -end - -function unifieddyes.show_airbrush_form(player) - if not player then return end - - local t = {} - - local player_name = player:get_player_name() - local painting_with = unifieddyes.player_selected_dye[player_name] or unifieddyes.player_current_dye[player_name] - local creative = creative and creative.is_enabled_for(player_name) - local inv = player:get_inventory() - local nodepalette = "extended" - local showall = unifieddyes.player_showall[player_name] - - t[1] = "size[14.5,8.5]label[7,-0.3;"..S("Select a color:").."]" - local selindic = "unifieddyes_select_overlay.png^unifieddyes_question.png]" - - local last_right_click = unifieddyes.player_last_right_clicked[player_name] - if last_right_click then - if last_right_click.def and last_right_click.def.palette then - if last_right_click.def.palette == "unifieddyes_palette_colorwallmounted.png" then - nodepalette = "wallmounted" - elseif last_right_click.def.palette == "unifieddyes_palette_extended.png" then - t[#t+1] = "label[0.5,8.25;"..S("(Right-clicked a node that supports all 256 colors, showing them all)").."]" - showall = true - elseif last_right_click.def.palette ~= "unifieddyes_palette_extended.png" - and last_right_click.def.palette ~= "unifieddyes_palette_colorwallmounted.png" - and string.find(last_right_click.def.palette, "unifieddyes_palette_") then - nodepalette = "split" - end - end - end - - if not last_right_click.def.groups - or not last_right_click.def.groups.ud_param2_colorable - or not last_right_click.def.palette - or not string.find(last_right_click.def.palette, "unifieddyes_palette_") then - t[#t+1] = "label[0.5,8.25;"..S("(Right-clicked a node not supported by the Airbrush, showing all colors)").."]" - end - - local explist = last_right_click.def.explist - - for v = 0, 6 do - local val = unifieddyes.VALS_EXTENDED[v+1] - - local sat = "" - local v2=(v/2) - - for hi, h in ipairs(unifieddyes.HUES_EXTENDED) do - local hue = h[1] - local hp=hi-1 - - local r = h[2] - local g = h[3] - local b = h[4] - - local factor = 40 - if v > 3 then - factor = 75 - v2 = (v-2) - end - - local r2 = math.max(math.min(r + (4-v)*factor, 255), 0) - local g2 = math.max(math.min(g + (4-v)*factor, 255), 0) - local b2 = math.max(math.min(b + (4-v)*factor, 255), 0) - - local hexcolor = string.format("%02x", r2)..string.format("%02x", g2)..string.format("%02x", b2) - local f - f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist) - t[#t+1] = f - end - - if v > 3 then - sat = "_s50" - v2 = (v-1.5) - - for hi, h in ipairs(unifieddyes.HUES_EXTENDED) do - local hue = h[1] - local hp=hi-1 - - local r = h[2] - local g = h[3] - local b = h[4] - - local factor = 75 - - local pr = 0.299 - local pg = 0.587 - local pb = 0.114 - - local r2 = math.max(math.min(r + (4-v)*factor, 255), 0) - local g2 = math.max(math.min(g + (4-v)*factor, 255), 0) - local b2 = math.max(math.min(b + (4-v)*factor, 255), 0) - - local p = math.sqrt(r2*r2*pr + g2*g2*pg + b2*b2*pb) - local r3 = math.floor(p+(r2-p)*0.5) - local g3 = math.floor(p+(g2-p)*0.5) - local b3 = math.floor(p+(b2-p)*0.5) - - local hexcolor = string.format("%02x", r3)..string.format("%02x", g3)..string.format("%02x", b3) - local f - f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist) - t[#t+1] = f - end - end - end - - local v2=5 - for y = 0, 15 do - - local hp=15-y - - local hexgrey = string.format("%02x", y*17)..string.format("%02x", y*17)..string.format("%02x", y*17) - local grey = "grey_"..y - - if y == 0 then grey = "black" - elseif y == 4 then grey = "dark_grey" - elseif y == 8 then grey = "grey" - elseif y == 11 then grey = "light_grey" - elseif y == 15 then grey = "white" - end - - local f - f, selindic = unifieddyes.make_colored_square(hexgrey, grey, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist) - t[#t+1] = f - - end - - if not creative then - t[#t+1] = "image[10," - t[#t+1] = (vps*5.55+vs) - t[#t+1] = color_button_size - t[#t+1] = "unifieddyes_onhand_overlay.png]label[10.7," - t[#t+1] = (vps*5.51+vs) - t[#t+1] = ";"..S("Dyes").."]" - t[#t+1] = "label[10.7," - t[#t+1] = (vps*5.67+vs) - t[#t+1] = ";on hand]" - - end - - t[#t+1] = "image[10," - t[#t+1] = (vps*5+vs) - t[#t+1] = color_button_size - t[#t+1] = selindic - - if painting_with then - t[#t+1] = "label[10.7," - t[#t+1] = (vps*4.90+vs) - t[#t+1] = ";"..S("Your selection:").."]" - t[#t+1] = "label[10.7," - t[#t+1] = (vps*5.07+vs) - t[#t+1] = ";" - t[#t+1] = S(unifieddyes.make_readable_color(string.sub(painting_with, 5))) - t[#t+1] = "]label[10.7," - t[#t+1] = (vps*5.24+vs) - t[#t+1] = ";(" - t[#t+1] = painting_with - t[#t+1] = ")]" - else - t[#t+1] = "label[10.7," - t[#t+1] = (vps*5.07+vs) - t[#t+1] = ";"..S("Your selection").."]" - end - - t[#t+1] = "button_exit[10.5,8;2,1;cancel;"..S("Cancel").."]button_exit[12.5,8;2,1;accept;"..S("Accept").."]" - - - if last_right_click and last_right_click.def and nodepalette ~= "extended" then - if showall then - t[#t+1] = "button[0,8;2,1;show_avail;"..S("Show Available").."]" - t[#t+1] = "label[2,8.25;"..S("(Currently showing all 256 colors)").."]" - else - t[#t+1] = "button[0,8;2,1;show_all;"..S("Show All Colors").."]" - t[#t+1] = "label[2,8.25;"..S("(Currently only showing what the right-clicked node can use)").."]" - end - end - - minetest.show_formspec(player_name, "unifieddyes:dye_select_form", table.concat(t)) -end - -minetest.register_tool("unifieddyes:airbrush", { - description = S("Dye Airbrush"), - inventory_image = "unifieddyes_airbrush.png", - use_texture_alpha = true, - tool_capabilities = { - full_punch_interval=0.1, - }, - range = 12, - on_use = unifieddyes.on_airbrush, - on_place = function(itemstack, placer, pointed_thing) - local keys = placer:get_player_control() - local player_name = placer:get_player_name() - local pos = minetest.get_pointed_thing_position(pointed_thing) - local node - local def - - if pos then node = minetest.get_node(pos) end - if node then def = minetest.registered_items[node.name] end - - unifieddyes.player_last_right_clicked[player_name] = {pos = pos, node = node, def = def} - - if (not keys.sneak) and def.on_rightclick then - return def.on_rightclick(pos, node, placer, itemstack, pointed_thing) - elseif not keys.sneak then - unifieddyes.show_airbrush_form(placer) - elseif keys.sneak then - if not pos or not def then return end - local newcolor = unifieddyes.color_to_name(node.param2, def) - - if not newcolor then - minetest.chat_send_player(player_name, "*** That node is uncolored.") - return - end - minetest.chat_send_player(player_name, "*** Switching to "..newcolor.." for the airbrush, to match that node.") - unifieddyes.player_current_dye[player_name] = "dye:"..newcolor - end - end -}) - -minetest.register_craft( { - output = "unifieddyes:airbrush", - recipe = { - { "basic_materials:brass_ingot", "", "basic_materials:plastic_sheet" }, - { "", "default:steel_ingot", "" }, - { "", "", "default:steel_ingot" } - }, -}) - -minetest.register_on_player_receive_fields(function(player, formname, fields) - - if formname == "unifieddyes:dye_select_form" then - - local player_name = player:get_player_name() - local nodepalette = "extended" - local showall = unifieddyes.player_showall[player_name] - - local last_right_click = unifieddyes.player_last_right_clicked[player_name] - if last_right_click and last_right_click.def then - if last_right_click.def.palette then - if last_right_click.def.palette == "unifieddyes_palette_colorwallmounted.png" then - nodepalette = "wallmounted" - elseif last_right_click.def.palette ~= "unifieddyes_palette_extended.png" then - nodepalette = "split" - end - end - end - - if fields.show_all then - unifieddyes.player_showall[player_name] = true - unifieddyes.show_airbrush_form(player) - return - elseif fields.show_avail then - unifieddyes.player_showall[player_name] = false - unifieddyes.show_airbrush_form(player) - return - elseif fields.quit then - if fields.accept then - local dye = unifieddyes.player_selected_dye[player_name] - if not dye then - minetest.chat_send_player(player_name, "*** Clicked \"Accept\", but no color was selected!") - return - elseif not showall - and not unifieddyes.palette_has_color[nodepalette.."_"..string.sub(dye, 5)] then - minetest.chat_send_player(player_name, "*** Clicked \"Accept\", but the selected color can't be used on the") - minetest.chat_send_player(player_name, "*** node that was right-clicked (and \"Show All\" wasn't in effect).") - if unifieddyes.player_current_dye[player_name] then - minetest.chat_send_player(player_name, "*** Ignoring it and sticking with "..string.sub(unifieddyes.player_current_dye[player_name], 5)..".") - else - minetest.chat_send_player(player_name, "*** Ignoring it.") - end - return - else - unifieddyes.player_current_dye[player_name] = dye - unifieddyes.player_selected_dye[player_name] = nil - minetest.chat_send_player(player_name, "*** Selected "..string.sub(dye, 5).." for the airbrush.") - return - end - else -- assume "Cancel" or Esc. - unifieddyes.player_selected_dye[player_name] = nil - return - end - else - local s1 = string.sub(minetest.serialize(fields), 11) - local s3 = string.sub(s1,1, string.find(s1, '"')-1) - - local inv = player:get_inventory() - local creative = creative and creative.is_enabled_for(player_name) - local dye = "dye:"..s3 - - if (showall or unifieddyes.palette_has_color[nodepalette.."_"..s3]) and - (minetest.registered_items[dye] and (creative or inv:contains_item("main", dye))) then - unifieddyes.player_selected_dye[player_name] = dye - unifieddyes.show_airbrush_form(player) - end - end - end -end) - --- Generate all dyes that are not part of the default minetest_game dyes mod - -for _, h in ipairs(unifieddyes.HUES_EXTENDED) do - local hue = h[1] - local r = h[2] - local g = h[3] - local b = h[4] - - for v = 0, 6 do - local val = unifieddyes.VALS_EXTENDED[v+1] - - local factor = 40 - if v > 3 then factor = 75 end - - local r2 = math.max(math.min(r + (4-v)*factor, 255), 0) - local g2 = math.max(math.min(g + (4-v)*factor, 255), 0) - local b2 = math.max(math.min(b + (4-v)*factor, 255), 0) - - -- full-sat color - - local desc = hue:gsub("%a", string.upper, 1).." Dye" - - if val ~= "" then - desc = val:sub(1, -2):gsub("%a", string.upper, 1) .." "..desc - end - - local color = string.format("%02x", r2)..string.format("%02x", g2)..string.format("%02x", b2) - if minetest.registered_items["dye:"..val..hue] then - minetest.override_item("dye:"..val..hue, { - inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200", - }) - else - if (val..hue) ~= "medium_orange" - and (val..hue) ~= "light_red" then - minetest.register_craftitem(":dye:"..val..hue, { - description = S(desc), - inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200", - groups = { dye=1, not_in_creative_inventory=1 }, - }) - end - end - minetest.register_alias("unifieddyes:"..val..hue, "dye:"..val..hue) - - if v > 3 then -- also register the low-sat version - - local pr = 0.299 - local pg = 0.587 - local pb = 0.114 - - local p = math.sqrt(r2*r2*pr + g2*g2*pg + b2*b2*pb) - local r3 = math.floor(p+(r2-p)*0.5) - local g3 = math.floor(p+(g2-p)*0.5) - local b3 = math.floor(p+(b2-p)*0.5) - - local color = string.format("%02x", r3)..string.format("%02x", g3)..string.format("%02x", b3) - - minetest.register_craftitem(":dye:"..val..hue.."_s50", { - description = S(desc.." (low saturation)"), - inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200", - groups = { dye=1, not_in_creative_inventory=1 }, - }) - minetest.register_alias("unifieddyes:"..val..hue.."_s50", "dye:"..val..hue.."_s50") - end - end -end - --- register the greyscales too :P - -for y = 1, 14 do -- colors 0 and 15 are black and white, default dyes - - if y ~= 4 and y ~= 8 and y~= 11 then -- don't register the three greys, they're done separately. - - local rgb = string.format("%02x", y*17)..string.format("%02x", y*17)..string.format("%02x", y*17) - local name = "grey_"..y - local desc = "Grey Dye #"..y - - minetest.register_craftitem(":dye:"..name, { - description = S(desc), - inventory_image = "unifieddyes_dye.png^[colorize:#"..rgb..":200", - groups = { dye=1, not_in_creative_inventory=1 }, - }) - minetest.register_alias("unifieddyes:"..name, "dye:"..name) - end -end - -minetest.override_item("dye:grey", { - inventory_image = "unifieddyes_dye.png^[colorize:#888888:200", -}) - -minetest.override_item("dye:dark_grey", { - inventory_image = "unifieddyes_dye.png^[colorize:#444444:200", -}) - -minetest.register_craftitem(":dye:light_grey", { - description = S("Light grey Dye"), - inventory_image = "unifieddyes_dye.png^[colorize:#cccccc:200", - groups = { dye=1, not_in_creative_inventory=1 }, -}) - --- build a table of color <-> palette associations to reduce the need for --- realtime lookups with getpaletteidx() - -for _, palette in ipairs({"extended", "split", "wallmounted"}) do - local palette2 = palette - - for i in ipairs(unifieddyes.SATS) do - local sat = (palette == "wallmounted") and "" or unifieddyes.SATS[i] - for _, hue in ipairs(unifieddyes.HUES_EXTENDED) do - for _, val in ipairs(unifieddyes.VALS_EXTENDED) do - local color = val..hue[1]..sat - if unifieddyes.getpaletteidx("dye:"..color, palette2) then - unifieddyes.palette_has_color[palette.."_"..color] = true - end - end - end - end - - for y = 0, 15 do - local grey = "grey_"..y - - if y == 0 then grey = "black" - elseif y == 4 then grey = "dark_grey" - elseif y == 8 then grey = "grey" - elseif y == 11 then grey = "light_grey" - elseif y == 15 then grey = "white" - end - if unifieddyes.getpaletteidx("dye:"..grey, palette2) then - unifieddyes.palette_has_color[palette.."_"..grey] = true - end - end -end - -unifieddyes.palette_has_color["wallmounted_light_red"] = true - --- crafting! - -unifieddyes.base_color_crafts = { - { "red", "flowers:rose", nil, nil, nil, nil, 4 }, - { "vermilion", "dye:red", "dye:orange", nil, nil, nil, 3 }, - { "orange", "flowers:tulip", nil, nil, nil, nil, 4 }, - { "orange", "dye:red", "dye:yellow", nil, nil, nil, 2 }, - { "amber", "dye:orange", "dye:yellow", nil, nil, nil, 2 }, - { "yellow", "flowers:dandelion_yellow", nil, nil, nil, nil, 4 }, - { "lime", "dye:yellow", "dye:chartreuse", nil, nil, nil, 2 }, - { "lime", "dye:yellow", "dye:yellow", "dye:green", nil, nil, 3 }, - { "chartreuse", "dye:yellow", "dye:green", nil, nil, nil, 2 }, - { "harlequin", "dye:chartreuse", "dye:green", nil, nil, nil, 2 }, - { "harlequin", "dye:yellow", "dye:green", "dye:green", nil, nil, 3 }, - { "green", "default:cactus", nil, nil, nil, nil, 4 }, - { "green", "dye:yellow", "dye:blue", nil, nil, nil, 2 }, - { "malachite", "dye:green", "dye:spring", nil, nil, nil, 2 }, - { "malachite", "dye:green", "dye:green", "dye:cyan", nil, nil, 3 }, - { "malachite", "dye:green", "dye:green", "dye:green", "dye:blue", nil, 4 }, - { "spring", "dye:green", "dye:cyan", nil, nil, nil, 2 }, - { "spring", "dye:green", "dye:green", "dye:blue", nil, nil, 3 }, - { "turquoise", "dye:spring", "dye:cyan", nil, nil, nil, 2 }, - { "turquoise", "dye:green", "dye:cyan", "dye:cyan", nil, nil, 3 }, - { "turquoise", "dye:green", "dye:green", "dye:green", "dye:blue", "dye:blue", 5 }, - { "cyan", "dye:green", "dye:blue", nil, nil, nil, 2 }, - { "cerulean", "dye:cyan", "dye:azure", nil, nil, nil, 2 }, - { "cerulean", "dye:cyan", "dye:cyan", "dye:blue", nil, nil, 3 }, - { "cerulean", "dye:green", "dye:green", "dye:blue", "dye:blue", "dye:blue", 5 }, - { "azure", "dye:cyan", "dye:blue", nil, nil, nil, 2 }, - { "azure", "dye:green", "dye:blue", "dye:blue", nil, nil, 3 }, - { "sapphire", "dye:azure", "dye:blue", nil, nil, nil, 2 }, - { "sapphire", "dye:cyan", "dye:blue", "dye:blue", nil, nil, 3 }, - { "sapphire", "dye:green", "dye:blue", "dye:blue", "dye:blue", nil, 4 }, - { "blue", "flowers:geranium", nil, nil, nil, nil, 4 }, - { "indigo", "dye:blue", "dye:violet", nil, nil, nil, 2 }, - { "violet", "flowers:viola", nil, nil, nil, nil, 4 }, - { "violet", "dye:blue", "dye:magenta", nil, nil, nil, 2 }, - { "mulberry", "dye:violet", "dye:magenta", nil, nil, nil, 2 }, - { "mulberry", "dye:violet", "dye:blue", "dye:red", nil, nil, 3 }, - { "magenta", "dye:blue", "dye:red", nil, nil, nil, 2 }, - { "fuchsia", "dye:magenta", "dye:rose", nil, nil, nil, 2 }, - { "fuchsia", "dye:blue", "dye:red", "dye:rose", nil, nil, 3 }, - { "fuchsia", "dye:red", "dye:violet", nil, nil, nil, 2 }, - { "rose", "dye:magenta", "dye:red", nil, nil, nil, 2 }, - { "rose", "dye:red", "dye:red", "dye:blue", nil, nil, 3 }, - { "crimson", "dye:rose", "dye:red", nil, nil, nil, 2 }, - { "crimson", "dye:magenta", "dye:red", "dye:red", nil, nil, 3 }, - { "crimson", "dye:red", "dye:red", "dye:red", "dye:blue", nil, 4 }, - - { "black", "default:coal_lump", nil, nil, nil, nil, 4 }, - { "white", "flowers:dandelion_white", nil, nil, nil, nil, 4 }, -} - -unifieddyes.shade_crafts = { - { "faint_", "", "dye:white", "dye:white", "dye:white", 4 }, - { "pastel_", "", "dye:white", "dye:white", nil, 3 }, - { "light_", "", "dye:white", nil, nil, 2 }, - { "bright_", "", "color", "dye:white", nil, 3 }, - { "", "_s50", "dye:light_grey", nil, nil, 2 }, - { "", "_s50", "dye:black", "dye:white", "dye:white", 3 }, - { "medium_", "", "dye:black", nil, nil, 2 }, - { "medium_", "_s50", "dye:grey", nil, nil, 2 }, - { "medium_", "_s50", "dye:black", "dye:white", nil, 3 }, - { "dark_", "", "dye:black", "dye:black", nil, 3 }, - { "dark_", "_s50", "dye:dark_grey", nil, nil, 2 }, - { "dark_", "_s50", "dye:black", "dye:black", "dye:white", 4 }, -} - -for _,i in ipairs(unifieddyes.base_color_crafts) do - local color = i[1] - local yield = i[7] - - minetest.register_craft( { - type = "shapeless", - output = "dye:"..color.." "..yield, - recipe = { - i[2], - i[3], - i[4], - i[5], - i[6], - }, - }) - - for _,j in ipairs(unifieddyes.shade_crafts) do - local firstdye = j[3] - if firstdye == "color" then firstdye = "dye:"..color end - - -- ignore black, white, anything containing the word "grey" - - if color ~= "black" and color ~= "white" and not string.find(color, "grey") then - - minetest.register_craft( { - type = "shapeless", - output = "dye:"..j[1]..color..j[2].." "..j[6], - recipe = { - "dye:"..color, - firstdye, - j[4], - j[5] - }, - }) - end - end -end - --- greys - -unifieddyes.greymixes = { - { 1, "dye:black", "dye:black", "dye:black", "dye:dark_grey", 4 }, - { 2, "dye:black", "dye:black", "dye:dark_grey", nil, 3 }, - { 3, "dye:black", "dye:dark_grey", nil, nil, 2 }, - { 4, "dye:white", "dye:black", "dye:black", nil, 3 }, - { 5, "dye:dark_grey", "dye:dark_grey", "dye:grey", nil, 3 }, - { 6, "dye:dark_grey", "dye:grey", nil, nil, 2 }, - { 7, "dye:dark_grey", "dye:grey", "dye:grey", nil, 3 }, - { 8, "dye:white", "dye:black", nil, nil, 2 }, - { 9, "dye:grey", "dye:grey", "dye:light_grey", nil, 3 }, - { 10, "dye:grey", "dye:light_grey", "dye:light_grey", nil, 3 }, - { 11, "dye:white", "dye:white", "dye:black", nil, 3 }, - { 12, "dye:light_grey", "dye:light_grey", "dye:white", nil, 3 }, - { 13, "dye:light_grey", "dye:white", nil, nil, 2 }, - { 14, "dye:white", "dye:white", "dye:light_grey", nil, 3 }, -} - -for _, i in ipairs(unifieddyes.greymixes) do - local shade = i[1] - local dye1 = i[2] - local dye2 = i[3] - local dye3 = i[4] - local dye4 = i[5] - local yield = i[6] - local color = "grey_"..shade - if shade == 4 then - color = "dark_grey" - elseif shade == 8 then - color = "grey" - elseif shade == 11 then - color = "light_grey" - end - - minetest.register_craft( { - type = "shapeless", - output = "dye:"..color.." "..yield, - recipe = { - dye1, - dye2, - dye3, - dye4, - }, - }) -end - --- we can't make dark orange anymore because brown/medium orange conflicts - -minetest.register_craft( { - type = "shapeless", - output = "dye:dark_orange", - recipe = { - "dye:brown", - "dye:brown" - }, -}) - --- aliases - -minetest.register_alias("dye:light_red", "dye:pink") -minetest.register_alias("dye:medium_orange", "dye:brown") - -minetest.register_alias("unifieddyes:black", "dye:black") -minetest.register_alias("unifieddyes:dark_grey", "dye:dark_grey") -minetest.register_alias("unifieddyes:grey", "dye:grey") -minetest.register_alias("unifieddyes:light_grey", "dye:light_grey") -minetest.register_alias("unifieddyes:white", "dye:white") - -minetest.register_alias("unifieddyes:grey_0", "dye:black") -minetest.register_alias("unifieddyes:grey_4", "dye:dark_grey") -minetest.register_alias("unifieddyes:grey_8", "dye:grey") -minetest.register_alias("unifieddyes:grey_11", "dye:light_grey") -minetest.register_alias("unifieddyes:grey_15", "dye:white") - -minetest.register_alias("unifieddyes:white_paint", "dye:white") -minetest.register_alias("unifieddyes:titanium_dioxide", "dye:white") -minetest.register_alias("unifieddyes:lightgrey_paint", "dye:light_grey") -minetest.register_alias("unifieddyes:grey_paint", "dye:grey") -minetest.register_alias("unifieddyes:darkgrey_paint", "dye:dark_grey") -minetest.register_alias("unifieddyes:carbon_black", "dye:black") - -minetest.register_alias("unifieddyes:brown", "dye:brown") +dofile(modpath.."/color-tables.lua") +dofile(modpath.."/api.lua") +dofile(modpath.."/airbrush.lua") +dofile(modpath.."/dyes-crafting.lua") +dofile(modpath.."/aliases.lua") print(S("[UnifiedDyes] Loaded!")) -