From 9da148347d304ec2f26af6f813e26cb02bc6a6e7 Mon Sep 17 00:00:00 2001 From: orwell96 Date: Thu, 24 Jan 2019 17:50:26 +0100 Subject: Basic functions of "stop rail", missing ARS rules and signal. For signal, need to think of a callback system for signals and moving atlatc queue to core? --- advtrains_line_automation/init.lua | 5 +- advtrains_line_automation/stoprail.lua | 155 ++++++++++++++++++++++++++++++--- 2 files changed, 148 insertions(+), 12 deletions(-) (limited to 'advtrains_line_automation') diff --git a/advtrains_line_automation/init.lua b/advtrains_line_automation/init.lua index 77e66b3..5609524 100644 --- a/advtrains_line_automation/init.lua +++ b/advtrains_line_automation/init.lua @@ -1,14 +1,15 @@ -- Advtrains line automation system advtrains.lines = { - -- [station code] = {name=...} + -- [station code] = {name=..., owner=...} stations = {}, --[[ [new pos hash] = { stn = , - platform = , + track = , doors = wait = + reverse = signal = }]] stops = {}, diff --git a/advtrains_line_automation/stoprail.lua b/advtrains_line_automation/stoprail.lua index b4c8d7d..7ddcec6 100644 --- a/advtrains_line_automation/stoprail.lua +++ b/advtrains_line_automation/stoprail.lua @@ -2,31 +2,166 @@ -- adds "stop rail". Recognized by lzb. (part of behavior is implemented there) +local function updatemeta(pos) + local meta = minetest.get_meta(pos) + local pe = advtrains.encode_pos(pos) + local stdata = advtrains.lines.stops[pe] + if not stdata then + meta:set_string("infotext", "Error") + end + + meta:set_string("infotext", "Stn. "..stdata.stn.." T. "..stdata.track) +end + +local door_dropdown = {L=1, R=2, C=3} +local door_dropdown_rev = {Right="R", Left="L", Closed="C"} + +local function show_stoprailform(pos, player) + local pe = advtrains.encode_pos(pos) + local pname = player:get_player_name() + if minetest.is_protected(pos, pname) then + minetest.chat_send_player(pname, "Position is protected!") + return + end + + local stdata = advtrains.lines.stops[pe] + if not stdata then + advtrains.lines.stops[pe] = { + stn="", track="", doors="R", wait=10 + } + stdata = advtrains.lines.stops[pe] + end + + local stn = advtrains.lines.stations[stdata.stn] + local stnname = stn and stn.name or "" + + local form = "size[8,6.5]" + form = form.."field[0.5,1;7,1;stn;"..attrans("Station Code")..";"..minetest.formspec_escape(stdata.stn).."]" + form = form.."field[0.5,2;7,1;stnname;"..attrans("Station Name")..";"..minetest.formspec_escape(stnname).."]" + + + form = form.."label[0.5,3;Door side:]" + form = form.."dropdown[0.5,3.5;2;doors;Left,Right,Closed;"..door_dropdown[stdata.doors].."]" + form = form.."dropdown[3,3.5;1.5;reverse;---,Reverse;"..(stdata.reverse and 2 or 1).."]" + + form = form.."field[5,3.5;2,1;track;"..attrans("Track")..";"..stdata.track.."]" + form = form.."field[5,4.5;2,1;wait;"..attrans("Stop Time")..";"..stdata.wait.."]" + + form = form.."button[0.5,5.5;7,1;save;"..attrans("Save").."]" + + minetest.show_formspec(pname, "at_lines_stop_"..pe, form) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local pname = player:get_player_name() + local pe = string.match(formname, "^at_lines_stop_(............)$") + local pos = advtrains.decode_pos(pe) + if pos then + if minetest.is_protected(pos, pname) then + minetest.chat_send_player(pname, "Position is protected!") + return + end + + local stdata = advtrains.lines.stops[pe] + if fields.save then + if fields.stn and stdata.stn ~= fields.stn then + if fields.stn ~= "" then + local stn = advtrains.lines.stations[fields.stn] + if stn then + if (stn.owner == pname or minetest.check_player_privs(pname, "train_admin")) then + stdata.stn = fields.stn + else + minetest.chat_send_player(pname, "Station code '"..fields.stn.."' does already exist and is owned by "..stn.owner) + end + else + advtrains.lines.stations[fields.stn] = {name = fields.stnname, owner = pname} + stdata.stn = fields.stn + end + end + updatemeta(pos) + show_stoprailform(pos, player) + return + end + local stn = advtrains.lines.stations[stdata.stn] + if fields.stnname and fields.stnname ~= stn.name then + if (stn.owner == pname or minetest.check_player_privs(pname, "train_admin")) then + stn.name = fields.stnname + else + minetest.chat_send_player(pname, "Not allowed to edit station name, owned by "..stn.owner) + end + end + + -- dropdowns + if fields.doors then + stdata.doors = door_dropdown_rev[fields.doors] or "C" + end + if fields.reverse then + stdata.reverse = fields.reverse == "Reverse" + end + + + if fields.track then + stdata.track = fields.track + end + if fields.wait then + stdata.wait = tonumber(fields.wait) or 10 + end + + + --TODO: signal + updatemeta(pos) + show_stoprailform(pos, player) + end + end + +end) + + local adefunc = function(def, preset, suffix, rotation) return { after_place_node=function(pos) - + local pe = advtrains.encode_pos(pos) + advtrains.lines.stops[pe] = { + stn="", track="", doors="R", wait=10 + } + updatemeta(pos) end, after_dig_node=function(pos) - + local pe = advtrains.encode_pos(pos) + advtrains.lines.stops[pe] = nil end, - on_receive_fields = function(pos, formname, fields, player) - + on_rightclick = function(pos, node, player) + show_stoprailform(pos, player) end, advtrains = { - on_train_enter = function(pos, train_id) - local train = advtrains.trains[train_id] - --advtrains.atc.train_set_command(train, "B0 OR D8 OC D1", true) - end, on_train_approach = function(pos,train_id, train, index) - advtrains.interlocking.lzb_add_oncoming_npr(train, index, 2) + if train.path_cn[index] == 1 then + advtrains.interlocking.lzb_add_oncoming_npr(train, index, 2) + end end, + on_train_enter = function(pos, train_id) + local train = advtrains.trains[train_id] + + local pe = advtrains.encode_pos(pos) + local stdata = advtrains.lines.stops[pe] + if not stdata then + advtrains.atc.train_set_command(train, "B0", true) + updatemeta(pos) + end + + local stn = advtrains.lines.stations[stdata.stn] + local stnname = stn and stn.name or "Unknown Station" + + -- Send ATC command and set text + advtrains.atc.train_set_command(train, "B0 W O"..stdata.doors..(stdata.reverse and "R" or "").." D"..stdata.wait.." OC D1 SM", true) + train.text_inside = stnname + + end }, } end - advtrains.register_tracks("default", { nodename_prefix="advtrains_line_automation:dtrack_stop", texture_prefix="advtrains_dtrack_stop", -- cgit v1.2.3