]> git.lizzy.rs Git - xdecor.git/blob - enchanting.lua
Small optimization on enchanting table
[xdecor.git] / enchanting.lua
1 local enchanting = {}
2
3 function enchanting.construct(pos)
4         local meta = minetest.get_meta(pos)
5         local xbg = default.gui_bg..default.gui_bg_img..default.gui_slots
6         meta:set_string("formspec", "size[8,7;]"..xbg..
7                 "label[0.85,-0.15;Enchant]".."image[0.6,0.2;2,2;xdecor_enchbook.png]"..
8                 "list[current_name;tool;0.5,2;1,1;]"..
9                 "list[current_name;mese;1.5,2;1,1;]".."image[1.5,2;1,1;mese_layout.png]"..
10                 "image_button[2.75,0;5,1.5;ench_bg.png;durable;Durable]"..
11                 "image_button[2.75,1.5;5,1.5;ench_bg.png;fast;Fast]"..
12                 "list[current_player;main;0,3.3;8,4;]")
13         meta:set_string("infotext", "Enchantment Table")
14
15         local inv = meta:get_inventory()
16         inv:set_size("tool", 1)
17         inv:set_size("mese", 1)
18 end
19
20 function enchanting.is_allowed(toolname)
21         local tdef = minetest.registered_tools[toolname]
22         if tdef and toolname:find("default:") and not toolname:find("sword") and not
23                         toolname:find("stone") and not toolname:find("wood") then
24                 return 1
25         else return 0 end
26 end
27
28 function enchanting.fields(pos, _, fields, _)
29         local meta = minetest.get_meta(pos)
30         local inv = meta:get_inventory()
31         local toolstack = inv:get_stack("tool", 1)
32         local mesestack = inv:get_stack("mese", 1)
33         local toolname = toolstack:get_name()
34         local toolwear = toolstack:get_wear()
35         local mese = mesestack:get_count()
36         local ench = dump(fields):match("%w+")
37
38         if enchanting.is_allowed(toolname) ~= 0 and mese > 0 and fields[ench] then
39                 toolstack:replace("xdecor:enchanted_"..toolname:sub(9).."_"..ench)
40                 toolstack:add_wear(toolwear)
41                 mesestack:take_item()
42                 inv:set_stack("mese", 1, mesestack)
43                 inv:set_stack("tool", 1, toolstack)
44         end
45 end
46
47 function enchanting.dig(pos, _)
48         local meta = minetest.get_meta(pos)
49         local inv = meta:get_inventory()
50
51         if not inv:is_empty("tool") or not inv:is_empty("mese") then
52                 return false
53         end
54         return true
55 end
56
57 function enchanting.put(_, listname, _, stack, _)
58         local toolname = stack:get_name()
59         local count = stack:get_count()
60
61         if listname == "mese" then
62                 if toolname == "default:mese_crystal" then return count
63                 else return 0 end
64         end
65         if listname == "tool" then
66                 return enchanting.is_allowed(toolname)
67         end
68         return count
69 end
70
71 xdecor.register("enchantment_table", {
72         description = "Enchantment Table",
73         tiles = {
74                 "xdecor_enchantment_top.png", "xdecor_enchantment_bottom.png",
75                 "xdecor_enchantment_side.png", "xdecor_enchantment_side.png",
76                 "xdecor_enchantment_side.png", "xdecor_enchantment_side.png"
77         },
78         groups = {cracky=1},
79         sounds = default.node_sound_stone_defaults(),
80         can_dig = enchanting.dig,
81         on_construct = enchanting.construct,
82         on_receive_fields = enchanting.fields,
83         allow_metadata_inventory_put = enchanting.put,
84         allow_metadata_inventory_move = function(_,_,_,_,_,_,_) return 0 end
85 })
86
87 function enchanting.register_enchtools(init, m, def)
88         local longer = init.uses * 1.2 -- Higher number = longer use.
89         local faster = {}
90         for i = 1, 3 do
91                 faster[i] = init.times[i] - 0.1 -- Higher number = faster dig.
92         end
93
94         local fast = {times=faster, uses=def.uses, maxlevel=def.maxlvl}
95         local long = {times=def.times, uses=longer, maxlevel=def.maxlvl}
96
97         local enchtools = {
98                 {"axe", "durable", {choppy = long}}, {"axe", "fast", {choppy = fast}},
99                 {"pick", "durable", {cracky = long}}, {"pick", "fast", {cracky = fast}},
100                 {"shovel", "durable", {crumbly = long}}, {"shovel", "fast", {crumbly = fast}}
101         }
102         for i = 1, #enchtools do
103                 local x = enchtools[i]
104                 local t, e, g = x[1], x[2], x[3]
105                 minetest.register_tool("xdecor:enchanted_"..t.."_"..m.."_"..e, {
106                         description = "Enchanted "..m:gsub("%l", string.upper, 1).." "..
107                                         t:gsub("%l", string.upper, 1).." ("..e:gsub("%l", string.upper, 1)..")",
108                         inventory_image = minetest.registered_tools["default:"..t.."_"..m].inventory_image,
109                         wield_image = minetest.registered_tools["default:"..t.."_"..m].wield_image,
110                         groups = {not_in_creative_inventory=1},
111                         tool_capabilities = {groupcaps = g, damage_groups = def.dmg}
112                 })
113         end
114 end
115
116 local tools = {
117         {"axe", "choppy"}, {"pick", "cracky"}, {"shovel", "crumbly"}
118 }
119 local materials = {"steel", "bronze", "mese", "diamond"}
120
121 for i = 1, #tools do
122 for j = 1, #materials do
123         local t, m = tools[i], materials[j]
124         local toolname = t[1].."_"..m
125         local init_def = minetest.registered_tools["default:"..toolname].tool_capabilities.groupcaps[t[2]]
126
127         local tooldef = {
128                 times = init_def.times,
129                 uses = init_def.uses,
130                 dmg = init_def.damage_groups,
131                 maxlvl = init_def.maxlevel
132         }
133         enchanting.register_enchtools(init_def, m, tooldef)
134 end
135 end