]> git.lizzy.rs Git - minetest.git/commitdiff
Make dropped items colorable
authorDániel Juhász <juhdanad@gmail.com>
Sat, 24 Jun 2017 16:58:01 +0000 (18:58 +0200)
committerSmallJoker <mk939@ymail.com>
Sun, 3 Jun 2018 15:31:59 +0000 (17:31 +0200)
builtin/game/item.lua
doc/lua_api.txt

index f6de2c33979131edd991350b48339a6be606bf0c..1a8bce903910cc58b948be50de76253cf86f39ea 100644 (file)
@@ -155,6 +155,24 @@ function core.yaw_to_dir(yaw)
        return {x = -math.sin(yaw), y = 0, z = math.cos(yaw)}
 end
 
+function core.is_colored_paramtype(ptype)
+       return (ptype == "color") or (ptype == "colorfacedir") or
+               (ptype == "colorwallmounted")
+end
+
+function core.strip_param2_color(param2, paramtype2)
+       if not core.is_colored_paramtype(paramtype2) then
+               return nil
+       end
+       if paramtype2 == "colorfacedir" then
+               param2 = math.floor(param2 / 32) * 32
+       elseif paramtype2 == "colorwallmounted" then
+               param2 = math.floor(param2 / 8) * 8
+       end
+       -- paramtype2 == "color" requires no modification.
+       return param2
+end
+
 function core.get_node_drops(node, toolname)
        -- Compatibility, if node is string
        local nodename = node
@@ -166,24 +184,17 @@ function core.get_node_drops(node, toolname)
        end
        local def = core.registered_nodes[nodename]
        local drop = def and def.drop
+       local ptype = def and def.paramtype2
+       -- get color, if there is color (otherwise nil)
+       local palette_index = core.strip_param2_color(param2, ptype)
        if drop == nil then
                -- default drop
-               local stack = ItemStack(nodename)
-               if def then
-                       local type = def.paramtype2
-                       if (type == "color") or (type == "colorfacedir") or
-                                       (type == "colorwallmounted") then
-                               local meta = stack:get_meta()
-                               local color_part = param2
-                               if (type == "colorfacedir") then
-                                       color_part = math.floor(color_part / 32) * 32;
-                               elseif (type == "colorwallmounted") then
-                                       color_part = math.floor(color_part / 8) * 8;
-                               end
-                               meta:set_int("palette_index", color_part)
-                       end
+               if palette_index then
+                       local stack = ItemStack(nodename)
+                       stack:get_meta():set_int("palette_index", palette_index)
+                       return {stack:to_string()}
                end
-               return {stack:to_string()}
+               return {nodename}
        elseif type(drop) == "string" then
                -- itemstring drop
                return {drop}
@@ -218,6 +229,12 @@ function core.get_node_drops(node, toolname)
                if good_rarity and good_tool then
                        got_count = got_count + 1
                        for _, add_item in ipairs(item.items) do
+                               -- add color, if necessary
+                               if item.inherit_color and palette_index then
+                                       local stack = ItemStack(add_item)
+                                       stack:get_meta():set_int("palette_index", palette_index)
+                                       add_item = stack:to_string()
+                               end
                                got_items[#got_items+1] = add_item
                        end
                        if drop.max_items ~= nil and got_count == drop.max_items then
index edef755938c9df1f04ce239796aa24cae2d10a32..03c825689adf6b95279ede5aec2a9083dc589124 100644 (file)
@@ -536,6 +536,21 @@ automatically transferred between node and item forms by the engine,
 when a player digs or places a colored node.
 You can disable this feature by setting the `drop` field of the node
 to itself (without metadata).
+To transfer the color to a special drop, you need a drop table.
+Example:
+
+    minetest.register_node("mod:stone", {
+        description = "Stone",
+        tiles = {"default_stone.png"},
+        paramtype2 = "color",
+        palette = "palette.png",
+        drop = {
+            items = {
+                -- assume that mod:cobblestone also has the same palette
+                {items = {"mod:cobblestone"}, inherit_color = true },
+            }
+        }
+    })
 
 ### Colored items in craft recipes
 Craft recipes only support item strings, but fortunately item strings
@@ -2679,6 +2694,13 @@ and `minetest.auth_reload` call the authetification handler.
     * Convert a vector into a yaw (angle)
 * `minetest.yaw_to_dir(yaw)`
     * Convert yaw (angle) to a vector
+* `minetest.is_colored_paramtype(ptype)`
+    * Returns a boolean. Returns `true` if the given `paramtype2` contains color
+      information (`color`, `colorwallmounted` or `colorfacedir`).
+* `minetest.strip_param2_color(param2, paramtype2)`
+    * Removes everything but the color information from the
+      given `param2` value.
+    * Returns `nil` if the given `paramtype2` does not contain color information
 * `minetest.get_node_drops(nodename, toolname)`
     * Returns list of item names.
     * **Note**: This will be removed or modified in a future version.
@@ -4216,6 +4238,7 @@ Definition tables
                 {
                     items = {"foo:bar", "baz:frob"},  -- Items to drop.
                     rarity = 1,  -- Probability of dropping is 1 / rarity.
+                    inherit_color = true, -- To inherit palette color from the node
                 },
             },
         },