diff options
author | cheapie <no-email-for-you@example.com> | 2025-03-15 13:02:27 -0500 |
---|---|---|
committer | cheapie <no-email-for-you@example.com> | 2025-03-15 13:02:27 -0500 |
commit | feea683ef8d8a7a4c8be692e7ad1749904b2921a (patch) | |
tree | b8bf8646cdfc42b235ee3d77b85a8b4cf2628d04 /car.lua | |
parent | 9adad1127871b11ec541edf52de7914903359f43 (diff) | |
download | celevator-feea683ef8d8a7a4c8be692e7ad1749904b2921a.tar celevator-feea683ef8d8a7a4c8be692e7ad1749904b2921a.tar.gz celevator-feea683ef8d8a7a4c8be692e7ad1749904b2921a.tar.bz2 celevator-feea683ef8d8a7a4c8be692e7ad1749904b2921a.tar.xz celevator-feea683ef8d8a7a4c8be692e7ad1749904b2921a.zip |
Add glass-back car
Diffstat (limited to 'car.lua')
-rw-r--r-- | car.lua | 746 |
1 files changed, 188 insertions, 558 deletions
@@ -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) |