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 |