7 local S
= minetest
.get_translator("rp_jewels")
8 local NS
= function(s
) return s
end
9 local F
= minetest
.formspec_escape
13 -- Array of registered jeweled tools
15 jewels
.registered_jewels
= {}
16 jewels
.registered_jewel_defs
= {}
17 jewels
.registered_jewel_parents
= {}
21 local form_bench
= rp_formspec
.get_page("rp_default:2part")
23 form_bench
= form_bench
.. "list[current_name;main;2.25,1.75;1,1;]"
24 form_bench
= form_bench
.. "listring[current_name;main]"
25 form_bench
= form_bench
.. rp_formspec
.get_itemslot_bg(2.25, 1.75, 1, 1)
27 form_bench
= form_bench
.. "label[3.25,1.75;"..F(S("1. Place tool here")).."]"
28 form_bench
= form_bench
.. "label[3.25,2.25;"..F(S("2. Hold a jewel and punch the bench")).."]"
30 form_bench
= form_bench
.. "list[current_player;main;0.25,4.75;8,4;]"
31 form_bench
= form_bench
.. "listring[current_player;main]"
32 form_bench
= form_bench
.. rp_formspec
.get_hotbar_itemslot_bg(0.25, 4.75, 8, 1)
33 form_bench
= form_bench
.. rp_formspec
.get_itemslot_bg(0.25, 5.75, 8, 3)
35 rp_formspec
.register_page("rp_jewels_bench", form_bench
)
37 local function plus_power(i
)
45 function jewels
.register_jewel(toolname
, new_toolname
, def
)
46 -- registers a new tool with different stats
49 name
= new_toolname
, -- the new name of the tool
50 overlay
= def
.overlay
or "jewels_jeweled_handle.png", -- overlay image
51 overlay_wield
= def
.overlay_wield
, -- overlay wield image
52 description
= def
.description
or nil,
54 digspeed
= def
.stats
.digspeed
, -- negative digs faster
55 maxlevel
= def
.stats
.maxlevel
, -- positive digs higher levels
56 maxdrop
= def
.stats
.maxdrop
, -- positive increases max drop level
57 uses
= def
.stats
.uses
, -- positive increases uses
58 fleshy
= def
.stats
.fleshy
, -- positive increases fleshy damage
59 range
= def
.stats
.range
, -- positive increases reach distance with tool
62 if not data
.overlay_wield
then
63 data
.overlay_wield
= data
.overlay
66 if not jewels
.registered_jewels
[toolname
] then
67 jewels
.registered_jewels
[toolname
] = {}
70 jewels
.registered_jewel_defs
[new_toolname
] = data
72 table.insert(jewels
.registered_jewels
[toolname
], data
)
76 digspeed
= (data
.stats
.digspeed
or 0),
77 maxlevel
= (data
.stats
.maxlevel
or 0),
78 maxdrop
= (data
.stats
.maxdrop
or 0),
79 uses
= (data
.stats
.uses
or 0),
80 fleshy
= (data
.stats
.fleshy
or 0),
81 range
= (data
.stats
.range
or 0),
85 local parent
= jewels
.registered_jewel_parents
[toolname
]
87 for k
,v
in pairs(parent
.stats
) do
88 newparent
.stats
[k
] = newparent
.stats
[k
] + v
91 jewels
.registered_jewel_parents
[new_toolname
] = newparent
93 local tooldef
= minetest
.registered_tools
[toolname
]
96 minetest
.log("warning",
97 "[rp_jewels] Trying to register jewel " .. new_toolname
98 .. " that has an unknown output item " .. toolname
)
103 local new_tool_invimage
104 if tooldef
.inventory_image
~= nil and tooldef
.inventory_image
~= "" then
105 new_tool_invimage
= "(" .. tooldef
.inventory_image
.. ")^(" .. data
.overlay
.. ")"
108 local new_tool_wieldimage
109 if tooldef
.wield_image
~= nil and tooldef
.wield_image
~= "" then
110 new_tool_wieldimage
= "(" .. tooldef
.wield_image
.. ")^(" .. data
.overlay_wield
.. ")"
111 elseif data
.overlay_wield
then
112 new_tool_wieldimage
= "(" .. tooldef
.inventory_image
.. ")^(" .. data
.overlay_wield
.. ")"
115 local new_tooldef
= table.copy(tooldef
)
117 if data
.description
~= nil then
118 desc
= data
.description
120 -- All tools should have their description set explicitly. This is a fallback
121 minetest
.log("warning", "[rp_jewels] No description for jeweled tool "..new_toolname
.."! Auto-generating a name")
122 desc
= new_tooldef
.description
126 desc
= S("Jeweled @1", desc
)
129 new_tooldef
.description
= desc
131 new_tooldef
.inventory_image
= new_tool_invimage
132 new_tooldef
.wield_image
= new_tool_wieldimage
134 if data
.stats
.range
then
135 if not new_tooldef
.range
then
136 new_tooldef
.range
= 4
138 new_tooldef
.range
= new_tooldef
.range
+ data
.stats
.range
141 if new_tooldef
.tool_capabilities
then
142 if data
.stats
.maxdrop
and new_tooldef
.tool_capabilities
.max_drop_level
then
143 new_tooldef
.tool_capabilities
.max_drop_level
=
144 new_tooldef
.tool_capabilities
.max_drop_level
+ data
.stats
.maxdrop
147 if data
.stats
.digspeed
then
148 for group
, cap
in pairs(new_tooldef
.tool_capabilities
.groupcaps
) do
149 for i
, _
in ipairs(cap
.times
) do
150 cap
.times
[i
] = cap
.times
[i
] + data
.stats
.digspeed
153 if data
.stats
.maxlevel
and cap
.maxlevel
then
154 cap
.maxlevel
= cap
.maxlevel
+ data
.stats
.maxlevel
157 if data
.stats
.uses
and cap
.uses
then
158 cap
.uses
= cap
.uses
+ data
.stats
.uses
163 if data
.stats
.fleshy
and new_tooldef
.tool_capabilities
.damage_groups
164 and new_tooldef
.tool_capabilities
.damage_groups
.fleshy
then
165 new_tooldef
.tool_capabilities
.damage_groups
.fleshy
=
166 new_tooldef
.tool_capabilities
.damage_groups
.fleshy
+ data
.stats
.fleshy
170 if not new_tooldef
.groups
then
171 new_tooldef
.groups
= {}
173 new_tooldef
.groups
.not_in_creative_inventory
= 1
175 minetest
.register_tool(new_toolname
, new_tooldef
)
178 if minetest
.get_modpath("tt") then
180 local function get_stat(format_text
, stats_key
, parent
, stats
)
181 local disp_val
= stats
[stats_key
] or 0
183 disp_val
= disp_val
+ parent
.stats
[stats_key
]
185 if disp_val
~= 0 then
186 return S(format_text
, plus_power(disp_val
))
192 { "range", NS("Range: @1") },
193 { "maxdrop", NS("Drop level: @1") },
194 { "digspeed", NS("Dig time: @1 s") },
195 { "uses", NS("Uses: @1") },
196 { "maxlevel", NS("Dig level: @1") },
199 for a
=1, #amendments
do
200 tt
.register_snippet(function(itemname
)
201 local jewel
= jewels
.registered_jewel_defs
[itemname
]
202 local parent
= jewels
.registered_jewel_parents
[itemname
]
208 local stat
= amendments
[a
][1]
209 if jewel
.stats
[stat
] then
210 desc
= get_stat(amendments
[a
][2], stat
, parent
, jewel
.stats
)
213 return desc
, "#4CFFFD"
222 function jewels
.can_jewel(toolname
)
223 for name
, _
in pairs(jewels
.registered_jewels
) do
224 if name
== toolname
then
232 function jewels
.get_jeweled(toolname
)
233 for name
, jables
in pairs(jewels
.registered_jewels
) do
234 if name
== toolname
then
235 return util
.choice_element(jables
)
242 minetest
.register_craftitem(
245 description
= S("Jewel"),
246 inventory_image
= "jewels_jewel.png",
253 local check_put
= function(pos
, listname
, index
, stack
, player
)
254 if minetest
.is_protected(pos
, player
:get_player_name()) and
255 not minetest
.check_player_privs(player
, "protection_bypass") then
256 minetest
.record_protection_violation(pos
, player
:get_player_name())
259 local meta
= minetest
.get_meta(pos
)
260 local inv
= meta
:get_inventory()
261 if listname
== "main" then
262 local name
= stack
:get_name()
263 if minetest
.registered_items
[name
] then
264 -- Disallow put for non-tools (unless it can be jeweled)
265 if (not jewels
.can_jewel(name
)) and minetest
.registered_items
[name
].type ~= "tool" then
270 return stack
:get_count()
272 local check_move
= function(pos
, from_list
, from_index
, to_list
, to_index
, count
, player
)
273 local meta
= minetest
.get_meta(pos
)
274 local inv
= meta
:get_inventory()
275 local stack
= inv
:get_stack(from_list
, from_index
)
276 return check_take(pos
, to_list
, to_index
, stack
, player
)
278 local check_take
= function(pos
, listname
, index
, stack
, player
)
279 if minetest
.is_protected(pos
, player
:get_player_name()) and
280 not minetest
.check_player_privs(player
, "protection_bypass") then
281 minetest
.record_protection_violation(pos
, player
:get_player_name())
284 return stack
:get_count()
288 minetest
.register_node(
291 description
= S("Jeweler's Workbench"),
292 _tt_help
= S("Tools can be upgraded with jewels here"),
293 tiles
={"jewels_bench_top.png", "jewels_bench_bottom.png", "jewels_bench_sides.png"},
294 paramtype2
= "facedir",
295 groups
= {snappy
=2,choppy
=2,oddly_breakable_by_hand
=2},
296 legacy_facedir_simple
= true,
297 is_ground_content
= false,
298 sounds
= rp_sounds
.node_sound_wood_defaults(),
300 on_construct
= function(pos
)
301 local meta
= minetest
.get_meta(pos
)
302 meta
:set_string("formspec", rp_formspec
.get_page("rp_jewels_bench"))
303 meta
:set_string("infotext", S("Jeweler's Workbench"))
305 local inv
= meta
:get_inventory()
306 inv
:set_size("main", 1)
308 can_dig
= function(pos
, player
)
309 local meta
= minetest
.get_meta(pos
)
310 local inv
= meta
:get_inventory()
312 return inv
:is_empty("main")
314 allow_metadata_inventory_move
= check_move
,
315 allow_metadata_inventory_put
= check_put
,
316 allow_metadata_inventory_take
= check_take
,
317 on_punch
= function(pos
, node
, player
, pointed_thing
)
318 local itemstack
= player
:get_wielded_item()
319 local itemstack_changed
= false
320 if itemstack
:get_name() == "rp_jewels:jewel" then
321 if minetest
.is_protected(pos
, player
:get_player_name()) and
322 not minetest
.check_player_privs(player
, "protection_bypass") then
323 minetest
.record_protection_violation(pos
, player
:get_player_name())
326 local meta
= minetest
.get_meta(pos
)
327 local inv
= meta
:get_inventory()
329 local iitem
= inv
:get_stack("main", 1)
330 if iitem
:is_empty() then
333 local itemname
= iitem
:get_name()
335 if jewels
.can_jewel(itemname
) then
337 inv
:set_stack("main", 1, ItemStack(jewels
.get_jeweled(itemname
)))
339 if not minetest
.is_creative_enabled(player
:get_player_name()) then
340 itemstack
:take_item()
341 itemstack_changed
= true
344 minetest
.sound_play({name
="jewels_jewelling_a_tool"}, {gain
=0.8, pos
=pos
, max_hear_distance
=8}, true)
345 -- TODO: Graphical effect
347 achievements
.trigger_achievement(player
, "jeweler")
350 minetest
.sound_play({name
="jewels_jewelling_fail"}, {gain
=0.8, pos
=pos
, max_hear_distance
=8}, true)
354 if itemstack_changed
then
355 player
:set_wielded_item(itemstack
)
360 minetest
.register_node(
361 "rp_jewels:jewel_ore",
363 description
= S("Jewel Ore"),
365 "default_tree_birch_top.png",
366 "default_tree_birch_top.png",
367 "default_tree_birch.png^jewels_ore.png"
369 drop
= "rp_jewels:jewel",
370 groups
= {snappy
=1, choppy
=1, tree
=1},
371 sounds
= rp_sounds
.node_sound_wood_defaults(),
374 crafting
.register_craft(
376 output
= "rp_jewels:bench",
379 "rp_default:ingot_carbon_steel 2",
384 minetest
.register_craft(
387 output
= "rp_jewels:jewel",
388 recipe
= "rp_jewels:jewel_ore",
394 achievements
.register_achievement(
397 title
= S("Jeweler"),
398 description
= S("Jewel a tool."),
400 item_icon
= "rp_jewels:shovel_steel_uses",
403 achievements
.register_achievement(
406 title
= S("Secret of Jewels"),
407 description
= S("Discover the origin of jewels."),
409 dignode
= "rp_jewels:jewel_ore",
412 -- Update node after the rename orgy after 1.5.3
413 minetest
.register_lbm(
415 label
= "Update jeweler's workbench",
416 name
= "rp_jewels:update_bench",
417 nodenames
= {"rp_jewels:bench"},
418 action
= function(pos
, node
)
419 local def
= minetest
.registered_nodes
[node
.name
]
420 def
.on_construct(pos
)
425 -- The tool jewel definitions
427 dofile(minetest
.get_modpath("rp_jewels").."/jewels.lua")
428 dofile(minetest
.get_modpath("rp_jewels").."/mapgen.lua")
429 dofile(minetest
.get_modpath("rp_jewels").."/aliases.lua")