Add ATC "K" command

This command kicks out all passengers when the train is stopped and
its doors are open. In addtion, a wagon:is_driver_stand(seat) function
was added to allow finding out easily if a seat is the driver stand of
the wagon.
This commit is contained in:
Gabriel Pérez-Cerezo 2021-01-07 23:58:05 +01:00
parent 8655eebc5f
commit e9c76100a1
3 changed files with 41 additions and 5 deletions

View File

@ -230,6 +230,32 @@ local matchptn={
train.door_open = tt[match]*arr train.door_open = tt[match]*arr
return 2 return 2
end, end,
["K"] = function(id, train)
if train.door_open == 0 then
atwarn(sid(id), attrans("ATC Kick command warning: Doors closed"))
return 1
end
if train.velocity > 0 then
atwarn(sid(id), attrans("ATC Kick command warning: Train moving"))
return 1
end
local tp = train.trainparts
for i=1,#tp do
local data = advtrains.wagons[tp[i]]
local obj = advtrains.wagon_objects[tp[i]]
if data and obj then
local ent = obj:get_luaentity()
if ent then
for seatno,seat in pairs(ent.seats) do
if data.seatp[seatno] and not ent:is_driver_stand(seat) then
ent:get_off(seatno)
end
end
end
end
end
return 1
end,
} }
eval_conditional = function(command, arrow, speed) eval_conditional = function(command, arrow, speed)

View File

@ -269,6 +269,15 @@ function wagon:destroy()
return true return true
end end
function wagon:is_driver_stand(seat)
if self.seat_groups then
return (seat.driving_ctrl_access or self.seat_groups[seat.group].driving_ctrl_access)
else
return seat.driving_ctrl_access
end
end
function wagon:on_step(dtime) function wagon:on_step(dtime)
return advtrains.pcall(function() return advtrains.pcall(function()
if not self:ensure_init() then return end if not self:ensure_init() then return end
@ -301,11 +310,7 @@ function wagon:on_step(dtime)
local pname=data.seatp[seatno] local pname=data.seatp[seatno]
local driver=pname and minetest.get_player_by_name(pname) local driver=pname and minetest.get_player_by_name(pname)
local has_driverstand = pname and advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist) local has_driverstand = pname and advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist)
if self.seat_groups then has_driverstand = has_driverstand and self:is_driver_stand(seat)
has_driverstand = has_driverstand and (seat.driving_ctrl_access or self.seat_groups[seat.group].driving_ctrl_access)
else
has_driverstand = has_driverstand and (seat.driving_ctrl_access)
end
if has_driverstand and driver then if has_driverstand and driver then
advtrains.update_driver_hud(driver:get_player_name(), self:train(), data.wagon_flipped) advtrains.update_driver_hud(driver:get_player_name(), self:train(), data.wagon_flipped)
elseif driver then elseif driver then

View File

@ -46,6 +46,11 @@ Example:
B0 W OL D10 OC D1 SM B0 W OL D10 OC D1 SM
Subway train: stop in station and open doors, depart after 10 seconds. Subway train: stop in station and open doors, depart after 10 seconds.
K
Kick all passengers out of the trains
This command kicks all passengers (non-driving players) off the train. This command works only
if the train is stopped and its doors are open.
# conditional statements: # conditional statements:
I<condition><code>; I<condition><code>;