advtrains_portable_remote_c.../init.lua

263 lines
9.3 KiB
Lua
Executable File

local modname = minetest.get_current_modname()
local function trans(st,...)
return minetest.translate(modname,st,...)
end
local function show_formspec(itemstack,pname)
local formspec = ""
formspec = formspec.."formspec_version[3]"
formspec = formspec.."size[10.5,7.5]"
formspec = formspec.."label[0.2,0.4;"..trans("Advanced Trains Remote Control v1").."]"
formspec = formspec.."button_exit[6.6,0.2;3.7,0.8;bind_train;"..trans("Bind To New Train").."]"
local item_meta = itemstack:get_meta()
local loco_id = item_meta:get("bound_loco")
if not loco_id then
formspec = formspec.."label[0.2,1;"..trans("Remote Control: Not Bound").."]"
formspec = formspec.."label[0.2,1.4;"..trans("Punch a locomotive with the controller to bind it").."]"
else
local train_id = advtrains.wagons[loco_id].train_id --ref to train for atc controls etc
local train = advtrains.trains[train_id] -- train object
formspec = formspec.."label[0.2,1;"..trans("Roadnumber")..": %s]"
formspec = formspec.."label[0.2,1.4;"..trans("Remote Control: Train").." %s]"
formspec = formspec.."label[0.2,1.8;"..trans("Train Length")..": %s wagon(s)]"
formspec = formspec.."label[0.2,2.2;"..trans("Train Length")..": %sm]"
formspec = formspec.."textarea[0.2,2.9;5.8,0.8;ext_disp;"..trans("External Display")..";%s]"
formspec = formspec.."textarea[0.2,4.1;5.8,0.8;int_disp;"..trans("Internal Display")..";%s]"
formspec = formspec.."field[0.2,6.5;2.8,0.8;line;"..trans("Line")..";%s]"
formspec = formspec.."field[0.2,5.3;5.8,0.8;rc;"..trans("Routing Code")..";%s]"
formspec = formspec.."button[3.2,6.5;2.8,0.8;update_info;"..trans("Update Train Info").."]"
formspec = formspec.."label[6.6,1.6;"..trans("Maximum Speed")..": %s m/s]"
formspec = formspec.."field[6.6,2.9;1.9,0.8;speed_input;"..trans("Set Speed")..";%d]"
formspec = formspec.."button[8.8,2.9;1.5,0.8;send_speed;"..trans("Confirm").."]"
formspec = formspec.."field[6.6,4.1;1.9,0.8;atc_input;"..trans("Send ATC Command")..";]"
formspec = formspec.."button[8.8,4.1;1.5,0.8;send_atc;"..trans("Send").."]"
formspec = formspec.."button[6.6,5.3;3.7,0.8;reverse;"..trans("Reverse").."]"
formspec = formspec.."label[6.6,2;"..trans("Door Control").."]"
formspec = formspec.."scrollbaroptions[min=1;max=3;smallstep=1;largestep=1;thumbsize=1;arrows=hide]scrollbar[6.6,2.2;3.7,0.2;horizontal;door;%d]"
formspec = formspec.."checkbox[6.6,6.6;ars_disable;"..trans("Disable ARS")..";%s]"
formspec = formspec.."checkbox[6.6,7.1;autocouple;"..trans("Autocouple")..";%s]"
formspec = formspec.."button[9.1,6.5;1.2,0.8;estop;"..trans("STOP!").."]"
formspec = string.format(formspec,
minetest.formspec_escape(item_meta:get("roadnumber") or trans("Unidentified Locomotive")),
train_id,
#train.trainparts,
train.trainlen,
minetest.formspec_escape(train.text_outside or ""),
minetest.formspec_escape(train.text_inside or ""),
minetest.formspec_escape(train.line or ""),
minetest.formspec_escape(train.routingcode or ""),
train.max_speed,
train.velocity,
((train.door_open or 0) + 2),
tostring(train.ars_disable),
tostring(train.autocouple or train.atc_wait_autocouple)
)
end
minetest.show_formspec(pname,modname..":controller",formspec)
end
minetest.register_on_player_receive_fields(function(player,formname,fields)
if formname ~= modname..":controller" then return end
local pname = player:get_player_name()
if not pname then return end
local itemstack = player:get_wielded_item()
if itemstack:get_name() ~= modname..":remote_control" then return end
local item_meta = itemstack:get_meta()
--bind train
if fields.bind_train then
item_meta:set_string("bound_loco","")
item_meta:set_string("roadnumber","")
item_meta:set_string("description",trans("Unbound Controller"))
player:set_wielded_item(itemstack)
minetest.chat_send_player(pname,trans("Punch a locomotive with the controller to bind it"))
return
end
local loco_id = item_meta:get("bound_loco")
if loco_id then
--[[list of fields:
active fields:
bind_train
update_info
send_speed
send_atc
reverse
door
ars_disable
autocouple
estop
data fields:
ext_disp
int_disp
line
rc
speed_input
atc_input
--]]
local wagon = advtrains.wagons[loco_id] -- wagon_object for potential use later
local train_id = wagon.train_id
local train = advtrains.trains[train_id]
--update info
local door_scroll = minetest.explode_scrollbar_event(fields.door)
if fields.update_info then
train.text_outside = fields.ext_disp or ""
train.text_inside = fields.int_disp or ""
train.line = fields.line or ""
train.routingcode = fields.rc or ""
minetest.after(0, advtrains.invalidate_path, train_id)
return
--send speed command
elseif fields.send_speed then
local current_v,speed_input = train.velocity,tonumber(fields.speed_input)
if not tonumber(speed_input) then
minetest.chat_send_player(pname,trans("Speed must be a number"))
return
end
local command
local acc
speed_input = tonumber(speed_input)
if current_v == speed_input then
minetest.chat_send_player(pname,trans("Speed unchanged"))
return
elseif current_v < speed_input then
command = "S"..speed_input
acc = "accelerating"
elseif current_v > speed_input then
command = "B"..speed_input
acc = "braking"
end
advtrains.atc.train_set_command(train,command,true)
minetest.chat_send_player(pname,trans("Train "..acc.." to "..speed_input))
return
--send atc command
elseif fields.send_atc then
if fields.atc_input == "" then
minetest.chat_send_player(pname,trans("No ATC command to send"))
return
end
advtrains.atc.train_set_command(train,fields.atc_input,true)
return
-- send reverse command
elseif fields.reverse then
if train.velocity ~= 0 then
minetest.chat_send_player(pname,trans("Please stop the train before reversing"))
return
end
advtrains.invert_train(train_id)
advtrains.train_ensure_init(train_id,train)
-- advtrains.atc.train_reset_command(train)
minetest.chat_send_player(pname,trans("Train reversed"))
return
--door control
elseif door_scroll.type == "CHG" then
train.door_open = door_scroll.value-2
return
-- ars_disable
elseif fields.ars_disable then
if not advtrains.interlocking then
return
end
advtrains.interlocking.ars_set_disable(train,minetest.is_yes(fields.ars_disable))
return
-- autocouple
elseif fields.autocouple == "true" then
train.autocouple = true
return
elseif fields.autocouple == "false" then
train.autocouple = nil
return
-- emergency stop button
elseif fields.estop then
advtrains.atc.train_set_command(train,"BB",true)
minetest.chat_send_player(pname,trans("Emergency Brake applied"))
return
end
end
end)
minetest.register_craftitem(modname..":remote_control",{
description = trans("Unbound Controller"),
short_description = trans("Unbound Train Controller"),
groups = {},
inventory_image = "advtrains_rc_controller.png",
wield_image = "advtrains_rc_controller.png",
stack_max = 1,
on_use = function(itemstack, user, pointed_thing)
local pname = user:get_player_name()
if not pname or pname == "" then
return
end
if not minetest.check_player_privs(pname, {train_admin=true}) then
minetest.chat_send_player(pname, trans("Insufficient privileges to use this!"))
return
end
local meta = itemstack:get_meta()
local bound_loco = meta:get_string("bound_loco") -- set to nil to enable bind-mode
if bound_loco == "" then bound_loco = nil end
if not bound_loco then -- start the search for a locomotive
if pointed_thing.type == "object" then
local object = pointed_thing.ref:get_luaentity()
if not object.id then
return
end
local data = advtrains.wagons[object.id]
if not data then
minetest.chat_send_player(pname,trans("This isn't even a train."))
return
else
local wagon = advtrains.wagon_prototypes[data.type or data.entity_name]
if not wagon then
minetest.chat_send_player(pname,trans("Wagon '@1' couldn't be found.",data.type))
return
else
if wagon.is_locomotive then -- bind to this locomotive
meta:set_string("bound_loco",object.id)
meta:set_string("roadnumber",data.roadnumber or "")
meta:set_string("description",trans("Bound Controller"))
else
minetest.chat_send_player(pname,trans("You can only bind the controller to locomotives"))
return
end
end
end
end
else
if not advtrains.wagons[bound_loco] then --loco has been removed from the world. set to unbound
meta:set_string("bound_loco","")
meta:set_string("roadnumber","")
meta:set_string("description",trans("Unbound Controller"))
minetest.chat_send_player(pname,trans("The locomotive has been removed from the world. Controller is unbound"))
return itemstack
end
if meta:get("roadnumber") ~= advtrains.wagons[bound_loco].roadnumber then --update roadnumber for item description
meta:set_string("roadnumber",advtrains.wagons[bound_loco].roadnumber)
end
end
show_formspec(itemstack,pname)
return itemstack
end,
})
minetest.register_craft({
output = modname..":remote_control",
recipe = {
{"default:mese_crystal_fragment","default:diamond","default:copper_ingot"},
{"steel_ingot","advtrains_luaautomation:oppanel","steel_ingot"},
{"","default:steel_ingot",""},
}
})