128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
...
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
...
302
303
304
305
306
307
308
309
310
311
312
313
314
315
...
384
385
386
387
388
389
390
391
392
393
394
395
396
397
|
local find_recipe = function(inv)
local mix = {}
local count = 0
for i=1,inv:get_size('input') do
local m = inv:get_stack('input',i)
if m:is_empty() then goto skip end
local l = sorcery.data.metallookup[m:get_name()]
if not l then return false end
mix[l.id] = (mix[l.id] or 0) + l.value
count = count + l.value
::skip::end
-- everything is metal, we've finished summing it up.
-- let's see if the assembled items match the ratio
-- specified in any of the smelting recipes.
local matches = 0
for _,rec in pairs(sorcery.data.alloys) do
local fac = nil
local meltpoint = 1
if rec.metals == nil then goto skip_recipe end
for metal, ratio in pairs(rec.metals) do
if mix[metal] and mix[metal] % ratio == 0 then
if fac then
if mix[metal] / ratio ~= fac then goto skip_recipe end
................................................................................
for i=1,inv:get_size('input') do
local s = inv:get_stack('input',i)
if s:is_empty() then goto skip end
s:take_item(1) inv:set_stack('input',i,s)
::skip::end
local outstack
if count % fragments_per_ingot == 0 then
outstack = ItemStack {
name = sorcery.data.metals[recipe.output].ingot or 'sorcery:' .. recipe.output .. '_ingot';
count = count / fragments_per_ingot;
}
else
outstack = ItemStack {
name = 'sorcery:fragment_' .. recipe.output;
count = count;
}
end
local leftover = inv:add_item('output',outstack)
if not leftover:is_empty() then
minetest.add_item(pos, leftover)
end
end
................................................................................
drawtype = "mesh";
after_dig_node = sorcery.lib.node.purge_container;
mesh = 'sorcery-kiln-' .. state .. '.obj';
drop = id;
groups = {
cracky = (state == 'open' and 2) or nil;
sorcery_metallurgy = 1;
};
sunlight_propagates = true;
paramtype1 = 'light';
paramtype2 = 'facedir';
selection_box = box[state];
collision_box = box[state];
tiles = tex[state];
................................................................................
_proto = kind;
description = desc;
drop = id;
after_dig_node = sorcery.lib.node.purge_container;
groups = {
cracky = (active and 2) or nil;
sorcery_metallurgy = 1;
};
paramtype2 = 'facedir';
light_source = (active and 9) or 0;
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size('input',kind.size)
|
>
>
>
>
>
|
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
|
|
|
|
|
|
|
|
|
|
>
>
>
|
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
...
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
...
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
...
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
|
local find_recipe = function(inv)
local mix = {}
local count = 0
for i=1,inv:get_size('input') do
local m = inv:get_stack('input',i)
if m:is_empty() then goto skip end
local l = sorcery.data.metallookup[m:get_name()]
if not l then
local p = sorcery.lib.tbl.walk(m:get_definition()._sorcery,{'material'})
if p.metal then l = p end
end
if not l then return false end
mix[l.id] = (mix[l.id] or 0) + l.value
count = count + l.value
::skip::end
count = math.floor(count)
-- everything is metal, we've finished summing it up.
-- let's see if the assembled items match the ratio
-- specified in any of the smelting recipes.
local matches = 0
for _,rec in pairs(sorcery.register.alloys.db) do
local fac = nil
local meltpoint = 1
if rec.metals == nil then goto skip_recipe end
for metal, ratio in pairs(rec.metals) do
if mix[metal] and mix[metal] % ratio == 0 then
if fac then
if mix[metal] / ratio ~= fac then goto skip_recipe end
................................................................................
for i=1,inv:get_size('input') do
local s = inv:get_stack('input',i)
if s:is_empty() then goto skip end
s:take_item(1) inv:set_stack('input',i,s)
::skip::end
local outstack
if type(output) == 'table' then
for v,item in pairs(output) do
if count % v == 0 then
outstack = ItemStack {
name = item;
count = count / v;
}
end
end
else
if count % (fragments_per_ingot * 9) == 0 then
outstack = ItemStack {
name = sorcery.data.metals[recipe.output].parts.block;
count = count / (fragments_per_ingot*9);
}
elseif count % fragments_per_ingot == 0 then
outstack = ItemStack {
name = sorcery.data.metals[recipe.output].parts.ingot;
count = count / fragments_per_ingot;
}
else
outstack = ItemStack {
name = 'sorcery:fragment_' .. recipe.output;
count = count;
}
end
end
local leftover = inv:add_item('output',outstack)
if not leftover:is_empty() then
minetest.add_item(pos, leftover)
end
end
................................................................................
drawtype = "mesh";
after_dig_node = sorcery.lib.node.purge_container;
mesh = 'sorcery-kiln-' .. state .. '.obj';
drop = id;
groups = {
cracky = (state == 'open' and 2) or nil;
sorcery_metallurgy = 1;
not_in_creative_inventory = (state == open) and nil or 1;
};
sunlight_propagates = true;
paramtype1 = 'light';
paramtype2 = 'facedir';
selection_box = box[state];
collision_box = box[state];
tiles = tex[state];
................................................................................
_proto = kind;
description = desc;
drop = id;
after_dig_node = sorcery.lib.node.purge_container;
groups = {
cracky = (active and 2) or nil;
sorcery_metallurgy = 1;
not_in_creative_inventory = active and 1 or nil;
};
paramtype2 = 'facedir';
light_source = (active and 9) or 0;
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
inv:set_size('input',kind.size)
|