aboutsummaryrefslogtreecommitdiff
path: root/trainlogic.lua
diff options
context:
space:
mode:
authororwell96 <mono96.mml@gmail.com>2016-07-04 12:11:51 +0200
committerorwell96 <mono96.mml@gmail.com>2016-07-04 12:11:51 +0200
commit78b5520a88f18ebff3e5d15bc5389f2c80e3df83 (patch)
treeb45244f4fe7bc333b1c7f0cff5cd78973388a219 /trainlogic.lua
parent209a42147cf11c6aaeac04d1a8bd8a24d50c7926 (diff)
downloadadvtrains-78b5520a88f18ebff3e5d15bc5389f2c80e3df83.tar.gz
advtrains-78b5520a88f18ebff3e5d15bc5389f2c80e3df83.tar.bz2
advtrains-78b5520a88f18ebff3e5d15bc5389f2c80e3df83.zip
Hopefully fix collision finally
Diffstat (limited to 'trainlogic.lua')
-rw-r--r--trainlogic.lua26
1 files changed, 22 insertions, 4 deletions
diff --git a/trainlogic.lua b/trainlogic.lua
index 7d7fe9f..f8f8796 100644
--- a/trainlogic.lua
+++ b/trainlogic.lua
@@ -577,11 +577,12 @@ function advtrains.try_connect_trains_and_check_collision(id1, id2)
--0.5: some grace interval, since else the couple entity does not appear
for i=(advtrains.get_train_end_index(train2)+0.5),train2.index-0.5 do
local testpos=advtrains.get_real_index_position(train2.path,i)
+ --must look for center positions of both trains and compare these, else bugs.
if vector.distance(testpos, backpos1) < 0.5 then
- local v2_sign = math.sign(i - ((train2.index-0.5) - ( (train2.index-0.5)-(advtrains.get_train_end_index(train2)+0.5) / 2 )))
+ --local v2_sign = math.sign(i - ((train2.index-0.5) - ( (train2.index-0.5)-(advtrains.get_train_end_index(train2)+0.5) / 2 )))
--TODO physics
train1.velocity=1
- train2.velocity=v2_sign
+ train2.velocity=advtrains.trains_facing(train1, train2) and -1 or 1
train1.recently_collided_with_env=true
train2.recently_collided_with_env=true
return
@@ -589,7 +590,7 @@ function advtrains.try_connect_trains_and_check_collision(id1, id2)
if vector.distance(testpos, frontpos1) < 0.5 then
local v2_sign = math.sign(i - ((train2.index-0.5) - ( (train2.index-0.5)-(advtrains.get_train_end_index(train2)+0.5) / 2 )))
train1.velocity=-1
- train2.velocity=v2_sign
+ train2.velocity=advtrains.trains_facing(train1, train2) and -1 or 1
train1.recently_collided_with_env=true
train2.recently_collided_with_env=true
return
@@ -599,6 +600,23 @@ function advtrains.try_connect_trains_and_check_collision(id1, id2)
end
end
+--true when trains are facing each other. needed on colliding.
+-- check done by iterating paths and checking their direction
+--returns nil when not on the same track at all. this distinction may not always be needed.
+function advtrains.trains_facing(train1, train2)
+ local sr_pos=train1.path[math.floor(train1.index)]
+ local sr_pos_p=train1.path[math.floor(train1.index)-1]
+
+ for i=advtrains.minN(train2.path), advtrains.maxN(train2.path) do
+ if vector.equals(sr_pos, train2.path[i]) then
+ if vector.equals(sr_pos_p, train2.path[i+1]) then return true end
+ if vector.equals(sr_pos_p, train2.path[i-1]) then return false end
+ return nil
+ end
+ end
+ return nil
+end
+
--order of trains may be irrelevant in some cases. check opposite cases. TODO does this work?
--pos1 and pos2 are just needed to form a median.
function advtrains.spawn_couple_if_neccessary(pos1, pos2, tid1, tid2, train1_is_backpos, train2_is_backpos)
@@ -736,4 +754,4 @@ function advtrains.invalidate_all_paths()
v.min_index_on_track=nil
v.max_index_on_track=nil
end
-end \ No newline at end of file
+end