From 5b91601b6ee00919df59cd0121ec668668fdb4a9 Mon Sep 17 00:00:00 2001 From: cheapie Date: Sun, 14 Apr 2024 18:49:14 -0500 Subject: [PATCH] Add car top inspection --- car.lua | 132 ++++++++++++++++++++++++++ controller.lua | 14 +++ controllerfw.lua | 42 +++++++- drive_entity.lua | 8 ++ textures/celevator_cartopinsp_off.png | Bin 0 -> 10059 bytes textures/celevator_cartopinsp_on.png | Bin 0 -> 10065 bytes 6 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 textures/celevator_cartopinsp_off.png create mode 100644 textures/celevator_cartopinsp_on.png diff --git a/car.lua b/car.lua index b127767..61937fc 100644 --- a/car.lua +++ b/car.lua @@ -1,5 +1,61 @@ celevator.car = {} +local function disambiguatebutton(pos,facedir,player) + if player and not player.is_fake_player then + local eyepos = vector.add(player:get_pos(),vector.add(player:get_eye_offset(),vector.new(0,1.5,0))) + local lookdir = player:get_look_dir() + local distance = vector.distance(eyepos,pos) + local endpos = vector.add(eyepos,vector.multiply(lookdir,distance+1)) + local ray = minetest.raycast(eyepos,endpos,true,false) + local pointed,button,hitpos + repeat + pointed = ray:next() + if pointed and pointed.type == "node" then + local node = minetest.get_node(pointed.under) + if node.name == "celevator:car_021" then + button = pointed.under + hitpos = vector.subtract(pointed.intersection_point,button) + end + end + until button or not pointed + if not hitpos then return end + hitpos = vector.rotate_around_axis(hitpos,vector.new(0,-1,0),minetest.dir_to_yaw(facedir)+(math.pi/2)) + if hitpos.y < 0.55 then return end + if hitpos.z > 0.36 or hitpos.z < 0.09 then return end + if hitpos.x >= -0.36 and hitpos.x <= -0.16 then + return "inspectswitch" + elseif hitpos.x > -0.16 and hitpos.x <= 0.03 then + return "up" + elseif hitpos.x > 0.03 and hitpos.x <= 0.2 then + return "down" + end + end +end + +local function updatecartopbox(pos) + local toppos = vector.add(pos,vector.new(0,1.1,0)) + local entitiesnearby = minetest.get_objects_inside_radius(toppos,0.5) + for _,i in pairs(entitiesnearby) do + if i:get_luaentity() and i:get_luaentity().name == "celevator:car_top_box" then + i:remove() + end + end + local carmeta = minetest.get_meta(pos) + local carid = carmeta:get_int("carid") + if carid == 0 then return end + local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) + if not carinfo then return end + local entity = minetest.add_entity(pos,"celevator:car_top_box") + local inspon = carinfo.cartopinspect + entity:set_properties({ + wield_item = inspon and "celevator:car_top_box_on" or "celevator:car_top_box_off", + }) + local fdir = minetest.fourdir_to_dir(minetest.get_node(pos).param2) + fdir = vector.rotate_around_axis(fdir,vector.new(0,1,0),math.pi/2) + entity:set_yaw(minetest.dir_to_yaw(fdir)) + entity:set_pos(toppos) +end + local pieces = { { _position = "000", @@ -237,6 +293,25 @@ local pieces = { "celevator_car_wallpaper.png", "celevator_cabinet_sides.png", }, + on_rightclick = function(pos,node,clicker) + local fdir = minetest.fourdir_to_dir(node.param2) + local control = disambiguatebutton(pos,fdir,clicker) + local meta = minetest.get_meta(pos) + local carid = meta:get_int("carid") + if carid == 0 then return end + local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid))) + if not (carinfo and carinfo.controllerpos) then return end + celevator.controller.handlecartopbox(carinfo.controllerpos,control) + end, + after_dig_node = function(pos) + local toppos = vector.add(pos,vector.new(0,1.1,0)) + local entitiesnearby = minetest.get_objects_inside_radius(toppos,0.5) + for _,i in pairs(entitiesnearby) do + if i:get_luaentity() and i:get_luaentity().name == "celevator:car_top_box" then + i:remove() + end + end + end, }, { _position = "022", @@ -427,3 +502,60 @@ minetest.register_abm({ end, }) +minetest.register_node("celevator:car_top_box_off",{ + description = "Car-top Inspection Box, Off State (you hacker you!)", + drop = "", + groups = { + not_in_creative_inventory = 1, + }, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.422,-0.5,0.086,0.414,-0.45,0.359}, + }, + }, + tiles = { + "celevator_cartopinsp_off.png", + "celevator_cabinet_sides.png", + }, +}) + +minetest.register_node("celevator:car_top_box_on",{ + description = "Car-top Inspection Box, On State (you hacker you!)", + drop = "", + groups = { + not_in_creative_inventory = 1, + }, + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.422,-0.5,0.086,0.414,-0.45,0.359}, + }, + }, + tiles = { + "celevator_cartopinsp_on.png", + "celevator_cabinet_sides.png", + }, +}) + +minetest.register_entity("celevator:car_top_box",{ + initial_properties = { + visual = "wielditem", + visual_size = vector.new(0.667,0.667,0.667), + wield_item = "celevator:car_top_box_off", + static_save = false, + pointable = false, + }, +}) + +minetest.register_abm({ + label = "Respawn car-top inspection boxes", + nodenames = {"celevator:car_021"}, + interval = 1, + chance = 1, + action = updatecartopbox, +}) diff --git a/controller.lua b/controller.lua index 0912776..d60e2be 100644 --- a/controller.lua +++ b/controller.lua @@ -517,6 +517,12 @@ function celevator.controller.finish(pos,mem,changedinterrupts) celevator.fs1switch.setled(fs1switch.pos,newfs1led) end end + local oldcartopinsp = oldmem.cartopinspectsw + local newcartopinsp = mem.cartopinspectsw + if oldcartopinsp ~= newcartopinsp then + carinfodirty = true + carinfo.cartopinspect = newcartopinsp + end meta:set_string("copformspec",mem.copformspec) meta:set_string("switchformspec",mem.switchformspec) if (mem.copformspec ~= oldmem.copformspec or mem.switchformspec ~= oldmem.switchformspec) and drivetype then @@ -601,6 +607,14 @@ function celevator.controller.handlefs1switch(controllerpos,on) celevator.controller.run(controllerpos,event) end +function celevator.controller.handlecartopbox(controllerpos,control) + local event = { + type = "cartopbox", + control = control, + } + celevator.controller.run(controllerpos,event) +end + function celevator.controller.checkiqueue(dtime) for hash,iqueue in pairs(celevator.controller.iqueue) do local pos = minetest.get_position_from_hash(hash) diff --git a/controllerfw.lua b/controllerfw.lua index 6401c03..07ba86a 100644 --- a/controllerfw.lua +++ b/controllerfw.lua @@ -496,6 +496,32 @@ elseif event.type == "copswitches" then elseif event.type == "fs1switch" then mem.fs1switch = event.state mem.fs1led = event.state +elseif event.type == "cartopbox" then + if event.control == "inspectswitch" then + mem.cartopinspectsw = not mem.cartopinspectsw + elseif event.control == "up" and mem.carstate == "carinspect" and mem.doorstate == "closed" and getpos() < #mem.params.floornames then + mem.carmotion = true + juststarted = true + drivecmd({ + command = "setmaxvel", + maxvel = 0.2, + }) + drivecmd({ + command = "moveto", + pos = math.floor(mem.drive.status.apos)+1 + }) + elseif event.control == "down" and mem.carstate == "carinspect" and mem.doorstate == "closed" and mem.drive.status.apos-1 >= 0 then + mem.carmotion = true + juststarted = true + drivecmd({ + command = "setmaxvel", + maxvel = 0.2, + }) + drivecmd({ + command = "moveto", + pos = math.floor(mem.drive.status.apos)-1 + }) + end end local oldstate = mem.carstate @@ -514,6 +540,13 @@ elseif mem.controllerstopsw or mem.screenstate == "floortable" or mem.screenstat mem.upcalls = {} mem.dncalls = {} mem.direction = nil +elseif mem.controllerinspectsw and mem.cartopinspectsw then + mem.carstate = "inspconflict" + mem.carcalls = {} + mem.upcalls = {} + mem.dncalls = {} + mem.direction = nil + drivecmd({command="estop"}) elseif mem.controllerinspectsw and not mem.cartopinspectsw then mem.carstate = "mrinspect" mem.carcalls = {} @@ -521,6 +554,13 @@ elseif mem.controllerinspectsw and not mem.cartopinspectsw then mem.dncalls = {} mem.direction = nil if oldstate ~= "mrinspect" then drivecmd({command="estop"}) end +elseif mem.cartopinspectsw and not mem.controllerinspectsw then + mem.carstate = "carinspect" + mem.carcalls = {} + mem.upcalls = {} + mem.dncalls = {} + mem.direction = nil + if oldstate ~= "carinspect" then drivecmd({command="estop"}) end elseif mem.fs2sw == "on" then mem.carstate = "fs2" mem.upcalls = {} @@ -582,7 +622,7 @@ elseif mem.capturesw then mem.carstate = "capture" end else - if oldstate == "stop" or oldstate == "mrinspect" or oldstate == "fault" then + if oldstate == "stop" or oldstate == "mrinspect" or oldstate == "carinspect" or oldstate == "fault" then mem.carstate = "resync" gotofloor(getpos()) elseif oldstate == "test" or oldstate == "capture" or oldstate == "fs1" or oldstate == "fs2" or oldstate == "fs2hold" then diff --git a/drive_entity.lua b/drive_entity.lua index 35a4e71..8799b2f 100644 --- a/drive_entity.lua +++ b/drive_entity.lua @@ -223,10 +223,18 @@ function celevator.drives.entity.nodestoentities(nodes,ename) }) eref:set_yaw(minetest.dir_to_yaw(minetest.fourdir_to_dir(node.param2))) table.insert(refs,eref) + if node.name == "celevator:car_021" then + local toppos = vector.add(pos,vector.new(0,1,0)) + local topattach = minetest.get_objects_inside_radius(toppos,0.9) + for _,ref in pairs(topattach) do + table.insert(attach,ref) + end + end if not ename then --If ename is set, something other than the car is moving for _,attachref in ipairs(attach) do local included = { ["celevator:incar_pi_entity"] = true, + ["celevator:car_top_box"] = true, ["celevator:car_door"] = true, } if attachref:get_luaentity() and included[attachref:get_luaentity().name] then diff --git a/textures/celevator_cartopinsp_off.png b/textures/celevator_cartopinsp_off.png new file mode 100644 index 0000000000000000000000000000000000000000..16de1dd6bde4df6128a286b5fc16e87dcb04337e GIT binary patch literal 10059 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 literal 0 HcmV?d00001 diff --git a/textures/celevator_cartopinsp_on.png b/textures/celevator_cartopinsp_on.png new file mode 100644 index 0000000000000000000000000000000000000000..d393eef272bca58e49fbed4f9af5cf7fd0c631d7 GIT binary patch literal 10065 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 nsO|4*3b^~9e{cVb63cDrkt#t`kq|