162 lines
4.4 KiB
Lua
162 lines
4.4 KiB
Lua
--[[
|
|
|
|
Hyperloop Mod
|
|
=============
|
|
|
|
Copyright (C) 2017 Joachim Stolberg
|
|
|
|
LGPLv2.1+
|
|
See LICENSE.txt for more information
|
|
|
|
History:
|
|
see init.lua
|
|
|
|
]]--
|
|
|
|
local function get_inventory_item(inv)
|
|
local stack = ItemStack("hyperloop:tube0")
|
|
local taken = inv:remove_item("src", stack)
|
|
return taken:get_count() == 1
|
|
end
|
|
|
|
local function get_inventory(pos)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
local stack = ItemStack("hyperloop:tube0 99")
|
|
return inv:remove_item("src", stack)
|
|
end
|
|
|
|
local function set_inventory(pos, stack)
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
inv:add_item("src", stack)
|
|
return inv
|
|
end
|
|
|
|
local function allow_metadata_inventory(pos, listname, index, stack, player)
|
|
if minetest.is_protected(pos, player:get_player_name()) then
|
|
return 0
|
|
end
|
|
return stack:get_count()
|
|
end
|
|
|
|
local function place_tube(pos, name, facedir, placer)
|
|
if minetest.is_protected(pos, placer:get_player_name()) then
|
|
hyperloop.chat(placer, "Area is protected!")
|
|
return false
|
|
end
|
|
node = minetest.get_node(pos)
|
|
if node.name ~= "air" and node.name ~= "default:water_source" and node.name ~= "default:water_flowing" then
|
|
return false
|
|
end
|
|
if hyperloop.scan_neighbours(pos) ~= 1 then
|
|
return false
|
|
end
|
|
minetest.add_node(pos, {name=name, param2=facedir})
|
|
minetest.registered_nodes[name].after_place_node(pos, placer, nil, nil)
|
|
return true
|
|
end
|
|
|
|
local function move_robot(pos, inv, facedir, placer)
|
|
if minetest.get_meta(pos):get_int("stopped") ~= 1 then
|
|
if get_inventory_item(inv) then
|
|
-- remve robot and replace through tube
|
|
local stack = get_inventory(pos)
|
|
minetest.remove_node(pos)
|
|
place_tube(pos, "hyperloop:tube1", facedir, placer)
|
|
-- place robot on the new position
|
|
pos = hyperloop.new_pos(pos, facedir, "1F", 0)
|
|
if place_tube(pos, "hyperloop:robot", facedir, placer) then
|
|
inv = set_inventory(pos, stack)
|
|
minetest.after(1, move_robot, pos, inv, facedir, placer)
|
|
else
|
|
pos = hyperloop.new_pos(pos, facedir, "1B", 0)
|
|
minetest.remove_node(pos)
|
|
place_tube(pos, "hyperloop:robot", facedir, placer)
|
|
stack:add_item("src", ItemStack("hyperloop:tube0"))
|
|
set_inventory(pos, stack)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
local station_formspec =
|
|
"size[8,8]"..
|
|
"label[3,0;Hyperloop Tube Robot]" ..
|
|
"label[1,1.3;Hyperloop Tubes]" ..
|
|
"list[context;src;3,1;1,1;]"..
|
|
"button_exit[4,1;1,1;button;Start]"..
|
|
"list[current_player;main;0,4;8,4;]"..
|
|
"listring[context;src]"..
|
|
"listring[current_player;main]"
|
|
|
|
minetest.register_node("hyperloop:robot", {
|
|
description = "Hyperloop Tube Robot",
|
|
tiles = {
|
|
-- up, down, right, left, back, front
|
|
"hyperloop_robot.png",
|
|
"hyperloop_robot.png",
|
|
"hyperloop_robot2.png",
|
|
"hyperloop_robot2.png",
|
|
"hyperloop_robot2.png",
|
|
"hyperloop_robot2.png",
|
|
},
|
|
|
|
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
|
local res, nodes = hyperloop.scan_neighbours(pos)
|
|
if res == 1 then -- one neighbor available?
|
|
local dir = vector.subtract(pos, nodes[1].pos)
|
|
local facedir = minetest.dir_to_facedir(dir)
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_int("facedir", facedir)
|
|
meta:set_string("formspec", station_formspec)
|
|
local inv = meta:get_inventory()
|
|
inv:set_size('src', 1)
|
|
else
|
|
hyperloop.chat(player, "You can't start with a Robot block!")
|
|
local node = minetest.get_node(pos)
|
|
hyperloop.remove_node(pos, node)
|
|
return itemstack
|
|
end
|
|
end,
|
|
|
|
on_receive_fields = function(pos, formname, fields, player)
|
|
if fields.button == nil then
|
|
return
|
|
end
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
local facedir = meta:get_int("facedir")
|
|
meta:set_int("stopped", 0)
|
|
minetest.after(1, move_robot, pos, inv, facedir, player)
|
|
end,
|
|
|
|
on_punch = function(pos, node, puncher, pointed_thing)
|
|
if minetest.is_protected(pos, puncher:get_player_name()) then
|
|
return
|
|
end
|
|
local meta = minetest.get_meta(pos)
|
|
meta:set_int("stopped", 1)
|
|
end,
|
|
|
|
on_dig = function(pos, node, puncher, pointed_thing)
|
|
if minetest.is_protected(pos, puncher:get_player_name()) then
|
|
return
|
|
end
|
|
local meta = minetest.get_meta(pos)
|
|
local inv = meta:get_inventory()
|
|
meta:set_int("stopped", 1)
|
|
if inv:is_empty("src") then
|
|
minetest.node_dig(pos, node, puncher, pointed_thing)
|
|
end
|
|
end,
|
|
|
|
allow_metadata_inventory_put = allow_metadata_inventory,
|
|
allow_metadata_inventory_take = allow_metadata_inventory,
|
|
|
|
on_rotate = screwdriver.disallow,
|
|
paramtype2 = "facedir",
|
|
groups = {cracky=1},
|
|
is_ground_content = false,
|
|
})
|