202 lines
5.1 KiB
Lua
202 lines
5.1 KiB
Lua
|
--[[
|
||
|
|
||
|
Hyperloop Mod
|
||
|
=============
|
||
|
|
||
|
Copyright (C) 2017-2019 Joachim Stolberg
|
||
|
|
||
|
LGPLv2.1+
|
||
|
See LICENSE.txt for more information
|
||
|
|
||
|
]]--
|
||
|
|
||
|
-- for lazy programmers
|
||
|
local SP = function(pos) if pos then return minetest.pos_to_string(pos) end end
|
||
|
local P = minetest.string_to_pos
|
||
|
local M = minetest.get_meta
|
||
|
|
||
|
--- Load support for intllib.
|
||
|
local S = hyperloop.S
|
||
|
local NS = hyperloop.NS
|
||
|
|
||
|
-- Open the door for an emergency
|
||
|
local function door_on_punch(pos, node, puncher, pointed_thing)
|
||
|
local station = hyperloop.get_base_station(pos)
|
||
|
if station then
|
||
|
if station.name == "Station" then
|
||
|
hyperloop.chat(puncher, S("The Booking Machine for this station is missing!"))
|
||
|
elseif not hyperloop.is_blocked(station.pos) then
|
||
|
hyperloop.open_pod_door(station)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- Open/close/animate the pod door
|
||
|
-- door_pos1: position of the bottom door
|
||
|
-- cmnd: "close", "open", or "animate"
|
||
|
local function door_command(door_pos1, facedir, cmnd)
|
||
|
-- one step up
|
||
|
local door_pos2 = vector.add(door_pos1, {x=0, y=1, z=0})
|
||
|
|
||
|
local node1 = minetest.get_node(door_pos1)
|
||
|
local node2 = minetest.get_node(door_pos2)
|
||
|
local meta = minetest.get_meta(door_pos1)
|
||
|
if cmnd == "open" then
|
||
|
minetest.sound_play("door", {
|
||
|
pos = door_pos1,
|
||
|
gain = 0.5,
|
||
|
max_hear_distance = 10,
|
||
|
})
|
||
|
node1.name = "air"
|
||
|
minetest.swap_node(door_pos1, node1)
|
||
|
node2.name = "air"
|
||
|
minetest.swap_node(door_pos2, node2)
|
||
|
elseif cmnd == "close" then
|
||
|
minetest.sound_play("door", {
|
||
|
pos = door_pos1,
|
||
|
gain = 0.5,
|
||
|
max_hear_distance = 10,
|
||
|
})
|
||
|
node1.name = "hyperloop:doorBottom"
|
||
|
node1.param2 = facedir
|
||
|
minetest.swap_node(door_pos1, node1)
|
||
|
node2.name = "hyperloop:doorTopPassive"
|
||
|
node2.param2 = facedir
|
||
|
minetest.swap_node(door_pos2, node2)
|
||
|
elseif cmnd == "animate" then
|
||
|
node2.name = "hyperloop:doorTopActive"
|
||
|
node2.param2 = facedir
|
||
|
minetest.swap_node(door_pos2, node2)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- door command based on the station data table
|
||
|
function hyperloop.open_pod_door(tStation)
|
||
|
if tStation ~= nil then
|
||
|
local door_pos = hyperloop.new_pos(tStation.pos, tStation.facedir, "1F1L", 1)
|
||
|
local door_facedir = (tStation.facedir + 1) % 4
|
||
|
door_command(door_pos, door_facedir, "open")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- door command based on the station data table
|
||
|
function hyperloop.close_pod_door(tStation)
|
||
|
if tStation ~= nil then
|
||
|
local door_pos = hyperloop.new_pos(tStation.pos, tStation.facedir, "1F1L", 1)
|
||
|
local door_facedir = (tStation.facedir + 1) % 4
|
||
|
door_command(door_pos, door_facedir, "close")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
-- door command based on the station data table
|
||
|
function hyperloop.animate_pod_door(tStation)
|
||
|
if tStation ~= nil then
|
||
|
local door_pos = hyperloop.new_pos(tStation.pos, tStation.facedir, "1F1L", 1)
|
||
|
local door_facedir = (tStation.facedir + 1) % 4
|
||
|
door_command(door_pos, door_facedir, "animate")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
minetest.register_node("hyperloop:doorTopPassive", {
|
||
|
description = S("Hyperloop Door Top"),
|
||
|
tiles = {
|
||
|
-- up, down, right, left, back, front
|
||
|
"hyperloop_skin_door.png",
|
||
|
"hyperloop_skin_door.png",
|
||
|
"hyperloop_skin_door.png",
|
||
|
"hyperloop_skin_door.png",
|
||
|
"hyperloop_door1OUT.png",
|
||
|
"hyperloop_door1OUT.png",
|
||
|
},
|
||
|
drawtype = "nodebox",
|
||
|
node_box = {
|
||
|
type = "fixed",
|
||
|
fixed = {-8/16, -8/16, -5/16, 8/16, 8/16, 5/16},
|
||
|
},
|
||
|
|
||
|
on_punch = door_on_punch,
|
||
|
|
||
|
auto_place_node = function(pos, facedir, sStationPos)
|
||
|
M(pos):set_int("facedir", facedir)
|
||
|
M(pos):set_string("sStationPos", sStationPos)
|
||
|
end,
|
||
|
|
||
|
on_rotate = screwdriver.disallow,
|
||
|
paramtype = 'light',
|
||
|
light_source = 1,
|
||
|
paramtype2 = "facedir",
|
||
|
drop = "",
|
||
|
sounds = default.node_sound_metal_defaults(),
|
||
|
groups = {cracky=1, not_in_creative_inventory=1},
|
||
|
is_ground_content = false,
|
||
|
})
|
||
|
|
||
|
minetest.register_node("hyperloop:doorTopActive", {
|
||
|
description = S("Hyperloop Door Top"),
|
||
|
tiles = {
|
||
|
-- up, down, right, left, back, front
|
||
|
"hyperloop_skin_door.png",
|
||
|
"hyperloop_skin_door.png",
|
||
|
"hyperloop_skin_door.png",
|
||
|
"hyperloop_skin_door.png",
|
||
|
{
|
||
|
name = "hyperloop_door1IN.png",
|
||
|
animation = {
|
||
|
type = "vertical_frames",
|
||
|
aspect_w = 32,
|
||
|
aspect_h = 32,
|
||
|
length = 1.0,
|
||
|
},
|
||
|
},
|
||
|
"hyperloop_door1OUT.png",
|
||
|
},
|
||
|
drawtype = "nodebox",
|
||
|
node_box = {
|
||
|
type = "fixed",
|
||
|
fixed = {-8/16, -8/16, -5/16, 8/16, 8/16, 5/16},
|
||
|
},
|
||
|
|
||
|
on_rotate = screwdriver.disallow,
|
||
|
paramtype2 = "facedir",
|
||
|
drop = "",
|
||
|
light_source = 2,
|
||
|
sounds = default.node_sound_metal_defaults(),
|
||
|
groups = {cracky=1, not_in_creative_inventory=1},
|
||
|
is_ground_content = false,
|
||
|
})
|
||
|
|
||
|
minetest.register_node("hyperloop:doorBottom", {
|
||
|
description = S("Hyperloop Door Bottom"),
|
||
|
tiles = {
|
||
|
-- up, down, right, left, back, front
|
||
|
"hyperloop_skin_door.png",
|
||
|
"hyperloop_skin_door.png",
|
||
|
"hyperloop_skin_door.png",
|
||
|
"hyperloop_skin_door.png",
|
||
|
"hyperloop_door2IN.png",
|
||
|
"hyperloop_door2OUT.png",
|
||
|
},
|
||
|
drawtype = "nodebox",
|
||
|
node_box = {
|
||
|
type = "fixed",
|
||
|
fixed = {-8/16, -8/16, -5/16, 8/16, 8/16, 5/16},
|
||
|
},
|
||
|
|
||
|
on_punch = door_on_punch,
|
||
|
|
||
|
auto_place_node = function(pos, facedir, sStationPos)
|
||
|
M(pos):set_int("facedir", facedir)
|
||
|
M(pos):set_string("sStationPos", sStationPos)
|
||
|
end,
|
||
|
|
||
|
on_rotate = screwdriver.disallow,
|
||
|
paramtype = 'light',
|
||
|
light_source = 1,
|
||
|
paramtype2 = "facedir",
|
||
|
drop = "",
|
||
|
sounds = default.node_sound_metal_defaults(),
|
||
|
groups = {cracky=1, not_in_creative_inventory=1},
|
||
|
is_ground_content = false,
|
||
|
})
|
||
|
|