Fixed bug with closing doors and some more bugs

master
Andrey2470T 2021-08-30 18:11:40 +03:00
parent 518f62df5c
commit 6d40d5e735
8 changed files with 280 additions and 192 deletions

323
api.lua
View File

@ -1,3 +1,7 @@
-- REAL ELEVATORS API
-- ==============================================================================
elevators.trigger_states = {
off = "elevator_outer_wall_with_trigger_off",
on = "elevator_outer_wall_with_trigger_on"
@ -44,10 +48,7 @@ elevators.elevators_nets = minetest.deserialize(elevators.mod_storage:get_string
-- *pos* is position of a node where doors will be placed.
-- *z_shift* is shift number towards to the facedir of *pos*.
-- *x_shift* is shift relatively *pos*.
elevators.set_doors = function(pos, z_shift, x_shift)
local node = minetest.get_node(pos)
local dir = minetest.facedir_to_dir(node.param2)
elevators.set_doors = function(pos, dir, z_shift, x_shift)
-- Set left door entity
local left_door_movedir = vector.rotate_around_axis(dir, {x=0, y=1, z=0}, math.pi/2)
local left_door_shift = vector.add(vector.multiply(left_door_movedir, x_shift), vector.multiply(dir, z_shift))
@ -122,27 +123,28 @@ elevators.move_doors = function(net_name, action)
local left_door_entity = net.cabin.inner_doors.left:get_luaentity()
left_door_entity.end_pos = vector.add(net.cabin.inner_doors.left:get_pos(), vector.multiply(left_dir, 0.5))
left_door_entity.vel = vector.multiply(left_dir, 0.25)
left_door_entity.vel = vector.new(left_dir) * elevators.settings.DOORS_VELOCITY
net.cabin.inner_doors.left:set_velocity(left_door_entity.vel)
local right_door_entity = net.cabin.inner_doors.right:get_luaentity()
right_door_entity.end_pos = vector.add(net.cabin.inner_doors.right:get_pos(), vector.multiply(right_dir, 0.5))
right_door_entity.vel = vector.multiply(right_dir, 0.25)
right_door_entity.vel = vector.new(right_dir) * elevators.settings.DOORS_VELOCITY
net.cabin.inner_doors.right:set_velocity(right_door_entity.vel)
if is_doors == 1 then
minetest.remove_node(doors_pos)
local outer_left_door, outer_right_door = elevators.set_doors(doors_pos, 0.5, 0.25)
net.outer_doors = {left = outer_left_door, right = outer_right_door}
local x_shift = action == "close" and 0.75 or 0.25
local outer_left_door, outer_right_door = elevators.set_doors(doors_pos, cabin_dir, 0.5, x_shift)
net.outer_doors = {left = outer_left_door, right = outer_right_door}
local outer_ldoor_entity = net.outer_doors.left:get_luaentity()
outer_ldoor_entity.end_pos = vector.add(net.outer_doors.left:get_pos(), vector.multiply(left_dir, 0.5))
outer_ldoor_entity.vel = vector.multiply(left_dir, 0.25)
outer_ldoor_entity.vel = left_door_entity.vel
net.outer_doors.left:set_velocity(outer_ldoor_entity.vel)
local outer_rdoor_entity = net.outer_doors.right:get_luaentity()
outer_rdoor_entity.end_pos = vector.add(net.outer_doors.right:get_pos(), vector.multiply(right_dir, 0.5))
outer_rdoor_entity.vel = vector.multiply(right_dir, 0.25)
outer_rdoor_entity.vel = right_door_entity.vel
net.outer_doors.right:set_velocity(outer_rdoor_entity.vel)
end
@ -216,13 +218,47 @@ elevators.get_net_name_and_floor_index_from_floor_pos = function(pos)
return
end
elevators.get_net_name_from_cabin_pos = function(pos)
for name, data in pairs(elevators.elevators_nets) do
local cabin_pos = elevators.get_cabin_pos_from_net_name(name)
minetest.debug("pos: " .. dump(pos))
minetest.debug("floors: " .. dump(data.floors))
minetest.debug("cabin_pos: " .. dump(cabin_pos))
if cabin_pos and vector.equals(pos, cabin_pos) then
return name
end
end
return
end
elevators.get_cabin_pos_from_net_name = function(net_name)
local net = elevators.elevators_nets[net_name]
minetest.debug("net.cabin.cur_elevator_position_index: " .. tostring(net.cabin.cur_elevator_position_index))
minetest.debug("type(net.cabin.cur_elevator_position_index): " .. type(net.cabin.cur_elevator_position_index))
minetest.debug("net.floors[net.cabin.cur_elevator_position_index].position: " .. (net.cabin.cur_elevator_position_index and dump(net.floors[net.cabin.cur_elevator_position_index].position) or "nil"))
minetest.debug("net.cabin.position: " .. (dump(net.cabin.position) or "nil"))
minetest.debug("net.cabin.elevator_object:get_pos(): " .. (net.cabin.elevator_object and dump(net.cabin.elevator_object:get_pos()) or "nil"))
local pos
if net.cabin.cur_elevator_position_index then
pos = net.floors[net.cabin.cur_elevator_position_index].position
minetest.debug("pos: " .. dump(pos))
elseif net.cabin.elevator_object then
pos = net.cabin.elevator_object:get_pos()
else
pos = net.cabin.position
end
return pos
end
-- Converts the elevator cabin from node state to entity doing it 'active' and makes to move smoothly to the destination floor position.
-- Params:
-- *net_name* is name of net.
-- *target_pos* is target position of arrival.
elevators.activate = function(net_name, target_pos)
local net = elevators.elevators_nets[net_name]
minetest.debug("1: net.cabin.inner_doors.left pos:" .. dump(net.cabin.inner_doors.left:get_pos()))
local net = table.copy(elevators.elevators_nets[net_name])
if not net then
return false
@ -256,18 +292,18 @@ elevators.activate = function(net_name, target_pos)
local cabin_obj = minetest.add_entity(pos, "real_elevators:elevator_cabin_activated")
cabin_obj:set_rotation({x=0, y=vector.dir_to_rotation(dir).y, z=0})
--elevators.elevators_nets[net_name] = net
local self = cabin_obj:get_luaentity()
self.elevator_net_name = net_name
local pos = cabin_obj:get_pos()
local left_door, right_door = elevators.set_doors(pos, -0.45, 0.25)
net.cabin.inner_doors.left:set_attach(cabin_obj, "", vector.subtract(net.cabin.inner_doors.left:get_pos(), pos))
net.cabin.inner_doors.right:set_attach(cabin_obj, "", vector.subtract(net.cabin.inner_doors.right:get_pos(), pos))
local left_door, right_door = elevators.set_doors(pos, dir, -0.45, 0.25)
left_door:set_attach(cabin_obj, "")
left_door:set_pos(vector.subtract(left_door:get_pos(), pos))
right_door:set_attach(cabin_obj, "")
right_door:set_pos(vector.subtract(right_door:get_pos(), pos))
net.cabin.inner_doors.left = left_door
net.cabin.inner_doors.right = right_door
minetest.debug("2: net.cabin.inner_doors.left pos:" .. dump(net.cabin.inner_doors.left:get_pos()))
net.cabin.position = nil
net.cabin.cur_elevator_position_index = nil
@ -282,11 +318,15 @@ elevators.activate = function(net_name, target_pos)
local objs = minetest.get_objects_in_area(vector.add(pos, vector.new(-0.5, -0.5, -0.5)), vector.add(pos, vector.new(0.5, 1.5, 0.5)))
for i, obj in ipairs(objs) do
obj:set_attach(cabin_obj, "", vector.subtract(obj:get_pos(), pos))
net.cabin.attached_objs[#net.cabin.attached_objs+1] = obj
minetest.debug("self:" .. dump(obj:get_luaentity()))
if obj ~= cabin_obj and obj:get_luaentity().name ~= "real_elevators:elevator_door_moving" then
obj:set_attach(cabin_obj, "")
obj:set_pos(vector.subtract(obj:get_pos(), pos))
net.cabin.attached_objs[#net.cabin.attached_objs+1] = obj
end
end
cabin_obj:set_velocity(vector.normalize(vector.subtract(self.end_pos, pos)))
cabin_obj:set_velocity(vector.direction(pos, self.end_pos) * elevators.settings.CABIN_VELOCITY)
elevators.elevators_nets[net_name] = net
return true
end
@ -294,7 +334,7 @@ end
-- Params:
-- *net_name* is name of net.
elevators.deactivate = function(net_name)
local net = elevators.elevators_nets[net_name]
local net = table.copy(elevators.elevators_nets[net_name])
if not net then
return false
@ -308,12 +348,8 @@ elevators.deactivate = function(net_name)
local dir = net.cabin.elevator_object:get_luaentity().dir
local net_name = net.cabin.elevator_object:get_luaentity().elevator_net_name
for i, obj in ipairs(net.cabin.attached_objs) do
obj:set_detach()
end
net.cabin.attached_objs = nil
net.cabin.elevator_object:remove()
net.cabin.elevator_object = nil
elevators.elevators_nets[net_name] = net
local _, floor_i = elevators.get_net_name_and_floor_index_from_floor_pos(pos)
if floor_i then
@ -321,99 +357,30 @@ elevators.deactivate = function(net_name)
else
net.cabin.position = pos
end
net.cabin.elevator_object = nil
minetest.set_node(pos, {name = "real_elevators:elevator_cabin", param2 = minetest.dir_to_facedir(dir)})
local left_door, right_door = elevators.set_doors(pos, -0.45, 0.25)
local left_door, right_door = elevators.set_doors(pos, dir, -0.45, 0.25)
net.cabin.inner_doors.left = left_door
net.cabin.inner_doors.right = right_door
table.remove(net.cabin.queue, 1)
--elevators.elevators_nets[net_name] = net
local trigger_pos = vector.add(pos, vector.add(vector.add(vector.multiply(dir, -1), vector.new(0, 1, 0)), vector.rotate_around_axis(dir, vector.new(0, 1, 0), math.pi/2)))
local trigger = minetest.get_node(trigger_pos)
local is_trigger = minetest.get_item_group(trigger.name, "trigger")
if is_trigger then
minetest.debug("Sets doors node")
minetest.set_node(trigger_pos, {name = "real_elevators:" .. elevators.trigger_states.off, param2 = trigger.param2})
end
minetest.get_meta(pos):set_string("elevator_net_name", net_name)
if floor_i then
local success = elevators.move_doors(net_name, "open")
if not success then
return false
end
elevators.move_doors(net_name, "open")
end
return true
end
-- Global step. Passed in 'minetest.register_globalstep()'.
elevators.global_step = function(dtime)
for name, data in pairs(elevators.elevators_nets) do
if data.cabin.state == "active" then
local self = data.cabin.elevator_object:get_luaentity()
if self and not self.end_pos and not self.is_falling then
-- The elevator has arrived!
minetest.debug("The elevator has arrived!")
elevators.deactivate(name)
end
elseif data.cabin.state == "opening" or data.cabin.state == "closing" then
local inner_left_door_self = data.cabin.inner_doors.left:get_luaentity()
local inner_right_door_self = data.cabin.inner_doors.right:get_luaentity()
local outer_left_door_self = data.outer_doors.left:get_luaentity()
local outer_right_door_self = data.outer_doors.right:get_luaentity()
if (inner_left_door_self and not inner_left_door_self.end_pos) and
(inner_right_door_self and not inner_right_door_self.end_pos) and
(outer_left_door_self and not outer_left_door_self.end_pos) and
(outer_right_door_self and not outer_right_door_self.end_pos) then
local pos = data.floors[data.cabin.cur_elevator_position_index].position
local doors_pos = vector.add(pos, vector.multiply(minetest.facedir_to_dir(minetest.get_node(pos).param2), -1))
if data.cabin.state == "opening" then
data.cabin.state = "pending"
minetest.set_node(doors_pos, {name = "real_elevators:" .. elevators.doors_states.open, param2 = minetest.get_node(pos).param2})
local timer = minetest.get_node_timer(pos)
timer:start(10)
else
data.cabin.state = "idle"
minetest.set_node(doors_pos, {name = "real_elevators:" .. elevators.doors_states.closed, param2 = minetest.get_node(pos).param2})
end
data.outer_doors.left:remove()
data.outer_doors.right:remove()
data.outer_doors = nil
end
elseif data.cabin.state == "idle" then
if #data.cabin.queue > 0 then
elevators.activate(name, data.cabin.queue[1])
end
end
local pos = data.cabin.cur_elevator_position_index and data.floors[data.cabin.cur_elevator_position_index].position or
data.cabin.position or data.cabin.elevator_object and data.cabin.elevator_object:get_pos()
local is_rope, state = elevators.check_for_rope(pos)
if not is_rope then
if state == 1 then
-- The rope is intercepted, it can not move anymore, so remove its data from 'elevators.elevators_nets' and makes to fall down.
if data.cabin.elevator_object then
data.cabin.elevator_object:remove()
else
minetest.remove_node(data.floors[data.cabin.cur_elevator_position_index].position or data.cabin.position)
end
local falling_cabin = minetest.add_entity(pos, "real_elevators:elevator_cabin_activated")
falling_cabin:set_acceleration({x=0, y=-elevators.settings.GRAVITY, z=0})
falling_cabin:get_luaentity().is_falling = true
elseif state == 2 then
if data.cabin.elevator_object then
elevators.deactivate(name)
end
end
end
end
end
elevators.update_cabins_formspecs = function()
for name, data in pairs(elevators.elevators_nets) do
@ -498,20 +465,21 @@ elevators.check_for_rope = function(pos, playername)
return true
elseif node.name ~= "real_elevators:elevator_rope" then
if playername then
minetest.chat_send_player(playername, "The rope is intercepted!")
return false, 1, rope_pos
--minetest.chat_send_player(playername, "The rope is intercepted!")
return false, 1, rope_pos
end
end
rope_pos = {x=rope_pos.x, y=rope_pos.y+1, z=rope_pos.z}
end
minetest.chat_send_player(playername, "The rope is too long!")
--minetest.chat_send_player(playername, "The rope is too long!")
return false, 2
end
-- Formspec
-- ================================================================
-- ==================================================================
-- Returns form of when player is needed to create new elevator net.
elevators.get_enter_elevator_net_name_formspec = function()
@ -577,3 +545,150 @@ elevators.get_floor_list_formspec = function(elevator_net_name)
return table.concat(form, "")
end
-- Callbacks
-- ==================================================================
-- Global step. Passed in 'minetest.register_globalstep()'.
elevators.global_step = function(dtime)
for name, data in pairs(elevators.elevators_nets) do
if data.cabin.state == "active" then
local self = data.cabin.elevator_object:get_luaentity()
if self and not self.end_pos and not self.is_falling then
-- The elevator has arrived!
minetest.debug("The elevator has arrived!")
elevators.deactivate(name)
end
elseif data.cabin.state == "opening" or data.cabin.state == "closing" then
minetest.debug("Doors are opening/closing")
local inner_left_door_self = data.cabin.inner_doors.left:get_luaentity()
local inner_right_door_self = data.cabin.inner_doors.right:get_luaentity()
local outer_left_door_self = data.outer_doors.left:get_luaentity()
local outer_right_door_self = data.outer_doors.right:get_luaentity()
if (inner_left_door_self and not inner_left_door_self.end_pos) and
(inner_right_door_self and not inner_right_door_self.end_pos) and
(outer_left_door_self and not outer_left_door_self.end_pos) and
(outer_right_door_self and not outer_right_door_self.end_pos) then
local pos = data.floors[data.cabin.cur_elevator_position_index].position
minetest.debug("Doors are open/closed")
local doors_pos = vector.add(pos, vector.multiply(minetest.facedir_to_dir(minetest.get_node(pos).param2), -1))
if data.cabin.state == "opening" then
minetest.debug("Pending for objects")
data.cabin.state = "pending"
minetest.set_node(doors_pos, {name = "real_elevators:" .. elevators.doors_states.open, param2 = minetest.get_node(pos).param2})
local timer = minetest.get_node_timer(pos)
timer:start(10)
else
minetest.debug("Setting inactive")
data.cabin.state = "idle"
minetest.set_node(doors_pos, {name = "real_elevators:" .. elevators.doors_states.closed, param2 = minetest.get_node(pos).param2})
end
data.outer_doors.left:remove()
data.outer_doors.right:remove()
data.outer_doors = nil
end
elseif data.cabin.state == "idle" then
if #data.cabin.queue > 0 then
elevators.activate(name, data.cabin.queue[1])
end
end
local pos = elevators.get_cabin_pos_from_net_name(name)
local is_rope, state = elevators.check_for_rope(pos)
if not is_rope then
if state == 1 then
minetest.debug("Cabin is falling down!")
-- The rope is intercepted, it can not move anymore, so remove its data from 'elevators.elevators_nets' and makes to fall down.
if data.cabin.elevator_object then
data.cabin.elevator_object:remove()
else
minetest.remove_node(data.floors[data.cabin.cur_elevator_position_index].position or data.cabin.position)
end
local falling_cabin = minetest.add_entity(pos, "real_elevators:elevator_cabin_activated")
falling_cabin:set_acceleration({x=0, y=-elevators.settings.GRAVITY, z=0})
falling_cabin:get_luaentity().is_falling = true
elseif state == 2 then
minetest.debug("Rope is too long!")
if data.cabin.elevator_object then
elevators.deactivate(name)
end
end
end
end
end
-- Passed to 'minetest.register_on_shutdown()'.
elevators.on_shutdown = function()
for name, data in pairs(elevators.elevators_nets) do
if data.cabin.elevator_object then
data.cabin.elevator_object = data.cabin.elevator_object:get_pos()
end
if data.outer_doors then
local outer_left_door_self = data.outer_doors.left:get_luaentity()
local outer_right_door_self = data.outer_doors.right:get_luaentity()
if outer_left_door_self then
data.outer_doors.left:set_pos(outer_left_door_self.end_pos)
data.outer_doors.left = outer_left_door_self.end_pos
end
if outer_right_door_self then
data.outer_doors.right:set_pos(outer_right_door_self.end_pos)
data.outer_doors.right = outer_right_door_self.end_pos
end
end
minetest.debug("on_shutdown(): 1")
local inner_left_door_self = data.cabin.inner_doors.left:get_luaentity()
local inner_right_door_self = data.cabin.inner_doors.right:get_luaentity()
if inner_left_door_self then
if inner_left_door_self.end_pos then
data.cabin.inner_doors.left:set_pos(inner_left_door_self.end_pos)
data.cabin.inner_doors.left = inner_left_door_self.end_pos
else
data.cabin.inner_doors.left = data.cabin.inner_doors.left:get_pos()
end
end
minetest.debug("on_shutdown(): 2")
if inner_right_door_self then
if inner_right_door_self.end_pos then
data.cabin.inner_doors.right:set_pos(inner_right_door_self.end_pos)
data.cabin.inner_doors.right = inner_right_door_self.end_pos
else
data.cabin.inner_doors.right = data.cabin.inner_doors.right:get_pos()
end
end
minetest.debug("on_shutdown(): 3")
for i, obj in ipairs(data.cabin.attached_objs) do
if obj:get_luaentity() ~= nil then
data.cabin.attached_objs[i] = obj:get_pos()
else
table.remove(data.cabin.attached_objs, i)
end
end
minetest.debug("on_shutdown(): 4")
end
minetest.debug("on_shutdown() elevators.elevators_nets: " .. dump(elevators.elevators_nets))
-- Save all necessary data before shutdown
elevators.mod_storage:set_string("elevators_nets", minetest.serialize(elevators.elevators_nets))
minetest.debug("on_shutdown(): 5")
--elevators.mod_storage:set_string("elevator_doors", minetest.serialize(elevators.elevator_doors))
elevators.mod_storage:set_string("current_marked_pos", minetest.serialize(elevators.current_marked_pos))
end
elevators.on_join = function(player, last_login)
for name, data in pairs(elevators.elevators_nets) do
for i, pos in ipairs(data.cabin.attached_objs) do
if vector.equal(player:get_pos(), pos) then
player:set_attach(data.cabin.elevator_object, "", vector.subtract(player:get_pos(), data.cabin.elevator_object:get_pos()))
end
end
end
end

View File

@ -2,7 +2,9 @@
elevators.settings = {}
elevators.settings.CABIN_VELOCITY = tonumber(minetest.settings:get("cabin_velocity"))
elevators.settings.DOORS_VELOCITY = tonumber(minetest.settings:get("doors_velocity"))
elevators.settings.MAX_ROPE_LENGTH = tonumber(minetest.settings:get("max_rope_length"))
elevators.settings.GRAVITY = tonumber(minetest.settings:get("gravity"))
elevators.settings.CABIN_VELOCITY = tonumber(minetest.settings:get("real_elevators_cabin_velocity")) or 1.0
elevators.settings.DOORS_VELOCITY = tonumber(minetest.settings:get("real_elevators_doors_velocity")) or 0.25
elevators.settings.MAX_ROPE_LENGTH = tonumber(minetest.settings:get("real_elevators_max_rope_length")) or 500
elevators.settings.GRAVITY = tonumber(minetest.settings:get("real_elevators_gravity")) or 9.8
minetest.debug("elevators.settings.MAX_ROPE_LENGTH: " .. elevators.settings.GRAVITY)

View File

@ -1,8 +1,10 @@
elevators = {}
elevators.S = minetest.get_translator("real_elevators")
elevators.mod_storage = minetest.get_mod_storage()
local modpath = minetest.get_modpath("real_elevators")
dofile(modpath .. "/config.lua")
dofile(modpath .. "/api.lua")
dofile(modpath .. "/registration.lua")

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -16,7 +16,7 @@ local tex_names_used = {
local elevator_parts_defs = {
["elevator_shaft_leftside"] = {
description = "Elevator Shaft (Left) Side Block",
description = elevators.S("Elevator Shaft (Left) Side Block"),
tiles = {3, 3, 3, 3, 3, 1},
node_box = {
{-0.5, -0.5, 0.0, -0.4, 0.5, 0.5},
@ -26,7 +26,7 @@ local elevator_parts_defs = {
sounds = default.node_sound_stone_defaults()
},
["elevator_shaft_rightside"] = {
description = "Elevator Shaft (Right) Side Block",
description = elevators.S("Elevator Shaft (Right) Side Block"),
tiles = {3, 3, 3, 3, 3, 1},
node_box = {
{-0.5, -0.5, -0.5, 0.4, 0.5, 0.5},
@ -36,14 +36,14 @@ local elevator_parts_defs = {
sounds = default.node_sound_stone_defaults()
},
["elevator_shaft_back"] = {
description = "Elevator Shaft Back Block",
description = elevators.S("Elevator Shaft Back Block"),
tiles = {2, 2, 2, 2, 2, 1},
collision_box = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
groups = {shaft=1},
sounds = default.node_sound_stone_defaults()
},
["elevator_outer_wall_leftslot"] = {
description = "Elevator Outer Wall With Left Slot",
description = elevators.S("Elevator Outer Wall With Left Slot"),
tiles = {3},
node_box = {
{-0.5, -0.5, 0.4, 0.0, 0.5, 0.5},
@ -52,7 +52,7 @@ local elevator_parts_defs = {
sounds = default.node_sound_stone_defaults()
},
["elevator_outer_wall_rightslot"] = {
description = "Elevator Outer Wall With Right Slot",
description = elevators.S("Elevator Outer Wall With Right Slot"),
tiles = {3},
node_box = {
{0.0, -0.5, 0.4, 0.5, 0.5, 0.5},
@ -61,26 +61,26 @@ local elevator_parts_defs = {
sounds = default.node_sound_stone_defaults()
},
["elevator_outer_wall"] = {
description = "Elevator Outer Wall",
description = elevators.S("Elevator Outer Wall"),
tiles = {3},
node_box = {-0.5, -0.5, 0.0, 0.5, 0.5, 0.5},
sounds = default.node_sound_stone_defaults()
},
["elevator_outer_shaft_wall"] = {
description = "Elevator Outer Shaft Wall",
description = elevators.S("Elevator Outer Shaft Wall"),
tiles = {3, 3, 3, 3, 3, 1},
node_box = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.0},
groups = {shaft=1},
sounds = default.node_sound_stone_defaults()
},
["elevator_shaft_corner"] = {
description = "Elevator Shaft Corner Block",
description = elevators.S("Elevator Shaft Corner Block"),
tiles = {2},
collision_box = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
sounds = default.node_sound_stone_defaults()
},
["elevator_outer_wall_with_trigger_off"] = {
description = "Elevator Outer Wall With Trigger (off)",
description = elevators.S("Elevator Outer Wall With Trigger (off)"),
tiles = {5, 6, 7, 8, 2, 9},
node_box = {
{-0.5, -0.5, 0.0, 0.5, 0.5, 0.4},
@ -95,7 +95,7 @@ local elevator_parts_defs = {
end
},
["elevator_outer_wall_with_trigger_on"] = {
description = "Elevator Outer Wall With Trigger (on)",
description = elevators.S("Elevator Outer Wall With Trigger (on)"),
tiles = {5, 6, 7, 8, 2, 10},
node_box = {
{-0.5, -0.5, 0.0, 0.5, 0.5, 0.4},
@ -109,7 +109,7 @@ local elevator_parts_defs = {
},
["elevator_doors_closed"] = {
visual_scale = 0.5,
description = "Elevator doors (closed)",
description = elevators.S("Elevator doors (closed)"),
mesh = "real_elevators_elevator_doors_closed.b3d",
tiles = {4},
collision_box = {-0.5, -0.5, 0.4, 0.5, 1.5, 0.5},
@ -118,7 +118,7 @@ local elevator_parts_defs = {
},
["elevator_doors_opened"] = {
visual_scale = 0.5,
description = "Elevator doors (opened)",
description = elevators.S("Elevator doors (opened)"),
mesh = "real_elevators_elevator_doors_opened.b3d",
tiles = {4},
collision_box = {
@ -129,17 +129,17 @@ local elevator_parts_defs = {
sounds = default.node_sound_metal_defaults()
},
["elevator_winch"] = {
description = "Elevator Winch",
description = elevators.S("Elevator Winch"),
mesh = "real_elevators_winch.b3d",
tiles = {"real_elevators_winch.png"},
collision_box = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
sounds = default.node_sound_metal_defaults()
},
["elevator_rope"] = {
description = "Elevator Rope",
description = elevators.S("Elevator Rope"),
drawtype = "plantlike",
tiles = {"real_elevators_rope.png"},
selection_box = {-0.2, -0.5, -0.2, 0.2, 0.5, 0.2},
collision_box = {-0.2, -0.5, -0.2, 0.2, 0.5, 0.2},
walkable = false,
climbable = true,
sounds = default.node_sound_leaves_defaults()
@ -160,10 +160,10 @@ for name, def in pairs(elevator_parts_defs) do
full_def.tiles = {}
for i, index in ipairs(def.tiles) do
if type(index) == "table" then
full_def.tiles[i] = index
elseif type(index) == "number" then
if type(index) == "number" then
full_def.tiles[i] = tex_names_used[index]
else
full_def.tiles[i] = index
end
end
@ -174,11 +174,11 @@ for name, def in pairs(elevator_parts_defs) do
fixed = def.node_box
}
elseif def.collision_box then
if type(def.mesh) == "string" and #def.mesh > 0 then
if type(def.mesh) == "string" and def.mesh ~= "" then
full_def.drawtype = "mesh"
full_def.mesh = def.mesh
else
full_def.drawtype = "regular"
full_def.drawtype = def.drawtype
end
full_def.collision_box = {
@ -213,7 +213,7 @@ end
elevators.elevator_doors = minetest.deserialize(elevators.mod_storage:get_string("elevator_doors")) or {}
minetest.register_node("real_elevators:elevator_cabin", {
description = "Elevator cabin",
description = elevators.S("Elevator cabin"),
visual_scale = 0.1,
wield_scale = {x=0.1, y=0.1, z=0.1},
drawtype = "mesh",
@ -247,7 +247,7 @@ minetest.register_node("real_elevators:elevator_cabin", {
groups = {cracky=1.5, cabin=1},
sounds = default.node_sound_metal_defaults(),
on_construct = function(pos)
local net_name = elevators.get_net_name_and_floor_index_from_floor_pos(pos)
local net_name = elevators.get_net_name_from_cabin_pos(pos)
local meta = minetest.get_meta(pos)
--meta:set_string("state", "idle")
@ -282,6 +282,7 @@ minetest.register_node("real_elevators:elevator_cabin", {
local net_name = minetest.get_meta(pos):get_string("elevator_net_name")
if net_name ~= "" then
minetest.debug("Closing doors...")
elevators.move_doors(net_name, "close")
end
end,
@ -308,7 +309,7 @@ minetest.register_node("real_elevators:elevator_cabin", {
}
}
local left_door, right_door = elevators.set_doors(pos, -0.45, 0.25)
local left_door, right_door = elevators.set_doors(pos, minetest.facedir_to_dir(minetest.get_node(pos).param2), -0.45, 0.25)
elevators.elevators_nets[fields.elevator_net_name].cabin.inner_doors.left = left_door
elevators.elevators_nets[fields.elevator_net_name].cabin.inner_doors.right = right_door
@ -469,7 +470,7 @@ minetest.register_entity("real_elevators:elevator_cabin_activated", {
self.end_pos = data[1]
self.dir = data[2]
self.elevator_net_name = data[3]
self.is_falling data[4]
self.is_falling = data[4]
end
for name, data in pairs(elevators.elevators_nets) do
@ -504,35 +505,38 @@ minetest.register_entity("real_elevators:elevator_cabin_activated", {
local top_pos = {x=pos.x, y=pos.y+2, z=pos.z}
local top_node = minetest.get_node(top_pos)
if top_node.name == "real_elevators:elevator_winch" then
if top_node.name == "real_elevators:elevator_winch" and
vector.direction(pos, top_pos) == vector.normalize(self.object:get_velocity()) then
self.object:set_velocity(vector.new())
self.end_pos = nil
return
end
minetest.set_node({x=pos.x, y=pos.y+2, z=pos.z}, {name="real_elevators:elevator_rope"})
if top_node.name ~= "real_elevators:elevator_winch" then
minetest.set_node({x=pos.x, y=pos.y+2, z=pos.z}, {name="real_elevators:elevator_rope"})
end
end,
on_deactivate = function(self)
minetest.debug("self.elevator_net_name: " .. (self.elevator_net_name ~= nil and self.elevator_net_name or "nil"))
local net = elevators.elevators_nets[self.elevator_net_name]
net.cabin.inner_doors.left:remove()
net.cabin.inner_doors.right:remove()
for i, obj in ipairs(net.cabin.attached_objs) do
if obj:get_luaentity() then
obj:set_detach()
end
end
net = nil
end,
--[[on_attach_child = function(self, child)
local child_self = child:get_luaentity()
if child_self.name ~= "real_elevators:elevator_door_moving" then
child:set_properties({visual_size = {x=1, y=1, z=1}})
end
end,]]
get_staticdata = function(self)
return minetest.serialize({self.end_pos, self.dir, self.elevator_net_name, self.is_falling})
end
})
minetest.register_tool("real_elevators:floor_mark_tool", {
description = "Floor Mark Tool (right-click a node to mark that position for adding a new floor for an elevator net)",
description = elevators.S("Floor Mark Tool (right-click a node to mark that position for adding a new floor for an elevator net)"),
inventory_image = "real_elevators_floor_mark_tool.png",
stack_max = 1,
on_place = function(itemstack, placer, pointed_thing)
@ -567,54 +571,6 @@ minetest.register_entity("real_elevators:marked_block_area", {
}
})
minetest.register_on_shutdown(function()
for name, data in pairs(elevators.elevators_nets) do
if data.cabin.elevator_object then
data.cabin.elevator_object = data.cabin.elevator_object:get_pos()
end
if data.outer_doors then
local outer_left_door_self = data.outer_doors.left:get_luaentity()
local outer_right_door_self = data.outer_doors.right:get_luaentity()
if outer_left_door_self then
data.outer_doors.left:set_pos(outer_left_door_self.end_pos)
data.outer_doors.left = outer_left_door_self.end_pos
end
if outer_right_door_self then
data.outer_doors.right:set_pos(outer_right_door_self.end_pos)
data.outer_doors.right = outer_right_door_self.end_pos
end
end
local inner_left_door_self = data.cabin.inner_doors.left:get_luaentity()
local inner_right_door_self = data.cabin.inner_doors.right:get_luaentity()
if inner_left_door_self then
if inner_left_door_self.end_pos then
data.cabin.inner_doors.left:set_pos(inner_left_door_self.end_pos)
data.cabin.inner_doors.left = inner_left_door_self.end_pos
else
data.cabin.inner_doors.left = data.cabin.inner_doors.left:get_pos()
end
end
if inner_right_door_self then
if inner_right_door_self.end_pos then
data.cabin.inner_doors.right:set_pos(inner_right_door_self.end_pos)
data.cabin.inner_doors.right = inner_right_door_self.end_pos
else
data.cabin.inner_doors.right = data.cabin.inner_doors.right:get_pos()
end
end
end
-- Save all necessary data before shutdown
elevators.mod_storage:set_string("elevators_nets", minetest.serialize(elevators.elevators_nets))
--elevators.mod_storage:set_string("elevator_doors", minetest.serialize(elevators.elevator_doors))
elevators.mod_storage:set_string("current_marked_pos", minetest.serialize(elevators.current_marked_pos))
end)
minetest.register_on_shutdown(elevators.on_shutdown)
minetest.register_globalstep(elevators.global_step)
minetest.register_on_joinplayer(elevators.on_join)

13
settingtypes.txt Normal file
View File

@ -0,0 +1,13 @@
# Sets velocity of elevator cabin when moving from one point to other.
real_elevators_cabin_velocity (Cabin velocity) float 1.0 0.0 20.0
# Sets velocity of door objects when cabin state is 'opening'/'closing'.
real_elevators_doors_velocity (Doors velocity) float 0.25 0.0 0.5
# Maximum length of rope on which cabin is hung up.
# It should be not very high (approx not above '1000') to avoid large delay
real_elevators_max_rope_length (Maximum rope length) int 500 0 5000
# Gravity acceleration factor of cabin when its rope is intercepted.
# Should be positive!
real_elevators_gravity (Gravity) float 9.8 0.0 100.0