Hopefully fix collision finally

h137
orwell96 2016-07-04 12:11:51 +02:00
parent 209a42147c
commit 78b5520a88
1 changed files with 22 additions and 4 deletions

View File

@ -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
end