334 lines
11 KiB
Lua
334 lines
11 KiB
Lua
stations.puck_fuel_table = {}
|
|
stations.puckable_groups = {'flora', 'leaves', 'flower', 'sapling', 'food'}
|
|
stations.puck_fuel_table['default:coal_lump'] = true
|
|
stations.puck_fuel_table['charcoal:charcoal'] = true
|
|
|
|
function stations.puckable(input)
|
|
for _, v in pairs(stations.puckable_groups) do
|
|
if minetest.get_item_group(input, v) > 0 then
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function stations.puck_fuel(input)
|
|
if stations.puck_fuel_table[input] then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
function stations.puck_formspec(cycles)
|
|
return 'size[8,8.5]'..
|
|
'list[current_name;src;0.5,0.5;3,3;]'..
|
|
'list[current_name;dst;5.5,1;2,2;]'..
|
|
'list[current_name;fuel;4,2.5;1,1;]'..
|
|
'image[4,1.5;1,1;default_furnace_fire_bg.png^[lowpart:'..
|
|
(cycles*10)..':default_furnace_fire_fg.png]'..
|
|
'list[current_player;main;0,4.5;8,4;]'..
|
|
'listring[context;dst]'..
|
|
'listring[current_player;main]'..
|
|
'listring[context;src]'
|
|
end
|
|
|
|
function stations.puck_can_create(pos)
|
|
local timer = minetest.get_node_timer(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local cycles_count = tonumber(meta:get_string('cycles_count'))
|
|
local inv = meta:get_inventory()
|
|
local instack = inv:get_stack('src', 1)
|
|
local outstack = inv:get_stack('dst', 1)
|
|
local fuel = inv:get_stack('fuel', 1)
|
|
local outstack_count = outstack:get_count()
|
|
if stations.puck_count_input(pos) >= 6 and inv:room_for_item('dst', 'stations:fuel_pucks') then
|
|
stations.puck_create_fuel(pos)
|
|
inv:add_item('dst', 'stations:fuel_pucks')
|
|
local cycles_count = (cycles_count - 1)
|
|
meta:set_string('cycles_count', cycles_count)
|
|
if cycles_count > 0 and stations.puck_count_input(pos) >= 6 then
|
|
timer:start(10)
|
|
meta:set_string('formspec', stations.puck_formspec(cycles_count))
|
|
else
|
|
local fuel_stack = fuel:get_count()
|
|
if fuel_stack >= 1 then
|
|
fuel:take_item(1)
|
|
inv:set_stack('fuel', 1, fuel)
|
|
timer:start(10)
|
|
meta:set_string('cycles_count', 10)
|
|
meta:set_string('formspec', stations.puck_formspec(cycles_count))
|
|
meta:set_string('infotext', 'Making fuel pucks.')
|
|
elseif instack:get_count() < 6 then
|
|
meta:set_string('cycles_count', 0)
|
|
meta:set_string('formspec', stations.puck_formspec(cycles_count))
|
|
meta:set_string('infotext', 'Out of material/fuel.')
|
|
else
|
|
meta:set_string('formspec', stations.puck_formspec(0))
|
|
meta:set_string('cycles_count', 0)
|
|
meta:set_string('infotext', 'Fuel puck creator')
|
|
end
|
|
end
|
|
else
|
|
meta:set_string('formspec', stations.puck_formspec(0))
|
|
meta:set_string('cycles_count', 0)
|
|
end
|
|
end
|
|
|
|
function stations.puck_count_input(pos)
|
|
local q = 0
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
local stacks = inv:get_list('src')
|
|
for k in pairs(stacks) do
|
|
q = q + inv:get_stack('src', k):get_count()
|
|
end
|
|
return q
|
|
end
|
|
|
|
function stations.puck_create_fuel(pos)
|
|
local q = 6
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
local stacks = inv:get_list('src')
|
|
for k in pairs(stacks) do
|
|
local stack = inv:get_stack('src', k)
|
|
if not stack:is_empty() then
|
|
local count = stack:get_count()
|
|
if count <= q then
|
|
inv:set_stack('src', k, '')
|
|
q = q - count
|
|
else
|
|
inv:set_stack('src', k, stack:get_name() .. ' ' .. (count - q))
|
|
q = 0
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
minetest.register_node('stations:puck_creator', {
|
|
description = 'Fuel puck creator',
|
|
drawtype = 'mesh',
|
|
mesh = 'stations_puck_stove.obj',
|
|
tiles = {'stations_pucks.png'},
|
|
use_texture_alpha = 'opaque',
|
|
sounds = default.node_sound_metal_defaults(),
|
|
paramtype2 = 'facedir',
|
|
paramtype = 'light',
|
|
selection_box = {
|
|
type = 'fixed',
|
|
fixed = {
|
|
{-.5, -.5, -.5, .7, .5, .5},
|
|
}
|
|
},
|
|
collision_box = {
|
|
type = 'fixed',
|
|
fixed = {
|
|
{-.5, -.5, -.5, .5, .5, .5},
|
|
{.7, -.5, -.4, 1.1, .0, .2},
|
|
}
|
|
},
|
|
groups = {cracky =3},
|
|
after_place_node = function(pos, placer, itemstack)
|
|
if not epic.space_to_side(pos) then
|
|
minetest.remove_node(pos)
|
|
return itemstack
|
|
end
|
|
end,
|
|
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
|
epic.remove_side_node(pos, oldnode)
|
|
end,
|
|
on_construct = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
inv:set_size('main', 8*4)
|
|
inv:set_size('src', 3*3)
|
|
inv:set_size('dst', 2*2)
|
|
inv:set_size('fuel', 1)
|
|
meta:set_string('cycles_count', 0)
|
|
meta:set_string('infotext', 'Fuel puck creator')
|
|
meta:set_string('formspec', 'size[8,8.5]'..
|
|
'list[current_name;src;0.5,0.5;3,3;]'..
|
|
'list[current_name;dst;5.5,1;2,2;]'..
|
|
'list[current_name;fuel;4,2.5;1,1;]'..
|
|
'image[4,1.5;1,1;default_furnace_fire_bg.png]'..
|
|
'list[current_player;main;0,4.5;8,4;]'..
|
|
'listring[context;dst]'..
|
|
'listring[current_player;main]'..
|
|
'listring[context;src]')
|
|
end,
|
|
can_dig = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
if inv:is_empty('src') and inv:is_empty('dst') and inv:is_empty('fuel') then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end,
|
|
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
if listname == 'src' and stations.puckable(stack:get_name()) then
|
|
return stack:get_count()
|
|
elseif listname == 'fuel' and stations.puck_fuel(stack:get_name()) then
|
|
return stack:get_count()
|
|
else
|
|
return 0
|
|
end
|
|
end,
|
|
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
|
local inv = minetest.get_meta(pos):get_inventory()
|
|
if from_list == to_list then
|
|
return inv:get_stack(from_list, from_index):get_count()
|
|
else
|
|
return 0
|
|
end
|
|
end,
|
|
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
|
return stack:get_count()
|
|
end,
|
|
on_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
local timer = minetest.get_node_timer(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
local fuel = inv:get_stack('fuel', 1)
|
|
local fuel_stack = fuel:get_count()
|
|
local cycles_count = tonumber(meta:get_string('cycles_count'))
|
|
if stations.puck_count_input(pos) >= 6 and fuel_stack >= 1 then
|
|
if cycles_count == 0 then
|
|
fuel:take_item(1)
|
|
inv:set_stack('fuel', 1, fuel)
|
|
timer:start(10)
|
|
meta:set_string('cycles_count', 10)
|
|
meta:set_string('formspec', stations.puck_formspec(10))
|
|
end
|
|
meta:set_string('infotext', 'Making fuel pucks.')
|
|
end
|
|
end,
|
|
on_timer = stations.puck_can_create,
|
|
on_rotate = function(pos, node)
|
|
return false
|
|
end,
|
|
})
|
|
|
|
minetest.register_node('stations:puck_creator_locked', {
|
|
description = 'Fuel puck creator (locked)',
|
|
drawtype = 'mesh',
|
|
mesh = 'stations_puck_stove.obj',
|
|
tiles = {'stations_pucks.png'},
|
|
use_texture_alpha = 'opaque',
|
|
sounds = default.node_sound_metal_defaults(),
|
|
paramtype2 = 'facedir',
|
|
paramtype = 'light',
|
|
selection_box = {
|
|
type = 'fixed',
|
|
fixed = {
|
|
{-.5, -.5, -.5, .7, .5, .5},
|
|
}
|
|
},
|
|
collision_box = {
|
|
type = 'fixed',
|
|
fixed = {
|
|
{-.5, -.5, -.5, .5, .5, .5},
|
|
{.7, -.5, -.4, 1.1, .0, .2},
|
|
}
|
|
},
|
|
groups = {cracky =3},
|
|
on_construct = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
inv:set_size('main', 8*4)
|
|
inv:set_size('src', 3*3)
|
|
inv:set_size('dst', 2*2)
|
|
inv:set_size('fuel', 1)
|
|
meta:set_string('cycles_count', 0)
|
|
meta:set_string('infotext', 'Fuel Puck Creator (locked)')
|
|
meta:set_string('formspec', 'size[8,8.5]'..
|
|
'list[current_name;src;0.5,0.5;3,3;]'..
|
|
'list[current_name;dst;5.5,1;2,2;]'..
|
|
'list[current_name;fuel;4,2.5;1,1;]'..
|
|
'image[4,1.5;1,1;default_furnace_fire_bg.png]'..
|
|
'list[current_player;main;0,4.5;8,4;]'..
|
|
'listring[context;dst]'..
|
|
'listring[current_player;main]'..
|
|
'listring[context;src]')
|
|
end,
|
|
after_place_node = function(pos, placer, itemstack)
|
|
if not epic.space_to_side(pos) then
|
|
minetest.remove_node(pos)
|
|
return itemstack
|
|
else
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_string('owner',placer:get_player_name())
|
|
end
|
|
end,
|
|
|
|
after_dig_node = function(pos, oldnode, oldmetadata, digger)
|
|
epic.remove_side_node(pos, oldnode)
|
|
end,
|
|
can_dig = function(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
if inv:is_empty('src') and inv:is_empty('dst') and inv:is_empty('fuel') then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end,
|
|
allow_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
local meta = minetest.get_meta(pos)
|
|
local owner = meta:get_string('owner')
|
|
local player_name = player:get_player_name()
|
|
if player_name == owner then
|
|
if listname == 'src' and stations.puckable(stack:get_name()) then
|
|
return stack:get_count()
|
|
elseif listname == 'fuel' and stations.puck_fuel(stack:get_name()) then
|
|
return stack:get_count()
|
|
else
|
|
return 0
|
|
end
|
|
else
|
|
return 0
|
|
end
|
|
end,
|
|
allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
|
|
local inv = minetest.get_meta(pos):get_inventory()
|
|
if from_list == to_list then
|
|
return inv:get_stack(from_list, from_index):get_count()
|
|
else
|
|
return 0
|
|
end
|
|
end,
|
|
allow_metadata_inventory_take = function(pos, listname, index, stack, player)
|
|
local meta = minetest.get_meta(pos)
|
|
local owner = meta:get_string('owner')
|
|
local player_name = player:get_player_name()
|
|
if player_name == owner then
|
|
return stack:get_count()
|
|
else
|
|
return 0
|
|
end
|
|
end,
|
|
on_metadata_inventory_put = function(pos, listname, index, stack, player)
|
|
local timer = minetest.get_node_timer(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
local fuel = inv:get_stack('fuel', 1)
|
|
local fuel_stack = fuel:get_count()
|
|
local cycles_count = tonumber(meta:get_string('cycles_count'))
|
|
if stations.puck_count_input(pos) >= 6 and fuel_stack >= 1 then
|
|
if cycles_count == 0 then
|
|
fuel:take_item(1)
|
|
inv:set_stack('fuel', 1, fuel)
|
|
timer:start(10)
|
|
meta:set_string('cycles_count', 10)
|
|
meta:set_string('formspec', stations.puck_formspec(10))
|
|
end
|
|
meta:set_string('infotext', 'Making fuel pucks.')
|
|
end
|
|
end,
|
|
on_timer = stations.puck_can_create,
|
|
on_rotate = function(pos, node)
|
|
return false
|
|
end,
|
|
})
|