summaryrefslogtreecommitdiff
path: root/unifieddyes/init.lua
diff options
context:
space:
mode:
authorVanessa Dannenberg <vanessa.e.dannenberg@gmail.com>2018-08-22 22:28:28 -0400
committerVanessa Dannenberg <vanessa.e.dannenberg@gmail.com>2018-08-22 22:28:28 -0400
commit9c9457e1f50ebdd943695a4cce6b88fa552370f3 (patch)
tree4f6002b266179e0dd1639affffd4f09a18dfcad5 /unifieddyes/init.lua
parent3c47f229fcbdb7cad28bacbc579516bf3ecf6c03 (diff)
downloaddreambuilder_modpack-9c9457e1f50ebdd943695a4cce6b88fa552370f3.tar
dreambuilder_modpack-9c9457e1f50ebdd943695a4cce6b88fa552370f3.tar.gz
dreambuilder_modpack-9c9457e1f50ebdd943695a4cce6b88fa552370f3.tar.bz2
dreambuilder_modpack-9c9457e1f50ebdd943695a4cce6b88fa552370f3.tar.xz
dreambuilder_modpack-9c9457e1f50ebdd943695a4cce6b88fa552370f3.zip
update castles modpack, blox, bobblocks, coloredwood, technic,
gloopblocks, homedecor, ilights, led marquee, plasticbox, solidcolor, stained_glass, unified bricks, and unified dyes In most of these, the update is to shift over to the new "old" coloring paradigm in Unified Dyes. See its forum thread for details.
Diffstat (limited to 'unifieddyes/init.lua')
-rw-r--r--unifieddyes/init.lua206
1 files changed, 115 insertions, 91 deletions
diff --git a/unifieddyes/init.lua b/unifieddyes/init.lua
index 2cf465b..dd4b5e0 100644
--- a/unifieddyes/init.lua
+++ b/unifieddyes/init.lua
@@ -30,8 +30,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
--=====================================================================
unifieddyes = {}
-unifieddyes.last_used_dye = {}
-unifieddyes.last_dyed_node = {}
local creative_mode = minetest.settings:get_bool("creative_mode")
@@ -89,6 +87,17 @@ unifieddyes.HUES_EXTENDED = {
{ "crimson", 0xff, 0x00, 0x40 }
}
+unifieddyes.HUES_WALLMOUNTED = {
+ "red",
+ "orange",
+ "yellow",
+ "green",
+ "cyan",
+ "blue",
+ "violet",
+ "magenta"
+}
+
unifieddyes.SATS = {
"",
"_s50"
@@ -118,6 +127,14 @@ unifieddyes.GREYS = {
"black"
}
+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
+
local default_dyes = {
"black",
"blue",
@@ -136,77 +153,123 @@ local default_dyes = {
"yellow"
}
--- automatically recolor a placed node to match the last-used dye
--- should be called in the node's `after_place_node` callback.
+-- just stubs to keep old mods from crashing when expecting auto-coloring
+-- or getting back the dye on dig.
-function unifieddyes.recolor_on_place(pos, placer, itemstack, pointed_thing)
+function unifieddyes.recolor_on_place(foo)
+end
- local playername = placer:get_player_name()
- local stackname = itemstack:get_name()
+function unifieddyes.after_dig_node(foo)
+end
+
+-- This helper function creates a colored itemstack
+
+function unifieddyes.make_colored_itemstack(item, palette, color)
+ local paletteidx = unifieddyes.getpaletteidx(color, palette)
+ local stack = ItemStack(item)
+ stack:get_meta():set_int("palette_index", paletteidx)
+ return stack:to_string()
+end
- if unifieddyes.last_dyed_node[playername] ~= stackname then
- if unifieddyes.last_used_dye[playername] then
- minetest.chat_send_player(playername, "Switched to \""..stackname.."\" while auto-coloring, color reset to neutral.")
+-- 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
+ if craft.palette ~= "extended" then
+ color = val..hue..sat
+ else
+ color = val..hue[1]..sat
end
- unifieddyes.last_used_dye[playername] = nil
- unifieddyes.last_dyed_node[playername] = nil
+ else
+ color = hue -- if val is nil, then it's grey.
end
- unifieddyes.last_dyed_node[playername] = stackname
+ local dye = "dye:"..color
- if unifieddyes.last_used_dye[playername] then
- local lastdye = unifieddyes.last_used_dye[playername]
+ local recipe = minetest.serialize(craft.recipe)
+ recipe = string.gsub(recipe, "MAIN_DYE", dye)
+ recipe = string.gsub(recipe, "NEUTRAL_NODE", craft.neutral_node)
+ local newrecipe = minetest.deserialize(recipe)
- local inv = placer:get_inventory()
- if (lastdye and lastdye ~= "" and inv:contains_item("main", lastdye.." 1")) or creative_mode then
+ 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
+ elseif hue == "pink" then
+ dye = "dye:light_red"
+ output = craft.output_prefix.."red"..craft.output_suffix
+ else
+ output = craft.output_prefix..hue..craft.output_suffix
+ end
+ end
+ end
- local nodedef = minetest.registered_nodes[stackname]
- local newname = nodedef.ud_replacement_node or stackname
- local node = minetest.get_node(pos)
+ local colored_itemstack =
+ unifieddyes.make_colored_itemstack(output, craft.palette, dye)
- local palette_type = true -- default to 89-color split, because the others are easier to check for.
- local oldfdir = node.param2 % 32
+ minetest.register_craft({
+ output = colored_itemstack,
+ type = craft.type,
+ recipe = newrecipe
+ })
- if nodedef.palette == "unifieddyes_palette.png" then
- palette_type = false
- oldfdir = 0
- elseif nodedef.palette == "unifieddyes_palette_colorwallmounted.png" then
- palette_type = "wallmounted"
- oldfdir = node.param2 % 8
- elseif nodedef.palette == "unifieddyes_palette_extended.png" then
- palette_type = "extended"
- oldfdir = 0
- end
+end
- local paletteidx, hue = unifieddyes.getpaletteidx(lastdye, palette_type)
- if palette_type == true and hue ~= 0 then newname = string.gsub(newname, "_grey", "_"..unifieddyes.HUES[hue]) end
+function unifieddyes.register_color_craft(craft)
+ local hues_table = unifieddyes.HUES
+ local sats_table = unifieddyes.SATS
+ local vals_table = unifieddyes.VALS
+ local greys_table = unifieddyes.GREYS
+
+ if craft.palette == "wallmounted" then
+ hues_table = unifieddyes.HUES_WALLMOUNTED
+ sats_table = {""}
+ vals_table = unifieddyes.VALS
+ elseif craft.palette == "extended" then
+ hues_table = unifieddyes.HUES_EXTENDED
+ vals_table = unifieddyes.VALS_EXTENDED
+ greys_table = unifieddyes.GREYS_EXTENDED
+ end
- minetest.set_node(pos, { name = newname, param2 = oldfdir + paletteidx })
+ for _, hue in ipairs(hues_table) do
+ for _, val in ipairs(vals_table) do
+ for _, sat in ipairs(sats_table) do
- local meta = minetest.get_meta(pos)
- meta:set_string("dye", lastdye)
+ if sat == "_s50" and val ~= "" and val ~= "medium_" and val ~= "dark_" then break end
+ register_c(craft, hue, sat, val)
- if not creative_mode then
- inv:remove_item("main", lastdye.." 1")
end
- else
- minetest.chat_send_player(playername, "Ran out of "..unifieddyes.last_used_dye[playername]..", resetting to neutral.")
- unifieddyes.last_used_dye[playername] = nil
end
end
-end
-minetest.register_on_leaveplayer(function(player)
- local playername = player:get_player_name()
- unifieddyes.last_used_dye[playername] = nil
- unifieddyes.last_dyed_node[playername] = nil
-end)
+ for _, grey in ipairs(greys_table) do
+ register_c(craft, grey)
+ end
+
+ register_c(craft, "pink")
+
+end
-- code borrowed from homedecor
-- 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)
+ local colorbits = node.param2 - (node.param2 % 8)
+
local yaw = placer:get_look_horizontal()
local dir = minetest.yaw_to_dir(yaw) -- -1.5)
local pitch = placer:get_look_vertical()
@@ -218,7 +281,7 @@ function unifieddyes.fix_rotation(pos, placer, itemstack, pointed_thing)
elseif pitch > math.pi/8 then
fdir = 1
end
- minetest.swap_node(pos, { name = node.name, param2 = fdir })
+ minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits })
end
-- use this when you have a "wallmounted" node that should never be oriented
@@ -226,10 +289,12 @@ end
function unifieddyes.fix_rotation_nsew(pos, placer, itemstack, pointed_thing)
local node = minetest.get_node(pos)
+ local colorbits = node.param2 - (node.param2 % 8)
local yaw = placer:get_look_horizontal()
local dir = minetest.yaw_to_dir(yaw+1.5)
local fdir = minetest.dir_to_wallmounted(dir)
- minetest.swap_node(pos, { name = node.name, param2 = fdir })
+
+ minetest.swap_node(pos, { name = node.name, param2 = fdir+colorbits })
end
-- ... and use this one to force that kind of node off of floor/ceiling
@@ -532,34 +597,6 @@ function unifieddyes.getpaletteidx(color, palette_type)
end
end
--- if your node was once 89-color and uses an LBM to convert to the 256-color palette,
--- call this in that node def's on_construct:
-
-function unifieddyes.on_construct(pos)
- local meta = minetest.get_meta(pos)
- meta:set_string("palette", "ext")
-end
-
--- call this in your node's after_dig_node to get the last-used dye back.
-
-function unifieddyes.after_dig_node(pos, oldnode, oldmetadata, digger)
- local prevdye
-
- if oldmetadata and oldmetadata.fields then
- prevdye = oldmetadata.fields.dye
- end
-
- local inv = digger:get_inventory()
-
- if prevdye and not (inv:contains_item("main", prevdye) and creative_mode) and minetest.registered_items[prevdye] then
- if inv:room_for_item("main", prevdye) then
- inv:add_item("main", prevdye)
- else
- minetest.add_item(pos, prevdye)
- end
- end
-end
-
function unifieddyes.on_use(itemstack, player, pointed_thing)
local stackname = itemstack:get_name()
local playername = player:get_player_name()
@@ -594,14 +631,6 @@ function unifieddyes.on_use(itemstack, player, pointed_thing)
end
end
- if player:get_player_control().sneak then
- if unifieddyes.last_used_dye[playername] then
- minetest.chat_send_player(playername, "Shift-punched a node, switching back to neutral color." )
- end
- unifieddyes.last_used_dye[playername] = nil
- return
- end
-
-- if the target is unknown, has no groups defined, or isn't UD-colorable, just bail out
if not (nodedef and nodedef.groups and nodedef.groups.ud_param2_colorable) then
minetest.chat_send_player(playername, "That node can't be colored.")
@@ -631,11 +660,6 @@ function unifieddyes.on_use(itemstack, player, pointed_thing)
if paletteidx then
- if unifieddyes.last_used_dye[playername] ~= stackname then
- minetest.chat_send_player(playername, "Color "..stackname.." selected, auto-coloring activated." )
- unifieddyes.last_used_dye[playername] = stackname
- end
-
local meta = minetest.get_meta(pos)
local prevdye = meta:get_string("dye")
local inv = player:get_inventory()