From e9c76100a1f5ff474a4ed65555c3249b791bbf10 Mon Sep 17 00:00:00 2001 From: Gabriel PĂ©rez-Cerezo Date: Thu, 7 Jan 2021 23:58:05 +0100 Subject: 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. --- advtrains/atc.lua | 26 ++++++++++++++++++++++++++ advtrains/wagons.lua | 15 ++++++++++----- atc_command.txt | 5 +++++ 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/advtrains/atc.lua b/advtrains/atc.lua index 20f52b9..2fa3929 100644 --- a/advtrains/atc.lua +++ b/advtrains/atc.lua @@ -230,6 +230,32 @@ local matchptn={ train.door_open = tt[match]*arr return 2 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) diff --git a/advtrains/wagons.lua b/advtrains/wagons.lua index ad4a5ab..5c8ac25 100644 --- a/advtrains/wagons.lua +++ b/advtrains/wagons.lua @@ -269,6 +269,15 @@ function wagon:destroy() return true 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) return advtrains.pcall(function() if not self:ensure_init() then return end @@ -301,11 +310,7 @@ function wagon:on_step(dtime) local pname=data.seatp[seatno] 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) - if self.seat_groups then - 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 + has_driverstand = has_driverstand and self:is_driver_stand(seat) if has_driverstand and driver then advtrains.update_driver_hud(driver:get_player_name(), self:train(), data.wagon_flipped) elseif driver then diff --git a/atc_command.txt b/atc_command.txt index 3df60c8..0acbacb 100644 --- a/atc_command.txt +++ b/atc_command.txt @@ -46,6 +46,11 @@ Example: B0 W OL D10 OC D1 SM 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: I; -- cgit v1.2.3