develop #28
8 changed files with 79 additions and 25 deletions
|
@ -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)
|
||||||
|
|
|
@ -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}}}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue