elevator and promo blocks added
110
deco.lua
Normal file
@ -0,0 +1,110 @@
|
||||
--[[
|
||||
|
||||
Hyperloop Mod
|
||||
=============
|
||||
|
||||
Copyright (C) 2017 Joachim Stolberg
|
||||
|
||||
LGPLv2.1+
|
||||
See LICENSE.txt for more information
|
||||
|
||||
History:
|
||||
see init.lua
|
||||
|
||||
]]--
|
||||
|
||||
local tilesL = {"hyperloop_alpsL.png", "hyperloop_seaL.png", "hyperloop_agyptL.png"}
|
||||
local tilesR = {"hyperloop_alpsR.png", "hyperloop_seaR.png", "hyperloop_agyptR.png"}
|
||||
|
||||
for idx = 1,3 do
|
||||
|
||||
minetest.register_node("hyperloop:poster"..idx.."L", {
|
||||
description = "Hyperloop Promo Poster "..idx,
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"hyperloop_skin2.png",
|
||||
"hyperloop_skin2.png",
|
||||
"hyperloop_skin2.png",
|
||||
"hyperloop_skin2.png",
|
||||
"hyperloop_skin2.png",
|
||||
tilesL[idx],
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -8/16, -8/16, -6/16, 8/16, 8/16, 8/16},
|
||||
},
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -8/16, -8/16, -6/16, 24/16, 8/16, 8/16},
|
||||
},
|
||||
|
||||
after_place_node = function(pos, placer)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local facedir
|
||||
facedir, pos = hyperloop.right_hand_side(pos, placer)
|
||||
meta:set_string("pos", minetest.pos_to_string(pos))
|
||||
if minetest.get_node_or_nil(pos).name == "air" then
|
||||
minetest.add_node(pos, {name="hyperloop:poster"..idx.."R", param2=facedir})
|
||||
end
|
||||
end,
|
||||
|
||||
on_destruct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
pos = minetest.string_to_pos(meta:get_string("pos"))
|
||||
if pos ~= nil and minetest.get_node_or_nil(pos).name == "hyperloop:poster"..idx.."R" then
|
||||
minetest.remove_node(pos)
|
||||
end
|
||||
end,
|
||||
|
||||
|
||||
paramtype2 = "facedir",
|
||||
light_source = 4,
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 2, stone = 2},
|
||||
})
|
||||
|
||||
minetest.register_node("hyperloop:poster"..idx.."R", {
|
||||
description = "Hyperloop Promo Poster "..idx,
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"hyperloop_skin2.png",
|
||||
"hyperloop_skin2.png",
|
||||
"hyperloop_skin2.png",
|
||||
"hyperloop_skin2.png",
|
||||
"hyperloop_skin2.png",
|
||||
tilesR[idx],
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -8/16, -8/16, -6/16, 8/16, 8/16, 8/16},
|
||||
},
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
light_source = 4,
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 2, stone = 2, not_in_creative_inventory=1},
|
||||
})
|
||||
end
|
||||
|
||||
|
||||
minetest.register_node("hyperloop:sign", {
|
||||
description = "Hyperloop Station Sign",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"hyperloop_sign_top.png",
|
||||
"hyperloop_sign.png",
|
||||
"hyperloop_sign.png",
|
||||
"hyperloop_sign.png",
|
||||
"hyperloop_sign.png",
|
||||
"hyperloop_sign.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
light_source = 4,
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 2, stone = 2},
|
||||
})
|
510
elevator.lua
Normal file
@ -0,0 +1,510 @@
|
||||
--[[
|
||||
|
||||
Hyperloop Mod
|
||||
=============
|
||||
|
||||
Copyright (C) 2017 Joachim Stolberg
|
||||
|
||||
LGPLv2.1+
|
||||
See LICENSE.txt for more information
|
||||
|
||||
]]--
|
||||
|
||||
|
||||
----------------------------------------------------------------------------------------------------
|
||||
----------------------------------------------------------------------------------------------------
|
||||
|
||||
--[[
|
||||
spos = <pos.x>:<pos.z>
|
||||
level = pos.y
|
||||
hyperloop.data.tAllElevators[spos].floors[level] = {
|
||||
pos = {x,y,z}, -- lower elevator block
|
||||
facedir = n, -- for the door placement
|
||||
name = "...", -- floor name
|
||||
up = true, -- connetion flag
|
||||
down = true, -- connetion flag
|
||||
}
|
||||
]]--
|
||||
|
||||
-- return index of the table position matching pos or nil
|
||||
local function pos_index(tbl, pos)
|
||||
for idx,v in ipairs(tbl) do
|
||||
if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then
|
||||
return idx
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
-- remove invalid entries
|
||||
local function remove_artifacts(floors)
|
||||
local tbl = {}
|
||||
for idx,floor in ipairs(floors) do
|
||||
if floor.pos ~= nil and floor.name ~= nil and floor.up ~= nil and floor.down ~= nil then
|
||||
table.insert(tbl, floor)
|
||||
end
|
||||
end
|
||||
return tbl
|
||||
end
|
||||
|
||||
|
||||
-- determine the elevator list
|
||||
local function get_elevator_list(pos)
|
||||
local spos = tostring(pos.x)..":"..tostring(pos.z)
|
||||
if hyperloop.data.tAllElevators[spos] == nil then
|
||||
-- create the elevator
|
||||
hyperloop.data.tAllElevators[spos] = {}
|
||||
end
|
||||
if hyperloop.data.tAllElevators[spos].floors == nil then
|
||||
-- create the floor list
|
||||
hyperloop.data.tAllElevators[spos].floors = {}
|
||||
end
|
||||
-- remove invalid entries
|
||||
hyperloop.data.tAllElevators[spos].floors = remove_artifacts(hyperloop.data.tAllElevators[spos].floors)
|
||||
return hyperloop.data.tAllElevators[spos].floors
|
||||
end
|
||||
|
||||
local function remove_elevator_list(pos)
|
||||
local spos = tostring(pos.x)..":"..tostring(pos.z)
|
||||
hyperloop.data.tAllElevators[spos] = nil
|
||||
--print(spos, dump(hyperloop.data.tAllElevators))
|
||||
end
|
||||
|
||||
-- determine the elevator floor item or create one
|
||||
local function get_floor_item(pos)
|
||||
local floors = get_elevator_list(pos)
|
||||
local idx = pos_index(floors, pos)
|
||||
if idx == nil then
|
||||
-- create the floor item
|
||||
table.insert(floors, {pos=pos})
|
||||
idx = #floors
|
||||
end
|
||||
return floors[idx]
|
||||
end
|
||||
|
||||
-- Add the given arguments to the elevator table
|
||||
local function add_to_elevator_list(pos, tArgs)
|
||||
--print("add_to_elevator_list", dump(pos))
|
||||
local floor = get_floor_item(pos)
|
||||
for k,v in pairs(tArgs) do
|
||||
floor[k] = v
|
||||
end
|
||||
end
|
||||
|
||||
local function dbg_out(label, pos)
|
||||
print(label..":")
|
||||
local floors = get_elevator_list(pos)
|
||||
for _,floor in ipairs(floors) do
|
||||
print(" pos="..floor.pos.x..","..floor.pos.y..","..floor.pos.z..
|
||||
" facedir="..tostring(floor.facedir).." name="..tostring(floor.name)..
|
||||
" up="..dump(floor.up).." down="..dump(floor.down))
|
||||
end
|
||||
end
|
||||
|
||||
-- return a sorted list of connected floors
|
||||
local function floor_list(pos)
|
||||
local floors = table.copy(get_elevator_list(pos))
|
||||
-- sort the list
|
||||
table.sort(floors, function(x,y)
|
||||
return x.pos.y > y.pos.y
|
||||
end)
|
||||
-- check if elevator is complete
|
||||
for idx,floor in ipairs(floors) do
|
||||
--print(idx, #floors, floor.name, floor.up, floor.down)
|
||||
if idx == 1 then
|
||||
if floor.down == false then
|
||||
return {}
|
||||
end
|
||||
elseif idx == #floors then
|
||||
if floor.up == false then
|
||||
return {}
|
||||
end
|
||||
elseif floor.up == false or floor.down == false then
|
||||
return {}
|
||||
end
|
||||
end
|
||||
return floors
|
||||
end
|
||||
|
||||
|
||||
-- store floor_pos (lower car block) as meta data
|
||||
local function set_floor_pos(pos, floor_pos)
|
||||
local s = minetest.pos_to_string(floor_pos)
|
||||
minetest.get_meta(pos):set_string("floor_pos", s)
|
||||
return floor_pos
|
||||
end
|
||||
|
||||
-- read floor_pos (upper car block) from meta data
|
||||
local function get_floor_pos(pos)
|
||||
local s = minetest.get_meta(pos):get_string("floor_pos")
|
||||
if s == nil then
|
||||
return nil
|
||||
end
|
||||
return minetest.string_to_pos(s)
|
||||
end
|
||||
|
||||
|
||||
-- Form spec for the floor list
|
||||
local function formspec(pos)
|
||||
local tRes = {"size[5,10]label[0.5,0; Wähle dein Ziel :: Select your destination]"}
|
||||
tRes[2] = "label[1,0.6;Destination]label[2.5,0.6;Floor]"
|
||||
local list = floor_list(pos)
|
||||
for idx,floor in ipairs(list) do
|
||||
if idx >= 12 then
|
||||
break
|
||||
end
|
||||
local ypos = 0.5 + idx*0.8
|
||||
local ypos2 = ypos - 0.2
|
||||
tRes[#tRes+1] = "button_exit[1,"..ypos2..";1,1;button;"..#list-idx.."]"
|
||||
if floor.pos.y ~= pos.y then
|
||||
tRes[#tRes+1] = "label[2.5,"..ypos..";"..floor.name.."]"
|
||||
else
|
||||
tRes[#tRes+1] = "label[2.5,"..ypos..";(current position)]"
|
||||
end
|
||||
end
|
||||
return table.concat(tRes)
|
||||
end
|
||||
|
||||
local function update_formspec(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("formspec", formspec(pos))
|
||||
end
|
||||
|
||||
local function remove_from_elevator_list(pos)
|
||||
local floors = get_elevator_list(pos)
|
||||
local idx = pos_index(floors, pos)
|
||||
if idx ~= nil then
|
||||
table.remove(floors, idx)
|
||||
end
|
||||
-- last car in the list?
|
||||
if not next(floors) then
|
||||
remove_elevator_list(pos)
|
||||
else
|
||||
-- update all other elevator cars
|
||||
for _,floor in ipairs(get_elevator_list(pos)) do
|
||||
print(_, floor.name)
|
||||
if floor.name ~= "<unknown>" then
|
||||
update_formspec(floor.pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function hyperloop.update_elevator(pos)
|
||||
local up = false
|
||||
local down = false
|
||||
--print("update y=", pos.y)
|
||||
|
||||
pos.y = pos.y - 1
|
||||
if string.find(minetest.get_node_or_nil(pos).name, "hyperloop:shaft") then
|
||||
down = true
|
||||
end
|
||||
|
||||
pos.y = pos.y + 3
|
||||
if string.find(minetest.get_node_or_nil(pos).name, "hyperloop:shaft") then
|
||||
up = true
|
||||
end
|
||||
|
||||
pos.y = pos.y - 2
|
||||
add_to_elevator_list(pos, {up=up, down=down})
|
||||
--dbg_out("update", pos)
|
||||
|
||||
-- update all elevator cars which are already named
|
||||
for _,floor in ipairs(get_elevator_list(pos)) do
|
||||
print(_, floor.name)
|
||||
if floor.name ~= "<unknown>" then
|
||||
update_formspec(floor.pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- place the elevator door on the given position: y, y+1
|
||||
local function place_door(pos, facedir, floor_pos)
|
||||
if minetest.get_node_or_nil(pos).name == "air" then
|
||||
minetest.add_node(pos, {name="hyperloop:elevator_door", param2=facedir})
|
||||
set_floor_pos(pos, floor_pos)
|
||||
end
|
||||
pos.y = pos.y + 1
|
||||
if minetest.get_node_or_nil(pos).name == "air" then
|
||||
minetest.add_node(pos, {name="hyperloop:elevator_door_top", param2=facedir})
|
||||
set_floor_pos(pos, floor_pos)
|
||||
end
|
||||
pos.y = pos.y - 1 -- restore old value
|
||||
end
|
||||
|
||||
-- remove the elevator door on the given position: y, y+1
|
||||
local function remove_door(pos)
|
||||
if minetest.get_node_or_nil(pos).name == "hyperloop:elevator_door" then
|
||||
minetest.remove_node(pos)
|
||||
end
|
||||
pos.y = pos.y + 1
|
||||
if minetest.get_node_or_nil(pos).name == "hyperloop:elevator_door_top" then
|
||||
minetest.remove_node(pos)
|
||||
end
|
||||
pos.y = pos.y - 1 -- restore old value
|
||||
end
|
||||
|
||||
local function door_command(floor_pos, facedir, cmnd)
|
||||
local placedir = hyperloop.facedir_to_placedir(facedir)
|
||||
print("placedir="..placedir.." facedir="..facedir)
|
||||
local pos = hyperloop.new_pos(floor_pos, placedir, "1B")
|
||||
if cmnd == "close" then
|
||||
place_door(pos, facedir, floor_pos)
|
||||
elseif cmnd == "open" then
|
||||
remove_door(pos)
|
||||
end
|
||||
end
|
||||
|
||||
-- on arrival station
|
||||
local function on_close_door(pos, facedir)
|
||||
-- close the door and play sound if no player is around
|
||||
if hyperloop.is_player_around(pos) then
|
||||
-- try again later
|
||||
minetest.after(3.0, on_close_door, pos, facedir)
|
||||
else
|
||||
door_command(pos, facedir, "close")
|
||||
end
|
||||
end
|
||||
|
||||
-- on arrival station
|
||||
local function on_open_door(pos, facedir)
|
||||
minetest.sound_play("door", {
|
||||
pos = pos,
|
||||
gain = 0.5,
|
||||
max_hear_distance = 10,
|
||||
})
|
||||
door_command(pos, facedir, "open")
|
||||
minetest.after(5.0, on_close_door, pos, facedir)
|
||||
end
|
||||
|
||||
local function on_arrival(pos, player)
|
||||
local floor = get_floor_item(pos)
|
||||
--door_command(dest.pos, facedir, "close")
|
||||
if player ~= nil then
|
||||
player:setpos(floor.pos)
|
||||
end
|
||||
minetest.after(1.0, on_open_door, floor.pos, floor.facedir)
|
||||
end
|
||||
|
||||
minetest.register_node("hyperloop:elevator_bottom", {
|
||||
description = "Hyperloop Elevator",
|
||||
tiles = {
|
||||
"hyperloop_elevator.png",
|
||||
"hyperloop_elevator.png",
|
||||
"hyperloop_elevator.png",
|
||||
"hyperloop_elevator.png",
|
||||
"hyperloop_elevator.png",
|
||||
"hyperloop_elevator.png",
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -8/16, -8/16, -8/16, -7/16, 8/16, 8/16},
|
||||
{ 7/16, -8/16, -8/16, 8/16, 8/16, 8/16},
|
||||
{ -7/16, -8/16, 7/16, 7/16, 8/16, 8/16},
|
||||
},
|
||||
},
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -8/16, -8/16, -7/16, 8/16, 24/16, 8/16 },
|
||||
},
|
||||
inventory_image = "hyperloop_elevator_inventory.png",
|
||||
drawtype = "nodebox",
|
||||
paramtype = 'light',
|
||||
light_source = 4,
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = {snappy = 3},
|
||||
|
||||
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
||||
-- store floor_pos (lower car block) as meta data
|
||||
set_floor_pos(pos, pos)
|
||||
local facedir = hyperloop.get_facedir(placer)
|
||||
add_to_elevator_list(pos, {name="<unknown>", up=false, down=false, facedir=facedir, pos=pos})
|
||||
hyperloop.update_elevator(pos)
|
||||
-- formspec
|
||||
local meta = minetest.get_meta(pos)
|
||||
local formspec = "size[6,4]"..
|
||||
"label[0,0;Please insert floor name]" ..
|
||||
"field[0.5,1.5;5,1;floor;Floor name;Base]" ..
|
||||
"button_exit[2,3.6;2,1;exit;Save]"
|
||||
meta:set_string("formspec", formspec)
|
||||
|
||||
-- swap last shaft node
|
||||
pos.y = pos.y - 1
|
||||
if minetest.get_node_or_nil(pos).name == "hyperloop:shaft" then
|
||||
local node = minetest.get_node(pos)
|
||||
node.name = "hyperloop:shaft2"
|
||||
minetest.swap_node(pos, node)
|
||||
end
|
||||
pos.y = pos.y + 1
|
||||
|
||||
-- add upper part of the car
|
||||
local floor_pos = table.copy(pos)
|
||||
pos.y = pos.y + 1
|
||||
minetest.add_node(pos, {name="hyperloop:elevator_top", param2=facedir})
|
||||
-- store floor_pos (lower car block) as meta data
|
||||
set_floor_pos(pos, floor_pos)
|
||||
pos.y = pos.y - 1
|
||||
--dbg_out("after_place_node", pos)
|
||||
end,
|
||||
|
||||
on_receive_fields = function(pos, formname, fields, player)
|
||||
-- floor name entered?
|
||||
if fields.floor ~= nil then
|
||||
local floor = string.trim(fields.floor)
|
||||
if floor == "" then
|
||||
return
|
||||
end
|
||||
-- store the floor name in the global elevator list
|
||||
local floor_pos = get_floor_pos(pos)
|
||||
add_to_elevator_list(floor_pos, {name=floor})
|
||||
hyperloop.update_elevator(floor_pos)
|
||||
--dbg_out("on_receive_fields", floor_pos)
|
||||
-- destination selected?
|
||||
elseif fields.button ~= nil then
|
||||
local floor_pos = get_floor_pos(pos)
|
||||
local floor = get_floor_item(floor_pos)
|
||||
local idx = tonumber(fields.button)
|
||||
local list = floor_list(floor_pos)
|
||||
local dest = list[#list-idx]
|
||||
if dest.pos.y ~= floor_pos.y then
|
||||
--local facedir = get_floor_item(floor_pos).facedir
|
||||
minetest.sound_play("door", {
|
||||
pos = floor_pos,
|
||||
gain = 0.5,
|
||||
max_hear_distance = 10,
|
||||
})
|
||||
door_command(floor_pos, floor.facedir, "close")
|
||||
door_command(dest.pos, dest.facedir, "close")
|
||||
minetest.after(2.0, on_arrival, dest.pos, player)
|
||||
end
|
||||
end
|
||||
end,
|
||||
|
||||
on_destruct = function(pos)
|
||||
pos.y = pos.y - 1
|
||||
if minetest.get_node_or_nil(pos).name == "hyperloop:shaft2" then
|
||||
local node = minetest.get_node(pos)
|
||||
node.name = "hyperloop:shaft"
|
||||
minetest.swap_node(pos, node)
|
||||
end
|
||||
pos.y = pos.y + 2
|
||||
--print("pos.y="..pos.y)
|
||||
minetest.remove_node(pos)
|
||||
pos.y = pos.y - 1
|
||||
remove_from_elevator_list(pos)
|
||||
--local facedir = minetest.get_meta(pos):get_int("facedir")
|
||||
--door_command(pos, facedir, "open")
|
||||
end,
|
||||
|
||||
})
|
||||
|
||||
minetest.register_node("hyperloop:elevator_top", {
|
||||
description = "Hyperloop Elevator",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"hyperloop_elevator.png",
|
||||
"hyperloop_elevator.png",
|
||||
"hyperloop_elevator_top.png",
|
||||
"hyperloop_elevator.png",
|
||||
"hyperloop_elevator.png",
|
||||
"hyperloop_elevator.png",
|
||||
},
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -8/16, -8/16, -8/16, -7/16, 8/16, 8/16},
|
||||
{ 7/16, -8/16, -8/16, 8/16, 8/16, 8/16},
|
||||
{ -7/16, -8/16, 7/16, 7/16, 8/16, 8/16},
|
||||
},
|
||||
},
|
||||
|
||||
drawtype = "nodebox",
|
||||
paramtype = 'light',
|
||||
light_source = 2,
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = {snappy = 3, not_in_creative_inventory=1},
|
||||
drop = "hyperloop:elevator_bottom",
|
||||
})
|
||||
|
||||
minetest.register_node("hyperloop:elevator_door_top", {
|
||||
description = "Hyperloop Elevator Door",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"hyperloop_elevator_door_top.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -8/16, -8/16, 7/16, 8/16, 8/16, 8/16},
|
||||
},
|
||||
},
|
||||
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = {snappy = 3, not_in_creative_inventory=1},
|
||||
})
|
||||
|
||||
minetest.register_node("hyperloop:elevator_door", {
|
||||
description = "Hyperloop Elevator Door",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"hyperloop_elevator_door.png",
|
||||
},
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -8/16, -8/16, 7/16, 8/16, 8/16, 8/16},
|
||||
},
|
||||
},
|
||||
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
fixed = { -8/16, -8/16, 7/16, 8/16, 24/16, 8/16 },
|
||||
},
|
||||
|
||||
on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
|
||||
local floor_pos = get_floor_pos(pos)
|
||||
local floor = get_floor_item(floor_pos)
|
||||
print(dump(floor.pos), floor.facedir)
|
||||
door_command(floor.pos, floor.facedir, "open")
|
||||
end,
|
||||
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = {snappy = 3, not_in_creative_inventory=1},
|
||||
})
|
||||
|
||||
-------------------------------------------------------
|
||||
--[[
|
||||
local pos = {x=1, y=2, z=3}
|
||||
local spos = tostring(pos.x)..":"..tostring(pos.z)
|
||||
hyperloop.data.tAllElevators[spos].floors = nil
|
||||
|
||||
local floor = get_floor_item(pos)
|
||||
dbg_out("1", pos)
|
||||
add_to_elevator_list(pos, {name="test1", up=false, down=false, facedir=1, pos=pos})
|
||||
dbg_out("2", pos)
|
||||
remove_from_elevator_list(pos)
|
||||
dbg_out("3", pos)
|
||||
add_to_elevator_list(pos, {name="test1", up=false, down=false, facedir=1, pos=pos})
|
||||
dbg_out("4", pos)
|
||||
add_to_elevator_list(pos, {up=true})
|
||||
dbg_out("5", pos)
|
||||
print("6: ", dump(floor_list(pos)))
|
||||
|
||||
local pos2 = {x=1, y=5, z=3}
|
||||
add_to_elevator_list(pos2, {name="test2", up=true, down=true, facedir=1, pos=pos2})
|
||||
dbg_out("7", pos2)
|
||||
print("8: ", dump(floor_list(pos2)))
|
||||
|
||||
local pos3 = {x=1, y=9, z=3}
|
||||
add_to_elevator_list(pos3, {name="test3", up=false, down=true, facedir=1, pos=pos3})
|
||||
dbg_out("9", pos3)
|
||||
print("10: ", dump(floor_list(pos3)))
|
||||
]]--
|
82
shaft.lua
Normal file
@ -0,0 +1,82 @@
|
||||
--[[
|
||||
|
||||
Hyperloop Mod
|
||||
=============
|
||||
|
||||
Copyright (C) 2017 Joachim Stolberg
|
||||
|
||||
LGPLv2.1+
|
||||
See LICENSE.txt for more information
|
||||
|
||||
History:
|
||||
see init.lua
|
||||
|
||||
]]--
|
||||
|
||||
|
||||
-- simple shaft without logic or "memory"
|
||||
minetest.register_node("hyperloop:shaft", {
|
||||
description = "Hyperloop Elevator Shaft",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
'hyperloop_tube_open.png',
|
||||
'hyperloop_tube_open.png',
|
||||
"hyperloop_tube_locked.png^[transformR90]",
|
||||
"hyperloop_tube_locked.png^[transformR90]",
|
||||
"hyperloop_tube_locked.png^[transformR90]",
|
||||
"hyperloop_tube_locked.png^[transformR90]",
|
||||
},
|
||||
|
||||
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
||||
local npos = table.copy(pos)
|
||||
npos.y = npos.y - 1
|
||||
if minetest.get_node_or_nil(npos).name == "hyperloop:shaft" then
|
||||
local node = minetest.get_node(npos)
|
||||
node.name = "hyperloop:shaft2"
|
||||
minetest.swap_node(npos, node)
|
||||
elseif minetest.get_node_or_nil(npos).name == "hyperloop:elevator_top" then
|
||||
npos.y = npos.y - 1
|
||||
hyperloop.update_elevator(npos)
|
||||
else
|
||||
minetest.remove_node(pos)
|
||||
return itemstack
|
||||
end
|
||||
end,
|
||||
|
||||
after_destruct = function(pos)
|
||||
local npos = table.copy(pos)
|
||||
npos.y = npos.y - 1
|
||||
if minetest.get_node_or_nil(npos).name == "hyperloop:shaft2" then
|
||||
local node = minetest.get_node(npos)
|
||||
node.name = "hyperloop:shaft"
|
||||
minetest.swap_node(npos, node)
|
||||
elseif minetest.get_node_or_nil(npos).name == "hyperloop:elevator_top" then
|
||||
npos.y = npos.y - 1
|
||||
hyperloop.update_elevator(npos)
|
||||
end
|
||||
end,
|
||||
|
||||
light_source = 6,
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky=1},
|
||||
is_ground_content = false,
|
||||
})
|
||||
|
||||
-- simple shaft without logic or "memory"
|
||||
minetest.register_node("hyperloop:shaft2", {
|
||||
description = "Hyperloop Elevator Shaft",
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"hyperloop_tube_locked.png^[transformR90]",
|
||||
"hyperloop_tube_locked.png^[transformR90]",
|
||||
"hyperloop_tube_locked.png^[transformR90]",
|
||||
"hyperloop_tube_locked.png^[transformR90]",
|
||||
"hyperloop_tube_locked.png^[transformR90]",
|
||||
"hyperloop_tube_locked.png^[transformR90]",
|
||||
},
|
||||
|
||||
diggable = false,
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky=1, not_in_creative_inventory=1},
|
||||
is_ground_content = false,
|
||||
})
|
89
station.lua
Normal file
@ -0,0 +1,89 @@
|
||||
--[[
|
||||
|
||||
Hyperloop Mod
|
||||
=============
|
||||
|
||||
Copyright (C) 2017 Joachim Stolberg
|
||||
|
||||
LGPLv2.1+
|
||||
See LICENSE.txt for more information
|
||||
|
||||
History:
|
||||
see init.lua
|
||||
|
||||
]]--
|
||||
|
||||
local function assembly_plan(pos, facedir, clbk)
|
||||
local placedir = hyperloop.facedir_to_placedir(facedir)
|
||||
local res = true
|
||||
facedir = (facedir + 1) % 4
|
||||
pos = hyperloop.new_pos(pos, placedir, "1L")
|
||||
res = clbk(pos, facedir, "hyperloop:tube0") and res
|
||||
pos.y = pos.y + 1
|
||||
res = clbk(pos, facedir, "hyperloop:pod_wall") and res
|
||||
pos.y = pos.y + 1
|
||||
res = clbk(pos, facedir, "hyperloop:pod_wall") and res
|
||||
pos.y = pos.y - 2
|
||||
pos = hyperloop.new_pos(pos, placedir, "1R")
|
||||
facedir = (facedir + 2) % 4
|
||||
res = clbk(pos, facedir, "hyperloop:tube0") and res
|
||||
pos.y = pos.y + 2
|
||||
res = clbk(pos, facedir, "hyperloop:lcd") and res
|
||||
pos.y = pos.y - 2
|
||||
facedir = (facedir + 2) % 4
|
||||
pos = hyperloop.new_pos(pos, placedir, "1R")
|
||||
res = clbk(pos, facedir, "hyperloop:junction") and res
|
||||
pos.y = pos.y + 1
|
||||
res = clbk(pos, facedir, "hyperloop:seat") and res
|
||||
return res
|
||||
end
|
||||
|
||||
|
||||
local function check_space(pos, facedir)
|
||||
local clbk = function(pos, facedir, block)
|
||||
return minetest.get_node_or_nil(pos).name == "air"
|
||||
end
|
||||
|
||||
local my_pos = table.copy(pos)
|
||||
return assembly_plan(my_pos, facedir, clbk)
|
||||
end
|
||||
|
||||
local function construct(pos, facedir)
|
||||
local clbk = function(pos, facedir, block)
|
||||
if block == "hyperloop:lcd" then
|
||||
local tbl = {[0]=4, [1]=2, [2]=5, [3]=3}
|
||||
minetest.add_node(pos, {name=block, paramtype2="wallmounted", param2=tbl[facedir]})
|
||||
hyperloop.after_lcd_placed(pos, tbl[facedir])
|
||||
elseif block == "hyperloop:seat" then
|
||||
minetest.add_node(pos, {name=block, param2=facedir})
|
||||
hyperloop.after_seat_placed(pos, facedir)
|
||||
else
|
||||
minetest.place_node(pos, {name=block, param2=facedir})
|
||||
end
|
||||
end
|
||||
|
||||
local my_pos = table.copy(pos)
|
||||
return assembly_plan(my_pos, facedir, clbk)
|
||||
end
|
||||
|
||||
minetest.register_node("hyperloop:station", {
|
||||
description = "Hyperloop Station Core",
|
||||
inventory_image = "hyperloop_station_inventory.png",
|
||||
wield_image = "hyperloop_station_inventory.png",
|
||||
|
||||
on_place = function(itemstack, placer, pointed_thing)
|
||||
print("on_place")
|
||||
local pos = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
|
||||
pos.y = pos.y + 0.5
|
||||
--pos = vector.floor(pos)
|
||||
print(dump(pos))
|
||||
local facedir = hyperloop.get_facedir(placer)
|
||||
if check_space(pos, facedir) then
|
||||
print("checked")
|
||||
construct(pos, facedir)
|
||||
itemstack:take_item(1)
|
||||
print("done")
|
||||
end
|
||||
return itemstack
|
||||
end,
|
||||
})
|
BIN
textures/hyperloop_agyptL.png
Normal file
After Width: | Height: | Size: 9.9 KiB |
BIN
textures/hyperloop_agyptR.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
textures/hyperloop_alpsL.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
textures/hyperloop_alpsR.png
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
textures/hyperloop_elevator.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
textures/hyperloop_elevator_door.png
Normal file
After Width: | Height: | Size: 712 B |
BIN
textures/hyperloop_elevator_door_top.png
Normal file
After Width: | Height: | Size: 730 B |
BIN
textures/hyperloop_elevator_inventory.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
textures/hyperloop_elevator_top.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
textures/hyperloop_seaL.png
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
textures/hyperloop_seaR.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
textures/hyperloop_sign.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
BIN
textures/hyperloop_sign_top.png
Normal file
After Width: | Height: | Size: 162 B |
BIN
textures/hyperloop_station_inventory.png
Normal file
After Width: | Height: | Size: 16 KiB |