Add car top inspection
This commit is contained in:
parent
b05fc296e3
commit
5b91601b6e
132
car.lua
132
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,
|
||||
})
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
BIN
textures/celevator_cartopinsp_off.png
Normal file
BIN
textures/celevator_cartopinsp_off.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.8 KiB |
BIN
textures/celevator_cartopinsp_on.png
Normal file
BIN
textures/celevator_cartopinsp_on.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.8 KiB |
Loading…
x
Reference in New Issue
Block a user