e5edbece2b
Car will now continue moving if the up/down buttons on the car top box are held, instead of stopping every 1m. When the buttons are released, it will stop at the next multiple of 1m.
747 lines
22 KiB
Lua
747 lines
22 KiB
Lua
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 held = {}
|
|
|
|
minetest.register_globalstep(function()
|
|
for k,v in ipairs(held) do
|
|
local player = minetest.get_player_by_name(v.name)
|
|
if not (player and player:get_player_control()[v.button]) then
|
|
table.remove(held,k)
|
|
celevator.controller.handlecartopbox(v.pos,v.control.."_release")
|
|
end
|
|
end
|
|
end)
|
|
|
|
local pieces = {
|
|
{
|
|
_position = "000",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5,-0.6,-0.5,0.5,-0.5,0.5},
|
|
{-0.5,-0.5,-0.5,-0.45,0.5,0.5},
|
|
{-0.5,-1.5,-0.5,0.5,-0.6,-0.45},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_car_floor.png^celevator_door_sill_single.png",
|
|
"celevator_car_bottom.png",
|
|
"celevator_car_wallpaper.png^celevator_car_wall_bottom.png^celevator_car_switch_panel.png",
|
|
"celevator_cabinet_sides.png^celevator_car_side_overlay.png^[transformR90",
|
|
"celevator_cabinet_sides.png",
|
|
},
|
|
on_timer = function(pos)
|
|
local carid = minetest.get_meta(pos):get_int("carid")
|
|
local carinfo = minetest.deserialize(celevator.storage:get_string(string.format("car%d",carid)))
|
|
if not (carinfo and carinfo.controllerpos) then return end
|
|
local yaw = minetest.dir_to_yaw(minetest.fourdir_to_dir(minetest.get_node(pos).param2))
|
|
local positions = {
|
|
vector.new(-0.25,-0.1,-0.5),
|
|
vector.new(0.25,-0.1,-0.5),
|
|
vector.new(0.75,-0.1,-0.5),
|
|
vector.new(1.25,-0.1,-0.5),
|
|
}
|
|
local playerseen = false
|
|
for _,searchpos in ipairs(positions) do
|
|
local rotatedpos = vector.rotate_around_axis(searchpos,vector.new(0,1,0),yaw)
|
|
local erefs = minetest.get_objects_inside_radius(vector.add(pos,rotatedpos),0.5)
|
|
for _,ref in pairs(erefs) do
|
|
if ref:is_player() then
|
|
playerseen = true
|
|
break
|
|
end
|
|
end
|
|
if playerseen then break end
|
|
end
|
|
if playerseen then
|
|
celevator.controller.run(carinfo.controllerpos,{
|
|
type = "lightcurtain",
|
|
})
|
|
end
|
|
return true
|
|
end,
|
|
},
|
|
{
|
|
_position = "001",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5,-0.6,-0.5,0.5,-0.5,0.5},
|
|
{-0.5,-0.5,-0.5,-0.45,0.5,0.5},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_car_floor.png",
|
|
"celevator_car_bottom_center.png",
|
|
"celevator_car_wallpaper.png^celevator_car_wall_bottom.png^celevator_car_wall_vent.png",
|
|
"celevator_cabinet_sides.png^celevator_car_side_center_overlay.png",
|
|
"celevator_cabinet_sides.png",
|
|
},
|
|
},
|
|
{
|
|
_position = "002",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5,-0.6,-0.5,0.5,-0.5,0.5},
|
|
{-0.5,-0.5,-0.5,-0.45,0.5,0.5},
|
|
{-0.45,-0.5,0.45,0.5,0.5,0.5},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_car_floor.png",
|
|
"celevator_car_bottom.png",
|
|
"celevator_car_wallpaper.png^celevator_car_wall_bottom.png",
|
|
"celevator_cabinet_sides.png^celevator_car_side_overlay.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_car_wallpaper.png^celevator_car_wall_bottom.png",
|
|
},
|
|
},
|
|
{
|
|
_position = "100",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5,-0.6,-0.5,0.5,-0.5,0.5},
|
|
{0.45,-0.5,-0.5,0.5,0.5,0.5},
|
|
{-0.5,-1.5,-0.5,0.5,-0.6,-0.45},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_car_floor.png^celevator_door_sill_double.png",
|
|
"celevator_car_bottom.png",
|
|
"celevator_cabinet_sides.png^celevator_car_side_overlay.png",
|
|
"celevator_car_wallpaper.png^celevator_car_wall_bottom.png",
|
|
"celevator_cabinet_sides.png",
|
|
},
|
|
},
|
|
{
|
|
_position = "101",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5,-0.6,-0.5,0.5,-0.5,0.5},
|
|
{0.45,-0.5,-0.5,0.5,0.5,0.5},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_car_floor.png",
|
|
"celevator_car_bottom_center.png^[transformFX",
|
|
"celevator_cabinet_sides.png^celevator_car_side_center_overlay.png",
|
|
"celevator_car_wallpaper.png^celevator_car_wall_bottom.png^celevator_car_wall_vent.png",
|
|
"celevator_cabinet_sides.png",
|
|
},
|
|
},
|
|
{
|
|
_position = "102",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5,-0.6,-0.5,0.5,-0.5,0.5},
|
|
{0.45,-0.5,-0.5,0.5,0.5,0.5},
|
|
{-0.5,-0.5,0.45,0.45,0.5,0.5},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_car_floor.png",
|
|
"celevator_car_bottom.png",
|
|
"celevator_cabinet_sides.png^celevator_car_side_overlay.png^[transformR90",
|
|
"celevator_car_wallpaper.png^celevator_car_wall_bottom.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_car_wallpaper.png^celevator_car_wall_bottom.png",
|
|
},
|
|
},
|
|
{
|
|
_position = "010",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5,-0.5,-0.5,-0.45,0.5,0.5},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_car_wallpaper_2x.png^celevator_cop.png",
|
|
"celevator_cabinet_sides.png",
|
|
},
|
|
},
|
|
{
|
|
_position = "011",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5,-0.5,-0.5,-0.45,0.5,0.5},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_car_wallpaper.png^celevator_car_handrail_end.png",
|
|
"celevator_cabinet_sides.png^celevator_car_side_center2_overlay.png",
|
|
"celevator_cabinet_sides.png",
|
|
},
|
|
},
|
|
{
|
|
_position = "012",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5,-0.5,-0.5,-0.45,0.5,0.5},
|
|
{-0.45,-0.5,0.45,0.5,0.5,0.5},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_car_wallpaper.png^(celevator_car_handrail_end.png^[transformFX)",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_car_wallpaper.png^celevator_car_handrail_end.png",
|
|
},
|
|
},
|
|
{
|
|
_position = "110",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{0.45,-0.5,-0.5,0.5,0.5,0.5},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_car_wallpaper.png^(celevator_car_handrail_end.png^[transformFX)",
|
|
"celevator_cabinet_sides.png",
|
|
},
|
|
},
|
|
{
|
|
_position = "111",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{0.45,-0.5,-0.5,0.5,0.5,0.5},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_cabinet_sides.png^celevator_car_side_center2_overlay.png",
|
|
"celevator_car_wallpaper.png^celevator_car_handrail_center.png",
|
|
"celevator_cabinet_sides.png",
|
|
},
|
|
},
|
|
{
|
|
_position = "112",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{0.45,-0.5,-0.5,0.5,0.5,0.5},
|
|
{-0.5,-0.5,0.45,0.45,0.5,0.5},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_car_wallpaper.png^celevator_car_handrail_end.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_car_wallpaper.png^(celevator_car_handrail_end.png^[transformFX)",
|
|
},
|
|
},
|
|
{
|
|
_position = "020",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5,0.5,-0.5,0.5,0.6,0.5},
|
|
{-0.5,-0.5,-0.5,-0.45,0.5,0.5},
|
|
{-0.5,0.6,-0.4,0.5,1,-0.1},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_car_ceiling.png",
|
|
"celevator_car_wallpaper.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_dooroperator_left.png",
|
|
},
|
|
},
|
|
{
|
|
_position = "021",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5,0.5,-0.5,0.5,0.6,0.5},
|
|
{-0.5,-0.5,-0.5,-0.45,0.5,0.5},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_cabinet_sides.png^celevator_car_top_center_overlay.png",
|
|
"celevator_car_ceiling.png",
|
|
"celevator_car_wallpaper.png",
|
|
"celevator_cabinet_sides.png^celevator_car_side_center_overlay.png",
|
|
"celevator_cabinet_sides.png",
|
|
},
|
|
on_rightclick = function(pos,node,clicker)
|
|
local name = clicker:get_player_name()
|
|
for _,v in ipairs(held) do
|
|
if name == v.name then return end
|
|
end
|
|
local fdir = minetest.fourdir_to_dir(node.param2)
|
|
local control = disambiguatebutton(pos,fdir,clicker)
|
|
if not control then return end
|
|
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
|
|
if control == "inspectswitch" then
|
|
local boxpos = vector.add(pos,vector.new(0,1,0))
|
|
local erefs = minetest.get_objects_inside_radius(boxpos,0.5)
|
|
for _,ref in pairs(erefs) do
|
|
if ref:get_luaentity() and ref:get_luaentity().name == "celevator:car_top_box" then
|
|
local state = ref:get_properties().wield_item
|
|
if state == "celevator:car_top_box_off" then
|
|
state = "celevator:car_top_box_on"
|
|
elseif state == "celevator:car_top_box_on" then
|
|
state = "celevator:car_top_box_off"
|
|
end
|
|
ref:set_properties({wield_item = state})
|
|
end
|
|
end
|
|
end
|
|
celevator.controller.handlecartopbox(carinfo.controllerpos,control)
|
|
table.insert(held,{
|
|
pos = carinfo.controllerpos,
|
|
name = name,
|
|
button = "place",
|
|
control = 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",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5,0.5,-0.5,0.5,0.6,0.5},
|
|
{-0.5,-0.5,-0.5,-0.45,0.5,0.5},
|
|
{-0.45,-0.5,0.45,0.5,0.5,0.5},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_cabinet_sides.png^celevator_car_top_hatch.png",
|
|
"celevator_car_ceiling.png",
|
|
"celevator_car_wallpaper.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_car_wallpaper.png",
|
|
},
|
|
},
|
|
{
|
|
_position = "120",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5,0.5,-0.5,0.5,0.6,0.5},
|
|
{0.45,-0.5,-0.5,0.5,0.5,0.5},
|
|
{-0.5,0.6,-0.4,0.5,1,-0.1},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_car_ceiling.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_car_wallpaper.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_dooroperator_right.png",
|
|
},
|
|
},
|
|
{
|
|
_position = "121",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5,0.5,-0.5,0.5,0.6,0.5},
|
|
{0.45,-0.5,-0.5,0.5,0.5,0.5},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_cabinet_sides.png^celevator_car_top_center_overlay.png^[transformFX",
|
|
"celevator_car_ceiling.png",
|
|
"celevator_cabinet_sides.png^celevator_car_side_center_overlay.png",
|
|
"celevator_car_wallpaper.png",
|
|
"celevator_cabinet_sides.png",
|
|
},
|
|
},
|
|
{
|
|
_position = "122",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5,0.5,-0.5,0.5,0.6,0.5},
|
|
{0.45,-0.5,-0.5,0.5,0.5,0.5},
|
|
{-0.5,-0.5,0.45,0.45,0.5,0.5},
|
|
},
|
|
},
|
|
tiles = {
|
|
"celevator_cabinet_sides.png^celevator_car_top_misc.png",
|
|
"celevator_car_ceiling.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_car_wallpaper.png",
|
|
"celevator_cabinet_sides.png",
|
|
"celevator_car_wallpaper.png",
|
|
},
|
|
},
|
|
}
|
|
|
|
for _,def in ipairs(pieces) do
|
|
def.groups = {
|
|
not_in_creative_inventory = 1,
|
|
_celevator_car = 1,
|
|
}
|
|
local xp = tonumber(string.sub(def._position,1,1))
|
|
local yp = tonumber(string.sub(def._position,2,2))
|
|
local zp = tonumber(string.sub(def._position,3,3))
|
|
if xp > 0 then
|
|
def.groups._connects_xm = 1
|
|
end
|
|
if xp < 1 then
|
|
def.groups._connects_xp = 1
|
|
end
|
|
if yp > 0 then
|
|
def.groups._connects_ym = 1
|
|
end
|
|
if yp < 2 then
|
|
def.groups._connects_yp = 1
|
|
end
|
|
if zp > 0 then
|
|
def.groups._connects_zm = 1
|
|
end
|
|
if zp < 2 then
|
|
def.groups._connects_zp = 1
|
|
end
|
|
def.paramtype = "light"
|
|
def.paramtype2 = "4dir"
|
|
def.drawtype = "nodebox"
|
|
def.description = "Car "..def._position.." (you hacker you!)"
|
|
def.light_source = 9
|
|
def.drop = ""
|
|
def.on_receive_fields = function(pos,_,fields,player)
|
|
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 then return end
|
|
local nname = minetest.get_node(pos).name
|
|
if nname == "celevator:car_010" then
|
|
local name = player:get_player_name()
|
|
local protected = minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true})
|
|
local event = {
|
|
type = "cop",
|
|
fields = fields,
|
|
player = player:get_player_name(),
|
|
protected = protected,
|
|
}
|
|
celevator.controller.run(carinfo.controllerpos,event)
|
|
elseif nname == "celevator:car_000" then
|
|
if fields.quit then return end
|
|
local name = player:get_player_name()
|
|
if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
|
|
minetest.chat_send_player(name,"You don't have access to these switches.")
|
|
minetest.record_protection_violation(pos,name)
|
|
return
|
|
end
|
|
local event = {
|
|
type = "copswitches",
|
|
fields = fields,
|
|
player = name,
|
|
}
|
|
celevator.controller.run(carinfo.controllerpos,event)
|
|
end
|
|
end
|
|
if def._position == "000" then
|
|
def.on_construct = function(pos)
|
|
minetest.get_meta(pos):set_string("doorstate","closed")
|
|
end
|
|
def.on_punch = function(pos,_,player)
|
|
if player.is_fake_player then return end
|
|
local name = player:get_player_name()
|
|
local sneak = player:get_player_control().sneak
|
|
if not sneak then return end
|
|
if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
|
|
minetest.record_protection_violation(pos,name)
|
|
return
|
|
end
|
|
local hash = minetest.hash_node_position(pos)
|
|
local fs = "formspec_version[7]size[6,4]"
|
|
fs = fs.."label[0.5,1;Really remove this car?]"
|
|
fs = fs.."button_exit[0.5,2;2,1;yes;Yes]"
|
|
fs = fs.."button_exit[3,2;2,1;no;No]"
|
|
minetest.show_formspec(name,string.format("celevator:remove_car_%d",hash),fs)
|
|
end
|
|
end
|
|
minetest.register_node("celevator:car_"..def._position,def)
|
|
end
|
|
|
|
function celevator.car.spawncar(origin,yaw,carid)
|
|
local right = vector.rotate_around_axis(vector.new(1,0,0),vector.new(0,1,0),yaw)
|
|
local back = vector.rotate_around_axis(vector.new(0,0,1),vector.new(0,1,0),yaw)
|
|
local up = vector.new(0,1,0)
|
|
for x=0,1,1 do
|
|
for y=0,2,1 do
|
|
for z=0,2,1 do
|
|
local pos = vector.copy(origin)
|
|
pos = vector.add(pos,vector.multiply(right,x))
|
|
pos = vector.add(pos,vector.multiply(back,z))
|
|
pos = vector.add(pos,vector.multiply(up,y))
|
|
local node = {
|
|
name = string.format("celevator:car_%d%d%d",x,y,z),
|
|
param2 = minetest.dir_to_fourdir(minetest.yaw_to_dir(yaw)),
|
|
}
|
|
minetest.set_node(pos,node)
|
|
if carid then minetest.get_meta(pos):set_int("carid",carid) end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
minetest.register_abm({
|
|
label = "Respawn in-car PI displays",
|
|
nodenames = {"celevator:car_020"},
|
|
interval = 1,
|
|
chance = 1,
|
|
action = function(pos)
|
|
local entitiesnearby = minetest.get_objects_inside_radius(pos,0.5)
|
|
for _,i in pairs(entitiesnearby) do
|
|
if i:get_luaentity() and i:get_luaentity().name == "celevator:incar_pi_entity" then
|
|
return
|
|
end
|
|
end
|
|
local entity = minetest.add_entity(pos,"celevator:incar_pi_entity")
|
|
local fdir = vector.rotate_around_axis(minetest.facedir_to_dir(minetest.get_node(pos).param2),vector.new(0,1,0),math.pi/2)
|
|
local etex = celevator.pi.generatetexture(" --",false,false,false,true)
|
|
entity:set_properties({
|
|
textures = {etex},
|
|
})
|
|
entity:set_yaw(minetest.dir_to_yaw(fdir))
|
|
entity:set_pos(vector.add(pos,vector.multiply(fdir,0.44)))
|
|
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,
|
|
glow = minetest.LIGHT_MAX,
|
|
},
|
|
})
|
|
|
|
minetest.register_abm({
|
|
label = "Respawn car-top inspection boxes",
|
|
nodenames = {"celevator:car_021"},
|
|
interval = 1,
|
|
chance = 1,
|
|
action = updatecartopbox,
|
|
})
|
|
|
|
minetest.register_node("celevator:car",{
|
|
description = "Elevator Car",
|
|
paramtype2 = "4dir",
|
|
buildable_to = true,
|
|
inventory_image = "celevator_car_inventory.png",
|
|
wield_image = "celevator_car_wield.png",
|
|
wield_scale = vector.new(1,1,10),
|
|
tiles = {"celevator_transparent.png"},
|
|
after_place_node = function(pos,player)
|
|
if not player:is_player() then
|
|
minetest.remove_node(pos)
|
|
return true
|
|
end
|
|
local name = player:get_player_name()
|
|
local newnode = minetest.get_node(pos)
|
|
local facedir = minetest.dir_to_yaw(minetest.fourdir_to_dir(newnode.param2))
|
|
for x=0,1,1 do
|
|
for y=0,2,1 do
|
|
for z=0,2,1 do
|
|
local offsetdesc = string.format("%dm to the right, %dm up, and %dm back",x,y,z)
|
|
local placeoffset = vector.new(x,y,z)
|
|
local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir))
|
|
local replaces = minetest.get_node(placepos).name
|
|
if not (minetest.registered_nodes[replaces] and minetest.registered_nodes[replaces].buildable_to) then
|
|
minetest.chat_send_player(name,string.format("Can't place car here - position %s is blocked!",offsetdesc))
|
|
minetest.remove_node(pos)
|
|
return true
|
|
end
|
|
if minetest.is_protected(placepos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
|
|
minetest.chat_send_player(name,string.format("Can't place car here - position %s is protected!",offsetdesc))
|
|
minetest.record_protection_violation(placepos,name)
|
|
minetest.remove_node(pos)
|
|
return true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
for x=0,1,1 do
|
|
for y=0,2,1 do
|
|
for z=0,2,1 do
|
|
local piecename = string.format("celevator:car_%d%d%d",x,y,z)
|
|
local placeoffset = vector.new(x,y,z)
|
|
local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir))
|
|
minetest.set_node(placepos,{name=piecename,param2=newnode.param2})
|
|
end
|
|
end
|
|
end
|
|
end,
|
|
})
|
|
|
|
minetest.register_on_player_receive_fields(function(_,formname,fields)
|
|
if string.sub(formname,1,21) ~= "celevator:remove_car_" then return false end
|
|
if not fields.yes then return true end
|
|
local hash = tonumber(string.sub(formname,22,-1))
|
|
if not hash then return true end
|
|
local rootpos = minetest.get_position_from_hash(hash)
|
|
local rootdir = minetest.dir_to_yaw(minetest.fourdir_to_dir(minetest.get_node(rootpos).param2))
|
|
local toberemoved = {
|
|
["celevator:car_top_box"] = true,
|
|
["celevator:incar_pi_entity"] = true,
|
|
["celevator:car_door"] = true,
|
|
}
|
|
for x=0,1,1 do
|
|
for y=0,2,1 do
|
|
for z=0,2,1 do
|
|
local piecename = string.format("celevator:car_%d%d%d",x,y,z)
|
|
local pieceoffset = vector.new(x,y,z)
|
|
local piecepos = vector.add(rootpos,vector.rotate_around_axis(pieceoffset,vector.new(0,1,0),rootdir))
|
|
if minetest.get_node(piecepos).name == piecename then
|
|
minetest.remove_node(piecepos)
|
|
local erefs = minetest.get_objects_inside_radius(piecepos,0.5)
|
|
for _,ref in pairs(erefs) do
|
|
if ref:get_luaentity() and toberemoved[ref:get_luaentity().name] then
|
|
ref:remove()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
local cartopboxpos = vector.add(rootpos,vector.rotate_around_axis(vector.new(0,3,1),vector.new(0,1,0),rootdir))
|
|
local erefs = minetest.get_objects_inside_radius(cartopboxpos,0.5)
|
|
for _,ref in pairs(erefs) do
|
|
if ref:get_luaentity() and toberemoved[ref:get_luaentity().name] then
|
|
ref:remove()
|
|
end
|
|
end
|
|
end)
|