Added craft recipes, screenshot, fixed more bugs

master
Andrey2470T 2021-08-31 00:37:58 +03:00
parent 6d40d5e735
commit 2b7891ca20
4 changed files with 148 additions and 40 deletions

62
api.lua
View File

@ -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

View File

@ -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

View File

@ -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()

BIN
screenshot.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 384 KiB