summaryrefslogtreecommitdiff
path: root/car.lua
diff options
context:
space:
mode:
Diffstat (limited to 'car.lua')
-rw-r--r--car.lua746
1 files changed, 188 insertions, 558 deletions
diff --git a/car.lua b/car.lua
index 26d0fdc..1395d9d 100644
--- a/car.lua
+++ b/car.lua
@@ -1,6 +1,6 @@
celevator.car = {}
-local function disambiguatebutton(pos,facedir,player)
+local function disambiguatecartopbutton(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()
@@ -12,7 +12,8 @@ local function disambiguatebutton(pos,facedir,player)
pointed = ray:next()
if pointed and pointed.type == "node" then
local node = minetest.get_node(pointed.under)
- if node.name == "celevator:car_021" then
+ local ndef = minetest.registered_nodes[node.name] or {}
+ if ndef._cartopbox then
button = pointed.under
hitpos = vector.subtract(pointed.intersection_point,button)
end
@@ -68,503 +69,207 @@ minetest.register_globalstep(function()
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",
- })
+celevator.car.types = {}
+
+function celevator.car.register(name,defs,size)
+ celevator.car.types[name] = {
+ size = size,
+ }
+ for _,def in ipairs(defs) do
+ def._celevator_car_type = name
+ 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 < size.x-1 then
+ def.groups._connects_xp = 1
+ end
+ if yp > 0 then
+ def.groups._connects_ym = 1
+ end
+ if yp < size.y-1 then
+ def.groups._connects_yp = 1
+ end
+ if zp > 0 then
+ def.groups._connects_zm = 1
+ end
+ if zp < size.z-1 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 = ""
+ if def._cop then
+ 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 playername = player:get_player_name()
+ local protected = minetest.is_protected(pos,playername) and not minetest.check_player_privs(playername,{protection_bypass=true})
+ local event = {
+ type = "cop",
+ fields = fields,
+ player = playername,
+ protected = protected,
+ }
+ celevator.controller.run(carinfo.controllerpos,event)
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
+ elseif def._keyswitches then
+ def.on_receive_fields = function(pos,_,fields,player)
+ if fields.quit 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 then return end
+ local playername = player:get_player_name()
+ if minetest.is_protected(pos,playername) and not minetest.check_player_privs(playername,{protection_bypass=true}) then
+ minetest.chat_send_player(playername,"You don't have access to these switches.")
+ minetest.record_protection_violation(pos,playername)
+ return
+ end
+ local event = {
+ type = "copswitches",
+ fields = fields,
+ player = name,
+ }
+ celevator.controller.run(carinfo.controllerpos,event)
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
+ if def._cartopbox then
+ def.groups._celevator_car_spawnstopbox = 1
+ def.on_rightclick = function(pos,node,clicker)
+ local playername = clicker:get_player_name()
+ for _,v in ipairs(held) do
+ if playername == v.name then return end
+ end
+ local fdir = minetest.fourdir_to_dir(node.param2)
+ local control = disambiguatecartopbutton(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
- ref:set_properties({wield_item = state})
end
end
+ celevator.controller.handlecartopbox(carinfo.controllerpos,control)
+ table.insert(held,{
+ pos = carinfo.controllerpos,
+ name = playername,
+ button = "place",
+ control = control,
+ })
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()
+ def.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
- 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")
+ if def._pi then
+ def.groups._celevator_car_spawnspi = 1
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
+ if def._position == "000" then
+ def.groups._celevator_car_root = 1
+ def._root = true
+ 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 playername = player:get_player_name()
+ local sneak = player:get_player_control().sneak
+ if not sneak then return end
+ if minetest.is_protected(pos,playername) and not minetest.check_player_privs(playername,{protection_bypass=true}) then
+ minetest.record_protection_violation(pos,playername)
+ 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(playername,string.format("celevator:remove_car_%d",hash),fs)
+ end
+ def.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
- 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
+ minetest.register_node("celevator:car_"..name.."_"..def._position,def)
end
- minetest.register_node("celevator:car_"..def._position,def)
end
-function celevator.car.spawncar(origin,yaw,carid)
+function celevator.car.spawncar(origin,yaw,carid,name)
+ if (not name) or name == "" then name = "standard" end
+ local size = celevator.car.types[name].size
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
+ for x=0,(size.x-1),1 do
+ for y=0,(size.y-1),1 do
+ for z=0,(size.z-1),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),
+ name = string.format("celevator:car_%s_%d%d%d",name,x,y,z),
param2 = minetest.dir_to_fourdir(minetest.yaw_to_dir(yaw)),
}
minetest.set_node(pos,node)
@@ -576,7 +281,7 @@ end
minetest.register_abm({
label = "Respawn in-car PI displays",
- nodenames = {"celevator:car_020"},
+ nodenames = {"group:_celevator_car_spawnspi"},
interval = 1,
chance = 1,
action = function(pos)
@@ -650,97 +355,22 @@ minetest.register_entity("celevator:car_top_box",{
minetest.register_abm({
label = "Respawn car-top inspection boxes",
- nodenames = {"celevator:car_021"},
+ nodenames = {"group:_celevator_car_spawnstopbox"},
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
+ local rootdef = minetest.registered_nodes[celevator.get_node(rootpos).name] or {}
+ local cartype = rootdef._celevator_car_type
+ if cartype and celevator.car.types[cartype] then
+ local rootdir = minetest.dir_to_yaw(minetest.fourdir_to_dir(minetest.get_node(rootpos).param2))
+ celevator.car.types[cartype].remove(rootpos,rootdir)
end
end)