forked from minetest-mods/mesecons
d80c788fab
It used to be so that you could gain two sticky movestones out of one normal one, this didn't make much sense.
157 lines
4.5 KiB
Lua
157 lines
4.5 KiB
Lua
-- MOVESTONE
|
|
-- Non-sticky:
|
|
-- Moves along mesecon lines
|
|
-- Pushes all blocks in front of it
|
|
--
|
|
-- Sticky one
|
|
-- Moves along mesecon lines
|
|
-- Pushes all block in front of it
|
|
-- Pull all blocks in its back
|
|
|
|
function mesecon.get_movestone_direction(pos)
|
|
local lpos
|
|
local rules = {
|
|
{x=0, y=1, z=-1},
|
|
{x=0, y=0, z=-1},
|
|
{x=0, y=-1, z=-1},
|
|
{x=0, y=1, z=1},
|
|
{x=0, y=-1, z=1},
|
|
{x=0, y=0, z=1},
|
|
{x=1, y=0, z=0},
|
|
{x=1, y=1, z=0},
|
|
{x=1, y=-1, z=0},
|
|
{x=-1, y=1, z=0},
|
|
{x=-1, y=-1, z=0},
|
|
{x=-1, y=0, z=0}}
|
|
|
|
lpos = {x=pos.x+1, y=pos.y, z=pos.z}
|
|
for n = 1, 3 do
|
|
if mesecon.is_power_on(lpos, rules[n]) then
|
|
return {x=0, y=0, z=-1}
|
|
end
|
|
end
|
|
|
|
lpos = {x = pos.x-1, y = pos.y, z = pos.z}
|
|
for n=4, 6 do
|
|
if mesecon.is_power_on(lpos, rules[n]) then
|
|
return {x=0, y=0, z=1}
|
|
end
|
|
end
|
|
|
|
lpos = {x = pos.x, y = pos.y, z = pos.z+1}
|
|
for n=7, 9 do
|
|
if mesecon.is_power_on(lpos, rules[n]) then
|
|
return {x=-1, y=0, z=0}
|
|
end
|
|
end
|
|
|
|
lpos = {x = pos.x, y = pos.y, z = pos.z-1}
|
|
for n=10, 12 do
|
|
if mesecon.is_power_on(lpos, rules[n]) then
|
|
return {x=1, y=0, z=0}
|
|
end
|
|
end
|
|
end
|
|
|
|
function mesecon.register_movestone(name, def, is_sticky)
|
|
local timer_interval = 1 / mesecon.setting("movestone_speed", 3)
|
|
local name_active = name.."_active"
|
|
|
|
local function movestone_move (pos)
|
|
if minetest.get_node(pos).name ~= name_active then
|
|
return
|
|
end
|
|
|
|
local direction = mesecon.get_movestone_direction(pos)
|
|
if not direction then
|
|
minetest.set_node(pos, {name = name})
|
|
return
|
|
end
|
|
local frontpos = vector.add(pos, direction)
|
|
local backpos = vector.subtract(pos, direction)
|
|
|
|
-- ### Step 1: Push nodes in front ###
|
|
local maxpush = mesecon.setting("movestone_max_push", 50)
|
|
local maxpull = mesecon.setting("movestone_max_pull", 50)
|
|
local success, stack, oldstack = mesecon.mvps_push(frontpos, direction, maxpush)
|
|
if success then
|
|
mesecon.mvps_process_stack(stack)
|
|
mesecon.mvps_move_objects(frontpos, direction, oldstack)
|
|
-- Too large stack/stopper in the way: try again very soon
|
|
else
|
|
minetest.after(0.05, movestone_move, pos)
|
|
return
|
|
end
|
|
|
|
-- ### Step 2: Move the movestone ###
|
|
local node = minetest.get_node(pos)
|
|
minetest.set_node(frontpos, node)
|
|
minetest.remove_node(pos)
|
|
mesecon.on_dignode(pos, node)
|
|
mesecon.on_placenode(frontpos, node)
|
|
minetest.after(timer_interval, movestone_move, frontpos)
|
|
|
|
-- ### Step 3: If sticky, pull stack behind ###
|
|
if is_sticky then
|
|
mesecon.mvps_pull_all(backpos, direction, maxpull)
|
|
end
|
|
end
|
|
|
|
def.mesecons = {effector = {
|
|
action_on = function (pos)
|
|
if minetest.get_node(pos).name ~= name_active then
|
|
minetest.set_node(pos, {name = name_active})
|
|
movestone_move(pos)
|
|
end
|
|
end,
|
|
action_off = function (pos)
|
|
minetest.set_node(pos, {name = name})
|
|
end
|
|
}}
|
|
|
|
def.drop = name
|
|
|
|
minetest.register_node(name, def)
|
|
|
|
-- active node only
|
|
local def_active = table.copy(def)
|
|
def_active.groups.not_in_creative_inventory = 1
|
|
minetest.register_node(name_active, def_active)
|
|
end
|
|
|
|
mesecon.register_movestone("mesecons_movestones:movestone", {
|
|
tiles = {"jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_arrows.png", "jeija_movestone_arrows.png"},
|
|
groups = {cracky=3},
|
|
description="Movestone",
|
|
sounds = default.node_sound_stone_defaults()
|
|
}, false)
|
|
|
|
minetest.register_craft({
|
|
output = "mesecons_movestones:movestone 2",
|
|
recipe = {
|
|
{"default:stone", "default:stone", "default:stone"},
|
|
{"group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable"},
|
|
{"default:stone", "default:stone", "default:stone"},
|
|
}
|
|
})
|
|
|
|
-- STICKY_MOVESTONE
|
|
mesecon.register_movestone("mesecons_movestones:sticky_movestone", {
|
|
tiles = {"jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_sticky_movestone.png", "jeija_sticky_movestone.png"},
|
|
inventory_image = minetest.inventorycube("jeija_sticky_movestone.png", "jeija_movestone_side.png", "jeija_movestone_side.png"),
|
|
groups = {cracky=3},
|
|
description="Sticky Movestone",
|
|
sounds = default.node_sound_stone_defaults(),
|
|
}, true)
|
|
|
|
minetest.register_craft({
|
|
output = "mesecons_movestones:sticky_movestone",
|
|
recipe = {
|
|
{"mesecons_materials:glue", "mesecons_movestones:movestone", "mesecons_materials:glue"},
|
|
}
|
|
})
|
|
|
|
-- Don't allow pushing movestones while they're active
|
|
mesecon.register_mvps_stopper("mesecons_movestones:movestone_active")
|
|
mesecon.register_mvps_stopper("mesecons_movestones:sticky_movestone_active")
|