2013-02-07 07:38:34 +01:00
|
|
|
--[[
|
|
|
|
|
|
|
|
Unified Dyes
|
|
|
|
|
Refactored the code to use default "common" dyes
rather than directly from flowers.
This mod now depends on "default" and "dye" from the Minetest common
sub-game. Since the default dye mod uses default flowers, this mod no
longer checks for what version of flowers you're using, or even depends
on it.
Bottle-based textures have been replaced with piles of dye powder, based
on the default red dye texture.
All dyes are obtained by crafting, not cooking, for consistency with the
default dye mod.
The somewhat-complicated method using separate "pigment" powders, glass
bottles and "liquid dye base" has been done away with. Now it's just
dry dye powders, as with the default dye mod.
Also, got rid of the whole paint scheme, in favor of dry powders.
All old dyes, paints, and Unified Dyes pigment powders have been aliased
back to the standard dye powders.
2013-04-30 12:02:22 +02:00
|
|
|
This mod provides an extension to the Minetest 0.4.x dye system
|
2013-02-07 07:38:34 +01:00
|
|
|
|
|
|
|
==============================================================================
|
|
|
|
|
|
|
|
Copyright (C) 2012-2013, Vanessa Ezekowitz
|
|
|
|
Email: vanessaezekowitz@gmail.com
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
|
|
|
==============================================================================
|
|
|
|
|
Refactored the code to use default "common" dyes
rather than directly from flowers.
This mod now depends on "default" and "dye" from the Minetest common
sub-game. Since the default dye mod uses default flowers, this mod no
longer checks for what version of flowers you're using, or even depends
on it.
Bottle-based textures have been replaced with piles of dye powder, based
on the default red dye texture.
All dyes are obtained by crafting, not cooking, for consistency with the
default dye mod.
The somewhat-complicated method using separate "pigment" powders, glass
bottles and "liquid dye base" has been done away with. Now it's just
dry dye powders, as with the default dye mod.
Also, got rid of the whole paint scheme, in favor of dry powders.
All old dyes, paints, and Unified Dyes pigment powders have been aliased
back to the standard dye powders.
2013-04-30 12:02:22 +02:00
|
|
|
--]]
|
2013-02-07 07:38:34 +01:00
|
|
|
|
Refactored the code to use default "common" dyes
rather than directly from flowers.
This mod now depends on "default" and "dye" from the Minetest common
sub-game. Since the default dye mod uses default flowers, this mod no
longer checks for what version of flowers you're using, or even depends
on it.
Bottle-based textures have been replaced with piles of dye powder, based
on the default red dye texture.
All dyes are obtained by crafting, not cooking, for consistency with the
default dye mod.
The somewhat-complicated method using separate "pigment" powders, glass
bottles and "liquid dye base" has been done away with. Now it's just
dry dye powders, as with the default dye mod.
Also, got rid of the whole paint scheme, in favor of dry powders.
All old dyes, paints, and Unified Dyes pigment powders have been aliased
back to the standard dye powders.
2013-04-30 12:02:22 +02:00
|
|
|
--=====================================================================
|
2014-03-20 02:11:30 +01:00
|
|
|
|
2017-01-25 18:31:40 +01:00
|
|
|
unifieddyes = {}
|
|
|
|
|
2017-05-13 04:02:06 +02:00
|
|
|
local creative_mode = minetest.settings:get_bool("creative_mode")
|
2017-01-28 14:05:44 +01:00
|
|
|
|
2014-03-20 02:11:30 +01:00
|
|
|
-- Boilerplate to support localized strings if intllib mod is installed.
|
|
|
|
local S
|
2014-12-27 07:02:35 +01:00
|
|
|
if minetest.get_modpath("intllib") then
|
|
|
|
S = intllib.Getter()
|
2014-03-20 02:11:30 +01:00
|
|
|
else
|
2014-12-27 07:02:35 +01:00
|
|
|
S = function(s) return s end
|
2014-03-20 02:11:30 +01:00
|
|
|
end
|
|
|
|
|
2017-02-24 23:40:37 +01:00
|
|
|
-- the names of the various colors here came from http://www.procato.com/rgb+index/
|
|
|
|
|
2017-02-25 04:42:42 +01:00
|
|
|
unifieddyes.HUES_EXTENDED = {
|
2017-02-24 23:40:37 +01:00
|
|
|
{ "red", 0xff, 0x00, 0x00 },
|
|
|
|
{ "vermilion", 0xff, 0x40, 0x00 },
|
|
|
|
{ "orange", 0xff, 0x80, 0x00 },
|
|
|
|
{ "amber", 0xff, 0xbf, 0x00 },
|
|
|
|
{ "yellow", 0xff, 0xff, 0x00 },
|
|
|
|
{ "lime", 0xbf, 0xff, 0x00 },
|
|
|
|
{ "chartreuse", 0x80, 0xff, 0x00 },
|
|
|
|
{ "harlequin", 0x40, 0xff, 0x00 },
|
|
|
|
{ "green", 0x00, 0xff, 0x00 },
|
|
|
|
{ "malachite", 0x00, 0xff, 0x40 },
|
|
|
|
{ "spring", 0x00, 0xff, 0x80 },
|
|
|
|
{ "turquoise", 0x00, 0xff, 0xbf },
|
|
|
|
{ "cyan", 0x00, 0xff, 0xff },
|
|
|
|
{ "cerulean", 0x00, 0xbf, 0xff },
|
|
|
|
{ "azure", 0x00, 0x80, 0xff },
|
|
|
|
{ "sapphire", 0x00, 0x40, 0xff },
|
|
|
|
{ "blue", 0x00, 0x00, 0xff },
|
|
|
|
{ "indigo", 0x40, 0x00, 0xff },
|
|
|
|
{ "violet", 0x80, 0x00, 0xff },
|
|
|
|
{ "mulberry", 0xbf, 0x00, 0xff },
|
|
|
|
{ "magenta", 0xff, 0x00, 0xff },
|
|
|
|
{ "fuchsia", 0xff, 0x00, 0xbf },
|
|
|
|
{ "rose", 0xff, 0x00, 0x80 },
|
|
|
|
{ "crimson", 0xff, 0x00, 0x40 }
|
|
|
|
}
|
|
|
|
|
2018-09-13 04:29:57 +02:00
|
|
|
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")
|
|
|
|
|
add helper function for crafting param2-colorized items
One call registers the full set of 32, 89, or 256 colors.
Pass it a recipe of the following general form
```lua
unifieddyes.register_color_craft({
output = "mymod:colorized_node",
type = <nil or "shapeless">
palette = <see below>,
neutral_node = "some_mod:neutral_node",
recipe = {
<see below>
}
})
```
palette may be either "wallmounted" (32 colors), false or omitted
entirely (89 colors), or "extended" (256 colors).
The recipe section is either a shapeless list, or a standard three-line
shaped recipe, same as the regular register_craft() function. The key
difference is two placeholder keys that are now supported:
* if an item in the recipe is "MAIN_DYE", then Unified Dyes will, with
each pass of its registration loop, substitute the actual "dye:foo"
craft item in its place which corresponds with the current loop's color.
* if an item in the recipe list is "NEUTRAL_NODE", then the value of the
"neutral_node" field will be substituted in its place.
The expectation here is that the modder probably has some base recipe in
mind that, given no dyes, would result in a neutral, uncolored node. This
call creates all the recipes that would be needed to craft colored versions
of that neutral node either using that base recipe with dye added, or by
crafting the neutral node with some dye after the fact.
2017-06-20 11:02:53 +02:00
|
|
|
unifieddyes.HUES_WALLMOUNTED = {
|
|
|
|
"red",
|
|
|
|
"orange",
|
|
|
|
"yellow",
|
|
|
|
"green",
|
|
|
|
"cyan",
|
|
|
|
"blue",
|
|
|
|
"violet",
|
|
|
|
"magenta"
|
|
|
|
}
|
|
|
|
|
2017-02-25 04:42:42 +01:00
|
|
|
unifieddyes.SATS = {
|
2017-02-24 20:21:59 +01:00
|
|
|
"",
|
|
|
|
"_s50"
|
|
|
|
}
|
|
|
|
|
2017-02-25 04:42:42 +01:00
|
|
|
unifieddyes.VALS = {
|
2017-02-24 20:21:59 +01:00
|
|
|
"",
|
|
|
|
"medium_",
|
|
|
|
"dark_"
|
|
|
|
}
|
|
|
|
|
2018-10-05 05:23:02 +02:00
|
|
|
unifieddyes.VALS_SPLIT = {
|
|
|
|
"faint_",
|
|
|
|
"light_",
|
|
|
|
"",
|
|
|
|
"medium_",
|
|
|
|
"dark_"
|
|
|
|
}
|
|
|
|
|
2017-02-25 04:42:42 +01:00
|
|
|
unifieddyes.VALS_EXTENDED = {
|
2017-02-24 23:40:37 +01:00
|
|
|
"faint_",
|
|
|
|
"pastel_",
|
|
|
|
"light_",
|
|
|
|
"bright_",
|
|
|
|
"",
|
|
|
|
"medium_",
|
|
|
|
"dark_"
|
|
|
|
}
|
|
|
|
|
2017-02-25 04:42:42 +01:00
|
|
|
unifieddyes.GREYS = {
|
2017-02-24 20:21:59 +01:00
|
|
|
"white",
|
|
|
|
"light_grey",
|
|
|
|
"grey",
|
|
|
|
"dark_grey",
|
|
|
|
"black"
|
|
|
|
}
|
|
|
|
|
2018-08-22 05:28:17 +02:00
|
|
|
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
|
|
|
|
table.insert(unifieddyes.GREYS_EXTENDED, "grey_"..i)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-02-05 01:40:15 +01:00
|
|
|
local default_dyes = {
|
|
|
|
"black",
|
|
|
|
"blue",
|
|
|
|
"brown",
|
|
|
|
"cyan",
|
|
|
|
"dark_green",
|
|
|
|
"dark_grey",
|
|
|
|
"green",
|
|
|
|
"grey",
|
|
|
|
"magenta",
|
|
|
|
"orange",
|
|
|
|
"pink",
|
|
|
|
"red",
|
|
|
|
"violet",
|
|
|
|
"white",
|
|
|
|
"yellow"
|
|
|
|
}
|
|
|
|
|
2018-08-26 08:37:58 +02:00
|
|
|
unifieddyes.player_current_dye = {}
|
|
|
|
unifieddyes.player_selected_dye = {}
|
2018-09-08 15:09:13 +02:00
|
|
|
unifieddyes.player_last_right_clicked = {}
|
|
|
|
unifieddyes.palette_has_color = {}
|
|
|
|
unifieddyes.player_showall = {}
|
|
|
|
|
2018-08-24 17:13:42 +02:00
|
|
|
-- if a node with a palette is placed in the world,
|
|
|
|
-- but the itemstack used to place it has no palette_index (color byte),
|
|
|
|
-- create something appropriate to make it officially white.
|
|
|
|
|
|
|
|
minetest.register_on_placenode(
|
|
|
|
function(pos, newnode, placer, oldnode, itemstack, pointed_thing)
|
|
|
|
local def = minetest.registered_items[newnode.name]
|
|
|
|
|
2018-08-26 13:09:20 +02:00
|
|
|
if not def
|
|
|
|
or not def.palette
|
|
|
|
or def.after_place_node then
|
|
|
|
return false
|
2018-08-24 17:13:42 +02:00
|
|
|
end
|
|
|
|
|
2018-08-26 13:09:20 +02:00
|
|
|
if not string.find(itemstack:to_string(), "palette_index") then
|
2018-10-12 13:55:09 +02:00
|
|
|
local param2
|
2018-08-26 13:09:20 +02:00
|
|
|
local color = 0
|
|
|
|
|
2018-10-12 13:55:09 +02:00
|
|
|
if def.palette == "unifieddyes_palette_extended.png"
|
|
|
|
and def.paramtype2 == "color" then
|
2018-08-26 13:09:20 +02:00
|
|
|
param2 = 240
|
|
|
|
color = 240
|
2018-10-12 13:55:09 +02:00
|
|
|
elseif def.palette == "unifieddyes_palette_colorwallmounted.png"
|
|
|
|
and def.paramtype2 == "colorwallmounted" then
|
2018-08-26 13:09:20 +02:00
|
|
|
param2 = newnode.param2 % 8
|
2018-10-12 13:55:09 +02:00
|
|
|
elseif string.find(def.palette, "unifieddyes_palette_")
|
|
|
|
and def.paramtype2 == "colorfacedir" then -- it's a split palette
|
2018-08-26 13:09:20 +02:00
|
|
|
param2 = newnode.param2 % 32
|
|
|
|
end
|
|
|
|
|
2018-10-12 13:55:09 +02:00
|
|
|
if param2 then
|
|
|
|
minetest.swap_node(pos, {name = newnode.name, param2 = param2})
|
|
|
|
minetest.get_meta(pos):set_int("palette_index", color)
|
|
|
|
end
|
2018-08-26 13:09:20 +02:00
|
|
|
end
|
2018-08-24 17:13:42 +02:00
|
|
|
end
|
|
|
|
)
|
|
|
|
|
2017-06-20 11:20:25 +02:00
|
|
|
-- just stubs to keep old mods from crashing when expecting auto-coloring
|
|
|
|
-- or getting back the dye on dig.
|
2017-06-20 11:10:59 +02:00
|
|
|
|
|
|
|
function unifieddyes.recolor_on_place(foo)
|
|
|
|
end
|
|
|
|
|
2017-06-20 11:20:25 +02:00
|
|
|
function unifieddyes.after_dig_node(foo)
|
|
|
|
end
|
|
|
|
|
2018-09-13 00:32:38 +02:00
|
|
|
-- 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
|
2018-09-13 04:44:24 +02:00
|
|
|
def2.description = string.sub(def2.description, 1, -2)..", "..desc_color.." shades)"
|
2018-09-13 00:32:38 +02:00
|
|
|
else
|
2018-09-13 04:44:24 +02:00
|
|
|
def2.description = def2.description.."("..desc_color.." shades)"
|
2018-09-13 00:32:38 +02:00
|
|
|
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
|
|
|
|
|
2018-08-22 05:28:17 +02:00
|
|
|
-- This helper function creates a colored itemstack
|
2017-06-20 11:46:30 +02:00
|
|
|
|
2018-08-22 05:28:17 +02:00
|
|
|
function unifieddyes.make_colored_itemstack(item, palette, color)
|
2017-06-20 11:46:30 +02:00
|
|
|
local paletteidx = unifieddyes.getpaletteidx(color, palette)
|
2018-08-22 05:28:17 +02:00
|
|
|
local stack = ItemStack(item)
|
2017-06-20 11:46:30 +02:00
|
|
|
stack:get_meta():set_int("palette_index", paletteidx)
|
2018-08-25 06:38:24 +02:00
|
|
|
return stack:to_string(),paletteidx
|
2017-06-20 11:46:30 +02:00
|
|
|
end
|
|
|
|
|
2018-08-22 05:28:17 +02:00
|
|
|
-- these helper functions register all of the recipes needed to create colored
|
|
|
|
-- nodes with any of the dyes supported by that node's palette.
|
|
|
|
|
2018-09-13 04:29:57 +02:00
|
|
|
local function register_c(craft, h, sat, val)
|
|
|
|
local hue = (type(h) == "table") and h[1] or h
|
2018-08-22 05:28:17 +02:00
|
|
|
local color = ""
|
|
|
|
if val then
|
2018-09-13 04:29:57 +02:00
|
|
|
if craft.palette == "wallmounted" then
|
2018-08-23 02:01:03 +02:00
|
|
|
color = val..hue..sat
|
2018-08-22 09:14:20 +02:00
|
|
|
else
|
2018-09-13 04:29:57 +02:00
|
|
|
color = val..hue..sat
|
2018-08-22 09:14:20 +02:00
|
|
|
end
|
2018-08-22 05:28:17 +02:00
|
|
|
else
|
2018-08-23 02:01:03 +02:00
|
|
|
color = hue -- if val is nil, then it's grey.
|
2018-08-22 05:28:17 +02:00
|
|
|
end
|
|
|
|
|
2018-08-23 02:01:03 +02:00
|
|
|
local dye = "dye:"..color
|
2018-08-22 05:28:17 +02:00
|
|
|
local recipe = minetest.serialize(craft.recipe)
|
2018-08-23 02:01:03 +02:00
|
|
|
recipe = string.gsub(recipe, "MAIN_DYE", dye)
|
2018-08-22 05:28:17 +02:00
|
|
|
recipe = string.gsub(recipe, "NEUTRAL_NODE", craft.neutral_node)
|
|
|
|
local newrecipe = minetest.deserialize(recipe)
|
|
|
|
|
2018-09-13 02:26:23 +02:00
|
|
|
local coutput = craft.output or ""
|
|
|
|
local output = coutput
|
2018-08-23 02:01:03 +02:00
|
|
|
if craft.output_prefix then
|
2018-09-08 18:09:25 +02:00
|
|
|
if craft.palette ~= "split" then
|
2018-09-13 02:26:23 +02:00
|
|
|
output = craft.output_prefix..color..craft.output_suffix..coutput
|
2018-08-23 02:01:03 +02:00
|
|
|
else
|
|
|
|
if hue == "white" or hue == "black" or string.find(hue, "grey") then
|
2018-09-13 02:26:23 +02:00
|
|
|
output = craft.output_prefix.."grey"..craft.output_suffix..coutput
|
2018-08-23 02:06:29 +02:00
|
|
|
elseif hue == "pink" then
|
|
|
|
dye = "dye:light_red"
|
2018-09-13 02:26:23 +02:00
|
|
|
output = craft.output_prefix.."red"..craft.output_suffix..coutput
|
2018-08-23 02:01:03 +02:00
|
|
|
else
|
2018-09-13 02:26:23 +02:00
|
|
|
output = craft.output_prefix..hue..craft.output_suffix..coutput
|
2018-08-23 02:01:03 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-08-22 05:28:17 +02:00
|
|
|
local colored_itemstack =
|
2018-08-23 02:01:03 +02:00
|
|
|
unifieddyes.make_colored_itemstack(output, craft.palette, dye)
|
|
|
|
|
2018-08-22 05:28:17 +02:00
|
|
|
minetest.register_craft({
|
|
|
|
output = colored_itemstack,
|
|
|
|
type = craft.type,
|
|
|
|
recipe = newrecipe
|
|
|
|
})
|
|
|
|
|
|
|
|
end
|
add helper function for crafting param2-colorized items
One call registers the full set of 32, 89, or 256 colors.
Pass it a recipe of the following general form
```lua
unifieddyes.register_color_craft({
output = "mymod:colorized_node",
type = <nil or "shapeless">
palette = <see below>,
neutral_node = "some_mod:neutral_node",
recipe = {
<see below>
}
})
```
palette may be either "wallmounted" (32 colors), false or omitted
entirely (89 colors), or "extended" (256 colors).
The recipe section is either a shapeless list, or a standard three-line
shaped recipe, same as the regular register_craft() function. The key
difference is two placeholder keys that are now supported:
* if an item in the recipe is "MAIN_DYE", then Unified Dyes will, with
each pass of its registration loop, substitute the actual "dye:foo"
craft item in its place which corresponds with the current loop's color.
* if an item in the recipe list is "NEUTRAL_NODE", then the value of the
"neutral_node" field will be substituted in its place.
The expectation here is that the modder probably has some base recipe in
mind that, given no dyes, would result in a neutral, uncolored node. This
call creates all the recipes that would be needed to craft colored versions
of that neutral node either using that base recipe with dye added, or by
crafting the neutral node with some dye after the fact.
2017-06-20 11:02:53 +02:00
|
|
|
|
|
|
|
function unifieddyes.register_color_craft(craft)
|
2018-09-13 04:29:57 +02:00
|
|
|
local hues_table = unifieddyes.HUES_EXTENDED
|
add helper function for crafting param2-colorized items
One call registers the full set of 32, 89, or 256 colors.
Pass it a recipe of the following general form
```lua
unifieddyes.register_color_craft({
output = "mymod:colorized_node",
type = <nil or "shapeless">
palette = <see below>,
neutral_node = "some_mod:neutral_node",
recipe = {
<see below>
}
})
```
palette may be either "wallmounted" (32 colors), false or omitted
entirely (89 colors), or "extended" (256 colors).
The recipe section is either a shapeless list, or a standard three-line
shaped recipe, same as the regular register_craft() function. The key
difference is two placeholder keys that are now supported:
* if an item in the recipe is "MAIN_DYE", then Unified Dyes will, with
each pass of its registration loop, substitute the actual "dye:foo"
craft item in its place which corresponds with the current loop's color.
* if an item in the recipe list is "NEUTRAL_NODE", then the value of the
"neutral_node" field will be substituted in its place.
The expectation here is that the modder probably has some base recipe in
mind that, given no dyes, would result in a neutral, uncolored node. This
call creates all the recipes that would be needed to craft colored versions
of that neutral node either using that base recipe with dye added, or by
crafting the neutral node with some dye after the fact.
2017-06-20 11:02:53 +02:00
|
|
|
local sats_table = unifieddyes.SATS
|
2018-10-05 05:23:02 +02:00
|
|
|
local vals_table = unifieddyes.VALS_SPLIT
|
2018-08-23 02:01:03 +02:00
|
|
|
local greys_table = unifieddyes.GREYS
|
add helper function for crafting param2-colorized items
One call registers the full set of 32, 89, or 256 colors.
Pass it a recipe of the following general form
```lua
unifieddyes.register_color_craft({
output = "mymod:colorized_node",
type = <nil or "shapeless">
palette = <see below>,
neutral_node = "some_mod:neutral_node",
recipe = {
<see below>
}
})
```
palette may be either "wallmounted" (32 colors), false or omitted
entirely (89 colors), or "extended" (256 colors).
The recipe section is either a shapeless list, or a standard three-line
shaped recipe, same as the regular register_craft() function. The key
difference is two placeholder keys that are now supported:
* if an item in the recipe is "MAIN_DYE", then Unified Dyes will, with
each pass of its registration loop, substitute the actual "dye:foo"
craft item in its place which corresponds with the current loop's color.
* if an item in the recipe list is "NEUTRAL_NODE", then the value of the
"neutral_node" field will be substituted in its place.
The expectation here is that the modder probably has some base recipe in
mind that, given no dyes, would result in a neutral, uncolored node. This
call creates all the recipes that would be needed to craft colored versions
of that neutral node either using that base recipe with dye added, or by
crafting the neutral node with some dye after the fact.
2017-06-20 11:02:53 +02:00
|
|
|
|
2018-08-23 02:01:03 +02:00
|
|
|
if craft.palette == "wallmounted" then
|
2018-08-25 08:40:17 +02:00
|
|
|
register_c(craft, "green", "", "light_")
|
2018-09-08 17:21:00 +02:00
|
|
|
register_c(craft, "blue", "", "light_")
|
add helper function for crafting param2-colorized items
One call registers the full set of 32, 89, or 256 colors.
Pass it a recipe of the following general form
```lua
unifieddyes.register_color_craft({
output = "mymod:colorized_node",
type = <nil or "shapeless">
palette = <see below>,
neutral_node = "some_mod:neutral_node",
recipe = {
<see below>
}
})
```
palette may be either "wallmounted" (32 colors), false or omitted
entirely (89 colors), or "extended" (256 colors).
The recipe section is either a shapeless list, or a standard three-line
shaped recipe, same as the regular register_craft() function. The key
difference is two placeholder keys that are now supported:
* if an item in the recipe is "MAIN_DYE", then Unified Dyes will, with
each pass of its registration loop, substitute the actual "dye:foo"
craft item in its place which corresponds with the current loop's color.
* if an item in the recipe list is "NEUTRAL_NODE", then the value of the
"neutral_node" field will be substituted in its place.
The expectation here is that the modder probably has some base recipe in
mind that, given no dyes, would result in a neutral, uncolored node. This
call creates all the recipes that would be needed to craft colored versions
of that neutral node either using that base recipe with dye added, or by
crafting the neutral node with some dye after the fact.
2017-06-20 11:02:53 +02:00
|
|
|
hues_table = unifieddyes.HUES_WALLMOUNTED
|
|
|
|
sats_table = {""}
|
|
|
|
vals_table = unifieddyes.VALS
|
2018-08-23 02:01:03 +02:00
|
|
|
elseif craft.palette == "extended" then
|
|
|
|
vals_table = unifieddyes.VALS_EXTENDED
|
|
|
|
greys_table = unifieddyes.GREYS_EXTENDED
|
add helper function for crafting param2-colorized items
One call registers the full set of 32, 89, or 256 colors.
Pass it a recipe of the following general form
```lua
unifieddyes.register_color_craft({
output = "mymod:colorized_node",
type = <nil or "shapeless">
palette = <see below>,
neutral_node = "some_mod:neutral_node",
recipe = {
<see below>
}
})
```
palette may be either "wallmounted" (32 colors), false or omitted
entirely (89 colors), or "extended" (256 colors).
The recipe section is either a shapeless list, or a standard three-line
shaped recipe, same as the regular register_craft() function. The key
difference is two placeholder keys that are now supported:
* if an item in the recipe is "MAIN_DYE", then Unified Dyes will, with
each pass of its registration loop, substitute the actual "dye:foo"
craft item in its place which corresponds with the current loop's color.
* if an item in the recipe list is "NEUTRAL_NODE", then the value of the
"neutral_node" field will be substituted in its place.
The expectation here is that the modder probably has some base recipe in
mind that, given no dyes, would result in a neutral, uncolored node. This
call creates all the recipes that would be needed to craft colored versions
of that neutral node either using that base recipe with dye added, or by
crafting the neutral node with some dye after the fact.
2017-06-20 11:02:53 +02:00
|
|
|
end
|
|
|
|
|
2018-08-23 02:01:03 +02:00
|
|
|
for _, hue in ipairs(hues_table) do
|
|
|
|
for _, val in ipairs(vals_table) do
|
|
|
|
for _, sat in ipairs(sats_table) do
|
add helper function for crafting param2-colorized items
One call registers the full set of 32, 89, or 256 colors.
Pass it a recipe of the following general form
```lua
unifieddyes.register_color_craft({
output = "mymod:colorized_node",
type = <nil or "shapeless">
palette = <see below>,
neutral_node = "some_mod:neutral_node",
recipe = {
<see below>
}
})
```
palette may be either "wallmounted" (32 colors), false or omitted
entirely (89 colors), or "extended" (256 colors).
The recipe section is either a shapeless list, or a standard three-line
shaped recipe, same as the regular register_craft() function. The key
difference is two placeholder keys that are now supported:
* if an item in the recipe is "MAIN_DYE", then Unified Dyes will, with
each pass of its registration loop, substitute the actual "dye:foo"
craft item in its place which corresponds with the current loop's color.
* if an item in the recipe list is "NEUTRAL_NODE", then the value of the
"neutral_node" field will be substituted in its place.
The expectation here is that the modder probably has some base recipe in
mind that, given no dyes, would result in a neutral, uncolored node. This
call creates all the recipes that would be needed to craft colored versions
of that neutral node either using that base recipe with dye added, or by
crafting the neutral node with some dye after the fact.
2017-06-20 11:02:53 +02:00
|
|
|
|
2018-08-22 05:28:17 +02:00
|
|
|
if sat == "_s50" and val ~= "" and val ~= "medium_" and val ~= "dark_" then break end
|
|
|
|
register_c(craft, hue, sat, val)
|
add helper function for crafting param2-colorized items
One call registers the full set of 32, 89, or 256 colors.
Pass it a recipe of the following general form
```lua
unifieddyes.register_color_craft({
output = "mymod:colorized_node",
type = <nil or "shapeless">
palette = <see below>,
neutral_node = "some_mod:neutral_node",
recipe = {
<see below>
}
})
```
palette may be either "wallmounted" (32 colors), false or omitted
entirely (89 colors), or "extended" (256 colors).
The recipe section is either a shapeless list, or a standard three-line
shaped recipe, same as the regular register_craft() function. The key
difference is two placeholder keys that are now supported:
* if an item in the recipe is "MAIN_DYE", then Unified Dyes will, with
each pass of its registration loop, substitute the actual "dye:foo"
craft item in its place which corresponds with the current loop's color.
* if an item in the recipe list is "NEUTRAL_NODE", then the value of the
"neutral_node" field will be substituted in its place.
The expectation here is that the modder probably has some base recipe in
mind that, given no dyes, would result in a neutral, uncolored node. This
call creates all the recipes that would be needed to craft colored versions
of that neutral node either using that base recipe with dye added, or by
crafting the neutral node with some dye after the fact.
2017-06-20 11:02:53 +02:00
|
|
|
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2018-08-22 05:28:17 +02:00
|
|
|
|
|
|
|
for _, grey in ipairs(greys_table) do
|
|
|
|
register_c(craft, grey)
|
|
|
|
end
|
2018-08-23 02:01:03 +02:00
|
|
|
|
2018-08-23 02:06:29 +02:00
|
|
|
register_c(craft, "pink")
|
|
|
|
|
add helper function for crafting param2-colorized items
One call registers the full set of 32, 89, or 256 colors.
Pass it a recipe of the following general form
```lua
unifieddyes.register_color_craft({
output = "mymod:colorized_node",
type = <nil or "shapeless">
palette = <see below>,
neutral_node = "some_mod:neutral_node",
recipe = {
<see below>
}
})
```
palette may be either "wallmounted" (32 colors), false or omitted
entirely (89 colors), or "extended" (256 colors).
The recipe section is either a shapeless list, or a standard three-line
shaped recipe, same as the regular register_craft() function. The key
difference is two placeholder keys that are now supported:
* if an item in the recipe is "MAIN_DYE", then Unified Dyes will, with
each pass of its registration loop, substitute the actual "dye:foo"
craft item in its place which corresponds with the current loop's color.
* if an item in the recipe list is "NEUTRAL_NODE", then the value of the
"neutral_node" field will be substituted in its place.
The expectation here is that the modder probably has some base recipe in
mind that, given no dyes, would result in a neutral, uncolored node. This
call creates all the recipes that would be needed to craft colored versions
of that neutral node either using that base recipe with dye added, or by
crafting the neutral node with some dye after the fact.
2017-06-20 11:02:53 +02:00
|
|
|
end
|
|
|
|
|
2017-01-25 18:31:40 +01:00
|
|
|
-- code borrowed from homedecor
|
2017-02-18 05:04:47 +01:00
|
|
|
-- call this function to reset the rotation of a "wallmounted" object on place
|
|
|
|
|
|
|
|
function unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing)
|
|
|
|
local node = minetest.get_node(pos)
|
2018-08-22 10:25:43 +02:00
|
|
|
local colorbits = node.param2 - (node.param2 % 8)
|
|
|
|
|
2017-05-04 08:04:17 +02:00
|
|
|
local yaw = placer:get_look_horizontal()
|
2017-06-04 22:17:37 +02:00
|
|
|
local dir = minetest.yaw_to_dir(yaw) -- -1.5)
|
2017-02-18 05:04:47 +01:00
|
|
|
local pitch = placer:get_look_vertical()
|
|
|
|
|
|
|
|
local fdir = minetest.dir_to_wallmounted(dir)
|
|
|
|
|
2017-02-18 05:13:22 +01:00
|
|
|
if pitch < -(math.pi/8) then
|
2017-02-18 05:04:47 +01:00
|
|
|
fdir = 0
|
2017-02-18 05:13:22 +01:00
|
|
|
elseif pitch > math.pi/8 then
|
2017-02-18 05:04:47 +01:00
|
|
|
fdir = 1
|
|
|
|
end
|
2018-08-22 10:25:43 +02:00
|
|
|
minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits })
|
2017-02-18 05:04:47 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
-- use this when you have a "wallmounted" node that should never be oriented
|
2017-02-18 19:00:06 +01:00
|
|
|
-- to floor or ceiling...
|
2017-02-18 05:04:47 +01:00
|
|
|
|
|
|
|
function unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)
|
|
|
|
local node = minetest.get_node(pos)
|
2018-08-22 10:25:43 +02:00
|
|
|
local colorbits = node.param2 - (node.param2 % 8)
|
2017-05-04 08:04:17 +02:00
|
|
|
local yaw = placer:get_look_horizontal()
|
2017-06-04 22:17:37 +02:00
|
|
|
local dir = minetest.yaw_to_dir(yaw+1.5)
|
2017-02-18 05:04:47 +01:00
|
|
|
local fdir = minetest.dir_to_wallmounted(dir)
|
2018-08-22 10:25:43 +02:00
|
|
|
|
|
|
|
minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits })
|
2017-02-18 05:04:47 +01:00
|
|
|
end
|
|
|
|
|
2017-02-18 19:00:06 +01:00
|
|
|
-- ... and use this one to force that kind of node off of floor/ceiling
|
|
|
|
-- orientation after the screwdriver rotates it.
|
|
|
|
|
|
|
|
function unifieddyes.fix_after_screwdriver_nsew(pos, node, user, mode, new_param2)
|
|
|
|
local new_fdir = new_param2 % 8
|
|
|
|
local color = new_param2 - new_fdir
|
|
|
|
if new_fdir < 2 then
|
|
|
|
new_fdir = 2
|
|
|
|
minetest.swap_node(pos, { name = node.name, param2 = new_fdir + color })
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-01-25 18:31:40 +01:00
|
|
|
function unifieddyes.is_buildable_to(placer_name, ...)
|
|
|
|
for _, pos in ipairs({...}) do
|
|
|
|
local node = minetest.get_node_or_nil(pos)
|
|
|
|
local def = node and minetest.registered_nodes[node.name]
|
|
|
|
if not (def and def.buildable_to) or minetest.is_protected(pos, placer_name) then
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return true
|
|
|
|
end
|
|
|
|
|
2017-01-26 19:51:38 +01:00
|
|
|
function unifieddyes.get_hsv(name) -- expects a node/item name
|
2017-01-26 19:42:36 +01:00
|
|
|
local hue = ""
|
|
|
|
local a,b
|
2018-09-13 04:29:57 +02:00
|
|
|
for _, i in ipairs(unifieddyes.HUES_EXTENDED) do
|
|
|
|
a,b = string.find(name, "_"..i[1])
|
|
|
|
if a then
|
|
|
|
hue = i[1]
|
2017-01-26 19:42:36 +01:00
|
|
|
break
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-01-26 19:51:38 +01:00
|
|
|
if string.find(name, "_light_grey") then hue = "light_grey"
|
|
|
|
elseif string.find(name, "_lightgrey") then hue = "light_grey"
|
|
|
|
elseif string.find(name, "_dark_grey") then hue = "dark_grey"
|
|
|
|
elseif string.find(name, "_darkgrey") then hue = "dark_grey"
|
|
|
|
elseif string.find(name, "_grey") then hue = "grey"
|
|
|
|
elseif string.find(name, "_white") then hue = "white"
|
|
|
|
elseif string.find(name, "_black") then hue = "black"
|
2017-01-26 19:42:36 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
local sat = ""
|
|
|
|
if string.find(name, "_s50") then sat = "_s50" end
|
|
|
|
|
|
|
|
local val = ""
|
|
|
|
if string.find(name, "dark_") then val = "dark_" end
|
|
|
|
if string.find(name, "medium_") then val = "medium_" end
|
|
|
|
if string.find(name, "light_") then val = "light_" end
|
|
|
|
|
|
|
|
return hue, sat, val
|
|
|
|
end
|
|
|
|
|
2017-02-25 00:38:15 +01:00
|
|
|
-- code partially borrowed from cheapie's plasticbox mod
|
|
|
|
|
|
|
|
-- in the function below, color is just a color string, while
|
|
|
|
-- palette_type can be:
|
|
|
|
--
|
|
|
|
-- "extended" = 256 color palette
|
2018-09-13 04:29:57 +02:00
|
|
|
-- "split" = 200 color palette split into pieces for colorfacedir
|
|
|
|
-- "wallmounted" = 32-color abridged palette
|
|
|
|
|
2017-02-25 00:38:15 +01:00
|
|
|
|
|
|
|
function unifieddyes.getpaletteidx(color, palette_type)
|
2017-01-25 18:31:40 +01:00
|
|
|
|
2017-01-26 12:18:37 +01:00
|
|
|
local origcolor = color
|
2017-01-25 18:31:40 +01:00
|
|
|
local aliases = {
|
|
|
|
["pink"] = "light_red",
|
2017-06-20 21:43:39 +02:00
|
|
|
["brown"] = "medium_orange",
|
2018-08-25 08:40:17 +02:00
|
|
|
["azure"] = "light_blue"
|
2017-01-25 18:31:40 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
local grayscale = {
|
|
|
|
["white"] = 1,
|
|
|
|
["light_grey"] = 2,
|
|
|
|
["grey"] = 3,
|
|
|
|
["dark_grey"] = 4,
|
|
|
|
["black"] = 5,
|
|
|
|
}
|
|
|
|
|
2017-02-25 00:38:15 +01:00
|
|
|
local grayscale_extended = {
|
|
|
|
["white"] = 0,
|
|
|
|
["grey_14"] = 1,
|
|
|
|
["grey_13"] = 2,
|
|
|
|
["grey_12"] = 3,
|
|
|
|
["light_grey"] = 3,
|
|
|
|
["grey_11"] = 4,
|
|
|
|
["grey_10"] = 5,
|
|
|
|
["grey_9"] = 6,
|
|
|
|
["grey_8"] = 7,
|
|
|
|
["grey"] = 7,
|
|
|
|
["grey_7"] = 8,
|
|
|
|
["grey_6"] = 9,
|
|
|
|
["grey_5"] = 10,
|
|
|
|
["grey_4"] = 11,
|
|
|
|
["dark_grey"] = 11,
|
|
|
|
["grey_3"] = 12,
|
|
|
|
["grey_2"] = 13,
|
|
|
|
["grey_1"] = 14,
|
|
|
|
["black"] = 15,
|
|
|
|
}
|
|
|
|
|
add API option for "colorwallmounted" paramtype2
(pass "wallmounted" to the "is_color_fdir" field where needed)
Comes with an abridged, 32-color version of the master palette,
containing Red, Orange, Yellow, Green, Cyan, Blue, Violet, and Magenta,
in three shades each, plus the usual black/three greys/white, plus pink
and brown in two of the extrs spaces.
2017-01-29 03:51:46 +01:00
|
|
|
local grayscale_wallmounted = {
|
|
|
|
["white"] = 0,
|
|
|
|
["light_grey"] = 1,
|
|
|
|
["grey"] = 2,
|
|
|
|
["dark_grey"] = 3,
|
|
|
|
["black"] = 4,
|
|
|
|
}
|
|
|
|
|
2017-02-25 00:38:15 +01:00
|
|
|
local hues_extended = {
|
|
|
|
["red"] = 0,
|
|
|
|
["vermilion"] = 1,
|
|
|
|
["orange"] = 2,
|
|
|
|
["amber"] = 3,
|
|
|
|
["yellow"] = 4,
|
|
|
|
["lime"] = 5,
|
|
|
|
["chartreuse"] = 6,
|
|
|
|
["harlequin"] = 7,
|
|
|
|
["green"] = 8,
|
|
|
|
["malachite"] = 9,
|
|
|
|
["spring"] = 10,
|
2018-08-27 05:06:57 +02:00
|
|
|
["aqua"] = 10,
|
2017-02-25 00:38:15 +01:00
|
|
|
["turquoise"] = 11,
|
|
|
|
["cyan"] = 12,
|
|
|
|
["cerulean"] = 13,
|
|
|
|
["azure"] = 14,
|
2018-08-27 05:06:57 +02:00
|
|
|
["skyblue"] = 14,
|
2017-02-25 00:38:15 +01:00
|
|
|
["sapphire"] = 15,
|
|
|
|
["blue"] = 16,
|
|
|
|
["indigo"] = 17,
|
|
|
|
["violet"] = 18,
|
|
|
|
["mulberry"] = 19,
|
|
|
|
["magenta"] = 20,
|
|
|
|
["fuchsia"] = 21,
|
|
|
|
["rose"] = 22,
|
2018-08-27 05:06:57 +02:00
|
|
|
["redviolet"] = 22,
|
2017-02-25 00:38:15 +01:00
|
|
|
["crimson"] = 23,
|
|
|
|
}
|
|
|
|
|
add API option for "colorwallmounted" paramtype2
(pass "wallmounted" to the "is_color_fdir" field where needed)
Comes with an abridged, 32-color version of the master palette,
containing Red, Orange, Yellow, Green, Cyan, Blue, Violet, and Magenta,
in three shades each, plus the usual black/three greys/white, plus pink
and brown in two of the extrs spaces.
2017-01-29 03:51:46 +01:00
|
|
|
local hues_wallmounted = {
|
|
|
|
["red"] = 0,
|
|
|
|
["orange"] = 1,
|
|
|
|
["yellow"] = 2,
|
|
|
|
["green"] = 3,
|
|
|
|
["cyan"] = 4,
|
|
|
|
["blue"] = 5,
|
|
|
|
["violet"] = 6,
|
|
|
|
["magenta"] = 7
|
|
|
|
}
|
|
|
|
|
2017-01-25 18:31:40 +01:00
|
|
|
local shades = {
|
|
|
|
[""] = 1,
|
|
|
|
["s50"] = 2,
|
|
|
|
["light"] = 3,
|
|
|
|
["medium"] = 4,
|
|
|
|
["mediums50"] = 5,
|
|
|
|
["dark"] = 6,
|
|
|
|
["darks50"] = 7,
|
|
|
|
}
|
|
|
|
|
2018-09-13 04:37:52 +02:00
|
|
|
local shades_split = {
|
|
|
|
["faint"] = 0,
|
|
|
|
[""] = 1,
|
|
|
|
["s50"] = 2,
|
|
|
|
["light"] = 3,
|
|
|
|
["medium"] = 4,
|
|
|
|
["mediums50"] = 5,
|
|
|
|
["dark"] = 6,
|
|
|
|
["darks50"] = 7,
|
|
|
|
}
|
|
|
|
|
2017-02-25 00:38:15 +01:00
|
|
|
local shades_extended = {
|
2017-02-25 01:57:48 +01:00
|
|
|
["faint"] = 0,
|
|
|
|
["pastel"] = 1,
|
|
|
|
["light"] = 2,
|
|
|
|
["bright"] = 3,
|
|
|
|
[""] = 4,
|
|
|
|
["s50"] = 5,
|
|
|
|
["medium"] = 6,
|
|
|
|
["mediums50"] = 7,
|
|
|
|
["dark"] = 8,
|
|
|
|
["darks50"] = 9
|
2017-02-25 00:38:15 +01:00
|
|
|
}
|
|
|
|
|
add API option for "colorwallmounted" paramtype2
(pass "wallmounted" to the "is_color_fdir" field where needed)
Comes with an abridged, 32-color version of the master palette,
containing Red, Orange, Yellow, Green, Cyan, Blue, Violet, and Magenta,
in three shades each, plus the usual black/three greys/white, plus pink
and brown in two of the extrs spaces.
2017-01-29 03:51:46 +01:00
|
|
|
local shades_wallmounted = {
|
|
|
|
[""] = 1,
|
|
|
|
["medium"] = 2,
|
|
|
|
["dark"] = 3
|
|
|
|
}
|
|
|
|
|
2017-01-25 18:31:40 +01:00
|
|
|
if string.sub(color,1,4) == "dye:" then
|
|
|
|
color = string.sub(color,5,-1)
|
|
|
|
elseif string.sub(color,1,12) == "unifieddyes:" then
|
|
|
|
color = string.sub(color,13,-1)
|
|
|
|
else
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2017-02-25 00:38:15 +01:00
|
|
|
if palette_type == "wallmounted" then
|
add API option for "colorwallmounted" paramtype2
(pass "wallmounted" to the "is_color_fdir" field where needed)
Comes with an abridged, 32-color version of the master palette,
containing Red, Orange, Yellow, Green, Cyan, Blue, Violet, and Magenta,
in three shades each, plus the usual black/three greys/white, plus pink
and brown in two of the extrs spaces.
2017-01-29 03:51:46 +01:00
|
|
|
if grayscale_wallmounted[color] then
|
2017-01-30 11:32:17 +01:00
|
|
|
return (grayscale_wallmounted[color] * 8), 0
|
add API option for "colorwallmounted" paramtype2
(pass "wallmounted" to the "is_color_fdir" field where needed)
Comes with an abridged, 32-color version of the master palette,
containing Red, Orange, Yellow, Green, Cyan, Blue, Violet, and Magenta,
in three shades each, plus the usual black/three greys/white, plus pink
and brown in two of the extrs spaces.
2017-01-29 03:51:46 +01:00
|
|
|
end
|
2018-09-08 18:09:25 +02:00
|
|
|
elseif palette_type == "split" then
|
add API option for "colorwallmounted" paramtype2
(pass "wallmounted" to the "is_color_fdir" field where needed)
Comes with an abridged, 32-color version of the master palette,
containing Red, Orange, Yellow, Green, Cyan, Blue, Violet, and Magenta,
in three shades each, plus the usual black/three greys/white, plus pink
and brown in two of the extrs spaces.
2017-01-29 03:51:46 +01:00
|
|
|
if grayscale[color] then
|
2017-01-26 12:18:37 +01:00
|
|
|
return (grayscale[color] * 32), 0
|
2017-01-29 06:06:08 +01:00
|
|
|
end
|
2017-02-25 00:38:15 +01:00
|
|
|
elseif palette_type == "extended" then
|
|
|
|
if grayscale_extended[color] then
|
2017-02-25 01:57:48 +01:00
|
|
|
return grayscale_extended[color]+240, 0
|
2017-02-25 00:38:15 +01:00
|
|
|
end
|
2017-01-25 18:31:40 +01:00
|
|
|
end
|
|
|
|
|
2017-02-25 00:38:15 +01:00
|
|
|
local shade = "" -- assume full
|
|
|
|
if string.sub(color,1,6) == "faint_" then
|
|
|
|
shade = "faint"
|
|
|
|
color = string.sub(color,7,-1)
|
|
|
|
elseif string.sub(color,1,7) == "pastel_" then
|
|
|
|
shade = "pastel"
|
|
|
|
color = string.sub(color,8,-1)
|
|
|
|
elseif string.sub(color,1,6) == "light_" then
|
2017-01-25 18:31:40 +01:00
|
|
|
shade = "light"
|
|
|
|
color = string.sub(color,7,-1)
|
2017-02-25 00:38:15 +01:00
|
|
|
elseif string.sub(color,1,7) == "bright_" then
|
|
|
|
shade = "bright"
|
|
|
|
color = string.sub(color,8,-1)
|
2017-01-25 18:31:40 +01:00
|
|
|
elseif string.sub(color,1,7) == "medium_" then
|
|
|
|
shade = "medium"
|
|
|
|
color = string.sub(color,8,-1)
|
|
|
|
elseif string.sub(color,1,5) == "dark_" then
|
|
|
|
shade = "dark"
|
|
|
|
color = string.sub(color,6,-1)
|
|
|
|
end
|
|
|
|
if string.sub(color,-4,-1) == "_s50" then
|
|
|
|
shade = shade.."s50"
|
|
|
|
color = string.sub(color,1,-5)
|
|
|
|
end
|
|
|
|
|
2017-02-25 00:38:15 +01:00
|
|
|
if palette_type == "wallmounted" then
|
2018-08-25 08:40:17 +02:00
|
|
|
if color == "green" and shade == "light" then return 48,3
|
|
|
|
elseif color == "brown" then return 17,1
|
2017-02-06 15:22:10 +01:00
|
|
|
elseif color == "pink" then return 56,7
|
2018-09-08 17:21:00 +02:00
|
|
|
elseif color == "blue" and shade == "light" then return 40,5
|
add API option for "colorwallmounted" paramtype2
(pass "wallmounted" to the "is_color_fdir" field where needed)
Comes with an abridged, 32-color version of the master palette,
containing Red, Orange, Yellow, Green, Cyan, Blue, Violet, and Magenta,
in three shades each, plus the usual black/three greys/white, plus pink
and brown in two of the extrs spaces.
2017-01-29 03:51:46 +01:00
|
|
|
elseif hues_wallmounted[color] and shades_wallmounted[shade] then
|
|
|
|
return (shades_wallmounted[shade] * 64 + hues_wallmounted[color] * 8), hues_wallmounted[color]
|
|
|
|
end
|
2017-02-06 15:22:10 +01:00
|
|
|
else
|
|
|
|
if color == "brown" then
|
|
|
|
color = "orange"
|
2017-06-20 21:43:39 +02:00
|
|
|
shade = "medium"
|
2017-02-06 15:22:10 +01:00
|
|
|
elseif color == "pink" then
|
|
|
|
color = "red"
|
|
|
|
shade = "light"
|
|
|
|
end
|
2018-09-08 18:09:25 +02:00
|
|
|
if palette_type == "split" then -- it's colorfacedir
|
2018-09-13 04:37:52 +02:00
|
|
|
if hues_extended[color] and shades_split[shade] then
|
|
|
|
return (shades_split[shade] * 32), hues_extended[color]+1
|
2017-02-25 00:38:15 +01:00
|
|
|
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
|
2017-01-26 12:18:37 +01:00
|
|
|
end
|
2017-01-25 18:31:40 +01:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-08-26 13:23:40 +02:00
|
|
|
-- punch-to-recolor using the airbrush
|
2018-08-26 08:37:58 +02:00
|
|
|
|
|
|
|
function unifieddyes.on_airbrush(itemstack, player, pointed_thing)
|
|
|
|
local player_name = player:get_player_name()
|
|
|
|
local painting_with = nil
|
|
|
|
|
2018-08-27 05:50:00 +02:00
|
|
|
if unifieddyes.player_current_dye[player_name] then
|
2018-08-26 08:37:58 +02:00
|
|
|
painting_with = unifieddyes.player_current_dye[player_name]
|
|
|
|
end
|
|
|
|
|
|
|
|
local pos = minetest.get_pointed_thing_position(pointed_thing)
|
2018-08-27 01:34:01 +02:00
|
|
|
if not pos then return end
|
2018-08-26 08:37:58 +02:00
|
|
|
|
|
|
|
local node = minetest.get_node(pos)
|
|
|
|
local def = minetest.registered_items[node.name]
|
|
|
|
if not def then return end
|
|
|
|
|
2018-08-26 14:59:28 +02:00
|
|
|
if minetest.is_protected(pos, player_name) then
|
2018-08-27 04:28:48 +02:00
|
|
|
minetest.chat_send_player(player_name, "*** Sorry, someone else owns that node.")
|
2018-08-26 14:59:28 +02:00
|
|
|
return
|
|
|
|
end
|
|
|
|
|
2018-08-27 04:27:43 +02:00
|
|
|
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
|
|
|
|
|
2018-09-13 01:39:40 +02:00
|
|
|
if not (def.groups and def.groups.ud_param2_colorable and def.groups.ud_param2_colorable > 0) then
|
2018-08-27 04:28:48 +02:00
|
|
|
minetest.chat_send_player(player_name, "*** That node can't be colored.")
|
2018-08-26 08:37:58 +02:00
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
local palette = nil
|
|
|
|
local fdir = 0
|
2018-10-19 22:00:05 +02:00
|
|
|
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
|
2018-08-26 08:37:58 +02:00
|
|
|
palette = "extended"
|
2018-09-14 04:16:47 +02:00
|
|
|
elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then
|
2018-08-26 08:37:58 +02:00
|
|
|
palette = "wallmounted"
|
|
|
|
fdir = node.param2 % 8
|
2018-09-14 04:16:47 +02:00
|
|
|
elseif def.palette ~= "unifieddyes_palette_extended.png"
|
|
|
|
and def.palette ~= "unifieddyes_palette_colorwallmounted.png"
|
|
|
|
and string.find(def.palette, "unifieddyes_palette_") then
|
2018-09-08 18:09:25 +02:00
|
|
|
palette = "split"
|
2018-08-26 08:37:58 +02:00
|
|
|
fdir = node.param2 % 32
|
2018-09-12 23:57:43 +02:00
|
|
|
else
|
|
|
|
minetest.chat_send_player(player_name, "*** That node can't be colored -- it has an invalid color mode.")
|
|
|
|
return
|
2018-08-26 08:37:58 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
local idx, hue = unifieddyes.getpaletteidx(painting_with, palette)
|
|
|
|
local inv = player:get_inventory()
|
|
|
|
if (not creative or not creative.is_enabled_for(player_name)) and not inv:contains_item("main", painting_with) then
|
|
|
|
local suff = ""
|
|
|
|
if not idx then
|
|
|
|
suff = " Besides, "..string.sub(painting_with, 5).." can't be applied to that node."
|
|
|
|
end
|
2018-08-27 04:28:48 +02:00
|
|
|
minetest.chat_send_player(player_name, "*** You're in survival mode, and you're out of "..string.sub(painting_with, 5).."."..suff)
|
2018-08-26 08:37:58 +02:00
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
if not idx then
|
2018-08-27 04:28:48 +02:00
|
|
|
minetest.chat_send_player(player_name, "*** "..string.sub(painting_with, 5).." can't be applied to that node.")
|
2018-08-26 08:37:58 +02:00
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
local oldidx = node.param2 - fdir
|
2018-08-26 13:23:40 +02:00
|
|
|
local name = def.airbrush_replacement_node or node.name
|
|
|
|
|
2018-09-08 18:09:25 +02:00
|
|
|
if palette == "split" then
|
2018-09-12 23:57:43 +02:00
|
|
|
|
2018-08-27 05:06:57 +02:00
|
|
|
local modname = string.sub(name, 1, string.find(name, ":")-1)
|
|
|
|
local nodename2 = string.sub(name, string.find(name, ":")+1)
|
2018-08-29 04:39:09 +02:00
|
|
|
local oldcolor = "snozzberry"
|
|
|
|
local newcolor = "razzberry" -- intentionally misspelled ;-)
|
2018-08-27 05:06:57 +02:00
|
|
|
|
2018-08-29 04:39:09 +02:00
|
|
|
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
|
2018-09-13 04:29:57 +02:00
|
|
|
newcolor = unifieddyes.HUES_EXTENDED[hue][1]
|
2018-08-29 04:39:09 +02:00
|
|
|
else
|
|
|
|
newcolor = "grey"
|
|
|
|
end
|
2018-08-27 05:06:57 +02:00
|
|
|
|
2018-09-12 23:57:43 +02:00
|
|
|
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
|
2018-08-27 05:06:57 +02:00
|
|
|
end
|
|
|
|
|
2018-08-29 04:39:09 +02:00
|
|
|
name = modname..":"..string.gsub(nodename2, oldcolor, newcolor)
|
2018-09-12 23:57:43 +02:00
|
|
|
|
2018-08-29 04:39:09 +02:00
|
|
|
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
|
2018-08-27 05:06:57 +02:00
|
|
|
elseif idx == oldidx then
|
|
|
|
return
|
|
|
|
end
|
2018-08-26 13:23:40 +02:00
|
|
|
minetest.swap_node(pos, {name = name, param2 = fdir + idx})
|
2018-08-26 08:37:58 +02:00
|
|
|
if not creative or not creative.is_enabled_for(player_name) then
|
|
|
|
inv:remove_item("main", painting_with)
|
|
|
|
return
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-08-27 04:09:44 +02:00
|
|
|
-- get a node's dye color based on its palette and param2
|
|
|
|
|
|
|
|
function unifieddyes.color_to_name(param2, def)
|
|
|
|
if not param2 or not def or not def.palette then return end
|
|
|
|
|
|
|
|
if def.palette == "unifieddyes_palette_extended.png" then
|
|
|
|
local color = param2
|
|
|
|
|
|
|
|
local v = 0
|
|
|
|
local s = 1
|
|
|
|
if color < 24 then v = 1
|
|
|
|
elseif color > 23 and color < 48 then v = 2
|
|
|
|
elseif color > 47 and color < 72 then v = 3
|
|
|
|
elseif color > 71 and color < 96 then v = 4
|
|
|
|
elseif color > 95 and color < 120 then v = 5
|
|
|
|
elseif color > 119 and color < 144 then v = 5 s = 2
|
|
|
|
elseif color > 143 and color < 168 then v = 6
|
|
|
|
elseif color > 167 and color < 192 then v = 6 s = 2
|
|
|
|
elseif color > 191 and color < 216 then v = 7
|
|
|
|
elseif color > 215 and color < 240 then v = 7 s = 2
|
|
|
|
end
|
|
|
|
|
|
|
|
if color > 239 then
|
|
|
|
if color == 240 then return "white"
|
|
|
|
elseif color == 244 then return "light_grey"
|
|
|
|
elseif color == 247 then return "grey"
|
|
|
|
elseif color == 251 then return "dark_grey"
|
|
|
|
elseif color == 255 then return "black"
|
|
|
|
else return "grey_"..15-(color-240)
|
|
|
|
end
|
|
|
|
else
|
|
|
|
local h = color - math.floor(color/24)*24
|
|
|
|
return unifieddyes.VALS_EXTENDED[v]..unifieddyes.HUES_EXTENDED[h+1][1]..unifieddyes.SATS[s]
|
|
|
|
end
|
|
|
|
|
|
|
|
elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then
|
|
|
|
local color = math.floor(param2 / 8)
|
|
|
|
if color == 0 then return "white"
|
|
|
|
elseif color == 1 then return "light_grey"
|
|
|
|
elseif color == 2 then return "grey"
|
|
|
|
elseif color == 3 then return "dark_grey"
|
|
|
|
elseif color == 4 then return "black"
|
2018-08-27 05:06:57 +02:00
|
|
|
elseif color == 5 then return "light_blue"
|
2018-08-27 04:09:44 +02:00
|
|
|
elseif color == 6 then return "light_green"
|
|
|
|
elseif color == 7 then return "pink"
|
|
|
|
end
|
|
|
|
local v = math.floor(color/8)
|
|
|
|
local h = color - v * 8
|
|
|
|
return unifieddyes.VALS[v]..unifieddyes.HUES_WALLMOUNTED[h+1]
|
|
|
|
|
2018-09-13 04:29:57 +02:00
|
|
|
elseif string.find(def.palette, "unifieddyes_palette") then -- it's the split palette
|
2018-08-27 04:09:44 +02:00
|
|
|
-- palette names in this mode are always "unifieddyes_palette_COLORs.png"
|
|
|
|
|
|
|
|
local s = string.sub(def.palette, 21)
|
2018-08-27 05:06:57 +02:00
|
|
|
local color = string.sub(s, 1, string.find(s, "s.png")-1)
|
2018-08-27 04:09:44 +02:00
|
|
|
|
|
|
|
local v = math.floor(param2/32)
|
|
|
|
if color ~= "grey" then
|
2018-09-13 04:37:52 +02:00
|
|
|
if v == 0 then return "faint_"..color
|
|
|
|
elseif v == 1 then return color
|
2018-08-27 04:09:44 +02:00
|
|
|
elseif v == 2 then return color.."_s50"
|
|
|
|
elseif v == 3 then return "light_"..color
|
|
|
|
elseif v == 4 then return "medium_"..color
|
|
|
|
elseif v == 5 then return "medium_"..color.."_s50"
|
|
|
|
elseif v == 6 then return "dark_"..color
|
|
|
|
elseif v == 7 then return "dark_"..color.."_s50"
|
|
|
|
end
|
|
|
|
else
|
|
|
|
if v > 0 and v < 6 then return unifieddyes.GREYS[v]
|
|
|
|
else return "white"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-09-08 15:47:31 +02:00
|
|
|
local hps = 0.6 -- horizontal position scale
|
|
|
|
local vps = 1.3 -- vertical position scale
|
2018-09-24 00:11:07 +02:00
|
|
|
local vs = 0.1 -- vertical shift/offset
|
|
|
|
|
2018-09-08 15:47:31 +02:00
|
|
|
local color_button_size = ";0.75,0.75;"
|
2018-09-13 06:17:13 +02:00
|
|
|
local color_square_size = ";0.69,0.69;"
|
2018-09-08 15:47:31 +02:00
|
|
|
|
2018-09-24 00:11:07 +02:00
|
|
|
function unifieddyes.make_readable_color(color)
|
|
|
|
local s = string.gsub(color, "_", " ")
|
|
|
|
s = string.gsub(s, "s50", "(low saturation)")
|
|
|
|
return s
|
|
|
|
end
|
|
|
|
|
2018-09-13 06:03:59 +02:00
|
|
|
function unifieddyes.make_colored_square(hexcolor, colorname, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
|
2018-09-08 15:47:31 +02:00
|
|
|
|
|
|
|
local dye = "dye:"..colorname
|
|
|
|
|
|
|
|
local overlay = ""
|
|
|
|
local colorize = minetest.formspec_escape("^[colorize:#"..hexcolor..":255")
|
|
|
|
|
2018-09-08 16:13:31 +02:00
|
|
|
if not creative and inv:contains_item("main", dye) then
|
2018-09-08 16:15:51 +02:00
|
|
|
overlay = "^unifieddyes_onhand_overlay.png"
|
2018-09-08 15:47:31 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
local unavail_overlay = ""
|
2018-09-13 06:03:59 +02:00
|
|
|
if not showall and not unifieddyes.palette_has_color[nodepalette.."_"..colorname]
|
|
|
|
or (explist and not explist[colorname]) then
|
2018-09-08 16:24:08 +02:00
|
|
|
if overlay == "" then
|
|
|
|
unavail_overlay = "^unifieddyes_unavailable_overlay.png"
|
|
|
|
else
|
|
|
|
unavail_overlay = "^unifieddyes_onhand_unavailable_overlay.png"
|
|
|
|
end
|
2018-09-08 15:47:31 +02:00
|
|
|
end
|
|
|
|
|
2018-09-24 00:11:07 +02:00
|
|
|
local tooltip = "tooltip["..colorname..";"..
|
|
|
|
unifieddyes.make_readable_color(colorname)..
|
|
|
|
"\n(dye:"..colorname..")]"
|
|
|
|
|
2018-09-08 15:47:31 +02:00
|
|
|
if dye == painting_with then
|
|
|
|
overlay = "^unifieddyes_select_overlay.png"
|
2018-09-24 00:11:07 +02:00
|
|
|
selindic = "unifieddyes_white_square.png"..colorize..overlay..unavail_overlay.."]"..tooltip
|
2018-09-08 15:47:31 +02:00
|
|
|
end
|
2018-09-13 06:17:13 +02:00
|
|
|
|
2018-09-24 00:11:07 +02:00
|
|
|
local form
|
2018-09-13 06:17:13 +02:00
|
|
|
if unavail_overlay == "" then
|
|
|
|
form = "image_button["..
|
|
|
|
(hp*hps)..","..(v2*vps+vs)..
|
|
|
|
color_button_size..
|
|
|
|
"unifieddyes_white_square.png"..colorize..overlay..unavail_overlay..";"..
|
|
|
|
colorname..";]"..
|
2018-09-24 00:11:07 +02:00
|
|
|
tooltip
|
2018-09-13 06:17:13 +02:00
|
|
|
else
|
|
|
|
form = "image["..
|
|
|
|
(hp*hps)..","..(v2*vps+vs)..
|
|
|
|
color_square_size..
|
|
|
|
"unifieddyes_white_square.png"..colorize..overlay..unavail_overlay.."]"..
|
2018-09-24 00:11:07 +02:00
|
|
|
tooltip
|
2018-09-13 06:17:13 +02:00
|
|
|
end
|
2018-09-08 15:47:31 +02:00
|
|
|
|
|
|
|
return form, selindic
|
|
|
|
end
|
|
|
|
|
2018-08-26 08:37:58 +02:00
|
|
|
function unifieddyes.show_airbrush_form(player)
|
|
|
|
if not player then return end
|
2018-09-08 16:50:04 +02:00
|
|
|
|
|
|
|
local t = {}
|
|
|
|
|
2018-08-26 08:37:58 +02:00
|
|
|
local player_name = player:get_player_name()
|
2018-08-28 02:01:15 +02:00
|
|
|
local painting_with = unifieddyes.player_selected_dye[player_name] or unifieddyes.player_current_dye[player_name]
|
2018-08-26 08:37:58 +02:00
|
|
|
local creative = creative and creative.is_enabled_for(player_name)
|
|
|
|
local inv = player:get_inventory()
|
2018-09-08 15:09:13 +02:00
|
|
|
local nodepalette = "extended"
|
|
|
|
local showall = unifieddyes.player_showall[player_name]
|
2018-08-26 08:37:58 +02:00
|
|
|
|
2018-09-24 00:11:07 +02:00
|
|
|
t[1] = "size[14.5,8.5]label[7,-0.3;Select a color:]"
|
2018-09-08 15:47:31 +02:00
|
|
|
local selindic = "unifieddyes_select_overlay.png^unifieddyes_question.png]"
|
2018-09-08 15:09:13 +02:00
|
|
|
|
|
|
|
local last_right_click = unifieddyes.player_last_right_clicked[player_name]
|
|
|
|
if last_right_click then
|
2018-09-14 04:16:47 +02:00
|
|
|
if last_right_click.def and last_right_click.def.palette then
|
|
|
|
if last_right_click.def.palette == "unifieddyes_palette_colorwallmounted.png" then
|
2018-09-08 15:09:13 +02:00
|
|
|
nodepalette = "wallmounted"
|
2018-09-14 04:16:47 +02:00
|
|
|
elseif last_right_click.def.palette == "unifieddyes_palette_extended.png" then
|
2018-09-08 16:50:04 +02:00
|
|
|
t[#t+1] = "label[0.5,8.25;(Right-clicked a node that supports all 256 colors, showing them all)]"
|
2018-09-08 15:09:13 +02:00
|
|
|
showall = true
|
2018-09-14 04:16:47 +02:00
|
|
|
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
|
2018-09-08 18:09:25 +02:00
|
|
|
nodepalette = "split"
|
2018-09-08 15:09:13 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-09-14 04:16:47 +02:00
|
|
|
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
|
2018-09-12 23:57:43 +02:00
|
|
|
t[#t+1] = "label[0.5,8.25;(Right-clicked a node not supported by the Airbrush, showing all colors)]"
|
|
|
|
end
|
|
|
|
|
2018-09-13 06:03:59 +02:00
|
|
|
local explist = last_right_click.def.explist
|
|
|
|
|
2018-08-26 08:37:58 +02:00
|
|
|
for v = 0, 6 do
|
|
|
|
local val = unifieddyes.VALS_EXTENDED[v+1]
|
|
|
|
|
|
|
|
local sat = ""
|
|
|
|
local v2=(v/2)
|
|
|
|
|
|
|
|
for hi, h in ipairs(unifieddyes.HUES_EXTENDED) do
|
|
|
|
local hue = h[1]
|
2018-09-24 00:11:07 +02:00
|
|
|
local hp=hi-1
|
2018-08-26 08:37:58 +02:00
|
|
|
|
|
|
|
local r = h[2]
|
|
|
|
local g = h[3]
|
|
|
|
local b = h[4]
|
|
|
|
|
|
|
|
local factor = 40
|
|
|
|
if v > 3 then
|
|
|
|
factor = 75
|
|
|
|
v2 = (v-2)
|
|
|
|
end
|
|
|
|
|
|
|
|
local r2 = math.max(math.min(r + (4-v)*factor, 255), 0)
|
|
|
|
local g2 = math.max(math.min(g + (4-v)*factor, 255), 0)
|
|
|
|
local b2 = math.max(math.min(b + (4-v)*factor, 255), 0)
|
|
|
|
|
2018-09-08 15:47:31 +02:00
|
|
|
local hexcolor = string.format("%02x", r2)..string.format("%02x", g2)..string.format("%02x", b2)
|
|
|
|
local f
|
2018-09-13 06:03:59 +02:00
|
|
|
f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
|
2018-09-08 16:50:04 +02:00
|
|
|
t[#t+1] = f
|
2018-08-26 08:37:58 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
if v > 3 then
|
|
|
|
sat = "_s50"
|
|
|
|
v2 = (v-1.5)
|
|
|
|
|
|
|
|
for hi, h in ipairs(unifieddyes.HUES_EXTENDED) do
|
|
|
|
local hue = h[1]
|
2018-09-24 00:11:07 +02:00
|
|
|
local hp=hi-1
|
2018-08-26 08:37:58 +02:00
|
|
|
|
|
|
|
local r = h[2]
|
|
|
|
local g = h[3]
|
|
|
|
local b = h[4]
|
|
|
|
|
|
|
|
local factor = 75
|
|
|
|
|
|
|
|
local pr = 0.299
|
|
|
|
local pg = 0.587
|
|
|
|
local pb = 0.114
|
|
|
|
|
|
|
|
local r2 = math.max(math.min(r + (4-v)*factor, 255), 0)
|
|
|
|
local g2 = math.max(math.min(g + (4-v)*factor, 255), 0)
|
|
|
|
local b2 = math.max(math.min(b + (4-v)*factor, 255), 0)
|
|
|
|
|
|
|
|
local p = math.sqrt(r2*r2*pr + g2*g2*pg + b2*b2*pb)
|
|
|
|
local r3 = math.floor(p+(r2-p)*0.5)
|
|
|
|
local g3 = math.floor(p+(g2-p)*0.5)
|
|
|
|
local b3 = math.floor(p+(b2-p)*0.5)
|
|
|
|
|
2018-09-08 15:47:31 +02:00
|
|
|
local hexcolor = string.format("%02x", r3)..string.format("%02x", g3)..string.format("%02x", b3)
|
|
|
|
local f
|
2018-09-13 06:03:59 +02:00
|
|
|
f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
|
2018-09-08 16:50:04 +02:00
|
|
|
t[#t+1] = f
|
2018-08-26 08:37:58 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local v2=5
|
|
|
|
for y = 0, 15 do
|
|
|
|
|
2018-09-24 00:11:07 +02:00
|
|
|
local hp=15-y
|
2018-08-26 08:37:58 +02:00
|
|
|
|
2018-09-08 15:47:31 +02:00
|
|
|
local hexgrey = string.format("%02x", y*17)..string.format("%02x", y*17)..string.format("%02x", y*17)
|
|
|
|
local grey = "grey_"..y
|
2018-08-26 08:37:58 +02:00
|
|
|
|
2018-09-08 15:47:31 +02:00
|
|
|
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"
|
2018-09-08 15:09:13 +02:00
|
|
|
end
|
|
|
|
|
2018-09-08 15:47:31 +02:00
|
|
|
local f
|
2018-09-13 06:03:59 +02:00
|
|
|
f, selindic = unifieddyes.make_colored_square(hexgrey, grey, showall, creative, painting_with, nodepalette, hp, v2, selindic, inv, explist)
|
2018-09-08 16:50:04 +02:00
|
|
|
t[#t+1] = f
|
2018-08-26 08:37:58 +02:00
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
if not creative then
|
2018-09-24 00:11:07 +02:00
|
|
|
t[#t+1] = "image[10,"
|
|
|
|
t[#t+1] = (vps*5.55+vs)
|
2018-09-08 16:50:04 +02:00
|
|
|
t[#t+1] = color_button_size
|
2018-09-24 00:11:07 +02:00
|
|
|
t[#t+1] = "unifieddyes_onhand_overlay.png]label[10.7,"
|
|
|
|
t[#t+1] = (vps*5.51+vs)
|
2018-09-08 17:08:37 +02:00
|
|
|
t[#t+1] = ";Dyes]"
|
2018-09-24 00:11:07 +02:00
|
|
|
t[#t+1] = "label[10.7,"
|
|
|
|
t[#t+1] = (vps*5.67+vs)
|
2018-09-08 17:08:37 +02:00
|
|
|
t[#t+1] = ";on hand]"
|
|
|
|
|
2018-08-28 01:52:15 +02:00
|
|
|
end
|
2018-09-08 15:09:13 +02:00
|
|
|
|
2018-09-24 00:11:07 +02:00
|
|
|
t[#t+1] = "image[10,"
|
2018-09-08 16:50:04 +02:00
|
|
|
t[#t+1] = (vps*5+vs)
|
|
|
|
t[#t+1] = color_button_size
|
|
|
|
t[#t+1] = selindic
|
2018-09-08 17:08:37 +02:00
|
|
|
|
|
|
|
if painting_with then
|
2018-09-24 00:11:07 +02:00
|
|
|
t[#t+1] = "label[10.7,"
|
|
|
|
t[#t+1] = (vps*4.90+vs)
|
2018-09-08 17:08:37 +02:00
|
|
|
t[#t+1] = ";Your selection:]"
|
2018-09-24 00:11:07 +02:00
|
|
|
t[#t+1] = "label[10.7,"
|
|
|
|
t[#t+1] = (vps*5.07+vs)
|
2018-09-08 17:08:37 +02:00
|
|
|
t[#t+1] = ";"
|
2018-09-24 00:11:07 +02:00
|
|
|
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] = ";("
|
2018-09-08 17:08:37 +02:00
|
|
|
t[#t+1] = painting_with
|
2018-09-24 00:11:07 +02:00
|
|
|
t[#t+1] = ")]"
|
2018-09-08 17:08:37 +02:00
|
|
|
else
|
2018-09-24 00:11:07 +02:00
|
|
|
t[#t+1] = "label[10.7,"
|
|
|
|
t[#t+1] = (vps*5.07+vs)
|
2018-09-08 17:08:37 +02:00
|
|
|
t[#t+1] = ";Your selection]"
|
|
|
|
end
|
2018-08-26 08:37:58 +02:00
|
|
|
|
2018-09-24 00:11:07 +02:00
|
|
|
t[#t+1] = "button_exit[10.5,8;2,1;cancel;Cancel]button_exit[12.5,8;2,1;accept;Accept]"
|
2018-08-26 08:37:58 +02:00
|
|
|
|
2018-09-08 15:09:13 +02:00
|
|
|
|
2018-09-12 23:57:43 +02:00
|
|
|
if last_right_click and last_right_click.def and nodepalette ~= "extended" then
|
2018-09-08 15:09:13 +02:00
|
|
|
if showall then
|
2018-09-24 00:11:07 +02:00
|
|
|
t[#t+1] = "button[0,8;2,1;show_avail;Show Available]"
|
|
|
|
t[#t+1] = "label[2,8.25;(Currently showing all 256 colors)]"
|
2018-09-08 15:09:13 +02:00
|
|
|
else
|
2018-09-24 00:11:07 +02:00
|
|
|
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)]"
|
2018-09-08 15:09:13 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-09-08 16:50:04 +02:00
|
|
|
minetest.show_formspec(player_name, "unifieddyes:dye_select_form", table.concat(t))
|
2018-08-26 08:37:58 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
minetest.register_tool("unifieddyes:airbrush", {
|
|
|
|
description = S("Dye Airbrush"),
|
|
|
|
inventory_image = "unifieddyes_airbrush.png",
|
|
|
|
use_texture_alpha = true,
|
|
|
|
tool_capabilities = {
|
|
|
|
full_punch_interval=0.1,
|
|
|
|
},
|
|
|
|
range = 12,
|
2018-08-27 01:34:01 +02:00
|
|
|
on_use = unifieddyes.on_airbrush,
|
|
|
|
on_place = function(itemstack, placer, pointed_thing)
|
2018-08-27 04:09:44 +02:00
|
|
|
local keys = placer:get_player_control()
|
2018-09-08 15:09:13 +02:00
|
|
|
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}
|
|
|
|
|
2018-08-27 04:09:44 +02:00
|
|
|
if not keys.sneak then
|
2018-08-27 01:34:01 +02:00
|
|
|
unifieddyes.show_airbrush_form(placer)
|
2018-08-27 04:09:44 +02:00
|
|
|
elseif keys.sneak then
|
2018-09-08 15:09:13 +02:00
|
|
|
|
|
|
|
if not pos or not def then return end
|
2018-08-27 04:09:44 +02:00
|
|
|
local newcolor = unifieddyes.color_to_name(node.param2, def)
|
|
|
|
|
|
|
|
if not newcolor then
|
2018-08-27 04:28:48 +02:00
|
|
|
minetest.chat_send_player(player_name, "*** That node is uncolored.")
|
2018-08-27 04:09:44 +02:00
|
|
|
return
|
|
|
|
end
|
2018-08-27 04:34:08 +02:00
|
|
|
minetest.chat_send_player(player_name, "*** Switching to "..newcolor.." for the airbrush, to match that node.")
|
2018-08-27 04:09:44 +02:00
|
|
|
unifieddyes.player_current_dye[player_name] = "dye:"..newcolor
|
2018-08-27 01:34:01 +02:00
|
|
|
end
|
|
|
|
end
|
2018-08-26 08:37:58 +02:00
|
|
|
})
|
|
|
|
|
2018-08-26 14:41:04 +02:00
|
|
|
minetest.register_craft( {
|
|
|
|
output = "unifieddyes:airbrush",
|
|
|
|
recipe = {
|
|
|
|
{ "default:gold_ingot", "", "bucket:bucket_empty" },
|
|
|
|
{ "", "default:steel_ingot", "" },
|
|
|
|
{ "", "", "default:steel_ingot" }
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
2018-08-26 08:37:58 +02:00
|
|
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
2018-09-08 15:09:13 +02:00
|
|
|
|
2018-08-26 08:37:58 +02:00
|
|
|
if formname == "unifieddyes:dye_select_form" then
|
2018-09-08 16:05:13 +02:00
|
|
|
|
2018-08-26 08:37:58 +02:00
|
|
|
local player_name = player:get_player_name()
|
2018-09-08 16:05:13 +02:00
|
|
|
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
|
2018-09-08 18:09:25 +02:00
|
|
|
nodepalette = "split"
|
2018-09-08 16:05:13 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-09-08 15:09:13 +02:00
|
|
|
if fields.show_all then
|
|
|
|
unifieddyes.player_showall[player_name] = true
|
|
|
|
unifieddyes.show_airbrush_form(player)
|
|
|
|
return
|
|
|
|
elseif fields.show_avail then
|
|
|
|
unifieddyes.player_showall[player_name] = false
|
|
|
|
unifieddyes.show_airbrush_form(player)
|
|
|
|
return
|
|
|
|
elseif fields.quit then
|
|
|
|
if fields.accept then
|
2018-08-28 01:45:34 +02:00
|
|
|
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
|
2018-09-08 16:05:13 +02:00
|
|
|
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
|
2018-08-28 01:45:34 +02:00
|
|
|
minetest.chat_send_player(player_name, "*** Selected "..string.sub(dye, 5).." for the airbrush.")
|
2018-09-08 16:05:13 +02:00
|
|
|
return
|
|
|
|
end
|
2018-09-08 15:09:13 +02:00
|
|
|
else -- assume "Cancel" or Esc.
|
|
|
|
unifieddyes.player_selected_dye[player_name] = nil
|
|
|
|
return
|
2018-08-28 01:45:34 +02:00
|
|
|
end
|
2018-08-26 08:37:58 +02:00
|
|
|
else
|
2018-08-28 01:45:34 +02:00
|
|
|
local s1 = string.sub(minetest.serialize(fields), 11)
|
|
|
|
local s3 = string.sub(s1,1, string.find(s1, '"')-1)
|
|
|
|
|
2018-08-26 08:37:58 +02:00
|
|
|
local inv = player:get_inventory()
|
|
|
|
local creative = creative and creative.is_enabled_for(player_name)
|
|
|
|
local dye = "dye:"..s3
|
2018-09-08 15:09:13 +02:00
|
|
|
|
|
|
|
if (showall or unifieddyes.palette_has_color[nodepalette.."_"..s3]) and
|
|
|
|
(minetest.registered_items[dye] and (creative or inv:contains_item("main", dye))) then
|
2018-08-26 08:37:58 +02:00
|
|
|
unifieddyes.player_selected_dye[player_name] = dye
|
|
|
|
unifieddyes.show_airbrush_form(player)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end)
|
|
|
|
|
2017-02-24 23:40:37 +01:00
|
|
|
-- Generate all dyes that are not part of the default minetest_game dyes mod
|
2012-07-12 23:49:46 +02:00
|
|
|
|
2017-02-25 04:42:42 +01:00
|
|
|
for _, h in ipairs(unifieddyes.HUES_EXTENDED) do
|
2017-02-24 23:40:37 +01:00
|
|
|
local hue = h[1]
|
|
|
|
local r = h[2]
|
|
|
|
local g = h[3]
|
|
|
|
local b = h[4]
|
2012-07-12 23:49:46 +02:00
|
|
|
|
2017-02-24 23:40:37 +01:00
|
|
|
for v = 0, 6 do
|
2017-02-25 04:42:42 +01:00
|
|
|
local val = unifieddyes.VALS_EXTENDED[v+1]
|
2017-02-24 23:40:37 +01:00
|
|
|
|
|
|
|
local factor = 40
|
2017-02-25 19:22:08 +01:00
|
|
|
if v > 3 then factor = 75 end
|
2017-02-24 23:40:37 +01:00
|
|
|
|
|
|
|
local r2 = math.max(math.min(r + (4-v)*factor, 255), 0)
|
|
|
|
local g2 = math.max(math.min(g + (4-v)*factor, 255), 0)
|
|
|
|
local b2 = math.max(math.min(b + (4-v)*factor, 255), 0)
|
|
|
|
|
|
|
|
-- full-sat color
|
|
|
|
|
|
|
|
local desc = hue:gsub("%a", string.upper, 1).." Dye"
|
|
|
|
|
|
|
|
if val ~= "" then
|
|
|
|
desc = val:sub(1, -2):gsub("%a", string.upper, 1) .." "..desc
|
|
|
|
end
|
|
|
|
|
2017-02-25 22:29:14 +01:00
|
|
|
local color = string.format("%02x", r2)..string.format("%02x", g2)..string.format("%02x", b2)
|
|
|
|
if minetest.registered_items["dye:"..val..hue] then
|
|
|
|
minetest.override_item("dye:"..val..hue, {
|
2017-02-25 22:45:57 +01:00
|
|
|
inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200",
|
2017-02-25 22:29:14 +01:00
|
|
|
})
|
|
|
|
else
|
2017-06-20 21:43:39 +02:00
|
|
|
if (val..hue) ~= "medium_orange"
|
|
|
|
and (val..hue) ~= "light_red" then
|
|
|
|
minetest.register_craftitem(":dye:"..val..hue, {
|
|
|
|
description = S(desc),
|
|
|
|
inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200",
|
|
|
|
groups = { dye=1, not_in_creative_inventory=1 },
|
|
|
|
})
|
|
|
|
end
|
2017-02-24 23:40:37 +01:00
|
|
|
end
|
2017-02-25 22:29:14 +01:00
|
|
|
minetest.register_alias("unifieddyes:"..val..hue, "dye:"..val..hue)
|
2017-02-24 23:40:37 +01:00
|
|
|
|
2017-02-25 19:22:08 +01:00
|
|
|
if v > 3 then -- also register the low-sat version
|
2017-02-24 23:40:37 +01:00
|
|
|
|
|
|
|
local pr = 0.299
|
|
|
|
local pg = 0.587
|
|
|
|
local pb = 0.114
|
|
|
|
|
|
|
|
local p = math.sqrt(r2*r2*pr + g2*g2*pg + b2*b2*pb)
|
|
|
|
local r3 = math.floor(p+(r2-p)*0.5)
|
|
|
|
local g3 = math.floor(p+(g2-p)*0.5)
|
|
|
|
local b3 = math.floor(p+(b2-p)*0.5)
|
|
|
|
|
|
|
|
local color = string.format("%02x", r3)..string.format("%02x", g3)..string.format("%02x", b3)
|
|
|
|
|
|
|
|
minetest.register_craftitem(":dye:"..val..hue.."_s50", {
|
|
|
|
description = S(desc.." (low saturation)"),
|
|
|
|
inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200",
|
2017-02-25 02:42:04 +01:00
|
|
|
groups = { dye=1, not_in_creative_inventory=1 },
|
2017-02-24 23:40:37 +01:00
|
|
|
})
|
|
|
|
minetest.register_alias("unifieddyes:"..val..hue.."_s50", "dye:"..val..hue.."_s50")
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
-- register the greyscales too :P
|
|
|
|
|
|
|
|
for y = 1, 14 do -- colors 0 and 15 are black and white, default dyes
|
|
|
|
|
2017-02-27 00:34:29 +01:00
|
|
|
if y ~= 4 and y ~= 8 and y~= 11 then -- don't register the three greys, they're done separately.
|
2017-02-24 23:40:37 +01:00
|
|
|
|
|
|
|
local rgb = string.format("%02x", y*17)..string.format("%02x", y*17)..string.format("%02x", y*17)
|
|
|
|
local name = "grey_"..y
|
|
|
|
local desc = "Grey Dye #"..y
|
|
|
|
|
|
|
|
minetest.register_craftitem(":dye:"..name, {
|
|
|
|
description = S(desc),
|
|
|
|
inventory_image = "unifieddyes_dye.png^[colorize:#"..rgb..":200",
|
2017-02-25 02:42:04 +01:00
|
|
|
groups = { dye=1, not_in_creative_inventory=1 },
|
2017-02-24 23:40:37 +01:00
|
|
|
})
|
|
|
|
minetest.register_alias("unifieddyes:"..name, "dye:"..name)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-02-25 22:29:14 +01:00
|
|
|
minetest.override_item("dye:grey", {
|
2017-02-25 22:45:57 +01:00
|
|
|
inventory_image = "unifieddyes_dye.png^[colorize:#888888:200",
|
2017-02-25 22:29:14 +01:00
|
|
|
})
|
|
|
|
|
|
|
|
minetest.override_item("dye:dark_grey", {
|
2017-02-25 22:45:57 +01:00
|
|
|
inventory_image = "unifieddyes_dye.png^[colorize:#444444:200",
|
2017-02-25 22:29:14 +01:00
|
|
|
})
|
|
|
|
|
2017-02-25 18:44:22 +01:00
|
|
|
minetest.register_craftitem(":dye:light_grey", {
|
|
|
|
description = S("Light grey Dye"),
|
|
|
|
inventory_image = "unifieddyes_dye.png^[colorize:#cccccc:200",
|
|
|
|
groups = { dye=1, not_in_creative_inventory=1 },
|
2012-08-02 01:14:49 +02:00
|
|
|
})
|
|
|
|
|
2018-09-08 15:09:13 +02:00
|
|
|
-- build a table of color <-> palette associations to reduce the need for
|
|
|
|
-- realtime lookups with getpaletteidx()
|
|
|
|
|
2018-09-08 18:09:25 +02:00
|
|
|
for _, palette in ipairs({"extended", "split", "wallmounted"}) do
|
2018-09-08 15:09:13 +02:00
|
|
|
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
|
|
|
|
|
2018-09-08 17:21:00 +02:00
|
|
|
unifieddyes.palette_has_color["wallmounted_light_red"] = true
|
|
|
|
|
2018-09-08 15:09:13 +02:00
|
|
|
-- crafting!
|
|
|
|
|
2017-02-27 04:32:56 +01:00
|
|
|
unifieddyes.base_color_crafts = {
|
2017-02-27 00:34:29 +01:00
|
|
|
{ "red", "flowers:rose", nil, nil, nil, nil, 4 },
|
|
|
|
{ "vermilion", "dye:red", "dye:orange", nil, nil, nil, 3 },
|
|
|
|
{ "orange", "flowers:tulip", nil, nil, nil, nil, 4 },
|
|
|
|
{ "orange", "dye:red", "dye:yellow", nil, nil, nil, 2 },
|
|
|
|
{ "amber", "dye:orange", "dye:yellow", nil, nil, nil, 2 },
|
|
|
|
{ "yellow", "flowers:dandelion_yellow", nil, nil, nil, nil, 4 },
|
|
|
|
{ "lime", "dye:yellow", "dye:chartreuse", nil, nil, nil, 2 },
|
|
|
|
{ "lime", "dye:yellow", "dye:yellow", "dye:green", nil, nil, 3 },
|
|
|
|
{ "chartreuse", "dye:yellow", "dye:green", nil, nil, nil, 2 },
|
|
|
|
{ "harlequin", "dye:chartreuse", "dye:green", nil, nil, nil, 2 },
|
|
|
|
{ "harlequin", "dye:yellow", "dye:green", "dye:green", nil, nil, 3 },
|
|
|
|
{ "green", "default:cactus", nil, nil, nil, nil, 4 },
|
|
|
|
{ "green", "dye:yellow", "dye:blue", nil, nil, nil, 2 },
|
|
|
|
{ "malachite", "dye:green", "dye:spring", nil, nil, nil, 2 },
|
|
|
|
{ "malachite", "dye:green", "dye:green", "dye:cyan", nil, nil, 3 },
|
|
|
|
{ "malachite", "dye:green", "dye:green", "dye:green", "dye:blue", nil, 4 },
|
|
|
|
{ "spring", "dye:green", "dye:cyan", nil, nil, nil, 2 },
|
|
|
|
{ "spring", "dye:green", "dye:green", "dye:blue", nil, nil, 3 },
|
|
|
|
{ "turquoise", "dye:spring", "dye:cyan", nil, nil, nil, 2 },
|
|
|
|
{ "turquoise", "dye:green", "dye:cyan", "dye:cyan", nil, nil, 3 },
|
|
|
|
{ "turquoise", "dye:green", "dye:green", "dye:green", "dye:blue", "dye:blue", 5 },
|
|
|
|
{ "cyan", "dye:green", "dye:blue", nil, nil, nil, 2 },
|
|
|
|
{ "cerulean", "dye:cyan", "dye:azure", nil, nil, nil, 2 },
|
|
|
|
{ "cerulean", "dye:cyan", "dye:cyan", "dye:blue", nil, nil, 3 },
|
|
|
|
{ "cerulean", "dye:green", "dye:green", "dye:blue", "dye:blue", "dye:blue", 5 },
|
|
|
|
{ "azure", "dye:cyan", "dye:blue", nil, nil, nil, 2 },
|
|
|
|
{ "azure", "dye:green", "dye:blue", "dye:blue", nil, nil, 3 },
|
|
|
|
{ "sapphire", "dye:azure", "dye:blue", nil, nil, nil, 2 },
|
|
|
|
{ "sapphire", "dye:cyan", "dye:blue", "dye:blue", nil, nil, 3 },
|
2017-02-27 00:39:41 +01:00
|
|
|
{ "sapphire", "dye:green", "dye:blue", "dye:blue", "dye:blue", nil, 4 },
|
2017-02-27 00:34:29 +01:00
|
|
|
{ "blue", "flowers:geranium", nil, nil, nil, nil, 4 },
|
|
|
|
{ "indigo", "dye:blue", "dye:violet", nil, nil, nil, 2 },
|
|
|
|
{ "violet", "flowers:viola", nil, nil, nil, nil, 4 },
|
|
|
|
{ "violet", "dye:blue", "dye:magenta", nil, nil, nil, 2 },
|
|
|
|
{ "mulberry", "dye:violet", "dye:magenta", nil, nil, nil, 2 },
|
|
|
|
{ "mulberry", "dye:violet", "dye:blue", "dye:red", nil, nil, 3 },
|
2017-02-27 00:39:41 +01:00
|
|
|
{ "magenta", "dye:blue", "dye:red", nil, nil, nil, 2 },
|
2017-02-27 00:34:29 +01:00
|
|
|
{ "fuchsia", "dye:magenta", "dye:rose", nil, nil, nil, 2 },
|
|
|
|
{ "fuchsia", "dye:blue", "dye:red", "dye:rose", nil, nil, 3 },
|
|
|
|
{ "fuchsia", "dye:red", "dye:violet", nil, nil, nil, 2 },
|
|
|
|
{ "rose", "dye:magenta", "dye:red", nil, nil, nil, 2 },
|
|
|
|
{ "rose", "dye:red", "dye:red", "dye:blue", nil, nil, 3 },
|
|
|
|
{ "crimson", "dye:rose", "dye:red", nil, nil, nil, 2 },
|
|
|
|
{ "crimson", "dye:magenta", "dye:red", "dye:red", nil, nil, 3 },
|
|
|
|
{ "crimson", "dye:red", "dye:red", "dye:red", "dye:blue", nil, 4 },
|
|
|
|
|
|
|
|
{ "black", "default:coal_lump", nil, nil, nil, nil, 4 },
|
|
|
|
{ "white", "flowers:dandelion_white", nil, nil, nil, nil, 4 },
|
2017-02-25 18:44:22 +01:00
|
|
|
}
|
2012-07-12 23:49:46 +02:00
|
|
|
|
2017-02-27 04:32:56 +01:00
|
|
|
unifieddyes.shade_crafts = {
|
2017-02-25 18:44:22 +01:00
|
|
|
{ "faint_", "", "dye:white", "dye:white", "dye:white", 4 },
|
|
|
|
{ "pastel_", "", "dye:white", "dye:white", nil, 3 },
|
|
|
|
{ "light_", "", "dye:white", nil, nil, 2 },
|
|
|
|
{ "bright_", "", "color", "dye:white", nil, 3 },
|
|
|
|
{ "", "_s50", "dye:light_grey", nil, nil, 2 },
|
|
|
|
{ "", "_s50", "dye:black", "dye:white", "dye:white", 3 },
|
|
|
|
{ "medium_", "", "dye:black", nil, nil, 2 },
|
|
|
|
{ "medium_", "_s50", "dye:grey", nil, nil, 2 },
|
|
|
|
{ "medium_", "_s50", "dye:black", "dye:white", nil, 3 },
|
|
|
|
{ "dark_", "", "dye:black", "dye:black", nil, 3 },
|
|
|
|
{ "dark_", "_s50", "dye:dark_grey", nil, nil, 2 },
|
2017-02-25 19:22:08 +01:00
|
|
|
{ "dark_", "_s50", "dye:black", "dye:black", "dye:white", 4 },
|
2017-02-25 18:44:22 +01:00
|
|
|
}
|
2017-02-24 20:28:38 +01:00
|
|
|
|
2017-02-27 04:32:56 +01:00
|
|
|
for _,i in ipairs(unifieddyes.base_color_crafts) do
|
2017-02-25 18:44:22 +01:00
|
|
|
local color = i[1]
|
2017-02-27 00:34:29 +01:00
|
|
|
local yield = i[7]
|
2012-07-12 23:49:46 +02:00
|
|
|
|
|
|
|
minetest.register_craft( {
|
Refactored the code to use default "common" dyes
rather than directly from flowers.
This mod now depends on "default" and "dye" from the Minetest common
sub-game. Since the default dye mod uses default flowers, this mod no
longer checks for what version of flowers you're using, or even depends
on it.
Bottle-based textures have been replaced with piles of dye powder, based
on the default red dye texture.
All dyes are obtained by crafting, not cooking, for consistency with the
default dye mod.
The somewhat-complicated method using separate "pigment" powders, glass
bottles and "liquid dye base" has been done away with. Now it's just
dry dye powders, as with the default dye mod.
Also, got rid of the whole paint scheme, in favor of dry powders.
All old dyes, paints, and Unified Dyes pigment powders have been aliased
back to the standard dye powders.
2013-04-30 12:02:22 +02:00
|
|
|
type = "shapeless",
|
2017-02-25 18:44:22 +01:00
|
|
|
output = "dye:"..color.." "..yield,
|
Refactored the code to use default "common" dyes
rather than directly from flowers.
This mod now depends on "default" and "dye" from the Minetest common
sub-game. Since the default dye mod uses default flowers, this mod no
longer checks for what version of flowers you're using, or even depends
on it.
Bottle-based textures have been replaced with piles of dye powder, based
on the default red dye texture.
All dyes are obtained by crafting, not cooking, for consistency with the
default dye mod.
The somewhat-complicated method using separate "pigment" powders, glass
bottles and "liquid dye base" has been done away with. Now it's just
dry dye powders, as with the default dye mod.
Also, got rid of the whole paint scheme, in favor of dry powders.
All old dyes, paints, and Unified Dyes pigment powders have been aliased
back to the standard dye powders.
2013-04-30 12:02:22 +02:00
|
|
|
recipe = {
|
2017-02-27 00:42:41 +01:00
|
|
|
i[2],
|
|
|
|
i[3],
|
|
|
|
i[4],
|
|
|
|
i[5],
|
|
|
|
i[6],
|
2017-02-25 18:44:22 +01:00
|
|
|
},
|
2012-07-12 23:49:46 +02:00
|
|
|
})
|
|
|
|
|
2017-02-27 04:32:56 +01:00
|
|
|
for _,j in ipairs(unifieddyes.shade_crafts) do
|
2017-02-27 00:42:41 +01:00
|
|
|
local firstdye = j[3]
|
|
|
|
if firstdye == "color" then firstdye = "dye:"..color end
|
2017-02-25 18:44:22 +01:00
|
|
|
|
2017-06-20 22:03:38 +02:00
|
|
|
-- ignore black, white, anything containing the word "grey"
|
2017-06-20 21:43:39 +02:00
|
|
|
|
2017-02-25 18:44:22 +01:00
|
|
|
if color ~= "black" and color ~= "white" and not string.find(color, "grey") then
|
|
|
|
|
|
|
|
minetest.register_craft( {
|
|
|
|
type = "shapeless",
|
2017-02-27 00:42:41 +01:00
|
|
|
output = "dye:"..j[1]..color..j[2].." "..yield,
|
2017-02-25 18:44:22 +01:00
|
|
|
recipe = {
|
|
|
|
"dye:"..color,
|
2017-02-27 00:42:41 +01:00
|
|
|
firstdye,
|
|
|
|
j[4],
|
|
|
|
j[5]
|
2017-02-25 18:44:22 +01:00
|
|
|
},
|
|
|
|
})
|
|
|
|
end
|
Refactored the code to use default "common" dyes
rather than directly from flowers.
This mod now depends on "default" and "dye" from the Minetest common
sub-game. Since the default dye mod uses default flowers, this mod no
longer checks for what version of flowers you're using, or even depends
on it.
Bottle-based textures have been replaced with piles of dye powder, based
on the default red dye texture.
All dyes are obtained by crafting, not cooking, for consistency with the
default dye mod.
The somewhat-complicated method using separate "pigment" powders, glass
bottles and "liquid dye base" has been done away with. Now it's just
dry dye powders, as with the default dye mod.
Also, got rid of the whole paint scheme, in favor of dry powders.
All old dyes, paints, and Unified Dyes pigment powders have been aliased
back to the standard dye powders.
2013-04-30 12:02:22 +02:00
|
|
|
end
|
2012-07-12 23:49:46 +02:00
|
|
|
end
|
|
|
|
|
2017-06-20 21:43:39 +02:00
|
|
|
-- greys
|
|
|
|
|
2017-02-27 04:32:56 +01:00
|
|
|
unifieddyes.greymixes = {
|
2017-02-25 20:41:53 +01:00
|
|
|
{ 1, "dye:black", "dye:black", "dye:black", "dye:dark_grey", 4 },
|
|
|
|
{ 2, "dye:black", "dye:black", "dye:dark_grey", nil, 3 },
|
|
|
|
{ 3, "dye:black", "dye:dark_grey", nil, nil, 2 },
|
2017-02-25 20:53:04 +01:00
|
|
|
{ 4, "dye:white", "dye:black", "dye:black", nil, 3 },
|
|
|
|
{ 5, "dye:dark_grey", "dye:dark_grey", "dye:grey", nil, 3 },
|
|
|
|
{ 6, "dye:dark_grey", "dye:grey", nil, nil, 2 },
|
2017-02-25 20:41:53 +01:00
|
|
|
{ 7, "dye:dark_grey", "dye:grey", "dye:grey", nil, 3 },
|
|
|
|
{ 8, "dye:white", "dye:black", nil, nil, 2 },
|
|
|
|
{ 9, "dye:grey", "dye:grey", "dye:light_grey", nil, 3 },
|
|
|
|
{ 10, "dye:grey", "dye:light_grey", "dye:light_grey", nil, 3 },
|
|
|
|
{ 11, "dye:white", "dye:white", "dye:black", nil, 3 },
|
|
|
|
{ 12, "dye:light_grey", "dye:light_grey", "dye:white", nil, 3 },
|
|
|
|
{ 13, "dye:light_grey", "dye:white", nil, nil, 2 },
|
|
|
|
{ 14, "dye:white", "dye:white", "dye:light_grey", nil, 3 },
|
|
|
|
}
|
|
|
|
|
2017-02-27 04:32:56 +01:00
|
|
|
for _, i in ipairs(unifieddyes.greymixes) do
|
2017-02-25 20:41:53 +01:00
|
|
|
local shade = i[1]
|
|
|
|
local dye1 = i[2]
|
|
|
|
local dye2 = i[3]
|
|
|
|
local dye3 = i[4]
|
|
|
|
local dye4 = i[5]
|
|
|
|
local yield = i[6]
|
|
|
|
local color = "grey_"..shade
|
2017-02-25 20:53:04 +01:00
|
|
|
if shade == 4 then
|
2017-02-25 20:41:53 +01:00
|
|
|
color = "dark_grey"
|
|
|
|
elseif shade == 8 then
|
|
|
|
color = "grey"
|
|
|
|
elseif shade == 11 then
|
|
|
|
color = "light_grey"
|
|
|
|
end
|
|
|
|
|
|
|
|
minetest.register_craft( {
|
|
|
|
type = "shapeless",
|
|
|
|
output = "dye:"..color.." "..yield,
|
|
|
|
recipe = {
|
|
|
|
dye1,
|
|
|
|
dye2,
|
|
|
|
dye3,
|
|
|
|
dye4,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
end
|
|
|
|
|
2017-06-20 22:03:38 +02:00
|
|
|
-- we can't make dark orange anymore because brown/medium orange conflicts
|
|
|
|
|
|
|
|
minetest.register_craft( {
|
|
|
|
type = "shapeless",
|
|
|
|
output = "dye:dark_orange",
|
|
|
|
recipe = {
|
|
|
|
"dye:brown",
|
|
|
|
"dye:brown"
|
|
|
|
},
|
|
|
|
})
|
|
|
|
|
2018-08-26 08:37:58 +02:00
|
|
|
-- aliases
|
|
|
|
|
2017-06-20 21:43:39 +02:00
|
|
|
minetest.register_alias("dye:light_red", "dye:pink")
|
|
|
|
minetest.register_alias("dye:medium_orange", "dye:brown")
|
|
|
|
|
2017-01-25 19:19:20 +01:00
|
|
|
minetest.register_alias("unifieddyes:black", "dye:black")
|
2017-02-24 23:40:37 +01:00
|
|
|
minetest.register_alias("unifieddyes:dark_grey", "dye:dark_grey")
|
2018-08-22 05:28:17 +02:00
|
|
|
minetest.register_alias("unifieddyes:grey", "dye:grey")
|
2017-02-24 23:40:37 +01:00
|
|
|
minetest.register_alias("unifieddyes:light_grey", "dye:light_grey")
|
2018-08-22 05:28:17 +02:00
|
|
|
minetest.register_alias("unifieddyes:white", "dye:white")
|
Refactored the code to use default "common" dyes
rather than directly from flowers.
This mod now depends on "default" and "dye" from the Minetest common
sub-game. Since the default dye mod uses default flowers, this mod no
longer checks for what version of flowers you're using, or even depends
on it.
Bottle-based textures have been replaced with piles of dye powder, based
on the default red dye texture.
All dyes are obtained by crafting, not cooking, for consistency with the
default dye mod.
The somewhat-complicated method using separate "pigment" powders, glass
bottles and "liquid dye base" has been done away with. Now it's just
dry dye powders, as with the default dye mod.
Also, got rid of the whole paint scheme, in favor of dry powders.
All old dyes, paints, and Unified Dyes pigment powders have been aliased
back to the standard dye powders.
2013-04-30 12:02:22 +02:00
|
|
|
|
2017-02-24 23:40:37 +01:00
|
|
|
minetest.register_alias("unifieddyes:grey_0", "dye:black")
|
2017-02-25 20:53:04 +01:00
|
|
|
minetest.register_alias("unifieddyes:grey_4", "dye:dark_grey")
|
2017-02-25 20:07:35 +01:00
|
|
|
minetest.register_alias("unifieddyes:grey_8", "dye:grey")
|
|
|
|
minetest.register_alias("unifieddyes:grey_11", "dye:light_grey")
|
2017-02-24 23:40:37 +01:00
|
|
|
minetest.register_alias("unifieddyes:grey_15", "dye:white")
|
|
|
|
|
Refactored the code to use default "common" dyes
rather than directly from flowers.
This mod now depends on "default" and "dye" from the Minetest common
sub-game. Since the default dye mod uses default flowers, this mod no
longer checks for what version of flowers you're using, or even depends
on it.
Bottle-based textures have been replaced with piles of dye powder, based
on the default red dye texture.
All dyes are obtained by crafting, not cooking, for consistency with the
default dye mod.
The somewhat-complicated method using separate "pigment" powders, glass
bottles and "liquid dye base" has been done away with. Now it's just
dry dye powders, as with the default dye mod.
Also, got rid of the whole paint scheme, in favor of dry powders.
All old dyes, paints, and Unified Dyes pigment powders have been aliased
back to the standard dye powders.
2013-04-30 12:02:22 +02:00
|
|
|
minetest.register_alias("unifieddyes:white_paint", "dye:white")
|
|
|
|
minetest.register_alias("unifieddyes:titanium_dioxide", "dye:white")
|
|
|
|
minetest.register_alias("unifieddyes:lightgrey_paint", "dye:light_grey")
|
|
|
|
minetest.register_alias("unifieddyes:grey_paint", "dye:grey")
|
|
|
|
minetest.register_alias("unifieddyes:darkgrey_paint", "dye:dark_grey")
|
|
|
|
minetest.register_alias("unifieddyes:carbon_black", "dye:black")
|
|
|
|
|
2018-08-25 06:38:24 +02:00
|
|
|
minetest.register_alias("unifieddyes:brown", "dye:brown")
|
2017-02-24 23:40:37 +01:00
|
|
|
|
2014-03-20 02:11:30 +01:00
|
|
|
print(S("[UnifiedDyes] Loaded!"))
|
2012-07-12 23:49:46 +02:00
|
|
|
|