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-01-26 12:18:37 +01:00
|
|
|
-- helper functions for other mods that use this one
|
|
|
|
|
2017-02-25 04:42:42 +01:00
|
|
|
unifieddyes.HUES = {
|
2017-01-26 12:18:37 +01:00
|
|
|
"red",
|
|
|
|
"orange",
|
|
|
|
"yellow",
|
|
|
|
"lime",
|
|
|
|
"green",
|
|
|
|
"aqua",
|
|
|
|
"cyan",
|
|
|
|
"skyblue",
|
|
|
|
"blue",
|
|
|
|
"violet",
|
|
|
|
"magenta",
|
|
|
|
"redviolet"
|
2017-01-25 23:49:00 +01:00
|
|
|
}
|
|
|
|
|
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 }
|
|
|
|
}
|
|
|
|
|
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_"
|
|
|
|
}
|
|
|
|
|
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 = {}
|
|
|
|
|
|
|
|
-- unifieddyes.player_last_right_clicked[placer:get_player_name()] = {pos = pos, node = node, def = def}
|
2018-08-26 08:37:58 +02:00
|
|
|
|
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
|
|
|
|
local param2 = 0
|
|
|
|
local color = 0
|
|
|
|
|
|
|
|
if def.palette == "unifieddyes_palette_extended.png" then
|
|
|
|
param2 = 240
|
|
|
|
color = 240
|
|
|
|
elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then
|
|
|
|
param2 = newnode.param2 % 8
|
|
|
|
elseif def.palette ~= "unifieddyes_palette.png" 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)
|
|
|
|
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-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
|
|
|
-- if your node was once 89-color and uses an LBM to convert to the 256-color palette,
|
|
|
|
-- call this in that node def's on_construct:
|
|
|
|
|
|
|
|
function unifieddyes.on_construct(pos)
|
|
|
|
local meta = minetest.get_meta(pos)
|
|
|
|
meta:set_string("palette", "ext")
|
|
|
|
end
|
|
|
|
|
|
|
|
-- these helper functions register all of the recipes needed to create colored
|
|
|
|
-- nodes with any of the dyes supported by that node's palette.
|
|
|
|
|
|
|
|
local function register_c(craft, hue, sat, val)
|
|
|
|
local color = ""
|
|
|
|
if val then
|
2018-08-23 02:01:03 +02:00
|
|
|
if craft.palette ~= "extended" then
|
|
|
|
color = val..hue..sat
|
2018-08-22 09:14:20 +02:00
|
|
|
else
|
2018-08-23 02:01:03 +02:00
|
|
|
color = val..hue[1]..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-08-23 02:01:03 +02:00
|
|
|
local output = craft.output
|
|
|
|
if craft.output_prefix then
|
|
|
|
if craft.palette ~= true then
|
|
|
|
output = craft.output_prefix..color..craft.output_suffix
|
|
|
|
else
|
|
|
|
if hue == "white" or hue == "black" or string.find(hue, "grey") then
|
|
|
|
output = craft.output_prefix.."grey"..craft.output_suffix
|
2018-08-23 02:06:29 +02:00
|
|
|
elseif hue == "pink" then
|
|
|
|
dye = "dye:light_red"
|
|
|
|
output = craft.output_prefix.."red"..craft.output_suffix
|
2018-08-23 02:01:03 +02:00
|
|
|
else
|
|
|
|
output = craft.output_prefix..hue..craft.output_suffix
|
|
|
|
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-08-23 02:01:03 +02:00
|
|
|
local hues_table = unifieddyes.HUES
|
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-08-23 02:01:03 +02:00
|
|
|
local vals_table = unifieddyes.VALS
|
|
|
|
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_")
|
|
|
|
register_c(craft, "azure", "", "")
|
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
|
|
|
|
hues_table = unifieddyes.HUES_EXTENDED
|
|
|
|
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
|
2017-02-25 04:42:42 +01:00
|
|
|
for _, i in ipairs(unifieddyes.HUES) do
|
2017-01-26 19:42:36 +01:00
|
|
|
a,b = string.find(name, "_"..i)
|
|
|
|
if a and not ( string.find(name, "_redviolet") and i == "red" ) then
|
|
|
|
hue = i
|
|
|
|
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:
|
|
|
|
--
|
|
|
|
-- false/nil = standard 89 color palette
|
|
|
|
-- true = 89 color palette split into pieces for colorfacedir
|
|
|
|
-- "wallmounted" = 32-color abridged palette
|
|
|
|
-- "extended" = 256 color palette
|
|
|
|
|
|
|
|
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-01-25 18:31:40 +01:00
|
|
|
local hues = {
|
|
|
|
["red"] = 1,
|
|
|
|
["orange"] = 2,
|
|
|
|
["yellow"] = 3,
|
|
|
|
["lime"] = 4,
|
|
|
|
["green"] = 5,
|
|
|
|
["aqua"] = 6,
|
2018-08-27 05:06:57 +02:00
|
|
|
["spring"] = 6,
|
2017-01-25 18:31:40 +01:00
|
|
|
["cyan"] = 7,
|
|
|
|
["skyblue"] = 8,
|
2018-08-27 05:06:57 +02:00
|
|
|
["azure"] = 8,
|
2017-01-25 18:31:40 +01:00
|
|
|
["blue"] = 9,
|
|
|
|
["violet"] = 10,
|
|
|
|
["magenta"] = 11,
|
|
|
|
["redviolet"] = 12,
|
2018-08-27 05:06:57 +02:00
|
|
|
["rose"] = 12,
|
2017-01-25 18:31:40 +01:00
|
|
|
}
|
|
|
|
|
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,
|
|
|
|
}
|
|
|
|
|
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
|
2017-02-25 00:38:15 +01:00
|
|
|
elseif palette_type == true 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-29 06:06:08 +01:00
|
|
|
else
|
|
|
|
if grayscale[color] then
|
2017-01-26 12:18:37 +01:00
|
|
|
return grayscale[color], 0
|
|
|
|
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-08-25 08:40:17 +02:00
|
|
|
elseif color == "azure" 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-08-25 06:38:24 +02:00
|
|
|
if palette_type == true then -- it's colorfacedir, so "split" 89-color palette
|
|
|
|
|
|
|
|
-- If using this palette, translate new color names back to old.
|
|
|
|
|
2018-08-27 05:06:57 +02:00
|
|
|
if color == "spring" then
|
|
|
|
color = "aqua"
|
|
|
|
elseif color == "azure" then
|
|
|
|
color = "skyblue"
|
|
|
|
elseif color == "rose" then
|
|
|
|
color = "redviolet"
|
2018-08-25 06:38:24 +02:00
|
|
|
end
|
|
|
|
|
2017-02-25 00:38:15 +01:00
|
|
|
if hues[color] and shades[shade] then
|
2017-02-06 15:22:10 +01:00
|
|
|
return (shades[shade] * 32), hues[color]
|
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
|
2018-08-25 06:38:24 +02:00
|
|
|
else -- it's the regular 89-color palette, do the same translation if needed
|
2018-08-27 05:06:57 +02:00
|
|
|
if color == "spring" then
|
|
|
|
color = "aqua"
|
|
|
|
elseif color == "azure" then
|
|
|
|
color = "skyblue"
|
|
|
|
elseif color == "rose" then
|
|
|
|
color = "redviolet"
|
2017-02-25 00:48:02 +01:00
|
|
|
end
|
2017-02-25 00:38:15 +01:00
|
|
|
if hues[color] and shades[shade] then
|
2017-02-06 15:22:10 +01:00
|
|
|
return (hues[color] * 8 + shades[shade]), hues[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-08-29 04:39:09 +02:00
|
|
|
if not def.palette or not (def.groups 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
|
|
|
|
if def.palette == "unifieddyes_palette_extended.png" then
|
|
|
|
palette = "extended"
|
|
|
|
elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then
|
|
|
|
palette = "wallmounted"
|
|
|
|
fdir = node.param2 % 8
|
|
|
|
elseif def.palette ~= "unifieddyes_palette.png" then
|
|
|
|
palette = true
|
|
|
|
fdir = node.param2 % 32
|
|
|
|
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-08-27 05:06:57 +02:00
|
|
|
if palette == true then
|
|
|
|
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
|
|
|
|
newcolor = unifieddyes.HUES[hue]
|
|
|
|
else
|
|
|
|
newcolor = "grey"
|
|
|
|
end
|
2018-08-27 05:06:57 +02:00
|
|
|
|
2018-08-29 04:39:09 +02:00
|
|
|
local s = string.sub(def.palette, 21)
|
|
|
|
oldcolor = string.sub(s, 1, string.find(s, "s.png")-1)
|
2018-08-27 05:06:57 +02:00
|
|
|
end
|
|
|
|
|
2018-08-29 04:39:09 +02:00
|
|
|
if newcolor == "spring" then newcolor = "aqua"
|
|
|
|
elseif newcolor == "azure" then newcolor = "skyblue"
|
|
|
|
elseif newcolor == "rose" then newcolor = "redviolet"
|
|
|
|
end
|
|
|
|
|
|
|
|
name = modname..":"..string.gsub(nodename2, oldcolor, newcolor)
|
|
|
|
if not minetest.registered_items[name] then
|
|
|
|
minetest.chat_send_player(player_name, "*** "..string.sub(painting_with, 5).." can't be applied to that node.")
|
|
|
|
return
|
|
|
|
end
|
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.png" then
|
|
|
|
local color = param2
|
|
|
|
local h = math.floor(color/8)
|
|
|
|
local s = 1
|
|
|
|
local val = ""
|
|
|
|
if color == 1 or color == h or color > 103 or color == 6 or color == 7 then return "white"
|
|
|
|
elseif color == 2 then return "light_grey"
|
|
|
|
elseif color == 3 then return "grey"
|
|
|
|
elseif color == 4 then return "dark_grey"
|
|
|
|
elseif color == 5 then return "black"
|
|
|
|
end
|
|
|
|
local c = color - h*8
|
|
|
|
if c == 2 then s = 2
|
|
|
|
elseif c == 3 then val = "light_"
|
|
|
|
elseif c == 4 then val = "medium_"
|
|
|
|
elseif c == 5 then val = "medium_" s = 2
|
|
|
|
elseif c == 6 then val = "dark_"
|
|
|
|
else val = "dark_" s = 2
|
|
|
|
end
|
|
|
|
|
|
|
|
return val..unifieddyes.HUES[h+1]..unifieddyes.SATS[s]
|
|
|
|
|
|
|
|
elseif def.palette == "unifieddyes_palette_colorwallmounted.png" then
|
|
|
|
local color = math.floor(param2 / 8)
|
|
|
|
if color == 0 then return "white"
|
|
|
|
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]
|
|
|
|
|
|
|
|
elseif string.find(def.palette, "unifieddyes_palette") then -- it's the "split" 89-color palette
|
|
|
|
-- 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 v == 0 then return "white" end
|
|
|
|
if color ~= "grey" then
|
|
|
|
if v == 1 then return color
|
|
|
|
elseif v == 2 then return color.."_s50"
|
|
|
|
elseif v == 3 then return "light_"..color
|
|
|
|
elseif v == 4 then return "medium_"..color
|
|
|
|
elseif v == 5 then return "medium_"..color.."_s50"
|
|
|
|
elseif v == 6 then return "dark_"..color
|
|
|
|
elseif v == 7 then return "dark_"..color.."_s50"
|
|
|
|
end
|
|
|
|
else
|
|
|
|
if v > 0 and v < 6 then return unifieddyes.GREYS[v]
|
|
|
|
else return "white"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-09-08 15:47:31 +02:00
|
|
|
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;"
|
|
|
|
|
|
|
|
function unifieddyes.make_colored_square(hexcolor, colorname, showall, creative, painting_with, nodepalette, hp, v2, selindic)
|
|
|
|
|
|
|
|
local form = ""
|
|
|
|
local dye = "dye:"..colorname
|
|
|
|
|
|
|
|
local overlay = ""
|
|
|
|
local colorize = minetest.formspec_escape("^[colorize:#"..hexcolor..":255")
|
|
|
|
|
|
|
|
if (showall or not nodepalette) and not creative and inv:contains_item("main", dye) then
|
|
|
|
overlay = "^unifieddyes_available_overlay.png"
|
|
|
|
end
|
|
|
|
|
|
|
|
local unavail_overlay = ""
|
|
|
|
if not showall and not unifieddyes.palette_has_color[nodepalette.."_"..colorname] then
|
|
|
|
unavail_overlay = "^unifieddyes_unavailable_overlay.png"
|
|
|
|
end
|
|
|
|
|
|
|
|
if dye == painting_with then
|
|
|
|
overlay = "^unifieddyes_select_overlay.png"
|
2018-09-08 16:05:13 +02:00
|
|
|
selindic = "unifieddyes_white_square.png"..colorize..overlay..unavail_overlay.."]"..
|
2018-09-08 15:47:31 +02:00
|
|
|
"tooltip["..colorname..";"..colorname.."]"
|
|
|
|
end
|
|
|
|
|
|
|
|
form = form.."image_button["..
|
|
|
|
(hp*hps)..","..(v2*vps+vs)..
|
|
|
|
color_button_size..
|
|
|
|
"unifieddyes_white_square.png"..colorize..overlay..unavail_overlay..";"..
|
|
|
|
colorname..";]"..
|
|
|
|
"tooltip["..colorname..";"..colorname.."]"
|
|
|
|
|
|
|
|
return form, selindic
|
|
|
|
end
|
|
|
|
|
2018-08-26 08:37:58 +02:00
|
|
|
function unifieddyes.show_airbrush_form(player)
|
|
|
|
if not player then return end
|
|
|
|
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
|
|
|
|
|
|
|
local base_form = "size[15,8.5]label[7,-0.25;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
|
|
|
|
if last_right_click.def and last_right_click.def.palette then
|
|
|
|
if last_right_click.def.palette == "unifieddyes_palette_colorwallmounted.png" then
|
|
|
|
nodepalette = "wallmounted"
|
|
|
|
elseif last_right_click.def.palette == "unifieddyes_palette_extended.png" then
|
|
|
|
base_form = base_form.."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
|
|
|
|
nodepalette = "old89"
|
|
|
|
elseif not string.find(last_right_click.def.palette, "unifieddyes_palette_") then
|
|
|
|
base_form = base_form.."label[0.5,8.25;(Right-clicked a node not supported by the Airbrush, showing all colors)]"
|
|
|
|
end
|
|
|
|
else
|
|
|
|
base_form = base_form.."label[0.5,8.25;(Right-clicked a non-colorable node, showing all colors)]"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
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]
|
|
|
|
local hp=hi-0.5
|
|
|
|
|
|
|
|
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
|
|
|
|
f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic)
|
|
|
|
base_form = base_form..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]
|
|
|
|
local hp=hi-0.5
|
|
|
|
|
|
|
|
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
|
|
|
|
f, selindic = unifieddyes.make_colored_square(hexcolor, val..hue..sat, showall, creative, painting_with, nodepalette, hp, v2, selindic)
|
|
|
|
base_form = base_form..f
|
2018-08-26 08:37:58 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local v2=5
|
|
|
|
for y = 0, 15 do
|
|
|
|
|
|
|
|
local hp=(15-y)+0.5
|
|
|
|
|
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
|
|
|
|
f, selindic = unifieddyes.make_colored_square(hexgrey, grey, showall, creative, painting_with, nodepalette, hp, v2, selindic)
|
|
|
|
base_form = base_form..f
|
2018-08-26 08:37:58 +02:00
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
if not creative then
|
|
|
|
base_form = base_form..
|
2018-09-08 15:47:31 +02:00
|
|
|
"image[10.3,"..(vps*5+vs)..color_button_size..
|
2018-08-26 08:37:58 +02:00
|
|
|
"unifieddyes_available_overlay.png]"..
|
2018-08-28 01:52:15 +02:00
|
|
|
"label[11.0,"..(vps*5.1+vs)..";Dyes on hand]"
|
|
|
|
end
|
2018-09-08 15:09:13 +02:00
|
|
|
|
2018-09-08 15:47:31 +02:00
|
|
|
base_form = base_form.."image[12.5,"..(vps*5+vs)..color_button_size..
|
2018-09-08 15:09:13 +02:00
|
|
|
selindic.."label[13.2,"..(vps*5.1+vs)..";Your selection]"
|
2018-08-26 08:37:58 +02:00
|
|
|
|
|
|
|
base_form = base_form..
|
|
|
|
"button_exit[11,8;2,1;cancel;Cancel]"..
|
|
|
|
"button_exit[13,8;2,1;accept;Accept]"
|
|
|
|
|
2018-09-08 15:09:13 +02:00
|
|
|
|
|
|
|
if last_right_click and last_right_click.def and last_right_click.def.palette and nodepalette ~= "extended" then
|
|
|
|
if showall then
|
|
|
|
base_form = base_form..
|
|
|
|
"button[0.5,8;2,1;show_avail;Show Available]"..
|
|
|
|
"label[2.5,8.25;(Currently showing all 256 colors)]"
|
|
|
|
else
|
|
|
|
base_form = base_form..
|
|
|
|
"button[0.5,8;2,1;show_all;Show All Colors]"..
|
|
|
|
"label[2.5,8.25;(Currently only showing what the right-clicked node can use)]"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-08-28 02:01:15 +02:00
|
|
|
if painting_with then
|
2018-08-26 08:37:58 +02:00
|
|
|
base_form = base_form..
|
2018-09-08 15:09:13 +02:00
|
|
|
"label[0.5,"..(7.25+vs)..";Selected dye: "..
|
2018-08-28 02:01:15 +02:00
|
|
|
painting_with.."]"
|
2018-08-26 08:37:58 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
minetest.show_formspec(player_name, "unifieddyes:dye_select_form", base_form)
|
|
|
|
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
|
|
|
|
nodepalette = "old89"
|
|
|
|
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 20:21:59 +01:00
|
|
|
-- build a table to convert from classic/89-color palette to extended palette
|
|
|
|
|
2017-02-25 02:13:43 +01:00
|
|
|
-- the first five entries are for the old greyscale - white, light, grey, dark, black
|
|
|
|
unifieddyes.convert_classic_palette = {
|
|
|
|
240,
|
|
|
|
244,
|
|
|
|
247,
|
|
|
|
251,
|
|
|
|
253
|
|
|
|
}
|
2017-02-24 20:21:59 +01:00
|
|
|
|
|
|
|
for hue = 0, 11 do
|
|
|
|
-- light
|
2017-02-25 04:42:42 +01:00
|
|
|
local paletteidx = unifieddyes.getpaletteidx("dye:light_"..unifieddyes.HUES[hue+1], false)
|
2017-02-25 01:57:48 +01:00
|
|
|
unifieddyes.convert_classic_palette[paletteidx] = hue*2 + 48
|
2017-02-24 20:21:59 +01:00
|
|
|
for sat = 0, 1 do
|
|
|
|
for val = 0, 2 do
|
2017-02-25 01:57:48 +01:00
|
|
|
-- all other shades
|
2017-02-25 04:42:42 +01:00
|
|
|
local paletteidx = unifieddyes.getpaletteidx("dye:"..unifieddyes.VALS[val+1]..unifieddyes.HUES[hue+1]..unifieddyes.SATS[sat+1], false)
|
2017-02-25 01:57:48 +01:00
|
|
|
unifieddyes.convert_classic_palette[paletteidx] = hue*2 + sat*24 + (val*48+96)
|
2017-02-24 20:21:59 +01:00
|
|
|
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)
|
2018-08-27 05:06:57 +02:00
|
|
|
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
|
|
|
|
|
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")
|
2018-08-27 05:06:57 +02:00
|
|
|
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
|
2017-02-24 23:40:37 +01:00
|
|
|
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()
|
|
|
|
|
|
|
|
for _, palette in ipairs({"extended", "old89", "wallmounted"}) do
|
|
|
|
local palette2 = palette
|
|
|
|
if palette == "old89" then palette2 = nil end
|
|
|
|
|
|
|
|
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
|
|
|
|
|
|
|
|
-- 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
|
|
|
|