230 lines
5.8 KiB
Lua
230 lines
5.8 KiB
Lua
local modname = minetest.get_current_modname()
|
|
local modpath = minetest.get_modpath(modname)
|
|
local mod_storage = minetest.get_mod_storage()
|
|
local tardis_context = {}
|
|
|
|
-- Functions are fairly self explanitory, get or set the specified value.
|
|
function tardis.set_nav(pos, name)
|
|
local pos_string = (minetest.pos_to_string(pos))
|
|
|
|
if (pos_string) then
|
|
if (mod_storage:set_string("tardis:"..name..":destination", pos_string)) then
|
|
return true
|
|
else return false
|
|
end
|
|
end
|
|
end
|
|
|
|
function tardis.get_nav(name)
|
|
local pos = minetest.string_to_pos(mod_storage:get_string("tardis:"..name..":destination"))
|
|
|
|
if (pos) then
|
|
return pos
|
|
elseif (tardis.get_exterior(name)) then
|
|
return tardis.get_exterior(name)
|
|
else return { x = 0, y = 0, z = 0 }
|
|
end
|
|
end
|
|
|
|
function tardis.set_exterior(pos, name)
|
|
local pos_string = (minetest.pos_to_string(pos))
|
|
|
|
if (pos_string) then
|
|
if (mod_storage:set_string("tardis:"..name..":exterior", pos_string)) then
|
|
return true
|
|
else return false
|
|
end
|
|
end
|
|
end
|
|
|
|
function tardis.get_exterior(name)
|
|
local pos = minetest.string_to_pos(mod_storage:get_string("tardis:"..name..":exterior"))
|
|
|
|
if (pos) then
|
|
return pos
|
|
else return false
|
|
end
|
|
end
|
|
|
|
function tardis.set_interior(pos, name)
|
|
local pos_string = (minetest.pos_to_string(pos))
|
|
|
|
if (pos_string) then
|
|
if (mod_storage:set_string("tardis:"..name..":interior", pos_string)) then
|
|
return true
|
|
else return false
|
|
end
|
|
end
|
|
end
|
|
|
|
function tardis.get_interior(name)
|
|
local pos = minetest.string_to_pos(mod_storage:get_string("tardis:"..name..":interior"))
|
|
|
|
if (pos) then
|
|
return pos
|
|
else return false
|
|
end
|
|
end
|
|
|
|
function tardis.add_count()
|
|
local current_count = tonumber(mod_storage:get_string("tardis:count"))
|
|
|
|
if (current_count) then
|
|
if (mod_storage:set_string("tardis:count", tostring(current_count+1))) then
|
|
return true
|
|
else return false
|
|
end
|
|
|
|
elseif (mod_storage:set_string("tardis:count", "1")) then
|
|
return true
|
|
else return false
|
|
end
|
|
end
|
|
|
|
function tardis.get_count()
|
|
local current_count = tonumber(mod_storage:get_string("tardis:count"))
|
|
|
|
if (current_count) then
|
|
return current_count
|
|
else return 0
|
|
end
|
|
end
|
|
|
|
function tardis.set_vortex(bool, name)
|
|
if (mod_storage:set_string("tardis:"..name..":vortex", tostring(bool))) then
|
|
return true
|
|
else return nil
|
|
end
|
|
end
|
|
|
|
function tardis.get_vortex(name)
|
|
if (mod_storage:get_string("tardis:"..name..":vortex") == "true") then
|
|
return true
|
|
else return false
|
|
end
|
|
end
|
|
|
|
|
|
-- Hacky node swap function since minetest.swap_node doesnt call any callbacks
|
|
function tardis.swap_node (pos, name)
|
|
local meta = minetest.get_meta (pos)
|
|
local meta_old = meta:to_table()
|
|
|
|
minetest.set_node (pos, name)
|
|
|
|
meta = minetest.get_meta (pos)
|
|
meta:from_table (meta_old)
|
|
end
|
|
|
|
|
|
-- Spawn a TARDIS and set the controls/doors meta with relative coordinates
|
|
function tardis:spawn_interior (pos, name)
|
|
local place_pos = {
|
|
x = tardis.get_count() * 12,
|
|
y = 30000,
|
|
z = 0,
|
|
}
|
|
tardis.add_count()
|
|
local interior_doors_pos = {
|
|
x = (place_pos.x + 5) ,
|
|
y = (place_pos.y + 1) ,
|
|
z = (place_pos.z + 1) ,
|
|
}
|
|
local demat_lever_pos = {
|
|
x = (place_pos.x + 4) ,
|
|
y = (place_pos.y + 2) ,
|
|
z = (place_pos.z + 7) ,
|
|
}
|
|
local nav_pos = {
|
|
x = (place_pos.x + 4) ,
|
|
y = (place_pos.y + 2) ,
|
|
z = (place_pos.z + 8) ,
|
|
}
|
|
|
|
minetest.place_schematic(place_pos, modpath .. "/schematics/tardis_interior.mts")
|
|
|
|
-- Add TARDIS to index
|
|
tardis.set_exterior(pos, name)
|
|
tardis.set_interior(interior_doors_pos, name)
|
|
tardis.set_vortex(false, name)
|
|
|
|
--Set meta
|
|
local demat_meta = minetest.get_meta(demat_lever_pos)
|
|
demat_meta:set_string("owner", name)
|
|
|
|
local nav_meta = minetest.get_meta(nav_pos)
|
|
nav_meta:set_string("owner", name)
|
|
|
|
local interior_doors_meta = minetest.get_meta(interior_doors_pos)
|
|
interior_doors_meta:set_string("owner", name)
|
|
|
|
minetest.log("info", minetest.pos_to_string(tardis.get_interior(name)))
|
|
end
|
|
|
|
|
|
-- Set navigation, uses a formspec
|
|
function tardis.show_nav_formspec(player_name, owner_name)
|
|
local pos = tardis.get_nav(owner_name)
|
|
|
|
if (pos) then
|
|
tardis_context[player_name] = owner_name
|
|
minetest.show_formspec(player_name, "tardis:remat_form",
|
|
"size[7,3]" ..
|
|
"field[1,1.5;2,1;x;X;"..pos.x.."]" ..
|
|
"field[3,1.5;2,1;y;Y;"..pos.y.."]" ..
|
|
"field[5,1.5;2,1;z;Z;"..pos.z.."]" ..
|
|
"button_exit[1,2;2,1;exit;Go!]")
|
|
else return false end
|
|
end
|
|
|
|
-- Make sure TARDISes placed in ungenerated chunks exist and have meta set correctly.
|
|
minetest.register_on_generated(function(minp, maxp, blockseed)
|
|
local table = mod_storage:to_table()
|
|
|
|
for k, v in pairs(table.fields) do
|
|
if (k == string.match(k, "tardis:.+:exterior")) then
|
|
local pos = minetest.string_to_pos(v)
|
|
|
|
if ((pos) and
|
|
(pos.x >= minp.x) and (pos.y >= minp.y) and (pos.z >= minp.z) and
|
|
(pos.x <= maxp.x) and (pos.y <= maxp.y) and (pos.z <= maxp.z)) then
|
|
|
|
minetest.set_node(pos, {name = "tardis:tardis"})
|
|
local meta = minetest.get_meta(minetest.string_to_pos(v))
|
|
local owner = string.match(k, "tardis:(.+):exterior")
|
|
|
|
meta:set_string("owner", owner)
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
minetest.register_on_player_receive_fields(function (player, formname, fields)
|
|
if (formname ~= "tardis:remat_form") then
|
|
return false
|
|
end
|
|
|
|
local player_name = player:get_player_name()
|
|
local owner_name = tardis_context[player_name]
|
|
|
|
if not owner_name then
|
|
minetest.log("error", player_name .. " sending invalid formspec data")
|
|
return true
|
|
end
|
|
|
|
local pos = tardis.get_nav(owner_name)
|
|
|
|
if pos then
|
|
if (tonumber(fields.x)) then pos.x = tonumber(fields.x)
|
|
else minetest.chat_send_player(player_name, "X Coordinate Invalid") end
|
|
if (tonumber(fields.y)) then pos.y = tonumber(fields.y)
|
|
else minetest.chat_send_player(player_name, "Y Coordinate Invalid") end
|
|
if (tonumber(fields.z)) then pos.z = tonumber(fields.z)
|
|
else minetest.chat_send_player(player_name, "Z Coordinate Invalid") end
|
|
end
|
|
|
|
tardis_context[player_name] = nil
|
|
tardis.set_nav(pos, owner_name)
|
|
return true
|
|
end)
|