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

Compare commits

..

5 Commits

Author SHA1 Message Date
c7fc48c8d0 fix some broken aliases,
add some corresponding ones (unifieddyes:* vs. dye:*)
2018-08-25 00:38:24 -04:00
de5f73e976 clarify usage of make_colored_itemstack() 2018-08-24 23:53:53 -04:00
0d00a7eae6 workaround for placing nodes with no color info in itemstack 2018-08-24 11:13:42 -04:00
adf1bc2c50 remove the old obsolete on_use stuff
(was applied to dye items, obsolete now)
2018-08-24 05:41:27 -04:00
35d34d809e more API doc tweaks 2018-08-23 05:56:02 -04:00
2 changed files with 62 additions and 191 deletions

6
API.md
View File

@ -77,6 +77,10 @@ When given a `color` string (in the form of "dye:foo" or "unifieddyes:foo") and
This function, called in your node definition's on_construct, just sets the `palette = "ext"` metadata key for the node after it's been placed. This can then be read in an LBM to determine if this node needs to be converted from the old 89-color palette to the extended 256-color palette. Although it is good practice to call this for any node that uses the 256-color palette, it isn't actually necessary as long as the node has never used the 89-color palette, and won't be subjected to an LBM that changes its color. This function, called in your node definition's on_construct, just sets the `palette = "ext"` metadata key for the node after it's been placed. This can then be read in an LBM to determine if this node needs to be converted from the old 89-color palette to the extended 256-color palette. Although it is good practice to call this for any node that uses the 256-color palette, it isn't actually necessary as long as the node has never used the 89-color palette, and won't be subjected to an LBM that changes its color.
**`unifieddyes.make_colored_itemstack(itemstack, palette, color)`**
Makes a colored itemstack out of the given `itemstack` and `color` (as a dye, e.g. "dye:dark_red_s50", setting the correct index per the `palette` field, which works as described above for `unifieddyes.getpaletteidx()`. Said itemstack is returned as a string suitable for use as the output field of a craft recipe, equal in size to the itemstack passed into the function (e.g. if you give it "mymod:colored_node 7", it'll return a stack of 7 colored items).
#### Tables #### Tables
In addition to the above API calls, Unified Dyes provides several useful tables In addition to the above API calls, Unified Dyes provides several useful tables
@ -152,3 +156,5 @@ If your mod never has never used Unified Dyes at all, in short, do the following
If your colored node is based on someone else's neutral node, for example if you made a mod that creates multiple colors of minetest_game's default clay, you may find it best to create a single "stand-in" node that's identical to the neutral node, but named for your mod, hidden from the creative inventory, and has a properly-prepared grayscale texture image in addition to the above keys. Use the neutral node and the custom hidden node as in the above craft helper call. Then use minetest.override_item() to add the on_construct and palette keys and the ud_param2_colorable group to that "someone else's" node. If your colored node is based on someone else's neutral node, for example if you made a mod that creates multiple colors of minetest_game's default clay, you may find it best to create a single "stand-in" node that's identical to the neutral node, but named for your mod, hidden from the creative inventory, and has a properly-prepared grayscale texture image in addition to the above keys. Use the neutral node and the custom hidden node as in the above craft helper call. Then use minetest.override_item() to add the on_construct and palette keys and the ud_param2_colorable group to that "someone else's" node.
* You will need to write a run-only-once LBM to convert your old statically-colored nodes to use hardware coloring. See above for functions that will help reduce the work required for this part. * You will need to write a run-only-once LBM to convert your old statically-colored nodes to use hardware coloring. See above for functions that will help reduce the work required for this part.
If your mod has no colorable items, and you wish to expand it accordingly, follow the above "never used" section, skipping the "remove/delete this and that" items, and of course omitting the LBM.

247
init.lua
View File

@ -153,6 +153,36 @@ local default_dyes = {
"yellow" "yellow"
} }
-- 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]
if not def or not def.palette then return false end
if string.find(itemstack:to_string(), "palette_index") then
minetest.swap_node(pos, {name = newnode.name, param2 = newnode.param2})
return
end
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
)
-- just stubs to keep old mods from crashing when expecting auto-coloring -- just stubs to keep old mods from crashing when expecting auto-coloring
-- or getting back the dye on dig. -- or getting back the dye on dig.
@ -168,7 +198,7 @@ function unifieddyes.make_colored_itemstack(item, palette, color)
local paletteidx = unifieddyes.getpaletteidx(color, palette) local paletteidx = unifieddyes.getpaletteidx(color, palette)
local stack = ItemStack(item) local stack = ItemStack(item)
stack:get_meta():set_int("palette_index", paletteidx) stack:get_meta():set_int("palette_index", paletteidx)
return stack:to_string() return stack:to_string(),paletteidx
end end
-- if your node was once 89-color and uses an LBM to convert to the 256-color palette, -- if your node was once 89-color and uses an LBM to convert to the 256-color palette,
@ -569,7 +599,20 @@ function unifieddyes.getpaletteidx(color, palette_type)
color = "red" color = "red"
shade = "light" shade = "light"
end end
if palette_type == true then -- it's colorfacedir if palette_type == true then -- it's colorfacedir, so "split" 89-color palette
-- If using this palette, translate new color names back to old.
if shade == "" then
if color == "spring" then
color = "aqua"
elseif color == "azure" then
color = "skyblue"
elseif color == "rose" then
color = "redviolet"
end
end
if hues[color] and shades[shade] then if hues[color] and shades[shade] then
return (shades[shade] * 32), hues[color] return (shades[shade] * 32), hues[color]
end end
@ -577,10 +620,7 @@ function unifieddyes.getpaletteidx(color, palette_type)
if hues_extended[color] and shades_extended[shade] then if hues_extended[color] and shades_extended[shade] then
return (hues_extended[color] + shades_extended[shade]*24), hues_extended[color] return (hues_extended[color] + shades_extended[shade]*24), hues_extended[color]
end end
else -- it's the 89-color palette else -- it's the regular 89-color palette, do the same translation if needed
-- If using this palette, translate new color names back to old.
if shade == "" then if shade == "" then
if color == "spring" then if color == "spring" then
color = "aqua" color = "aqua"
@ -597,180 +637,6 @@ function unifieddyes.getpaletteidx(color, palette_type)
end end
end end
function unifieddyes.on_use(itemstack, player, pointed_thing)
local stackname = itemstack:get_name()
local playername = player:get_player_name()
if pointed_thing and pointed_thing.type == "node" and unifieddyes.select_node(pointed_thing) then
if minetest.is_protected(unifieddyes.select_node(pointed_thing), playername)
and not minetest.check_player_privs(playername, "protection_bypass") then
minetest.chat_send_player(playername, "Sorry, someone else owns that spot.")
return
end
end
if pointed_thing and pointed_thing.type == "object" then
pointed_thing.ref:punch(player, 0, itemstack:get_tool_capabilities())
return player:get_wielded_item() -- punch may modified the wielded item, load the new and return it
end
if not (pointed_thing and pointed_thing.type == "node") then return end -- if "using" the dye on nothing at all (e.g. air)
local pos = minetest.get_pointed_thing_position(pointed_thing)
local node = minetest.get_node(pos)
local nodedef = minetest.registered_nodes[node.name]
if not nodedef then return end -- target was an unknown node, just bail out
-- if the node has an on_punch defined, bail out and call that instead, unless "sneak" is pressed.
if not player:get_player_control().sneak then
local onpunch = nodedef.on_punch(pos, node, player, pointed_thing)
if onpunch then
return onpunch
end
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.")
return
end
local newnode = nodedef.ud_replacement_node
local palette_type
if nodedef.palette == "unifieddyes_palette_extended.png" then
palette_type = "extended"
elseif nodedef.palette == "unifieddyes_palette.png" then
palette_type = false
elseif nodedef.paramtype2 == "colorfacedir" then
palette_type = true
elseif nodedef.paramtype2 == "colorwallmounted" then
palette_type = "wallmounted"
end
if minetest.is_protected(pos, playername) and not minetest.check_player_privs(playername, {protection_bypass=true}) then
minetest.record_protection_violation(pos, playername)
return
end
local pos2 = unifieddyes.select_node(pointed_thing)
local paletteidx, hue = unifieddyes.getpaletteidx(stackname, palette_type)
if paletteidx then
local meta = minetest.get_meta(pos)
local prevdye = meta:get_string("dye")
local inv = player:get_inventory()
if 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
meta:set_string("dye", stackname)
if prevdye == stackname then
local a,b = string.find(stackname, ":")
minetest.chat_send_player(playername, "That node is already "..string.sub(stackname, a + 1).."." )
return
elseif not creative_mode then
itemstack:take_item()
end
node.param2 = paletteidx
local oldpaletteidx, oldhuenum = unifieddyes.getpaletteidx(prevdye, palette_type)
local oldnode = minetest.get_node(pos)
local oldhue = nil
for _, i in ipairs(unifieddyes.HUES) do
if string.find(oldnode.name, "_"..i) and not
( string.find(oldnode.name, "_redviolet") and i == "red" ) then
oldhue = i
break
end
end
if newnode then -- this path is used when the calling mod want to supply a replacement node
if palette_type == "wallmounted" then
node.param2 = paletteidx + (minetest.get_node(pos).param2 % 8)
elseif palette_type == true then -- it's colorfacedir
if oldhue ~=0 then -- it's colored, not grey
if oldhue ~= nil then -- it's been painted before
if hue ~= 0 then -- the player's wielding a colored dye
newnode = string.gsub(newnode, "_"..oldhue, "_"..unifieddyes.HUES[hue])
else -- it's a greyscale dye
newnode = string.gsub(newnode, "_"..oldhue, "_grey")
end
else -- it's never had a color at all
if hue ~= 0 then -- and if the wield is greyscale, don't change the node name
newnode = string.gsub(newnode, "_grey", "_"..unifieddyes.HUES[hue])
end
end
else
if hue ~= 0 then -- greyscale dye on greyscale node = no hue change
newnode = string.gsub(newnode, "_grey", "_"..unifieddyes.HUES[hue])
end
end
node.param2 = paletteidx + (minetest.get_node(pos).param2 % 32)
else -- it's the 89-color palette, or the extended palette
node.param2 = paletteidx
end
node.name = newnode
minetest.swap_node(pos, node)
if palette_type == "extended" then
meta:set_string("palette", "ext")
end
if not creative_mode then
return itemstack
end
else -- this path is used when you're just painting an existing node, rather than replacing one.
newnode = oldnode -- note that here, newnode/oldnode are a full node, not just the name.
if palette_type == "wallmounted" then
newnode.param2 = paletteidx + (minetest.get_node(pos).param2 % 8)
elseif palette_type == true then -- it's colorfacedir
if oldhue then
if hue ~= 0 then
newnode.name = string.gsub(newnode.name, "_"..oldhue, "_"..unifieddyes.HUES[hue])
else
newnode.name = string.gsub(newnode.name, "_"..oldhue, "_grey")
end
elseif string.find(minetest.get_node(pos).name, "_grey") and hue ~= 0 then
newnode.name = string.gsub(newnode.name, "_grey", "_"..unifieddyes.HUES[hue])
end
newnode.param2 = paletteidx + (minetest.get_node(pos).param2 % 32)
else -- it's the 89-color palette, or the extended palette
newnode.param2 = paletteidx
end
minetest.swap_node(pos, newnode)
if palette_type == "extended" then
meta:set_string("palette", "ext")
end
if not creative_mode then
return itemstack
end
end
else
local a,b = string.find(stackname, ":")
if a then
minetest.chat_send_player(playername, "That node can't be colored "..string.sub(stackname, a + 1).."." )
end
end
end
-- re-define default dyes slightly, to add on_use
for _, color in ipairs(default_dyes) do
minetest.override_item("dye:"..color, {
on_use = unifieddyes.on_use
})
end
-- build a table to convert from classic/89-color palette to extended palette -- build a table to convert from classic/89-color palette to extended palette
-- the first five entries are for the old greyscale - white, light, grey, dark, black -- the first five entries are for the old greyscale - white, light, grey, dark, black
@ -825,7 +691,6 @@ for _, h in ipairs(unifieddyes.HUES_EXTENDED) do
if minetest.registered_items["dye:"..val..hue] then if minetest.registered_items["dye:"..val..hue] then
minetest.override_item("dye:"..val..hue, { minetest.override_item("dye:"..val..hue, {
inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200", inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200",
on_use = unifieddyes.on_use
}) })
else else
if (val..hue) ~= "medium_orange" if (val..hue) ~= "medium_orange"
@ -834,7 +699,6 @@ for _, h in ipairs(unifieddyes.HUES_EXTENDED) do
description = S(desc), description = S(desc),
inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200", inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200",
groups = { dye=1, not_in_creative_inventory=1 }, groups = { dye=1, not_in_creative_inventory=1 },
on_use = unifieddyes.on_use
}) })
end end
end end
@ -857,7 +721,6 @@ for _, h in ipairs(unifieddyes.HUES_EXTENDED) do
description = S(desc.." (low saturation)"), description = S(desc.." (low saturation)"),
inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200", inventory_image = "unifieddyes_dye.png^[colorize:#"..color..":200",
groups = { dye=1, not_in_creative_inventory=1 }, groups = { dye=1, not_in_creative_inventory=1 },
on_use = unifieddyes.on_use
}) })
minetest.register_alias("unifieddyes:"..val..hue.."_s50", "dye:"..val..hue.."_s50") minetest.register_alias("unifieddyes:"..val..hue.."_s50", "dye:"..val..hue.."_s50")
end end
@ -878,7 +741,6 @@ for y = 1, 14 do -- colors 0 and 15 are black and white, default dyes
description = S(desc), description = S(desc),
inventory_image = "unifieddyes_dye.png^[colorize:#"..rgb..":200", inventory_image = "unifieddyes_dye.png^[colorize:#"..rgb..":200",
groups = { dye=1, not_in_creative_inventory=1 }, groups = { dye=1, not_in_creative_inventory=1 },
on_use = unifieddyes.on_use
}) })
minetest.register_alias("unifieddyes:"..name, "dye:"..name) minetest.register_alias("unifieddyes:"..name, "dye:"..name)
end end
@ -886,19 +748,16 @@ end
minetest.override_item("dye:grey", { minetest.override_item("dye:grey", {
inventory_image = "unifieddyes_dye.png^[colorize:#888888:200", inventory_image = "unifieddyes_dye.png^[colorize:#888888:200",
on_use = unifieddyes.on_use
}) })
minetest.override_item("dye:dark_grey", { minetest.override_item("dye:dark_grey", {
inventory_image = "unifieddyes_dye.png^[colorize:#444444:200", inventory_image = "unifieddyes_dye.png^[colorize:#444444:200",
on_use = unifieddyes.on_use
}) })
minetest.register_craftitem(":dye:light_grey", { minetest.register_craftitem(":dye:light_grey", {
description = S("Light grey Dye"), description = S("Light grey Dye"),
inventory_image = "unifieddyes_dye.png^[colorize:#cccccc:200", inventory_image = "unifieddyes_dye.png^[colorize:#cccccc:200",
groups = { dye=1, not_in_creative_inventory=1 }, groups = { dye=1, not_in_creative_inventory=1 },
on_use = unifieddyes.on_use
}) })
unifieddyes.base_color_crafts = { unifieddyes.base_color_crafts = {
@ -1089,10 +948,16 @@ minetest.register_alias("unifieddyes:carbon_black", "dye:black")
-- note that technically, lime should be aliased, but can't be (there IS -- note that technically, lime should be aliased, but can't be (there IS
-- lime in the new color table, it's just shifted up a bit) -- lime in the new color table, it's just shifted up a bit)
minetest.register_alias("unifieddyes:aqua", "unifieddyes:spring") minetest.register_alias("unifieddyes:aqua", "dye:spring")
minetest.register_alias("unifieddyes:skyblue", "unifieddyes:azure") minetest.register_alias("dye:aqua", "dye:spring")
minetest.register_alias("unifieddyes:redviolet", "unifieddyes:rose")
minetest.register_alias("unifieddyes:brown", "dye:brown") minetest.register_alias("unifieddyes:skyblue", "dye:azure")
minetest.register_alias("dye:skyblue", "dye:azure")
minetest.register_alias("unifieddyes:redviolet", "dye:rose")
minetest.register_alias("dye:redviolet", "dye:rose")
minetest.register_alias("unifieddyes:brown", "dye:brown")
print(S("[UnifiedDyes] Loaded!")) print(S("[UnifiedDyes] Loaded!"))