forked from Reload/techage_modpack
121 lines
3.3 KiB
Lua
121 lines
3.3 KiB
Lua
--[[
|
|
|
|
Minecart
|
|
========
|
|
|
|
Copyright (C) 2019-2021 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 P2H = minetest.hash_node_position
|
|
local H2P = minetest.get_position_from_hash
|
|
local S = minecart.S
|
|
|
|
local storage = minetest.get_mod_storage()
|
|
|
|
local function place_carts(t)
|
|
local Carts = {
|
|
["minecart:cart"] = "minecart:cart",
|
|
["techage:tank_cart_entity"] = "techage:tank_cart",
|
|
["techage:chest_cart_entity"] = "techage:chest_cart",
|
|
}
|
|
for id, item in pairs(t) do
|
|
local pos = vector.round((item.start_pos or item.last_pos))
|
|
local name = Carts[item.entity_name] or "minecart:cart"
|
|
--print(P2S(pos), name, item.owner, item.userID)
|
|
if minetest.registered_nodes[name] then
|
|
minecart.add_nodecart(pos, name, 0, {}, item.owner or "", item.userID or 0)
|
|
end
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Store data of running carts
|
|
-------------------------------------------------------------------------------
|
|
minecart.CartsOnRail = {}
|
|
|
|
minetest.register_on_mods_loaded(function()
|
|
local version = storage:get_int("version")
|
|
if version < 2 then
|
|
local t = minetest.deserialize(storage:get_string("CartsOnRail")) or {}
|
|
minetest.after(5, place_carts, t)
|
|
storage:set_int("version", 2)
|
|
else
|
|
local t = minetest.deserialize(storage:get_string("CartsOnRail")) or {}
|
|
for owner, carts in pairs(t) do
|
|
minecart.CartsOnRail[owner] = {}
|
|
for userID, cart in pairs(carts) do
|
|
print("reload cart", owner, userID, cart.objID)
|
|
minecart.CartsOnRail[owner][userID] = cart
|
|
-- mark all entity carts as zombified
|
|
if cart.objID and cart.objID ~= 0 then
|
|
cart.objID = -1
|
|
minecart.push(1, cart)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
minetest.after(10, function()
|
|
for owner, carts in pairs(minecart.CartsOnRail) do
|
|
for userID, cart in pairs(carts) do
|
|
-- Remove node carts that are not available anymore
|
|
if cart.objID == 0 or not cart.objID then
|
|
local node = minecart.get_node_lvm(cart.pos)
|
|
if not minecart.tNodeNames[node.name] then
|
|
-- Mark as "to be deleted"
|
|
print("Node cart deleted", owner, userID)
|
|
minecart.CartsOnRail[owner][userID] = nil
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
minetest.register_on_shutdown(function()
|
|
storage:set_string("CartsOnRail", minetest.serialize(minecart.CartsOnRail))
|
|
print("minecart shutdown finished!!!")
|
|
end)
|
|
|
|
function minecart.store_carts()
|
|
storage:set_string("CartsOnRail", minetest.serialize(minecart.CartsOnRail))
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
-- Store routes (in buffers)
|
|
-------------------------------------------------------------------------------
|
|
function minecart.store_route(pos, route)
|
|
if pos and route then
|
|
M(pos):set_string("route", minetest.serialize(route))
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
function minecart.get_route(pos)
|
|
if pos then
|
|
local s = M(pos):get_string("route")
|
|
if s ~= "" then
|
|
local route = minetest.deserialize(s)
|
|
if route.waypoints then
|
|
M(pos):set_string("route", "")
|
|
M(pos):set_int("time", 0)
|
|
return
|
|
end
|
|
return minetest.deserialize(s)
|
|
end
|
|
end
|
|
end
|
|
|
|
function minecart.del_route(pos)
|
|
M(pos):set_string("route", "")
|
|
end
|