Teleport player to their train every 2 seconds instead of just on_joinplayer

Solves problem of wagon being unloaded while player sitting inside it because of network lag
master
orwell96 2018-07-21 16:43:37 +02:00
parent b80ba056d9
commit 3dc5b28774
1 changed files with 31 additions and 16 deletions

View File

@ -46,6 +46,8 @@ local t_accel_eng={
[4] = 1.5,
}
tp_player_tmr = 0
advtrains.mainloop_trainlogic=function(dtime)
--build a table of all players indexed by pts. used by damage and door system.
advtrains.playersbypts={}
@ -56,6 +58,16 @@ advtrains.mainloop_trainlogic=function(dtime)
advtrains.playersbypts[ptspos]=player
end
end
if tp_player_tmr<=0 then
-- teleport players to their train every 2 seconds
for _, player in pairs(minetest.get_connected_players()) do
advtrains.tp_player_to_train(player)
end
tp_player_tmr = 2
else
tp_player_tmr = tp_player_tmr - dtime
end
--regular train step
--[[ structure:
1. make trains calculate their occupation windows when needed (a)
@ -87,8 +99,7 @@ advtrains.mainloop_trainlogic=function(dtime)
endstep()
end
minetest.register_on_joinplayer(function(player)
return advtrains.pcall(function()
function advtrains.tp_player_to_train(player)
local pname = player:get_player_name()
local id=advtrains.player_to_train_mapping[pname]
if id then
@ -98,6 +109,10 @@ minetest.register_on_joinplayer(function(player)
--minetest will emerge the area and load the objects, which then will call reattach_all().
--because player is in mapping, it will not be subject to dying.
player:setpos(train.last_pos_prev)
end
end
minetest.register_on_joinplayer(function()
return advtrains.pcall(function()
--independent of this, cause all wagons of the train which are loaded to reattach their players
--needed because already loaded wagons won't call reattach_all()
for _,wagon in pairs(minetest.luaentities) do
@ -105,10 +120,10 @@ minetest.register_on_joinplayer(function(player)
wagon:reattach_all()
end
end
end
end)
end)
minetest.register_on_dieplayer(function(player)
return advtrains.pcall(function()
local pname=player:get_player_name()