master
Joachim Stolberg 2018-12-20 18:51:06 +01:00
parent a51bc04b6f
commit d6e525223c
3 changed files with 0 additions and 161 deletions

161
robot.lua
View File

@ -1,161 +0,0 @@
--[[
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,
})

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB