Compare commits
	
		
			36 Commits
		
	
	
		
			2018-08-27
			...
			2018-11-09
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 334de564fd | ||
|  | 545968517b | ||
|  | 368205d3b8 | ||
|  | feed6d5aae | ||
|  | 4811847655 | ||
|  | 44629935d2 | ||
|  | ccbedcd3d6 | ||
|  | 622d09a243 | ||
|  | 27fe090395 | ||
|  | 230ac1342a | ||
|  | e921095006 | ||
|  | 3eb3a9a330 | ||
|  | 078a998d29 | ||
|  | 4b88997360 | ||
|  | ef7d357e0b | ||
|  | 66774213e2 | ||
|  | ad21862eee | ||
|  | ad12387432 | ||
|  | 7b18314235 | ||
|  | 73a062f026 | ||
|  | 0413f23df1 | ||
|  | 8fbd9cd23b | ||
|  | 997d703b94 | ||
|  | 95f009a282 | ||
|  | fb2c14b4a8 | ||
|  | 42093582df | ||
|  | 3cbb25d92a | ||
|  | 0589d8f02e | ||
|  | fc199cced4 | ||
|  | da9ab7215c | ||
|  | 19febc877d | ||
|  | c3036aba00 | ||
|  | d53fb146dd | ||
|  | 5b1051f8ae | ||
|  | 62806f795e | ||
|  | 057baacf2d | 
							
								
								
									
										11
									
								
								API.md
									
									
									
									
									
								
							
							
						
						| @@ -28,7 +28,9 @@ minetest.register_node("mymod:colored_node", { | ||||
| - "unifieddyes_palette_colorwallmounted.png" | ||||
| - or one of the "split" hues palettes (see below). | ||||
|  | ||||
| `groups`: If your node can be colored by punching it with dye, its groups entry must contain the key ud_param2_colorable = 1, among whatever else you'd normally put there. If the node is software-controlled, as might be the case for some mesecons-digilines aware node, then this group key should be omitted. | ||||
| `groups`: If your node can be colored by using the airbrush, its groups entry must contain the key ud_param2_colorable = 1, among whatever else you'd normally put there. If the node is software-controlled, as might be the case for some mesecons-digilines aware node, then this group key should be omitted. | ||||
|  | ||||
| If your node if of the kind where you need the split palette, but you need to put the *full color name* into the node name, as opposed to just the hue, then add the keys `ud_color_start` and `ud_color_end` and set them to the positions of the first and last characters of the color name (where 1 is the first character of the mod name at the start of the node name, i.e. "mymod:foo_bar_orange_baz" would have the start set to 15 and the end at 20). | ||||
|  | ||||
| `on_construct`: see below. | ||||
|  | ||||
| @@ -115,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 | ||||
							
								
								
									
										679
									
								
								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_", | ||||
| @@ -155,6 +153,9 @@ local default_dyes = { | ||||
|  | ||||
| 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), | ||||
| @@ -171,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 | ||||
| 			elseif def.palette ~= "unifieddyes_palette.png" then -- 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 | ||||
| ) | ||||
| @@ -198,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) | ||||
| @@ -207,24 +242,17 @@ function unifieddyes.make_colored_itemstack(item, palette, color) | ||||
| 	return stack:to_string(),paletteidx | ||||
| end | ||||
|  | ||||
| -- if your node was once 89-color and uses an LBM to convert to the 256-color palette, | ||||
| -- call this in that node def's on_construct: | ||||
|  | ||||
| function unifieddyes.on_construct(pos) | ||||
| 	local meta = minetest.get_meta(pos) | ||||
| 	meta:set_string("palette", "ext") | ||||
| 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. | ||||
| @@ -236,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 ~= true then | ||||
| 			output = craft.output_prefix..color..craft.output_suffix | ||||
| 		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 | ||||
| 				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 | ||||
| @@ -264,19 +293,18 @@ 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 | ||||
| 		register_c(craft, "green", "", "light_") | ||||
| 		register_c(craft, "azure", "", "") | ||||
| 		register_c(craft, "blue", "", "light_") | ||||
| 		hues_table = unifieddyes.HUES_WALLMOUNTED | ||||
| 		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 | ||||
| @@ -361,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 | ||||
| @@ -394,10 +422,10 @@ end | ||||
| -- in the function below, color is just a color string, while | ||||
| -- palette_type can be: | ||||
| -- | ||||
| -- false/nil = standard 89 color palette | ||||
| -- true = 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) | ||||
|  | ||||
| @@ -446,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, | ||||
| @@ -515,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, | ||||
| @@ -546,7 +567,7 @@ function unifieddyes.getpaletteidx(color, palette_type) | ||||
| 		if grayscale_wallmounted[color] then | ||||
| 			return (grayscale_wallmounted[color] * 8), 0 | ||||
| 		end | ||||
| 	elseif palette_type == true then | ||||
| 	elseif palette_type == "split" then | ||||
| 		if grayscale[color] then | ||||
| 			return (grayscale[color] * 32), 0 | ||||
| 		end | ||||
| @@ -554,10 +575,6 @@ function unifieddyes.getpaletteidx(color, palette_type) | ||||
| 		if grayscale_extended[color] then | ||||
| 			return grayscale_extended[color]+240, 0 | ||||
| 		end | ||||
| 	else | ||||
| 		if grayscale[color] then | ||||
| 			return grayscale[color], 0 | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	local shade = "" -- assume full | ||||
| @@ -589,7 +606,7 @@ function unifieddyes.getpaletteidx(color, palette_type) | ||||
| 		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 == "azure" then return 40,5 | ||||
| 		elseif color == "blue" and shade == "light" then return 40,5 | ||||
| 		elseif hues_wallmounted[color] and shades_wallmounted[shade] then | ||||
| 			return (shades_wallmounted[shade] * 64 + hues_wallmounted[color] * 8), hues_wallmounted[color] | ||||
| 		end | ||||
| @@ -601,36 +618,14 @@ function unifieddyes.getpaletteidx(color, palette_type) | ||||
| 			color = "red" | ||||
| 			shade = "light" | ||||
| 		end | ||||
| 		if palette_type == true then -- it's colorfacedir, so "split" 89-color palette | ||||
|  | ||||
| 			-- 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 palette_type == "split" then -- it's colorfacedir | ||||
| 			if hues_extended[color] and shades_split[shade] then | ||||
| 				return (shades_split[shade] * 32), hues_extended[color]+1 | ||||
| 			end | ||||
| 		elseif palette_type == "extended" then | ||||
| 			if hues_extended[color] and shades_extended[shade] then | ||||
| 				return (hues_extended[color] + shades_extended[shade]*24), hues_extended[color] | ||||
| 			end | ||||
| 		else -- it's the regular 89-color palette, do the same translation if needed | ||||
| 			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 (hues[color] * 8 + shades[shade]), hues[color] | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
| @@ -665,21 +660,29 @@ function unifieddyes.on_airbrush(itemstack, player, pointed_thing) | ||||
| 		return | ||||
| 	end | ||||
|  | ||||
| 	if not def.palette 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 | ||||
| 	elseif def.palette ~= "unifieddyes_palette.png" then | ||||
| 		palette = true | ||||
| 	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) | ||||
| @@ -699,29 +702,42 @@ function unifieddyes.on_airbrush(itemstack, player, pointed_thing) | ||||
| 	end | ||||
|  | ||||
| 	local oldidx = node.param2 - fdir | ||||
|  | ||||
| 	local name = def.airbrush_replacement_node or node.name | ||||
|  | ||||
| 	if palette == true then | ||||
| 		local s = string.sub(def.palette, 21) | ||||
| 		local oldcolor = string.sub(s, 1, string.find(s, "s.png")-1) | ||||
| 	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 ;-) | ||||
|  | ||||
| 		local a,b | ||||
| 		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 | ||||
|  | ||||
| 		local newcolor = "grey" | ||||
| 		if hue ~= 0 then | ||||
| 			newcolor = unifieddyes.HUES[hue] | ||||
| 			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 | ||||
|  | ||||
| 		local a,b = string.gsub(nodename2, oldcolor, newcolor) | ||||
| 		name = modname..":"..a | ||||
| 		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) | ||||
| @@ -764,28 +780,6 @@ function unifieddyes.color_to_name(param2, def) | ||||
| 			return unifieddyes.VALS_EXTENDED[v]..unifieddyes.HUES_EXTENDED[h+1][1]..unifieddyes.SATS[s] | ||||
| 		end | ||||
|  | ||||
| 	elseif def.palette == "unifieddyes_palette.png" then | ||||
| 		local color = param2 | ||||
| 		local h = math.floor(color/8) | ||||
| 		local s = 1 | ||||
| 		local val = "" | ||||
| 		if color == 1 or color == h or color > 103 or color == 6 or color == 7 then return "white" | ||||
| 		elseif color == 2 then return "light_grey" | ||||
| 		elseif color == 3 then return "grey" | ||||
| 		elseif color == 4 then return "dark_grey" | ||||
| 		elseif color == 5 then return "black" | ||||
| 		end | ||||
| 		local c = color - h*8 | ||||
| 		if c == 2 then s = 2 | ||||
| 		elseif c == 3 then val = "light_" | ||||
| 		elseif c == 4 then val = "medium_" | ||||
| 		elseif c == 5 then val = "medium_" s = 2 | ||||
| 		elseif c == 6 then val = "dark_" | ||||
| 		else val = "dark_" s = 2 | ||||
| 		end | ||||
|  | ||||
| 		return val..unifieddyes.HUES[h+1]..unifieddyes.SATS[s] | ||||
|   | ||||
| 	elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then | ||||
| 		local color = math.floor(param2 / 8) | ||||
| 		if color == 0 then return "white" | ||||
| @@ -801,16 +795,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 | ||||
| @@ -826,17 +820,107 @@ function unifieddyes.color_to_name(param2, def) | ||||
| 	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) | ||||
| 	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 | ||||
|  | ||||
| 	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..";".. | ||||
| 					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] | ||||
|  | ||||
| 	local base_form = "size[15,8.5]label[7,-0.25;Select a color:]" | ||||
| 	local size="0.75,0.75;" | ||||
| 	local hps=0.6 | ||||
| 	local vps=1.3 | ||||
| 	local vs=0.3 | ||||
| 	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] | ||||
| 	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;(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;(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] | ||||
| @@ -846,7 +930,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] | ||||
| @@ -862,25 +946,10 @@ function unifieddyes.show_airbrush_form(player) | ||||
| 			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 color = string.format("%02x", r2)..string.format("%02x", g2)..string.format("%02x", b2) | ||||
| 			local dye = "dye:"..val..hue..sat | ||||
| 			local overlay = "" | ||||
| 			if not creative and inv:contains_item("main", dye) then | ||||
| 				overlay = "^unifieddyes_available_overlay.png" | ||||
| 			end | ||||
|  | ||||
| 			if dye == unifieddyes.player_selected_dye[player_name] then | ||||
| 				overlay = "^unifieddyes_select_overlay.png" | ||||
| 			end | ||||
|  | ||||
| 			local colorize = minetest.formspec_escape("^[colorize:#"..color..":255") | ||||
| 			base_form = base_form.."image_button[".. | ||||
| 									(hp*hps)..","..(v2*vps+vs)..";".. | ||||
| 									size.. | ||||
| 									"unifieddyes_white_square.png"..colorize..overlay..";".. | ||||
| 									val..hue..sat..";]".. | ||||
| 									"tooltip["..val..hue..sat..";"..val..hue..sat.."]" | ||||
|  | ||||
| 			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 | ||||
| @@ -889,7 +958,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] | ||||
| @@ -910,26 +979,10 @@ function unifieddyes.show_airbrush_form(player) | ||||
| 				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) | ||||
| 				local dye = "dye:"..val..hue..sat | ||||
|  | ||||
| 				local overlay = "" | ||||
| 				if not creative and inv:contains_item("main", dye) then | ||||
| 					overlay = "^unifieddyes_available_overlay.png" | ||||
| 				end | ||||
|  | ||||
| 				if dye == unifieddyes.player_selected_dye[player_name] then | ||||
| 					overlay = "^unifieddyes_select_overlay.png" | ||||
| 				end | ||||
|  | ||||
| 				local colorize = minetest.formspec_escape("^[colorize:#"..color..":255") | ||||
|  | ||||
| 				base_form = base_form.."image_button[".. | ||||
| 										(hp*hps)..","..(v2*vps+vs)..";".. | ||||
| 										size.. | ||||
| 										"unifieddyes_white_square.png"..colorize..overlay..";".. | ||||
| 										val..hue..sat..";]".. | ||||
| 										"tooltip["..val..hue..sat..";"..val..hue..sat.."]" | ||||
| 				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 | ||||
| @@ -937,59 +990,75 @@ 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 grey = string.format("%02x", y*17)..string.format("%02x", y*17)..string.format("%02x", y*17) | ||||
| 		local grey2 = "grey_"..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 grey2 = "black"  | ||||
| 		elseif y == 4 then grey2 = "dark_grey" | ||||
| 		elseif y == 8 then grey2 = "grey" | ||||
| 		elseif y == 11 then grey2 = "light_grey" | ||||
| 		elseif y == 15 then grey2 = "white" | ||||
| 		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 dye = "dye:"..grey2 | ||||
|  | ||||
| 		local overlay = "" | ||||
| 		if not creative and inv:contains_item("main", dye) then | ||||
| 			overlay = "^unifieddyes_available_overlay.png" | ||||
| 		end | ||||
|  | ||||
| 		if dye == unifieddyes.player_selected_dye[player_name] then | ||||
| 			overlay = "^unifieddyes_select_overlay.png" | ||||
| 		end | ||||
|  | ||||
| 		local colorize = minetest.formspec_escape("^[colorize:#"..grey..":255") | ||||
| 		base_form = base_form.."image_button[".. | ||||
| 								(hp*hps)..","..(v2*vps+vs)..";".. | ||||
| 								size.. | ||||
| 								"unifieddyes_white_square.png"..colorize..overlay..";".. | ||||
| 								grey2..";]tooltip["..grey2..";"..grey2.."]" | ||||
| 		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 | ||||
| 		base_form = base_form.. | ||||
| 				"image[10.3,"..(vps*5+vs)..";"..size.. | ||||
| 				"unifieddyes_available_overlay.png]".. | ||||
| 				"label[11.0,"..(vps*5.1+vs)..";Dyes on hand]".. | ||||
| 				"image[12.5,"..(vps*5+vs)..";"..size.. | ||||
| 				"unifieddyes_select_overlay.png]".. | ||||
| 				"label[13.2,"..(vps*5.1+vs)..";Your selection]" | ||||
| 		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] = ";Dyes]" | ||||
| 		t[#t+1] = "label[10.7," | ||||
| 		t[#t+1] = (vps*5.67+vs) | ||||
| 		t[#t+1] = ";on hand]" | ||||
|  | ||||
| 	end | ||||
|  | ||||
| 	base_form = base_form.. | ||||
| 				"button_exit[11,8;2,1;cancel;Cancel]".. | ||||
| 				"button_exit[13,8;2,1;accept;Accept]" | ||||
| 	t[#t+1] = "image[10," | ||||
| 	t[#t+1] = (vps*5+vs) | ||||
| 	t[#t+1] = color_button_size | ||||
| 	t[#t+1] = selindic | ||||
|  | ||||
| 	if unifieddyes.player_selected_dye[player_name] then | ||||
| 		base_form = base_form.. | ||||
| 					"label[1,"..(7.5+vs)..";Selected dye:  ".. | ||||
| 					unifieddyes.player_selected_dye[player_name].."]" | ||||
| 	if painting_with then | ||||
| 		t[#t+1] = "label[10.7," | ||||
| 		t[#t+1] = (vps*4.90+vs) | ||||
| 		t[#t+1] = ";Your selection:]" | ||||
| 		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] = ")]" | ||||
| 	else | ||||
| 		t[#t+1] = "label[10.7," | ||||
| 		t[#t+1] = (vps*5.07+vs) | ||||
| 		t[#t+1] = ";Your selection]" | ||||
| 	end | ||||
|  | ||||
| 	minetest.show_formspec(player_name, "unifieddyes:dye_select_form", base_form) | ||||
| 	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 nodepalette ~= "extended" then | ||||
| 		if showall then | ||||
| 			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,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 | ||||
|  | ||||
| 	minetest.show_formspec(player_name, "unifieddyes:dye_select_form", table.concat(t)) | ||||
| end | ||||
|  | ||||
| minetest.register_tool("unifieddyes:airbrush", { | ||||
| @@ -1003,15 +1072,21 @@ minetest.register_tool("unifieddyes:airbrush", { | ||||
| 	on_use = unifieddyes.on_airbrush, | ||||
| 	on_place = function(itemstack, placer, pointed_thing) | ||||
| 		local keys = placer:get_player_control() | ||||
| 		local player_name = placer:get_player_name() | ||||
| 		local pos = minetest.get_pointed_thing_position(pointed_thing) | ||||
| 		local node | ||||
| 		local def | ||||
|  | ||||
| 		if pos then node = minetest.get_node(pos) end | ||||
| 		if node then def = minetest.registered_items[node.name] end | ||||
|  | ||||
| 		unifieddyes.player_last_right_clicked[player_name] = {pos = pos, node = node, def = def} | ||||
|  | ||||
| 		if not keys.sneak then | ||||
| 			unifieddyes.show_airbrush_form(placer) | ||||
| 		elseif keys.sneak then | ||||
| 			local player_name = placer:get_player_name() | ||||
| 			local pos = minetest.get_pointed_thing_position(pointed_thing) | ||||
| 			if not pos then return end | ||||
| 			local node = minetest.get_node(pos) | ||||
| 			local def = minetest.registered_items[node.name] | ||||
| 			if not def then return end | ||||
|  | ||||
| 			if not pos or not def then return end | ||||
| 			local newcolor = unifieddyes.color_to_name(node.param2, def) | ||||
|  | ||||
| 			if not newcolor then | ||||
| @@ -1034,24 +1109,68 @@ minetest.register_craft( { | ||||
| }) | ||||
|  | ||||
| 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 s1 = string.sub(minetest.serialize(fields), 11) | ||||
| 		local s3 = string.sub(s1,1, string.find(s1, '"')-1) | ||||
| 		if s3 == "cancel" then | ||||
| 			unifieddyes.player_selected_dye[player_name] = nil | ||||
| 		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 s3 == "accept" and unifieddyes.player_selected_dye[player_name] then | ||||
| 			local dye = unifieddyes.player_selected_dye[player_name] | ||||
| 			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.") | ||||
| 		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 minetest.registered_items[dye] and (creative or inv:contains_item("main", dye)) then | ||||
|  | ||||
| 			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 | ||||
| @@ -1059,30 +1178,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) | ||||
| 	end | ||||
| end) | ||||
|  | ||||
| -- build a table to convert from classic/89-color palette to extended palette | ||||
|  | ||||
| -- the first five entries are for the old greyscale - white, light, grey, dark, black | ||||
| unifieddyes.convert_classic_palette = { | ||||
| 	240, | ||||
| 	244, | ||||
| 	247, | ||||
| 	251, | ||||
| 	253 | ||||
| } | ||||
|  | ||||
| for hue = 0, 11 do | ||||
| 	-- light | ||||
| 	local paletteidx = unifieddyes.getpaletteidx("dye:light_"..unifieddyes.HUES[hue+1], false) | ||||
| 	unifieddyes.convert_classic_palette[paletteidx] = hue*2 + 48 | ||||
| 	for sat = 0, 1 do | ||||
| 		for val = 0, 2 do | ||||
| 			-- all other shades | ||||
| 			local paletteidx = unifieddyes.getpaletteidx("dye:"..unifieddyes.VALS[val+1]..unifieddyes.HUES[hue+1]..unifieddyes.SATS[sat+1], false) | ||||
| 			unifieddyes.convert_classic_palette[paletteidx] = hue*2 + sat*24 + (val*48+96) | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| -- Generate all dyes that are not part of the default minetest_game dyes mod | ||||
|  | ||||
| for _, h in ipairs(unifieddyes.HUES_EXTENDED) do | ||||
| @@ -1125,14 +1220,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 | ||||
|  | ||||
| @@ -1153,13 +1240,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 | ||||
| @@ -1197,6 +1277,43 @@ minetest.register_craftitem(":dye:light_grey", { | ||||
| 	groups = { dye=1, not_in_creative_inventory=1 }, | ||||
| }) | ||||
|  | ||||
| -- build a table of color <-> palette associations to reduce the need for | ||||
| -- realtime lookups with getpaletteidx() | ||||
|  | ||||
| for _, palette in ipairs({"extended", "split", "wallmounted"}) do | ||||
| 	local palette2 = palette | ||||
|  | ||||
| 	for i in ipairs(unifieddyes.SATS) do | ||||
| 		local sat = (palette == "wallmounted") and "" or unifieddyes.SATS[i] | ||||
| 		for _, hue in ipairs(unifieddyes.HUES_EXTENDED) do | ||||
| 			for _, val in ipairs(unifieddyes.VALS_EXTENDED) do | ||||
| 				local color = val..hue[1]..sat | ||||
| 				if unifieddyes.getpaletteidx("dye:"..color, palette2) then | ||||
| 					unifieddyes.palette_has_color[palette.."_"..color] = true | ||||
| 				end | ||||
| 			end | ||||
| 		end | ||||
| 	end | ||||
|  | ||||
| 	for y = 0, 15 do | ||||
| 		local grey = "grey_"..y | ||||
|  | ||||
| 		if y == 0 then grey = "black"  | ||||
| 		elseif y == 4 then grey = "dark_grey" | ||||
| 		elseif y == 8 then grey = "grey" | ||||
| 		elseif y == 11 then grey = "light_grey" | ||||
| 		elseif y == 15 then grey = "white" | ||||
| 		end | ||||
| 		if unifieddyes.getpaletteidx("dye:"..grey, palette2) then | ||||
| 			unifieddyes.palette_has_color[palette.."_"..grey] = true | ||||
| 		end | ||||
| 	end | ||||
| end | ||||
|  | ||||
| unifieddyes.palette_has_color["wallmounted_light_red"] = true | ||||
|  | ||||
| -- crafting! | ||||
|  | ||||
| unifieddyes.base_color_crafts = { | ||||
| 	{ "red",		"flowers:rose",				nil,				nil,			nil,			nil,		4 }, | ||||
| 	{ "vermilion",	"dye:red",					"dye:orange",		nil,			nil,			nil,		3 }, | ||||
|   | ||||
| Before Width: | Height: | Size: 140 B After Width: | Height: | Size: 140 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_onhand_unavailable_overlay.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 319 B | 
| Before Width: | Height: | Size: 207 B | 
							
								
								
									
										
											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 | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_question.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 917 B | 
							
								
								
									
										
											BIN
										
									
								
								textures/unifieddyes_unavailable_overlay.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 266 B |