From e59a89eb2aaf16766320c25da19f3243c198d2d2 Mon Sep 17 00:00:00 2001 From: teknomunk Date: Mon, 8 Apr 2024 21:37:54 +0000 Subject: [PATCH] Implement train reversing --- mods/ENTITIES/mcl_minecarts/functions.lua | 12 ++++++++++++ mods/ENTITIES/mcl_minecarts/movement.lua | 13 ++++++------- mods/ENTITIES/mcl_minecarts/train.lua | 9 +++++++++ 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/mods/ENTITIES/mcl_minecarts/functions.lua b/mods/ENTITIES/mcl_minecarts/functions.lua index fad6121c0..a3b256022 100644 --- a/mods/ENTITIES/mcl_minecarts/functions.lua +++ b/mods/ENTITIES/mcl_minecarts/functions.lua @@ -364,3 +364,15 @@ function mod.get_cart_position(cart_staticdata) return vector.add(data.connected_at, vector.multiply(data.dir or vector.zero(), data.distance or 0)) end +function mod.reverse_cart_direction(staticdata) + + -- Complete moving thru this block into the next, reverse direction, and put us back at the same position we were at + local next_dir = -staticdata.dir + staticdata.connected_at = staticdata.connected_at + staticdata.dir + staticdata.distance = 1 - (staticdata.distance or 0) + + -- recalculate direction + local next_dir,_ = mod:get_rail_direction(staticdata.connected_at, next_dir, nil, nil, staticdata.railtype) + staticdata.dir = next_dir +end + diff --git a/mods/ENTITIES/mcl_minecarts/movement.lua b/mods/ENTITIES/mcl_minecarts/movement.lua index b316d0742..1b84504f1 100644 --- a/mods/ENTITIES/mcl_minecarts/movement.lua +++ b/mods/ENTITIES/mcl_minecarts/movement.lua @@ -11,6 +11,7 @@ local MAX_TRAIN_LENGTH = mod.MAX_TRAIN_LENGTH -- Imports local train_length = mod.train_length local update_train = mod.update_train +local reverse_train = mod.reverse_train local link_cart_ahead = mod.link_cart_ahead local update_cart_orientation = mod.update_cart_orientation local get_cart_data = mod.get_cart_data @@ -248,14 +249,12 @@ local function calculate_acceleration(self, staticdata) end local function reverse_direction(self, staticdata) - -- Complete moving thru this block into the next, reverse direction, and put us back at the same position we were at - local next_dir = -staticdata.dir - staticdata.connected_at = staticdata.connected_at + staticdata.dir - staticdata.distance = 1 - (staticdata.distance or 0) + if staticdata.behind or staticdata.ahead then + reverse_train(self) + return + end - -- recalculate direction - local next_dir,_ = mcl_minecarts:get_rail_direction(staticdata.connected_at, next_dir, nil, nil, staticdata.railtype) - staticdata.dir = next_dir + mod.reverse_cart_direction(staticdata) end local function do_movement_step(self, dtime) diff --git a/mods/ENTITIES/mcl_minecarts/train.lua b/mods/ENTITIES/mcl_minecarts/train.lua index 88adb7f87..cac57fa7d 100644 --- a/mods/ENTITIES/mcl_minecarts/train.lua +++ b/mods/ENTITIES/mcl_minecarts/train.lua @@ -114,3 +114,12 @@ function mod.link_cart_ahead(cart, cart_ahead) staticdata.ahead = ca_staticdata.uuid ca_staticdata.behind = staticdata.uuid end + + +function mod.reverse_train(cart) + for c in train_cars(cart) do + mod.reverse_cart_direction(c) + c.behind,c.ahead = c.ahead,c.behind + end +end +