123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- -- 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
- -- settings:
- local timer_interval = 1 / mesecon.setting("movestone_speed", 3)
- local max_push = mesecon.setting("movestone_max_push", 50)
- local max_pull = mesecon.setting("movestone_max_pull", 50)
- -- helper functions:
- local function get_movestone_direction(rulename, is_vertical)
- if is_vertical then
- if rulename.z > 0 then
- return {x = 0, y = -1, z = 0}
- elseif rulename.z < 0 then
- return {x = 0, y = 1, z = 0}
- elseif rulename.x > 0 then
- return {x = 0, y = -1, z = 0}
- elseif rulename.x < 0 then
- return {x = 0, y = 1, z = 0}
- end
- else
- if rulename.z > 0 then
- return {x = -1, y = 0, z = 0}
- elseif rulename.z < 0 then
- return {x = 1, y = 0, z = 0}
- elseif rulename.x > 0 then
- return {x = 0, y = 0, z = -1}
- elseif rulename.x < 0 then
- return {x = 0, y = 0, z = 1}
- end
- end
- end
- -- registration functions:
- function mesecon.register_movestone(name, def, is_sticky, is_vertical)
- local function movestone_move(pos, node, rulename)
- local direction = get_movestone_direction(rulename, is_vertical)
- local frontpos = vector.add(pos, direction)
- -- ### Step 1: Push nodes in front ###
- local success, stack, oldstack = mesecon.mvps_push(frontpos, direction, max_push)
- if not success then
- minetest.get_node_timer(pos):start(timer_interval)
- return
- end
- mesecon.mvps_move_objects(frontpos, direction, oldstack)
- -- ### Step 2: Move the movestone ###
- minetest.set_node(frontpos, node)
- minetest.remove_node(pos)
- mesecon.on_dignode(pos, node)
- mesecon.on_placenode(frontpos, node)
- minetest.get_node_timer(frontpos):start(timer_interval)
- -- ### Step 3: If sticky, pull stack behind ###
- if not is_sticky then
- return
- end
- local backpos = vector.subtract(pos, direction)
- success, stack, oldstack = mesecon.mvps_pull_all(backpos, direction, max_pull)
- if success then
- mesecon.mvps_move_objects(backpos, vector.multiply(direction, -1), oldstack, -1)
- end
- end
- def.is_ground_content = false
- def.mesecons = {effector = {
- action_on = function(pos, node, rulename)
- if rulename and not minetest.get_node_timer(pos):is_started() then
- movestone_move(pos, node, rulename)
- end
- end,
- rules = mesecon.rules.default,
- }}
- def.on_timer = function(pos, elapsed)
- local sourcepos = mesecon.is_powered(pos)
- if not sourcepos then
- return
- end
- local rulename = vector.subtract(sourcepos[1], pos)
- mesecon.activate(pos, minetest.get_node(pos), rulename, 0)
- end
- def.on_blast = mesecon.on_blastnode
- minetest.register_node(name, def)
- end
- -- registration:
- mesecon.register_movestone("mesecons_movestones:movestone", {
- tiles = {
- "jeija_movestone_side.png",
- "jeija_movestone_side.png",
- "jeija_movestone_arrows.png^[transformFX",
- "jeija_movestone_arrows.png^[transformFX",
- "jeija_movestone_arrows.png",
- "jeija_movestone_arrows.png",
- },
- groups = {cracky = 3},
- description = "Movestone",
- sounds = default.node_sound_stone_defaults()
- }, false, false)
- mesecon.register_movestone("mesecons_movestones:sticky_movestone", {
- tiles = {
- "jeija_movestone_side.png",
- "jeija_movestone_side.png",
- "jeija_sticky_movestone.png^[transformFX",
- "jeija_sticky_movestone.png^[transformFX",
- "jeija_sticky_movestone.png",
- "jeija_sticky_movestone.png",
- },
- groups = {cracky = 3},
- description = "Sticky Movestone",
- sounds = default.node_sound_stone_defaults(),
- }, true, false)
- mesecon.register_movestone("mesecons_movestones:movestone_vertical", {
- tiles = {
- "jeija_movestone_side.png",
- "jeija_movestone_side.png",
- "jeija_movestone_arrows.png^[transformFXR90",
- "jeija_movestone_arrows.png^[transformR90",
- "jeija_movestone_arrows.png^[transformFXR90",
- "jeija_movestone_arrows.png^[transformR90",
- },
- groups = {cracky = 3},
- description = "Vertical Movestone",
- sounds = default.node_sound_stone_defaults()
- }, false, true)
- mesecon.register_movestone("mesecons_movestones:sticky_movestone_vertical", {
- tiles = {
- "jeija_movestone_side.png",
- "jeija_movestone_side.png",
- "jeija_sticky_movestone.png^[transformFXR90",
- "jeija_sticky_movestone.png^[transformR90",
- "jeija_sticky_movestone.png^[transformFXR90",
- "jeija_sticky_movestone.png^[transformR90",
- },
- groups = {cracky = 3},
- description = "Vertical Sticky Movestone",
- sounds = default.node_sound_stone_defaults(),
- }, true, true)
- -- crafting:
- -- base recipe:
- 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"},
- }
- })
- -- conversation:
- minetest.register_craft({
- type = "shapeless",
- output = "mesecons_movestones:movestone",
- recipe = {"mesecons_movestones:movestone_vertical"},
- })
- minetest.register_craft({
- type = "shapeless",
- output = "mesecons_movestones:movestone_vertical",
- recipe = {"mesecons_movestones:movestone"},
- })
- minetest.register_craft({
- type = "shapeless",
- output = "mesecons_movestones:sticky_movestone",
- recipe = {"mesecons_movestones:sticky_movestone_vertical"},
- })
- minetest.register_craft({
- type = "shapeless",
- output = "mesecons_movestones:sticky_movestone_vertical",
- recipe = {"mesecons_movestones:sticky_movestone"},
- })
- -- make sticky:
- minetest.register_craft({
- output = "mesecons_movestones:sticky_movestone",
- recipe = {
- {"mesecons_materials:glue", "mesecons_movestones:movestone", "mesecons_materials:glue"},
- }
- })
- minetest.register_craft({
- output = "mesecons_movestones:sticky_movestone_vertical",
- recipe = {
- {"mesecons_materials:glue"},
- {"mesecons_movestones:movestone_vertical"},
- {"mesecons_materials:glue"},
- }
- })
- -- legacy code:
- minetest.register_alias("mesecons_movestones:movestone_active",
- "mesecons_movestones:movestone")
- minetest.register_alias("mesecons_movestones:sticky_movestone_active",
- "mesecons_movestones:sticky_movestone")
|