From a9db931534d1844cbfc96415e40c8e43b7a3a147 Mon Sep 17 00:00:00 2001 From: cheapie Date: Mon, 6 Jul 2026 16:52:31 -0500 Subject: Add center-opening doors --- car_fullglass.lua | 4 +- car_glassback.lua | 4 +- car_metal.lua | 4 +- car_metalglass.lua | 4 +- car_standard.lua | 4 +- crafts.lua | 18 + door_2speedglass.lua | 641 +++++++++++++++ door_2speedmetal.lua | 635 +++++++++++++++ door_centerglass.lua | 641 +++++++++++++++ door_centermetal.lua | 636 +++++++++++++++ doors.lua | 932 +--------------------- init.lua | 4 + locale/celevator.es.tr | 69 +- locale/template.txt | 69 +- textures/celevator_door_centerglass_inventory.png | Bin 0 -> 285 bytes textures/celevator_door_centermetal_inventory.png | Bin 0 -> 653 bytes textures/celevator_door_glass_inventory.png | Bin 244 -> 281 bytes textures/celevator_door_metal_inventory.png | Bin 571 -> 654 bytes textures/celevator_door_sill.png | Bin 0 -> 229 bytes textures/celevator_door_sill_double.png | Bin 4542 -> 0 bytes textures/celevator_door_sill_single.png | Bin 4544 -> 0 bytes 21 files changed, 2710 insertions(+), 955 deletions(-) create mode 100644 door_2speedglass.lua create mode 100644 door_2speedmetal.lua create mode 100644 door_centerglass.lua create mode 100644 door_centermetal.lua create mode 100644 textures/celevator_door_centerglass_inventory.png create mode 100644 textures/celevator_door_centermetal_inventory.png create mode 100644 textures/celevator_door_sill.png delete mode 100644 textures/celevator_door_sill_double.png delete mode 100644 textures/celevator_door_sill_single.png diff --git a/car_fullglass.lua b/car_fullglass.lua index 08a32e1..f934007 100644 --- a/car_fullglass.lua +++ b/car_fullglass.lua @@ -12,7 +12,7 @@ local pieces = { }, }, tiles = { - "celevator_car_metal_floor.png^celevator_door_sill_single.png", + "celevator_car_metal_floor.png^celevator_door_sill.png", "celevator_car_bottom.png", "celevator_car_metal.png^celevator_car_wall_bottom.png^celevator_car_switch_panel.png", "celevator_cabinet_sides.png^celevator_car_side_overlay.png^[transformR90", @@ -69,7 +69,7 @@ local pieces = { }, }, tiles = { - "celevator_car_metal_floor.png^celevator_door_sill_double.png", + "celevator_car_metal_floor.png^celevator_door_sill.png", "celevator_car_bottom.png", "celevator_cabinet_sides.png^celevator_car_side_overlay.png", "celevator_car_metal.png^celevator_car_wall_bottom.png", diff --git a/car_glassback.lua b/car_glassback.lua index 8569396..1c7163e 100644 --- a/car_glassback.lua +++ b/car_glassback.lua @@ -12,7 +12,7 @@ local pieces = { }, }, tiles = { - "celevator_car_floor.png^celevator_door_sill_single.png", + "celevator_car_floor.png^celevator_door_sill.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", @@ -68,7 +68,7 @@ local pieces = { }, }, tiles = { - "celevator_car_floor.png^celevator_door_sill_double.png", + "celevator_car_floor.png^celevator_door_sill.png", "celevator_car_bottom.png", "celevator_cabinet_sides.png^celevator_car_side_overlay.png", "celevator_car_wallpaper.png^celevator_car_wall_bottom.png", diff --git a/car_metal.lua b/car_metal.lua index 0516b95..c3d1a44 100644 --- a/car_metal.lua +++ b/car_metal.lua @@ -12,7 +12,7 @@ local pieces = { }, }, tiles = { - "celevator_car_metal_floor.png^celevator_door_sill_single.png", + "celevator_car_metal_floor.png^celevator_door_sill.png", "celevator_car_bottom.png", "celevator_car_metal.png^celevator_car_wall_bottom.png^celevator_car_switch_panel.png", "celevator_cabinet_sides.png^celevator_car_side_overlay.png^[transformR90", @@ -67,7 +67,7 @@ local pieces = { }, }, tiles = { - "celevator_car_metal_floor.png^celevator_door_sill_double.png", + "celevator_car_metal_floor.png^celevator_door_sill.png", "celevator_car_bottom.png", "celevator_cabinet_sides.png^celevator_car_side_overlay.png", "celevator_car_metal.png^celevator_car_wall_bottom.png", diff --git a/car_metalglass.lua b/car_metalglass.lua index 985cfa6..7ca944e 100644 --- a/car_metalglass.lua +++ b/car_metalglass.lua @@ -12,7 +12,7 @@ local pieces = { }, }, tiles = { - "celevator_car_metal_floor.png^celevator_door_sill_single.png", + "celevator_car_metal_floor.png^celevator_door_sill.png", "celevator_car_bottom.png", "celevator_car_metal.png^celevator_car_wall_bottom.png^celevator_car_switch_panel.png", "celevator_cabinet_sides.png^celevator_car_side_overlay.png^[transformR90", @@ -68,7 +68,7 @@ local pieces = { }, }, tiles = { - "celevator_car_metal_floor.png^celevator_door_sill_double.png", + "celevator_car_metal_floor.png^celevator_door_sill.png", "celevator_car_bottom.png", "celevator_cabinet_sides.png^celevator_car_side_overlay.png", "celevator_car_metal.png^celevator_car_wall_bottom.png", diff --git a/car_standard.lua b/car_standard.lua index 0a70ed0..44f74bb 100644 --- a/car_standard.lua +++ b/car_standard.lua @@ -12,7 +12,7 @@ local pieces = { }, }, tiles = { - "celevator_car_floor.png^celevator_door_sill_single.png", + "celevator_car_floor.png^celevator_door_sill.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", @@ -67,7 +67,7 @@ local pieces = { }, }, tiles = { - "celevator_car_floor.png^celevator_door_sill_double.png", + "celevator_car_floor.png^celevator_door_sill.png", "celevator_car_bottom.png", "celevator_cabinet_sides.png^celevator_car_side_overlay.png", "celevator_car_wallpaper.png^celevator_car_wall_bottom.png", diff --git a/crafts.lua b/crafts.lua index 4477532..241346f 100644 --- a/crafts.lua +++ b/crafts.lua @@ -312,6 +312,24 @@ core.register_craft({ }, }) +core.register_craft({ + output = "celevator:hwdoor_centerglass", + recipe = { + {m.steel_bar,"",m.steel_bar}, + {m.glass,m.steel_bar,m.glass}, + {m.steel_bar,m.steel_bar,m.steel_bar}, + }, +}) + +core.register_craft({ + output = "celevator:hwdoor_centersteel", + recipe = { + {m.steel_bar,"",m.steel_bar}, + {m.steel_strip,m.steel_bar,m.steel_strip}, + {m.steel_bar,m.steel_bar,m.steel_bar}, + }, +}) + core.register_craft({ output = "celevator:lantern_up", recipe = { diff --git a/door_2speedglass.lua b/door_2speedglass.lua new file mode 100644 index 0000000..22eafab --- /dev/null +++ b/door_2speedglass.lua @@ -0,0 +1,641 @@ +celevator.doors.twospeedglass = {} + +local S = core.get_translator("celevator") + +core.register_node("celevator:hwdoor_fast_glass_bottom",{ + description = S("Glass Hoistway Door (fast, bottom - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_topbottom.png^[transformFY", + "celevator_door_glass_topbottom.png^[transformFY", + }, + groups = { + not_in_creative_inventory = 1, + _celevator_hwdoor_root = 1, + oddly_breakable_by_hand = 2, + }, + drop = "celevator:hwdoor_glass", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + after_dig_node = function(pos,node) + local erefs = core.get_objects_inside_radius(pos,1.5) + for _,ref in pairs(erefs) do + if ref:get_luaentity() and ref:get_luaentity().name == "celevator:door_sill" then ref:remove() end + end + local facedir = core.dir_to_yaw(core.fourdir_to_dir(node.param2)) + local xnames = { + [0] = "fast", + [1] = "slow", + } + local ynames = { + [0] = "bottom", + [1] = "middle", + [2] = "top", + } + for x=0,1,1 do + for y=0,2,1 do + local piecename = string.format("celevator:hwdoor_%s_glass_%s",xnames[x],ynames[y]) + local pieceoffset = vector.new(x,y,0) + local piecepos = vector.add(pos,vector.rotate_around_axis(pieceoffset,vector.new(0,1,0),facedir)) + if core.get_node(piecepos).name == piecename then core.remove_node(piecepos) end + end + end + end, + _celevator_doortype = "twospeedglass", +}) + +core.register_node("celevator:hwdoor_fast_glass_middle",{ + description = S("Glass Hoistway Door (fast, middle - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_middle.png", + "celevator_door_glass_middle.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + _celevator_doortype = "twospeedglass", +}) + +core.register_node("celevator:hwdoor_fast_glass_top",{ + description = S("Glass Hoistway Door (fast, top - you hacker you!)"), + tiles = { + "celevator_door_glass_edge.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_topbottom.png", + "celevator_door_glass_topbottom.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + _celevator_doortype = "twospeedglass", +}) + +core.register_node("celevator:hwdoor_slow_glass_bottom",{ + description = S("Glass Hoistway Door (slow, bottom - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_topbottom.png^[transformFY", + "celevator_door_glass_topbottom.png^[transformFY", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.3,0.5,0.5,0.4}, + }, + }, + _celevator_doortype = "twospeedglass", +}) + +core.register_node("celevator:hwdoor_slow_glass_middle",{ + description = S("Glass Hoistway Door (slow, middle - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_middle.png", + "celevator_door_glass_middle.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.3,0.5,0.5,0.4}, + }, + }, + _celevator_doortype = "twospeedglass", +}) + +core.register_node("celevator:hwdoor_slow_glass_top",{ + description = S("Glass Hoistway Door (slow, top - you hacker you!)"), + tiles = { + "celevator_door_glass_edge.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_topbottom.png", + "celevator_door_glass_topbottom.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.3,0.5,0.5,0.4}, + }, + }, + _celevator_doortype = "twospeedglass", +}) + +core.register_node("celevator:hwdoor_glass",{ + description = S("Glass Elevator Hoistway Door"), + paramtype2 = "4dir", + buildable_to = true, + inventory_image = "celevator_door_glass_inventory.png", + wield_image = "celevator_door_glass_inventory.png", + wield_scale = vector.new(1,3,1), + tiles = {"celevator_transparent.png"}, + after_place_node = function(pos,player) + if not player:is_player() then + core.remove_node(pos) + return true + end + local name = player:get_player_name() + local newnode = core.get_node(pos) + local facedir = core.dir_to_yaw(core.fourdir_to_dir(newnode.param2)) + local xnames = { + [0] = "fast", + [1] = "slow", + } + local ynames = { + [0] = "bottom", + [1] = "middle", + [2] = "top", + } + for x=0,1,1 do + for y=0,2,1 do + local placeoffset = vector.new(x,y,0) + local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir)) + local replaces = core.get_node(placepos).name + if not (core.registered_nodes[replaces] and core.registered_nodes[replaces].buildable_to) then + local errormsg = S("Can't place door here - position @1m to the right and @2m up is blocked!",x,y) + core.chat_send_player(name,errormsg) + core.remove_node(pos) + return true + end + if core.is_protected(placepos,name) and not core.check_player_privs(name,{protection_bypass=true}) then + local errormsg = S("Can't place door here - position @1m to the right and @2m up is protected!",x,y) + core.chat_send_player(name,errormsg) + core.record_protection_violation(placepos,name) + core.remove_node(pos) + return true + end + end + end + for x=0,1,1 do + for y=0,2,1 do + local piecename = string.format("celevator:hwdoor_%s_glass_%s",xnames[x],ynames[y]) + local placeoffset = vector.new(x,y,0) + local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir)) + core.set_node(placepos,{name=piecename,param2=newnode.param2}) + if y==0 then + celevator.doors.placesill(placepos,{name=piecename,param2=newnode.param2}) + end + end + end + local carpos = vector.add(pos,vector.rotate_around_axis(vector.new(0,0,1),vector.new(0,1,0),facedir)) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.get_meta(carpos):set_string("doortype","glass") + celevator.doors.spawncardoors(carpos,core.fourdir_to_dir(newnode.param2),"glass",true) + end + end, +}) + +core.register_lbm({ + label = "Respawn hoistway door sills (2-speed glass)", + name = "celevator:spawn_sill_twospeedglass", + nodenames = { + "celevator:hwdoor_fast_glass_bottom", + "celevator:hwdoor_slow_glass_bottom", + }, + run_at_every_load = true, + action = celevator.doors.placesill, +}) + +celevator.doors.twospeedglass.spawncardoors = function(pos,dir,replace) + local refs = {} + for x=2,1,-1 do + for y=1,3,1 do + local yaw = core.dir_to_yaw(dir)+math.pi + local doorpos = vector.add(pos,vector.rotate_around_axis(vector.new(x-2,y-1,0),vector.new(0,1,0),yaw)) + local xnames = {"slow","fast"} + local ynames = {"bottom","middle","top"} + local nname = string.format("celevator:hwdoor_%s_glass_%s",xnames[x],ynames[y]) + if replace then + local oldrefs = core.get_objects_inside_radius(doorpos,0.1) + for _,i in pairs(oldrefs) do + if i:get_luaentity() and i:get_luaentity().name == "celevator:car_door" then + i:remove() + end + end + end + local ref = core.add_entity(doorpos,"celevator:car_door") + ref:set_yaw(yaw) + ref:set_properties({ + wield_item = nname, + }) + table.insert(refs,ref) + end + end + return refs +end + +function celevator.doors.twospeedglass.hwopen(pos,drivepos) + celevator.doors.hwdoor_step_enabled = true + local hwdoors_moving = core.deserialize(celevator.storage:get_string("hwdoors_moving")) or {} + local hash = core.hash_node_position(pos) + if not hwdoors_moving[hash] then + local param2 = celevator.get_node(pos).param2 + local fdir = core.fourdir_to_dir(param2) + local otherpanel = vector.add(pos,vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2)) + local positions = { + pos, + vector.add(pos,vector.new(0,1,0)), + vector.add(pos,vector.new(0,2,0)), + otherpanel, + vector.add(otherpanel,vector.new(0,1,0)), + vector.add(otherpanel,vector.new(0,2,0)), + } + local oldnodes = {} + for i,position in ipairs(positions) do + oldnodes[i] = celevator.get_node(position) + end + local erefs = celevator.drives.entity.nodestoentities(positions,"celevator:hwdoor_moving") + hwdoors_moving[hash] = { + direction = "open", + positions = positions, + nodes = oldnodes, + time = 0, + opendir = vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2), + drivepos = drivepos, + param2 = param2, + doortype = "twospeedglass", + } + celevator.doors.erefs[hash] = erefs + celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) + core.set_node(pos,{name="celevator:hwdoor_placeholder",param2=param2}) + local pmeta = celevator.get_meta(pos) + pmeta:set_string("data",core.serialize(hwdoors_moving[hash])) + pmeta:set_string("state","opening") + pmeta:set_string("doortype","twospeedglass") + local carpos = vector.add(pos,fdir) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.doors.caropen(carpos) + end + elseif hwdoors_moving[hash].direction == "close" then + hwdoors_moving[hash].direction = "open" + hwdoors_moving[hash].time = math.pi-hwdoors_moving[hash].time + celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) + local fdir = core.fourdir_to_dir(hwdoors_moving[hash].param2) + local carpos = vector.add(pos,fdir) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.doors.caropen(carpos) + end + core.set_node(pos,{name="celevator:hwdoor_placeholder",param2=hwdoors_moving[hash].param2}) + local pmeta = celevator.get_meta(pos) + pmeta:set_string("data",core.serialize(hwdoors_moving[hash])) + pmeta:set_string("state","opening") + pmeta:set_string("doortype","twospeedglass") + end +end + +function celevator.doors.twospeedglass.hwclose(pos,drivepos,nudge) + celevator.doors.hwdoor_step_enabled = true + local hwdoors_moving = core.deserialize(celevator.storage:get_string("hwdoors_moving")) or {} + local hash = core.hash_node_position(pos) + if hwdoors_moving[hash] then + return + end + local pmeta = celevator.get_meta(pos) + local state = pmeta:get_string("state") + if state ~= "open" then return end + local fdir = core.fourdir_to_dir(celevator.get_node(pos).param2) + local carpos = vector.add(pos,fdir) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.doors.carclose(carpos,nudge) + end + local data = core.deserialize(pmeta:get_string("data")) + if not data then return end + for i=1,6,1 do + core.set_node(data.positions[i],data.nodes[i]) + end + data.direction = "close" + data.time = 0 + data.drivepos = drivepos + data.nudging = nudge + local erefs = celevator.drives.entity.nodestoentities(data.positions,"celevator:hwdoor_moving") + local foffset = vector.multiply(data.opendir,2) + local soffset = data.opendir + for i=1,3,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),foffset)) + end + for i=4,6,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),soffset)) + end + celevator.doors.erefs[hash] = erefs + hwdoors_moving[hash] = data + celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) +end + +function celevator.doors.twospeedglass.hwstep(hash,data,dtime,hwdoors_moving) + local present = celevator.doors.erefs[hash] + if present then + for i=1,6,1 do + if not celevator.doors.erefs[hash][i]:get_pos() then + present = false + break + end + end + end + if present then + if data.direction == "open" then + data.time = data.time+dtime + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2)) + end + if data.time >= math.pi then + for i=1,6,1 do + celevator.doors.erefs[hash][i]:remove() + end + celevator.get_meta(data.positions[1]):set_string("state","open") + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","open") end + hwdoors_moving[hash] = nil + end + elseif data.direction == "close" then + local speed = 0.66 + if data.nudging then speed = 0.2 end + data.time = data.time+(speed*dtime) + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*-speed)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*-speed)) + end + if data.time >= math.pi then + for i=1,6,1 do + celevator.doors.erefs[hash][i]:set_pos(data.positions[i]) + end + celevator.drives.entity.entitiestonodes(celevator.doors.erefs[hash]) + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","closed") end + hwdoors_moving[hash] = nil + end + end + else + if data.direction == "open" then + for i=1,6,1 do + if celevator.doors.erefs[hash] then + celevator.doors.erefs[hash][i]:remove() + end + end + celevator.get_meta(data.positions[1]):set_string("state","open") + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","open") end + hwdoors_moving[hash] = nil + elseif data.direction == "close" then + for i=1,6,1 do + core.set_node(data.positions[i],data.nodes[i]) + end + celevator.get_meta(data.positions[1]):set_string("state","closed") + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","closed") end + hwdoors_moving[hash] = nil + end + end +end + +function celevator.doors.twospeedglass.caropen(pos) + celevator.doors.cardoor_step_enabled = true + local cardoors_moving = core.deserialize(celevator.storage:get_string("cardoors_moving")) or {} + local hash = core.hash_node_position(pos) + local cartimer = core.get_node_timer(pos) + cartimer:start(0.25) + if not cardoors_moving[hash] then + local fdir = core.fourdir_to_dir(celevator.get_node(pos).param2) + local otherpanel = vector.add(pos,vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2)) + local positions = { + pos, + vector.add(pos,vector.new(0,1,0)), + vector.add(pos,vector.new(0,2,0)), + otherpanel, + vector.add(otherpanel,vector.new(0,1,0)), + vector.add(otherpanel,vector.new(0,2,0)), + } + local erefs = {} + for _,dpos in ipairs(positions) do + local objs = core.get_objects_inside_radius(dpos,0.5) + for _,obj in pairs(objs) do + if obj:get_luaentity() and obj:get_luaentity().name == "celevator:car_door" then + table.insert(erefs,obj) + end + end + end + cardoors_moving[hash] = { + direction = "open", + positions = positions, + time = 0, + opendir = vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2), + doortype = "twospeedglass", + } + core.sound_play("celevator_door_open",{ + pos = pos, + gain = 0.4, + max_hear_distance = 10 + },true) + celevator.doors.erefs[hash] = erefs + celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) + local meta = celevator.get_meta(pos) + meta:set_string("doordata",core.serialize(cardoors_moving[hash])) + meta:set_string("doorstate","opening") + elseif cardoors_moving[hash].direction == "close" then + if cardoors_moving[hash].soundhandle then + core.sound_stop(cardoors_moving[hash].soundhandle) + end + core.sound_play("celevator_door_reverse",{ + pos = pos, + gain = 1, + max_hear_distance = 10 + },true) + core.sound_play("celevator_door_open",{ + pos = pos, + gain = 0.4, + start_time = math.max(0,2.75-cardoors_moving[hash].time), + max_hear_distance = 10 + },true) + cardoors_moving[hash].direction = "open" + cardoors_moving[hash].time = math.pi-cardoors_moving[hash].time + celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) + end +end + +function celevator.doors.twospeedglass.carclose(pos,nudge) + celevator.doors.cardoor_step_enabled = true + local cardoors_moving = core.deserialize(celevator.storage:get_string("cardoors_moving")) or {} + local hash = core.hash_node_position(pos) + if cardoors_moving[hash] then + return + end + local meta = celevator.get_meta(pos) + local state = meta:get_string("doorstate") + if state ~= "open" then return end + local data = core.deserialize(meta:get_string("doordata")) + if not data then return end + local dir = core.fourdir_to_dir(celevator.get_node(pos).param2) + data.direction = "close" + data.time = 0 + data.doortype = "twospeedglass" + local erefs = celevator.doors.spawncardoors(pos,dir,"twospeedglass") + local soffset = data.opendir + local foffset = vector.multiply(soffset,2) + for i=1,3,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),foffset)) + end + for i=4,6,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),soffset)) + end + celevator.doors.erefs[hash] = erefs + if nudge then + data.soundhandle = core.sound_play("celevator_nudge",{ + pos = pos, + gain = 0.75, + max_hear_distance = 10 + }) + else + data.soundhandle = core.sound_play("celevator_door_close",{ + pos = pos, + gain = 0.3, + max_hear_distance = 10 + }) + end + data.nudging = nudge + cardoors_moving[hash] = data + celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) +end + +function celevator.doors.twospeedglass.carstep(hash,data,dtime,cardoors_moving) + local present = celevator.doors.erefs[hash] + if present then + for i=1,6,1 do + if not (celevator.doors.erefs[hash][i] and celevator.doors.erefs[hash][i]:get_pos()) then + present = false + break + end + end + end + if present then + if data.direction == "open" then + data.time = data.time+dtime + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2)) + end + if data.time >= math.pi then + for i=1,6,1 do + celevator.doors.erefs[hash][i]:remove() + end + celevator.get_meta(data.positions[1]):set_string("doorstate","open") + cardoors_moving[hash] = nil + end + elseif data.direction == "close" then + local speed = 0.66 + if data.nudging then speed = 0.2 end + data.time = data.time+(speed*dtime) + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*-speed)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*-speed)) + end + if data.time >= math.pi then + for _,ref in ipairs(celevator.doors.erefs[hash]) do + ref:remove() + end + local carmeta = celevator.get_meta(data.positions[1]) + carmeta:set_string("doorstate","closed") + cardoors_moving[hash] = nil + local cartimer = core.get_node_timer(data.positions[1]) + cartimer:stop() + local fdir = core.facedir_to_dir(core.get_node(data.positions[1]).param2) + celevator.doors.spawncardoors(data.positions[1],fdir,"twospeedglass") + end + end + else + if data.direction == "open" then + for i=1,6,1 do + if celevator.doors.erefs[hash] and celevator.doors.erefs[hash][i] then + celevator.doors.erefs[hash][i]:remove() + end + end + celevator.get_meta(data.positions[1]):set_string("doorstate","open") + cardoors_moving[hash] = nil + elseif data.direction == "close" then + local fdir = core.fourdir_to_dir(celevator.get_node(data.positions[1]).param2) + celevator.doors.spawncardoors(data.positions[1],vector.rotate_around_axis(fdir,vector.new(0,1,0),math.pi),"twospeedglass") + celevator.get_meta(data.positions[1]):set_string("doorstate","closed") + cardoors_moving[hash] = nil + end + end +end diff --git a/door_2speedmetal.lua b/door_2speedmetal.lua new file mode 100644 index 0000000..b074722 --- /dev/null +++ b/door_2speedmetal.lua @@ -0,0 +1,635 @@ +celevator.doors.twospeedmetal = {} + +local S = core.get_translator("celevator") + +core.register_node("celevator:hwdoor_fast_steel_bottom",{ + description = S("Steel Hoistway Door (fast, bottom - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_metal.png", + "celevator_door_metal.png", + }, + groups = { + not_in_creative_inventory = 1, + _celevator_hwdoor_root = 1, + oddly_breakable_by_hand = 2, + }, + drop = "celevator:hwdoor_steel", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + after_dig_node = function(pos,node) + local erefs = core.get_objects_inside_radius(pos,1.5) + for _,ref in pairs(erefs) do + if ref:get_luaentity() and ref:get_luaentity().name == "celevator:door_sill" then ref:remove() end + end + local facedir = core.dir_to_yaw(core.fourdir_to_dir(node.param2)) + local xnames = { + [0] = "fast", + [1] = "slow", + } + local ynames = { + [0] = "bottom", + [1] = "middle", + [2] = "top", + } + for x=0,1,1 do + for y=0,2,1 do + local piecename = string.format("celevator:hwdoor_%s_steel_%s",xnames[x],ynames[y]) + local pieceoffset = vector.new(x,y,0) + local piecepos = vector.add(pos,vector.rotate_around_axis(pieceoffset,vector.new(0,1,0),facedir)) + if core.get_node(piecepos).name == piecename then core.remove_node(piecepos) end + end + end + end, + _celevator_doortype = "twospeedmetal", +}) + +core.register_node("celevator:hwdoor_fast_steel_middle",{ + description = S("Steel Hoistway Door (fast, middle - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_metal.png", + "celevator_door_metal.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + _celevator_doortype = "twospeedmetal", +}) + +core.register_node("celevator:hwdoor_fast_steel_top",{ + description = S("Steel Hoistway Door (fast, top - you hacker you!)"), + tiles = { + "celevator_door_glass_edge.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_metal.png", + "celevator_door_metal.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + _celevator_doortype = "twospeedmetal", +}) + +core.register_node("celevator:hwdoor_slow_steel_bottom",{ + description = S("Steel Hoistway Door (slow, bottom - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_metal.png", + "celevator_door_metal.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.3,0.5,0.5,0.4}, + }, + }, + _celevator_doortype = "twospeedmetal", +}) + +core.register_node("celevator:hwdoor_slow_steel_middle",{ + description = S("Steel Hoistway Door (slow, middle - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_metal.png", + "celevator_door_metal.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.3,0.5,0.5,0.4}, + }, + }, + _celevator_doortype = "twospeedmetal", +}) + +core.register_node("celevator:hwdoor_slow_steel_top",{ + description = S("Steel Hoistway Door (slow, top - you hacker you!)"), + tiles = { + "celevator_door_glass_edge.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_metal.png", + "celevator_door_metal.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.3,0.5,0.5,0.4}, + }, + }, + _celevator_doortype = "twospeedmetal", +}) + +core.register_node("celevator:hwdoor_steel",{ + description = S("Steel Elevator Hoistway Door"), + paramtype2 = "4dir", + buildable_to = true, + inventory_image = "celevator_door_metal_inventory.png", + wield_image = "celevator_door_metal_inventory.png", + wield_scale = vector.new(1,3,1), + tiles = {"celevator_transparent.png"}, + after_place_node = function(pos,player) + if not player:is_player() then + core.remove_node(pos) + return true + end + local name = player:get_player_name() + local newnode = core.get_node(pos) + local facedir = core.dir_to_yaw(core.fourdir_to_dir(newnode.param2)) + local xnames = { + [0] = "fast", + [1] = "slow", + } + local ynames = { + [0] = "bottom", + [1] = "middle", + [2] = "top", + } + for x=0,1,1 do + for y=0,2,1 do + local placeoffset = vector.new(x,y,0) + local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir)) + local replaces = core.get_node(placepos).name + if not (core.registered_nodes[replaces] and core.registered_nodes[replaces].buildable_to) then + local errormsg = S("Can't place door here - position @1m to the right and @2m up is blocked!",x,y) + core.chat_send_player(name,errormsg) + core.remove_node(pos) + return true + end + if core.is_protected(placepos,name) and not core.check_player_privs(name,{protection_bypass=true}) then + local errormsg = S("Can't place door here - position @1m to the right and @2m up is protected!",x,y) + core.chat_send_player(name,errormsg) + core.record_protection_violation(placepos,name) + core.remove_node(pos) + return true + end + end + end + for x=0,1,1 do + for y=0,2,1 do + local piecename = string.format("celevator:hwdoor_%s_steel_%s",xnames[x],ynames[y]) + local placeoffset = vector.new(x,y,0) + local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir)) + core.set_node(placepos,{name=piecename,param2=newnode.param2}) + if y==0 then + celevator.doors.placesill(placepos,{name=piecename,param2=newnode.param2}) + end + end + end + local carpos = vector.add(pos,vector.rotate_around_axis(vector.new(0,0,1),vector.new(0,1,0),facedir)) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.get_meta(carpos):set_string("doortype","steel") + celevator.doors.spawncardoors(carpos,core.fourdir_to_dir(newnode.param2),"steel",true) + end + end, +}) + +core.register_lbm({ + label = "Respawn hoistway door sills (2-speed metal)", + name = "celevator:spawn_sill_twospeedmetal", + nodenames = { + "celevator:hwdoor_fast_steel_bottom", + "celevator:hwdoor_slow_steel_bottom", + }, + run_at_every_load = true, + action = celevator.doors.placesill, +}) + +celevator.doors.twospeedmetal.spawncardoors = function(pos,dir,replace) + local refs = {} + for x=2,1,-1 do + for y=1,3,1 do + local yaw = core.dir_to_yaw(dir)+math.pi + local doorpos = vector.add(pos,vector.rotate_around_axis(vector.new(x-2,y-1,0),vector.new(0,1,0),yaw)) + local xnames = {"slow","fast"} + local ynames = {"bottom","middle","top"} + local nname = string.format("celevator:hwdoor_%s_steel_%s",xnames[x],ynames[y]) + if replace then + local oldrefs = core.get_objects_inside_radius(doorpos,0.1) + for _,i in pairs(oldrefs) do + if i:get_luaentity() and i:get_luaentity().name == "celevator:car_door" then + i:remove() + end + end + end + local ref = core.add_entity(doorpos,"celevator:car_door") + ref:set_yaw(yaw) + ref:set_properties({ + wield_item = nname, + }) + table.insert(refs,ref) + end + end + return refs +end + +function celevator.doors.twospeedmetal.hwopen(pos,drivepos) + celevator.doors.hwdoor_step_enabled = true + local hwdoors_moving = core.deserialize(celevator.storage:get_string("hwdoors_moving")) or {} + local hash = core.hash_node_position(pos) + if not hwdoors_moving[hash] then + local param2 = celevator.get_node(pos).param2 + local fdir = core.fourdir_to_dir(param2) + local otherpanel = vector.add(pos,vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2)) + local positions = { + pos, + vector.add(pos,vector.new(0,1,0)), + vector.add(pos,vector.new(0,2,0)), + otherpanel, + vector.add(otherpanel,vector.new(0,1,0)), + vector.add(otherpanel,vector.new(0,2,0)), + } + local oldnodes = {} + for i,position in ipairs(positions) do + oldnodes[i] = celevator.get_node(position) + end + local erefs = celevator.drives.entity.nodestoentities(positions,"celevator:hwdoor_moving") + hwdoors_moving[hash] = { + direction = "open", + positions = positions, + nodes = oldnodes, + time = 0, + opendir = vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2), + drivepos = drivepos, + param2 = param2, + doortype = "twospeedmetal", + } + celevator.doors.erefs[hash] = erefs + celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) + core.set_node(pos,{name="celevator:hwdoor_placeholder",param2=param2}) + local pmeta = celevator.get_meta(pos) + pmeta:set_string("data",core.serialize(hwdoors_moving[hash])) + pmeta:set_string("state","opening") + pmeta:set_string("doortype","twospeedmetal") + local carpos = vector.add(pos,fdir) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.doors.caropen(carpos) + end + elseif hwdoors_moving[hash].direction == "close" then + hwdoors_moving[hash].direction = "open" + hwdoors_moving[hash].time = math.pi-hwdoors_moving[hash].time + celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) + local fdir = core.fourdir_to_dir(hwdoors_moving[hash].param2) + local carpos = vector.add(pos,fdir) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.doors.caropen(carpos) + end + core.set_node(pos,{name="celevator:hwdoor_placeholder",param2=hwdoors_moving[hash].param2}) + local pmeta = celevator.get_meta(pos) + pmeta:set_string("data",core.serialize(hwdoors_moving[hash])) + pmeta:set_string("state","opening") + pmeta:set_string("doortype","twospeedmetal") + end +end + +function celevator.doors.twospeedmetal.hwclose(pos,drivepos,nudge) + celevator.doors.hwdoor_step_enabled = true + local hwdoors_moving = core.deserialize(celevator.storage:get_string("hwdoors_moving")) or {} + local hash = core.hash_node_position(pos) + if hwdoors_moving[hash] then + return + end + local pmeta = celevator.get_meta(pos) + local state = pmeta:get_string("state") + if state ~= "open" then return end + local fdir = core.fourdir_to_dir(celevator.get_node(pos).param2) + local carpos = vector.add(pos,fdir) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.doors.carclose(carpos,nudge) + end + local data = core.deserialize(pmeta:get_string("data")) + if not data then return end + for i=1,6,1 do + core.set_node(data.positions[i],data.nodes[i]) + end + data.direction = "close" + data.time = 0 + data.drivepos = drivepos + data.nudging = nudge + local erefs = celevator.drives.entity.nodestoentities(data.positions,"celevator:hwdoor_moving") + local foffset = vector.multiply(data.opendir,2) + local soffset = data.opendir + for i=1,3,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),foffset)) + end + for i=4,6,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),soffset)) + end + celevator.doors.erefs[hash] = erefs + hwdoors_moving[hash] = data + celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) +end + +function celevator.doors.twospeedmetal.hwstep(hash,data,dtime,hwdoors_moving) + local present = celevator.doors.erefs[hash] + if present then + for i=1,6,1 do + if not celevator.doors.erefs[hash][i]:get_pos() then + present = false + break + end + end + end + if present then + if data.direction == "open" then + data.time = data.time+dtime + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2)) + end + if data.time >= math.pi then + for i=1,6,1 do + celevator.doors.erefs[hash][i]:remove() + end + celevator.get_meta(data.positions[1]):set_string("state","open") + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","open") end + hwdoors_moving[hash] = nil + end + elseif data.direction == "close" then + local speed = 0.66 + if data.nudging then speed = 0.2 end + data.time = data.time+(speed*dtime) + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*-speed)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*-speed)) + end + if data.time >= math.pi then + for i=1,6,1 do + celevator.doors.erefs[hash][i]:set_pos(data.positions[i]) + end + celevator.drives.entity.entitiestonodes(celevator.doors.erefs[hash]) + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","closed") end + hwdoors_moving[hash] = nil + end + end + else + if data.direction == "open" then + for i=1,6,1 do + if celevator.doors.erefs[hash] then + celevator.doors.erefs[hash][i]:remove() + end + end + celevator.get_meta(data.positions[1]):set_string("state","open") + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","open") end + hwdoors_moving[hash] = nil + elseif data.direction == "close" then + for i=1,6,1 do + core.set_node(data.positions[i],data.nodes[i]) + end + celevator.get_meta(data.positions[1]):set_string("state","closed") + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","closed") end + hwdoors_moving[hash] = nil + end + end +end + +function celevator.doors.twospeedmetal.caropen(pos) + celevator.doors.cardoor_step_enabled = true + local cardoors_moving = core.deserialize(celevator.storage:get_string("cardoors_moving")) or {} + local hash = core.hash_node_position(pos) + local cartimer = core.get_node_timer(pos) + cartimer:start(0.25) + if not cardoors_moving[hash] then + local fdir = core.fourdir_to_dir(celevator.get_node(pos).param2) + local otherpanel = vector.add(pos,vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2)) + local positions = { + pos, + vector.add(pos,vector.new(0,1,0)), + vector.add(pos,vector.new(0,2,0)), + otherpanel, + vector.add(otherpanel,vector.new(0,1,0)), + vector.add(otherpanel,vector.new(0,2,0)), + } + local erefs = {} + for _,dpos in ipairs(positions) do + local objs = core.get_objects_inside_radius(dpos,0.5) + for _,obj in pairs(objs) do + if obj:get_luaentity() and obj:get_luaentity().name == "celevator:car_door" then + table.insert(erefs,obj) + end + end + end + cardoors_moving[hash] = { + direction = "open", + positions = positions, + time = 0, + opendir = vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2), + doortype = "twospeedmetal", + } + core.sound_play("celevator_door_open",{ + pos = pos, + gain = 0.4, + max_hear_distance = 10 + },true) + celevator.doors.erefs[hash] = erefs + celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) + local meta = celevator.get_meta(pos) + meta:set_string("doordata",core.serialize(cardoors_moving[hash])) + meta:set_string("doorstate","opening") + elseif cardoors_moving[hash].direction == "close" then + if cardoors_moving[hash].soundhandle then + core.sound_stop(cardoors_moving[hash].soundhandle) + end + core.sound_play("celevator_door_reverse",{ + pos = pos, + gain = 1, + max_hear_distance = 10 + },true) + core.sound_play("celevator_door_open",{ + pos = pos, + gain = 0.4, + start_time = math.max(0,2.75-cardoors_moving[hash].time), + max_hear_distance = 10 + },true) + cardoors_moving[hash].direction = "open" + cardoors_moving[hash].time = math.pi-cardoors_moving[hash].time + celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) + end +end + +function celevator.doors.twospeedmetal.carclose(pos,nudge) + celevator.doors.cardoor_step_enabled = true + local cardoors_moving = core.deserialize(celevator.storage:get_string("cardoors_moving")) or {} + local hash = core.hash_node_position(pos) + if cardoors_moving[hash] then + return + end + local meta = celevator.get_meta(pos) + local state = meta:get_string("doorstate") + if state ~= "open" then return end + local data = core.deserialize(meta:get_string("doordata")) + if not data then return end + local dir = core.fourdir_to_dir(celevator.get_node(pos).param2) + data.direction = "close" + data.time = 0 + data.doortype = "twospeedmetal" + local erefs = celevator.doors.spawncardoors(pos,dir,"twospeedmetal") + local soffset = data.opendir + local foffset = vector.multiply(soffset,2) + for i=1,3,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),foffset)) + end + for i=4,6,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),soffset)) + end + celevator.doors.erefs[hash] = erefs + if nudge then + data.soundhandle = core.sound_play("celevator_nudge",{ + pos = pos, + gain = 0.75, + max_hear_distance = 10 + }) + else + data.soundhandle = core.sound_play("celevator_door_close",{ + pos = pos, + gain = 0.3, + max_hear_distance = 10 + }) + end + data.nudging = nudge + cardoors_moving[hash] = data + celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) +end + +function celevator.doors.twospeedmetal.carstep(hash,data,dtime,cardoors_moving) + local present = celevator.doors.erefs[hash] + if present then + for i=1,6,1 do + if not (celevator.doors.erefs[hash][i] and celevator.doors.erefs[hash][i]:get_pos()) then + present = false + break + end + end + end + if present then + if data.direction == "open" then + data.time = data.time+dtime + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2)) + end + if data.time >= math.pi then + for i=1,6,1 do + celevator.doors.erefs[hash][i]:remove() + end + celevator.get_meta(data.positions[1]):set_string("doorstate","open") + cardoors_moving[hash] = nil + end + elseif data.direction == "close" then + local speed = 0.66 + if data.nudging then speed = 0.2 end + data.time = data.time+(speed*dtime) + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*-speed)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*-speed)) + end + if data.time >= math.pi then + for _,ref in ipairs(celevator.doors.erefs[hash]) do + ref:remove() + end + local carmeta = celevator.get_meta(data.positions[1]) + carmeta:set_string("doorstate","closed") + cardoors_moving[hash] = nil + local cartimer = core.get_node_timer(data.positions[1]) + cartimer:stop() + local fdir = core.facedir_to_dir(core.get_node(data.positions[1]).param2) + celevator.doors.spawncardoors(data.positions[1],fdir,"twospeedmetal") + end + end + else + if data.direction == "open" then + for i=1,6,1 do + if celevator.doors.erefs[hash] and celevator.doors.erefs[hash][i] then + celevator.doors.erefs[hash][i]:remove() + end + end + celevator.get_meta(data.positions[1]):set_string("doorstate","open") + cardoors_moving[hash] = nil + elseif data.direction == "close" then + local fdir = core.fourdir_to_dir(celevator.get_node(data.positions[1]).param2) + celevator.doors.spawncardoors(data.positions[1],vector.rotate_around_axis(fdir,vector.new(0,1,0),math.pi),"twospeedmetal") + celevator.get_meta(data.positions[1]):set_string("doorstate","closed") + cardoors_moving[hash] = nil + end + end +end diff --git a/door_centerglass.lua b/door_centerglass.lua new file mode 100644 index 0000000..9684399 --- /dev/null +++ b/door_centerglass.lua @@ -0,0 +1,641 @@ +celevator.doors.centerglass = {} + +local S = core.get_translator("celevator") + +core.register_node("celevator:hwdoor_left_glass_bottom",{ + description = S("Glass Hoistway Door (left, bottom - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_topbottom.png^[transformFY", + "celevator_door_glass_topbottom.png^[transformFY", + }, + groups = { + not_in_creative_inventory = 1, + _celevator_hwdoor_root = 1, + oddly_breakable_by_hand = 2, + }, + drop = "celevator:hwdoor_centerglass", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + after_dig_node = function(pos,node) + local erefs = core.get_objects_inside_radius(pos,1.5) + for _,ref in pairs(erefs) do + if ref:get_luaentity() and ref:get_luaentity().name == "celevator:door_sill" then ref:remove() end + end + local facedir = core.dir_to_yaw(core.fourdir_to_dir(node.param2)) + local xnames = { + [0] = "left", + [1] = "right", + } + local ynames = { + [0] = "bottom", + [1] = "middle", + [2] = "top", + } + for x=0,1,1 do + for y=0,2,1 do + local piecename = string.format("celevator:hwdoor_%s_glass_%s",xnames[x],ynames[y]) + local pieceoffset = vector.new(x,y,0) + local piecepos = vector.add(pos,vector.rotate_around_axis(pieceoffset,vector.new(0,1,0),facedir)) + if core.get_node(piecepos).name == piecename then core.remove_node(piecepos) end + end + end + end, + _celevator_doortype = "centerglass", +}) + +core.register_node("celevator:hwdoor_left_glass_middle",{ + description = S("Glass Hoistway Door (left, middle - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_middle.png", + "celevator_door_glass_middle.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + _celevator_doortype = "centerglass", +}) + +core.register_node("celevator:hwdoor_left_glass_top",{ + description = S("Glass Hoistway Door (left, top - you hacker you!)"), + tiles = { + "celevator_door_glass_edge.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_topbottom.png", + "celevator_door_glass_topbottom.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + _celevator_doortype = "centerglass", +}) + +core.register_node("celevator:hwdoor_right_glass_bottom",{ + description = S("Glass Hoistway Door (right, bottom - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_topbottom.png^[transformFY", + "celevator_door_glass_topbottom.png^[transformFY", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + _celevator_doortype = "centerglass", +}) + +core.register_node("celevator:hwdoor_right_glass_middle",{ + description = S("Glass Hoistway Door (right, middle - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_middle.png", + "celevator_door_glass_middle.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + _celevator_doortype = "centerglass", +}) + +core.register_node("celevator:hwdoor_right_glass_top",{ + description = S("Glass Hoistway Door (right, top - you hacker you!)"), + tiles = { + "celevator_door_glass_edge.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_topbottom.png", + "celevator_door_glass_topbottom.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + use_texture_alpha = "clip", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + _celevator_doortype = "centerglass", +}) + +core.register_node("celevator:hwdoor_centerglass",{ + description = S("Center-Opening Glass Elevator Hoistway Door"), + paramtype2 = "4dir", + buildable_to = true, + inventory_image = "celevator_door_centerglass_inventory.png", + wield_image = "celevator_door_centerglass_inventory.png", + wield_scale = vector.new(1,3,1), + tiles = {"celevator_transparent.png"}, + after_place_node = function(pos,player) + if not player:is_player() then + core.remove_node(pos) + return true + end + local name = player:get_player_name() + local newnode = core.get_node(pos) + local facedir = core.dir_to_yaw(core.fourdir_to_dir(newnode.param2)) + local xnames = { + [0] = "left", + [1] = "right", + } + local ynames = { + [0] = "bottom", + [1] = "middle", + [2] = "top", + } + for x=0,1,1 do + for y=0,2,1 do + local placeoffset = vector.new(x,y,0) + local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir)) + local replaces = core.get_node(placepos).name + if not (core.registered_nodes[replaces] and core.registered_nodes[replaces].buildable_to) then + local errormsg = S("Can't place door here - position @1m to the right and @2m up is blocked!",x,y) + core.chat_send_player(name,errormsg) + core.remove_node(pos) + return true + end + if core.is_protected(placepos,name) and not core.check_player_privs(name,{protection_bypass=true}) then + local errormsg = S("Can't place door here - position @1m to the right and @2m up is protected!",x,y) + core.chat_send_player(name,errormsg) + core.record_protection_violation(placepos,name) + core.remove_node(pos) + return true + end + end + end + for x=0,1,1 do + for y=0,2,1 do + local piecename = string.format("celevator:hwdoor_%s_glass_%s",xnames[x],ynames[y]) + local placeoffset = vector.new(x,y,0) + local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir)) + core.set_node(placepos,{name=piecename,param2=newnode.param2}) + if y==0 then + celevator.doors.placesill(placepos,{name=piecename,param2=newnode.param2}) + end + end + end + local carpos = vector.add(pos,vector.rotate_around_axis(vector.new(0,0,1),vector.new(0,1,0),facedir)) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.get_meta(carpos):set_string("doortype","centerglass") + celevator.doors.spawncardoors(carpos,core.fourdir_to_dir(newnode.param2),"centerglass",true) + end + end, +}) + +core.register_lbm({ + label = "Respawn hoistway door sills (center-opening glass)", + name = "celevator:spawn_sill_centerglass", + nodenames = { + "celevator:hwdoor_left_glass_bottom", + "celevator:hwdoor_right_glass_bottom", + }, + run_at_every_load = true, + action = celevator.doors.placesill, +}) + +celevator.doors.centerglass.spawncardoors = function(pos,dir,replace) + local refs = {} + for x=2,1,-1 do + for y=1,3,1 do + local yaw = core.dir_to_yaw(dir)+math.pi + local doorpos = vector.add(pos,vector.rotate_around_axis(vector.new(x-2,y-1,0),vector.new(0,1,0),yaw)) + local xnames = {"left","right"} + local ynames = {"bottom","middle","top"} + local nname = string.format("celevator:hwdoor_%s_glass_%s",xnames[x],ynames[y]) + if replace then + local oldrefs = core.get_objects_inside_radius(doorpos,0.1) + for _,i in pairs(oldrefs) do + if i:get_luaentity() and i:get_luaentity().name == "celevator:car_door" then + i:remove() + end + end + end + local ref = core.add_entity(doorpos,"celevator:car_door") + ref:set_yaw(yaw) + ref:set_properties({ + wield_item = nname, + }) + table.insert(refs,ref) + end + end + return refs +end + +function celevator.doors.centerglass.hwopen(pos,drivepos) + celevator.doors.hwdoor_step_enabled = true + local hwdoors_moving = core.deserialize(celevator.storage:get_string("hwdoors_moving")) or {} + local hash = core.hash_node_position(pos) + if not hwdoors_moving[hash] then + local param2 = celevator.get_node(pos).param2 + local fdir = core.fourdir_to_dir(param2) + local otherpanel = vector.add(pos,vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2)) + local positions = { + pos, + vector.add(pos,vector.new(0,1,0)), + vector.add(pos,vector.new(0,2,0)), + otherpanel, + vector.add(otherpanel,vector.new(0,1,0)), + vector.add(otherpanel,vector.new(0,2,0)), + } + local oldnodes = {} + for i,position in ipairs(positions) do + oldnodes[i] = celevator.get_node(position) + end + local erefs = celevator.drives.entity.nodestoentities(positions,"celevator:hwdoor_moving") + hwdoors_moving[hash] = { + direction = "open", + positions = positions, + nodes = oldnodes, + time = 0, + opendir = vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2), + drivepos = drivepos, + param2 = param2, + doortype = "centerglass", + } + celevator.doors.erefs[hash] = erefs + celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) + core.set_node(pos,{name="celevator:hwdoor_placeholder",param2=param2}) + local pmeta = celevator.get_meta(pos) + pmeta:set_string("data",core.serialize(hwdoors_moving[hash])) + pmeta:set_string("state","opening") + pmeta:set_string("doortype","centerglass") + local carpos = vector.add(pos,fdir) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.doors.caropen(carpos) + end + elseif hwdoors_moving[hash].direction == "close" then + hwdoors_moving[hash].direction = "open" + hwdoors_moving[hash].time = math.pi-hwdoors_moving[hash].time + celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) + local fdir = core.fourdir_to_dir(hwdoors_moving[hash].param2) + local carpos = vector.add(pos,fdir) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.doors.caropen(carpos) + end + core.set_node(pos,{name="celevator:hwdoor_placeholder",param2=hwdoors_moving[hash].param2}) + local pmeta = celevator.get_meta(pos) + pmeta:set_string("data",core.serialize(hwdoors_moving[hash])) + pmeta:set_string("state","opening") + pmeta:set_string("doortype","centerglass") + end +end + +function celevator.doors.centerglass.hwclose(pos,drivepos,nudge) + celevator.doors.hwdoor_step_enabled = true + local hwdoors_moving = core.deserialize(celevator.storage:get_string("hwdoors_moving")) or {} + local hash = core.hash_node_position(pos) + if hwdoors_moving[hash] then + return + end + local pmeta = celevator.get_meta(pos) + local state = pmeta:get_string("state") + if state ~= "open" then return end + local fdir = core.fourdir_to_dir(celevator.get_node(pos).param2) + local carpos = vector.add(pos,fdir) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.doors.carclose(carpos,nudge) + end + local data = core.deserialize(pmeta:get_string("data")) + if not data then return end + for i=1,6,1 do + core.set_node(data.positions[i],data.nodes[i]) + end + data.direction = "close" + data.time = 0 + data.drivepos = drivepos + data.nudging = nudge + local erefs = celevator.drives.entity.nodestoentities(data.positions,"celevator:hwdoor_moving") + local roffset = vector.multiply(data.opendir,-1) + local loffset = data.opendir + for i=1,3,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),roffset)) + end + for i=4,6,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),loffset)) + end + celevator.doors.erefs[hash] = erefs + hwdoors_moving[hash] = data + celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) +end + +function celevator.doors.centerglass.hwstep(hash,data,dtime,hwdoors_moving) + local present = celevator.doors.erefs[hash] + if present then + for i=1,6,1 do + if not celevator.doors.erefs[hash][i]:get_pos() then + present = false + break + end + end + end + if present then + if data.direction == "open" then + data.time = data.time+dtime + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*-0.5)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*0.5)) + end + if data.time >= math.pi then + for i=1,6,1 do + celevator.doors.erefs[hash][i]:remove() + end + celevator.get_meta(data.positions[1]):set_string("state","open") + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","open") end + hwdoors_moving[hash] = nil + end + elseif data.direction == "close" then + local speed = 0.66 + if data.nudging then speed = 0.2 end + data.time = data.time+(speed*dtime) + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*speed)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*-speed)) + end + if data.time >= math.pi then + for i=1,6,1 do + celevator.doors.erefs[hash][i]:set_pos(data.positions[i]) + end + celevator.drives.entity.entitiestonodes(celevator.doors.erefs[hash]) + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","closed") end + hwdoors_moving[hash] = nil + end + end + else + if data.direction == "open" then + for i=1,6,1 do + if celevator.doors.erefs[hash] then + celevator.doors.erefs[hash][i]:remove() + end + end + celevator.get_meta(data.positions[1]):set_string("state","open") + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","open") end + hwdoors_moving[hash] = nil + elseif data.direction == "close" then + for i=1,6,1 do + core.set_node(data.positions[i],data.nodes[i]) + end + celevator.get_meta(data.positions[1]):set_string("state","closed") + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","closed") end + hwdoors_moving[hash] = nil + end + end +end + +function celevator.doors.centerglass.caropen(pos) + celevator.doors.cardoor_step_enabled = true + local cardoors_moving = core.deserialize(celevator.storage:get_string("cardoors_moving")) or {} + local hash = core.hash_node_position(pos) + local cartimer = core.get_node_timer(pos) + cartimer:start(0.25) + if not cardoors_moving[hash] then + local fdir = core.fourdir_to_dir(celevator.get_node(pos).param2) + local otherpanel = vector.add(pos,vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2)) + local positions = { + pos, + vector.add(pos,vector.new(0,1,0)), + vector.add(pos,vector.new(0,2,0)), + otherpanel, + vector.add(otherpanel,vector.new(0,1,0)), + vector.add(otherpanel,vector.new(0,2,0)), + } + local erefs = {} + for _,dpos in ipairs(positions) do + local objs = core.get_objects_inside_radius(dpos,0.5) + for _,obj in pairs(objs) do + if obj:get_luaentity() and obj:get_luaentity().name == "celevator:car_door" then + table.insert(erefs,obj) + end + end + end + cardoors_moving[hash] = { + direction = "open", + positions = positions, + time = 0, + opendir = vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2), + doortype = "centerglass", + } + core.sound_play("celevator_door_open",{ + pos = pos, + gain = 0.4, + max_hear_distance = 10 + },true) + celevator.doors.erefs[hash] = erefs + celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) + local meta = celevator.get_meta(pos) + meta:set_string("doordata",core.serialize(cardoors_moving[hash])) + meta:set_string("doorstate","opening") + elseif cardoors_moving[hash].direction == "close" then + if cardoors_moving[hash].soundhandle then + core.sound_stop(cardoors_moving[hash].soundhandle) + end + core.sound_play("celevator_door_reverse",{ + pos = pos, + gain = 1, + max_hear_distance = 10 + },true) + core.sound_play("celevator_door_open",{ + pos = pos, + gain = 0.4, + start_time = math.max(0,2.75-cardoors_moving[hash].time), + max_hear_distance = 10 + },true) + cardoors_moving[hash].direction = "open" + cardoors_moving[hash].time = math.pi-cardoors_moving[hash].time + celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) + end +end + +function celevator.doors.centerglass.carclose(pos,nudge) + celevator.doors.cardoor_step_enabled = true + local cardoors_moving = core.deserialize(celevator.storage:get_string("cardoors_moving")) or {} + local hash = core.hash_node_position(pos) + if cardoors_moving[hash] then + return + end + local meta = celevator.get_meta(pos) + local state = meta:get_string("doorstate") + if state ~= "open" then return end + local data = core.deserialize(meta:get_string("doordata")) + if not data then return end + local dir = core.fourdir_to_dir(celevator.get_node(pos).param2) + data.direction = "close" + data.time = 0 + data.doortype = "centerglass" + local erefs = celevator.doors.spawncardoors(pos,dir,"centerglass") + local loffset = data.opendir + local roffset = vector.multiply(loffset,-1) + for i=1,3,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),roffset)) + end + for i=4,6,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),loffset)) + end + celevator.doors.erefs[hash] = erefs + if nudge then + data.soundhandle = core.sound_play("celevator_nudge",{ + pos = pos, + gain = 0.75, + max_hear_distance = 10 + }) + else + data.soundhandle = core.sound_play("celevator_door_close",{ + pos = pos, + gain = 0.3, + max_hear_distance = 10 + }) + end + data.nudging = nudge + cardoors_moving[hash] = data + celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) +end + +function celevator.doors.centerglass.carstep(hash,data,dtime,cardoors_moving) + local present = celevator.doors.erefs[hash] + if present then + for i=1,6,1 do + if not (celevator.doors.erefs[hash][i] and celevator.doors.erefs[hash][i]:get_pos()) then + present = false + break + end + end + end + if present then + if data.direction == "open" then + data.time = data.time+dtime + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*-0.5)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*0.5)) + end + if data.time >= math.pi then + for i=1,6,1 do + celevator.doors.erefs[hash][i]:remove() + end + celevator.get_meta(data.positions[1]):set_string("doorstate","open") + cardoors_moving[hash] = nil + end + elseif data.direction == "close" then + local speed = 0.66 + if data.nudging then speed = 0.2 end + data.time = data.time+(speed*dtime) + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*speed)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*-speed)) + end + if data.time >= math.pi then + for _,ref in ipairs(celevator.doors.erefs[hash]) do + ref:remove() + end + local carmeta = celevator.get_meta(data.positions[1]) + carmeta:set_string("doorstate","closed") + cardoors_moving[hash] = nil + local cartimer = core.get_node_timer(data.positions[1]) + cartimer:stop() + local fdir = core.facedir_to_dir(core.get_node(data.positions[1]).param2) + celevator.doors.spawncardoors(data.positions[1],fdir,"centerglass") + end + end + else + if data.direction == "open" then + for i=1,6,1 do + if celevator.doors.erefs[hash] and celevator.doors.erefs[hash][i] then + celevator.doors.erefs[hash][i]:remove() + end + end + celevator.get_meta(data.positions[1]):set_string("doorstate","open") + cardoors_moving[hash] = nil + elseif data.direction == "close" then + local fdir = core.fourdir_to_dir(celevator.get_node(data.positions[1]).param2) + celevator.doors.spawncardoors(data.positions[1],vector.rotate_around_axis(fdir,vector.new(0,1,0),math.pi),"centerglass") + celevator.get_meta(data.positions[1]):set_string("doorstate","closed") + cardoors_moving[hash] = nil + end + end +end diff --git a/door_centermetal.lua b/door_centermetal.lua new file mode 100644 index 0000000..8857ed0 --- /dev/null +++ b/door_centermetal.lua @@ -0,0 +1,636 @@ +celevator.doors.centermetal = {} + +local S = core.get_translator("celevator") + +core.register_node("celevator:hwdoor_left_steel_bottom",{ + description = S("Steel Hoistway Door (left, bottom - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_metal.png", + "celevator_door_metal.png", + }, + groups = { + not_in_creative_inventory = 1, + _celevator_hwdoor_root = 1, + oddly_breakable_by_hand = 2, + }, + drop = "celevator:hwdoor_centersteel", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + after_dig_node = function(pos,node) + local erefs = core.get_objects_inside_radius(pos,1.5) + for _,ref in pairs(erefs) do + if ref:get_luaentity() and ref:get_luaentity().name == "celevator:door_sill" then ref:remove() end + end + local facedir = core.dir_to_yaw(core.fourdir_to_dir(node.param2)) + local xnames = { + [0] = "left", + [1] = "right", + } + local ynames = { + [0] = "bottom", + [1] = "middle", + [2] = "top", + } + for x=0,1,1 do + for y=0,2,1 do + local piecename = string.format("celevator:hwdoor_%s_steel_%s",xnames[x],ynames[y]) + local pieceoffset = vector.new(x,y,0) + local piecepos = vector.add(pos,vector.rotate_around_axis(pieceoffset,vector.new(0,1,0),facedir)) + if core.get_node(piecepos).name == piecename then core.remove_node(piecepos) end + end + end + end, + _celevator_doortype = "centermetal", +}) + +core.register_node("celevator:hwdoor_left_steel_middle",{ + description = S("Steel Hoistway Door (left, middle - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_metal.png", + "celevator_door_metal.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + _celevator_doortype = "centermetal", +}) + +core.register_node("celevator:hwdoor_left_steel_top",{ + description = S("Steel Hoistway Door (left, top - you hacker you!)"), + tiles = { + "celevator_door_glass_edge.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_metal.png", + "celevator_door_metal.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + _celevator_doortype = "centermetal", +}) + +core.register_node("celevator:hwdoor_right_steel_bottom",{ + description = S("Steel Hoistway Door (right, bottom - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_metal.png", + "celevator_door_metal.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + _celevator_doortype = "centermetal", +}) + +core.register_node("celevator:hwdoor_right_steel_middle",{ + description = S("Steel Hoistway Door (right, middle - you hacker you!)"), + tiles = { + "celevator_transparent.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_metal.png", + "celevator_door_metal.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + _celevator_doortype = "centermetal", +}) + +core.register_node("celevator:hwdoor_right_steel_top",{ + description = S("Steel Hoistway Door (right, top - you hacker you!)"), + tiles = { + "celevator_door_glass_edge.png", + "celevator_transparent.png", + "celevator_door_glass_edge.png", + "celevator_door_glass_edge.png", + "celevator_door_metal.png", + "celevator_door_metal.png", + }, + groups = { + not_in_creative_inventory = 1, + }, + drop = "", + paramtype = "light", + paramtype2 = "4dir", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5,-0.5,0.4,0.5,0.5,0.5}, + }, + }, + _celevator_doortype = "centermetal", +}) + +core.register_node("celevator:hwdoor_centersteel",{ + description = S("Center-Opening Steel Elevator Hoistway Door"), + paramtype2 = "4dir", + buildable_to = true, + inventory_image = "celevator_door_centermetal_inventory.png", + wield_image = "celevator_door_centermetal_inventory.png", + wield_scale = vector.new(1,3,1), + tiles = {"celevator_transparent.png"}, + after_place_node = function(pos,player) + if not player:is_player() then + core.remove_node(pos) + return true + end + local name = player:get_player_name() + local newnode = core.get_node(pos) + local facedir = core.dir_to_yaw(core.fourdir_to_dir(newnode.param2)) + local xnames = { + [0] = "left", + [1] = "right", + } + local ynames = { + [0] = "bottom", + [1] = "middle", + [2] = "top", + } + for x=0,1,1 do + for y=0,2,1 do + local placeoffset = vector.new(x,y,0) + local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir)) + local replaces = core.get_node(placepos).name + if not (core.registered_nodes[replaces] and core.registered_nodes[replaces].buildable_to) then + local errormsg = S("Can't place door here - position @1m to the right and @2m up is blocked!",x,y) + core.chat_send_player(name,errormsg) + core.remove_node(pos) + return true + end + if core.is_protected(placepos,name) and not core.check_player_privs(name,{protection_bypass=true}) then + local errormsg = S("Can't place door here - position @1m to the right and @2m up is protected!",x,y) + core.chat_send_player(name,errormsg) + core.record_protection_violation(placepos,name) + core.remove_node(pos) + return true + end + end + end + for x=0,1,1 do + for y=0,2,1 do + local piecename = string.format("celevator:hwdoor_%s_steel_%s",xnames[x],ynames[y]) + local placeoffset = vector.new(x,y,0) + local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir)) + core.set_node(placepos,{name=piecename,param2=newnode.param2}) + if y==0 then + celevator.doors.placesill(placepos,{name=piecename,param2=newnode.param2}) + end + end + end + local carpos = vector.add(pos,vector.rotate_around_axis(vector.new(0,0,1),vector.new(0,1,0),facedir)) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.get_meta(carpos):set_string("doortype","centermetal") + celevator.doors.spawncardoors(carpos,core.fourdir_to_dir(newnode.param2),"centermetal",true) + end + end, +}) + +core.register_lbm({ + label = "Respawn hoistway door sills (center-opening steel)", + name = "celevator:spawn_sill_centermetal", + nodenames = { + "celevator:hwdoor_left_steel_bottom", + "celevator:hwdoor_right_steel_bottom", + }, + run_at_every_load = true, + action = celevator.doors.placesill, +}) + +celevator.doors.centermetal.spawncardoors = function(pos,dir,replace) + local refs = {} + for x=2,1,-1 do + for y=1,3,1 do + local yaw = core.dir_to_yaw(dir)+math.pi + local doorpos = vector.add(pos,vector.rotate_around_axis(vector.new(x-2,y-1,0),vector.new(0,1,0),yaw)) + local xnames = {"left","right"} + local ynames = {"bottom","middle","top"} + local nname = string.format("celevator:hwdoor_%s_steel_%s",xnames[x],ynames[y]) + if replace then + local oldrefs = core.get_objects_inside_radius(doorpos,0.1) + for _,i in pairs(oldrefs) do + if i:get_luaentity() and i:get_luaentity().name == "celevator:car_door" then + i:remove() + end + end + end + local ref = core.add_entity(doorpos,"celevator:car_door") + ref:set_yaw(yaw) + ref:set_properties({ + wield_item = nname, + }) + table.insert(refs,ref) + end + end + return refs +end + +function celevator.doors.centermetal.hwopen(pos,drivepos) + celevator.doors.hwdoor_step_enabled = true + local hwdoors_moving = core.deserialize(celevator.storage:get_string("hwdoors_moving")) or {} + local hash = core.hash_node_position(pos) + if not hwdoors_moving[hash] then + local param2 = celevator.get_node(pos).param2 + local fdir = core.fourdir_to_dir(param2) + local otherpanel = vector.add(pos,vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2)) + local positions = { + pos, + vector.add(pos,vector.new(0,1,0)), + vector.add(pos,vector.new(0,2,0)), + otherpanel, + vector.add(otherpanel,vector.new(0,1,0)), + vector.add(otherpanel,vector.new(0,2,0)), + } + local oldnodes = {} + for i,position in ipairs(positions) do + oldnodes[i] = celevator.get_node(position) + end + local erefs = celevator.drives.entity.nodestoentities(positions,"celevator:hwdoor_moving") + hwdoors_moving[hash] = { + direction = "open", + positions = positions, + nodes = oldnodes, + time = 0, + opendir = vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2), + drivepos = drivepos, + param2 = param2, + doortype = "centermetal", + } + celevator.doors.erefs[hash] = erefs + celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) + core.set_node(pos,{name="celevator:hwdoor_placeholder",param2=param2}) + local pmeta = celevator.get_meta(pos) + pmeta:set_string("data",core.serialize(hwdoors_moving[hash])) + pmeta:set_string("state","opening") + pmeta:set_string("doortype","centermetal") + local carpos = vector.add(pos,fdir) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.doors.caropen(carpos) + end + elseif hwdoors_moving[hash].direction == "close" then + hwdoors_moving[hash].direction = "open" + hwdoors_moving[hash].time = math.pi-hwdoors_moving[hash].time + celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) + local fdir = core.fourdir_to_dir(hwdoors_moving[hash].param2) + local carpos = vector.add(pos,fdir) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.doors.caropen(carpos) + end + core.set_node(pos,{name="celevator:hwdoor_placeholder",param2=hwdoors_moving[hash].param2}) + local pmeta = celevator.get_meta(pos) + pmeta:set_string("data",core.serialize(hwdoors_moving[hash])) + pmeta:set_string("state","opening") + pmeta:set_string("doortype","centermetal") + end +end + +function celevator.doors.centermetal.hwclose(pos,drivepos,nudge) + celevator.doors.hwdoor_step_enabled = true + local hwdoors_moving = core.deserialize(celevator.storage:get_string("hwdoors_moving")) or {} + local hash = core.hash_node_position(pos) + if hwdoors_moving[hash] then + return + end + local pmeta = celevator.get_meta(pos) + local state = pmeta:get_string("state") + if state ~= "open" then return end + local fdir = core.fourdir_to_dir(celevator.get_node(pos).param2) + local carpos = vector.add(pos,fdir) + local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} + if carndef._root then + celevator.doors.carclose(carpos,nudge) + end + local data = core.deserialize(pmeta:get_string("data")) + if not data then return end + for i=1,6,1 do + core.set_node(data.positions[i],data.nodes[i]) + end + data.direction = "close" + data.time = 0 + data.drivepos = drivepos + data.nudging = nudge + data.doortype = "centermetal" + local erefs = celevator.drives.entity.nodestoentities(data.positions,"celevator:hwdoor_moving") + local roffset = vector.multiply(data.opendir,-1) + local loffset = data.opendir + for i=1,3,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),roffset)) + end + for i=4,6,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),loffset)) + end + celevator.doors.erefs[hash] = erefs + hwdoors_moving[hash] = data + celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) +end + +function celevator.doors.centermetal.hwstep(hash,data,dtime,hwdoors_moving) + local present = celevator.doors.erefs[hash] + if present then + for i=1,6,1 do + if not celevator.doors.erefs[hash][i]:get_pos() then + present = false + break + end + end + end + if present then + if data.direction == "open" then + data.time = data.time+dtime + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*-0.5)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*0.5)) + end + if data.time >= math.pi then + for i=1,6,1 do + celevator.doors.erefs[hash][i]:remove() + end + celevator.get_meta(data.positions[1]):set_string("state","open") + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","open") end + hwdoors_moving[hash] = nil + end + elseif data.direction == "close" then + local speed = 0.66 + if data.nudging then speed = 0.2 end + data.time = data.time+(speed*dtime) + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*speed)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*-speed)) + end + if data.time >= math.pi then + for i=1,6,1 do + celevator.doors.erefs[hash][i]:set_pos(data.positions[i]) + end + celevator.drives.entity.entitiestonodes(celevator.doors.erefs[hash]) + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","closed") end + hwdoors_moving[hash] = nil + end + end + else + if data.direction == "open" then + for i=1,6,1 do + if celevator.doors.erefs[hash] then + celevator.doors.erefs[hash][i]:remove() + end + end + celevator.get_meta(data.positions[1]):set_string("state","open") + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","open") end + hwdoors_moving[hash] = nil + elseif data.direction == "close" then + for i=1,6,1 do + core.set_node(data.positions[i],data.nodes[i]) + end + celevator.get_meta(data.positions[1]):set_string("state","closed") + if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","closed") end + hwdoors_moving[hash] = nil + end + end +end + +function celevator.doors.centermetal.caropen(pos) + celevator.doors.cardoor_step_enabled = true + local cardoors_moving = core.deserialize(celevator.storage:get_string("cardoors_moving")) or {} + local hash = core.hash_node_position(pos) + local cartimer = core.get_node_timer(pos) + cartimer:start(0.25) + if not cardoors_moving[hash] then + local fdir = core.fourdir_to_dir(celevator.get_node(pos).param2) + local otherpanel = vector.add(pos,vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2)) + local positions = { + pos, + vector.add(pos,vector.new(0,1,0)), + vector.add(pos,vector.new(0,2,0)), + otherpanel, + vector.add(otherpanel,vector.new(0,1,0)), + vector.add(otherpanel,vector.new(0,2,0)), + } + local erefs = {} + for _,dpos in ipairs(positions) do + local objs = core.get_objects_inside_radius(dpos,0.5) + for _,obj in pairs(objs) do + if obj:get_luaentity() and obj:get_luaentity().name == "celevator:car_door" then + table.insert(erefs,obj) + end + end + end + cardoors_moving[hash] = { + direction = "open", + positions = positions, + time = 0, + opendir = vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2), + doortype = "centermetal", + } + core.sound_play("celevator_door_open",{ + pos = pos, + gain = 0.4, + max_hear_distance = 10 + },true) + celevator.doors.erefs[hash] = erefs + celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) + local meta = celevator.get_meta(pos) + meta:set_string("doordata",core.serialize(cardoors_moving[hash])) + meta:set_string("doorstate","opening") + elseif cardoors_moving[hash].direction == "close" then + if cardoors_moving[hash].soundhandle then + core.sound_stop(cardoors_moving[hash].soundhandle) + end + core.sound_play("celevator_door_reverse",{ + pos = pos, + gain = 1, + max_hear_distance = 10 + },true) + core.sound_play("celevator_door_open",{ + pos = pos, + gain = 0.4, + start_time = math.max(0,2.75-cardoors_moving[hash].time), + max_hear_distance = 10 + },true) + cardoors_moving[hash].direction = "open" + cardoors_moving[hash].time = math.pi-cardoors_moving[hash].time + celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) + end +end + +function celevator.doors.centermetal.carclose(pos,nudge) + celevator.doors.cardoor_step_enabled = true + local cardoors_moving = core.deserialize(celevator.storage:get_string("cardoors_moving")) or {} + local hash = core.hash_node_position(pos) + if cardoors_moving[hash] then + return + end + local meta = celevator.get_meta(pos) + local state = meta:get_string("doorstate") + if state ~= "open" then return end + local data = core.deserialize(meta:get_string("doordata")) + if not data then return end + local dir = core.fourdir_to_dir(celevator.get_node(pos).param2) + data.direction = "close" + data.time = 0 + data.doortype = "centermetal" + local erefs = celevator.doors.spawncardoors(pos,dir,"centermetal") + local loffset = data.opendir + local roffset = vector.multiply(loffset,-1) + for i=1,3,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),roffset)) + end + for i=4,6,1 do + erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),loffset)) + end + celevator.doors.erefs[hash] = erefs + if nudge then + data.soundhandle = core.sound_play("celevator_nudge",{ + pos = pos, + gain = 0.75, + max_hear_distance = 10 + }) + else + data.soundhandle = core.sound_play("celevator_door_close",{ + pos = pos, + gain = 0.3, + max_hear_distance = 10 + }) + end + data.nudging = nudge + cardoors_moving[hash] = data + celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) +end + +function celevator.doors.centermetal.carstep(hash,data,dtime,cardoors_moving) + local present = celevator.doors.erefs[hash] + if present then + for i=1,6,1 do + if not (celevator.doors.erefs[hash][i] and celevator.doors.erefs[hash][i]:get_pos()) then + present = false + break + end + end + end + if present then + if data.direction == "open" then + data.time = data.time+dtime + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*-0.5)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*0.5)) + end + if data.time >= math.pi then + for i=1,6,1 do + celevator.doors.erefs[hash][i]:remove() + end + celevator.get_meta(data.positions[1]):set_string("doorstate","open") + cardoors_moving[hash] = nil + end + elseif data.direction == "close" then + local speed = 0.66 + if data.nudging then speed = 0.2 end + data.time = data.time+(speed*dtime) + local vel = math.sin(data.time) + for i=1,3,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*speed)) + end + for i=4,6,1 do + celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*-speed)) + end + if data.time >= math.pi then + for _,ref in ipairs(celevator.doors.erefs[hash]) do + ref:remove() + end + local carmeta = celevator.get_meta(data.positions[1]) + carmeta:set_string("doorstate","closed") + cardoors_moving[hash] = nil + local cartimer = core.get_node_timer(data.positions[1]) + cartimer:stop() + local fdir = core.facedir_to_dir(core.get_node(data.positions[1]).param2) + celevator.doors.spawncardoors(data.positions[1],fdir,"centermetal") + end + end + else + if data.direction == "open" then + for i=1,6,1 do + if celevator.doors.erefs[hash] and celevator.doors.erefs[hash][i] then + celevator.doors.erefs[hash][i]:remove() + end + end + celevator.get_meta(data.positions[1]):set_string("doorstate","open") + cardoors_moving[hash] = nil + elseif data.direction == "close" then + local fdir = core.fourdir_to_dir(celevator.get_node(data.positions[1]).param2) + celevator.doors.spawncardoors(data.positions[1],vector.rotate_around_axis(fdir,vector.new(0,1,0),math.pi),"centermetal") + celevator.get_meta(data.positions[1]):set_string("doorstate","closed") + cardoors_moving[hash] = nil + end + end +end diff --git a/doors.lua b/doors.lua index e79aeb5..8f4b5d7 100644 --- a/doors.lua +++ b/doors.lua @@ -4,385 +4,32 @@ local S = core.get_translator("celevator") celevator.doors.erefs = {} +local typealiases = { + glass = "twospeedglass", + steel = "twospeedmetal", +} + +local function typelookup(doortype) + if (not doortype) or doortype == "" then return "twospeedglass" end + return typealiases[doortype] or doortype +end + --These get overwritten on globalstep and aren't settings. --They're just set to true here so the globalstep functions run at least once, --in case a door was moving when the server last shut down. celevator.doors.hwdoor_step_enabled = true celevator.doors.cardoor_step_enabled = true -local function placesill(pos,node) +function celevator.doors.placesill(pos,node) local erefs = core.get_objects_inside_radius(pos,0.5) for _,ref in pairs(erefs) do if ref:get_luaentity() and ref:get_luaentity().name == "celevator:door_sill" then return end end local yaw = core.dir_to_yaw(core.fourdir_to_dir(node.param2)) local entity = core.add_entity(pos,"celevator:door_sill") - if node.name == "celevator:hwdoor_slow_glass_bottom" or node.name == "celevator:hwdoor_slow_steel_bottom" then - entity:set_properties({ - wield_item = "celevator:door_sill_double", - }) - end entity:set_yaw(yaw) end -core.register_node("celevator:hwdoor_fast_glass_bottom",{ - description = S("Glass Hoistway Door (fast, bottom - you hacker you!)"), - tiles = { - "celevator_transparent.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_topbottom.png^[transformFY", - "celevator_door_glass_topbottom.png^[transformFY", - }, - groups = { - not_in_creative_inventory = 1, - _celevator_hwdoor_root = 1, - oddly_breakable_by_hand = 2, - }, - drop = "celevator:hwdoor_glass", - paramtype = "light", - paramtype2 = "4dir", - drawtype = "nodebox", - use_texture_alpha = "clip", - node_box = { - type = "fixed", - fixed = { - {-0.5,-0.5,0.4,0.5,0.5,0.5}, - }, - }, - after_dig_node = function(pos,node) - local erefs = core.get_objects_inside_radius(pos,1.5) - for _,ref in pairs(erefs) do - if ref:get_luaentity() and ref:get_luaentity().name == "celevator:door_sill" then ref:remove() end - end - local facedir = core.dir_to_yaw(core.fourdir_to_dir(node.param2)) - local xnames = { - [0] = "fast", - [1] = "slow", - } - local ynames = { - [0] = "bottom", - [1] = "middle", - [2] = "top", - } - for x=0,1,1 do - for y=0,2,1 do - local piecename = string.format("celevator:hwdoor_%s_glass_%s",xnames[x],ynames[y]) - local pieceoffset = vector.new(x,y,0) - local piecepos = vector.add(pos,vector.rotate_around_axis(pieceoffset,vector.new(0,1,0),facedir)) - if core.get_node(piecepos).name == piecename then core.remove_node(piecepos) end - end - end - end, -}) - -core.register_node("celevator:hwdoor_fast_glass_middle",{ - description = S("Glass Hoistway Door (fast, middle - you hacker you!)"), - tiles = { - "celevator_transparent.png", - "celevator_transparent.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_middle.png", - "celevator_door_glass_middle.png", - }, - groups = { - not_in_creative_inventory = 1, - }, - drop = "", - paramtype = "light", - paramtype2 = "4dir", - drawtype = "nodebox", - use_texture_alpha = "clip", - node_box = { - type = "fixed", - fixed = { - {-0.5,-0.5,0.4,0.5,0.5,0.5}, - }, - }, -}) - -core.register_node("celevator:hwdoor_fast_glass_top",{ - description = S("Glass Hoistway Door (fast, top - you hacker you!)"), - tiles = { - "celevator_door_glass_edge.png", - "celevator_transparent.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_topbottom.png", - "celevator_door_glass_topbottom.png", - }, - groups = { - not_in_creative_inventory = 1, - }, - drop = "", - paramtype = "light", - paramtype2 = "4dir", - drawtype = "nodebox", - use_texture_alpha = "clip", - node_box = { - type = "fixed", - fixed = { - {-0.5,-0.5,0.4,0.5,0.5,0.5}, - }, - }, -}) - -core.register_node("celevator:hwdoor_slow_glass_bottom",{ - description = S("Glass Hoistway Door (slow, bottom - you hacker you!)"), - tiles = { - "celevator_transparent.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_topbottom.png^[transformFY", - "celevator_door_glass_topbottom.png^[transformFY", - }, - groups = { - not_in_creative_inventory = 1, - }, - drop = "", - paramtype = "light", - paramtype2 = "4dir", - drawtype = "nodebox", - use_texture_alpha = "clip", - node_box = { - type = "fixed", - fixed = { - {-0.5,-0.5,0.3,0.5,0.5,0.4}, - }, - }, -}) - -core.register_node("celevator:hwdoor_slow_glass_middle",{ - description = S("Glass Hoistway Door (slow, middle - you hacker you!)"), - tiles = { - "celevator_transparent.png", - "celevator_transparent.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_middle.png", - "celevator_door_glass_middle.png", - }, - groups = { - not_in_creative_inventory = 1, - }, - drop = "", - paramtype = "light", - paramtype2 = "4dir", - drawtype = "nodebox", - use_texture_alpha = "clip", - node_box = { - type = "fixed", - fixed = { - {-0.5,-0.5,0.3,0.5,0.5,0.4}, - }, - }, -}) - -core.register_node("celevator:hwdoor_slow_glass_top",{ - description = S("Glass Hoistway Door (slow, top - you hacker you!)"), - tiles = { - "celevator_door_glass_edge.png", - "celevator_transparent.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_topbottom.png", - "celevator_door_glass_topbottom.png", - }, - groups = { - not_in_creative_inventory = 1, - }, - drop = "", - paramtype = "light", - paramtype2 = "4dir", - drawtype = "nodebox", - use_texture_alpha = "clip", - node_box = { - type = "fixed", - fixed = { - {-0.5,-0.5,0.3,0.5,0.5,0.4}, - }, - }, -}) - -core.register_node("celevator:hwdoor_fast_steel_bottom",{ - description = S("Steel Hoistway Door (fast, bottom - you hacker you!)"), - tiles = { - "celevator_transparent.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_metal.png", - "celevator_door_metal.png", - }, - groups = { - not_in_creative_inventory = 1, - _celevator_hwdoor_root = 1, - oddly_breakable_by_hand = 2, - }, - drop = "celevator:hwdoor_steel", - paramtype = "light", - paramtype2 = "4dir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5,-0.5,0.4,0.5,0.5,0.5}, - }, - }, - after_dig_node = function(pos,node) - local erefs = core.get_objects_inside_radius(pos,1.5) - for _,ref in pairs(erefs) do - if ref:get_luaentity() and ref:get_luaentity().name == "celevator:door_sill" then ref:remove() end - end - local facedir = core.dir_to_yaw(core.fourdir_to_dir(node.param2)) - local xnames = { - [0] = "fast", - [1] = "slow", - } - local ynames = { - [0] = "bottom", - [1] = "middle", - [2] = "top", - } - for x=0,1,1 do - for y=0,2,1 do - local piecename = string.format("celevator:hwdoor_%s_steel_%s",xnames[x],ynames[y]) - local pieceoffset = vector.new(x,y,0) - local piecepos = vector.add(pos,vector.rotate_around_axis(pieceoffset,vector.new(0,1,0),facedir)) - if core.get_node(piecepos).name == piecename then core.remove_node(piecepos) end - end - end - end, -}) - -core.register_node("celevator:hwdoor_fast_steel_middle",{ - description = S("Steel Hoistway Door (fast, middle - you hacker you!)"), - tiles = { - "celevator_transparent.png", - "celevator_transparent.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_metal.png", - "celevator_door_metal.png", - }, - groups = { - not_in_creative_inventory = 1, - }, - drop = "", - paramtype = "light", - paramtype2 = "4dir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5,-0.5,0.4,0.5,0.5,0.5}, - }, - }, -}) - -core.register_node("celevator:hwdoor_fast_steel_top",{ - description = S("Steel Hoistway Door (fast, top - you hacker you!)"), - tiles = { - "celevator_door_glass_edge.png", - "celevator_transparent.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_metal.png", - "celevator_door_metal.png", - }, - groups = { - not_in_creative_inventory = 1, - }, - drop = "", - paramtype = "light", - paramtype2 = "4dir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5,-0.5,0.4,0.5,0.5,0.5}, - }, - }, -}) - -core.register_node("celevator:hwdoor_slow_steel_bottom",{ - description = S("Steel Hoistway Door (slow, bottom - you hacker you!)"), - tiles = { - "celevator_transparent.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_metal.png", - "celevator_door_metal.png", - }, - groups = { - not_in_creative_inventory = 1, - }, - drop = "", - paramtype = "light", - paramtype2 = "4dir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5,-0.5,0.3,0.5,0.5,0.4}, - }, - }, -}) - -core.register_node("celevator:hwdoor_slow_steel_middle",{ - description = S("Steel Hoistway Door (slow, middle - you hacker you!)"), - tiles = { - "celevator_transparent.png", - "celevator_transparent.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_metal.png", - "celevator_door_metal.png", - }, - groups = { - not_in_creative_inventory = 1, - }, - drop = "", - paramtype = "light", - paramtype2 = "4dir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5,-0.5,0.3,0.5,0.5,0.4}, - }, - }, -}) - -core.register_node("celevator:hwdoor_slow_steel_top",{ - description = S("Steel Hoistway Door (slow, top - you hacker you!)"), - tiles = { - "celevator_door_glass_edge.png", - "celevator_transparent.png", - "celevator_door_glass_edge.png", - "celevator_door_glass_edge.png", - "celevator_door_metal.png", - "celevator_door_metal.png", - }, - groups = { - not_in_creative_inventory = 1, - }, - drop = "", - paramtype = "light", - paramtype2 = "4dir", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5,-0.5,0.3,0.5,0.5,0.4}, - }, - }, -}) - core.register_node("celevator:hwdoor_placeholder",{ description = S("Hoistway Door Open-State Placeholder (you hacker you!)"), groups = { @@ -419,107 +66,27 @@ core.register_entity("celevator:hwdoor_moving",{ }, }) -function celevator.doors.hwopen(pos,drivepos) - celevator.doors.hwdoor_step_enabled = true - local hwdoors_moving = core.deserialize(celevator.storage:get_string("hwdoors_moving")) or {} - local hash = core.hash_node_position(pos) - if not hwdoors_moving[hash] then - local param2 = celevator.get_node(pos).param2 - local fdir = core.fourdir_to_dir(param2) - local otherpanel = vector.add(pos,vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2)) - local positions = { - pos, - vector.add(pos,vector.new(0,1,0)), - vector.add(pos,vector.new(0,2,0)), - otherpanel, - vector.add(otherpanel,vector.new(0,1,0)), - vector.add(otherpanel,vector.new(0,2,0)), - } - local oldnodes = {} - for i,position in ipairs(positions) do - oldnodes[i] = celevator.get_node(position) - end - local erefs = celevator.drives.entity.nodestoentities(positions,"celevator:hwdoor_moving") - local doortype = "glass" - if oldnodes[1].name == "celevator:hwdoor_slow_steel_bottom" then - doortype = "steel" - end - hwdoors_moving[hash] = { - direction = "open", - positions = positions, - nodes = oldnodes, - time = 0, - opendir = vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2), - drivepos = drivepos, - param2 = param2, - doortype = doortype, - } - celevator.doors.erefs[hash] = erefs - celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) - core.set_node(pos,{name="celevator:hwdoor_placeholder",param2=param2}) - local pmeta = celevator.get_meta(pos) - pmeta:set_string("data",core.serialize(hwdoors_moving[hash])) - pmeta:set_string("state","opening") - pmeta:set_string("doortype",doortype) - local carpos = vector.add(pos,fdir) - local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} - if carndef._root then - celevator.doors.caropen(carpos) - end - elseif hwdoors_moving[hash].direction == "close" then - hwdoors_moving[hash].direction = "open" - hwdoors_moving[hash].time = math.pi-hwdoors_moving[hash].time - celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) - local fdir = core.fourdir_to_dir(hwdoors_moving[hash].param2) - local carpos = vector.add(pos,fdir) - local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} - if carndef._root then - celevator.doors.caropen(carpos) - end - core.set_node(pos,{name="celevator:hwdoor_placeholder",param2=hwdoors_moving[hash].param2}) - local pmeta = celevator.get_meta(pos) - pmeta:set_string("data",core.serialize(hwdoors_moving[hash])) - pmeta:set_string("state","opening") +function celevator.doors.hwopen(pos,...) + local nname = celevator.get_node(pos).name + local doortype + if nname == "celevator:hwdoor_placeholder" then + doortype = celevator.get_meta(pos):get_string("doortype") + else + local ndef = core.registered_nodes[nname] + if not ndef then return end + doortype = ndef._celevator_doortype end + if not doortype then + local hwdoors_moving = core.deserialize(celevator.storage:get_string("hwdoors_moving")) or {} + doortype = hwdoors_moving[core.hash_node_position(pos)].doortype + end + celevator.doors[typelookup(doortype)].hwopen(pos,...) end -function celevator.doors.hwclose(pos,drivepos,nudge) - celevator.doors.hwdoor_step_enabled = true - local hwdoors_moving = core.deserialize(celevator.storage:get_string("hwdoors_moving")) or {} - local hash = core.hash_node_position(pos) - if hwdoors_moving[hash] then - return - end +function celevator.doors.hwclose(pos,...) local pmeta = celevator.get_meta(pos) - local state = pmeta:get_string("state") - if state ~= "open" then return end - local fdir = core.fourdir_to_dir(celevator.get_node(pos).param2) - local carpos = vector.add(pos,fdir) - local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} - if carndef._root then - celevator.doors.carclose(carpos,nudge) - end - local data = core.deserialize(pmeta:get_string("data")) - if not data then return end - for i=1,6,1 do - core.set_node(data.positions[i],data.nodes[i]) - end - data.direction = "close" - data.time = 0 - data.drivepos = drivepos - data.nudging = nudge - local erefs = celevator.drives.entity.nodestoentities(data.positions,"celevator:hwdoor_moving") - local foffset = vector.multiply(data.opendir,2) - local soffset = data.opendir - for i=1,3,1 do - erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),foffset)) - end - for i=4,6,1 do - erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),soffset)) - end - celevator.doors.erefs[hash] = erefs - hwdoors_moving[hash] = data - celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) + local doortype = typelookup(pmeta:get_string("doortype")) + celevator.doors[doortype].hwclose(pos,...) end function celevator.doors.hwstep(dtime) @@ -528,72 +95,8 @@ function celevator.doors.hwstep(dtime) local save = false for hash,data in pairs(hwdoors_moving) do save = true - local present = celevator.doors.erefs[hash] - if present then - for i=1,6,1 do - if not celevator.doors.erefs[hash][i]:get_pos() then - present = false - break - end - end - end - if present then - if data.direction == "open" then - data.time = data.time+dtime - local vel = math.sin(data.time) - for i=1,3,1 do - celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel)) - end - for i=4,6,1 do - celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2)) - end - if data.time >= math.pi then - for i=1,6,1 do - celevator.doors.erefs[hash][i]:remove() - end - celevator.get_meta(data.positions[1]):set_string("state","open") - if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","open") end - hwdoors_moving[hash] = nil - end - elseif data.direction == "close" then - local speed = 0.66 - if data.nudging then speed = 0.2 end - data.time = data.time+(speed*dtime) - local vel = math.sin(data.time) - for i=1,3,1 do - celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*-speed)) - end - for i=4,6,1 do - celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*-speed)) - end - if data.time >= math.pi then - for i=1,6,1 do - celevator.doors.erefs[hash][i]:set_pos(data.positions[i]) - end - celevator.drives.entity.entitiestonodes(celevator.doors.erefs[hash]) - if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","closed") end - hwdoors_moving[hash] = nil - end - end - else - if data.direction == "open" then - for i=1,6,1 do - if celevator.doors.erefs[hash] then - celevator.doors.erefs[hash][i]:remove() - end - end - celevator.get_meta(data.positions[1]):set_string("state","open") - if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","open") end - hwdoors_moving[hash] = nil - elseif data.direction == "close" then - for i=1,6,1 do - core.set_node(data.positions[i],data.nodes[i]) - end - celevator.get_meta(data.positions[1]):set_string("state","closed") - if hwdoors_moving[hash].drivepos then celevator.get_meta(hwdoors_moving[hash].drivepos):set_string("doorstate","closed") end - hwdoors_moving[hash] = nil - end - end + local doortype = typelookup(data.doortype) + celevator.doors[doortype].hwstep(hash,data,dtime,hwdoors_moving) end if save then celevator.storage:set_string("hwdoors_moving",core.serialize(hwdoors_moving)) @@ -609,74 +112,8 @@ function celevator.doors.carstep(dtime) local save = false for hash,data in pairs(cardoors_moving) do save = true - local present = celevator.doors.erefs[hash] - if present then - for i=1,6,1 do - if not (celevator.doors.erefs[hash][i] and celevator.doors.erefs[hash][i]:get_pos()) then - present = false - break - end - end - end - if present then - if data.direction == "open" then - data.time = data.time+dtime - local vel = math.sin(data.time) - for i=1,3,1 do - celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel)) - end - for i=4,6,1 do - celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2)) - end - if data.time >= math.pi then - for i=1,6,1 do - celevator.doors.erefs[hash][i]:remove() - end - celevator.get_meta(data.positions[1]):set_string("doorstate","open") - cardoors_moving[hash] = nil - end - elseif data.direction == "close" then - local speed = 0.66 - if data.nudging then speed = 0.2 end - data.time = data.time+(speed*dtime) - local vel = math.sin(data.time) - for i=1,3,1 do - celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel*-speed)) - end - for i=4,6,1 do - celevator.doors.erefs[hash][i]:set_velocity(vector.multiply(data.opendir,vel/2*-speed)) - end - if data.time >= math.pi then - for _,ref in ipairs(celevator.doors.erefs[hash]) do - ref:remove() - end - local carmeta = celevator.get_meta(data.positions[1]) - carmeta:set_string("doorstate","closed") - cardoors_moving[hash] = nil - local cartimer = core.get_node_timer(data.positions[1]) - cartimer:stop() - local fdir = core.facedir_to_dir(core.get_node(data.positions[1]).param2) - local doortype = carmeta:get_string("doortype") - if (not doortype) or doortype == "" then doortype = "glass" end - celevator.doors.spawncardoors(data.positions[1],fdir,doortype) - end - end - else - if data.direction == "open" then - for i=1,6,1 do - if celevator.doors.erefs[hash] and celevator.doors.erefs[hash][i] then - celevator.doors.erefs[hash][i]:remove() - end - end - celevator.get_meta(data.positions[1]):set_string("doorstate","open") - cardoors_moving[hash] = nil - elseif data.direction == "close" then - local fdir = core.fourdir_to_dir(celevator.get_node(data.positions[1]).param2) - celevator.doors.spawncardoors(data.positions[1],vector.rotate_around_axis(fdir,vector.new(0,1,0),math.pi)) - celevator.get_meta(data.positions[1]):set_string("doorstate","closed") - cardoors_moving[hash] = nil - end - end + local doortype = typelookup(data.doortype) + celevator.doors[doortype].carstep(hash,data,dtime,cardoors_moving) end if save then celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) @@ -698,140 +135,20 @@ core.register_entity("celevator:car_door",{ }) function celevator.doors.spawncardoors(pos,dir,doortype,replace) - if not doortype then doortype = "glass" end - local refs = {} - for x=2,1,-1 do - for y=1,3,1 do - local yaw = core.dir_to_yaw(dir)+math.pi - local doorpos = vector.add(pos,vector.rotate_around_axis(vector.new(x-2,y-1,0),vector.new(0,1,0),yaw)) - local xnames = {"slow","fast"} - local ynames = {"bottom","middle","top"} - local nname = string.format("celevator:hwdoor_%s_%s_%s",xnames[x],doortype,ynames[y]) - if replace then - local oldrefs = core.get_objects_inside_radius(doorpos,0.1) - for _,i in pairs(oldrefs) do - if i:get_luaentity() and i:get_luaentity().name == "celevator:car_door" then - i:remove() - end - end - end - local ref = core.add_entity(doorpos,"celevator:car_door") - ref:set_yaw(yaw) - ref:set_properties({ - wield_item = nname, - }) - table.insert(refs,ref) - end - end - return refs + doortype = typelookup(doortype) + return celevator.doors[doortype].spawncardoors(pos,dir,replace) end function celevator.doors.caropen(pos) - celevator.doors.cardoor_step_enabled = true - local cardoors_moving = core.deserialize(celevator.storage:get_string("cardoors_moving")) or {} - local hash = core.hash_node_position(pos) - local cartimer = core.get_node_timer(pos) - cartimer:start(0.25) - if not cardoors_moving[hash] then - local fdir = core.fourdir_to_dir(celevator.get_node(pos).param2) - local otherpanel = vector.add(pos,vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2)) - local positions = { - pos, - vector.add(pos,vector.new(0,1,0)), - vector.add(pos,vector.new(0,2,0)), - otherpanel, - vector.add(otherpanel,vector.new(0,1,0)), - vector.add(otherpanel,vector.new(0,2,0)), - } - local erefs = {} - for _,dpos in ipairs(positions) do - local objs = core.get_objects_inside_radius(dpos,0.5) - for _,obj in pairs(objs) do - if obj:get_luaentity() and obj:get_luaentity().name == "celevator:car_door" then - table.insert(erefs,obj) - end - end - end - cardoors_moving[hash] = { - direction = "open", - positions = positions, - time = 0, - opendir = vector.rotate_around_axis(fdir,vector.new(0,1,0),-math.pi/2), - } - core.sound_play("celevator_door_open",{ - pos = pos, - gain = 0.4, - max_hear_distance = 10 - },true) - celevator.doors.erefs[hash] = erefs - celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) - local meta = celevator.get_meta(pos) - meta:set_string("doordata",core.serialize(cardoors_moving[hash])) - meta:set_string("doorstate","opening") - elseif cardoors_moving[hash].direction == "close" then - if cardoors_moving[hash].soundhandle then - core.sound_stop(cardoors_moving[hash].soundhandle) - end - core.sound_play("celevator_door_reverse",{ - pos = pos, - gain = 1, - max_hear_distance = 10 - },true) - core.sound_play("celevator_door_open",{ - pos = pos, - gain = 0.4, - start_time = math.max(0,2.75-cardoors_moving[hash].time), - max_hear_distance = 10 - },true) - cardoors_moving[hash].direction = "open" - cardoors_moving[hash].time = math.pi-cardoors_moving[hash].time - celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) - end + local meta = celevator.get_meta(pos) + local doortype = typelookup(meta:get_string("doortype")) + celevator.doors[doortype].caropen(pos) end -function celevator.doors.carclose(pos,nudge) - celevator.doors.cardoor_step_enabled = true - local cardoors_moving = core.deserialize(celevator.storage:get_string("cardoors_moving")) or {} - local hash = core.hash_node_position(pos) - if cardoors_moving[hash] then - return - end +function celevator.doors.carclose(pos,...) local meta = celevator.get_meta(pos) - local state = meta:get_string("doorstate") - if state ~= "open" then return end - local data = core.deserialize(meta:get_string("doordata")) - if not data then return end - local dir = core.fourdir_to_dir(celevator.get_node(pos).param2) - data.direction = "close" - data.time = 0 - local doortype = meta:get_string("doortype") - if (not doortype) or doortype == "" then doortype = "glass" end - local erefs = celevator.doors.spawncardoors(pos,dir,doortype) - local soffset = data.opendir - local foffset = vector.multiply(soffset,2) - for i=1,3,1 do - erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),foffset)) - end - for i=4,6,1 do - erefs[i]:set_pos(vector.add(erefs[i]:get_pos(),soffset)) - end - celevator.doors.erefs[hash] = erefs - if nudge then - data.soundhandle = core.sound_play("celevator_nudge",{ - pos = pos, - gain = 0.75, - max_hear_distance = 10 - }) - else - data.soundhandle = core.sound_play("celevator_door_close",{ - pos = pos, - gain = 0.3, - max_hear_distance = 10 - }) - end - data.nudging = nudge - cardoors_moving[hash] = data - celevator.storage:set_string("cardoors_moving",core.serialize(cardoors_moving)) + local doortype = typelookup(meta:get_string("doortype")) + celevator.doors[doortype].carclose(pos,...) end core.register_abm({ @@ -850,162 +167,11 @@ core.register_abm({ local fdir = core.facedir_to_dir(core.get_node(pos).param2) local carmeta = core.get_meta(pos) local doortype = carmeta:get_string("doortype") - if (not doortype) or doortype == "" then doortype = "glass" end celevator.doors.spawncardoors(pos,fdir,doortype) end, }) -core.register_node("celevator:hwdoor_glass",{ - description = S("Glass Elevator Hoistway Door"), - paramtype2 = "4dir", - buildable_to = true, - inventory_image = "celevator_door_glass_inventory.png", - wield_image = "celevator_door_glass_inventory.png", - wield_scale = vector.new(1,3,1), - tiles = {"celevator_transparent.png"}, - after_place_node = function(pos,player) - if not player:is_player() then - core.remove_node(pos) - return true - end - local name = player:get_player_name() - local newnode = core.get_node(pos) - local facedir = core.dir_to_yaw(core.fourdir_to_dir(newnode.param2)) - local xnames = { - [0] = "fast", - [1] = "slow", - } - local ynames = { - [0] = "bottom", - [1] = "middle", - [2] = "top", - } - for x=0,1,1 do - for y=0,2,1 do - local placeoffset = vector.new(x,y,0) - local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir)) - local replaces = core.get_node(placepos).name - if not (core.registered_nodes[replaces] and core.registered_nodes[replaces].buildable_to) then - local errormsg = S("Can't place door here - position @1m to the right and @2m up is blocked!",x,y) - core.chat_send_player(name,errormsg) - core.remove_node(pos) - return true - end - if core.is_protected(placepos,name) and not core.check_player_privs(name,{protection_bypass=true}) then - local errormsg = S("Can't place door here - position @1m to the right and @2m up is protected!",x,y) - core.chat_send_player(name,errormsg) - core.record_protection_violation(placepos,name) - core.remove_node(pos) - return true - end - end - end - for x=0,1,1 do - for y=0,2,1 do - local piecename = string.format("celevator:hwdoor_%s_glass_%s",xnames[x],ynames[y]) - local placeoffset = vector.new(x,y,0) - local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir)) - core.set_node(placepos,{name=piecename,param2=newnode.param2}) - if y==0 then - placesill(placepos,{name=piecename,param2=newnode.param2}) - end - end - end - local carpos = vector.add(pos,vector.rotate_around_axis(vector.new(0,0,1),vector.new(0,1,0),facedir)) - local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} - if carndef._root then - celevator.get_meta(carpos):set_string("doortype","glass") - celevator.doors.spawncardoors(carpos,core.fourdir_to_dir(newnode.param2),"glass",true) - end - end, -}) - -core.register_node("celevator:hwdoor_steel",{ - description = S("Steel Elevator Hoistway Door"), - paramtype2 = "4dir", - buildable_to = true, - inventory_image = "celevator_door_metal_inventory.png", - wield_image = "celevator_door_metal_inventory.png", - wield_scale = vector.new(1,3,1), - tiles = {"celevator_transparent.png"}, - after_place_node = function(pos,player) - if not player:is_player() then - core.remove_node(pos) - return true - end - local name = player:get_player_name() - local newnode = core.get_node(pos) - local facedir = core.dir_to_yaw(core.fourdir_to_dir(newnode.param2)) - local xnames = { - [0] = "fast", - [1] = "slow", - } - local ynames = { - [0] = "bottom", - [1] = "middle", - [2] = "top", - } - for x=0,1,1 do - for y=0,2,1 do - local placeoffset = vector.new(x,y,0) - local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir)) - local replaces = core.get_node(placepos).name - if not (core.registered_nodes[replaces] and core.registered_nodes[replaces].buildable_to) then - local errormsg = S("Can't place door here - position @1m to the right and @2m up is blocked!",x,y) - core.chat_send_player(name,errormsg) - core.remove_node(pos) - return true - end - if core.is_protected(placepos,name) and not core.check_player_privs(name,{protection_bypass=true}) then - local errormsg = S("Can't place door here - position @1m to the right and @2m up is protected!",x,y) - core.chat_send_player(name,errormsg) - core.record_protection_violation(placepos,name) - core.remove_node(pos) - return true - end - end - end - for x=0,1,1 do - for y=0,2,1 do - local piecename = string.format("celevator:hwdoor_%s_steel_%s",xnames[x],ynames[y]) - local placeoffset = vector.new(x,y,0) - local placepos = vector.add(pos,vector.rotate_around_axis(placeoffset,vector.new(0,1,0),facedir)) - core.set_node(placepos,{name=piecename,param2=newnode.param2}) - if y==0 then - placesill(placepos,{name=piecename,param2=newnode.param2}) - end - end - end - local carpos = vector.add(pos,vector.rotate_around_axis(vector.new(0,0,1),vector.new(0,1,0),facedir)) - local carndef = core.registered_nodes[celevator.get_node(carpos).name] or {} - if carndef._root then - celevator.get_meta(carpos):set_string("doortype","steel") - celevator.doors.spawncardoors(carpos,core.fourdir_to_dir(newnode.param2),"steel",true) - end - end, -}) - -core.register_node("celevator:door_sill_single",{ - description = S("Hoistway Door Sill, Single Track (you hacker you!)"), - drop = "", - groups = { - not_in_creative_inventory = 1, - }, - paramtype = "light", - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5,-0.5,0.28,0.5,-0.495,0.5}, - }, - }, - tiles = { - "celevator_door_sill_single.png^[transformR180", - "celevator_cabinet_sides.png", - }, -}) - -core.register_node("celevator:door_sill_double",{ +core.register_node("celevator:door_sill",{ description = S("Hoistway Door Sill, Double Track (you hacker you!)"), drop = "", groups = { @@ -1020,7 +186,7 @@ core.register_node("celevator:door_sill_double",{ }, }, tiles = { - "celevator_door_sill_double.png^[transformR180", + "celevator_door_sill.png^[transformR180", "celevator_cabinet_sides.png", }, }) @@ -1029,22 +195,10 @@ core.register_entity("celevator:door_sill",{ initial_properties = { visual = "wielditem", visual_size = vector.new(0.667,0.667,0.667), - wield_item = "celevator:door_sill_single", + wield_item = "celevator:door_sill", static_save = false, pointable = false, glow = core.LIGHT_MAX, }, }) -core.register_lbm({ - label = "Respawn hoistway door sills", - name = "celevator:spawn_sill", - nodenames = { - "celevator:hwdoor_fast_glass_bottom", - "celevator:hwdoor_slow_glass_bottom", - "celevator:hwdoor_fast_steel_bottom", - "celevator:hwdoor_slow_steel_bottom", - }, - run_at_every_load = true, - action = placesill, -}) diff --git a/init.lua b/init.lua index 4841868..02c1264 100644 --- a/init.lua +++ b/init.lua @@ -7,6 +7,10 @@ local components = { "car_metalglass", "car_fullglass", "doors", + "door_2speedglass", + "door_2speedmetal", + "door_centerglass", + "door_centermetal", "drive_null", "drive_entity", "controller", diff --git a/locale/celevator.es.tr b/locale/celevator.es.tr index 417a131..583bbe2 100644 --- a/locale/celevator.es.tr +++ b/locale/celevator.es.tr @@ -6,6 +6,8 @@ Elevator Call Button (on state - you hacker you!)=Botón de llamada de ascensor Error reading car information!@nPlease remove and replace this node.=¡Error al leer la información de la cabina!@nRetire y reemplace este bloque. Controller/dispatcher is missing!@nPlease remove and replace this node.=¡El controlador/despachador no está presente!@nRetire y reemplace este bloque. Controller/dispatcher found but with incorrect ID!@nPlease remove and replace this node.=¡El controlador/despachador tiene un número incorrecto!@nRetire y reemplace este bloque. +Landing Number=Número de planta +Save=Guardar Car ID=Número del ascensor Car (part @1 - you hacker you!)=Cabina del ascensor (parte @1) You don't have access to these switches.=No tienes acceso a estos interruptores. @@ -114,6 +116,24 @@ FIRE SVC=INCENDIO IND SVC=INDEPENDIENTE CAR LIGHT=LUZ CAR FAN=VENTILADOR +Press Next to begin.=Haz clic en «siguiente» para comenzar. +License Info=Información de la licencia +Next >=Siguiente > +< Back=< Atrás +Done=Listo +EDIT FLOOR TABLE=EDICIÓN DE LA TABLA DE PLANTAS +@1 - Height: @2 - PI: @3=@1 - Altura: @2 - Nombre: @3 +New Floor=Planta nueva +Edit Floor=Editar planta +Remove Floor=Eliminar planta +The Floor Height is the distance (in meters/nodes) from the floor level of this floor to the floor level of the next floor.=La altura de la planta es la distancia (en metros/nodos) desde el nivel del suelo de esta planta hasta el nivel del suelo de la planta siguiente. +(not used at the highest floor)=(No se utiliza en la planta más alta) +The Floor Name is how the floor will be displayed on the position indicators.=El nombre de la planta es la forma en que se mostrará la planta en los indicadores de posición. +Editing Floor @1=Editando la planta @1 +Floor Height=Altura de la planta +Floor Name=Nombre de la planta +Edit Floor Table=Tabla de plantas +Back=Atrás Please select a floor:=Por favor, seleccione una planta: Please use elevator=Por favor, use el ascensor ERROR=ERROR @@ -138,7 +158,6 @@ Elevator Digilines Input/Output=Módulo de entrada/salida de Digilines para el a Channel=Canal Elevator Digilines Multi-Car Input/Output=Módulo de entrada/salida de Digilines para múltiples ascensores You need either the 'protection_bypass' or 'server' privilege to use this.=Necesitas el privilegio 'protection_bypass' o 'server' para poder usar esto. -Save=Guardar Elevator Dispatcher=Despachador de ascensor Dispatcher (door open - you hacker you!)=Despachador de ascensor (con puerta abierta) Dispatcher (top section - you hacker you!)=Despachador de ascensor (mitad superior) @@ -170,45 +189,37 @@ GROUP DISPLAY=ESTADO DEL GRUPO Menu=Menú MAIN MENU=MENÚ PRINCIPAL Edit Connections=Editar conexiones -Press Next to begin.=Haz clic en «siguiente» para comenzar. -License Info=Información de la licencia -Next >=Siguiente > -< Back=< Atrás -Done=Listo -EDIT FLOOR TABLE=EDICIÓN DE LA TABLA DE PLANTAS -@1 - Height: @2 - PI: @3=@1 - Altura: @2 - Nombre: @3 -New Floor=Planta nueva -Edit Floor=Editar planta -Remove Floor=Eliminar planta -The Floor Height is the distance (in meters/nodes) from the floor level of this floor to the floor level of the next floor.=La altura de la planta es la distancia (en metros/nodos) desde el nivel del suelo de esta planta hasta el nivel del suelo de la planta siguiente. -(not used at the highest floor)=(No se utiliza en la planta más alta) -The Floor Name is how the floor will be displayed on the position indicators.=El nombre de la planta es la forma en que se mostrará la planta en los indicadores de posición. -Editing Floor @1=Editando la planta @1 -Floor Height=Altura de la planta -Floor Name=Nombre de la planta -Edit Floor Table=Tabla de plantas -Back=Atrás -OK=OK -Move Up=Subir -Move Down=Bajar Glass Hoistway Door (fast, bottom - you hacker you!)=Puerta de ascensor en vidrio (alta velocidad, parte inferior) Glass Hoistway Door (fast, middle - you hacker you!)=Puerta de ascensor en vidrio (alta velocidad, parte media) Glass Hoistway Door (fast, top - you hacker you!)=Puerta de ascensor en vidrio (alta velocidad, parte superior) Glass Hoistway Door (slow, bottom - you hacker you!)=Puerta de ascensor en vidrio (baja velocidad, parte inferior) Glass Hoistway Door (slow, middle - you hacker you!)=Puerta de ascensor en vidrio (baja velocidad, parte media) Glass Hoistway Door (slow, top - you hacker you!)=Puerta de ascensor en vidrio (baja velocidad, parte superior) +Glass Elevator Hoistway Door=Puerta de ascensor en vidrio Steel Hoistway Door (fast, bottom - you hacker you!)=Puerta de ascensor en acero (alta velocidad, parte inferior) Steel Hoistway Door (fast, middle - you hacker you!)=Puerta de ascensor en acero (alta velocidad, parte media) Steel Hoistway Door (fast, top - you hacker you!)=Puerta de ascensor en acero (alta velocidad, parte superior) Steel Hoistway Door (slow, bottom - you hacker you!)=Puerta de ascensor en acero (baja velocidad, parte inferior) Steel Hoistway Door (slow, middle - you hacker you!)=Puerta de ascensor en acero (baja velocidad, parte media) Steel Hoistway Door (slow, top - you hacker you!)=Puerta de ascensor en acero (baja velocidad, parte superior) -Hoistway Door Open-State Placeholder (you hacker you!)=Marcador de posición para puertas de ascensor abiertas -Glass Elevator Hoistway Door=Puerta de ascensor en vidrio +Steel Elevator Hoistway Door=Puerta de ascensor en acero Can't place door here - position @1m to the right and @2m up is blocked!=No se puede colocar la puerta aquí - hay una posición bloqueada @1 m a la derecha y @2 m hacia arriba Can't place door here - position @1m to the right and @2m up is protected!=No se puede colocar la puerta aquí - hay una posición protegida @1 m a la derecha y @2 m hacia arriba -Steel Elevator Hoistway Door=Puerta de ascensor en acero -Hoistway Door Sill, Single Track (you hacker you!)=Alféizar de puerta para ascensor (pista única) +Glass Hoistway Door (left, bottom - you hacker you!)=Puerta de ascensor en vidrio (lado izquierdo, parte inferior) +Glass Hoistway Door (left, middle - you hacker you!)=Puerta de ascensor en vidrio (lado izquierdo, parte media) +Glass Hoistway Door (left, top - you hacker you!)=Puerta de ascensor en vidrio (lado izquierdo, parte superior) +Glass Hoistway Door (right, bottom - you hacker you!)=Puerta de ascensor en vidrio (lado derecho, parte inferior) +Glass Hoistway Door (right, middle - you hacker you!)=Puerta de ascensor en vidrio (lado derecho, parte media) +Glass Hoistway Door (right, top - you hacker you!)=Puerta de ascensor en vidrio (lado derecho, parte superior) +Center-Opening Glass Elevator Hoistway Door=Puerta de ascensor en vidrio de apertura central +Steel Hoistway Door (left, bottom - you hacker you!)=Puerta de ascensor en acero (lado izquierdo, parte inferior) +Steel Hoistway Door (left, middle - you hacker you!)=Puerta de ascensor en acero (lado izquierdo, parte media) +Steel Hoistway Door (left, top - you hacker you!)=Puerta de ascensor en acero (lado izquierdo, parte superior) +Steel Hoistway Door (right, bottom - you hacker you!)=Puerta de ascensor en acero (lado derecho, parte inferior) +Steel Hoistway Door (right, middle - you hacker you!)=Puerta de ascensor en acero (lado derecho, parte media) +Steel Hoistway Door (right, top - you hacker you!)=Puerta de ascensor en acero (lado derecho, parte superior) +Center-Opening Steel Elevator Hoistway Door=Puerta de ascensor en acero de apertura central +Hoistway Door Open-State Placeholder (you hacker you!)=Marcador de posición para puertas de ascensor abiertas Hoistway Door Sill, Double Track (you hacker you!)=Alféizar de puerta para ascensor (pista doble) Elevator Drive=Inversor de frecuencia para ascensor Normal entity-based drive=Inversor de frecuencia normal basado en entidades @@ -284,6 +295,10 @@ Follow Car=Seguimiento de cabina Position: @1m Speed: @2m/s PI: @3=Posición: @1 m Velocidad: @2 m/s Planta: @3 Fault(s) Active=Avería(s) activa(s) No Current Faults=Ninguna avería +OK=OK +Move Up=Subir +Move Down=Bajar +ID: @1=Número: @1 No Connections=Nignuna conexión New Connection=Conexión nueva Edit Connection=Editar conexión @@ -292,7 +307,6 @@ EDIT CONNECTION=EDITAR CONEXIÓN CAR @1=ASC. @1 IN= OK OUT= -- -ID: @1=Número: @1 Inspection (Any)=Modo de inspección (cualquier) Fire Service=Modo de incendio Fire Service Phase 1=Modo de incendio - fase 1 @@ -358,4 +372,3 @@ Elevator Up and Down Lantern=Luz indicadora de llegada del ascensor (subiendo y Elevator Up and Down Lantern (vertical)=Luz vertical indicadora de llegada del ascensor (subiendo y bajando) Elevator Up and Down Position Indicator / Lantern Combo=Luz indicadora de llegada del ascensor (subiendo y bajando) e indicador de su posición Sound=Sonida -Landing Number=Número de planta diff --git a/locale/template.txt b/locale/template.txt index c89724d..bbaa1a9 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -6,6 +6,8 @@ Elevator Call Button (on state - you hacker you!)= Error reading car information!@nPlease remove and replace this node.= Controller/dispatcher is missing!@nPlease remove and replace this node.= Controller/dispatcher found but with incorrect ID!@nPlease remove and replace this node.= +Landing Number= +Save= Car ID= Car (part @1 - you hacker you!)= You don't have access to these switches.= @@ -114,6 +116,24 @@ FIRE SVC= IND SVC= CAR LIGHT= CAR FAN= +Press Next to begin.= +License Info= +Next >= +< Back= +Done= +EDIT FLOOR TABLE= +@1 - Height: @2 - PI: @3= +New Floor= +Edit Floor= +Remove Floor= +The Floor Height is the distance (in meters/nodes) from the floor level of this floor to the floor level of the next floor.= +(not used at the highest floor)= +The Floor Name is how the floor will be displayed on the position indicators.= +Editing Floor @1= +Floor Height= +Floor Name= +Edit Floor Table= +Back= Please select a floor:= Please use elevator= ERROR= @@ -138,7 +158,6 @@ Elevator Digilines Input/Output= Channel= Elevator Digilines Multi-Car Input/Output= You need either the 'protection_bypass' or 'server' privilege to use this.= -Save= Elevator Dispatcher= Dispatcher (door open - you hacker you!)= Dispatcher (top section - you hacker you!)= @@ -170,45 +189,37 @@ GROUP DISPLAY= Menu= MAIN MENU= Edit Connections= -Press Next to begin.= -License Info= -Next >= -< Back= -Done= -EDIT FLOOR TABLE= -@1 - Height: @2 - PI: @3= -New Floor= -Edit Floor= -Remove Floor= -The Floor Height is the distance (in meters/nodes) from the floor level of this floor to the floor level of the next floor.= -(not used at the highest floor)= -The Floor Name is how the floor will be displayed on the position indicators.= -Editing Floor @1= -Floor Height= -Floor Name= -Edit Floor Table= -Back= -OK= -Move Up= -Move Down= Glass Hoistway Door (fast, bottom - you hacker you!)= Glass Hoistway Door (fast, middle - you hacker you!)= Glass Hoistway Door (fast, top - you hacker you!)= Glass Hoistway Door (slow, bottom - you hacker you!)= Glass Hoistway Door (slow, middle - you hacker you!)= Glass Hoistway Door (slow, top - you hacker you!)= +Glass Elevator Hoistway Door= Steel Hoistway Door (fast, bottom - you hacker you!)= Steel Hoistway Door (fast, middle - you hacker you!)= Steel Hoistway Door (fast, top - you hacker you!)= Steel Hoistway Door (slow, bottom - you hacker you!)= Steel Hoistway Door (slow, middle - you hacker you!)= Steel Hoistway Door (slow, top - you hacker you!)= -Hoistway Door Open-State Placeholder (you hacker you!)= -Glass Elevator Hoistway Door= +Steel Elevator Hoistway Door= Can't place door here - position @1m to the right and @2m up is blocked!= Can't place door here - position @1m to the right and @2m up is protected!= -Steel Elevator Hoistway Door= -Hoistway Door Sill, Single Track (you hacker you!)= +Glass Hoistway Door (left, bottom - you hacker you!)= +Glass Hoistway Door (left, middle - you hacker you!)= +Glass Hoistway Door (left, top - you hacker you!)= +Glass Hoistway Door (right, bottom - you hacker you!)= +Glass Hoistway Door (right, middle - you hacker you!)= +Glass Hoistway Door (right, top - you hacker you!)= +Center-Opening Glass Elevator Hoistway Door= +Steel Hoistway Door (left, bottom - you hacker you!)= +Steel Hoistway Door (left, middle - you hacker you!)= +Steel Hoistway Door (left, top - you hacker you!)= +Steel Hoistway Door (right, bottom - you hacker you!)= +Steel Hoistway Door (right, middle - you hacker you!)= +Steel Hoistway Door (right, top - you hacker you!)= +Center-Opening Steel Elevator Hoistway Door= +Hoistway Door Open-State Placeholder (you hacker you!)= Hoistway Door Sill, Double Track (you hacker you!)= Elevator Drive= Normal entity-based drive= @@ -284,6 +295,10 @@ Follow Car= Position: @1m Speed: @2m/s PI: @3= Fault(s) Active= No Current Faults= +OK= +Move Up= +Move Down= +ID: @1= No Connections= New Connection= Edit Connection= @@ -292,7 +307,6 @@ EDIT CONNECTION= CAR @1= IN= OUT= -ID: @1= Inspection (Any)= Fire Service= Fire Service Phase 1= @@ -358,4 +372,3 @@ Elevator Up and Down Lantern= Elevator Up and Down Lantern (vertical)= Elevator Up and Down Position Indicator / Lantern Combo= Sound= -Landing Number= diff --git a/textures/celevator_door_centerglass_inventory.png b/textures/celevator_door_centerglass_inventory.png new file mode 100644 index 0000000..adc0741 Binary files /dev/null and b/textures/celevator_door_centerglass_inventory.png differ diff --git a/textures/celevator_door_centermetal_inventory.png b/textures/celevator_door_centermetal_inventory.png new file mode 100644 index 0000000..d60464e Binary files /dev/null and b/textures/celevator_door_centermetal_inventory.png differ diff --git a/textures/celevator_door_glass_inventory.png b/textures/celevator_door_glass_inventory.png index 2538465..41450a2 100644 Binary files a/textures/celevator_door_glass_inventory.png and b/textures/celevator_door_glass_inventory.png differ diff --git a/textures/celevator_door_metal_inventory.png b/textures/celevator_door_metal_inventory.png index d5f858a..1706658 100644 Binary files a/textures/celevator_door_metal_inventory.png and b/textures/celevator_door_metal_inventory.png differ diff --git a/textures/celevator_door_sill.png b/textures/celevator_door_sill.png new file mode 100644 index 0000000..651cf50 Binary files /dev/null and b/textures/celevator_door_sill.png differ diff --git a/textures/celevator_door_sill_double.png b/textures/celevator_door_sill_double.png deleted file mode 100644 index ca80c97..0000000 Binary files a/textures/celevator_door_sill_double.png and /dev/null differ diff --git a/textures/celevator_door_sill_single.png b/textures/celevator_door_sill_single.png deleted file mode 100644 index 7f3d611..0000000 Binary files a/textures/celevator_door_sill_single.png and /dev/null differ -- cgit v1.2.3