From 24b0639c5f057ccb0fccc3c65be923bee1b571db Mon Sep 17 00:00:00 2001 From: orwell96 Date: Thu, 17 May 2018 21:37:01 +0200 Subject: Mainly make collisions and coupling work Missing: ATC stuff, yaw problems --- advtrains/occupation.lua | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) (limited to 'advtrains/occupation.lua') diff --git a/advtrains/occupation.lua b/advtrains/occupation.lua index 6316bd3..99de521 100644 --- a/advtrains/occupation.lua +++ b/advtrains/occupation.lua @@ -56,7 +56,7 @@ Whenever a path gets invalidated or path items are deleted, their index counterp When a train needs to know whether a position is blocked by another train, it will (and is permitted to) query the train.index and train.end_index and compare them to the blocked position's index. -Callback system for 3rd-party path checkers: TODO +Callback system for 3rd-party path checkers: advtrains.te_register_on_new_path(func(id, train)) -- Called when a train's path is re-initalized, either when it was invalidated -- or the saves were just loaded @@ -72,6 +72,12 @@ advtrains.te_register_on_update(func(id, train)) -- It is ensured that on_new_path callbacks are executed prior to these callbacks whenever -- an invalidation or a reload occured. +advtrains.te_register_on_create(func(id, train)) +-- Called right after a train is created, right after the initial new_path callback +advtrains.te_register_on_remove(func(id, train)) +-- Called right before a train is deleted + + All callbacks are allowed to save certain values inside the train table, but they must ensure that those are reinitialized in the on_new_path callback. The on_new_path callback must explicitly set ALL OF those values to nil or to a new updated value, and must not rely on their existence. @@ -162,11 +168,13 @@ function o.check_collision(pos, train_id) if not t then return end local i = 1 while t[i] do - if t[i]~=train_id then + local ti = t[i] + if ti~=train_id then local idx = t[i+1] - local train = advtrains.trains[train_id] - advtrains.train_ensure_init(train_id, train) + local train = advtrains.trains[ti] + atdebug("checking train",t[i],"index",idx,"<>",train.index,train.end_index) if idx >= train.end_index and idx <= train.index then + atdebug("collides.") return true end end @@ -183,19 +191,39 @@ function o.get_occupations(train, index) local ppos, ontrack = advtrains.path_get(train, index) if not ontrack then atdebug("Train",train.id,"get_occupations requested off-track",index) - return {}, pos + return {}, ppos end local pos = advtrains.round_vector_floor_y(ppos) local t = occget(pos) + if not t then return {} end local r = {} local i = 1 local train_id = train.id while t[i] do if t[i]~=train_id then - r[train_id] = t[i+1] + r[t[i]] = t[i+1] end i = i + 2 end return r, pos end +-- Gets a mapping of train id's to indexes of trains that stand or drive over +-- returns (table with train_id->index), position +function o.get_trains_at(ppos) + local pos = advtrains.round_vector_floor_y(ppos) + local t = occget(pos) + if not t then return {} end + local r = {} + local i = 1 + while t[i] do + local train = advtrains.trains[t[i]] + local idx = t[i+1] + if train.end_index - 0.5 <= idx and idx <= train.index + 0.5 then + r[t[i]] = idx + end + i = i + 2 + end + return r +end + advtrains.occ = o -- cgit v1.2.3