This commit is contained in:
root 2021-01-10 18:57:32 +01:00
parent f95799f554
commit becb199737
8 changed files with 79 additions and 25 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

@ -252,7 +252,7 @@ function advtrains.hud_train_format(train, flip)
ht[#ht+1] = sformat("%d,100=(advtrains_hud_bg.png^[resize\\:11x30^[colorize\\:white)", i*14-3) ht[#ht+1] = sformat("%d,100=(advtrains_hud_bg.png^[resize\\:11x30^[colorize\\:white)", i*14-3)
end end
for i = max+1, 20, 1 do for i = max+1, 20, 1 do
ht[#ht+1] = sformat("%d,100=(advtrains_hud_bg.png^[resize\\:11x30^[colorize\\:lightgray)", i*14-3) ht[#ht+1] = sformat("%d,100=(advtrains_hud_bg.png^[resize\\:11x30^[colorize\\:darkslategray)", i*14-3)
end end
if res and res > 0 then if res and res > 0 then
ht[#ht+1] = sformat("%d,95=(advtrains_hud_bg.png^[resize\\:3x40^[colorize\\:red\\:255)", 8+res*14) ht[#ht+1] = sformat("%d,95=(advtrains_hud_bg.png^[resize\\:3x40^[colorize\\:red\\:255)", 8+res*14)
@ -289,7 +289,7 @@ function advtrains.hud_train_format(train, flip)
end end
local _, texture = advtrains.hud_train_format { -- dummy train object to demonstrate the train hud local _, texture = advtrains.hud_train_format { -- dummy train object to demonstrate the train hud
max_speed = 15, speed_restriction = 12, velocity = 12, tarvelocity = 15, max_speed = 15, speed_restriction = 15, velocity = 15, tarvelocity = 12,
active_control = true, lever = 3, ctrl = {lzb = true}, is_shunt = true, active_control = true, lever = 3, ctrl = {lzb = true}, is_shunt = true,
door_open = 1, lzb = {oncoming = {{spd=6}}} door_open = 1, lzb = {oncoming = {{spd=6}}}
} }

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

@ -52,12 +52,12 @@ local function show_stoprailform(pos, player)
local form = "size[8,7]" local form = "size[8,7]"
form = form.."field[0.5,0.5;7,1;stn;"..attrans("Station Code")..";"..minetest.formspec_escape(stdata.stn).."]" form = form.."field[0.5,0.5;7,1;stn;"..attrans("Station Code")..";"..minetest.formspec_escape(stdata.stn).."]"
form = form.."field[0.5,1.5;7,1;stnname;"..attrans("Station Name")..";"..minetest.formspec_escape(stnname).."]" form = form.."field[0.5,1.5;7,1;stnname;"..attrans("Station Name")..";"..minetest.formspec_escape(stnname).."]"
form = form.."field[0.5,2.5;2,1;ddelay;"..attrans("Door Delay")..";"..minetest.formspec_escape(stdata.ddelay).."]" form = form.."field[0.5,2.5;1.5,1;ddelay;"..attrans("Door Delay")..";"..minetest.formspec_escape(stdata.ddelay).."]"
form = form.."field[3,2.5;3,1;speed;"..attrans("Departure Speed")..";"..minetest.formspec_escape(stdata.speed).."]" form = form.."field[2,2.5;2,1;speed;"..attrans("Departure Speed")..";"..minetest.formspec_escape(stdata.speed).."]"
form = form.."checkbox[5,1.75;reverse;"..attrans("Reverse train")..";"..(stdata.reverse and "true" or "false").."]"
form = form.."checkbox[5,2.0;kick;"..attrans("Kick out passengers")..";"..(stdata.kick and "true" or "false").."]"
form = form.."label[0.5,3;Door side:]" form = form.."label[0.5,3;Door side:]"
form = form.."dropdown[0.5,3;2;doors;Left,Right,Closed;"..door_dropdown[stdata.doors].."]" form = form.."dropdown[0.5,3;2;doors;Left,Right,Closed;"..door_dropdown[stdata.doors].."]"
form = form.."dropdown[3,3;1.5;reverse;---,Reverse;"..(stdata.reverse and 2 or 1).."]"
form = form.."field[5,3.5;2,1;track;"..attrans("Track")..";"..minetest.formspec_escape(stdata.track).."]" form = form.."field[5,3.5;2,1;track;"..attrans("Track")..";"..minetest.formspec_escape(stdata.track).."]"
form = form.."field[5,4.5;2,1;wait;"..attrans("Stop Time")..";"..stdata.wait.."]" form = form.."field[5,4.5;2,1;wait;"..attrans("Stop Time")..";"..stdata.wait.."]"
@ -67,7 +67,7 @@ local function show_stoprailform(pos, player)
minetest.show_formspec(pname, "at_lines_stop_"..pe, form) minetest.show_formspec(pname, "at_lines_stop_"..pe, form)
end end
local tmp_checkboxes = {}
minetest.register_on_player_receive_fields(function(player, formname, fields) minetest.register_on_player_receive_fields(function(player, formname, fields)
local pname = player:get_player_name() local pname = player:get_player_name()
local pe = string.match(formname, "^at_lines_stop_(............)$") local pe = string.match(formname, "^at_lines_stop_(............)$")
@ -79,6 +79,15 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
end end
local stdata = advtrains.lines.stops[pe] local stdata = advtrains.lines.stops[pe]
if not tmp_checkboxes[pe] then
tmp_checkboxes[pe] = {}
end
if fields.kick then -- handle checkboxes due to MT's weird handling
tmp_checkboxes[pe].kick = (fields.kick == "true")
end
if fields.reverse then
tmp_checkboxes[pe].reverse = (fields.reverse == "true")
end
if fields.save then if fields.save then
if fields.stn and stdata.stn ~= fields.stn then if fields.stn and stdata.stn ~= fields.stn then
if fields.stn ~= "" then if fields.stn ~= "" then
@ -111,10 +120,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.doors then if fields.doors then
stdata.doors = door_dropdown_rev[fields.doors] or "C" stdata.doors = door_dropdown_rev[fields.doors] or "C"
end end
if fields.reverse then
stdata.reverse = fields.reverse == "Reverse"
end
if fields.track then if fields.track then
stdata.track = fields.track stdata.track = fields.track
@ -133,7 +138,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.speed then if fields.speed then
stdata.speed = to_int(fields.speed) or "M" stdata.speed = to_int(fields.speed) or "M"
end end
for k,v in pairs(tmp_checkboxes[pe]) do --handle checkboxes
stdata[k] = v or nil
end
tmp_checkboxes[pe] = nil
--TODO: signal --TODO: signal
updatemeta(pos) updatemeta(pos)
show_stoprailform(pos, player) show_stoprailform(pos, player)
@ -192,7 +201,7 @@ local adefunc = function(def, preset, suffix, rotation)
local stnname = stn and stn.name or "Unknown Station" local stnname = stn and stn.name or "Unknown Station"
-- Send ATC command and set text -- Send ATC command and set text
advtrains.atc.train_set_command(train, "B0 W O"..stdata.doors.." D"..stdata.wait.." OC "..(stdata.reverse and "R" or "").."D"..(stdata.ddelay or 1) .. "S" ..(stdata.speed or "M"), true) advtrains.atc.train_set_command(train, "B0 W O"..stdata.doors..(stdata.kick and "K" or "").." D"..stdata.wait.." OC "..(stdata.reverse and "R" or "").."D"..(stdata.ddelay or 1) .. "S" ..(stdata.speed or "M"), true)
train.text_inside = stnname train.text_inside = stnname
if tonumber(stdata.wait) then if tonumber(stdata.wait) then
minetest.after(tonumber(stdata.wait), function() train.text_inside = "" end) minetest.after(tonumber(stdata.wait), function() train.text_inside = "" end)
@ -215,4 +224,4 @@ if minetest.get_modpath("advtrains_train_track") ~= nil then
formats={}, formats={},
get_additional_definiton = adefunc, get_additional_definiton = adefunc,
}, advtrains.trackpresets.t_30deg_straightonly) }, advtrains.trackpresets.t_30deg_straightonly)
end end

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

View file

@ -50,6 +50,12 @@ mobs:register_mob("mobs_animal:pumba", {
walk_end = 100, walk_end = 100,
punch_start = 70, punch_start = 70,
punch_end = 100, punch_end = 100,
die_start = 1, -- we dont have a specific death animation so we will
die_end = 2, -- re-use 2 standing frames at a speed of 1 fps and
die_speed = 1, -- have mob rotate when dying.
die_loop = false,
die_rotate = true,
}, },
on_rightclick = function(self, clicker) on_rightclick = function(self, clicker)

View file

@ -8,7 +8,7 @@ local use_cmi = minetest.global_exists("cmi")
mobs = { mobs = {
mod = "redo", mod = "redo",
version = "20210107", version = "20210108",
intllib = S, intllib = S,
invis = minetest.global_exists("invisibility") and invisibility or {} invis = minetest.global_exists("invisibility") and invisibility or {}
} }
@ -910,6 +910,7 @@ function mob_class:check_for_death(cmi_cause)
local rot = self.animation.die_rotate and 5 local rot = self.animation.die_rotate and 5
self.attack = nil self.attack = nil
self.following = nil
self.v_start = false self.v_start = false
self.timer = 0 self.timer = 0
self.blinktimer = 0 self.blinktimer = 0
@ -917,7 +918,7 @@ function mob_class:check_for_death(cmi_cause)
self.state = "die" self.state = "die"
self.object:set_properties({ self.object:set_properties({
pointable = false, collide_with_objects = false, pointable = false, collide_with_objects = false,
automatic_rotate = rot, automatic_rotate = rot, static_save = false
}) })
self:set_velocity(0) self:set_velocity(0)
self:set_animation("die") self:set_animation("die")
@ -3074,6 +3075,7 @@ function mob_class:mob_staticdata()
if t ~= "function" if t ~= "function"
and t ~= "nil" and t ~= "nil"
and t ~= "userdata" and t ~= "userdata"
and _ ~= "object"
and _ ~= "_cmi_components" then and _ ~= "_cmi_components" then
tmp[_] = self[_] tmp[_] = self[_]
end end
@ -3326,6 +3328,8 @@ function mob_class:on_step(dtime, moveresult)
}} }}
}]] }]]
if self.state == "die" then return end ----------------
if use_cmi then if use_cmi then
cmi.notify_step(self.object, dtime) cmi.notify_step(self.object, dtime)
end end

View file

@ -623,11 +623,10 @@ end
function signs_lib.rightclick_sign(pos, node, player, itemstack, pointed_thing) function signs_lib.rightclick_sign(pos, node, player, itemstack, pointed_thing)
local playername = player:get_player_name() if not signs_lib.can_modify(pos, player) then return end
if not minetest.check_player_privs(playername, {signslib_edit = true}) then return end
player:get_meta():set_string("signslib:pos", minetest.pos_to_string(pos)) player:get_meta():set_string("signslib:pos", minetest.pos_to_string(pos))
minetest.show_formspec(playername, "signs_lib:sign", get_sign_formspec(pos, node.name)) minetest.show_formspec(player:get_player_name(), "signs_lib:sign", get_sign_formspec(pos, node.name))
end end
function signs_lib.destruct_sign(pos) function signs_lib.destruct_sign(pos)