forked from MTSR/techage_modpack
90 lines
2.4 KiB
Lua
90 lines
2.4 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 MP = minetest.get_modpath("minecart")
|
|
local lib = dofile(MP.."/cart_lib3.lua")
|
|
|
|
local CartsOnRail = minecart.CartsOnRail -- from storage.lua
|
|
local get_route = minecart.get_route -- from storage.lua
|
|
|
|
--
|
|
-- Route recording
|
|
--
|
|
function minecart.start_recording(self, pos)
|
|
self.start_key = lib.get_route_key(pos, self.driver)
|
|
if self.start_key then
|
|
self.waypoints = {}
|
|
self.junctions = {}
|
|
self.recording = true
|
|
self.next_time = minetest.get_us_time() + 1000000
|
|
minetest.chat_send_player(self.driver, S("[minecart] Start route recording!"))
|
|
end
|
|
end
|
|
|
|
function minecart.store_next_waypoint(self, pos, vel)
|
|
if self.start_key and self.recording and self.driver and
|
|
self.next_time < minetest.get_us_time() then
|
|
self.next_time = minetest.get_us_time() + 1000000
|
|
self.waypoints[#self.waypoints+1] = {P2S(vector.round(pos)), P2S(vector.round(vel))}
|
|
elseif self.recording and not self.driver then
|
|
self.recording = false
|
|
self.waypoints = nil
|
|
self.junctions = nil
|
|
end
|
|
end
|
|
|
|
-- destination reached(speed == 0)
|
|
function minecart.stop_recording(self, pos, vel, puncher)
|
|
local dest_pos = lib.get_route_key(pos, self.driver)
|
|
if dest_pos then
|
|
if self.start_key and self.start_key ~= dest_pos then
|
|
local route = {
|
|
waypoints = self.waypoints,
|
|
dest_pos = dest_pos,
|
|
junctions = self.junctions,
|
|
}
|
|
minecart.store_route(self.start_key, route)
|
|
minetest.chat_send_player(self.driver, S("[minecart] Route stored!"))
|
|
else
|
|
minetest.chat_send_player(self.driver, S("[minecart] Recording canceled!"))
|
|
end
|
|
else
|
|
minetest.chat_send_player(self.driver, S("[minecart] Recording canceled!"))
|
|
end
|
|
self.recording = false
|
|
self.waypoints = nil
|
|
self.junctions = nil
|
|
end
|
|
|
|
function minecart.set_junction(self, pos, dir, switch_keys)
|
|
if self.junctions then
|
|
self.junctions[P2S(vector.round(pos))] = {dir, switch_keys}
|
|
end
|
|
end
|
|
|
|
function minecart.get_junction(self, pos, dir)
|
|
local junctions = CartsOnRail[self.myID] and CartsOnRail[self.myID].junctions
|
|
if junctions then
|
|
local data = junctions[P2S(vector.round(pos))]
|
|
if data then
|
|
return data[1], data[2]
|
|
end
|
|
end
|
|
return dir
|
|
end
|
|
|