Skip to content

Commit 1940961

Browse files
Thomas--Sparamat
authored andcommittedJan 4, 2020
Move duplicate recipe from books to default.register_craft_metadata_copy()
This allows mods to easily implement the same behaviour, e.g. for letters.
1 parent 6e32287 commit 1940961

File tree

3 files changed

+43
-28
lines changed

3 files changed

+43
-28
lines changed
 

‎game_api.txt

+8
Original file line numberDiff line numberDiff line change
@@ -1055,3 +1055,11 @@ for the wielded skeleton key.
10551055

10561056
if `nil` is returned, it is assumed that the wielder did not have
10571057
permissions to create a key for this node, and no key is created.
1058+
1059+
`default.register_craft_metadata_copy(ingredient, result)`
1060+
----------------------------------------------------------
1061+
1062+
This function registers a shapeless recipe that takes `ingredient`
1063+
and `result` as input and outputs `result`.
1064+
1065+
The metadata of the input `result` is copied to the output `result`.

‎mods/default/craftitems.lua

+1-28
Original file line numberDiff line numberDiff line change
@@ -145,29 +145,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
145145
player:set_wielded_item(stack)
146146
end)
147147

148-
minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
149-
if itemstack:get_name() ~= "default:book_written" then
150-
return
151-
end
152-
153-
local original
154-
local index
155-
for i = 1, player:get_inventory():get_size("craft") do
156-
if old_craft_grid[i]:get_name() == "default:book_written" then
157-
original = old_craft_grid[i]
158-
index = i
159-
end
160-
end
161-
if not original then
162-
return
163-
end
164-
local copymeta = original:get_meta():to_table()
165-
-- copy of the book held by player's mouse cursor
166-
itemstack:get_meta():from_table(copymeta)
167-
-- put the book with metadata back in the craft grid
168-
craft_inv:set_stack("craft", index, original)
169-
end)
170-
171148
minetest.register_craftitem("default:skeleton_key", {
172149
description = S("Skeleton Key"),
173150
inventory_image = "default_key_skeleton.png",
@@ -361,11 +338,7 @@ minetest.register_craft({
361338
}
362339
})
363340

364-
minetest.register_craft({
365-
type = "shapeless",
366-
output = "default:book_written",
367-
recipe = {"default:book", "default:book_written"}
368-
})
341+
default.register_craft_metadata_copy("default:book", "default:book_written")
369342

370343
minetest.register_craft({
371344
output = "default:bronze_ingot 9",

‎mods/default/functions.lua

+34
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,40 @@ minetest.register_abm({
581581
end
582582
})
583583

584+
--
585+
-- Register a craft to copy the metadata of items
586+
--
587+
588+
function default.register_craft_metadata_copy(ingredient, result)
589+
minetest.register_craft({
590+
type = "shapeless",
591+
output = result,
592+
recipe = {ingredient, result}
593+
})
594+
595+
minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv)
596+
if itemstack:get_name() ~= result then
597+
return
598+
end
599+
600+
local original
601+
local index
602+
for i = 1, #old_craft_grid do
603+
if old_craft_grid[i]:get_name() == result then
604+
original = old_craft_grid[i]
605+
index = i
606+
end
607+
end
608+
if not original then
609+
return
610+
end
611+
local copymeta = original:get_meta():to_table()
612+
itemstack:get_meta():from_table(copymeta)
613+
-- put the book with metadata back in the craft grid
614+
craft_inv:set_stack("craft", index, original)
615+
end)
616+
end
617+
584618

585619
--
586620
-- NOTICE: This method is not an official part of the API yet.

0 commit comments

Comments
 (0)
Please sign in to comment.