From 2da11c5a49f39a6b55c411510f44f2f3676efc3a Mon Sep 17 00:00:00 2001 From: Blockhead Date: Fri, 13 Mar 2020 13:24:11 +1100 Subject: Use a standard wagon inventory formspec This new formspec also allows access to the wagon properties. Once whitelisted in the wagon properties, other players can access its inventory. Note on 'useless use' of OO: I tried passing just the wagon ID and avoiding using the `self` object in order to bypass the need to look up the lua entitie out of the list, but it ended up retrieving nil data. The best way to solve this overhead might be to wait for some kind of better way upstream in minetest's lua API to get entities, or to keep a central record of entities. Either way, the solution is outside the scope of this commit. --- advtrains/wagons.lua | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'advtrains/wagons.lua') diff --git a/advtrains/wagons.lua b/advtrains/wagons.lua index b13b8d8..ddf533b 100644 --- a/advtrains/wagons.lua +++ b/advtrains/wagons.lua @@ -777,7 +777,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 drive your wagon:;"..(data.whitelist or "").."]" + form = form .. "field[0.5,1;4,1;whitelist;Allow these players to access your wagon:;"..(data.whitelist 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) @@ -1010,6 +1010,20 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end end + uid=string.match(formname, "^advtrains_inv_(.+)$") + if uid then + local pname=player:get_player_name() + local data = advtrains.wagons[uid] + if fields.prop and data.owner==pname then + for _,wagon in pairs(minetest.luaentities) do + if wagon.is_wagon and wagon.initialized and wagon.id==uid then + minetest.chat_send_player(player:get_player_name(), string.format("Opening wagon props from inv... (id=%s)", uid)) + wagon:show_wagon_properties(pname) + --wagon:handle_bordcom_fields(player:get_player_name(), formname, fields) + end + end + end + end end) end) function wagon:seating_from_key_helper(pname, fields, no) @@ -1167,6 +1181,14 @@ function advtrains.get_wagon_prototype(data) return wt, advtrains.wagon_prototypes[wt] end +function advtrains.standard_inventory_formspec(self, pname, invname) + return "size[8,11]".. + "list["..invname..";box;0,0;8,3;]".. + "button_exit[0,9;4,1;prop;"..attrans("Wagon properties").."]".. + "list[current_player;main;0,5;8,4;]".. + "listring[]" +end + function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreative) local sysname = sysname_p if not string.match(sysname, ":") then -- cgit v1.2.3 From d0629469aa1403fb884a26688f2b9b5695c7806a Mon Sep 17 00:00:00 2001 From: Blockhead Date: Wed, 18 Mar 2020 01:13:06 +1100 Subject: Show the wagon properties button only to the owner --- advtrains/wagons.lua | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'advtrains/wagons.lua') diff --git a/advtrains/wagons.lua b/advtrains/wagons.lua index ddf533b..20ad269 100644 --- a/advtrains/wagons.lua +++ b/advtrains/wagons.lua @@ -1182,11 +1182,21 @@ function advtrains.get_wagon_prototype(data) end function advtrains.standard_inventory_formspec(self, pname, invname) - return "size[8,11]".. - "list["..invname..";box;0,0;8,3;]".. - "button_exit[0,9;4,1;prop;"..attrans("Wagon properties").."]".. - "list[current_player;main;0,5;8,4;]".. + --[[minetest.chat_send_player(pname, string.format("self=%s, pname=%s, invname=%s", self, pname, invname)) + for k,v in pairs(self) do + minetest.chat_send_player(pname, string.format("%s=%s", k,v)) + end + minetest.chat_send_player(pname, string.format("***%s***", self.object:get_pos()))--]] + local data = advtrains.wagons[self.id] + local r = "size[8,11]".. + "list["..invname..";box;0,0;8,3;]" + minetest.chat_send_player(pname, string.format("self.owner=%s, pname=%s", data.owner, pname)) + if data.owner==pname then + r = r .. "button_exit[0,9;4,1;prop;"..attrans("Wagon properties").."]" + end + r = r .. "list[current_player;main;0,5;8,4;]".. "listring[]" + return r end function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreative) -- cgit v1.2.3 From f43254c2827821a61777616b90abef03325dbe2e Mon Sep 17 00:00:00 2001 From: Blockhead Date: Tue, 7 Apr 2020 14:16:47 +1000 Subject: 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. --- advtrains/wagons.lua | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'advtrains/wagons.lua') diff --git a/advtrains/wagons.lua b/advtrains/wagons.lua index 20ad269..5eed514 100644 --- a/advtrains/wagons.lua +++ b/advtrains/wagons.lua @@ -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 -- cgit v1.2.3 From e57c1eaa7fed32d12a3427735bda500e38006686 Mon Sep 17 00:00:00 2001 From: Blockhead Date: Sun, 12 Apr 2020 18:44:01 +1000 Subject: Remove debugging print statement --- advtrains/wagons.lua | 2 -- 1 file changed, 2 deletions(-) (limited to 'advtrains/wagons.lua') diff --git a/advtrains/wagons.lua b/advtrains/wagons.lua index 5eed514..3ee4399 100644 --- a/advtrains/wagons.lua +++ b/advtrains/wagons.lua @@ -1030,7 +1030,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.prop and data.owner==pname then for _,wagon in pairs(minetest.luaentities) do if wagon.is_wagon and wagon.initialized and wagon.id==uid then - minetest.chat_send_player(player:get_player_name(), string.format("Opening wagon props from inv... (id=%s)", uid)) wagon:show_wagon_properties(pname) --wagon:handle_bordcom_fields(player:get_player_name(), formname, fields) end @@ -1206,7 +1205,6 @@ function advtrains.standard_inventory_formspec(self, pname, invname) local data = advtrains.wagons[self.id] local r = "size[8,11]".. "list["..invname..";box;0,0;8,3;]" - minetest.chat_send_player(pname, string.format("self.owner=%s, pname=%s", data.owner, pname)) if data.owner==pname then r = r .. "button_exit[0,9;4,1;prop;"..attrans("Wagon properties").."]" end -- cgit v1.2.3