2016-11-24 11:25:07 -08:00
|
|
|
--trainhud.lua: holds all the code for train controlling
|
|
|
|
|
2016-05-29 11:27:30 -07:00
|
|
|
advtrains.hud = {}
|
2018-01-07 11:41:48 -08:00
|
|
|
advtrains.hhud = {}
|
2016-05-29 11:27:30 -07:00
|
|
|
|
|
|
|
minetest.register_on_leaveplayer(function(player)
|
|
|
|
advtrains.hud[player:get_player_name()] = nil
|
2018-01-07 11:41:48 -08:00
|
|
|
advtrains.hhud[player:get_player_name()] = nil
|
2016-05-29 11:27:30 -07:00
|
|
|
end)
|
|
|
|
|
2016-11-24 11:25:07 -08:00
|
|
|
local mletter={[1]="F", [-1]="R", [0]="N"}
|
|
|
|
|
|
|
|
function advtrains.on_control_change(pc, train, flip)
|
2017-08-01 04:45:05 -07:00
|
|
|
local maxspeed = train.max_speed or 10
|
2016-11-24 11:25:07 -08:00
|
|
|
if pc.sneak then
|
|
|
|
if pc.up then
|
2017-08-01 04:45:05 -07:00
|
|
|
train.tarvelocity = maxspeed
|
2016-11-24 11:25:07 -08:00
|
|
|
end
|
|
|
|
if pc.down then
|
|
|
|
train.tarvelocity = 0
|
|
|
|
end
|
|
|
|
if pc.left then
|
|
|
|
train.tarvelocity = 4
|
|
|
|
end
|
|
|
|
if pc.right then
|
|
|
|
train.tarvelocity = 8
|
|
|
|
end
|
2018-10-17 10:10:37 -07:00
|
|
|
--[[if pc.jump then
|
2016-11-24 11:25:07 -08:00
|
|
|
train.brake = true
|
|
|
|
--0: released, 1: brake and pressed, 2: released and brake, 3: pressed and brake
|
|
|
|
if not train.brake_hold_state or train.brake_hold_state==0 then
|
|
|
|
train.brake_hold_state = 1
|
|
|
|
elseif train.brake_hold_state==2 then
|
|
|
|
train.brake_hold_state = 3
|
|
|
|
end
|
|
|
|
elseif train.brake_hold_state==1 then
|
|
|
|
train.brake_hold_state = 2
|
|
|
|
elseif train.brake_hold_state==3 then
|
|
|
|
train.brake = false
|
|
|
|
train.brake_hold_state = 0
|
2018-10-17 10:10:37 -07:00
|
|
|
end]]
|
2016-11-24 11:56:23 -08:00
|
|
|
--shift+use:see wagons.lua
|
2016-11-24 11:25:07 -08:00
|
|
|
else
|
2018-01-07 11:41:48 -08:00
|
|
|
local act=false
|
|
|
|
if pc.jump then
|
2018-10-10 12:49:52 -07:00
|
|
|
train.ctrl.user = 1
|
2018-01-07 11:41:48 -08:00
|
|
|
act=true
|
2016-11-24 11:25:07 -08:00
|
|
|
end
|
2018-10-17 10:10:37 -07:00
|
|
|
-- If atc command set, only "Jump" key can clear command. To prevent accidental control.
|
|
|
|
if train.tarvelocity or train.atc_command then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
if pc.up then
|
|
|
|
train.ctrl.user=4
|
|
|
|
act=true
|
|
|
|
end
|
2016-11-24 11:25:07 -08:00
|
|
|
if pc.down then
|
|
|
|
if train.velocity>0 then
|
2018-01-07 11:41:48 -08:00
|
|
|
if pc.jump then
|
2018-10-10 12:49:52 -07:00
|
|
|
train.ctrl.user = 0
|
2018-01-07 11:41:48 -08:00
|
|
|
else
|
2018-10-10 12:49:52 -07:00
|
|
|
train.ctrl.user = 2
|
2018-01-07 11:41:48 -08:00
|
|
|
end
|
|
|
|
act=true
|
2016-11-24 11:25:07 -08:00
|
|
|
else
|
2018-04-26 14:35:19 -07:00
|
|
|
advtrains.invert_train(train.id)
|
2018-10-17 09:58:57 -07:00
|
|
|
advtrains.atc.train_reset_command(train)
|
2016-11-24 11:25:07 -08:00
|
|
|
end
|
|
|
|
end
|
2017-01-18 10:03:27 -08:00
|
|
|
if pc.left then
|
|
|
|
if train.door_open ~= 0 then
|
|
|
|
train.door_open = 0
|
|
|
|
else
|
2018-04-23 06:51:50 -07:00
|
|
|
train.door_open = -1
|
2017-01-18 10:03:27 -08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
if pc.right then
|
|
|
|
if train.door_open ~= 0 then
|
|
|
|
train.door_open = 0
|
|
|
|
else
|
2018-04-23 06:51:50 -07:00
|
|
|
train.door_open = 1
|
2017-01-18 10:03:27 -08:00
|
|
|
end
|
|
|
|
end
|
2018-10-10 12:49:52 -07:00
|
|
|
if not act then
|
|
|
|
train.ctrl.user = nil
|
|
|
|
end
|
2016-11-24 11:25:07 -08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
function advtrains.update_driver_hud(pname, train, flip)
|
2017-03-30 12:51:45 -07:00
|
|
|
local inside=train.text_inside or ""
|
2020-12-19 09:15:02 -08:00
|
|
|
local ft, ht = advtrains.hud_train_format(train, flip)
|
|
|
|
advtrains.set_trainhud(pname, inside.."\n"..ft, ht)
|
2016-11-24 11:25:07 -08:00
|
|
|
end
|
|
|
|
function advtrains.clear_driver_hud(pname)
|
|
|
|
advtrains.set_trainhud(pname, "")
|
|
|
|
end
|
|
|
|
|
2020-12-19 09:15:02 -08:00
|
|
|
function advtrains.set_trainhud(name, text, driver)
|
2016-05-29 11:27:30 -07:00
|
|
|
local hud = advtrains.hud[name]
|
|
|
|
local player=minetest.get_player_by_name(name)
|
2016-10-05 06:27:16 -07:00
|
|
|
if not player then
|
|
|
|
return
|
|
|
|
end
|
2020-12-19 09:15:02 -08:00
|
|
|
local driverhud = {
|
|
|
|
hud_elem_type = "image",
|
|
|
|
name = "ADVTRAINS_DRIVER",
|
|
|
|
position = {x=0.5, y=0.7},
|
|
|
|
offset = {x=0,y=5},
|
|
|
|
text = driver or "advtrains_hud_blank.png",
|
|
|
|
alignment = {x=0,y=1},
|
|
|
|
scale = {x=1,y=1},}
|
2016-05-29 11:27:30 -07:00
|
|
|
if not hud then
|
2020-12-19 09:15:02 -08:00
|
|
|
hud = {["driver"]={}}
|
2016-05-29 11:27:30 -07:00
|
|
|
advtrains.hud[name] = hud
|
|
|
|
hud.id = player:hud_add({
|
|
|
|
hud_elem_type = "text",
|
|
|
|
name = "ADVTRAINS",
|
|
|
|
number = 0xFFFFFF,
|
|
|
|
position = {x=0.5, y=0.7},
|
2020-12-19 09:15:02 -08:00
|
|
|
offset = {x=0, y=-5},
|
2016-05-29 11:27:30 -07:00
|
|
|
text = text,
|
|
|
|
scale = {x=200, y=60},
|
2020-12-19 09:15:02 -08:00
|
|
|
alignment = {x=0, y=-1},
|
2016-05-29 11:27:30 -07:00
|
|
|
})
|
|
|
|
hud.oldText=text
|
2020-12-19 09:15:02 -08:00
|
|
|
hud.driver = player:hud_add(driverhud)
|
|
|
|
else
|
|
|
|
if hud.oldText ~= text then
|
|
|
|
player:hud_change(hud.id, "text", text)
|
|
|
|
hud.oldText=text
|
|
|
|
end
|
|
|
|
if hud.driver then
|
|
|
|
player:hud_change(hud.driver, "text", driver or "advtrains_hud_blank.png")
|
|
|
|
elseif driver then
|
|
|
|
hud.driver = player:hud_add(driverhud)
|
|
|
|
end
|
2016-05-29 11:27:30 -07:00
|
|
|
end
|
|
|
|
end
|
2020-12-19 09:15:02 -08:00
|
|
|
|
2018-01-07 11:41:48 -08:00
|
|
|
function advtrains.set_help_hud(name, text)
|
|
|
|
local hud = advtrains.hhud[name]
|
|
|
|
local player=minetest.get_player_by_name(name)
|
|
|
|
if not player then
|
|
|
|
return
|
|
|
|
end
|
|
|
|
if not hud then
|
|
|
|
hud = {}
|
|
|
|
advtrains.hhud[name] = hud
|
|
|
|
hud.id = player:hud_add({
|
|
|
|
hud_elem_type = "text",
|
|
|
|
name = "ADVTRAINS_HELP",
|
|
|
|
number = 0xFFFFFF,
|
|
|
|
position = {x=1, y=0.3},
|
|
|
|
offset = {x=0, y=0},
|
|
|
|
text = text,
|
|
|
|
scale = {x=200, y=60},
|
|
|
|
alignment = {x=1, y=0},
|
|
|
|
})
|
|
|
|
hud.oldText=text
|
|
|
|
return
|
|
|
|
elseif hud.oldText ~= text then
|
|
|
|
player:hud_change(hud.id, "text", text)
|
|
|
|
hud.oldText=text
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
--train.lever:
|
|
|
|
--Speed control lever in train, for new train control system.
|
|
|
|
--[[
|
|
|
|
Value Disp Control Meaning
|
|
|
|
0 BB S+Space Emergency Brake
|
|
|
|
1 B Space Normal Brake
|
|
|
|
2 - S Roll
|
|
|
|
3 o <none> Stay at speed
|
|
|
|
4 + W Accelerate
|
|
|
|
]]
|
|
|
|
|
2016-05-29 11:27:30 -07:00
|
|
|
function advtrains.hud_train_format(train, flip)
|
2016-12-22 09:55:10 -08:00
|
|
|
if not train then return "" end
|
2016-11-24 11:25:07 -08:00
|
|
|
|
2018-10-10 14:17:31 -07:00
|
|
|
local max = train.max_speed or 10
|
2020-12-19 04:32:38 -08:00
|
|
|
local res = train.speed_restriction
|
2018-10-10 14:17:31 -07:00
|
|
|
local vel = advtrains.abs_ceil(train.velocity)
|
2017-07-15 08:04:08 -07:00
|
|
|
local vel_kmh=advtrains.abs_ceil(advtrains.ms_to_kmh(train.velocity))
|
2018-01-07 11:41:48 -08:00
|
|
|
|
2020-12-19 09:15:02 -08:00
|
|
|
local levers = {
|
|
|
|
[0] = "advtrains_hud_red.png^advtrains_hud_emg.png",
|
|
|
|
"advtrains_hud_orange.png^advtrains_hud_b2.png",
|
|
|
|
"advtrains_hud_orange.png^advtrains_hud_b1.png",
|
|
|
|
"advtrains_hud_gray.png^advtrains_hud_n.png",
|
|
|
|
"advtrains_hud_blue.png^advtrains_hud_p.png"}
|
2018-01-07 11:41:48 -08:00
|
|
|
local tlev=train.lever
|
|
|
|
if train.velocity==0 and not train.active_control then tlev=1 end
|
2020-12-19 04:32:38 -08:00
|
|
|
|
|
|
|
local st = {}
|
|
|
|
if train.debug then st = {train.debug} end
|
2018-10-10 12:49:52 -07:00
|
|
|
|
2020-12-19 10:40:13 -08:00
|
|
|
local ht = ("[combine:100x110:0,0=(%s):50,0=(%s):0,22=(%s):50,22=(%s):0,44=(%s):50,44=(%s):0,66=advtrains_hud_speed_bg.png"
|
|
|
|
..":%d,77=(advtrains_hud_speed_ind.png%s)"):format(
|
2020-12-19 09:15:02 -08:00
|
|
|
("advtrains_hud_blue.png^advtrains_hud_%s.png"):format(flip and "r" or "f"),
|
|
|
|
levers[tlev or 32767] or "advtrains_hud_gray.png^advtrains_hud_na.png",
|
|
|
|
(train.tarvelocity or train.atc_command)
|
|
|
|
and "advtrains_hud_blue.png^advtrains_hud_atc.png"
|
|
|
|
or (train.ctrl.lzb and "advtrains_hud_red.png^advtrains_hud_lzb.png" or "advtrains_hud_gray.png^advtrains_hud_man.png"),
|
|
|
|
train.is_shunt and "advtrains_hud_orange.png^advtrains_hud_shunt.png" or "advtrains_hud_gray.png^advtrains_hud_shunt.png",
|
|
|
|
train.door_open == -1 and "advtrains_hud_blue.png^advtrains_hud_l_right.png" or "advtrains_hud_gray.png^advtrains_hud_l_right.png",
|
2020-12-19 10:40:13 -08:00
|
|
|
train.door_open == 1 and "advtrains_hud_blue.png^advtrains_hud_r.png" or "advtrains_hud_gray.png^advtrains_hud_r.png",
|
|
|
|
vel*4.85, (res and res>=0) and "" or "^[resize\\:3x22")
|
|
|
|
local si = {}
|
|
|
|
if max < 20 then
|
|
|
|
si[#si+1] = ("%d,77=(advtrains_hud_speed_max.png^[resize\\:%dx22)"):format(max*5,100-max*5)
|
2018-10-10 12:49:52 -07:00
|
|
|
end
|
2020-12-19 10:40:13 -08:00
|
|
|
if res and res>=0 then
|
|
|
|
si[#si+1] = ("%d,88=advtrains_hud_speed_limit.png"):format(res*4.85)
|
|
|
|
end
|
|
|
|
if train.tarvelocity then
|
|
|
|
si[#si+1] = ("%d,66=advtrains_hud_speed_atc.png"):format(train.tarvelocity*4.85)
|
2018-10-10 14:31:12 -07:00
|
|
|
end
|
2020-06-14 03:02:48 -07:00
|
|
|
local lzb = train.lzb
|
2020-12-19 10:40:13 -08:00
|
|
|
if lzb and lzb.oncoming then
|
|
|
|
for i = 1, #lzb.oncoming do
|
|
|
|
local k = lzb.oncoming[i]
|
|
|
|
if k.spd and k.spd >= 0 then
|
|
|
|
si[#si+1] = ("%d,102=advtrains_hud_speed_next.png"):format(k.spd*4.85)
|
|
|
|
break
|
|
|
|
end
|
2020-06-14 03:02:48 -07:00
|
|
|
end
|
|
|
|
end
|
2016-11-24 11:25:07 -08:00
|
|
|
|
2020-12-19 10:40:13 -08:00
|
|
|
if res and res == 0 then
|
|
|
|
st[#st+1] = attrans("OVERRUN RED SIGNAL! Examine situation and reverse train to move again.")
|
|
|
|
end
|
|
|
|
|
|
|
|
if train.atc_command then
|
|
|
|
st[#st+1] = ("ATC: %s%s"):format(train.atc_delay and advtrains.abs_ceil(train.atc_delay).."s " or "", train.atc_command or "")
|
|
|
|
end
|
|
|
|
|
|
|
|
return table.concat(st,"\n"), #si>0 and ht..":"..table.concat(si,":") or ht
|
2016-10-05 06:27:16 -07:00
|
|
|
end
|