]> git.lizzy.rs Git - xdecor.git/blob - enchanting.lua
Fix mailbox's formspecs trigger
[xdecor.git] / enchanting.lua
1 local function enchconstruct(pos)
2         local meta = minetest.get_meta(pos)
3         meta:set_string("formspec", "size[8,7;]"..xdecor.fancy_gui..
4                 "label[0.85,-0.15;Enchant]"..
5                 "image[0.6,0.2;2,2;xdecor_enchbook.png]"..
6                 "image[1.5,2;1,1;ench_mese_layout.png]"..
7                 "list[current_name;tool;0.5,2;1,1;]"..
8                 "list[current_name;mese;1.5,2;1,1;]"..
9                 "image_button[2.75,0;5,1.5;ench_bg.png;durable;Durable]"..
10                 "image_button[2.75,1.5;5,1.5;ench_bg.png;fast;Fast]"..
11                 "list[current_player;main;0,3.3;8,4;]")
12         meta:set_string("infotext", "Enchantment Table")
13
14         local inv = meta:get_inventory()
15         inv:set_size("tool", 1)
16         inv:set_size("mese", 1)
17 end
18
19 local function is_allowed_tool(toolname)
20         local tdef = minetest.registered_tools[toolname]
21         if tdef and string.find(toolname, "default:") and not
22                         string.find(toolname, "sword") and not
23                         string.find(toolname, "stone") and not
24                         string.find(toolname, "wood") then
25                 return 1
26         else return 0 end
27 end
28
29 local function enchfields(pos, formname, fields, sender)
30         local meta = minetest.get_meta(pos)
31         local inv = meta:get_inventory()
32         local toolstack = inv:get_stack("tool", 1)
33         local mesestack = inv:get_stack("mese", 1)
34         local toolname = toolstack:get_name()
35         local mese = mesestack:get_count()
36         local enchs = {"durable", "fast"}
37
38         for _, e in pairs(enchs) do
39                 if is_allowed_tool(toolname) ~= 0 and mese > 0 and fields[e] then
40                         toolstack:replace("xdecor:enchanted_"..string.sub(toolname, 9).."_"..e)
41                         mesestack:take_item()
42                         inv:set_stack("mese", 1, mesestack)
43                         inv:set_stack("tool", 1, toolstack)
44                 end
45         end
46 end
47
48 local function enchdig(pos, player)
49         local meta = minetest.get_meta(pos)
50         local inv = meta:get_inventory()
51
52         if not inv:is_empty("tool") or not inv:is_empty("mese") then
53                 return false
54         end
55         return true
56 end
57
58 local function enchput(pos, listname, index, stack, player)
59         local toolname = stack:get_name()
60         local count = stack:get_count()
61
62         if listname == "mese" then
63                 if toolname == "default:mese_crystal" then return count
64                         else return 0 end
65         end
66         if listname == "tool" then
67                 return is_allowed_tool(toolname)
68         end
69         return count
70 end
71
72 xdecor.register("enchantment_table", {
73         description = "Enchantment Table",
74         tiles = {
75                 "xdecor_enchantment_top.png", "xdecor_enchantment_bottom.png",
76                 "xdecor_enchantment_side.png", "xdecor_enchantment_side.png",
77                 "xdecor_enchantment_side.png", "xdecor_enchantment_side.png"
78         },
79         groups = {cracky=1},
80         sounds = xdecor.stone,
81         on_construct = enchconstruct,
82         can_dig = enchdig,
83         allow_metadata_inventory_put = enchput,
84         on_receive_fields = enchfields
85 })
86
87 local tools = {
88         {"axe", "choppy"}, {"pick", "cracky"}, {"shovel", "crumbly"}
89 }
90 local materials = {"steel", "bronze", "mese", "diamond"}
91
92 for _, t in pairs(tools) do
93 for _, m in pairs(materials) do
94         local tool, group = t[1], t[2]
95         local toolname = tool.."_"..m
96
97         local registered_tool = {}
98         registered_tool = minetest.registered_tools["default:"..toolname]["tool_capabilities"]["groupcaps"][group]
99
100         local times = registered_tool["times"]
101         local uses = registered_tool["uses"]
102         local dmg = registered_tool["damage_groups"]
103         local maxlvl = registered_tool["maxlevel"]
104
105         local dig_faster, use_longer = {}, {}
106         use_longer = registered_tool["uses"] * 1.1 -- Wearing factor for enchanted tools (higher number = longer use).
107         for i = 1, 3 do
108                 dig_faster[i] = registered_tool["times"][i] - 0.1 -- Digging factor for enchanted tools (lower number = faster dig).
109         end
110
111         --- Pickaxes ---
112
113         minetest.register_tool("xdecor:enchanted_pick_"..m.."_durable", {
114                 description = "Enchanted "..string.sub(string.upper(m), 0, 1)..string.sub(m, 2).." Pickaxe (Durable)",
115                 inventory_image = minetest.registered_tools["default:pick_"..m]["inventory_image"],
116                 groups = {not_in_creative_inventory=1},
117                 tool_capabilities = {
118                         groupcaps = {
119                                 cracky = {times=times, uses=use_longer, maxlevel=maxlvl}
120                         },
121                         damage_groups = dmg
122                 }
123         })
124
125         minetest.register_tool("xdecor:enchanted_pick_"..m.."_fast", {
126                 description = "Enchanted "..string.sub(string.upper(m), 0, 1)..string.sub(m, 2).." Pickaxe (Fast)",
127                 inventory_image = minetest.registered_tools["default:pick_"..m]["inventory_image"],
128                 groups = {not_in_creative_inventory=1},
129                 tool_capabilities = {
130                         groupcaps = {
131                                 cracky = {times=dig_faster, uses=uses, maxlevel=maxlvl}
132                         },
133                         damage_groups = dmg
134                 }
135         })
136
137         --- Axes ---
138
139         minetest.register_tool("xdecor:enchanted_axe_"..m.."_durable", {
140                 description = "Enchanted "..string.sub(string.upper(m), 0, 1)..string.sub(m, 2).." Axe (Durable)",
141                 inventory_image = minetest.registered_tools["default:axe_"..m]["inventory_image"],
142                 groups = {not_in_creative_inventory=1},
143                 tool_capabilities = {
144                         groupcaps = {
145                                 choppy = {times=times, uses=use_longer, maxlevel=maxlvl}
146                         },
147                         damage_groups = dmg
148                 }
149         })
150
151         minetest.register_tool("xdecor:enchanted_axe_"..m.."_fast", {
152                 description = "Enchanted "..string.sub(string.upper(m), 0, 1)..string.sub(m, 2).." Axe (Fast)",
153                 inventory_image = minetest.registered_tools["default:axe_"..m]["inventory_image"],
154                 groups = {not_in_creative_inventory=1},
155                 tool_capabilities = {
156                         groupcaps = {
157                                 choppy = {times=dig_faster, uses=uses, maxlevel=maxlvl}
158                         },
159                         damage_groups = dmg
160                 }
161         })
162
163         --- Shovels ---
164
165         minetest.register_tool("xdecor:enchanted_shovel_"..m.."_durable", {
166                 description = "Enchanted "..string.sub(string.upper(m), 0, 1)..string.sub(m, 2).." Shovel (Durable)",
167                 inventory_image = minetest.registered_tools["default:shovel_"..m]["inventory_image"],
168                 groups = {not_in_creative_inventory=1},
169                 tool_capabilities = {
170                         groupcaps = {
171                                 crumbly = {times=times, uses=use_longer, maxlevel=maxlvl}
172                         },
173                         damage_groups = dmg
174                 }
175         })
176
177         minetest.register_tool("xdecor:enchanted_shovel_"..m.."_fast", {
178                 description = "Enchanted "..string.sub(string.upper(m), 0, 1)..string.sub(m, 2).." Shovel (Fast)",
179                 inventory_image = minetest.registered_tools["default:shovel_"..m]["inventory_image"],
180                 groups = {not_in_creative_inventory=1},
181                 tool_capabilities = {
182                         groupcaps = {
183                                 crumbly = {times=dig_faster, uses=uses, maxlevel=maxlvl}
184                         },
185                         damage_groups = dmg
186                 }
187         })
188 end
189 end