From fe8794b353fb3841168eb27f8bbc6c6b13f30098 Mon Sep 17 00:00:00 2001 From: orwell96 Date: Sun, 9 Apr 2017 15:15:45 +0200 Subject: Add privilege for basic train operation. This privilege is granted to singleplayer by default, but is not granted on servers. This prevents unexperienced or evil players from breaking automatic train operation on servers. --- advtrains/advtrains/signals.lua | 18 ++++++++++++------ advtrains/advtrains/tracks.lua | 18 +++++++++++------- advtrains/advtrains/wagons.lua | 10 ++++++++-- 3 files changed, 31 insertions(+), 15 deletions(-) (limited to 'advtrains') diff --git a/advtrains/advtrains/signals.lua b/advtrains/advtrains/signals.lua index ceb4166..a5a9aa3 100644 --- a/advtrains/advtrains/signals.lua +++ b/advtrains/advtrains/signals.lua @@ -41,8 +41,10 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f.as..rotation, param2 = node.param2}) end }}, - on_rightclick=function(pos, node, clicker) - advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f.as..rotation, param2 = node.param2}) + on_rightclick=function(pos, node, player) + if minetest.check_player_privs(player:get_player_name(), {train_operator=true}) then + advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f.as..rotation, param2 = node.param2}) + end end, }) advtrains.trackplacer.add_worked("advtrains:retrosignal", r, rotation, nil) @@ -83,8 +85,10 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", end end, }, - on_rightclick=function(pos, node, clicker) - advtrains.ndb.swap_node(pos, {name = "advtrains:signal_"..f.as..rotation, param2 = node.param2}) + on_rightclick=function(pos, node, player) + if minetest.check_player_privs(player:get_player_name(), {train_operator=true}) then + advtrains.ndb.swap_node(pos, {name = "advtrains:signal_"..f.as..rotation, param2 = node.param2}) + end end, }) advtrains.trackplacer.add_worked("advtrains:signal", r, rotation, nil) @@ -130,8 +134,10 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", end end, }, - on_rightclick=function(pos, node, clicker) - advtrains.ndb.swap_node(pos, {name = "advtrains:signal_wall_"..loc.."_"..f.as, param2 = node.param2}) + on_rightclick=function(pos, node, player) + if minetest.check_player_privs(player:get_player_name(), {train_operator=true}) then + advtrains.ndb.swap_node(pos, {name = "advtrains:signal_wall_"..loc.."_"..f.as, param2 = node.param2}) + end end, }) end diff --git a/advtrains/advtrains/tracks.lua b/advtrains/advtrains/tracks.lua index 90d2ad3..2bb61eb 100644 --- a/advtrains/advtrains/tracks.lua +++ b/advtrains/advtrains/tracks.lua @@ -260,11 +260,15 @@ advtrains.trackpresets = ap }]] function advtrains.register_tracks(tracktype, def, preset) local function make_switchfunc(suffix_target, mesecon_state, is_state) + local rcswitchfunc=function(pos, node, player) + if minetest.check_player_privs(player:get_player_name(), {train_operator=true}) then + advtrains.ndb.swap_node(pos, {name=def.nodename_prefix.."_"..suffix_target, param2=node.param2}) + end + end local switchfunc=function(pos, node, newstate) if newstate~=is_state then advtrains.ndb.swap_node(pos, {name=def.nodename_prefix.."_"..suffix_target, param2=node.param2}) end - advtrains.invalidate_all_paths() end local mesec if mesecon_state then -- if mesecons is not wanted, do not. @@ -273,13 +277,13 @@ function advtrains.register_tracks(tracktype, def, preset) rules=advtrains.meseconrules }} end - return switchfunc, mesec, + return rcswitchfunc, mesec, { getstate = is_state, setstate = switchfunc, } end - local function make_overdef(suffix, rotation, conns, switchfunc, mesecontbl, luaautomation, in_creative_inv, drop_slope) + local function make_overdef(suffix, rotation, conns, rcswitchfunc, mesecontbl, luaautomation, in_creative_inv, drop_slope) local img_suffix=suffix..rotation return { mesh = def.shared_model or (def.models_prefix.."_"..img_suffix..def.models_suffix), @@ -293,7 +297,7 @@ function advtrains.register_tracks(tracktype, def, preset) rely2=conns.rely2 or 0, railheight=conns.railheight or 0, - on_rightclick=switchfunc, + on_rightclick=rcswitchfunc, groups = { attached_node=1, ["advtrains_track_"..tracktype]=1, @@ -352,9 +356,9 @@ function advtrains.register_tracks(tracktype, def, preset) for suffix, conns in pairs(preset.variant) do for rotid, rotation in ipairs(preset.rotation) do if not def.formats[suffix] or def.formats[suffix][rotid] then - local switchfunc, mesecontbl, luaautomation + local rcswitchfunc, mesecontbl, luaautomation if preset.switch[suffix] then - switchfunc, mesecontbl, luaautomation=make_switchfunc(preset.switch[suffix]..rotation, preset.switchmc[suffix], preset.switchst[suffix]) + rcswitchfunc, mesecontbl, luaautomation=make_switchfunc(preset.switch[suffix]..rotation, preset.switchmc[suffix], preset.switchst[suffix]) end local adef={} if def.get_additional_definiton then @@ -366,7 +370,7 @@ function advtrains.register_tracks(tracktype, def, preset) make_overdef( suffix, rotation, cycle_conns(conns, rotid), - switchfunc, mesecontbl, luaautomation, preset.increativeinv[suffix], preset.slopenodes[suffix] + rcswitchfunc, mesecontbl, luaautomation, preset.increativeinv[suffix], preset.slopenodes[suffix] ), adef ) diff --git a/advtrains/advtrains/wagons.lua b/advtrains/advtrains/wagons.lua index 28de3fa..15a0ec7 100644 --- a/advtrains/advtrains/wagons.lua +++ b/advtrains/advtrains/wagons.lua @@ -8,6 +8,11 @@ minetest.register_privilege("train_remove", { description = "Player can remove trains not owned by player", give_to_singleplayer= false, }); +minetest.register_privilege("train_operator", { + description = "Player may operate trains and switch signals. Given by default. Revoke to prevent players from griefing automated subway systems.", + give_to_singleplayer= true, + default= true, +}); local wagon={ collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, @@ -242,7 +247,8 @@ function wagon:on_step(dtime) --driver control for seatno, seat in ipairs(self.seats) do local driver=self.seatp[seatno] and minetest.get_player_by_name(self.seatp[seatno]) - if seat.driving_ctrl_access and driver then + local has_driverstand=seat.driving_ctrl_access and self.seatp[seatno] and minetest.check_player_privs(self.seatp[seatno], {train_operator=true}) + if has_driverstand and driver then advtrains.update_driver_hud(driver:get_player_name(), self:train(), self.wagon_flipped) elseif driver then --only show the inside text @@ -253,7 +259,7 @@ function wagon:on_step(dtime) local pc=driver:get_player_control() self.seatpc[seatno]=driver:get_player_control_bits() - if seat.driving_ctrl_access then + if has_driverstand then --regular driver stand controls advtrains.on_control_change(pc, self:train(), self.wagon_flipped) else -- cgit v1.2.3