mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-30 22:41:20 +01:00
Fix crashes in train logic, allow breaking apart trains
This commit is contained in:
parent
e59a89eb2a
commit
475d6f3e93
2 changed files with 31 additions and 3 deletions
|
@ -121,7 +121,7 @@ local function handle_cart_collision(cart1, prev_pos, next_dir)
|
||||||
for uuid,v in pairs(carts) do
|
for uuid,v in pairs(carts) do
|
||||||
-- Clean up dead carts
|
-- Clean up dead carts
|
||||||
local data = get_cart_data(uuid)
|
local data = get_cart_data(uuid)
|
||||||
if not data then
|
if not data or not data.connected_at then
|
||||||
carts[uuid] = nil
|
carts[uuid] = nil
|
||||||
dirty = true
|
dirty = true
|
||||||
uuid = nil
|
uuid = nil
|
||||||
|
|
|
@ -4,6 +4,7 @@ local mod = mcl_minecarts
|
||||||
|
|
||||||
-- Imports
|
-- Imports
|
||||||
local get_cart_data = mod.get_cart_data
|
local get_cart_data = mod.get_cart_data
|
||||||
|
local save_cart_data = mod.save_cart_data
|
||||||
local MAX_TRAIN_LENGTH = mod.MAX_TRAIN_LENGTH
|
local MAX_TRAIN_LENGTH = mod.MAX_TRAIN_LENGTH
|
||||||
|
|
||||||
-- Follow .behind to the back end of a train
|
-- Follow .behind to the back end of a train
|
||||||
|
@ -62,6 +63,27 @@ function mod.distance_between_cars(car1, car2)
|
||||||
end
|
end
|
||||||
local distance_between_cars = mod.distance_between_cars
|
local distance_between_cars = mod.distance_between_cars
|
||||||
|
|
||||||
|
local function break_train_at(cart)
|
||||||
|
if cart.ahead then
|
||||||
|
local ahead = get_cart_data(cart.ahead)
|
||||||
|
if ahead then
|
||||||
|
ahead.behind = nil
|
||||||
|
cart.ahead = nil
|
||||||
|
save_cart_data(ahead.uuid)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if cart.behind then
|
||||||
|
local behind = get_cart_data(cart.behind)
|
||||||
|
if behind then
|
||||||
|
behind.ahead = nil
|
||||||
|
cart.behind = nil
|
||||||
|
save_cart_data(behind.uuid)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
save_cart_data(cart.uuid)
|
||||||
|
end
|
||||||
|
mod.break_train_at = break_train_at
|
||||||
|
|
||||||
function mod.update_train(cart)
|
function mod.update_train(cart)
|
||||||
local staticdata = cart._staticdata
|
local staticdata = cart._staticdata
|
||||||
|
|
||||||
|
@ -88,11 +110,17 @@ function mod.update_train(cart)
|
||||||
local e = 0
|
local e = 0
|
||||||
local separation
|
local separation
|
||||||
local cart_velocity = velocity
|
local cart_velocity = velocity
|
||||||
if behind then
|
if not c.connected_at then
|
||||||
|
break_train_at(c)
|
||||||
|
elseif behind then
|
||||||
separation = distance_between_cars(behind, c)
|
separation = distance_between_cars(behind, c)
|
||||||
local e = 0
|
local e = 0
|
||||||
if separation > 1.6 then
|
if not separation then
|
||||||
|
break_train_at(c)
|
||||||
|
elseif separation > 1.6 then
|
||||||
cart_velocity = velocity * 0.9
|
cart_velocity = velocity * 0.9
|
||||||
|
elseif separation > 2.5 then
|
||||||
|
break_train_at(c)
|
||||||
elseif separation < 1.15 then
|
elseif separation < 1.15 then
|
||||||
cart_velocity = velocity * 1.1
|
cart_velocity = velocity * 1.1
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue