split code, add mapgen, add eel, add nyancat, improved api, add growth, etc
|
@ -15,5 +15,10 @@ Code:
|
|||
LGPL v3
|
||||
|
||||
Textures:
|
||||
CC-0
|
||||
nyancat_front.png, nyancat_rainbow.png created by VanessaE, taken from Minetest Game.
|
||||
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
|
||||
CC 0 [https://creativecommons.org/publicdomain/zero/1.0/]
|
||||
|
||||
|
|
@ -0,0 +1,314 @@
|
|||
local WALKING_PERIOD = worm.config.WALKING_PERIOD
|
||||
|
||||
-- Defines a "worm" (spawnitem and nodes)
|
||||
-- @param modname The name of the mod, which registers the nodes
|
||||
-- @param name The name of the creature; Has to be unique
|
||||
-- @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
|
||||
-- - flying Movement behaviour
|
||||
-- - *_textures (See examples)
|
||||
-- @return True if successful
|
||||
worm.register_worm = function (modname, name, data)
|
||||
-- default values:
|
||||
if not data.leftover then
|
||||
data.leftover = "air"
|
||||
end
|
||||
if not data.walking_steps then
|
||||
data.walking_steps = worm.config.DEFAULT_WALKING_STEPS
|
||||
end
|
||||
if not data.can_move then
|
||||
data.can_move = function(_, node)
|
||||
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
|
||||
if not data.bottem_texture then
|
||||
data.bottem_texture = data.side_texture
|
||||
end
|
||||
if not data.top_texture then
|
||||
data.top_texture = data.side_texture
|
||||
end
|
||||
if not data.left_texture then
|
||||
data.left_texture = data.side_texture
|
||||
end
|
||||
if not data.inventory_image then
|
||||
data.inventory_image = data.face_texture
|
||||
end
|
||||
if not data.spawn_in then
|
||||
data.spawn_in = "air"
|
||||
end
|
||||
-- Definition of the spawn item
|
||||
minetest.register_craftitem(modname..":"..name.."_spawnegg", {
|
||||
description = "spawn "..name,
|
||||
inventory_image = data.inventory_image,
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
if pointed_thing.type ~= "node" then
|
||||
return itemstack
|
||||
end
|
||||
local pos = pointed_thing.above
|
||||
local player_name = user:get_player_name()
|
||||
if minetest.is_protected(pos, player_name) then
|
||||
return itemstack
|
||||
end
|
||||
if minetest.get_node(pos).name ~= data.spawn_in then
|
||||
return itemstack
|
||||
end
|
||||
local zero = {x = 0, y = 0, z = 0}
|
||||
local player_dir = vector.subtract(zero, user:get_look_dir())
|
||||
local facedir = minetest.dir_to_facedir(player_dir)
|
||||
local dir = minetest.facedir_to_dir(facedir)
|
||||
local length = itemstack:get_count()
|
||||
minetest.set_node(pos, {
|
||||
name = modname..":"..name.."_head_1",
|
||||
param2 = facedir
|
||||
})
|
||||
local headtimer = minetest.get_node_timer(pos)
|
||||
pos = vector.subtract(pos, dir)
|
||||
local i = 0
|
||||
while i < length do
|
||||
if minetest.get_node(pos).name ~= data.spawn_in or
|
||||
(worm.config.TAIL_PROTECTION and minetest.is_protected(pos, player_name)) then
|
||||
pos = vector.add(pos, dir)
|
||||
minetest.set_node(pos, {
|
||||
name = modname..":"..name.."_tail_1",
|
||||
param2 = facedir
|
||||
})
|
||||
break
|
||||
end
|
||||
minetest.set_node(pos, {
|
||||
name = modname..":"..name.."_body",
|
||||
param2 = facedir
|
||||
})
|
||||
pos = vector.subtract(pos, dir)
|
||||
i = i + 1
|
||||
end
|
||||
minetest.set_node(pos, {
|
||||
name = modname..":"..name.."_tail_1",
|
||||
param2 = facedir
|
||||
})
|
||||
local tailtimer = minetest.get_node_timer(pos)
|
||||
headtimer:set(WALKING_PERIOD, 0)
|
||||
tailtimer:set(WALKING_PERIOD, 0)
|
||||
itemstack:take_item(i)
|
||||
return itemstack
|
||||
end,
|
||||
})
|
||||
|
||||
-- Definition of head nodes
|
||||
for n = 1, data.walking_steps do
|
||||
-- Called on nodetimer
|
||||
-- Incomplete head -> Update the head
|
||||
local step = function(pos, _)
|
||||
local node = minetest.get_node(pos)
|
||||
node.name = modname..":"..name.."_head_"..(n+1)
|
||||
minetest.set_node(pos, node)
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
return false
|
||||
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
|
||||
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
|
||||
return true
|
||||
end
|
||||
end
|
||||
local drawtype
|
||||
if data.walking_steps > 1 then
|
||||
drawtype = "nodebox"
|
||||
end
|
||||
minetest.register_node(modname..":"..name.."_head_"..n, {
|
||||
description = name.." head",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drawtype = drawtype,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5 + (1 / data.walking_steps) * n},
|
||||
},
|
||||
},
|
||||
tiles = {
|
||||
data.top_texture.."^[transform1",
|
||||
data.bottem_texture.."^[transform3",
|
||||
data.side_texture,
|
||||
data.left_texture.."^[transform2",
|
||||
data.face_texture,
|
||||
data.side_texture
|
||||
},
|
||||
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
|
||||
damage_per_second = 10,
|
||||
on_timer = step,
|
||||
drop = "",
|
||||
})
|
||||
end
|
||||
|
||||
-- Definition of the body node
|
||||
minetest.register_node(modname..":"..name.."_body", {
|
||||
description = name.." body part",
|
||||
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
|
||||
},
|
||||
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
|
||||
-- Add a new tail to keep demolition
|
||||
after_dig_node = function(pos, node, _, _)
|
||||
local newpos = vector.add(pos, minetest.facedir_to_dir(node.param2))
|
||||
local newnode = minetest.get_node(newpos)
|
||||
if newnode.name == modname..":"..name.."_body" then
|
||||
newnode.name = modname..":"..name.."_tail_1"
|
||||
minetest.set_node(newpos, newnode)
|
||||
local timer = minetest.get_node_timer(newpos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
elseif newnode.name:find(modname..":"..name.."_head") == 1 then
|
||||
newnode.name = "air"
|
||||
minetest.set_node(newpos, newnode)
|
||||
end
|
||||
end,
|
||||
drop = modname..":"..name.."_spawnegg",
|
||||
})
|
||||
|
||||
-- Definition of tail nodes
|
||||
for n = 1, data.walking_steps do
|
||||
-- Called on nodetimer
|
||||
-- Non empty tail -> update the tail
|
||||
local step = function(pos, _)
|
||||
local node = minetest.get_node(pos)
|
||||
node.name = modname..":"..name.."_tail_"..(n+1)
|
||||
minetest.set_node(pos, node)
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
return false
|
||||
end
|
||||
-- Empty tail -> Update the head
|
||||
if n == data.walking_steps then
|
||||
step = function(pos, elapsed)
|
||||
local node = minetest.get_node(pos)
|
||||
local facedir = node.param2
|
||||
local newpos = vector.add(pos, minetest.facedir_to_dir(facedir))
|
||||
local newnode = minetest.get_node(newpos)
|
||||
if newnode.name == modname..":"..name.."_body" then
|
||||
newnode.name = modname..":"..name.."_tail_1"
|
||||
minetest.set_node(newpos, newnode)
|
||||
local timer = minetest.get_node_timer(newpos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
elseif newnode.name:find(modname..":"..name.."_head") == 1 then
|
||||
minetest.set_node(newpos, {name = "air"})
|
||||
end
|
||||
minetest.set_node(pos, {name = data.leftover})
|
||||
return false
|
||||
end
|
||||
end
|
||||
local drawtype
|
||||
if data.walking_steps > 1 then
|
||||
drawtype = "nodebox"
|
||||
end
|
||||
minetest.register_node(modname..":"..name.."_tail_"..n, {
|
||||
description = name.." tail",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drawtype = drawtype,
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -0.5, -0.5, -0.5 + (1 / data.walking_steps) * (n - 1), 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
tiles = {
|
||||
data.top_texture.."^[transform1",
|
||||
data.bottem_texture.."^[transform3",
|
||||
data.side_texture,
|
||||
data.left_texture.."^[transform2",
|
||||
data.side_texture,
|
||||
data.tail_texture
|
||||
},
|
||||
on_timer = step,
|
||||
after_dig_node = function(pos, node, _, _)
|
||||
local newpos = vector.add(pos, minetest.facedir_to_dir(node.param2))
|
||||
local newnode = minetest.get_node(newpos)
|
||||
if newnode.name == modname..":"..name.."_body" then
|
||||
newnode.name = modname..":"..name.."_tail_1"
|
||||
minetest.set_node(newpos, newnode)
|
||||
local timer = minetest.get_node_timer(newpos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
elseif newnode.name:find(modname..":"..name.."_head") == 1 then
|
||||
newnode.name = "air"
|
||||
minetest.set_node(newpos, newnode)
|
||||
end
|
||||
end,
|
||||
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
|
||||
drop = "",
|
||||
})
|
||||
end
|
||||
return true
|
||||
end
|
|
@ -0,0 +1,2 @@
|
|||
default?
|
||||
flowers?
|
|
@ -0,0 +1,51 @@
|
|||
-- 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,
|
||||
})
|
||||
|
||||
-- Snake
|
||||
worm.register_worm("worm", "snake", {
|
||||
face_texture = "snake_face.png",
|
||||
side_texture = "snake_side.png",
|
||||
tail_texture = "snake_tail.png",
|
||||
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,
|
||||
})
|
||||
|
||||
-- Eel
|
||||
local spawn_in = "air"
|
||||
if default then
|
||||
spawn_in = "default:water_source"
|
||||
end
|
||||
worm.register_worm("worm", "eel", {
|
||||
leftover = "mapgen_water_source",
|
||||
spawn_in = spawn_in,
|
||||
walking_steps = 1,
|
||||
face_texture = "eel_face.png",
|
||||
side_texture = "eel_side.png",
|
||||
left_texture = "eel_side.png^[transform6",
|
||||
tail_texture = "eel_tail.png",
|
||||
top_texture = "eel_top.png",
|
||||
bottem_texture = "eel_bottem.png",
|
||||
can_move = function(_, node)
|
||||
return minetest.get_node_group(node.name, "water") > 0
|
||||
end,
|
||||
flying = true,
|
||||
})
|
279
init.lua
|
@ -1,275 +1,18 @@
|
|||
-- Minetest Worm Mod
|
||||
-- by Gerald
|
||||
|
||||
local WALKING_PERIOD = 1
|
||||
worm = {}
|
||||
worm.config = {}
|
||||
|
||||
worm.config.WALKING_PERIOD = 1
|
||||
-- Time of a step in seconds, values < 1 are not faster
|
||||
local DEFAULT_WALKING_STEPS = 4
|
||||
worm.config.DEFAULT_WALKING_STEPS = 4
|
||||
-- Number of steps to pass one node, needs to be bigger than 0
|
||||
local TAIL_PROTECTION = false
|
||||
worm.config.TAIL_PROTECTION = false
|
||||
-- If false check for protection on spawning only at head position
|
||||
|
||||
local MODNAME = "worm"
|
||||
worm = {}
|
||||
|
||||
-- Defines a "worm" (spawnitem and nodes)
|
||||
-- @param modname The name of the mod, which registers the nodes
|
||||
-- @param name The name of the creature; Has to be unique
|
||||
-- @param 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 -> Boolean) defining which nodes
|
||||
-- can be destroyed by the worm
|
||||
worm.register_worm = function (modname, name, leftover, face_texture,
|
||||
side_texture, tail_texture, walking_steps, can_move)
|
||||
-- Definition of the spawn item
|
||||
minetest.register_craftitem(modname..":"..name.."_spawnegg", {
|
||||
description = "spawn "..name,
|
||||
inventory_image = face_texture,
|
||||
on_use = function(itemstack, user, pointed_thing)
|
||||
if pointed_thing.type ~= "node" then
|
||||
return itemstack
|
||||
end
|
||||
local pos = pointed_thing.above
|
||||
local player_name = user:get_player_name()
|
||||
if minetest.is_protected(pos, player_name) then
|
||||
return itemstack
|
||||
end
|
||||
if minetest.get_node(pos).name ~= "air" then
|
||||
return itemstack
|
||||
end
|
||||
local zero = {x = 0, y = 0, z = 0}
|
||||
local player_dir = vector.subtract(zero, user:get_look_dir())
|
||||
local facedir = minetest.dir_to_facedir(player_dir)
|
||||
local dir = minetest.facedir_to_dir(facedir)
|
||||
local length = itemstack:get_count()
|
||||
minetest.set_node(pos, {
|
||||
name = modname..":"..name.."_head_1",
|
||||
param2 = facedir
|
||||
})
|
||||
local headtimer = minetest.get_node_timer(pos)
|
||||
pos = vector.subtract(pos, dir)
|
||||
local i = 0
|
||||
while i < length do
|
||||
if minetest.get_node(pos).name ~= "air" or
|
||||
(TAIL_PROTECTION and minetest.is_protected(pos, player_name)) then
|
||||
pos = vector.add(pos, dir)
|
||||
minetest.set_node(pos, {
|
||||
name = modname..":"..name.."_tail_1",
|
||||
param2 = facedir
|
||||
})
|
||||
break
|
||||
end
|
||||
minetest.set_node(pos, {
|
||||
name = modname..":"..name.."_body",
|
||||
param2 = facedir
|
||||
})
|
||||
pos = vector.subtract(pos, dir)
|
||||
i = i + 1
|
||||
end
|
||||
minetest.set_node(pos, {
|
||||
name = modname..":"..name.."_tail_1",
|
||||
param2 = facedir
|
||||
})
|
||||
local tailtimer = minetest.get_node_timer(pos)
|
||||
headtimer:set(WALKING_PERIOD, 0)
|
||||
tailtimer:set(WALKING_PERIOD, 0)
|
||||
itemstack:take_item(i)
|
||||
return itemstack
|
||||
end,
|
||||
})
|
||||
|
||||
-- Definition of head nodes
|
||||
for n = 1, walking_steps do
|
||||
-- Called on nodetimer
|
||||
-- Incomplete head -> Update the head
|
||||
local step = function(pos, _)
|
||||
local node = minetest.get_node(pos)
|
||||
node.name = modname..":"..name.."_head_"..(n+1)
|
||||
minetest.set_node(pos, node)
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
return false
|
||||
end
|
||||
-- Complete head -> Move head to a different position
|
||||
if n == walking_steps then
|
||||
step = function(pos, _)
|
||||
local node = minetest.get_node(pos)
|
||||
local facedir = node.param2
|
||||
local dirs = { -- Hierarchy of preferred directions
|
||||
4,
|
||||
facedir % 4, -- 4 -> 0
|
||||
(facedir + 1) % 4,
|
||||
(facedir + 2) % 4,
|
||||
(facedir + 3) % 4,
|
||||
8
|
||||
}
|
||||
for i = 1, 6 do
|
||||
local newpos = vector.add(pos, minetest.facedir_to_dir(dirs[i]))
|
||||
if can_move(newpos) 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
|
||||
return true
|
||||
end
|
||||
end
|
||||
minetest.register_node(modname..":"..name.."_head_"..n, {
|
||||
description = name.." head",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5 + (1 / walking_steps) * n},
|
||||
},
|
||||
},
|
||||
tiles = {
|
||||
side_texture.."^[transform1",
|
||||
side_texture.."^[transform3",
|
||||
side_texture,
|
||||
side_texture.."^[transform2",
|
||||
face_texture,
|
||||
side_texture
|
||||
},
|
||||
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
|
||||
damage_per_second = 10,
|
||||
on_timer = step,
|
||||
drop = "",
|
||||
})
|
||||
end
|
||||
|
||||
-- Definition of the body node
|
||||
minetest.register_node(modname..":"..name.."_body", {
|
||||
description = name.." body part",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
tiles = {
|
||||
side_texture.."^[transform1",
|
||||
side_texture.."^[transform3",
|
||||
side_texture,
|
||||
side_texture.."^[transform2",
|
||||
side_texture,
|
||||
side_texture
|
||||
},
|
||||
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
|
||||
-- Add a new tail to keep demolition
|
||||
after_dig_node = function(pos, node, _, _)
|
||||
local newpos = vector.add(pos, minetest.facedir_to_dir(node.param2))
|
||||
local newnode = minetest.get_node(newpos)
|
||||
if newnode.name == modname..":"..name.."_body" then
|
||||
newnode.name = modname..":"..name.."_tail_1"
|
||||
minetest.set_node(newpos, newnode)
|
||||
local timer = minetest.get_node_timer(newpos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
elseif newnode.name:find(modname..":"..name.."_head") == 1 then
|
||||
newnode.name = "air"
|
||||
minetest.set_node(newpos, newnode)
|
||||
end
|
||||
end,
|
||||
drop = "",
|
||||
})
|
||||
|
||||
-- Definition of tail nodes
|
||||
for n = 1, walking_steps do
|
||||
-- Called on nodetimer
|
||||
-- Non empty tail -> update the tail
|
||||
local step = function(pos, _)
|
||||
local node = minetest.get_node(pos)
|
||||
node.name = modname..":"..name.."_tail_"..(n+1)
|
||||
minetest.set_node(pos, node)
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
return false
|
||||
end
|
||||
-- Empty tail -> Update the head
|
||||
if n == walking_steps then
|
||||
step = function(pos, elapsed)
|
||||
local node = minetest.get_node(pos)
|
||||
local facedir = node.param2
|
||||
local newpos = vector.add(pos, minetest.facedir_to_dir(facedir))
|
||||
local newnode = minetest.get_node(newpos)
|
||||
if newnode.name == modname..":"..name.."_body" then
|
||||
newnode.name = modname..":"..name.."_tail_1"
|
||||
minetest.set_node(newpos, newnode)
|
||||
local timer = minetest.get_node_timer(newpos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
elseif newnode.name:find(modname..":"..name.."_head") == 1 then
|
||||
minetest.set_node(newpos, {name = "air"})
|
||||
end
|
||||
minetest.set_node(pos, {name = leftover})
|
||||
return false
|
||||
end
|
||||
end
|
||||
minetest.register_node(modname..":"..name.."_tail_"..n, {
|
||||
description = name.." tail",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -0.5, -0.5, -0.5 + (1 / walking_steps) * (n - 1), 0.5, 0.5, 0.5},
|
||||
},
|
||||
},
|
||||
tiles = {
|
||||
side_texture.."^[transform1",
|
||||
side_texture.."^[transform3",
|
||||
side_texture,
|
||||
side_texture.."^[transform2",
|
||||
side_texture,
|
||||
tail_texture
|
||||
},
|
||||
on_timer = step,
|
||||
after_dig_node = function(pos, node, _, _)
|
||||
local newpos = vector.add(pos, minetest.facedir_to_dir(node.param2))
|
||||
local newnode = minetest.get_node(newpos)
|
||||
if newnode.name == modname..":"..name.."_body" then
|
||||
newnode.name = modname..":"..name.."_tail_1"
|
||||
minetest.set_node(newpos, newnode)
|
||||
local timer = minetest.get_node_timer(newpos)
|
||||
timer:set(WALKING_PERIOD, 0)
|
||||
elseif newnode.name:find(modname..":"..name.."_head") == 1 then
|
||||
newnode.name = "air"
|
||||
minetest.set_node(newpos, newnode)
|
||||
end
|
||||
end,
|
||||
groups = {snappy = 1, level = 2, not_in_creative_inventory = 1},
|
||||
drop = "",
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
worm.register_worm(MODNAME, "worm",
|
||||
"mapgen_dirt",
|
||||
"worm_face.png",
|
||||
"worm_side.png",
|
||||
"worm_tail.png",
|
||||
DEFAULT_WALKING_STEPS,
|
||||
function(pos)
|
||||
local name = minetest.get_node(pos).name
|
||||
return minetest.registered_nodes[name].buildable_to or
|
||||
minetest.get_node_group(name, "crumbly") >= 3
|
||||
end
|
||||
)
|
||||
|
||||
worm.register_worm(MODNAME, "snake",
|
||||
"air",
|
||||
"snake_face.png",
|
||||
"snake_side.png",
|
||||
"snake_tail.png",
|
||||
DEFAULT_WALKING_STEPS,
|
||||
function(pos)
|
||||
return minetest.registered_nodes[minetest.get_node(pos).name].buildable_to
|
||||
end
|
||||
)
|
||||
local path = minetest.get_modpath("worm")
|
||||
dofile(path.."/api.lua")
|
||||
dofile(path.."/examples.lua")
|
||||
dofile(path.."/swallowable_nodes.lua")
|
||||
dofile(path.."/mapgen.lua")
|
||||
|
|
|
@ -0,0 +1,89 @@
|
|||
-- Marked mapgen nodes
|
||||
local mapgen_node = {
|
||||
description = "worm mapgen node",
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "airlike",
|
||||
groups = {not_in_creative_inventory = 1, worm_mapgen = 1},
|
||||
}
|
||||
minetest.register_node("worm:snake_head_1_mapgen", mapgen_node)
|
||||
minetest.register_node("worm:snake_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)
|
||||
minetest.register_node("worm:eel_tail_1_mapgen", mapgen_node)
|
||||
|
||||
-- Replace mapgen nodes by real ones and initialize the node timer.
|
||||
minetest.register_lbm({
|
||||
name = "worm:init_nodetimers_mapgen",
|
||||
nodenames = "group:worm_mapgen",
|
||||
run_at_every_load = true,
|
||||
action = function(pos, node)
|
||||
node.name = node.name:sub(1, -8)
|
||||
print("[worm]"..node.name.." spawned at "..pos.x..", "..pos.y..", "..pos.z)
|
||||
minetest.swap_node(pos, node)
|
||||
local timer = minetest.get_node_timer(pos)
|
||||
timer:set(worm.config.WALKING_PERIOD, 0)
|
||||
end,
|
||||
})
|
||||
|
||||
-- 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_head_1_mapgen", param1=255, param2=3, force_place = true},
|
||||
{name="worm:snake_body", param1=255, param2=3, force_place = true},
|
||||
{name="worm:snake_body", param1=255, param2=3, force_place = true},
|
||||
{name="worm:snake_tail_1_mapgen", param1=255, param2=3, force_place = true},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
-- Worm
|
||||
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:worm_head_1_mapgen", param1=255, param2=3, force_place = true},
|
||||
{name="worm:worm_body", param1=255, param2=3, force_place = true},
|
||||
{name="worm:worm_body", param1=255, param2=3, force_place = true},
|
||||
{name="worm:worm_tail_1_mapgen", param1=255, param2=3, force_place = true},
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
-- Eel
|
||||
minetest.register_decoration({
|
||||
deco_type = "schematic",
|
||||
place_on = "mapgen_water_source",
|
||||
flags = "liquid_surface, place_center_y",
|
||||
sidelen = 16,
|
||||
fill_ratio = 0.0002,
|
||||
schematic = {
|
||||
size = {x=4, y=3, z=1},
|
||||
data = {
|
||||
{name="worm:eel_head_1_mapgen", param1=255, param2=3, force_place = true},
|
||||
{name="worm:eel_body", param1=255, param2=3, force_place = true},
|
||||
{name="worm:eel_body", param1=255, param2=3, force_place = true},
|
||||
{name="worm:eel_tail_1_mapgen", param1=255, param2=3, force_place = true},
|
||||
{name="ignore", param1=0, param2=0},
|
||||
{name="ignore", param1=0, param2=0},
|
||||
{name="ignore", param1=0, param2=0},
|
||||
{name="ignore", param1=0, param2=0},
|
||||
{name="ignore", param1=0, param2=0},
|
||||
{name="ignore", param1=0, param2=0},
|
||||
{name="ignore", param1=0, param2=0},
|
||||
{name="ignore", param1=0, param2=0},
|
||||
},
|
||||
},
|
||||
rotation = "random",
|
||||
})
|
|
@ -0,0 +1,15 @@
|
|||
if default then
|
||||
local groups = minetest.registered_nodes["default:apple"].groups
|
||||
groups.swallowable = 1
|
||||
minetest.override_item("default:apple", {
|
||||
groups = groups,
|
||||
})
|
||||
end
|
||||
|
||||
if flowers then
|
||||
local groups = minetest.registered_nodes["flowers:mushroom_brown"].groups
|
||||
groups.swallowable = 1
|
||||
minetest.override_item("flowers:mushroom_brown", {
|
||||
groups = groups,
|
||||
})
|
||||
end
|
After Width: | Height: | Size: 182 B |
After Width: | Height: | Size: 344 B |
After Width: | Height: | Size: 234 B |
After Width: | Height: | Size: 171 B |
After Width: | Height: | Size: 181 B |
After Width: | Height: | Size: 204 B |
After Width: | Height: | Size: 137 B |