123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- 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",""},
- }
- })
|