diff --git a/api.lua b/api.lua index e94f5fc..1d1aa7e 100644 --- a/api.lua +++ b/api.lua @@ -1,5 +1,5 @@ -- REAL ELEVATORS API --- ============================================================================== +-- ============================================================================ elevators.trigger_states = { @@ -66,6 +66,12 @@ elevators.set_doors = function(pos, dir, z_shift, x_shift) return left_door, right_door end +elevators.set_cabin = function(pos, dir) + local cabin = minetest.add_entity(pos, "real_elevators:elevator_cabin_activated") + cabin:set_rotation({x=0, y=vector.dir_to_rotation(dir).y, z=0}) + + return cabin +end -- Rotates door object around Y axis by angle enclosed between '{x=0, y=0, z=1}' and 'dir' vectors. Those vectors must be mutually-perpendicular! Except mesh, it rotates also its collision & selection boxes. -- Params: @@ -134,7 +140,7 @@ elevators.move_doors = function(net_name, action) if is_doors == 1 then minetest.remove_node(doors_pos) 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) + local outer_left_door, outer_right_door = elevators.set_doors(doors_pos, cabin_dir, 0.45, x_shift) net.outer_doors = {left = outer_left_door, right = outer_right_door} local outer_ldoor_entity = net.outer_doors.left:get_luaentity() @@ -221,9 +227,6 @@ 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 @@ -235,15 +238,9 @@ 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 @@ -290,8 +287,7 @@ elevators.activate = function(net_name, target_pos) local formspec = meta:get_string("formspec") minetest.remove_node(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}) + local cabin_obj = elevators.set_cabin(pos, dir) local self = cabin_obj:get_luaentity() self.elevator_net_name = net_name @@ -318,8 +314,16 @@ 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 - minetest.debug("self:" .. dump(obj:get_luaentity())) - if obj ~= cabin_obj and obj:get_luaentity().name ~= "real_elevators:elevator_door_moving" then + local allow_attach = false + if obj:is_player() then + allow_attach = true + else + local self = obj:get_luaentity() + if self.name ~= "real_elevators:elevator_cabin_activated" and self.name ~= "real_elevators:elevator_door_moving" then + allow_attach = true + end + end + if allow_attach 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 @@ -362,7 +366,9 @@ elevators.deactivate = function(net_name) 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 + minetest.debug("net.cabin.queue(1): " .. dump(net.cabin.queue)) table.remove(net.cabin.queue, 1) + minetest.debug("net.cabin.queue(2): " .. dump(net.cabin.queue)) 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) @@ -460,26 +466,30 @@ elevators.check_for_rope = function(pos, playername) for n = 1, elevators.settings.MAX_ROPE_LENGTH do local node = minetest.get_node(rope_pos) - + minetest.debug("check_for_rope() node.name: " .. node.name) if node.name == "real_elevators:elevator_winch" then 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!") end + --minetest.chat_send_player(playername, "The rope is intercepted!") + return false, 1, rope_pos end rope_pos = {x=rope_pos.x, y=rope_pos.y+1, z=rope_pos.z} end + if playername then + minetest.chat_send_player(playername, "The rope is too long!") + end --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() @@ -528,7 +538,7 @@ elevators.get_floor_list_formspec = function(elevator_net_name) return end - minetest.debug("elevators.elevators_nets[elevator_net_name].floors:" .. dump(elevators.elevators_nets[elevator_net_name].floors)) + local btns_space = 0.25 local y_space = 0.25 local button_size = 1 for i, floor in ipairs(elevators.elevators_nets[elevator_net_name].floors) do @@ -536,19 +546,18 @@ elevators.get_floor_list_formspec = function(elevator_net_name) form[#form+1] = "button[0.5," .. tostring(y_space) .. ";" .. button_size .. "," .. button_size .. ";" .. but_name .. ";" .. floor.number .. "]" form[#form+1] = "tooltip[" .. but_name .. ";Floor #" .. floor.number .. ": \"" .. floor.description .. "\".\nLocates at: " .. minetest.pos_to_string(floor.position) .. "]" - y_space = y_space + (button_size + y_space) + y_space = y_space + (button_size + btns_space) end form[#form+1] = "scroll_container_end[]" form[#form+1] = "image_button[1.5,7.5;1,1;real_elevators_floor_plus.png;add_floor;]tooltip[add_floor;Add still floors]" - minetest.debug("form:" .. dump(form)) return table.concat(form, "") end -- Callbacks --- ================================================================== +-- ============================================================================ -- Global step. Passed in 'minetest.register_globalstep()'. elevators.global_step = function(dtime) @@ -603,13 +612,16 @@ elevators.global_step = function(dtime) if not is_rope then if state == 1 then minetest.debug("Cabin is falling down!") + local dir -- 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 + dir = data.cabin.elevator_object:get_luaentity().dir data.cabin.elevator_object:remove() else - minetest.remove_node(data.floors[data.cabin.cur_elevator_position_index].position or data.cabin.position) + dir = minetest.facedir_to_dir(minetest.get_node(pos).param2) + minetest.remove_node(pos) end - local falling_cabin = minetest.add_entity(pos, "real_elevators:elevator_cabin_activated") + local falling_cabin = elevators.set_cabin(pos, dir) falling_cabin:set_acceleration({x=0, y=-elevators.settings.GRAVITY, z=0}) falling_cabin:get_luaentity().is_falling = true elseif state == 2 then diff --git a/mod.conf b/mod.conf index 9fa1484..c98dc77 100644 --- a/mod.conf +++ b/mod.conf @@ -1,4 +1,4 @@ name = real_elevators description = The diverse elevators with a real behaviour. -depends = default +depends = default, farming, stairs, basic_materials author = Andrey01 diff --git a/registration.lua b/registration.lua index 8af50b7..bbf1da4 100644 --- a/registration.lua +++ b/registration.lua @@ -23,7 +23,14 @@ local elevator_parts_defs = { {-0.4, -0.5, -0.5, 0.5, 0.5, 0.5} }, groups = {shaft=1}, - sounds = default.node_sound_stone_defaults() + sounds = default.node_sound_stone_defaults(), + craft = { + recipe = { + {"", "default:clay_lump", "basic_materials:steel_bar"}, + {"", "default:clay_lump", "basic_materials:steel_bar"}, + {"", "default:clay_lump", "basic_materials:steel_bar"} + } + } }, ["elevator_shaft_rightside"] = { description = elevators.S("Elevator Shaft (Right) Side Block"), @@ -33,14 +40,28 @@ local elevator_parts_defs = { {0.4, -0.5, 0.0, 0.5, 0.5, 0.5} }, groups = {shaft=1}, - sounds = default.node_sound_stone_defaults() + sounds = default.node_sound_stone_defaults(), + craft = { + recipe = { + {"basic_materials:steel_bar", "default:clay_lump", ""}, + {"basic_materials:steel_bar", "default:clay_lump", ""}, + {"basic_materials:steel_bar", "default:clay_lump", ""} + } + } }, ["elevator_shaft_back"] = { 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() + sounds = default.node_sound_stone_defaults(), + craft = { + recipe = { + {"basic_materials:steel_bar", "default:clay_lump", "basic_materials:steel_bar"}, + {"basic_materials:steel_bar", "default:clay_lump", "basic_materials:steel_bar"}, + {"basic_materials:steel_bar", "default:clay_lump", "basic_materials:steel_bar"} + } + } }, ["elevator_outer_wall_leftslot"] = { description = elevators.S("Elevator Outer Wall With Left Slot"), @@ -49,7 +70,14 @@ local elevator_parts_defs = { {-0.5, -0.5, 0.4, 0.0, 0.5, 0.5}, {-0.5, -0.5, 0.0, 0.5, 0.5, 0.4} }, - sounds = default.node_sound_stone_defaults() + sounds = default.node_sound_stone_defaults(), + craft = { + recipe = { + {"", "", "default:clay_lump"}, + {"", "", "default:clay_lump"}, + {"", "", "default:clay_lump"} + } + } }, ["elevator_outer_wall_rightslot"] = { description = elevators.S("Elevator Outer Wall With Right Slot"), @@ -58,26 +86,48 @@ local elevator_parts_defs = { {0.0, -0.5, 0.4, 0.5, 0.5, 0.5}, {-0.5, -0.5, 0.0, 0.5, 0.5, 0.4} }, - sounds = default.node_sound_stone_defaults() + sounds = default.node_sound_stone_defaults(), + craft = { + recipe = { + {"default:clay_lump", "", ""}, + {"default:clay_lump", "", ""}, + {"default:clay_lump", "", ""} + } + } }, ["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() + sounds = default.node_sound_stone_defaults(), + craft = { + recipe = { + {"", "default:clay_lump", ""}, + {"", "default:clay_lump", ""}, + {"", "default:clay_lump", ""} + } + } }, ["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() + sounds = default.node_sound_stone_defaults(), + craft = { + recipe = {"real_elevators:elevator_shaft_back"}, + replacements = {{"real_elevators:elevator_shaft_back", "real_elevators:elevator_outer_wall"}} + } }, ["elevator_shaft_corner"] = { 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() + sounds = default.node_sound_stone_defaults(), + craft = { + type = "shapeless", + recipe = {"default:clay"} + } }, ["elevator_outer_wall_with_trigger_off"] = { description = elevators.S("Elevator Outer Wall With Trigger (off)"), @@ -92,7 +142,14 @@ local elevator_parts_defs = { sounds = default.node_sound_stone_defaults(), on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) elevators.call(pos) - end + end, + craft = { + recipe = { + {"default:clay_lump", "default:clay_lump", "default:clay_lump"}, + {"default:clay_lump", "basic_materials:ic", "default:clay_lump"}, + {"default:clay_lump", "basic_materials:plastic_sheet", "default:clay_lump"} + } + } }, ["elevator_outer_wall_with_trigger_on"] = { description = elevators.S("Elevator Outer Wall With Trigger (on)"), @@ -114,7 +171,11 @@ local elevator_parts_defs = { tiles = {4}, collision_box = {-0.5, -0.5, 0.4, 0.5, 1.5, 0.5}, groups = {doors=1, state=0}, - sounds = default.node_sound_metal_defaults() + sounds = default.node_sound_metal_defaults(), + craft = { + type = "shapeless", + recipe = {"stairs:slab_steelblock", "stairs:slab_steelblock", "stairs:slab_steelblock", "stairs:slab_steelblock"} + } }, ["elevator_doors_opened"] = { visual_scale = 0.5, @@ -133,7 +194,14 @@ local elevator_parts_defs = { 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() + sounds = default.node_sound_metal_defaults(), + craft = { + recipe = { + {"basic_materials:gear_steel", "basic_materials:steel_wire", "basic_materials:motor"}, + {"basic_materials:steel_bar", "basic_materials:steel_bar", "basic_materials:steel_bar"}, + {"basic_materials:steel_bar", "real_elevators:elevator_rope", "basic_materials:steel_bar"} + } + } }, ["elevator_rope"] = { description = elevators.S("Elevator Rope"), @@ -142,7 +210,14 @@ local elevator_parts_defs = { collision_box = {-0.2, -0.5, -0.2, 0.2, 0.5, 0.2}, walkable = false, climbable = true, - sounds = default.node_sound_leaves_defaults() + sounds = default.node_sound_leaves_defaults(), + craft = { + recipe = { + {"", "farming:cotton", ""}, + {"", "basic_materials:steel_strip", ""}, + {"", "farming:cotton", ""} + } + } } } @@ -208,6 +283,14 @@ for name, def in pairs(elevator_parts_defs) do full_def.on_timer = def.on_timer minetest.register_node("real_elevators:" .. name, full_def) + + if def.craft then + local craft_def = def.craft + craft_def.type = craft_def.type or craft_def.replacements and "shapeless" + craft_def.output = "real_elevators:" .. name + + minetest.register_craft(craft_def) + end end elevators.elevator_doors = minetest.deserialize(elevators.mod_storage:get_string("elevator_doors")) or {} @@ -381,7 +464,8 @@ minetest.register_node("real_elevators:elevator_cabin", { local net_name = minetest.get_meta(pos):get_string("elevator_net_name") - if net_name ~= "" and elevators.elevators_nets[net_name].cabin.state == "pending" then + local state = elevators.elevators_nets[net_name].cabin.state + if net_name ~= "" and (state == "pending" or state == "idle") then for i, floor in ipairs(elevators.elevators_nets[net_name].floors) do if fields["floor_" .. tostring(i)] then table.insert(elevators.elevators_nets[net_name].cabin.queue, 1, floor.position) @@ -393,6 +477,15 @@ minetest.register_node("real_elevators:elevator_cabin", { end }) +minetest.register_craft({ + output = "real_elevators:elevator_cabin", + recipe = { + {"basic_materials:steel_bar", "default:steel_ingot", "basic_materials:steel_bar"}, + {"default:steel_ingot", "basic_materials:ic", "default:steel_ingot"}, + {"basic_materials:steel_bar", "real_elevators:elevator_doors_closed", "basic_materials:steel_bar"} + } +}) + minetest.register_entity("real_elevators:elevator_door_moving", { visual_size = {x=1, y=1, z=1}, visual = "mesh", @@ -400,7 +493,7 @@ minetest.register_entity("real_elevators:elevator_door_moving", { physical = true, collide_with_objects = true, collisionbox = {-0.25, -0.5, -0.05, 0.25, 1.5, 0.05}, - pointable = true, + pointable = false, textures = {tex_names_used[4]}, on_activate = function(self, staticdata, dtime_s) if staticdata ~= "" then @@ -518,6 +611,9 @@ minetest.register_entity("real_elevators:elevator_cabin_activated", { end, on_deactivate = function(self) minetest.debug("self.elevator_net_name: " .. (self.elevator_net_name ~= nil and self.elevator_net_name or "nil")) + if not self.elevator_net_name then + return + end local net = elevators.elevators_nets[self.elevator_net_name] net.cabin.inner_doors.left:remove() diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000..95b7161 Binary files /dev/null and b/screenshot.png differ