Compare commits
	
		
			21 Commits
		
	
	
		
			2018-09-08
			...
			5039a8ce07
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					5039a8ce07 | ||
| 
						 | 
					13a8cbb38f | ||
| 
						 | 
					58dd71e561 | ||
| 
						 | 
					1fd850d37c | ||
| 
						 | 
					334de564fd | ||
| 
						 | 
					545968517b | ||
| 
						 | 
					368205d3b8 | ||
| 
						 | 
					feed6d5aae | ||
| 
						 | 
					4811847655 | ||
| 
						 | 
					44629935d2 | ||
| 
						 | 
					ccbedcd3d6 | ||
| 
						 | 
					622d09a243 | ||
| 
						 | 
					27fe090395 | ||
| 
						 | 
					230ac1342a | ||
| 
						 | 
					e921095006 | ||
| 
						 | 
					3eb3a9a330 | ||
| 
						 | 
					078a998d29 | ||
| 
						 | 
					4b88997360 | ||
| 
						 | 
					ef7d357e0b | ||
| 
						 | 
					66774213e2 | ||
| 
						 | 
					ad21862eee | 
							
								
								
									
										7
									
								
								API.md
									
									
									
									
									
								
							
							
						
						@@ -117,12 +117,17 @@ This will loop through all of Unified Dyes' color lists, generating one recipe f
 | 
			
		||||
 | 
			
		||||
`recipe` is the same as in the normal call, except that Unified Dyes will replace all instances of the string "NEUTRAL_NODE" with the item specified in the preceding `neutral_node` field.  Every instance of "MAIN_DYE" will be replaced with a portion of dye, as Unified Dyes' recipe helper works through its color lists (i.e. this field will become whatever dye is needed for each recipe).
 | 
			
		||||
 | 
			
		||||
`output_prefix` and `output_suffix`, if specified (must use both if at all), will cause the recipe registration to ignore the usual `output` field, and instead set to the output item to `output_prefix` + (hue) + `output_suffix`.  Used for mods that use the split 89-color palette.  `hue` will thus be one of the 12 hues, or "grey", as defined by the split palettes.
 | 
			
		||||
`output_prefix` and `output_suffix`, if specified (must use both if at all), will cause the recipe registration to set to the output item to `output_prefix` + (hue) + `output_suffix` + `output`.  Used for mods that use the split 89-color palette.  `hue` will thus be one of the 12 hues, or "grey", as defined by the split palettes.  In this situation, you can set `output` to your recipe yield (with a leading space) if needed.  For example, if the prefix is "foo:bar", the suffix is "baz", and the output is set to " 3", then the craft helper will generate output item strings of the form "foo:bar_COLOR_baz 3", for each color in the table.
 | 
			
		||||
 | 
			
		||||
**`unifieddyes.make_colored_itemstack(itemstack, palette, color)`**
 | 
			
		||||
 | 
			
		||||
