108 lines
2.7 KiB
Lua
108 lines
2.7 KiB
Lua
--[[
|
|
|
|
Minecart
|
|
========
|
|
|
|
Copyright (C) 2019-2020 Joachim Stolberg
|
|
|
|
MIT
|
|
See license.txt for more information
|
|
|
|
]]--
|
|
|
|
-- for lazy programmers
|
|
local M = minetest.get_meta
|
|
local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end
|
|
local S2P = minetest.string_to_pos
|
|
local S = minecart.S
|
|
|
|
local storage = minetest.get_mod_storage()
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Store data of running carts
|
|
-------------------------------------------------------------------------------
|
|
minecart.CartsOnRail = {}
|
|
|
|
minetest.register_on_mods_loaded(function()
|
|
for key,val in pairs(minetest.deserialize(storage:get_string("CartsOnRail")) or {}) do
|
|
-- use invalid keys to force the cart spawning
|
|
minecart.CartsOnRail[-key] = val
|
|
end
|
|
end)
|
|
|
|
minetest.register_on_shutdown(function()
|
|
storage:set_string("CartsOnRail", minetest.serialize(minecart.CartsOnRail))
|
|
end)
|
|
|
|
function minecart.store_carts()
|
|
storage:set_string("CartsOnRail", minetest.serialize(minecart.CartsOnRail))
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Store routes
|
|
-------------------------------------------------------------------------------
|
|
-- All positions as "pos_to_string" string
|
|
--Routes = {
|
|
-- start_pos = {
|
|
-- waypoints = {{spos, svel}, {spos, svel}, ...},
|
|
-- dest_pos = spos,
|
|
-- junctions = {
|
|
-- {spos = num},
|
|
-- {spos = num},
|
|
-- },
|
|
-- },
|
|
-- start_pos = {...},
|
|
--}
|
|
local Routes = {}
|
|
local NEW_ROUTE = {waypoints = {}, junctions = {}}
|
|
|
|
function minecart.store_route(key, route)
|
|
if key and route then
|
|
Routes[key] = route
|
|
local meta = M(S2P(key))
|
|
if meta then
|
|
meta:set_string("route", minetest.serialize(route))
|
|
return true
|
|
end
|
|
end
|
|
return false
|
|
end
|
|
|
|
function minecart.get_route(key)
|
|
if not Routes[key] then
|
|
local s = M(S2P(key)):get_string("route")
|
|
if s ~= "" then
|
|
Routes[key] = minetest.deserialize(s) or NEW_ROUTE
|
|
else
|
|
Routes[key] = NEW_ROUTE
|
|
end
|
|
end
|
|
return Routes[key]
|
|
end
|
|
|
|
function minecart.del_route(key)
|
|
Routes[key] = nil -- remove from memory
|
|
M(S2P(key)):set_string("route", "") -- and as metadata
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Convert data to v2
|
|
-------------------------------------------------------------------------------
|
|
minetest.after(5, function()
|
|
local tbl = storage:to_table()
|
|
for key,s in pairs(tbl.fields) do
|
|
if key ~= "CartsOnRail" then
|
|
local route = minetest.deserialize(s)
|
|
if route.waypoints and route.junctions then
|
|
if minecart.store_route(key, route) then
|
|
storage:set_string(key, "")
|
|
end
|
|
else
|
|
storage:set_string(key, "")
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
|