update homedecor and unified dyes

master
Vanessa Dannenberg 2021-03-26 23:43:35 -04:00
parent cfe808cd91
commit 547e44d1b5
56 changed files with 4016 additions and 2442 deletions

View File

@ -1 +1 @@
20210325-1929
20210326-2343

View File

@ -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,

View File

@ -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')

View File

@ -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")

View File

@ -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
})

View File

@ -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

View File

@ -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

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 B

After

Width:  |  Height:  |  Size: 112 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 190 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 315 B

After

Width:  |  Height:  |  Size: 532 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 265 B

After

Width:  |  Height:  |  Size: 381 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 561 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 358 B

After

Width:  |  Height:  |  Size: 286 B

View File

@ -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")

View File

@ -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')

View File

@ -1,3 +1,4 @@
name = homedecor_tables
description = Homedecor mod: tables
depends = homedecor_common, default, basic_materials
optional_depends = creative

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 B

View File

Before

Width:  |  Height:  |  Size: 189 B

After

Width:  |  Height:  |  Size: 189 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 146 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 241 B

After

Width:  |  Height:  |  Size: 597 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 713 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 358 B

After

Width:  |  Height:  |  Size: 642 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 334 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 331 B

After

Width:  |  Height:  |  Size: 476 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 357 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 325 B

After

Width:  |  Height:  |  Size: 439 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 576 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 465 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 652 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 529 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 573 B

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 982 B

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 901 B

View File

@ -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
})

View File

@ -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")

494
mods/unifieddyes/api.lua Normal file
View File

@ -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

View File

@ -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
}

View File

@ -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" }
},
})

File diff suppressed because it is too large Load Diff