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/helpers.lua | 1 + advtrains/init.lua | 14 ++- advtrains_interlocking/tsr_rail.lua | 1 + advtrains_line_automation/init.lua | 5 +- advtrains_line_automation/stoprail.lua | 155 ++++++++++++++++++++++++++++++--- 5 files changed, 163 insertions(+), 13 deletions(-) diff --git a/advtrains/helpers.lua b/advtrains/helpers.lua index 511d32e..3514f55 100644 --- a/advtrains/helpers.lua +++ b/advtrains/helpers.lua @@ -381,6 +381,7 @@ end -- decodes a position encoded with encode_pos function advtrains.decode_pos(pts) + if not pts or not #pts==6 then return nil end local stry = string.sub(pts, 1,4) local strx = string.sub(pts, 5,8) local strz = string.sub(pts, 9,12) diff --git a/advtrains/init.lua b/advtrains/init.lua index 21b414e..8173a22 100644 --- a/advtrains/init.lua +++ b/advtrains/init.lua @@ -196,7 +196,7 @@ dofile(advtrains.modpath.."/passive.lua") --load/save -- backup variables, used if someone should accidentally delete a sub-mod -local MDS_interlocking +local MDS_interlocking, MDS_lines advtrains.fpath=minetest.get_worldpath().."/advtrains" @@ -226,6 +226,11 @@ function advtrains.avt_load() else MDS_interlocking = tbl.interlocking end + if advtrains.lines then + advtrains.lines.load(tbl.lines) + else + MDS_lines = tbl.lines + end --remove wagon_save entries that are not part of a train local todel=advtrains.merge_tables(advtrains.wagon_save) for tid, train in pairs(advtrains.trains) do @@ -327,6 +332,12 @@ advtrains.avt_save = function(remove_players_from_wagons) else il_save = MDS_interlocking end + local ln_save + if advtrains.lines then + ln_save = advtrains.lines.save() + else + ln_save = MDS_lines + end local save_tbl={ trains = tmp_trains, wagon_save = advtrains.wagons, @@ -334,6 +345,7 @@ advtrains.avt_save = function(remove_players_from_wagons) atc = advtrains.atc.save_data(), ndb = advtrains.ndb.save_data(), interlocking = il_save, + lines = ln_save, version = 2, } local datastr = minetest.serialize(save_tbl) diff --git a/advtrains_interlocking/tsr_rail.lua b/advtrains_interlocking/tsr_rail.lua index 253298c..90e8101 100644 --- a/advtrains_interlocking/tsr_rail.lua +++ b/advtrains_interlocking/tsr_rail.lua @@ -1,6 +1,7 @@ -- tsr_rail.lua -- Point speed restriction rails -- Simple rail whose only purpose is to place a TSR on the position, as a temporary solution until the timetable system covers everything. +-- This code resembles the code in lines/stoprail.lua local function updateform(pos) local meta = minetest.get_meta(pos) 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