Skip to content

Commit

Permalink
Move duplicate recipe from books to default.register_craft_metadata_c…
Browse files Browse the repository at this point in the history
…opy()

This allows mods to easily implement the same behaviour, e.g. for letters.
  • Loading branch information
Thomas--S authored and paramat committed Jan 4, 2020
1 parent 6e32287 commit 1940961
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 28 deletions.
8 changes: 8 additions & 0 deletions game_api.txt
Expand Up @@ -1055,3 +1055,11 @@ for the wielded skeleton key.

if `nil` is returned, it is assumed that the wielder did not have
permissions to create a key for this node, and no key is created.

`default.register_craft_metadata_copy(ingredient, result)`
----------------------------------------------------------

This function registers a shapeless recipe that takes `ingredient`
and `result` as input and outputs `result`.

The metadata of the input `result` is copied to the output `result`.
29 changes: 1 addition & 28 deletions mods/default/craftitems.lua
Expand Up @@ -145,29 +145,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
player:set_wielded_item(stack)
end)

minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
if itemstack:get_name() ~= "default:book_written" then
return
end

local original
local index
for i = 1, player:get_inventory():get_size("craft") do
if old_craft_grid[i]:get_name() == "default:book_written" then
original = old_craft_grid[i]
index = i
end
end
if not original then
return
end
local copymeta = original:get_meta():to_table()
-- copy of the book held by player's mouse cursor
itemstack:get_meta():from_table(copymeta)
-- put the book with metadata back in the craft grid
craft_inv:set_stack("craft", index, original)
end)

minetest.register_craftitem("default:skeleton_key", {
description = S("Skeleton Key"),
inventory_image = "default_key_skeleton.png",
Expand Down Expand Up @@ -361,11 +338,7 @@ minetest.register_craft({
}
})

minetest.register_craft({
type = "shapeless",
output = "default:book_written",
recipe = {"default:book", "default:book_written"}
})
default.register_craft_metadata_copy("default:book", "default:book_written")

minetest.register_craft({
output = "default:bronze_ingot 9",
Expand Down
34 changes: 34 additions & 0 deletions mods/default/functions.lua
Expand Up @@ -581,6 +581,40 @@ minetest.register_abm({
end
})

--
-- Register a craft to copy the metadata of items
--

function default.register_craft_metadata_copy(ingredient, result)
minetest.register_craft({
type = "shapeless",
output = result,
recipe = {ingredient, result}
})

minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
if itemstack:get_name() ~= result then
return
end

local original
local index
for i = 1, #old_craft_grid do
if old_craft_grid[i]:get_name() == result then
original = old_craft_grid[i]
index = i
end
end
if not original then
return
end
local copymeta = original:get_meta():to_table()
itemstack:get_meta():from_table(copymeta)
-- put the book with metadata back in the craft grid
craft_inv:set_stack("craft", index, original)
end)
end


--
-- NOTICE: This method is not an official part of the API yet.
Expand Down

0 comments on commit 1940961

Please sign in to comment.