Add road numbers to wagon properties, bordcom

A road number is used to allow users to set their own wagon numbers
other than the internal IDs assigned by advtrains. A railway company
would typically keep a roster of what rollingstock it has in road
numbers.

The road number can be set on the wagon properties formspec. It is
displayed above the wagon's inventory icon in the onboard computer as a
button, which will then open the wagon properties on that wagon.

Road numbers might be displayable as additional text entities on the
wagon like signs.

Currently opening the wagon properties (and sometimes onboard computer)
formspecs can be quite unreliable (at least on windows), so I hope that
closing the wagon 'main menu' before opening other formspecs helps that
reliability. It seems to be an upstream bug.
master
Blockhead 2020-04-07 14:16:47 +10:00
parent d0629469aa
commit f43254c282
1 changed files with 20 additions and 4 deletions

View File

@ -778,6 +778,7 @@ function wagon:show_wagon_properties(pname)
local data = advtrains.wagons[self.id]
local form="size[5,5]"
form = form .. "field[0.5,1;4,1;whitelist;Allow these players to access your wagon:;"..(data.whitelist or "").."]"
form = form .. "field[0.5,2;4,1;roadnumber;Wagon road number:;"..(data.roadnumber or "").."]"
--seat groups access lists were here
form=form.."button_exit[0.5,3;4,1;save;"..attrans("Save wagon properties").."]"
minetest.show_formspec(pname, "advtrains_prop_"..self.id, form)
@ -810,21 +811,23 @@ function wagon:show_bordcom(pname)
form=form.."field[7.5,3.25;3,1;routingcode;"..attrans("Routingcode")..";"..(minetest.formspec_escape(train.routingcode or "")).."]"
--row 5 : train overview and autocoupling
if train.velocity==0 then
form=form.."label[0.5,4.5;Train overview /coupling control:]"
form=form.."label[0.5,4;Train overview /coupling control:]"
linhei=5
local pre_own, pre_wl, owns_any = nil, nil, minetest.check_player_privs(pname, "train_admin")
for i, tpid in ipairs(train.trainparts) do
local ent = advtrains.wagons[tpid]
if ent then
local roadnumber = ent.roadnumber or ""
form = form .. string.format("button[%d,%d;%d,%d;%s;%s]", i, linhei, 1, 0.2, "wgprp"..i, roadnumber)
local ename = ent.type
form = form .. "item_image["..i..","..linhei..";1,1;"..ename.."]"
form = form .. "item_image["..i..","..(linhei+0.5)..";1,1;"..ename.."]"
if i~=1 then
if checklock(pname, ent.owner, pre_own, ent.whitelist, pre_wl) then
form = form .. "image_button["..(i-0.5)..","..(linhei+1)..";1,1;advtrains_discouple.png;dcpl_"..i..";]"
form = form .. "image_button["..(i-0.5)..","..(linhei+1.5)..";1,1;advtrains_discouple.png;dcpl_"..i..";]"
end
end
if i == data.pos_in_trainparts then
form = form .. "box["..(i-0.1)..","..(linhei-0.1)..";1,1;green]"
form = form .. "box["..(i-0.1)..","..(linhei+0.4)..";1,1;green]"
end
pre_own = ent.owner
pre_wl = ent.whitelist
@ -916,6 +919,13 @@ function wagon:handle_bordcom_fields(pname, formname, fields)
for i, tpid in ipairs(train.trainparts) do
if fields["dcpl_"..i] then
advtrains.safe_decouple_wagon(tpid, pname)
elseif fields["wgprp"..i] then
for _,wagon in pairs(minetest.luaentities) do
if wagon.is_wagon and wagon.initialized and wagon.id==tpid then
wagon:show_wagon_properties(pname)
return
end
end
end
end
--check cpl_eid_front and _back of train
@ -1000,6 +1010,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.whitelist then
data.whitelist = fields.whitelist
end
if fields.roadnumber then
data.roadnumber = fields.roadnumber
end
end
end
uid=string.match(formname, "^advtrains_bordcom_(.+)$")
@ -1040,12 +1053,15 @@ function wagon:seating_from_key_helper(pname, fields, no)
end
end
if fields.inv and self.has_inventory and self.get_inventory_formspec then
minetest.close_formspec(pname, "advtrains_seating_"..self.id)
minetest.show_formspec(player:get_player_name(), "advtrains_inv_"..self.id, self:get_inventory_formspec(player:get_player_name(), make_inv_name(self.id)))
end
if fields.prop and data.owner==pname then
minetest.close_formspec(pname, "advtrains_seating_"..self.id)
self:show_wagon_properties(pname)
end
if fields.bordcom and self.seat_groups[sgr].driving_ctrl_access and advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist) then
minetest.close_formspec(pname, "advtrains_seating_"..self.id)
self:show_bordcom(pname)
end
if fields.dcwarn then