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.
master
orwell96 2017-04-09 15:15:45 +02:00
parent 4ea222fd6a
commit fe8794b353
4 changed files with 31 additions and 15 deletions

Binary file not shown.

View File

@ -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

View File

@ -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
)

View File

@ -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