Makes a colored itemstack out of the given `itemstack` and `color` (as a dye, e.g. "dye:dark_red_s50"), setting the correct index per the `palette` field, which works as described above for `unifieddyes.getpaletteidx()`.  Said itemstack is returned as a string suitable for use as the output field of a craft recipe, equal in size to the itemstack passed into the function (e.g. if you give it "mymod:colored_node 7", it'll return a stack of 7 colored items).
 | 
			
		||||
 | 
			
		||||
**`unifieddyes.generate_split_palette_nodes(name, def, drop)`**
 | 
			
		||||
 | 
			
		||||
Does just what it sounds like - it registers all the nodes that are needed for a given base node (`def`) to be able to use the split palette, each named according to `name`, with the palette hue appended.  If a custom drop is needed, it can be passed along (only a string is allowed here, specifying a single item).  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#### Tables
 | 
			
		||||
 | 
			
		||||
In addition to the above API calls, Unified Dyes provides several useful tables
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										90
									
								
								colors.txt
									
									
									
									
									
								
							
							
						
						@@ -1,90 +0,0 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Full-saturation colors:
 | 
			
		||||
-----------------------
 | 
			
		||||
 | 
			
		||||
dark aqua                          0, 84, 42  unifieddyes_dark_aqua.png
 | 
			
		||||
dark blue                          0,  0, 84  unifieddyes_dark_blue.png
 | 
			
		||||
dark cyan                          0, 84, 83  unifieddyes_dark_cyan.png
 | 
			
		||||
dark green                         0, 84,  0  unifieddyes_dark_green.png
 | 
			
		||||
dark lime                         43, 84,  0  unifieddyes_dark_lime.png
 | 
			
		||||
dark magenta                      84,  0, 83  unifieddyes_dark_magenta.png
 | 
			
		||||
dark orange                       84, 42,  0  unifieddyes_dark_orange.png
 | 
			
		||||
dark red                          84,  0,  0  unifieddyes_dark_red.png
 | 
			
		||||
dark redviolet                    84,  0, 42  unifieddyes_dark_redviolet.png
 | 
			
		||||
dark skyblue                       0, 42, 84  unifieddyes_dark_skyblue.png
 | 
			
		||||
dark violet                       43,  0, 84  unifieddyes_dark_violet.png
 | 
			
		||||
dark yellow                       84, 83,  0  unifieddyes_dark_yellow.png
 | 
			
		||||
medium aqua                        0,169, 84  unifieddyes_medium_aqua.png
 | 
			
		||||
medium blue                        0,  0,169  unifieddyes_medium_blue.png
 | 
			
		||||
medium cyan                        0,169,167  unifieddyes_medium_cyan.png
 | 
			
		||||
medium green                       0,169,  0  unifieddyes_medium_green.png
 | 
			
		||||
medium lime                       87,169,  0  unifieddyes_medium_lime.png
 | 
			
		||||
medium magenta                   169,  0,167  unifieddyes_medium_magenta.png
 | 
			
		||||
medium orange                    169, 84,  0  unifieddyes_medium_orange.png
 | 
			
		||||
medium red                       168,  0,  0  unifieddyes_medium_red.png
 | 
			
		||||
medium redviolet                 169,  0, 84  unifieddyes_medium_redviolet.png
 | 
			
		||||
medium skyblue                     0, 84,169  unifieddyes_medium_skyblue.png
 | 
			
		||||
medium violet                     87,  0,169  unifieddyes_medium_violet.png
 | 
			
		||||
medium yellow                    169,167,  0  unifieddyes_medium_yellow.png
 | 
			
		||||
aqua                               1,255,127  unifieddyes_aqua.png
 | 
			
		||||
blue                               1,  1,255  unifieddyes_blue.png
 | 
			
		||||
cyan                               1,255,252  unifieddyes_cyan.png
 | 
			
		||||
green                              1,255,  1  unifieddyes_green.png
 | 
			
		||||
lime                             132,255,  1  unifieddyes_lime.png
 | 
			
		||||
magenta                          255,  1,252  unifieddyes_magenta.png
 | 
			
		||||
orange                           255,127,  1  unifieddyes_orange.png
 | 
			
		||||
red                              255,  0,  0  unifieddyes_red.png
 | 
			
		||||
redviolet                        255,  1,127  unifieddyes_redviolet.png
 | 
			
		||||
skyblue                            1,127,255  unifieddyes_skyblue.png
 | 
			
		||||
violet                           132,  1,255  unifieddyes_violet.png
 | 
			
		||||
yellow                           255,252,  1  unifieddyes_yellow.png
 | 
			
		||||
 | 
			
		||||
Low-saturation colors:
 | 
			
		||||
----------------------
 | 
			
		||||
 | 
			
		||||
dark aqua 50% saturation          21, 63, 42  unifieddyes_dark_aqua_s50.png
 | 
			
		||||
dark blue 50% saturation          21, 21, 63  unifieddyes_dark_blue_s50.png
 | 
			
		||||
dark cyan 50% saturation          21, 63, 63  unifieddyes_dark_cyan_s50.png
 | 
			
		||||
dark green 50% saturation         21, 63, 21  unifieddyes_dark_green_s50.png
 | 
			
		||||
dark lime 50% saturation          43, 63, 21  unifieddyes_dark_lime_s50.png
 | 
			
		||||
dark magenta 50% saturation       63, 21, 63  unifieddyes_dark_magenta_s50.png
 | 
			
		||||
dark orange 50% saturation        63, 42, 21  unifieddyes_dark_orange_s50.png
 | 
			
		||||
dark red 50% saturation           63, 21, 21  unifieddyes_dark_red_s50.png
 | 
			
		||||
dark redviolet 50% saturation     63, 21, 42  unifieddyes_dark_redviolet_s50.png
 | 
			
		||||
dark skyblue 50% saturation       21, 42, 63  unifieddyes_dark_skyblue_s50.png
 | 
			
		||||
dark violet 50% saturation        43, 21, 63  unifieddyes_dark_violet_s50.png
 | 
			
		||||
dark yellow 50% saturation        63, 63, 21  unifieddyes_dark_yellow_s50.png
 | 
			
		||||
medium aqua 50% saturation        42,126, 84  unifieddyes_medium_aqua_s50.png
 | 
			
		||||
medium blue 50% saturation        42, 42,126  unifieddyes_medium_blue_s50.png
 | 
			
		||||
medium cyan 50% saturation        42,126,126  unifieddyes_medium_cyan_s50.png
 | 
			
		||||
medium green 50% saturation       42,126, 42  unifieddyes_medium_green_s50.png
 | 
			
		||||
medium lime 50% saturation        86,126, 42  unifieddyes_medium_lime_s50.png
 | 
			
		||||
medium magenta 50% saturation    126, 42,126  unifieddyes_medium_magenta_s50.png
 | 
			
		||||
medium orange 50% saturation     126, 84, 42  unifieddyes_medium_orange_s50.png
 | 
			
		||||
medium red 50% saturation        127, 42, 42  unifieddyes_medium_red_s50.png
 | 
			
		||||
medium redviolet 50% saturation  126, 42, 84  unifieddyes_medium_redviolet_s50.png
 | 
			
		||||
medium skyblue 50% saturation     42, 84,126  unifieddyes_medium_skyblue_s50.png
 | 
			
		||||
medium violet 50% saturation      86, 42,126  unifieddyes_medium_violet_s50.png
 | 
			
		||||
medium yellow 50% saturation     126,126, 42  unifieddyes_medium_yellow_s50.png
 | 
			
		||||
aqua 50% saturation               65,191,127  unifieddyes_aqua_s50.png
 | 
			
		||||
blue 50% saturation               65, 65,191  unifieddyes_blue_s50.png
 | 
			
		||||
cyan 50% saturation               65,191,190  unifieddyes_cyan_s50.png
 | 
			
		||||
green 50% saturation              65,191, 65  unifieddyes_green_s50.png
 | 
			
		||||
lime 50% saturation              130,191, 65  unifieddyes_lime_s50.png
 | 
			
		||||
magenta 50% saturation           191, 65,190  unifieddyes_magenta_s50.png
 | 
			
		||||
orange 50% saturation            191,127, 65  unifieddyes_orange_s50.png
 | 
			
		||||
red 50% saturation               192, 64, 64  unifieddyes_red_s50.png
 | 
			
		||||
redviolet 50% saturation         191, 65,127  unifieddyes_redviolet_s50.png
 | 
			
		||||
skyblue 50% saturation            65,127,191  unifieddyes_skyblue_s50.png
 | 
			
		||||
violet 50% saturation            130, 65,191  unifieddyes_violet_s50.png
 | 
			
		||||
yellow 50% saturation            191,190, 65  unifieddyes_yellow_s50.png
 | 
			
		||||
 | 
			
		||||
Greyscale:
 | 
			
		||||
----------
 | 
			
		||||
 | 
			
		||||
black                              0,  0,  0  unifieddyes_black.png
 | 
			
		||||
dark grey                         64, 64, 64  unifieddyes_darkgrey_paint.png
 | 
			
		||||
medium grey                      128,128,128  unifieddyes_grey_paint.png
 | 
			
		||||
light grey                       192,192,192  unifieddyes_lightgrey_paint.png
 | 
			
		||||
white                            255,255,255  unifieddyes_white_paint.png
 | 
			
		||||
							
								
								
									
										385
									
								
								init.lua
									
									
									
									
									
								
							
							
						
						@@ -41,23 +41,6 @@ else
 | 
			
		||||
	S = function(s) return s end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- helper functions for other mods that use this one
 | 
			
		||||
 | 
			
		||||
unifieddyes.HUES = {
 | 
			
		||||
	"red",
 | 
			
		||||
	"orange",
 | 
			
		||||
	"yellow",
 | 
			
		||||
	"lime",
 | 
			
		||||
	"green",
 | 
			
		||||
	"aqua",
 | 
			
		||||
	"cyan",
 | 
			
		||||
	"skyblue",
 | 
			
		||||
	"blue",
 | 
			
		||||
	"violet",
 | 
			
		||||
	"magenta",
 | 
			
		||||
	"redviolet"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
-- the names of the various colors here came from http://www.procato.com/rgb+index/
 | 
			
		||||
 | 
			
		||||
unifieddyes.HUES_EXTENDED = {
 | 
			
		||||
@@ -87,6 +70,13 @@ unifieddyes.HUES_EXTENDED = {
 | 
			
		||||
	{ "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",
 | 
			
		||||
@@ -109,6 +99,14 @@ unifieddyes.VALS = {
 | 
			
		||||
	"dark_"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unifieddyes.VALS_SPLIT = {
 | 
			
		||||
	"faint_",
 | 
			
		||||
	"light_",
 | 
			
		||||
	"",
 | 
			
		||||
	"medium_",
 | 
			
		||||
	"dark_"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unifieddyes.VALS_EXTENDED = {
 | 
			
		||||
	"faint_",
 | 
			
		||||
	"pastel_",
 | 
			
		||||
@@ -130,7 +128,7 @@ unifieddyes.GREYS = {
 | 
			
		||||
unifieddyes.GREYS_EXTENDED = table.copy(unifieddyes.GREYS)
 | 
			
		||||
 | 
			
		||||
for i = 1, 14 do
 | 
			
		||||
	if i ~= 0 and i ~= 3 and i ~= 7 and i ~= 11 and i ~= 15 then
 | 
			
		||||
	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
 | 
			
		||||
@@ -159,8 +157,6 @@ unifieddyes.player_last_right_clicked = {}
 | 
			
		||||
unifieddyes.palette_has_color = {}
 | 
			
		||||
unifieddyes.player_showall = {}
 | 
			
		||||
 | 
			
		||||
--		unifieddyes.player_last_right_clicked[placer:get_player_name()] = {pos = pos, node = node, def = def}
 | 
			
		||||
 | 
			
		||||
-- 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.
 | 
			
		||||
@@ -176,20 +172,25 @@ minetest.register_on_placenode(
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		if not string.find(itemstack:to_string(), "palette_index") then
 | 
			
		||||
			local param2 = 0
 | 
			
		||||
			local param2
 | 
			
		||||
			local color = 0
 | 
			
		||||
 | 
			
		||||
			if def.palette == "unifieddyes_palette_extended.png" then
 | 
			
		||||
			if def.palette == "unifieddyes_palette_extended.png"
 | 
			
		||||
			  and def.paramtype2 == "color" then
 | 
			
		||||
				param2 = 240
 | 
			
		||||
				color = 240
 | 
			
		||||
			elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then
 | 
			
		||||
			elseif def.palette == "unifieddyes_palette_colorwallmounted.png"
 | 
			
		||||
			  and def.paramtype2 == "colorwallmounted" then
 | 
			
		||||
				param2 = newnode.param2 % 8
 | 
			
		||||
			else  -- it's a split palette
 | 
			
		||||
			elseif string.find(def.palette, "unifieddyes_palette_")
 | 
			
		||||
			  and def.paramtype2 == "colorfacedir" then -- it's a split palette
 | 
			
		||||
				param2 = newnode.param2 % 32
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			minetest.swap_node(pos, {name = newnode.name, param2 = param2})
 | 
			
		||||
			minetest.get_meta(pos):set_int("palette_index", color)
 | 
			
		||||
			if param2 then
 | 
			
		||||
				minetest.swap_node(pos, {name = newnode.name, param2 = param2})
 | 
			
		||||
				minetest.get_meta(pos):set_int("palette_index", color)
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
)
 | 
			
		||||
@@ -203,6 +204,35 @@ 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.make_colored_itemstack(item, palette, color)
 | 
			
		||||
@@ -215,13 +245,14 @@ 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, hue, sat, val)
 | 
			
		||||
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 ~= "extended" then
 | 
			
		||||
		if craft.palette == "wallmounted" then
 | 
			
		||||
			color = val..hue..sat
 | 
			
		||||
		else
 | 
			
		||||
			color = val..hue[1]..sat
 | 
			
		||||
			color = val..hue..sat
 | 
			
		||||
		end
 | 
			
		||||
	else
 | 
			
		||||
		color = hue -- if val is nil, then it's grey.
 | 
			
		||||
@@ -233,18 +264,19 @@ local function register_c(craft, hue, sat, val)
 | 
			
		||||
	recipe = string.gsub(recipe, "NEUTRAL_NODE", craft.neutral_node)
 | 
			
		||||
	local newrecipe = minetest.deserialize(recipe)
 | 
			
		||||
 | 
			
		||||
	local output = craft.output
 | 
			
		||||
	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
 | 
			
		||||
			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
 | 
			
		||||
				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
 | 
			
		||||
				output = craft.output_prefix.."red"..craft.output_suffix..coutput
 | 
			
		||||
			else
 | 
			
		||||
				output = craft.output_prefix..hue..craft.output_suffix
 | 
			
		||||
				output = craft.output_prefix..hue..craft.output_suffix..coutput
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
@@ -261,9 +293,9 @@ local function register_c(craft, hue, sat, val)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function unifieddyes.register_color_craft(craft)
 | 
			
		||||
	local hues_table = unifieddyes.HUES
 | 
			
		||||
	local hues_table = unifieddyes.HUES_EXTENDED
 | 
			
		||||
	local sats_table = unifieddyes.SATS
 | 
			
		||||
	local vals_table = unifieddyes.VALS
 | 
			
		||||
	local vals_table = unifieddyes.VALS_SPLIT
 | 
			
		||||
	local greys_table = unifieddyes.GREYS
 | 
			
		||||
 | 
			
		||||
	if craft.palette == "wallmounted" then
 | 
			
		||||
@@ -273,7 +305,6 @@ function unifieddyes.register_color_craft(craft)
 | 
			
		||||
		sats_table = {""}
 | 
			
		||||
		vals_table = unifieddyes.VALS
 | 
			
		||||
	elseif craft.palette == "extended" then
 | 
			
		||||
		hues_table = unifieddyes.HUES_EXTENDED
 | 
			
		||||
		vals_table = unifieddyes.VALS_EXTENDED
 | 
			
		||||
		greys_table = unifieddyes.GREYS_EXTENDED
 | 
			
		||||
	end
 | 
			
		||||
@@ -358,10 +389,10 @@ end
 | 
			
		||||
function unifieddyes.get_hsv(name) -- expects a node/item name
 | 
			
		||||
	local hue = ""
 | 
			
		||||
	local a,b
 | 
			
		||||
	for _, i in ipairs(unifieddyes.HUES) do
 | 
			
		||||
		a,b = string.find(name, "_"..i)
 | 
			
		||||
		if a and not ( string.find(name, "_redviolet") and i == "red" ) then
 | 
			
		||||
			hue = i
 | 
			
		||||
	for _, i in ipairs(unifieddyes.HUES_EXTENDED) do
 | 
			
		||||
		a,b = string.find(name, "_"..i[1])
 | 
			
		||||
		if a then
 | 
			
		||||
			hue = i[1]
 | 
			
		||||
			break
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
@@ -391,9 +422,10 @@ end
 | 
			
		||||
-- in the function below, color is just a color string, while
 | 
			
		||||
-- palette_type can be:
 | 
			
		||||
--
 | 
			
		||||
-- "split" = 89 color palette split into pieces for colorfacedir
 | 
			
		||||
-- "wallmounted" = 32-color abridged palette
 | 
			
		||||
-- "extended" = 256 color palette
 | 
			
		||||
-- "split" = 200 color palette split into pieces for colorfacedir
 | 
			
		||||
-- "wallmounted" = 32-color abridged palette
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function unifieddyes.getpaletteidx(color, palette_type)
 | 
			
		||||
 | 
			
		||||
@@ -417,7 +449,7 @@ function unifieddyes.getpaletteidx(color, palette_type)
 | 
			
		||||
		["grey_14"] = 1,
 | 
			
		||||
		["grey_13"] = 2,
 | 
			
		||||
		["grey_12"] = 3,
 | 
			
		||||
		["light_grey"] = 3,
 | 
			
		||||
		["light_grey"] = 4,
 | 
			
		||||
		["grey_11"] = 4,
 | 
			
		||||
		["grey_10"] = 5,
 | 
			
		||||
		["grey_9"] = 6,
 | 
			
		||||
@@ -442,24 +474,6 @@ function unifieddyes.getpaletteidx(color, palette_type)
 | 
			
		||||
		["black"] = 4,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	local hues = {
 | 
			
		||||
		["red"] = 1,
 | 
			
		||||
		["orange"] = 2,
 | 
			
		||||
		["yellow"] = 3,
 | 
			
		||||
		["lime"] = 4,
 | 
			
		||||
		["green"] = 5,
 | 
			
		||||
		["aqua"] = 6,
 | 
			
		||||
		["spring"] = 6,
 | 
			
		||||
		["cyan"] = 7,
 | 
			
		||||
		["skyblue"] = 8,
 | 
			
		||||
		["azure"] = 8,
 | 
			
		||||
		["blue"] = 9,
 | 
			
		||||
		["violet"] = 10,
 | 
			
		||||
		["magenta"] = 11,
 | 
			
		||||
		["redviolet"] = 12,
 | 
			
		||||
		["rose"] = 12,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	local hues_extended = {
 | 
			
		||||
		["red"] = 0,
 | 
			
		||||
		["vermilion"] = 1,
 | 
			
		||||
@@ -511,6 +525,17 @@ function unifieddyes.getpaletteidx(color, palette_type)
 | 
			
		||||
		["darks50"] = 7,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	local shades_split = {
 | 
			
		||||
		["faint"] = 0,
 | 
			
		||||
		[""] = 1,
 | 
			
		||||
		["s50"] = 2,
 | 
			
		||||
		["light"] = 3,
 | 
			
		||||
		["medium"] = 4,
 | 
			
		||||
		["mediums50"] = 5,
 | 
			
		||||
		["dark"] = 6,
 | 
			
		||||
		["darks50"] = 7,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	local shades_extended = {
 | 
			
		||||
		["faint"] = 0,
 | 
			
		||||
		["pastel"] = 1,
 | 
			
		||||
@@ -594,19 +619,8 @@ function unifieddyes.getpaletteidx(color, palette_type)
 | 
			
		||||
			shade = "light"
 | 
			
		||||
		end
 | 
			
		||||
		if palette_type == "split" then -- it's colorfacedir
 | 
			
		||||
 | 
			
		||||
			-- If using this palette, translate new color names back to old.
 | 
			
		||||
 | 
			
		||||
			if color == "spring" then
 | 
			
		||||
				color = "aqua"
 | 
			
		||||
			elseif color == "azure" then
 | 
			
		||||
				color = "skyblue"
 | 
			
		||||
			elseif color == "rose" then
 | 
			
		||||
				color = "redviolet"
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			if hues[color] and shades[shade] then
 | 
			
		||||
				return (shades[shade] * 32), hues[color]
 | 
			
		||||
			if hues_extended[color] and shades_split[shade] then
 | 
			
		||||
				return (shades_split[shade] * 32), hues_extended[color]+1
 | 
			
		||||
			end
 | 
			
		||||
		elseif palette_type == "extended" then
 | 
			
		||||
			if hues_extended[color] and shades_extended[shade] then
 | 
			
		||||
@@ -616,6 +630,19 @@ function unifieddyes.getpaletteidx(color, palette_type)
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function unifieddyes.get_color_from_dye_name(name)
 | 
			
		||||
	if name == "dye:black" then
 | 
			
		||||
		return "000000"
 | 
			
		||||
	elseif name == "dye:white" then
 | 
			
		||||
		return "ffffff"
 | 
			
		||||
	end
 | 
			
		||||
	local item = minetest.registered_items[name]
 | 
			
		||||
	if not item then return end
 | 
			
		||||
	local inv_image = item.inventory_image
 | 
			
		||||
	if not inv_image then return end
 | 
			
		||||
	return string.match(inv_image,"colorize:#(......):200")
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- punch-to-recolor using the airbrush
 | 
			
		||||
 | 
			
		||||
function unifieddyes.on_airbrush(itemstack, player, pointed_thing)
 | 
			
		||||
@@ -626,8 +653,28 @@ function unifieddyes.on_airbrush(itemstack, player, pointed_thing)
 | 
			
		||||
		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 return end
 | 
			
		||||
	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)
 | 
			
		||||
			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
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local node = minetest.get_node(pos)
 | 
			
		||||
	local def = minetest.registered_items[node.name]
 | 
			
		||||
@@ -638,29 +685,29 @@ function unifieddyes.on_airbrush(itemstack, player, pointed_thing)
 | 
			
		||||
		return
 | 
			
		||||
	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
 | 
			
		||||
 | 
			
		||||
	if not def.palette or not (def.groups and def.groups.ud_param2_colorable > 0) then
 | 
			
		||||
	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 def.palette == "unifieddyes_palette_extended.png" then
 | 
			
		||||
	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
 | 
			
		||||
	else
 | 
			
		||||
	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)
 | 
			
		||||
@@ -683,6 +730,7 @@ function unifieddyes.on_airbrush(itemstack, player, pointed_thing)
 | 
			
		||||
	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"
 | 
			
		||||
@@ -693,21 +741,21 @@ function unifieddyes.on_airbrush(itemstack, player, pointed_thing)
 | 
			
		||||
			newcolor = string.sub(painting_with, 5)
 | 
			
		||||
		else
 | 
			
		||||
			if hue ~= 0 then
 | 
			
		||||
				newcolor = unifieddyes.HUES[hue]
 | 
			
		||||
				newcolor = unifieddyes.HUES_EXTENDED[hue][1]
 | 
			
		||||
			else
 | 
			
		||||
				newcolor = "grey"
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			local s = string.sub(def.palette, 21)
 | 
			
		||||
			oldcolor = string.sub(s, 1, string.find(s, "s.png")-1)
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		if newcolor == "spring" then newcolor = "aqua"
 | 
			
		||||
		elseif newcolor == "azure" then newcolor = "skyblue"
 | 
			
		||||
		elseif newcolor == "rose" then newcolor = "redviolet"
 | 
			
		||||
			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
 | 
			
		||||
@@ -772,16 +820,16 @@ function unifieddyes.color_to_name(param2, def)
 | 
			
		||||
		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" 89-color palette
 | 
			
		||||
	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 v == 0 then return "white" end
 | 
			
		||||
		if color ~= "grey" then
 | 
			
		||||
			if v == 1 then return color
 | 
			
		||||
			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
 | 
			
		||||
@@ -799,10 +847,18 @@ end
 | 
			
		||||
 | 
			
		||||
local hps = 0.6 -- horizontal position scale
 | 
			
		||||
local vps = 1.3 -- vertical position scale
 | 
			
		||||
local vs = 0.3  -- vertical shift/offset
 | 
			
		||||
local color_button_size = ";0.75,0.75;"
 | 
			
		||||
local vs = 0.1 -- vertical shift/offset
 | 
			
		||||
 | 
			
		||||
function unifieddyes.make_colored_square(hexcolor, colorname, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv)
 | 
			
		||||
local color_button_size = ";0.75,0.75;"
 | 
			
		||||
local color_square_size = ";0.69,0.69;"
 | 
			
		||||
 | 
			
		||||
function unifieddyes.make_readable_color(color)
 | 
			
		||||
	local s = string.gsub(color, "_", " ")
 | 
			
		||||
	s = string.gsub(s, "s50", "(low saturation)")
 | 
			
		||||
	return s
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function unifieddyes.make_colored_square(hexcolor, colorname, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
 | 
			
		||||
 | 
			
		||||
	local dye = "dye:"..colorname
 | 
			
		||||
 | 
			
		||||
@@ -814,7 +870,8 @@ function unifieddyes.make_colored_square(hexcolor, colorname, showall, creative,
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local unavail_overlay = ""
 | 
			
		||||
	if not showall and not unifieddyes.palette_has_color[nodepalette.."_"..colorname] then
 | 
			
		||||
	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
 | 
			
		||||
@@ -822,18 +879,30 @@ function unifieddyes.make_colored_square(hexcolor, colorname, showall, creative,
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local tooltip = "tooltip["..colorname..";"..
 | 
			
		||||
					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["..colorname..";"..colorname.."]"
 | 
			
		||||
		selindic = "unifieddyes_white_square.png"..colorize..overlay..unavail_overlay.."]"..tooltip
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local form = "image_button["..
 | 
			
		||||
				(hp*hps)..","..(v2*vps+vs)..
 | 
			
		||||
				color_button_size..
 | 
			
		||||
				"unifieddyes_white_square.png"..colorize..overlay..unavail_overlay..";"..
 | 
			
		||||
				colorname..";]"..
 | 
			
		||||
				"tooltip["..colorname..";"..colorname.."]"
 | 
			
		||||
	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
 | 
			
		||||
@@ -850,7 +919,7 @@ function unifieddyes.show_airbrush_form(player)
 | 
			
		||||
	local nodepalette = "extended"
 | 
			
		||||
	local showall = unifieddyes.player_showall[player_name]
 | 
			
		||||
 | 
			
		||||
	t[1] = "size[15,8.5]label[7,-0.25;Select a color:]"
 | 
			
		||||
	t[1] = "size[14.5,8.5]label[7,-0.3;Select a color:]"
 | 
			
		||||
	local selindic = "unifieddyes_select_overlay.png^unifieddyes_question.png]"
 | 
			
		||||
 | 
			
		||||
	local last_right_click = unifieddyes.player_last_right_clicked[player_name]
 | 
			
		||||
@@ -861,16 +930,23 @@ function unifieddyes.show_airbrush_form(player)
 | 
			
		||||
			elseif last_right_click.def.palette == "unifieddyes_palette_extended.png" then
 | 
			
		||||
				t[#t+1] = "label[0.5,8.25;(Right-clicked a node that supports all 256 colors, showing them all)]"
 | 
			
		||||
				showall = true
 | 
			
		||||
			elseif last_right_click.def.palette ~= "unifieddyes_palette_extended.png" then
 | 
			
		||||
			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"
 | 
			
		||||
			elseif not string.find(last_right_click.def.palette, "unifieddyes_palette_") then
 | 
			
		||||
			t[#t+1] = "label[0.5,8.25;(Right-clicked a node not supported by the Airbrush, showing all colors)]"
 | 
			
		||||
			end
 | 
			
		||||
		else
 | 
			
		||||
			t[#t+1] = "label[0.5,8.25;(Right-clicked a non-colorable node, showing all colors)]"
 | 
			
		||||
		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;(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]
 | 
			
		||||
 | 
			
		||||
@@ -879,7 +955,7 @@ function unifieddyes.show_airbrush_form(player)
 | 
			
		||||
 | 
			
		||||
		for hi, h in ipairs(unifieddyes.HUES_EXTENDED) do
 | 
			
		||||
			local hue = h[1]
 | 
			
		||||
			local hp=hi-0.5
 | 
			
		||||
			local hp=hi-1
 | 
			
		||||
 | 
			
		||||
			local r = h[2]
 | 
			
		||||
			local g = h[3]
 | 
			
		||||
@@ -897,7 +973,7 @@ function unifieddyes.show_airbrush_form(player)
 | 
			
		||||
 | 
			
		||||
			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)
 | 
			
		||||
			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
 | 
			
		||||
 | 
			
		||||
@@ -907,7 +983,7 @@ function unifieddyes.show_airbrush_form(player)
 | 
			
		||||
 | 
			
		||||
			for hi, h in ipairs(unifieddyes.HUES_EXTENDED) do
 | 
			
		||||
				local hue = h[1]
 | 
			
		||||
				local hp=hi-0.5
 | 
			
		||||
				local hp=hi-1
 | 
			
		||||
 | 
			
		||||
				local r = h[2]
 | 
			
		||||
				local g = h[3]
 | 
			
		||||
@@ -930,7 +1006,7 @@ function unifieddyes.show_airbrush_form(player)
 | 
			
		||||
 | 
			
		||||
				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)
 | 
			
		||||
				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
 | 
			
		||||
@@ -939,7 +1015,7 @@ function unifieddyes.show_airbrush_form(player)
 | 
			
		||||
	local v2=5
 | 
			
		||||
	for y = 0, 15 do
 | 
			
		||||
 | 
			
		||||
		local hp=(15-y)+0.5
 | 
			
		||||
		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
 | 
			
		||||
@@ -952,54 +1028,58 @@ function unifieddyes.show_airbrush_form(player)
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		local f
 | 
			
		||||
		f, selindic = unifieddyes.make_colored_square(hexgrey, grey, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv)
 | 
			
		||||
		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.3,"
 | 
			
		||||
		t[#t+1] = (vps*5+vs)
 | 
			
		||||
		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[11.0,"
 | 
			
		||||
		t[#t+1] = (vps*5.02+vs)
 | 
			
		||||
		t[#t+1] = "unifieddyes_onhand_overlay.png]label[10.7,"
 | 
			
		||||
		t[#t+1] = (vps*5.51+vs)
 | 
			
		||||
		t[#t+1] = ";Dyes]"
 | 
			
		||||
		t[#t+1] = "label[11.0,"
 | 
			
		||||
		t[#t+1] = (vps*5.18+vs)
 | 
			
		||||
		t[#t+1] = "label[10.7,"
 | 
			
		||||
		t[#t+1] = (vps*5.67+vs)
 | 
			
		||||
		t[#t+1] = ";on hand]"
 | 
			
		||||
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	t[#t+1] = "image[11.9,"
 | 
			
		||||
	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[12.6,"
 | 
			
		||||
		t[#t+1] = (vps*5.02+vs)
 | 
			
		||||
		t[#t+1] = "label[10.7,"
 | 
			
		||||
		t[#t+1] = (vps*4.90+vs)
 | 
			
		||||
		t[#t+1] = ";Your selection:]"
 | 
			
		||||
		t[#t+1] = "label[12.6,"
 | 
			
		||||
		t[#t+1] = (vps*5.18+vs)
 | 
			
		||||
		t[#t+1] = "label[10.7,"
 | 
			
		||||
		t[#t+1] = (vps*5.07+vs)
 | 
			
		||||
		t[#t+1] = ";"
 | 
			
		||||
		t[#t+1] = 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] = "]"
 | 
			
		||||
		t[#t+1] = ")]"
 | 
			
		||||
	else
 | 
			
		||||
		t[#t+1] = "label[12.6,"
 | 
			
		||||
		t[#t+1] = (vps*5.1+vs)
 | 
			
		||||
		t[#t+1] = "label[10.7,"
 | 
			
		||||
		t[#t+1] = (vps*5.07+vs)
 | 
			
		||||
		t[#t+1] = ";Your selection]"
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	t[#t+1] = "button_exit[11,8;2,1;cancel;Cancel]button_exit[13,8;2,1;accept;Accept]"
 | 
			
		||||
	t[#t+1] = "button_exit[10.5,8;2,1;cancel;Cancel]button_exit[12.5,8;2,1;accept;Accept]"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	if last_right_click and last_right_click.def and last_right_click.def.palette and nodepalette ~= "extended" then
 | 
			
		||||
	if last_right_click and last_right_click.def and nodepalette ~= "extended" then
 | 
			
		||||
		if showall then
 | 
			
		||||
			t[#t+1] = "button[0.5,8;2,1;show_avail;Show Available]"
 | 
			
		||||
			t[#t+1] = "label[2.5,8.25;(Currently showing all 256 colors)]"
 | 
			
		||||
			t[#t+1] = "button[0,8;2,1;show_avail;Show Available]"
 | 
			
		||||
			t[#t+1] = "label[2,8.25;(Currently showing all 256 colors)]"
 | 
			
		||||
		else
 | 
			
		||||
			t[#t+1] = "button[0.5,8;2,1;show_all;Show All Colors]"
 | 
			
		||||
			t[#t+1] = "label[2.5,8.25;(Currently only showing what the right-clicked node can use)]"
 | 
			
		||||
			t[#t+1] = "button[0,8;2,1;show_all;Show All Colors]"
 | 
			
		||||
			t[#t+1] = "label[2,8.25;(Currently only showing what the right-clicked node can use)]"
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
@@ -1047,9 +1127,9 @@ minetest.register_tool("unifieddyes:airbrush", {
 | 
			
		||||
minetest.register_craft( {
 | 
			
		||||
	output = "unifieddyes:airbrush",
 | 
			
		||||
	recipe = {
 | 
			
		||||
		{ "default:gold_ingot", "",                    "bucket:bucket_empty" },
 | 
			
		||||
		{ "",                   "default:steel_ingot", ""                    },
 | 
			
		||||
		{ "",                   "",                    "default:steel_ingot" }
 | 
			
		||||
		{ "basic_materials:brass_ingot", "",           "basic_materials:plastic_sheet" },
 | 
			
		||||
		{ "",                   "default:steel_ingot", ""                              },
 | 
			
		||||
		{ "",                   "",                    "default:steel_ingot"           }
 | 
			
		||||
	},
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
@@ -1165,14 +1245,6 @@ for _, h in ipairs(unifieddyes.HUES_EXTENDED) do
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
		minetest.register_alias("unifieddyes:"..val..hue, "dye:"..val..hue)
 | 
			
		||||
		if h[1] == "spring" then
 | 
			
		||||
			minetest.register_alias("unifieddyes:"..val.."aqua", "dye:"..val.."spring")
 | 
			
		||||
		elseif h[1] == "azure" then
 | 
			
		||||
			minetest.register_alias("unifieddyes:"..val.."skyblue", "dye:"..val.."azure")
 | 
			
		||||
		elseif h[1] == "rose" then
 | 
			
		||||
			minetest.register_alias("unifieddyes:"..val.."redviolet", "dye:"..val.."rose")
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		if v > 3 then -- also register the low-sat version
 | 
			
		||||
 | 
			
		||||
@@ -1193,13 +1265,6 @@ for _, h in ipairs(unifieddyes.HUES_EXTENDED) do
 | 
			
		||||
				groups = { dye=1, not_in_creative_inventory=1 },
 | 
			
		||||
			})
 | 
			
		||||
			minetest.register_alias("unifieddyes:"..val..hue.."_s50", "dye:"..val..hue.."_s50")
 | 
			
		||||
			if h[1] == "spring" then
 | 
			
		||||
				minetest.register_alias("unifieddyes:"..val.."aqua_s50", "dye:"..val.."spring_s50")
 | 
			
		||||
			elseif h[1] == "azure" then
 | 
			
		||||
				minetest.register_alias("unifieddyes:"..val.."skyblue_s50", "dye:"..val.."azure_s50")
 | 
			
		||||
			elseif h[1] == "rose" then
 | 
			
		||||
				minetest.register_alias("unifieddyes:"..val.."redviolet_s50", "dye:"..val.."rose_s50")
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_palette_ambers.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 93 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_palette_azures.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 91 B  | 
| 
		 Before Width: | Height: | Size: 99 B After Width: | Height: | Size: 91 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_palette_ceruleans.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 93 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_palette_chartreuses.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 91 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_palette_crimsons.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 91 B  | 
| 
		 Before Width: | Height: | Size: 101 B After Width: | Height: | Size: 91 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_palette_fuchsias.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 93 B  | 
| 
		 Before Width: | Height: | Size: 91 B After Width: | Height: | Size: 91 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_palette_harlequins.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 91 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_palette_indigos.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 91 B  | 
| 
		 Before Width: | Height: | Size: 99 B After Width: | Height: | Size: 93 B  | 
| 
		 Before Width: | Height: | Size: 101 B After Width: | Height: | Size: 91 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_palette_malachites.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 91 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_palette_mulberrys.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 93 B  | 
| 
		 Before Width: | Height: | Size: 99 B After Width: | Height: | Size: 91 B  | 
| 
		 Before Width: | Height: | Size: 99 B After Width: | Height: | Size: 91 B  | 
| 
		 Before Width: | Height: | Size: 99 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_palette_roses.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 91 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_palette_sapphires.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 91 B  | 
| 
		 Before Width: | Height: | Size: 99 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_palette_springs.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 91 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_palette_turquoises.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 93 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_palette_vermilions.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 91 B  | 
| 
		 Before Width: | Height: | Size: 99 B After Width: | Height: | Size: 91 B  | 
| 
		 Before Width: | Height: | Size: 101 B After Width: | Height: | Size: 91 B  |