Fix trains flipping when autocoupling
This commit is contained in:
parent
657446e163
commit
943e5208a9
|
@ -536,38 +536,34 @@ function advtrains.train_step_c(id, train, dtime)
|
||||||
|
|
||||||
local col_tr = advtrains.occ.check_collision(testpos, id)
|
local col_tr = advtrains.occ.check_collision(testpos, id)
|
||||||
if col_tr then
|
if col_tr then
|
||||||
if train.is_shunt or col_tr.is_shunt then
|
advtrains.train_check_couples(train)
|
||||||
train.is_shunt = nil
|
train.velocity = 0
|
||||||
col_tr.is_shunt = nil
|
advtrains.atc.train_reset_command(train)
|
||||||
minetest.after(0,advtrains.do_connect_trains, col_tr.id, train.id, train.velocity)
|
collided = true
|
||||||
else
|
|
||||||
train.velocity = 0
|
|
||||||
advtrains.atc.train_reset_command(train)
|
|
||||||
collided = true
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
|
||||||
--- 8b damage players ---
|
--- 8b damage players ---
|
||||||
if is_loaded_area and (setting_overrun_mode=="drop" or setting_overrun_mode=="normal") then
|
if is_loaded_area and train.velocity > 3 and (setting_overrun_mode=="drop" or setting_overrun_mode=="normal") then
|
||||||
local testpts = minetest.pos_to_string(testpos)
|
local testpts = minetest.pos_to_string(testpos)
|
||||||
local player=advtrains.playersbypts[testpts]
|
local player=advtrains.playersbypts[testpts]
|
||||||
if player and train.velocity>3 and player:get_hp()>0 and advtrains.is_damage_enabled(player:get_player_name()) then
|
if player and player:get_hp()>0 and advtrains.is_damage_enabled(player:get_player_name()) then
|
||||||
--atdebug("damage found",player:get_player_name())
|
--atdebug("damage found",player:get_player_name())
|
||||||
if setting_overrun_mode=="drop" then
|
if setting_overrun_mode=="drop" then
|
||||||
--instantly kill player
|
--instantly kill player
|
||||||
--drop inventory contents first, to not to spawn bones
|
--drop inventory contents first, to not to spawn bones
|
||||||
local player_inv=player:get_inventory()
|
local player_inv=player:get_inventory()
|
||||||
for i=1,player_inv:get_size("main") do
|
for i=1,player_inv:get_size("main") do
|
||||||
minetest.add_item(testpos, player_inv:get_stack("main", i))
|
minetest.add_item(testpos, player_inv:get_stack("main", i))
|
||||||
|
end
|
||||||
|
for i=1,player_inv:get_size("craft") do
|
||||||
|
minetest.add_item(testpos, player_inv:get_stack("craft", i))
|
||||||
|
end
|
||||||
|
-- empty lists main and craft
|
||||||
|
player_inv:set_list("main", {})
|
||||||
|
player_inv:set_list("craft", {})
|
||||||
end
|
end
|
||||||
for i=1,player_inv:get_size("craft") do
|
player:set_hp(0)
|
||||||
minetest.add_item(testpos, player_inv:get_stack("craft", i))
|
|
||||||
end
|
|
||||||
-- empty lists main and craft
|
|
||||||
player_inv:set_list("main", {})
|
|
||||||
player_inv:set_list("craft", {})
|
|
||||||
end
|
end
|
||||||
player:set_hp(0)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -922,11 +918,21 @@ local CPL_ZONE = 2
|
||||||
-- train.couple_* contain references to ObjectRefs of couple objects, which contain all relevant information
|
-- train.couple_* contain references to ObjectRefs of couple objects, which contain all relevant information
|
||||||
-- These objectRefs will delete themselves once the couples no longer match
|
-- These objectRefs will delete themselves once the couples no longer match
|
||||||
local function createcouple(pos, train1, t1_is_front, train2, t2_is_front)
|
local function createcouple(pos, train1, t1_is_front, train2, t2_is_front)
|
||||||
|
local id1 = train1.id
|
||||||
|
local id2 = train2.id
|
||||||
|
if train1.is_shunt or train2.is_shunt then
|
||||||
|
-- couple trains
|
||||||
|
train1.is_shunt = nil
|
||||||
|
train2.is_shunt = nil
|
||||||
|
minetest.after(0, advtrains.safe_couple_trains, id1, id2, t1_is_front, t2_is_front, false, false, train1.velocity, train2.velocity)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
local obj=minetest.add_entity(pos, "advtrains:couple")
|
local obj=minetest.add_entity(pos, "advtrains:couple")
|
||||||
if not obj then error("Failed creating couple object!") return end
|
if not obj then error("Failed creating couple object!") return end
|
||||||
local le=obj:get_luaentity()
|
local le=obj:get_luaentity()
|
||||||
le.train_id_1=train1.id
|
le.train_id_1=id1
|
||||||
le.train_id_2=train2.id
|
le.train_id_2=id2
|
||||||
le.t1_is_front=t1_is_front
|
le.t1_is_front=t1_is_front
|
||||||
le.t2_is_front=t2_is_front
|
le.t2_is_front=t2_is_front
|
||||||
--atdebug("created couple between",train1.id,t1_is_front,train2.id,t2_is_front)
|
--atdebug("created couple between",train1.id,t1_is_front,train2.id,t2_is_front)
|
||||||
|
|
|
@ -1072,9 +1072,9 @@ local function check_twagon_owner(train, b_first, pname)
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
function advtrains.safe_couple_trains(id1, id2, t1f, t2f, pname, try_run)
|
function advtrains.safe_couple_trains(id1, id2, t1f, t2f, pname, try_run,v1,v2)
|
||||||
|
|
||||||
if not minetest.check_player_privs(pname, "train_operator") then
|
if pname and not minetest.check_player_privs(pname, "train_operator") then
|
||||||
minetest.chat_send_player(pname, "Missing train_operator privilege")
|
minetest.chat_send_player(pname, "Missing train_operator privilege")
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
@ -1086,27 +1086,36 @@ function advtrains.safe_couple_trains(id1, id2, t1f, t2f, pname, try_run)
|
||||||
or not advtrains.train_ensure_init(id2, train2) then
|
or not advtrains.train_ensure_init(id2, train2) then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
local wck_t1, wck_t2
|
||||||
local wck_t1 = check_twagon_owner(train1, t1f, pname)
|
if pname then
|
||||||
local wck_t2 = check_twagon_owner(train2, t2f, pname)
|
wck_t1 = check_twagon_owner(train1, t1f, pname)
|
||||||
|
wck_t2 = check_twagon_owner(train2, t2f, pname)
|
||||||
if wck_t1 or wck_t2 then
|
end
|
||||||
|
if (wck_t1 or wck_t2) or not pname then
|
||||||
|
if not v1 then
|
||||||
|
v1 = 0
|
||||||
|
end
|
||||||
|
if not v2 then
|
||||||
|
v2 = 0
|
||||||
|
end
|
||||||
if try_run then
|
if try_run then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
if t1f then
|
if t1f then
|
||||||
if t2f then
|
if t2f then
|
||||||
|
v1 = -v1
|
||||||
advtrains.invert_train(id1)
|
advtrains.invert_train(id1)
|
||||||
advtrains.do_connect_trains(id1, id2)
|
advtrains.do_connect_trains(id1, id2, v1+v2)
|
||||||
else
|
else
|
||||||
advtrains.do_connect_trains(id2, id1)
|
advtrains.do_connect_trains(id2, id1, v1+v2)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
if t2f then
|
if t2f then
|
||||||
advtrains.do_connect_trains(id1, id2)
|
advtrains.do_connect_trains(id1, id2, v1+v2)
|
||||||
else
|
else
|
||||||
|
v2 = -v2
|
||||||
advtrains.invert_train(id2)
|
advtrains.invert_train(id2)
|
||||||
advtrains.do_connect_trains(id1, id2)
|
advtrains.do_connect_trains(id1, id2, v1+v2)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return true
|
return true
|
||||||
|
|
Loading…
Reference in New Issue