add movement towards objects and nodes, animated textures, new worm types
|
@ -17,7 +17,8 @@ Code:
|
|||
LGPL v3
|
||||
|
||||
Textures:
|
||||
nyancat_front.png, nyancat_rainbow.png created by VanessaE, taken from Minetest Game.
|
||||
nyancat_front.png, nyancat_rainbow.png created by VanessaE, taken from Minetest Game.
|
||||
animated versions edited by Gejan
|
||||
Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) [http://creativecommons.org/licenses/by-sa/3.0/]
|
||||
|
||||
every other texture is created by Gejan
|
||||
|
|
347
api.lua
|
@ -6,13 +6,18 @@ local WALKING_PERIOD = worm.config.WALKING_PERIOD
|
|||
-- @param data A table containing:
|
||||
-- - leftover The node placed behind the tail when moving away
|
||||
-- - walking_steps The number of steps to pass one node
|
||||
-- - can_move A function (Position * Node -> Boolean) defining which nodes
|
||||
-- can be destroyed by the worm
|
||||
-- - can_move A function (Position * Node -> Boolean) defining which
|
||||
-- nodes can be destroyed by the worm
|
||||
-- - flying Movement behaviour
|
||||
-- - *_textures (See examples)
|
||||
-- - drop drop of body parts; default: the spawn item
|
||||
-- - node_damage Damage done inside the head
|
||||
-- - attack_damage Damage groups for attacks; nil means no attack
|
||||
-- - follow_objects Can be: false, "straight", "winding", true = "mixed"
|
||||
-- - *_texture See examples, some values are indispensable
|
||||
-- *_tile
|
||||
-- @return True if successful
|
||||
worm.register_worm = function (modname, name, data)
|
||||
-- default values:
|
||||
-- Default values:
|
||||
if not data.leftover then
|
||||
data.leftover = "air"
|
||||
end
|
||||
|
@ -24,12 +29,7 @@ worm.register_worm = function (modname, name, data)
|
|||
return node.name == "air"
|
||||
end
|
||||
end
|
||||
-- required values:
|
||||
if not (data.face_texture and data.side_texture and data.tail_texture) then
|
||||
print("[worm] register_worm of "..modname..":"..name.." failed because of incomplete data")
|
||||
return false
|
||||
end
|
||||
-- reusing textures
|
||||
-- Reusing textures
|
||||
if not data.bottem_texture then
|
||||
data.bottem_texture = data.side_texture
|
||||
end
|
||||
|
@ -42,6 +42,32 @@ worm.register_worm = function (modname, name, data)
|
|||
if not data.inventory_image then
|
||||
data.inventory_image = data.face_texture
|
||||
end
|
||||
if not data.attack_texture then
|
||||
data.attack_texture = data.face_texture
|
||||
end
|
||||
-- Complete tiles
|
||||
if not data.top_tile then
|
||||
data.top_tile = data.top_texture.."^[transform1"
|
||||
end
|
||||
if not data.bottem_tile then
|
||||
data.bottem_tile = data.bottem_texture.."^[transform3"
|
||||
end
|
||||
if not data.side_tile then
|
||||
data.side_tile = data.side_texture
|
||||
end
|
||||
if not data.left_tile then
|
||||
data.left_tile = data.left_texture.."^[transform2"
|
||||
end
|
||||
if not data.face_tile then
|
||||
data.face_tile = data.face_texture
|
||||
end
|
||||
if not data.tail_tile then
|
||||
data.tail_tile = data.tail_texture
|
||||
end
|
||||
-- Spawn item related
|
||||
if not data.drop then
|
||||
data.drop = modname..":"..name.."_spawnegg"
|
||||
end
|
||||
if not data.spawn_in then
|
||||
data.spawn_in = "air"
|
||||
end
|
||||
|
@ -109,68 +135,195 @@ worm.register_worm = function (modname, name, data)
|
|||
local step = function(pos, _)
|
||||
local node = minetest.get_node(pos)
|
||||
node.name = modname..":"..name.."_head_"..(n+1)
|
||||
minetest.set_node(pos, node)
|
||||
minetest.swap_node(pos, node)
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
return false
|
||||
end
|
||||
-- Check for attack at first step
|
||||
if data.attack_damage and n == 1 then
|
||||
step = function(pos, _)
|
||||
local node = minetest.get_node(pos)
|
||||
local dir = minetest.facedir_to_dir(node.param2)
|
||||
local bite_pos = vector.add(pos, dir)
|
||||
if data.can_move(bite_pos, minetest.get_node(bite_pos)) then
|
||||
local objects = minetest.get_objects_inside_radius(bite_pos, 1)
|
||||
if objects[1] then
|
||||
node.name = modname..":"..name.."_body"
|
||||
minetest.swap_node(pos, node)
|
||||
node.name = modname..":"..name.."_attack"
|
||||
minetest.set_node(bite_pos, node)
|
||||
objects[1]:punch(objects[1], nil, -- This is a workaround, first argument should be nil
|
||||
{damage_groups = data.attack_damage,}, dir)
|
||||
local timer = minetest.get_node_timer(bite_pos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
return false
|
||||
end
|
||||
end
|
||||
node.name = modname..":"..name.."_head_"..(n+1)
|
||||
minetest.swap_node(pos, node)
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
return false
|
||||
end
|
||||
end
|
||||
-- Complete head -> Move head to a different position
|
||||
if n == data.walking_steps then
|
||||
step = function(pos, _)
|
||||
local node = minetest.get_node(pos)
|
||||
local facedir = node.param2
|
||||
local dirs -- Hierarchy of preferred directions
|
||||
if data.flying then
|
||||
dirs = {
|
||||
facedir % 4, -- 4 -> 0
|
||||
(facedir + 1) % 4,
|
||||
(facedir + 2) % 4,
|
||||
(facedir + 3) % 4,
|
||||
8,
|
||||
4
|
||||
}
|
||||
else
|
||||
dirs = {
|
||||
4,
|
||||
facedir % 4, -- 4 -> 0
|
||||
(facedir + 1) % 4,
|
||||
(facedir + 2) % 4,
|
||||
(facedir + 3) % 4,
|
||||
8
|
||||
}
|
||||
end
|
||||
for i = 1, 6 do
|
||||
local newpos = vector.add(pos, minetest.facedir_to_dir(dirs[i]))
|
||||
local newnode = minetest.get_node(newpos)
|
||||
local grow = minetest.get_node_group(newnode.name, "swallowable")
|
||||
if grow > 0 then
|
||||
grow = grow + 1
|
||||
if grow > data.walking_steps then
|
||||
grow = data.walking_steps
|
||||
if data.follow_nodes then -- follow food nodes
|
||||
local radius = data.follow_nodes_radius
|
||||
if not radius then radius = 5 end
|
||||
local obj_pos = minetest.find_node_near(pos, radius, data.follow_nodes)
|
||||
if obj_pos then
|
||||
obj_pos = vector.subtract(obj_pos, pos)
|
||||
dirs = {}
|
||||
if not data.flying then
|
||||
dirs[1] = 4
|
||||
end
|
||||
if obj_pos.x > 0 then
|
||||
dirs[2] = 1
|
||||
dirs[5] = 3
|
||||
elseif obj_pos.x < 0 then
|
||||
dirs[2] = 3
|
||||
dirs[5] = 1
|
||||
else
|
||||
dirs[5] = 1
|
||||
dirs[8] = 3
|
||||
end
|
||||
if obj_pos.z > 0 then
|
||||
dirs[3] = 0
|
||||
dirs[6] = 2
|
||||
elseif obj_pos.z < 0 then
|
||||
dirs[3] = 2
|
||||
dirs[6] = 0
|
||||
else
|
||||
dirs[6] = 0
|
||||
dirs[9] = 2
|
||||
end
|
||||
if math.abs(obj_pos.z) > math.abs(obj_pos.x) then
|
||||
local tmp = dirs[2]
|
||||
dirs[2] = dirs[3]
|
||||
dirs[3] = tmp
|
||||
end
|
||||
if obj_pos.y > 0 then
|
||||
dirs[4] = 8
|
||||
dirs[7] = 4
|
||||
else
|
||||
dirs[4] = 4
|
||||
dirs[7] = 8
|
||||
end
|
||||
end
|
||||
end
|
||||
if data.follow_objects then -- follow objects
|
||||
local radius = data.follow_objects_radius
|
||||
if not radius then radius = 5 end
|
||||
local objects = minetest.get_objects_inside_radius(pos, radius)
|
||||
if objects[1] then
|
||||
local obj_pos = objects[1]:getpos()
|
||||
obj_pos = vector.subtract(obj_pos, pos)
|
||||
dirs = {}
|
||||
if not data.flying then
|
||||
dirs[1] = 4
|
||||
end
|
||||
if obj_pos.x > 0 then
|
||||
dirs[2] = 1
|
||||
dirs[5] = 3
|
||||
else
|
||||
dirs[2] = 3
|
||||
dirs[5] = 1
|
||||
end
|
||||
if obj_pos.z > 0 then
|
||||
dirs[3] = 0
|
||||
dirs[6] = 2
|
||||
else
|
||||
dirs[3] = 2
|
||||
dirs[6] = 0
|
||||
end
|
||||
if data.follow_objects == "straight" then
|
||||
if math.abs(obj_pos.z) > math.abs(obj_pos.x) then
|
||||
local tmp = dirs[2]
|
||||
dirs[2] = dirs[3]
|
||||
dirs[3] = tmp
|
||||
end
|
||||
elseif data.follow_objects == "winding" then
|
||||
if math.abs(obj_pos.z) < math.abs(obj_pos.x) then
|
||||
local tmp = dirs[2]
|
||||
dirs[2] = dirs[3]
|
||||
dirs[3] = tmp
|
||||
end
|
||||
end
|
||||
if obj_pos.y > 0 then
|
||||
dirs[4] = 8
|
||||
dirs[7] = 4
|
||||
else
|
||||
dirs[4] = 4
|
||||
dirs[7] = 8
|
||||
end
|
||||
if data.flying and (data.follow_objects == "straight") and (math.abs(obj_pos.z) < 1) and (math.abs(obj_pos.x) < 1) and (math.abs(obj_pos.y) > 1) then
|
||||
dirs[1] = dirs[4]
|
||||
dirs[4] = nil
|
||||
end
|
||||
end
|
||||
end
|
||||
-- default movement
|
||||
if not dirs then
|
||||
if data.flying then
|
||||
dirs = {
|
||||
facedir % 4, -- 4 -> 0
|
||||
(facedir + 1) % 4,
|
||||
(facedir + 2) % 4,
|
||||
(facedir + 3) % 4,
|
||||
8,
|
||||
4
|
||||
}
|
||||
else
|
||||
dirs = {
|
||||
4,
|
||||
facedir % 4, -- 4 -> 0
|
||||
(facedir + 1) % 4,
|
||||
(facedir + 2) % 4,
|
||||
(facedir + 3) % 4,
|
||||
8
|
||||
}
|
||||
end
|
||||
end
|
||||
for i = 1, 9 do
|
||||
if dirs[i] then
|
||||
local newpos = vector.add(pos, minetest.facedir_to_dir(dirs[i]))
|
||||
local newnode = minetest.get_node(newpos)
|
||||
local grow = minetest.get_node_group(newnode.name, "swallowable")
|
||||
if grow > 0 then
|
||||
grow = grow + 1
|
||||
if grow > data.walking_steps then
|
||||
grow = data.walking_steps
|
||||
end
|
||||
minetest.set_node(newpos, {
|
||||
name = modname..":"..name.."_head_"..grow,
|
||||
param2 = dirs[i]
|
||||
})
|
||||
minetest.set_node(pos, {
|
||||
name = modname..":"..name.."_body",
|
||||
param2 = dirs[i]
|
||||
})
|
||||
local timer = minetest.get_node_timer(newpos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
return false
|
||||
elseif data.can_move(newpos, newnode) then
|
||||
minetest.set_node(newpos, {
|
||||
name = modname..":"..name.."_head_1",
|
||||
param2 = dirs[i]
|
||||
})
|
||||
minetest.set_node(pos, {
|
||||
name = modname..":"..name.."_body",
|
||||
param2 = dirs[i]
|
||||
})
|
||||
local timer = minetest.get_node_timer(newpos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
return false
|
||||
end
|
||||
minetest.set_node(newpos, {
|
||||
name = modname..":"..name.."_head_"..grow,
|
||||
param2 = dirs[i]
|
||||
})
|
||||
minetest.set_node(pos, {
|
||||
name = modname..":"..name.."_body",
|
||||
param2 = dirs[i]
|
||||
})
|
||||
local timer = minetest.get_node_timer(newpos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
return false
|
||||
elseif data.can_move(newpos, newnode) then
|
||||
minetest.set_node(newpos, {
|
||||
name = modname..":"..name.."_head_1",
|
||||
param2 = dirs[i]
|
||||
})
|
||||
minetest.set_node(pos, {
|
||||
name = modname..":"..name.."_body",
|
||||
param2 = dirs[i]
|
||||
})
|
||||
local timer = minetest.get_node_timer(newpos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
return false
|
||||
end
|
||||
end
|
||||
-- Worm stuck
|
||||
|
@ -193,15 +346,15 @@ worm.register_worm = function (modname, name, data)
|
|||
},
|
||||
},
|
||||
tiles = {
|
||||
data.top_texture.."^[transform1",
|
||||
data.bottem_texture.."^[transform3",
|
||||
data.side_texture,
|
||||
data.left_texture.."^[transform2",
|
||||
data.face_texture,
|
||||
data.side_texture
|
||||
data.top_tile,
|
||||
data.bottem_tile,
|
||||
data.side_tile,
|
||||
data.left_tile,
|
||||
data.face_tile,
|
||||
data.side_tile
|
||||
},
|
||||
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
|
||||
damage_per_second = 10,
|
||||
damage_per_second = data.node_damage,
|
||||
on_timer = step,
|
||||
drop = "",
|
||||
})
|
||||
|
@ -213,12 +366,12 @@ worm.register_worm = function (modname, name, data)
|
|||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
tiles = {
|
||||
data.top_texture.."^[transform1",
|
||||
data.bottem_texture.."^[transform3",
|
||||
data.side_texture,
|
||||
data.left_texture.."^[transform2",
|
||||
data.side_texture,
|
||||
data.side_texture
|
||||
data.top_tile,
|
||||
data.bottem_tile,
|
||||
data.side_tile,
|
||||
data.left_tile,
|
||||
data.side_tile,
|
||||
data.side_tile
|
||||
},
|
||||
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
|
||||
-- Add a new tail to keep demolition
|
||||
|
@ -235,7 +388,7 @@ worm.register_worm = function (modname, name, data)
|
|||
minetest.set_node(newpos, newnode)
|
||||
end
|
||||
end,
|
||||
drop = modname..":"..name.."_spawnegg",
|
||||
drop = data.drop,
|
||||
})
|
||||
|
||||
-- Definition of tail nodes
|
||||
|
@ -285,12 +438,12 @@ worm.register_worm = function (modname, name, data)
|
|||
},
|
||||
},
|
||||
tiles = {
|
||||
data.top_texture.."^[transform1",
|
||||
data.bottem_texture.."^[transform3",
|
||||
data.side_texture,
|
||||
data.left_texture.."^[transform2",
|
||||
data.side_texture,
|
||||
data.tail_texture
|
||||
data.top_tile,
|
||||
data.bottem_tile,
|
||||
data.side_tile,
|
||||
data.left_tile,
|
||||
data.side_tile,
|
||||
data.tail_tile
|
||||
},
|
||||
on_timer = step,
|
||||
after_dig_node = function(pos, node, _, _)
|
||||
|
@ -310,5 +463,37 @@ worm.register_worm = function (modname, name, data)
|
|||
drop = "",
|
||||
})
|
||||
end
|
||||
|
||||
--Definition of the special attack head node
|
||||
if data.attack_damage then
|
||||
minetest.register_node(modname..":"..name.."_attack", {
|
||||
description = name.." attacking head",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
tiles = {
|
||||
data.top_tile,
|
||||
data.bottem_tile,
|
||||
data.side_tile,
|
||||
data.left_tile,
|
||||
data.attack_texture,
|
||||
data.side_tile
|
||||
},
|
||||
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
|
||||
on_timer = function(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
local pos_b = vector.subtract(pos, minetest.facedir_to_dir(node.param2))
|
||||
local node_b = minetest.get_node(pos_b)
|
||||
node.name = "air"
|
||||
minetest.swap_node(pos, node)
|
||||
if node_b.name == modname..":"..name.."_body" then
|
||||
node_b.name = modname..":"..name.."_head_"..(math.min(3, data.walking_steps))
|
||||
minetest.swap_node(pos_b, node_b)
|
||||
local timer = minetest.get_node_timer(pos_b)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
end
|
||||
end,
|
||||
drop = "",
|
||||
})
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
|
116
examples.lua
|
@ -1,32 +1,31 @@
|
|||
-- Worm
|
||||
worm.register_worm("worm", "worm", {
|
||||
leftover = "mapgen_dirt",
|
||||
face_texture = "worm_face.png",
|
||||
side_texture = "worm_side.png",
|
||||
tail_texture = "worm_tail.png",
|
||||
can_move = function(_, node)
|
||||
local name = node.name
|
||||
return minetest.registered_nodes[name].buildable_to or
|
||||
minetest.get_node_group(name, "crumbly") >= 3
|
||||
end,
|
||||
})
|
||||
-- Not animated
|
||||
---------------
|
||||
|
||||
-- Snake
|
||||
-- Green Snake
|
||||
worm.register_worm("worm", "snake", {
|
||||
face_texture = "snake_face.png",
|
||||
side_texture = "snake_side.png",
|
||||
tail_texture = "snake_tail.png",
|
||||
face_texture = "snake_face.png",
|
||||
side_texture = "snake_side.png",
|
||||
tail_texture = "snake_tail.png",
|
||||
attack_texture = "snake_attack.png",
|
||||
attack_damage = {fleshy = 8},
|
||||
follow_objects = "winding",
|
||||
follow_nodes = "group:swallowable",
|
||||
can_move = function(_, node)
|
||||
return minetest.registered_nodes[node.name].buildable_to
|
||||
end,
|
||||
})
|
||||
|
||||
-- Nyancat
|
||||
worm.register_worm("worm", "nyancat", {
|
||||
face_texture = "nyancat_front.png",
|
||||
side_texture = "nyancat_rainbow.png",
|
||||
tail_texture = "nyancat_rainbow.png",
|
||||
flying = true,
|
||||
-- Black Snake
|
||||
worm.register_worm("worm", "black_snake", {
|
||||
face_texture = "snake_face_black.png",
|
||||
side_texture = "snake_side_yellow_black.png",
|
||||
tail_texture = "snake_tail_black.png",
|
||||
attack_texture = "snake_face_black.png",
|
||||
attack_damage = {fleshy = 8},
|
||||
follow_objects = "straight",
|
||||
can_move = function(_, node)
|
||||
return minetest.registered_nodes[node.name].buildable_to
|
||||
end,
|
||||
})
|
||||
|
||||
-- Eel
|
||||
|
@ -49,3 +48,76 @@ worm.register_worm("worm", "eel", {
|
|||
end,
|
||||
flying = true,
|
||||
})
|
||||
|
||||
-- Animated
|
||||
-----------
|
||||
local anm = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 16,
|
||||
aspect_h = 16,
|
||||
length = 3.0,
|
||||
}
|
||||
|
||||
-- Nyancat
|
||||
worm.register_worm("worm", "nyancat", {
|
||||
inventory_image = "nyancat_front.png",
|
||||
side_tile = {name = "nyancat_rainbow_animated.png", animation = anm},
|
||||
left_tile = {name = "nyancat_rainbow_animated.png", animation = anm},
|
||||
top_tile = {name = "nyancat_rainbow_animated_b.png", animation = anm},
|
||||
bottem_tile = {name = "nyancat_rainbow_animated_b.png", animation = anm},
|
||||
face_tile = {name = "nyancat_front_animated.png", animation = anm},
|
||||
tail_tile = {name = "nyancat_rainbow_animated.png", animation = anm},
|
||||
flying = true,
|
||||
})
|
||||
|
||||
-- Worm
|
||||
worm.register_worm("worm", "worm", {
|
||||
leftover = "mapgen_dirt",
|
||||
inventory_image = "worm_face.png",
|
||||
side_tile = {name = "worm_side_animated.png", animation = anm},
|
||||
left_tile = {name = "worm_side_animated.png^[transform62", animation = anm},
|
||||
top_tile = {name = "worm_top_animated.png", animation = anm},
|
||||
bottem_tile = {name = "worm_bottem_animated.png", animation = anm},
|
||||
face_tile = {name = "worm_face_animated.png", animation = anm},
|
||||
tail_tile = "worm_tail.png",
|
||||
attack_damage = {fleshy = 8},
|
||||
can_move = function(_, node)
|
||||
local name = node.name
|
||||
return minetest.registered_nodes[name].buildable_to or
|
||||
minetest.get_node_group(name, "crumbly") >= 3
|
||||
end,
|
||||
})
|
||||
|
||||
-- Worm
|
||||
worm.register_worm("worm", "caterpillar", {
|
||||
face_texture = "caterpillar_face.png",
|
||||
side_tile = {name = "caterpillar_side_animated.png", animation = anm},
|
||||
left_tile = {name = "caterpillar_side_animated.png^[transform62", animation = anm},
|
||||
top_tile = {name = "caterpillar_top_animated.png", animation = anm},
|
||||
bottem_tile = {name = "caterpillar_bottem_animated.png", animation = anm},
|
||||
tail_tile = "caterpillar_tail.png",
|
||||
follow_nodes = {"group:swallowable", "group:leaves"},
|
||||
can_move = function(_, node)
|
||||
local name = node.name
|
||||
return minetest.registered_nodes[name].buildable_to or
|
||||
minetest.get_node_group(name, "snappy") >= 3
|
||||
end,
|
||||
})
|
||||
|
||||
-- Worm
|
||||
worm.register_worm("worm", "maggot", {
|
||||
face_texture = "maggot_face.png",
|
||||
side_tile = {name = "maggot_side_animated.png", animation = anm},
|
||||
left_tile = {name = "maggot_side_animated.png^[transform62", animation = anm},
|
||||
top_tile = {name = "maggot_top_animated.png", animation = anm},
|
||||
bottem_tile = {name = "maggot_bottem_animated.png", animation = anm},
|
||||
tail_tile = "maggot_tail.png",
|
||||
walking_steps = 8,
|
||||
follow_nodes = {"group:swallowable", "group:wood"},
|
||||
node_damage = 4,
|
||||
can_move = function(_, node)
|
||||
local name = node.name
|
||||
return minetest.registered_nodes[name].buildable_to or
|
||||
minetest.get_node_group(name, "choppy") >= 2
|
||||
end,
|
||||
})
|
1
init.lua
|
@ -14,5 +14,6 @@ worm.config.TAIL_PROTECTION = false
|
|||
local path = minetest.get_modpath("worm")
|
||||
dofile(path.."/api.lua")
|
||||
dofile(path.."/examples.lua")
|
||||
dofile(path.."/stone_eater.lua")
|
||||
dofile(path.."/swallowable_nodes.lua")
|
||||
dofile(path.."/mapgen.lua")
|
||||
|
|
19
mapgen.lua
|
@ -8,6 +8,8 @@ local mapgen_node = {
|
|||
}
|
||||
minetest.register_node("worm:snake_head_1_mapgen", mapgen_node)
|
||||
minetest.register_node("worm:snake_tail_1_mapgen", mapgen_node)
|
||||
minetest.register_node("worm:snake_black_head_1_mapgen", mapgen_node)
|
||||
minetest.register_node("worm:snake__black_tail_1_mapgen", mapgen_node)
|
||||
minetest.register_node("worm:worm_head_1_mapgen", mapgen_node)
|
||||
minetest.register_node("worm:worm_tail_1_mapgen", mapgen_node)
|
||||
minetest.register_node("worm:eel_head_1_mapgen", mapgen_node)
|
||||
|
@ -44,6 +46,23 @@ minetest.register_decoration({
|
|||
},
|
||||
})
|
||||
|
||||
-- Black Snake
|
||||
minetest.register_decoration({
|
||||
deco_type = "schematic",
|
||||
place_on = "mapgen_dirt_with_grass",
|
||||
sidelen = 16,
|
||||
fill_ratio = 0.0001,
|
||||
schematic = {
|
||||
size = {x=4, y=1, z=1},
|
||||
data = {
|
||||
{name="worm:snake_black_head_1_mapgen", param1=255, param2=3, force_place = true},
|
||||
{name="worm:snake_black_body", param1=255, param2=3, force_place = true},
|
||||
{name="worm:snake_black_body", param1=255, param2=3, force_place = true},
|
||||
{name="worm:snake_black_tail_1_mapgen", param1=255, param2=3, force_place = true},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
-- Worm
|
||||
minetest.register_decoration({
|
||||
deco_type = "schematic",
|
||||
|
|
|
@ -0,0 +1,110 @@
|
|||
-- Stone eater
|
||||
|
||||
-- Definition
|
||||
-------------
|
||||
|
||||
local drop = ""
|
||||
if default then
|
||||
drop = {
|
||||
max_items = 2,
|
||||
items = {
|
||||
{
|
||||
items = {"default:coal_lump"},
|
||||
rarity = 1,
|
||||
},
|
||||
{
|
||||
items = {"default:gold_lump"},
|
||||
rarity = 2,
|
||||
},
|
||||
{
|
||||
items = {"default:iron_lump"},
|
||||
rarity = 2,
|
||||
},
|
||||
{
|
||||
items = {"default:copper_lump"},
|
||||
rarity = 2,
|
||||
},
|
||||
},
|
||||
}
|
||||
end
|
||||
local anm = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 16,
|
||||
aspect_h = 16,
|
||||
length = 3.0,
|
||||
}
|
||||
worm.register_worm("worm", "stone_eater", {
|
||||
leftover = "mapgen_stone",
|
||||
inventory_image = "stone_eater_face.png",
|
||||
face_tile = {name = "stone_eater_face_animated.png", animation = anm},
|
||||
side_tile = {name = "stone_eater_side_animated.png", animation = anm},
|
||||
left_tile = {name = "stone_eater_side_animated.png^[transform62", animation = anm},
|
||||
top_tile = {name = "stone_eater_top_animated.png", animation = anm},
|
||||
bottem_tile = {name = "stone_eater_bottem_animated.png", animation = anm},
|
||||
tail_tile = "stone_eater_tail.png",
|
||||
node_damage = 4,
|
||||
attack_damage = {fleshy = 8},
|
||||
follow_nodes = {"group:swallowable"},
|
||||
follow_objects = "straight",
|
||||
follow_objects_radius = 8,
|
||||
flying = true,
|
||||
can_move = function(_, node)
|
||||
local name = node.name
|
||||
return minetest.registered_nodes[name].buildable_to or
|
||||
minetest.get_node_group(name, "cracky") >= 3
|
||||
end,
|
||||
drop = drop,
|
||||
})
|
||||
|
||||
|
||||
-- Mapgen
|
||||
---------
|
||||
|
||||
minetest.register_node("worm:stone_eater_head_1_mapgen", {
|
||||
description = "worm mapgen node",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "airlike",
|
||||
groups = {not_in_creative_inventory = 1},
|
||||
})
|
||||
|
||||
-- Place nodes and initialize the node timer.
|
||||
minetest.register_lbm({
|
||||
name = "worm:init_nodetimers_mapgen_underground",
|
||||
nodenames = "worm:stone_eater_head_1_mapgen",
|
||||
run_at_every_load = true,
|
||||
action = function(pos, node)
|
||||
node.name = "worm:stone_eater_head_1"
|
||||
node.param2 = 0 -- TODO make random
|
||||
local dir = minetest.facedir_to_dir(node.param2)
|
||||
--local dir4 = vector.multiply(dir, 4)
|
||||
--minetest.emerge_area(pos, vector.add(pos, dir4))
|
||||
print("[worm]"..node.name.." spawned at "..pos.x..", "..pos.y..", "..pos.z)
|
||||
minetest.swap_node(pos, node)
|
||||
local headtimer = minetest.get_node_timer(pos)
|
||||
node.name = "worm:stone_eater_body"
|
||||
pos = vector.subtract(pos, dir)
|
||||
minetest.set_node(pos, node)
|
||||
pos = vector.subtract(pos, dir)
|
||||
minetest.set_node(pos, node)
|
||||
pos = vector.subtract(pos, dir)
|
||||
minetest.set_node(pos, node)
|
||||
node.name = "worm:stone_eater_tail_1"
|
||||
pos = vector.subtract(pos, dir)
|
||||
minetest.set_node(pos, node)
|
||||
local tailtimer = minetest.get_node_timer(pos)
|
||||
headtimer:set(worm.config.WALKING_PERIOD, 0)
|
||||
tailtimer:set(worm.config.WALKING_PERIOD, 0)
|
||||
print("tail at "..pos.x..", "..pos.y..", "..pos.z)
|
||||
end,
|
||||
})
|
||||
minetest.register_ore({
|
||||
oretype = "",
|
||||
ore = "worm:stone_eater_head_1_mapgen",
|
||||
wherein = "default:stone",
|
||||
clust_scarcity = 16*16*16,
|
||||
clust_num_ores = 1,
|
||||
clust_size = 3,
|
||||
height_min = -31000,
|
||||
height_max = -100,
|
||||
})
|
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 270 B |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 247 B |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 530 B |
After Width: | Height: | Size: 534 B |
After Width: | Height: | Size: 316 B |
After Width: | Height: | Size: 366 B |
After Width: | Height: | Size: 353 B |
After Width: | Height: | Size: 352 B |
After Width: | Height: | Size: 269 B |
After Width: | Height: | Size: 220 B |
After Width: | Height: | Size: 325 B |
After Width: | Height: | Size: 562 B |
After Width: | Height: | Size: 342 B |
After Width: | Height: | Size: 171 B |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 304 B |
After Width: | Height: | Size: 399 B |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 197 B |
After Width: | Height: | Size: 266 B |
After Width: | Height: | Size: 224 B |
After Width: | Height: | Size: 193 B |