From 6281dc744dc3951234931a9f44c3bdd353f79df7 Mon Sep 17 00:00:00 2001 From: Vanessa Ezekowitz Date: Fri, 27 Oct 2017 15:13:31 -0400 Subject: updated boost cart, homedecor modpack, castles modpack, currency, farming-redo, maptools, mesecons, moreblocks, moreores, pipeworks, quartz --- mesecons_mvps/init.lua | 96 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 35 deletions(-) (limited to 'mesecons_mvps') diff --git a/mesecons_mvps/init.lua b/mesecons_mvps/init.lua index 08c4785..c53946d 100644 --- a/mesecons_mvps/init.lua +++ b/mesecons_mvps/init.lua @@ -205,45 +205,56 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sti return true, nodes, oldstack end -mesecon.register_on_mvps_move(function(moved_nodes) - for _, n in ipairs(moved_nodes) do - mesecon.on_placenode(n.pos, n.node) - end -end) - -function mesecon.mvps_move_objects(pos, dir, nodestack) +function mesecon.mvps_move_objects(pos, dir, nodestack, movefactor) local objects_to_move = {} - - -- Move object at tip of stack, pushpos is position at tip of stack - local pushpos = vector.add(pos, vector.multiply(dir, #nodestack)) - - local objects = minetest.get_objects_inside_radius(pushpos, 1) - for _, obj in ipairs(objects) do - table.insert(objects_to_move, obj) + local dir_k + local dir_l + for k, v in pairs(dir) do + if v ~= 0 then + dir_k = k + dir_l = v + break + end end - - -- Move objects lying/standing on the stack (before it was pushed - oldstack) - if tonumber(minetest.setting_get("movement_gravity")) > 0 and dir.y == 0 then - -- If gravity positive and dir horizontal, push players standing on the stack - for _, n in ipairs(nodestack) do - local p_above = vector.add(n.pos, {x=0, y=1, z=0}) - local objects = minetest.get_objects_inside_radius(p_above, 1) - for _, obj in ipairs(objects) do - table.insert(objects_to_move, obj) + movefactor = movefactor or 1 + dir = vector.multiply(dir, movefactor) + for id, obj in pairs(minetest.object_refs) do + local obj_pos = obj:get_pos() + local cbox = obj:get_properties().collisionbox + local min_pos = vector.add(obj_pos, vector.new(cbox[1], cbox[2], cbox[3])) + local max_pos = vector.add(obj_pos, vector.new(cbox[4], cbox[5], cbox[6])) + local ok = true + for k, v in pairs(pos) do + local edge1, edge2 + if k ~= dir_k then + edge1 = v - 0.51 -- More than 0.5 to move objects near to the stack. + edge2 = v + 0.51 + else + edge1 = v - 0.5 * dir_l + edge2 = v + (#nodestack + 0.5 * movefactor) * dir_l + -- Make sure, edge1 is bigger than edge2: + if edge1 > edge2 then + edge1, edge2 = edge2, edge1 + end + end + if min_pos[k] > edge2 or max_pos[k] < edge1 then + ok = false + break end end - end - - for _, obj in ipairs(objects_to_move) do - local entity = obj:get_luaentity() - if not entity or not mesecon.is_mvps_unmov(entity.name) then - local np = vector.add(obj:getpos(), dir) - - --move only if destination is not solid - local nn = minetest.get_node(np) - if not ((not minetest.registered_nodes[nn.name]) - or minetest.registered_nodes[nn.name].walkable) then - obj:setpos(np) + if ok then + local ent = obj:get_luaentity() + if obj:is_player() or (ent and not mesecon.is_mvps_unmov(ent.name)) then + local np = vector.add(obj_pos, dir) + -- Move only if destination is not solid or object is inside stack: + local nn = minetest.get_node(np) + local node_def = minetest.registered_nodes[nn.name] + local obj_offset = dir_l * (obj_pos[dir_k] - pos[dir_k]) + if (node_def and not node_def.walkable) or + (obj_offset >= 0 and + obj_offset <= #nodestack - 0.5) then + obj:move_to(np) + end end end end @@ -255,3 +266,18 @@ mesecon.register_mvps_stopper("doors:door_steel_b_2") mesecon.register_mvps_stopper("doors:door_steel_t_2") mesecon.register_mvps_stopper("default:chest_locked") mesecon.register_on_mvps_move(mesecon.move_hot_nodes) +mesecon.register_on_mvps_move(function(moved_nodes) + for i = 1, #moved_nodes do + local moved_node = moved_nodes[i] + mesecon.on_placenode(moved_node.pos, moved_node.node) + minetest.after(0, function() + minetest.check_for_falling(moved_node.oldpos) + minetest.check_for_falling(moved_node.pos) + end) + local node_def = minetest.registered_nodes[moved_node.node.name] + if node_def and node_def.mesecon and node_def.mesecon.on_mvps_move then + node_def.mesecon.on_mvps_move(moved_node.pos, moved_node.node, + moved_node.oldpos, moved_node.meta) + end + end +end) -- cgit v1.2.3