1
0
mirror of https://github.com/mt-mods/unifieddyes.git synced 2025-06-28 14:26:21 +02:00

Compare commits

..

24 Commits

Author SHA1 Message Date
10ab87bf65 prevent crash in setting sky color
if get color from name return nil
2019-05-25 04:14:12 -04:00
f59c8affc1 Merge branch 'master' into 'master'
Fixed yield for crafted dyes.

See merge request VanessaE/unifieddyes!2
2019-02-07 15:19:47 +00:00
667bce80b9 Fixed yield for crafted dyes.
Fix a bug that caused multiple inconsistent recipes to appear
(identical dye resources gave different dye output quantity).

Signed-off-by: Michal Cieslakiewicz <michal.cieslakiewicz@wp.pl>
2019-02-07 10:08:04 +01:00
5039a8ce07 Merge branch 'patch-1' into 'master'
Fix numbers relating to greys

See merge request VanessaE/unifieddyes!1
2018-12-16 00:09:21 +00:00
13a8cbb38f Some of the numbers relating to greys are used inconsistently, making three of the palette colours unreachable. This bug patch fixes the numbers and restores full usability of the palette. 2018-12-15 10:53:35 +00:00
58dd71e561 Add function to get the hex color from a dye name
(oh, and https://www.youtube.com/watch?v=OEVFbrEv83w too)
2018-12-01 17:59:00 -06:00
1fd850d37c change airbrush recipe
to 1 brass ingot, 2 steel ingots, and 1 plastic sheet
2018-11-23 10:38:05 -05:00
334de564fd fix crash
when trying to airbrush unknown nodes or nodes without palettes.
2018-10-19 16:00:05 -04:00
545968517b more strict checking of need to reset param2 on place
fixes wood (coloredwood mod), stone (blox mod), bricks (unified
bricks mod), etc.  being rotated wrong
2018-10-12 07:55:09 -04:00
368205d3b8 Add VALS_SPLIT for craft
Add faint + light.
2018-10-05 05:23:02 +02:00
feed6d5aae add human-readable color names to tooltips and "your selection
in airbrush form, plus minor re-arrangements and size adjustment to fit.
2018-09-23 18:11:07 -04:00
4811847655 check palette filename when airbrushing to determine mode.
(relying just on paramtype2 doesn't work :-/ )
2018-09-13 22:32:12 -04:00
44629935d2 turn unavail colors in selector into non-clickable flat images
(instead of making them all buttons)
2018-09-13 00:17:13 -04:00
ccbedcd3d6 allow passing an explicitly-available list of colors for airbrush 2018-09-13 00:03:59 -04:00
622d09a243 get rid of colors.txt, outdated 2018-09-12 23:08:17 -04:00
27fe090395 clarify item desc in split palette register nodes helper 2018-09-12 22:44:24 -04:00
230ac1342a remove debug prints 2018-09-12 22:39:44 -04:00
e921095006 allow access to the 0 column in the split palettes
which now contains a "faint" shade of each color
brings the total to 197 colors in split mode.
2018-09-12 22:37:52 -04:00
3eb3a9a330 expand old split-89 palette to 176 colors
(by adding more hues, now has all 24 in 7 shades each
plus 5 greys)
2018-09-12 22:29:57 -04:00
078a998d29 append output given to color craft helper if prefix/suffix are used
(if any; allows specifying an item count/yield for the recipe)
2018-09-12 20:34:28 -04:00
4b88997360 add helper function for registering split palette nodes 2018-09-12 20:19:07 -04:00
ef7d357e0b make sure group.ud_param2_colorable exists before trying to check its value :P 2018-09-12 19:40:22 -04:00
66774213e2 use the node's paramtype2 instead of its palette filename
to decide what the airbrush should do with it.

(that plus a few related changes allows coloredwood mod to make
the airbrush work on stairsplus cut plain wood slabs/slopes/et. al)
2018-09-12 18:32:04 -04:00
ad21862eee add hues+greys table 2018-09-12 16:38:42 -04:00
29 changed files with 234 additions and 252 deletions

7
API.md
View File

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

View File

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

389
init.lua
View File

@ -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,30 @@ 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)
if hexcolor then
local r = tonumber(string.sub(hexcolor,1,2),16)
local g = tonumber(string.sub(hexcolor,3,4),16)
local b = tonumber(string.sub(hexcolor,5,6),16)
player:set_sky({r=r,g=g,b=b,a=255},"plain")
end
end
return
end
local node = minetest.get_node(pos)
local def = minetest.registered_items[node.name]
@ -638,29 +687,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 +732,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 +743,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 +822,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 +849,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 +872,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 +881,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 +921,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 +932,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 +957,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 +975,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 +985,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 +1008,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 +1017,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 +1030,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 +1129,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 +1247,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 +1267,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
@ -1366,7 +1433,7 @@ for _,i in ipairs(unifieddyes.base_color_crafts) do
minetest.register_craft( {
type = "shapeless",
output = "dye:"..j[1]..color..j[2].." "..yield,
output = "dye:"..j[1]..color..j[2].." "..j[6],
recipe = {
"dye:"..color,
firstdye,

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

After

Width:  |  Height:  |  Size: 93 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

After

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 B

After

Width:  |  Height:  |  Size: 91 B