Added craft recipes, screenshot, fixed more bugs
This commit is contained in:
parent
6d40d5e735
commit
2b7891ca20
60
api.lua
60
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!")
|
||||
end
|
||||
--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
|
||||
|
||||
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
|
||||
|
2
mod.conf
2
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
|
||||
|
124
registration.lua
124
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()
|
||||
|
BIN
screenshot.png
Normal file
BIN
screenshot.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 384 KiB |
Loading…
x
Reference in New Issue
Block a user