110 lines
2.9 KiB
Lua
110 lines
2.9 KiB
Lua
--trainhud.lua: holds all the code for train controlling
|
|
|
|
advtrains.hud = {}
|
|
|
|
minetest.register_on_leaveplayer(function(player)
|
|
advtrains.hud[player:get_player_name()] = nil
|
|
end)
|
|
|
|
local mletter={[1]="F", [-1]="R", [0]="N"}
|
|
|
|
function advtrains.on_control_change(pc, train, flip)
|
|
if pc.sneak then
|
|
if pc.up then
|
|
train.tarvelocity = advtrains.all_traintypes[train.traintype].max_speed or 10
|
|
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
|
|
if pc.jump then
|
|
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
|
|
end
|
|
--shift+use:see wagons.lua
|
|
else
|
|
if pc.up then
|
|
train.tarvelocity = train.tarvelocity + 1
|
|
end
|
|
if pc.down then
|
|
if train.velocity>0 then
|
|
train.tarvelocity = math.max(train.tarvelocity - 1, 0)
|
|
else
|
|
train.movedir = -train.movedir
|
|
end
|
|
end
|
|
if train.brake_hold_state~=2 then
|
|
train.brake = false
|
|
end
|
|
if pc.jump then
|
|
train.brake = true
|
|
end
|
|
if pc.aux1 then
|
|
--horn
|
|
end
|
|
end
|
|
end
|
|
function advtrains.update_driver_hud(pname, train, flip)
|
|
advtrains.set_trainhud(pname, advtrains.hud_train_format(train, flip))
|
|
end
|
|
function advtrains.clear_driver_hud(pname)
|
|
advtrains.set_trainhud(pname, "")
|
|
end
|
|
|
|
function advtrains.set_trainhud(name, text)
|
|
local hud = advtrains.hud[name]
|
|
local player=minetest.get_player_by_name(name)
|
|
if not player then
|
|
return
|
|
end
|
|
if not hud then
|
|
hud = {}
|
|
advtrains.hud[name] = hud
|
|
hud.id = player:hud_add({
|
|
hud_elem_type = "text",
|
|
name = "ADVTRAINS",
|
|
number = 0xFFFFFF,
|
|
position = {x=0.5, y=0.7},
|
|
offset = {x=0, y=0},
|
|
text = text,
|
|
scale = {x=200, y=60},
|
|
alignment = {x=0, y=0},
|
|
})
|
|
hud.oldText=text
|
|
return
|
|
elseif hud.oldText ~= text then
|
|
player:hud_change(hud.id, "text", text)
|
|
hud.oldText=text
|
|
end
|
|
end
|
|
function advtrains.hud_train_format(train, flip)
|
|
local fct=flip and -1 or 1
|
|
if not train or not train.traintype then return "" end
|
|
|
|
local max=advtrains.all_traintypes[train.traintype].max_speed or 10
|
|
local vel=advtrains.abs_ceil(train.velocity)
|
|
local tvel=advtrains.abs_ceil(train.tarvelocity)
|
|
local topLine, firstLine, secondLine
|
|
|
|
topLine=train.traintype.." ["..mletter[fct*train.movedir].."] "..(train.brake and "="..( train.brake_hold_state==2 and "^" or "" ).."B=" or "")
|
|
firstLine="Speed: |"..string.rep("+", vel)..string.rep("_", max-vel)..">"
|
|
secondLine="Target: |"..string.rep("+", tvel)..string.rep("_", max-tvel)..">"
|
|
|
|
return topLine.."\n"..firstLine.."\n"..secondLine
|
|
end
|