summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--car_fullglass.lua4
-rw-r--r--car_glassback.lua4
-rw-r--r--car_metal.lua4
-rw-r--r--car_metalglass.lua4
-rw-r--r--car_standard.lua4
-rw-r--r--crafts.lua18
-rw-r--r--door_2speedglass.lua641
-rw-r--r--door_2speedmetal.lua635
-rw-r--r--door_centerglass.lua641
-rw-r--r--door_centermetal.lua636
-rw-r--r--doors.lua932
-rw-r--r--init.lua4
-rw-r--r--locale/celevator.es.tr69
-rw-r--r--locale/template.txt69
-rw-r--r--textures/celevator_door_centerglass_inventory.pngbin0 -> 285 bytes
-rw-r--r--textures/celevator_door_centermetal_inventory.pngbin0 -> 653 bytes
-rw-r--r--textures/celevator_door_glass_inventory.pngbin244 -> 281 bytes
-rw-r--r--textures/celevator_door_metal_inventory.pngbin571 -> 654 bytes
-rw-r--r--textures/celevator_door_sill.pngbin0 -> 229 bytes
-rw-r--r--textures/celevator_door_sill_double.pngbin4542 -> 0 bytes
-rw-r--r--textures/celevator_door_sill_single.pngbin4544 -> 0 bytes
21 files changed, 2710 insertions, 955 deletions
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
@@ -313,6 +313,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 = {
{m.steel_strip,m.lightstone_green},
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
--- /dev/null
+++ b/textures/celevator_door_centerglass_inventory.png
Binary files differ
diff --git a/textures/celevator_door_centermetal_inventory.png b/textures/celevator_door_centermetal_inventory.png
new file mode 100644
index 0000000..d60464e
--- /dev/null
+++ b/textures/celevator_door_centermetal_inventory.png
Binary files differ
diff --git a/textures/celevator_door_glass_inventory.png b/textures/celevator_door_glass_inventory.png
index 2538465..41450a2 100644
--- a/textures/celevator_door_glass_inventory.png
+++ b/textures/celevator_door_glass_inventory.png
Binary files differ
diff --git a/textures/celevator_door_metal_inventory.png b/textures/celevator_door_metal_inventory.png
index d5f858a..1706658 100644
--- a/textures/celevator_door_metal_inventory.png
+++ b/textures/celevator_door_metal_inventory.png
Binary files differ
diff --git a/textures/celevator_door_sill.png b/textures/celevator_door_sill.png
new file mode 100644
index 0000000..651cf50
--- /dev/null
+++ b/textures/celevator_door_sill.png
Binary files differ
diff --git a/textures/celevator_door_sill_double.png b/textures/celevator_door_sill_double.png
deleted file mode 100644
index ca80c97..0000000
--- a/textures/celevator_door_sill_double.png
+++ /dev/null
Binary files differ
diff --git a/textures/celevator_door_sill_single.png b/textures/celevator_door_sill_single.png
deleted file mode 100644
index 7f3d611..0000000
--- a/textures/celevator_door_sill_single.png
+++ /dev/null
Binary files differ