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
parent
4ea222fd6a
commit
fe8794b353
BIN
advtrains.zip
BIN
advtrains.zip
Binary file not shown.
|
@ -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})
|
advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f.as..rotation, param2 = node.param2})
|
||||||
end
|
end
|
||||||
}},
|
}},
|
||||||
on_rightclick=function(pos, node, clicker)
|
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})
|
advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f.as..rotation, param2 = node.param2})
|
||||||
|
end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
advtrains.trackplacer.add_worked("advtrains:retrosignal", r, rotation, nil)
|
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
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
on_rightclick=function(pos, node, clicker)
|
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})
|
advtrains.ndb.swap_node(pos, {name = "advtrains:signal_"..f.as..rotation, param2 = node.param2})
|
||||||
|
end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
advtrains.trackplacer.add_worked("advtrains:signal", r, rotation, nil)
|
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
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
on_rightclick=function(pos, node, clicker)
|
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})
|
advtrains.ndb.swap_node(pos, {name = "advtrains:signal_wall_"..loc.."_"..f.as, param2 = node.param2})
|
||||||
|
end
|
||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
|
@ -260,11 +260,15 @@ advtrains.trackpresets = ap
|
||||||
}]]
|
}]]
|
||||||
function advtrains.register_tracks(tracktype, def, preset)
|
function advtrains.register_tracks(tracktype, def, preset)
|
||||||
local function make_switchfunc(suffix_target, mesecon_state, is_state)
|
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)
|
local switchfunc=function(pos, node, newstate)
|
||||||
if newstate~=is_state then
|
if newstate~=is_state then
|
||||||
advtrains.ndb.swap_node(pos, {name=def.nodename_prefix.."_"..suffix_target, param2=node.param2})
|
advtrains.ndb.swap_node(pos, {name=def.nodename_prefix.."_"..suffix_target, param2=node.param2})
|
||||||
end
|
end
|
||||||
advtrains.invalidate_all_paths()
|
|
||||||
end
|
end
|
||||||
local mesec
|
local mesec
|
||||||
if mesecon_state then -- if mesecons is not wanted, do not.
|
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
|
rules=advtrains.meseconrules
|
||||||
}}
|
}}
|
||||||
end
|
end
|
||||||
return switchfunc, mesec,
|
return rcswitchfunc, mesec,
|
||||||
{
|
{
|
||||||
getstate = is_state,
|
getstate = is_state,
|
||||||
setstate = switchfunc,
|
setstate = switchfunc,
|
||||||
}
|
}
|
||||||
end
|
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
|
local img_suffix=suffix..rotation
|
||||||
return {
|
return {
|
||||||
mesh = def.shared_model or (def.models_prefix.."_"..img_suffix..def.models_suffix),
|
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,
|
rely2=conns.rely2 or 0,
|
||||||
railheight=conns.railheight or 0,
|
railheight=conns.railheight or 0,
|
||||||
|
|
||||||
on_rightclick=switchfunc,
|
on_rightclick=rcswitchfunc,
|
||||||
groups = {
|
groups = {
|
||||||
attached_node=1,
|
attached_node=1,
|
||||||
["advtrains_track_"..tracktype]=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 suffix, conns in pairs(preset.variant) do
|
||||||
for rotid, rotation in ipairs(preset.rotation) do
|
for rotid, rotation in ipairs(preset.rotation) do
|
||||||
if not def.formats[suffix] or def.formats[suffix][rotid] then
|
if not def.formats[suffix] or def.formats[suffix][rotid] then
|
||||||
local switchfunc, mesecontbl, luaautomation
|
local rcswitchfunc, mesecontbl, luaautomation
|
||||||
if preset.switch[suffix] then
|
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
|
end
|
||||||
local adef={}
|
local adef={}
|
||||||
if def.get_additional_definiton then
|
if def.get_additional_definiton then
|
||||||
|
@ -366,7 +370,7 @@ function advtrains.register_tracks(tracktype, def, preset)
|
||||||
make_overdef(
|
make_overdef(
|
||||||
suffix, rotation,
|
suffix, rotation,
|
||||||
cycle_conns(conns, rotid),
|
cycle_conns(conns, rotid),
|
||||||
switchfunc, mesecontbl, luaautomation, preset.increativeinv[suffix], preset.slopenodes[suffix]
|
rcswitchfunc, mesecontbl, luaautomation, preset.increativeinv[suffix], preset.slopenodes[suffix]
|
||||||
),
|
),
|
||||||
adef
|
adef
|
||||||
)
|
)
|
||||||
|
|
|
@ -8,6 +8,11 @@ minetest.register_privilege("train_remove", {
|
||||||
description = "Player can remove trains not owned by player",
|
description = "Player can remove trains not owned by player",
|
||||||
give_to_singleplayer= false,
|
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={
|
local wagon={
|
||||||
collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
|
collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5},
|
||||||
|
@ -242,7 +247,8 @@ function wagon:on_step(dtime)
|
||||||
--driver control
|
--driver control
|
||||||
for seatno, seat in ipairs(self.seats) do
|
for seatno, seat in ipairs(self.seats) do
|
||||||
local driver=self.seatp[seatno] and minetest.get_player_by_name(self.seatp[seatno])
|
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)
|
advtrains.update_driver_hud(driver:get_player_name(), self:train(), self.wagon_flipped)
|
||||||
elseif driver then
|
elseif driver then
|
||||||
--only show the inside text
|
--only show the inside text
|
||||||
|
@ -253,7 +259,7 @@ function wagon:on_step(dtime)
|
||||||
local pc=driver:get_player_control()
|
local pc=driver:get_player_control()
|
||||||
self.seatpc[seatno]=driver:get_player_control_bits()
|
self.seatpc[seatno]=driver:get_player_control_bits()
|
||||||
|
|
||||||
if seat.driving_ctrl_access then
|
if has_driverstand then
|
||||||
--regular driver stand controls
|
--regular driver stand controls
|
||||||
advtrains.on_control_change(pc, self:train(), self.wagon_flipped)
|
advtrains.on_control_change(pc, self:train(), self.wagon_flipped)
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue