Add nudging

Timer can be edited from the parameters menu, entering 0 disables nudging
This commit is contained in:
cheapie 2024-05-10 21:00:30 -05:00
parent 5ac4571337
commit 6c908698d7
7 changed files with 83 additions and 24 deletions

View File

@ -437,7 +437,7 @@ function celevator.controller.finish(pos,mem,changedinterrupts)
elseif command.command == "open" then elseif command.command == "open" then
minetest.after(0.25,celevator.drives[drivetype].movedoors,drivepos,"open") minetest.after(0.25,celevator.drives[drivetype].movedoors,drivepos,"open")
elseif command.command == "close" then elseif command.command == "close" then
celevator.drives[drivetype].movedoors(drivepos,"close") celevator.drives[drivetype].movedoors(drivepos,"close",command.nudge)
elseif command.command == "resetfault" then elseif command.command == "resetfault" then
celevator.drives[drivetype].resetfault(drivepos) celevator.drives[drivetype].resetfault(drivepos)
elseif command.command == "pibeep" then elseif command.command == "pibeep" then
@ -505,6 +505,8 @@ function celevator.controller.finish(pos,mem,changedinterrupts)
celevator.pi.flash(pi.pos,what) celevator.pi.flash(pi.pos,what)
end end
end end
carinfo.flash_blank = mem.flash_blank
if mem.flash_blank ~= oldmem.flash_blank then carinfodirty = true end
local oldlanterns = oldmem.lanterns or {} local oldlanterns = oldmem.lanterns or {}
local newlanterns = mem.lanterns or {} local newlanterns = mem.lanterns or {}
local lanterns = carinfo.lanterns local lanterns = carinfo.lanterns

View File

@ -193,13 +193,20 @@ local function open()
interrupt(0.2,"checkopen") interrupt(0.2,"checkopen")
interrupt(10,"opentimeout") interrupt(10,"opentimeout")
interrupt(nil,"closetimeout") interrupt(nil,"closetimeout")
if mem.nudging then
if mem.carstate == "normal" then
interrupt(0,"nudge")
else
mem.nudging = false
end
end
end end
local function close() local function close(nudge)
mem.doorstate = "closing" mem.doorstate = "closing"
drivecmd({command = "close"}) drivecmd({command = "close",nudge = nudge})
interrupt(0.2,"checkclosed") interrupt(0.2,"checkclosed")
interrupt(10,"closetimeout") interrupt((nudge and 30 or 10),"closetimeout")
interrupt(nil,"opentimeout") interrupt(nil,"opentimeout")
end end
@ -214,6 +221,7 @@ if type(mem.groupdncalls) ~= "table" then mem.groupdncalls = {} end
if type(mem.swingupcalls) ~= "table" then mem.swingupcalls = {} end if type(mem.swingupcalls) ~= "table" then mem.swingupcalls = {} end
if type(mem.swingdncalls) ~= "table" then mem.swingdncalls = {} end if type(mem.swingdncalls) ~= "table" then mem.swingdncalls = {} end
if mem.params and not mem.params.carcallsecurity then mem.params.carcallsecurity = {} end if mem.params and not mem.params.carcallsecurity then mem.params.carcallsecurity = {} end
if mem.params and not mem.params.nudgetimer then mem.params.nudgetimer = 30 end
if event.type == "program" then if event.type == "program" then
mem.carstate = "uninit" mem.carstate = "uninit"
@ -254,6 +262,7 @@ if event.type == "program" then
groupmode = "simplex", groupmode = "simplex",
mainlanding = 1, mainlanding = 1,
carcallsecurity = {}, carcallsecurity = {},
nudgetimer = 30,
} }
end end
elseif event.type == "ui" then elseif event.type == "ui" then
@ -359,6 +368,10 @@ elseif event.type == "ui" then
if contractspeed and contractspeed >= 0.1 and contractspeed <= 20 then if contractspeed and contractspeed >= 0.1 and contractspeed <= 20 then
mem.params.contractspeed = contractspeed mem.params.contractspeed = contractspeed
end end
local nudgetimer = tonumber(event.fields.nudgetimer)
if nudgetimer and nudgetimer >= 0 and nudgetimer <= 3600 then
mem.params.nudgetimer = nudgetimer
end
local mainlanding = tonumber(event.fields.mainlanding) local mainlanding = tonumber(event.fields.mainlanding)
if mainlanding and mainlanding >= 1 and mainlanding <= #mem.params.floorheights then if mainlanding and mainlanding >= 1 and mainlanding <= #mem.params.floorheights then
mem.params.mainlanding = math.floor(mainlanding) mem.params.mainlanding = math.floor(mainlanding)
@ -528,7 +541,7 @@ elseif event.type == "callbutton" and mem.carstate == "normal" then
end end
elseif mem.direction == event.dir and mem.doorstate == "open" then elseif mem.direction == event.dir and mem.doorstate == "open" then
interrupt(mem.params.doortimer,"close") interrupt(mem.params.doortimer,"close")
elseif mem.direction == event.dir and mem.doorstate == "closing" then elseif mem.direction == event.dir and mem.doorstate == "closing" and not mem.nudging then
open() open()
end end
elseif event.iid == "checkopen" then elseif event.iid == "checkopen" then
@ -537,6 +550,9 @@ elseif event.iid == "checkopen" then
if mem.carstate == "normal" or mem.carstate == "indep" or mem.carstate == "fs1" or mem.carstate == "fs2" or mem.carstate == "fs2hold" then if mem.carstate == "normal" or mem.carstate == "indep" or mem.carstate == "fs1" or mem.carstate == "fs2" or mem.carstate == "fs2hold" then
interrupt(nil,"opentimeout") interrupt(nil,"opentimeout")
end end
if mem.carstate == "normal" and not mem.interrupts.nudge and mem.params.nudgetimer > 0 then
interrupt(mem.params.nudgetimer,"nudge")
end
else else
interrupt(0.2,"checkopen") interrupt(0.2,"checkopen")
end end
@ -544,6 +560,8 @@ elseif event.iid == "checkclosed" then
if mem.drive.status.doorstate == "closed" then if mem.drive.status.doorstate == "closed" then
interrupt(0,"closed") interrupt(0,"closed")
interrupt(nil,"closetimeout") interrupt(nil,"closetimeout")
interrupt(nil,"nudge")
mem.nudging = false
else else
interrupt(0.2,"checkclosed") interrupt(0.2,"checkclosed")
end end
@ -569,7 +587,7 @@ elseif event.type == "cop" then
if v and landing and landing >= 1 and landing <= #mem.params.floorheights and secok then if v and landing and landing >= 1 and landing <= #mem.params.floorheights and secok then
if getpos() == landing then if getpos() == landing then
if mem.carstate == "normal" or mem.carstate == "indep" then if mem.carstate == "normal" or mem.carstate == "indep" then
if mem.doorstate == "closing" then if mem.doorstate == "closing" and not mem.nudging then
open() open()
elseif mem.doorstate == "open" then elseif mem.doorstate == "open" then
interrupt(mem.params.doortimer,"close") interrupt(mem.params.doortimer,"close")
@ -718,7 +736,7 @@ elseif event.type == "remotemsg" then
elseif event.channel == "carcall" and mem.carstate == "normal" then elseif event.channel == "carcall" and mem.carstate == "normal" then
mem.carcalls[event.msg] = true mem.carcalls[event.msg] = true
end end
elseif event.type == "lightcurtain" then elseif event.type == "lightcurtain" and not mem.nudging then
if mem.carstate == "normal" or mem.carstate == "indep" then if mem.carstate == "normal" or mem.carstate == "indep" then
if mem.doorstate == "closing" then if mem.doorstate == "closing" then
open() open()
@ -726,6 +744,13 @@ elseif event.type == "lightcurtain" then
interrupt(mem.params.doortimer,"close") interrupt(mem.params.doortimer,"close")
end end
end end
elseif event.iid == "nudge" and mem.carstate == "normal" then
mem.nudging = true
if mem.doorstate == "open" then
close(true)
elseif mem.doorstate == "opening" then
interrupt(1,"nudge")
end
end end
local oldstate = mem.carstate local oldstate = mem.carstate
@ -922,6 +947,12 @@ else
end end
end end
if mem.carstate == "normal" and oldstate ~= "normal" and mem.doorstate ~= "closed" and mem.params.nudgetimer > 0 and not mem.interrupts.nudge then
interrupt(mem.params.nudgetimer,"nudge")
elseif mem.carstate ~= "normal" and oldstate == "normal" then
interrupt(nil,"nudge")
end
if mem.carmotion then if mem.carmotion then
mem.carmotion = (mem.drive.status.vel ~= 0) or juststarted mem.carmotion = (mem.drive.status.vel ~= 0) or juststarted
if mem.carmotion then if mem.carmotion then
@ -966,7 +997,10 @@ if mem.carmotion then
mem.swingupcalls[1] = nil mem.swingupcalls[1] = nil
mem.groupupcalls[1] = nil mem.groupupcalls[1] = nil
end end
if (mem.carstate ~= "fs1" or getpos() == (mem.params.mainlanding or 1)) and mem.carstate ~= "fs2" and mem.carstate ~= "fs2hold" then open() end if (mem.carstate ~= "fs1" or getpos() == (mem.params.mainlanding or 1)) and mem.carstate ~= "fs2" and mem.carstate ~= "fs2hold" then
open()
mem.nudging = false
end
if mem.carstate == "fs1" and getpos() ~= (mem.params.mainlanding or 1) then if mem.carstate == "fs1" and getpos() ~= (mem.params.mainlanding or 1) then
gotofloor(mem.params.mainlanding or 1) gotofloor(mem.params.mainlanding or 1)
end end
@ -1263,6 +1297,7 @@ elseif mem.screenstate == "parameters" then
fs(string.format("field[1,3;3,1;doortimer;Door Dwell Timer;%0.1f]",mem.params.doortimer)) fs(string.format("field[1,3;3,1;doortimer;Door Dwell Timer;%0.1f]",mem.params.doortimer))
fs(string.format("field[1,5;3,1;contractspeed;Contract Speed (m/s);%0.1f]",mem.params.contractspeed)) fs(string.format("field[1,5;3,1;contractspeed;Contract Speed (m/s);%0.1f]",mem.params.contractspeed))
fs(string.format("field[1,7;3,1;mainlanding;Main Landing;%d]",mem.params.mainlanding or 1)) fs(string.format("field[1,7;3,1;mainlanding;Main Landing;%d]",mem.params.mainlanding or 1))
fs(string.format("field[4.5,3;3,1;nudgetimer;Nudging Timer (0 = None);%0.1f]",mem.params.nudgetimer))
fs("style[resetdoors,resetcontroller;bgcolor=#DD3333]") fs("style[resetdoors,resetcontroller;bgcolor=#DD3333]")
fs("button[12,1;3,1;resetdoors;Reset Doors]") fs("button[12,1;3,1;resetdoors;Reset Doors]")
fs("button[12,2.5;3,1;resetcontroller;Reset Controller]") fs("button[12,2.5;3,1;resetcontroller;Reset Controller]")
@ -1357,6 +1392,7 @@ mem.pidownarrow = mem.drive.status.vel < 0 and arrowenabled[mem.carstate]
mem.flash_fs = (mem.carstate == "fs1" or mem.carstate == "fs2" or mem.carstate == "fs2hold") mem.flash_fs = (mem.carstate == "fs1" or mem.carstate == "fs2" or mem.carstate == "fs2hold")
mem.flash_is = mem.carstate == "indep" mem.flash_is = mem.carstate == "indep"
mem.flash_blank = mem.nudging
mem.lanterns = {} mem.lanterns = {}
if mem.carstate == "normal" and (mem.doorstate == "open" or mem.doorstate == "opening") then if mem.carstate == "normal" and (mem.doorstate == "open" or mem.doorstate == "opening") then

View File

@ -34,3 +34,8 @@ Edited by cheapie.
Originally from "transformer at night.wav" by ideaph on Freesound, originally licensed under CC0. Originally from "transformer at night.wav" by ideaph on Freesound, originally licensed under CC0.
https://freesound.org/people/ideaph/sounds/641208/ https://freesound.org/people/ideaph/sounds/641208/
Edited by cheapie. Edited by cheapie.
* celevator_nudge.ogg
Originally from "Buzz Buzzer Buzzing Sound Effect" by deleted_user_7146007 on Freesound, originally licensed under CC0.
https://freesound.org/people/deleted_user_7146007/sounds/383352/
Edited by cheapie.

View File

@ -290,7 +290,7 @@ function celevator.doors.hwopen(pos,drivepos)
end end
end end
function celevator.doors.hwclose(pos,drivepos) function celevator.doors.hwclose(pos,drivepos,nudge)
local hwdoors_moving = minetest.deserialize(celevator.storage:get_string("hwdoors_moving")) or {} local hwdoors_moving = minetest.deserialize(celevator.storage:get_string("hwdoors_moving")) or {}
local hash = minetest.hash_node_position(pos) local hash = minetest.hash_node_position(pos)
if hwdoors_moving[hash] then if hwdoors_moving[hash] then
@ -302,7 +302,7 @@ function celevator.doors.hwclose(pos,drivepos)
local fdir = minetest.fourdir_to_dir(celevator.get_node(pos).param2) local fdir = minetest.fourdir_to_dir(celevator.get_node(pos).param2)
local carpos = vector.add(pos,fdir) local carpos = vector.add(pos,fdir)
if celevator.get_node(carpos).name == "celevator:car_000" then if celevator.get_node(carpos).name == "celevator:car_000" then
celevator.doors.carclose(carpos) celevator.doors.carclose(carpos,nudge)
end end
local data = minetest.deserialize(pmeta:get_string("data")) local data = minetest.deserialize(pmeta:get_string("data"))
if not data then return end if not data then return end
@ -312,6 +312,7 @@ function celevator.doors.hwclose(pos,drivepos)
data.direction = "close" data.direction = "close"
data.time = 0 data.time = 0
data.drivepos = drivepos data.drivepos = drivepos
data.nudging = nudge
local erefs = celevator.drives.entity.nodestoentities(data.positions,"celevator:hwdoor_moving") local erefs = celevator.drives.entity.nodestoentities(data.positions,"celevator:hwdoor_moving")
local foffset = vector.multiply(data.opendir,2) local foffset = vector.multiply(data.opendir,2)
local soffset = data.opendir local soffset = data.opendir
@ -359,13 +360,15 @@ function celevator.doors.hwstep(dtime)
hwdoors_moving[hash] = nil hwdoors_moving[hash] = nil
end end
elseif data.direction == "close" then elseif data.direction == "close" then
data.time = data.time+(0.66*dtime) local speed = 0.66
if data.nudging then speed = 0.2 end
data.time = data.time+(speed*dtime)
local vel = math.sin(data.time) local vel = math.sin(data.time)
for i=1,3,1 do for i=1,3,1 do
celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*-0.66)) celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*-speed))
end end
for i=4,6,1 do for i=4,6,1 do
celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*-0.66)) celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*-speed))
end end
if data.time >= math.pi then if data.time >= math.pi then
for i=1,6,1 do for i=1,6,1 do
@ -435,13 +438,15 @@ function celevator.doors.carstep(dtime)
cardoors_moving[hash] = nil cardoors_moving[hash] = nil
end end
elseif data.direction == "close" then elseif data.direction == "close" then
data.time = data.time+(0.66*dtime) local speed = 0.66
if data.nudging then speed = 0.2 end
data.time = data.time+(speed*dtime)
local vel = math.sin(data.time) local vel = math.sin(data.time)
for i=1,3,1 do for i=1,3,1 do
celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*-0.66)) celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*-speed))
end end
for i=4,6,1 do for i=4,6,1 do
celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*-0.66)) celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*-speed))
end end
if data.time >= math.pi then if data.time >= math.pi then
for _,ref in ipairs(celevator.doors.erefs[hash]) do for _,ref in ipairs(celevator.doors.erefs[hash]) do
@ -570,7 +575,7 @@ function celevator.doors.caropen(pos)
end end
end end
function celevator.doors.carclose(pos) function celevator.doors.carclose(pos,nudge)
local cardoors_moving = minetest.deserialize(celevator.storage:get_string("cardoors_moving")) or {} local cardoors_moving = minetest.deserialize(celevator.storage:get_string("cardoors_moving")) or {}
local hash = minetest.hash_node_position(pos) local hash = minetest.hash_node_position(pos)
if cardoors_moving[hash] then if cardoors_moving[hash] then
@ -594,11 +599,20 @@ function celevator.doors.carclose(pos)
erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),soffset)) erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),soffset))
end end
celevator.doors.erefs[hash] = erefs celevator.doors.erefs[hash] = erefs
if nudge then
data.soundhandle = minetest.sound_play("celevator_nudge",{
pos = pos,
gain = 0.75,
max_hear_distance = 10
})
else
data.soundhandle = minetest.sound_play("celevator_door_close",{ data.soundhandle = minetest.sound_play("celevator_door_close",{
pos = pos, pos = pos,
gain = 0.3, gain = 0.3,
max_hear_distance = 10 max_hear_distance = 10
}) })
end
data.nudging = nudge
cardoors_moving[hash] = data cardoors_moving[hash] = data
celevator.storage:set_string("cardoors_moving",minetest.serialize(cardoors_moving)) celevator.storage:set_string("cardoors_moving",minetest.serialize(cardoors_moving))
end end

View File

@ -632,7 +632,7 @@ function celevator.drives.entity.getstatus(pos,call2)
end end
end end
function celevator.drives.entity.movedoors(drivepos,direction) function celevator.drives.entity.movedoors(drivepos,direction,nudge)
local drivehash = minetest.hash_node_position(drivepos) local drivehash = minetest.hash_node_position(drivepos)
local entitydrives_running = minetest.deserialize(celevator.storage:get_string("entitydrives_running")) or {} local entitydrives_running = minetest.deserialize(celevator.storage:get_string("entitydrives_running")) or {}
local drivemeta = celevator.get_meta(drivepos) local drivemeta = celevator.get_meta(drivepos)
@ -657,7 +657,7 @@ function celevator.drives.entity.movedoors(drivepos,direction)
celevator.doors.hwopen(hwdoorpos,drivepos) celevator.doors.hwopen(hwdoorpos,drivepos)
drivemeta:set_string("doorstate","opening") drivemeta:set_string("doorstate","opening")
elseif direction == "close" and celevator.get_node(hwdoorpos).name == "celevator:hwdoor_placeholder" then elseif direction == "close" and celevator.get_node(hwdoorpos).name == "celevator:hwdoor_placeholder" then
celevator.doors.hwclose(hwdoorpos,drivepos) celevator.doors.hwclose(hwdoorpos,drivepos,nudge)
drivemeta:set_string("doorstate","closing") drivemeta:set_string("doorstate","closing")
end end
end end

View File

@ -37,6 +37,8 @@ minetest.register_entity("celevator:incar_pi_entity",{
text = " IS" text = " IS"
elseif carinfo.flash_fs and os.time()%2 == 0 then elseif carinfo.flash_fs and os.time()%2 == 0 then
text = " FS" text = " FS"
elseif carinfo.flash_blank and os.time()%2 == 0 then
text = " "
end end
local etex = celevator.pi.generatetexture(text,carinfo.piuparrow,carinfo.pidownarrow,false,true) local etex = celevator.pi.generatetexture(text,carinfo.piuparrow,carinfo.pidownarrow,false,true)
self.object:set_properties({textures = {etex}}) self.object:set_properties({textures = {etex}})

BIN
sounds/celevator_nudge.ogg Normal file

Binary file not shown.