123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334 |
- 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,
- })
|