commit 21be5443709d1c4affc2815fa2097a75833c4218 Author: Maverick2797 Date: Mon Apr 18 11:23:42 2022 +0800 Working Code still need to add translation functions throughout diff --git a/init.lua b/init.lua new file mode 100755 index 0000000..b9187d8 --- /dev/null +++ b/init.lua @@ -0,0 +1,216 @@ +local modname = minetest.get_current_modname() +local function trans(st,...) + return minetest.translate(modname,st,...) +end +local function fs_t(st,...) + return minetest.formspec_escape(trans(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;Advanced Trains Remote Control v1]" + + formspec = formspec.."button_exit[6.6,0.2;3.7,0.8;bind_train;Bind To New Train]" + + local train_id = itemstack:get_meta():get("bound_train") + if not train_id or not advtrains.trains[train_id] then + formspec = formspec.."label[0.2,1.2;Remote Control: Not Bound]" + formspec = formspec.."label[0.2,1.6;Punch a train with the controller to bind it]" + else + formspec = formspec.."label[0.2,1.2;Remote Control: Train %s]" + formspec = formspec.."label[0.2,1.6;Train Length: %s wagon(s)]" + formspec = formspec.."label[0.2,2;Train Length: %sm]" + + formspec = formspec.."textarea[0.2,2.9;5.8,0.8;ext_disp;External Display;%s]" + formspec = formspec.."textarea[0.2,4.1;5.8,0.8;int_disp;Internal Display;%s]" + formspec = formspec.."field[0.2,6.5;2.8,0.8;line;Line;%s]" + formspec = formspec.."field[0.2,5.3;5.8,0.8;rc;Routing Code;%s]" + formspec = formspec.."button[3.2,6.5;2.8,0.8;update_info;Update Train Info]" + + formspec = formspec.."label[6.6,1.6;Maximum Speed: %s m/s]" + formspec = formspec.."field[6.6,2.9;1.9,0.8;speed_input;Set Speed;%d]" + formspec = formspec.."button[8.8,2.9;1.5,0.8;send_speed;Confirm]" + formspec = formspec.."field[6.6,4.1;1.9,0.8;atc_input;Send ATC Command;]" + formspec = formspec.."button[8.8,4.1;1.5,0.8;send_atc;Send]" + formspec = formspec.."button[6.6,5.3;3.7,0.8;reverse;Reverse]" + + formspec = formspec.."label[6.6,2;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;Disable ARS;%s]" + formspec = formspec.."checkbox[6.6,7.1;autocouple;Autocouple;%s]" + + formspec = formspec.."button[9.1,6.5;1.2,0.8;estop;STOP!]" + + local train = advtrains.trains[train_id] + + formspec = string.format(formspec, + train_id, + #train.trainparts, + train.trainlen, + train.text_outside or "", + train.text_inside or "", + train.line or "", + 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() + local train_id = item_meta:get("bound_train") + if not train_id and not fields.bind_train then + return + end + local train = advtrains.trains[train_id] + local door_scroll = minetest.explode_scrollbar_event(fields.door) + --[[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 + --]] + + --bind train + if fields.bind_train then + item_meta:set_string("bound_train","") + item_meta:set_string("description","Unbound Controller") + player:set_wielded_item(itemstack) + minetest.chat_send_player(pname,trans("Punch a train with the controller to bind it")) + return + --update info + elseif 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) + +minetest.register_craftitem(modname..":remote_control",{ + description = trans("Train 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, "Insufficient privileges to use this!") + return + end + + local meta = itemstack:get_meta() + local bound_train = meta:get_string("bound_train") -- set to nil to enable bind-mode + if bound_train == "" then bound_train = nil end + if pointed_thing.type == "object" then + local object = pointed_thing.ref:get_luaentity() + local data = advtrains.wagons[object.id] + if data == nil then return end + if not bound_train then -- bind to this train + meta:set_string("bound_train",data.train_id) + meta:set_string("description",string.format("Train Controller\nBound to %s",data.train_id)) + end + end + show_formspec(itemstack,pname) + return itemstack + end, +}) \ No newline at end of file diff --git a/mod.conf b/mod.conf new file mode 100755 index 0000000..2b1a075 --- /dev/null +++ b/mod.conf @@ -0,0 +1,3 @@ +name=advtrains_portable_remote_control +description=Remote Control for Advtrains +depends=advtrains \ No newline at end of file diff --git a/textures/advtrains_rc_controller.png b/textures/advtrains_rc_controller.png new file mode 100755 index 0000000..0632ca2 Binary files /dev/null and b/textures/advtrains_rc_controller.png differ