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?
This commit is contained in:
parent
2976bae452
commit
9da148347d
|
@ -381,6 +381,7 @@ end
|
||||||
|
|
||||||
-- decodes a position encoded with encode_pos
|
-- decodes a position encoded with encode_pos
|
||||||
function advtrains.decode_pos(pts)
|
function advtrains.decode_pos(pts)
|
||||||
|
if not pts or not #pts==6 then return nil end
|
||||||
local stry = string.sub(pts, 1,4)
|
local stry = string.sub(pts, 1,4)
|
||||||
local strx = string.sub(pts, 5,8)
|
local strx = string.sub(pts, 5,8)
|
||||||
local strz = string.sub(pts, 9,12)
|
local strz = string.sub(pts, 9,12)
|
||||||
|
|
|
@ -196,7 +196,7 @@ dofile(advtrains.modpath.."/passive.lua")
|
||||||
--load/save
|
--load/save
|
||||||
|
|
||||||
-- backup variables, used if someone should accidentally delete a sub-mod
|
-- 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"
|
advtrains.fpath=minetest.get_worldpath().."/advtrains"
|
||||||
|
@ -226,6 +226,11 @@ function advtrains.avt_load()
|
||||||
else
|
else
|
||||||
MDS_interlocking = tbl.interlocking
|
MDS_interlocking = tbl.interlocking
|
||||||
end
|
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
|
--remove wagon_save entries that are not part of a train
|
||||||
local todel=advtrains.merge_tables(advtrains.wagon_save)
|
local todel=advtrains.merge_tables(advtrains.wagon_save)
|
||||||
for tid, train in pairs(advtrains.trains) do
|
for tid, train in pairs(advtrains.trains) do
|
||||||
|
@ -327,6 +332,12 @@ advtrains.avt_save = function(remove_players_from_wagons)
|
||||||
else
|
else
|
||||||
il_save = MDS_interlocking
|
il_save = MDS_interlocking
|
||||||
end
|
end
|
||||||
|
local ln_save
|
||||||
|
if advtrains.lines then
|
||||||
|
ln_save = advtrains.lines.save()
|
||||||
|
else
|
||||||
|
ln_save = MDS_lines
|
||||||
|
end
|
||||||
local save_tbl={
|
local save_tbl={
|
||||||
trains = tmp_trains,
|
trains = tmp_trains,
|
||||||
wagon_save = advtrains.wagons,
|
wagon_save = advtrains.wagons,
|
||||||
|
@ -334,6 +345,7 @@ advtrains.avt_save = function(remove_players_from_wagons)
|
||||||
atc = advtrains.atc.save_data(),
|
atc = advtrains.atc.save_data(),
|
||||||
ndb = advtrains.ndb.save_data(),
|
ndb = advtrains.ndb.save_data(),
|
||||||
interlocking = il_save,
|
interlocking = il_save,
|
||||||
|
lines = ln_save,
|
||||||
version = 2,
|
version = 2,
|
||||||
}
|
}
|
||||||
local datastr = minetest.serialize(save_tbl)
|
local datastr = minetest.serialize(save_tbl)
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
-- tsr_rail.lua
|
-- tsr_rail.lua
|
||||||
-- Point speed restriction rails
|
-- 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.
|
-- 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 function updateform(pos)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
|
|
|
@ -1,14 +1,15 @@
|
||||||
-- Advtrains line automation system
|
-- Advtrains line automation system
|
||||||
|
|
||||||
advtrains.lines = {
|
advtrains.lines = {
|
||||||
-- [station code] = {name=...}
|
-- [station code] = {name=..., owner=...}
|
||||||
stations = {},
|
stations = {},
|
||||||
|
|
||||||
--[[ [new pos hash] = {
|
--[[ [new pos hash] = {
|
||||||
stn = <station code>,
|
stn = <station code>,
|
||||||
platform = <platform identifier>,
|
track = <platform identifier>,
|
||||||
doors = <door side L,R,C>
|
doors = <door side L,R,C>
|
||||||
wait = <least wait time>
|
wait = <least wait time>
|
||||||
|
reverse = <boolean>
|
||||||
signal = <position of signal that is the "exit signal" for this platform>
|
signal = <position of signal that is the "exit signal" for this platform>
|
||||||
}]]
|
}]]
|
||||||
stops = {},
|
stops = {},
|
||||||
|
|
|
@ -2,31 +2,166 @@
|
||||||
-- adds "stop rail". Recognized by lzb. (part of behavior is implemented there)
|
-- 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)
|
local adefunc = function(def, preset, suffix, rotation)
|
||||||
return {
|
return {
|
||||||
after_place_node=function(pos)
|
after_place_node=function(pos)
|
||||||
|
local pe = advtrains.encode_pos(pos)
|
||||||
|
advtrains.lines.stops[pe] = {
|
||||||
|
stn="", track="", doors="R", wait=10
|
||||||
|
}
|
||||||
|
updatemeta(pos)
|
||||||
end,
|
end,
|
||||||
after_dig_node=function(pos)
|
after_dig_node=function(pos)
|
||||||
|
local pe = advtrains.encode_pos(pos)
|
||||||
|
advtrains.lines.stops[pe] = nil
|
||||||
end,
|
end,
|
||||||
on_receive_fields = function(pos, formname, fields, player)
|
on_rightclick = function(pos, node, player)
|
||||||
|
show_stoprailform(pos, player)
|
||||||
end,
|
end,
|
||||||
advtrains = {
|
advtrains = {
|
||||||
|
on_train_approach = function(pos,train_id, train, index)
|
||||||
|
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)
|
on_train_enter = function(pos, train_id)
|
||||||
local train = advtrains.trains[train_id]
|
local train = advtrains.trains[train_id]
|
||||||
--advtrains.atc.train_set_command(train, "B0 OR D8 OC D1", true)
|
|
||||||
end,
|
local pe = advtrains.encode_pos(pos)
|
||||||
on_train_approach = function(pos,train_id, train, index)
|
local stdata = advtrains.lines.stops[pe]
|
||||||
advtrains.interlocking.lzb_add_oncoming_npr(train, index, 2)
|
if not stdata then
|
||||||
end,
|
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
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
advtrains.register_tracks("default", {
|
advtrains.register_tracks("default", {
|
||||||
nodename_prefix="advtrains_line_automation:dtrack_stop",
|
nodename_prefix="advtrains_line_automation:dtrack_stop",
|
||||||
texture_prefix="advtrains_dtrack_stop",
|
texture_prefix="advtrains_dtrack_stop",
|
||||||
|
|
Loading…
Reference in New Issue