mirror of
https://codeberg.org/tenplus1/mobs_redo.git
synced 2025-01-08 08:50:20 +01:00
tidy and tweak code, implement sound check for mineclon*
This commit is contained in:
parent
bc6b8931da
commit
a8297e6a8e
172
crafts.lua
172
crafts.lua
@ -1,9 +1,31 @@
|
|||||||
|
|
||||||
local S = mobs.translate
|
local S = minetest.get_translator("mobs")
|
||||||
local FS = function(...) return minetest.formspec_escape(S(...)) end
|
local FS = function(...) return minetest.formspec_escape(S(...)) end
|
||||||
local mc2 = minetest.get_modpath("mcl_core")
|
local mc2 = minetest.get_modpath("mcl_core")
|
||||||
|
local mod_def = minetest.get_modpath("default")
|
||||||
|
|
||||||
|
-- determine which sounds to use, default or mcl_sounds
|
||||||
|
|
||||||
|
local function sound_helper(snd)
|
||||||
|
|
||||||
|
mobs[snd] = (mod_def and default[snd]) or (mc2 and mcl_sounds[snd])
|
||||||
|
or function() return {} end
|
||||||
|
end
|
||||||
|
|
||||||
|
sound_helper("node_sound_defaults")
|
||||||
|
sound_helper("node_sound_stone_defaults")
|
||||||
|
sound_helper("node_sound_dirt_defaults")
|
||||||
|
sound_helper("node_sound_sand_defaults")
|
||||||
|
sound_helper("node_sound_gravel_defaults")
|
||||||
|
sound_helper("node_sound_wood_defaults")
|
||||||
|
sound_helper("node_sound_leaves_defaults")
|
||||||
|
sound_helper("node_sound_ice_defaults")
|
||||||
|
sound_helper("node_sound_metal_defaults")
|
||||||
|
sound_helper("node_sound_water_defaults")
|
||||||
|
sound_helper("node_sound_snow_defaults")
|
||||||
|
|
||||||
-- helper function to add {eatable} group to food items
|
-- helper function to add {eatable} group to food items
|
||||||
|
|
||||||
function mobs.add_eatable(item, hp)
|
function mobs.add_eatable(item, hp)
|
||||||
|
|
||||||
local def = minetest.registered_items[item]
|
local def = minetest.registered_items[item]
|
||||||
@ -19,6 +41,7 @@ function mobs.add_eatable(item, hp)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- recipe items
|
-- recipe items
|
||||||
|
|
||||||
local items = {
|
local items = {
|
||||||
paper = mc2 and "mcl_core:paper" or "default:paper",
|
paper = mc2 and "mcl_core:paper" or "default:paper",
|
||||||
dye_black = mc2 and "mcl_dye:black" or "dye:black",
|
dye_black = mc2 and "mcl_dye:black" or "dye:black",
|
||||||
@ -36,8 +59,8 @@ local items = {
|
|||||||
meat_cooked = mc2 and "mcl_mobitems:cooked_beef" or "group:food_meat",
|
meat_cooked = mc2 and "mcl_mobitems:cooked_beef" or "group:food_meat",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
-- name tag
|
-- name tag
|
||||||
|
|
||||||
minetest.register_craftitem("mobs:nametag", {
|
minetest.register_craftitem("mobs:nametag", {
|
||||||
description = S("Name Tag") .. " " .. S("\nRight-click Mobs Redo mob to apply"),
|
description = S("Name Tag") .. " " .. S("\nRight-click Mobs Redo mob to apply"),
|
||||||
inventory_image = "mobs_nametag.png",
|
inventory_image = "mobs_nametag.png",
|
||||||
@ -52,6 +75,7 @@ minetest.register_craft({
|
|||||||
})
|
})
|
||||||
|
|
||||||
-- leather
|
-- leather
|
||||||
|
|
||||||
minetest.register_craftitem("mobs:leather", {
|
minetest.register_craftitem("mobs:leather", {
|
||||||
description = S("Leather"),
|
description = S("Leather"),
|
||||||
inventory_image = "mobs_leather.png",
|
inventory_image = "mobs_leather.png",
|
||||||
@ -59,6 +83,7 @@ minetest.register_craftitem("mobs:leather", {
|
|||||||
})
|
})
|
||||||
|
|
||||||
-- raw meat
|
-- raw meat
|
||||||
|
|
||||||
minetest.register_craftitem("mobs:meat_raw", {
|
minetest.register_craftitem("mobs:meat_raw", {
|
||||||
description = S("Raw Meat"),
|
description = S("Raw Meat"),
|
||||||
inventory_image = "mobs_meat_raw.png",
|
inventory_image = "mobs_meat_raw.png",
|
||||||
@ -69,6 +94,7 @@ minetest.register_craftitem("mobs:meat_raw", {
|
|||||||
mobs.add_eatable("mobs:meat_raw", 3)
|
mobs.add_eatable("mobs:meat_raw", 3)
|
||||||
|
|
||||||
-- cooked meat
|
-- cooked meat
|
||||||
|
|
||||||
minetest.register_craftitem("mobs:meat", {
|
minetest.register_craftitem("mobs:meat", {
|
||||||
description = S("Meat"),
|
description = S("Meat"),
|
||||||
inventory_image = "mobs_meat.png",
|
inventory_image = "mobs_meat.png",
|
||||||
@ -86,6 +112,7 @@ minetest.register_craft({
|
|||||||
})
|
})
|
||||||
|
|
||||||
-- lasso
|
-- lasso
|
||||||
|
|
||||||
minetest.register_tool("mobs:lasso", {
|
minetest.register_tool("mobs:lasso", {
|
||||||
description = S("Lasso (right-click animal to put in inventory)"),
|
description = S("Lasso (right-click animal to put in inventory)"),
|
||||||
inventory_image = "mobs_magic_lasso.png",
|
inventory_image = "mobs_magic_lasso.png",
|
||||||
@ -104,6 +131,7 @@ minetest.register_craft({
|
|||||||
minetest.register_alias("mobs:magic_lasso", "mobs:lasso")
|
minetest.register_alias("mobs:magic_lasso", "mobs:lasso")
|
||||||
|
|
||||||
-- net
|
-- net
|
||||||
|
|
||||||
minetest.register_tool("mobs:net", {
|
minetest.register_tool("mobs:net", {
|
||||||
description = S("Net (right-click animal to put in inventory)"),
|
description = S("Net (right-click animal to put in inventory)"),
|
||||||
inventory_image = "mobs_net.png",
|
inventory_image = "mobs_net.png",
|
||||||
@ -120,6 +148,7 @@ minetest.register_craft({
|
|||||||
})
|
})
|
||||||
|
|
||||||
-- shears (right click to shear animal)
|
-- shears (right click to shear animal)
|
||||||
|
|
||||||
minetest.register_tool("mobs:shears", {
|
minetest.register_tool("mobs:shears", {
|
||||||
description = S("Steel Shears (right-click to shear)"),
|
description = S("Steel Shears (right-click to shear)"),
|
||||||
inventory_image = "mobs_shears.png",
|
inventory_image = "mobs_shears.png",
|
||||||
@ -135,6 +164,7 @@ minetest.register_craft({
|
|||||||
})
|
})
|
||||||
|
|
||||||
-- protection rune
|
-- protection rune
|
||||||
|
|
||||||
minetest.register_craftitem("mobs:protector", {
|
minetest.register_craftitem("mobs:protector", {
|
||||||
description = S("Mob Protection Rune"),
|
description = S("Mob Protection Rune"),
|
||||||
inventory_image = "mobs_protector.png",
|
inventory_image = "mobs_protector.png",
|
||||||
@ -150,7 +180,8 @@ minetest.register_craft({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
-- level 2 protection rune
|
-- protection rune (level 2)
|
||||||
|
|
||||||
minetest.register_craftitem("mobs:protector2", {
|
minetest.register_craftitem("mobs:protector2", {
|
||||||
description = S("Mob Protection Rune (Level 2)"),
|
description = S("Mob Protection Rune (Level 2)"),
|
||||||
inventory_image = "mobs_protector2.png",
|
inventory_image = "mobs_protector2.png",
|
||||||
@ -167,6 +198,7 @@ minetest.register_craft({
|
|||||||
})
|
})
|
||||||
|
|
||||||
-- saddle
|
-- saddle
|
||||||
|
|
||||||
minetest.register_craftitem("mobs:saddle", {
|
minetest.register_craftitem("mobs:saddle", {
|
||||||
description = S("Saddle"),
|
description = S("Saddle"),
|
||||||
inventory_image = "mobs_saddle.png",
|
inventory_image = "mobs_saddle.png",
|
||||||
@ -182,29 +214,25 @@ minetest.register_craft({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
-- register mob fence if default found
|
||||||
-- make sure we can register fences
|
|
||||||
local mod_def = minetest.get_modpath("default")
|
|
||||||
|
|
||||||
if mod_def and default.register_fence then
|
if mod_def and default.register_fence then
|
||||||
|
|
||||||
-- mob fence (looks like normal fence but collision is 2 high)
|
-- mob fence (looks like normal fence but collision is 2 high)
|
||||||
default.register_fence("mobs:fence_wood", {
|
default.register_fence("mobs:fence_wood", {
|
||||||
description = S("Mob Fence"),
|
description = S("Mob Fence"),
|
||||||
texture = "default_wood.png",
|
texture = "default_wood.png",
|
||||||
material = "default:fence_wood",
|
material = "default:fence_wood",
|
||||||
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
|
||||||
sounds = mod_def and default.node_sound_wood_defaults(),
|
sounds = mobs.node_sound_wood_defaults(),
|
||||||
collision_box = {
|
collision_box = {
|
||||||
type = "fixed",
|
type = "fixed", fixed = {{-0.5, -0.5, -0.5, 0.5, 1.9, 0.5}}
|
||||||
fixed = {
|
|
||||||
{-0.5, -0.5, -0.5, 0.5, 1.9, 0.5},
|
|
||||||
}
|
}
|
||||||
}
|
})
|
||||||
})
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- mob fence top (has enlarged collisionbox to stop mobs getting over)
|
-- mob fence top (has enlarged collisionbox to stop mobs getting over)
|
||||||
|
|
||||||
minetest.register_node("mobs:fence_top", {
|
minetest.register_node("mobs:fence_top", {
|
||||||
description = S("Mob Fence Top"),
|
description = S("Mob Fence Top"),
|
||||||
drawtype = "nodebox",
|
drawtype = "nodebox",
|
||||||
@ -212,19 +240,10 @@ minetest.register_node("mobs:fence_top", {
|
|||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, axey = 1},
|
groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, axey = 1},
|
||||||
sounds = mod_def and default.node_sound_wood_defaults(),
|
sounds = mobs.node_sound_wood_defaults(),
|
||||||
node_box = {
|
node_box = {type = "fixed", fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}},
|
||||||
type = "fixed",
|
collision_box = {type = "fixed", fixed = {-0.4, -1.5, -0.4, 0.4, 0, 0.4}},
|
||||||
fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2}
|
selection_box = {type = "fixed", fixed = {-0.4, -1.5, -0.4, 0.4, 0, 0.4}}
|
||||||
},
|
|
||||||
collision_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-0.4, -1.5, -0.4, 0.4, 0, 0.4}
|
|
||||||
},
|
|
||||||
selection_box = {
|
|
||||||
type = "fixed",
|
|
||||||
fixed = {-0.4, -1.5, -0.4, 0.4, 0, 0.4}
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
@ -235,49 +254,15 @@ minetest.register_craft({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
-- items that can be used as fuel
|
-- items that can be used as fuel
|
||||||
minetest.register_craft({
|
|
||||||
type = "fuel",
|
|
||||||
recipe = "mobs:nametag",
|
|
||||||
burntime = 3
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({type = "fuel", recipe = "mobs:nametag", burntime = 3})
|
||||||
type = "fuel",
|
minetest.register_craft({type = "fuel", recipe = "mobs:lasso", burntime = 7})
|
||||||
recipe = "mobs:lasso",
|
minetest.register_craft({type = "fuel", recipe = "mobs:net", burntime = 8})
|
||||||
burntime = 7
|
minetest.register_craft({type = "fuel", recipe = "mobs:leather", burntime = 4})
|
||||||
})
|
minetest.register_craft({type = "fuel", recipe = "mobs:saddle", burntime = 7})
|
||||||
|
minetest.register_craft({type = "fuel", recipe = "mobs:fence_wood", burntime = 7})
|
||||||
minetest.register_craft({
|
minetest.register_craft({type = "fuel", recipe = "mobs:fence_top", burntime = 2})
|
||||||
type = "fuel",
|
|
||||||
recipe = "mobs:net",
|
|
||||||
burntime = 8
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "fuel",
|
|
||||||
recipe = "mobs:leather",
|
|
||||||
burntime = 4
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "fuel",
|
|
||||||
recipe = "mobs:saddle",
|
|
||||||
burntime = 7
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "fuel",
|
|
||||||
recipe = "mobs:fence_wood",
|
|
||||||
burntime = 7
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft({
|
|
||||||
type = "fuel",
|
|
||||||
recipe = "mobs:fence_top",
|
|
||||||
burntime = 2
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
-- this tool spawns same mob and adds owner, protected, nametag info
|
-- this tool spawns same mob and adds owner, protected, nametag info
|
||||||
@ -294,12 +279,9 @@ minetest.register_tool(":mobs:mob_reset_stick", {
|
|||||||
|
|
||||||
on_use = function(itemstack, user, pointed_thing)
|
on_use = function(itemstack, user, pointed_thing)
|
||||||
|
|
||||||
if pointed_thing.type ~= "object" then
|
if pointed_thing.type ~= "object" then return end
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local obj = pointed_thing.ref
|
local obj = pointed_thing.ref
|
||||||
|
|
||||||
local control = user:get_player_control()
|
local control = user:get_player_control()
|
||||||
local sneak = control and control.sneak
|
local sneak = control and control.sneak
|
||||||
|
|
||||||
@ -339,9 +321,7 @@ minetest.register_tool(":mobs:mob_reset_stick", {
|
|||||||
-- get base texture
|
-- get base texture
|
||||||
local bt = tex_obj:get_luaentity().base_texture[1]
|
local bt = tex_obj:get_luaentity().base_texture[1]
|
||||||
|
|
||||||
if type(bt) ~= "string" then
|
if type(bt) ~= "string" then bt = "" end
|
||||||
bt = ""
|
|
||||||
end
|
|
||||||
|
|
||||||
local name = user:get_player_name()
|
local name = user:get_player_name()
|
||||||
|
|
||||||
@ -357,27 +337,18 @@ minetest.register_tool(":mobs:mob_reset_stick", {
|
|||||||
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||||
|
|
||||||
-- right-clicked with nametag and name entered?
|
-- right-clicked with nametag and name entered?
|
||||||
if formname == "mobs_texture"
|
if formname == "mobs_texture" and fields.name and fields.name ~= "" then
|
||||||
and fields.name
|
|
||||||
and fields.name ~= "" then
|
|
||||||
|
|
||||||
-- does mob still exist?
|
-- does mob still exist?
|
||||||
if not tex_obj
|
if not tex_obj or not tex_obj:get_luaentity() then return end
|
||||||
or not tex_obj:get_luaentity() then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- make sure nametag is being used to name mob
|
-- make sure nametag is being used to name mob
|
||||||
local item = player:get_wielded_item()
|
local item = player:get_wielded_item()
|
||||||
|
|
||||||
if item:get_name() ~= "mobs:mob_reset_stick" then
|
if item:get_name() ~= "mobs:mob_reset_stick" then return end
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- limit name entered to 64 characters long
|
-- limit name entered to 64 characters long
|
||||||
if fields.name:len() > 64 then
|
if fields.name:len() > 64 then fields.name = fields.name:sub(1, 64) end
|
||||||
fields.name = fields.name:sub(1, 64)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- update texture
|
-- update texture
|
||||||
local self = tex_obj:get_luaentity()
|
local self = tex_obj:get_luaentity()
|
||||||
@ -391,17 +362,15 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
|
||||||
-- Meat Block
|
-- Meat Block
|
||||||
|
|
||||||
minetest.register_node("mobs:meatblock", {
|
minetest.register_node("mobs:meatblock", {
|
||||||
description = S("Meat Block"),
|
description = S("Meat Block"),
|
||||||
tiles = {"mobs_meat_top.png", "mobs_meat_bottom.png", "mobs_meat_side.png"},
|
tiles = {"mobs_meat_top.png", "mobs_meat_bottom.png", "mobs_meat_side.png"},
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {
|
groups = {choppy = 1, oddly_breakable_by_hand = 1, axey = 1, handy = 1},
|
||||||
choppy = 1, oddly_breakable_by_hand = 1, axey = 1, handy = 1
|
|
||||||
},
|
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
sounds = mod_def and default.node_sound_leaves_defaults(),
|
sounds = mobs.node_sound_dirt_defaults(),
|
||||||
on_place = minetest.rotate_node,
|
on_place = minetest.rotate_node,
|
||||||
on_use = minetest.item_eat(20),
|
on_use = minetest.item_eat(20),
|
||||||
_mcl_hardness = 0.8,
|
_mcl_hardness = 0.8,
|
||||||
@ -420,15 +389,14 @@ minetest.register_craft({
|
|||||||
})
|
})
|
||||||
|
|
||||||
-- Meat Block (raw)
|
-- Meat Block (raw)
|
||||||
|
|
||||||
minetest.register_node("mobs:meatblock_raw", {
|
minetest.register_node("mobs:meatblock_raw", {
|
||||||
description = S("Raw Meat Block"),
|
description = S("Raw Meat Block"),
|
||||||
tiles = {"mobs_meat_raw_top.png", "mobs_meat_raw_bottom.png", "mobs_meat_raw_side.png"},
|
tiles = {"mobs_meat_raw_top.png", "mobs_meat_raw_bottom.png", "mobs_meat_raw_side.png"},
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {
|
groups = {choppy = 1, oddly_breakable_by_hand = 1, axey = 1, handy = 1},
|
||||||
choppy = 1, oddly_breakable_by_hand = 1, axey = 1, handy = 1
|
|
||||||
},
|
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
sounds = mod_def and default.node_sound_leaves_defaults(),
|
sounds = mobs.node_sound_dirt_defaults(),
|
||||||
on_place = minetest.rotate_node,
|
on_place = minetest.rotate_node,
|
||||||
on_use = minetest.item_eat(20),
|
on_use = minetest.item_eat(20),
|
||||||
_mcl_hardness = 0.8,
|
_mcl_hardness = 0.8,
|
||||||
|
22
init.lua
22
init.lua
@ -1,13 +1,13 @@
|
|||||||
|
|
||||||
local path = minetest.get_modpath("mobs")
|
-- peaceful player privilege
|
||||||
|
|
||||||
-- Peaceful player privilege
|
|
||||||
minetest.register_privilege("peaceful_player", {
|
minetest.register_privilege("peaceful_player", {
|
||||||
description = "Prevents Mobs Redo mobs from attacking player",
|
description = "Prevents Mobs Redo mobs from attacking player",
|
||||||
give_to_singleplayer = false
|
give_to_singleplayer = false
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Fallback node
|
-- fallback node
|
||||||
|
|
||||||
minetest.register_node("mobs:fallback_node", {
|
minetest.register_node("mobs:fallback_node", {
|
||||||
description = "Fallback Node",
|
description = "Fallback Node",
|
||||||
tiles = {"mobs_fallback.png"},
|
tiles = {"mobs_fallback.png"},
|
||||||
@ -16,22 +16,20 @@ minetest.register_node("mobs:fallback_node", {
|
|||||||
drop = ""
|
drop = ""
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Mob API
|
local path = minetest.get_modpath("mobs")
|
||||||
dofile(path .. "/api.lua")
|
|
||||||
|
|
||||||
-- Rideable Mobs
|
dofile(path .. "/api.lua") -- mob API
|
||||||
dofile(path .. "/mount.lua")
|
|
||||||
|
|
||||||
-- Mob Items
|
dofile(path .. "/mount.lua") -- rideable mobs
|
||||||
dofile(path .. "/crafts.lua")
|
|
||||||
|
|
||||||
-- Mob Spawner
|
dofile(path .. "/crafts.lua") -- items and crafts
|
||||||
dofile(path .. "/spawner.lua")
|
|
||||||
|
dofile(path .. "/spawner.lua") -- mob spawner
|
||||||
|
|
||||||
-- Lucky Blocks
|
-- Lucky Blocks
|
||||||
|
|
||||||
if minetest.get_modpath("lucky_block") then
|
if minetest.get_modpath("lucky_block") then
|
||||||
dofile(path .. "/lucky_block.lua")
|
dofile(path .. "/lucky_block.lua")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
print("[MOD] Mobs Redo loaded")
|
print("[MOD] Mobs Redo loaded")
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
|
|
||||||
local S = minetest.get_translator("mobs")
|
local S = minetest.get_translator("mobs")
|
||||||
|
|
||||||
|
-- add lucky blocks
|
||||||
|
|
||||||
lucky_block:add_blocks({
|
lucky_block:add_blocks({
|
||||||
{"dro", {"mobs:meat_raw"}, 5},
|
{"dro", {"mobs:meat_raw"}, 5},
|
||||||
@ -17,8 +18,7 @@ lucky_block:add_blocks({
|
|||||||
{"lig"}
|
{"lig"}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
-- pint sized rune, use on tamed mob to shrink to half-size
|
||||||
-- pint sized rune
|
|
||||||
|
|
||||||
minetest.register_craftitem(":mobs:pint_sized_rune", {
|
minetest.register_craftitem(":mobs:pint_sized_rune", {
|
||||||
description = S("Pint Sized Rune"),
|
description = S("Pint Sized Rune"),
|
||||||
@ -27,17 +27,13 @@ minetest.register_craftitem(":mobs:pint_sized_rune", {
|
|||||||
|
|
||||||
on_use = function(itemstack, user, pointed_thing)
|
on_use = function(itemstack, user, pointed_thing)
|
||||||
|
|
||||||
if pointed_thing.type ~= "object" then
|
if pointed_thing.type ~= "object" then return end
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local name = user and user:get_player_name() or ""
|
local name = user and user:get_player_name() or ""
|
||||||
local tool = user and user:get_wielded_item()
|
local tool = user and user:get_wielded_item()
|
||||||
local tool_name = tool:get_name()
|
local tool_name = tool:get_name()
|
||||||
|
|
||||||
if tool_name ~= "mobs:pint_sized_rune" then
|
if tool_name ~= "mobs:pint_sized_rune" then return end
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local self = pointed_thing.ref:get_luaentity()
|
local self = pointed_thing.ref:get_luaentity()
|
||||||
|
|
||||||
@ -82,11 +78,8 @@ minetest.register_craftitem(":mobs:pint_sized_rune", {
|
|||||||
|
|
||||||
self.base_selbox = selbox
|
self.base_selbox = selbox
|
||||||
|
|
||||||
self.object:set_properties({
|
self.object:set_properties(
|
||||||
visual_size = vis_size,
|
{visual_size = vis_size, collisionbox = colbox, selectionbox = selbox})
|
||||||
collisionbox = colbox,
|
|
||||||
selectionbox = selbox
|
|
||||||
})
|
|
||||||
|
|
||||||
self.pint_size_potion = true
|
self.pint_size_potion = true
|
||||||
|
|
||||||
@ -100,6 +93,5 @@ minetest.register_craftitem(":mobs:pint_sized_rune", {
|
|||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
output = "lucky_block:pint_sized_rune",
|
output = "lucky_block:pint_sized_rune",
|
||||||
recipe = {{ "lucky_block:pint_sized_potion", "mobs:protector" }}
|
recipe = {{"lucky_block:pint_sized_potion", "mobs:protector"}}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
2
mod.conf
2
mod.conf
@ -1,4 +1,4 @@
|
|||||||
name = mobs
|
name = mobs
|
||||||
description = Adds a mob api for mods to add animals or monsters etc.
|
description = Adds a mob api for mods to add animals or monsters etc.
|
||||||
optional_depends = default, tnt, invisibility, lucky_block, cmi, toolranks, pathfinder, player_api, mtobjid, visual_harm_1ndicators
|
optional_depends = default, tnt, invisibility, lucky_block, cmi, toolranks, pathfinder, player_api, mtobjid, visual_harm_1ndicators, mcl_sounds
|
||||||
min_minetest_version = 5.0
|
min_minetest_version = 5.0
|
||||||
|
110
mount.lua
110
mount.lua
@ -1,8 +1,10 @@
|
|||||||
|
|
||||||
-- lib_mount by Blert2112 (edited by TenPlus1)
|
-- lib_mount by Blert2112 (edited by TenPlus1)
|
||||||
|
|
||||||
local is_mc2 = minetest.get_modpath("mcl_mobs") -- MineClone2 check
|
local is_mc2 = minetest.get_modpath("mcl_mobs") -- MineClone2 check
|
||||||
|
|
||||||
-- one of these is needed to ride mobs, otherwise no riding for you
|
-- one of these is needed to ride mobs, otherwise no riding for you
|
||||||
|
|
||||||
if not minetest.get_modpath("player_api") and not is_mc2 then
|
if not minetest.get_modpath("player_api") and not is_mc2 then
|
||||||
|
|
||||||
function mobs.attach() end
|
function mobs.attach() end
|
||||||
@ -14,12 +16,11 @@ if not minetest.get_modpath("player_api") and not is_mc2 then
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Localise some functions
|
-- Localise some functions
|
||||||
|
|
||||||
local abs, cos, floor, sin, sqrt, pi =
|
local abs, cos, floor, sin, sqrt, pi =
|
||||||
math.abs, math.cos, math.floor, math.sin, math.sqrt, math.pi
|
math.abs, math.cos, math.floor, math.sin, math.sqrt, math.pi
|
||||||
|
|
||||||
--
|
-- helper functions
|
||||||
-- Helper functions
|
|
||||||
--
|
|
||||||
|
|
||||||
local node_ok = function(pos, fallback)
|
local node_ok = function(pos, fallback)
|
||||||
|
|
||||||
@ -27,9 +28,7 @@ local node_ok = function(pos, fallback)
|
|||||||
|
|
||||||
local node = minetest.get_node_or_nil(pos)
|
local node = minetest.get_node_or_nil(pos)
|
||||||
|
|
||||||
if node and minetest.registered_nodes[node.name] then
|
if node and minetest.registered_nodes[node.name] then return node end
|
||||||
return node
|
|
||||||
end
|
|
||||||
|
|
||||||
return {name = fallback}
|
return {name = fallback}
|
||||||
end
|
end
|
||||||
@ -39,9 +38,7 @@ local function node_is(entity)
|
|||||||
|
|
||||||
if not entity.standing_on then return "other" end
|
if not entity.standing_on then return "other" end
|
||||||
|
|
||||||
if entity.standing_on == "air" then
|
if entity.standing_on == "air" then return "air" end
|
||||||
return "air"
|
|
||||||
end
|
|
||||||
|
|
||||||
if minetest.get_item_group(entity.standing_on, "lava") ~= 0 then
|
if minetest.get_item_group(entity.standing_on, "lava") ~= 0 then
|
||||||
return "lava"
|
return "lava"
|
||||||
@ -61,13 +58,9 @@ end
|
|||||||
|
|
||||||
local function get_sign(i)
|
local function get_sign(i)
|
||||||
|
|
||||||
i = i or 0
|
if not i or i == 0 then return 0 end
|
||||||
|
|
||||||
if i == 0 then
|
return i / abs(i)
|
||||||
return 0
|
|
||||||
else
|
|
||||||
return i / abs(i)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@ -89,9 +82,7 @@ local function force_detach(player)
|
|||||||
|
|
||||||
local attached_to = player and player:get_attach()
|
local attached_to = player and player:get_attach()
|
||||||
|
|
||||||
if not attached_to then
|
if not attached_to then return end
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local entity = attached_to:get_luaentity()
|
local entity = attached_to:get_luaentity()
|
||||||
|
|
||||||
@ -115,11 +106,13 @@ local function force_detach(player)
|
|||||||
player:set_properties({visual_size = {x = 1, y = 1}})
|
player:set_properties({visual_size = {x = 1, y = 1}})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- detach player on leaving
|
||||||
|
|
||||||
minetest.register_on_leaveplayer(function(player)
|
minetest.register_on_leaveplayer(function(player)
|
||||||
force_detach(player)
|
force_detach(player)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
-- detatch all players on shutdown
|
||||||
|
|
||||||
minetest.register_on_shutdown(function()
|
minetest.register_on_shutdown(function()
|
||||||
|
|
||||||
@ -130,25 +123,21 @@ minetest.register_on_shutdown(function()
|
|||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
-- detatch player when dead
|
||||||
|
|
||||||
minetest.register_on_dieplayer(function(player)
|
minetest.register_on_dieplayer(function(player)
|
||||||
force_detach(player)
|
force_detach(player)
|
||||||
return true
|
return true
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
-- find free position to detach player
|
||||||
|
|
||||||
-- Just for correct detaching
|
|
||||||
local function find_free_pos(pos)
|
local function find_free_pos(pos)
|
||||||
|
|
||||||
local check = {
|
local check = {
|
||||||
{x = 1, y = 0, z = 0},
|
{x = 1, y = 0, z = 0}, {x = 1, y = 1, z = 0}, {x = -1, y = 0, z = 0},
|
||||||
{x = 1, y = 1, z = 0},
|
{x = -1, y = 1, z = 0}, {x = 0, y = 0, z = 1}, {x = 0, y = 1, z = 1},
|
||||||
{x = -1, y = 0, z = 0},
|
{x = 0, y = 0, z = -1}, {x = 0, y = 1, z = -1}
|
||||||
{x = -1, y = 1, z = 0},
|
|
||||||
{x = 0, y = 0, z = 1},
|
|
||||||
{x = 0, y = 1, z = 1},
|
|
||||||
{x = 0, y = 0, z = -1},
|
|
||||||
{x = 0, y = 1, z = -1}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, c in pairs(check) do
|
for _, c in pairs(check) do
|
||||||
@ -169,8 +158,8 @@ local function find_free_pos(pos)
|
|||||||
return pos
|
return pos
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- are we a real player ?
|
-- are we a real player ?
|
||||||
|
|
||||||
local function is_player(player)
|
local function is_player(player)
|
||||||
|
|
||||||
if player and type(player) == "userdata" and minetest.is_player(player) then
|
if player and type(player) == "userdata" and minetest.is_player(player) then
|
||||||
@ -178,6 +167,7 @@ local function is_player(player)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- attach player to mob entity
|
||||||
|
|
||||||
function mobs.attach(entity, player)
|
function mobs.attach(entity, player)
|
||||||
|
|
||||||
@ -190,9 +180,7 @@ function mobs.attach(entity, player)
|
|||||||
|
|
||||||
local rot_view = 0
|
local rot_view = 0
|
||||||
|
|
||||||
if entity.player_rotation.y == 90 then
|
if entity.player_rotation.y == 90 then rot_view = pi / 2 end
|
||||||
rot_view = pi / 2
|
|
||||||
end
|
|
||||||
|
|
||||||
local attach_at = entity.driver_attach_at
|
local attach_at = entity.driver_attach_at
|
||||||
local eye_offset = entity.driver_eye_offset
|
local eye_offset = entity.driver_eye_offset
|
||||||
@ -211,10 +199,7 @@ function mobs.attach(entity, player)
|
|||||||
player:set_eye_offset(eye_offset, {x = 0, y = 0, z = 0})
|
player:set_eye_offset(eye_offset, {x = 0, y = 0, z = 0})
|
||||||
|
|
||||||
player:set_properties({
|
player:set_properties({
|
||||||
visual_size = {
|
visual_size = {x = entity.driver_scale.x, y = entity.driver_scale.y}
|
||||||
x = entity.driver_scale.x,
|
|
||||||
y = entity.driver_scale.y
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.after(0.2, function()
|
minetest.after(0.2, function()
|
||||||
@ -232,6 +217,7 @@ function mobs.attach(entity, player)
|
|||||||
player:set_look_horizontal(entity.object:get_yaw() - rot_view)
|
player:set_look_horizontal(entity.object:get_yaw() - rot_view)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- detatch player from mob
|
||||||
|
|
||||||
function mobs.detach(player)
|
function mobs.detach(player)
|
||||||
|
|
||||||
@ -250,15 +236,14 @@ function mobs.detach(player)
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- ride mob like car or horse
|
||||||
|
|
||||||
function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
|
function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
|
||||||
|
|
||||||
local yaw = entity.object:get_yaw() or 0
|
local yaw = entity.object:get_yaw() or 0
|
||||||
local rot_view = 0
|
local rot_view = 0
|
||||||
|
|
||||||
if entity.player_rotation.y == 90 then
|
if entity.player_rotation.y == 90 then rot_view = pi / 2 end
|
||||||
rot_view = pi / 2
|
|
||||||
end
|
|
||||||
|
|
||||||
local acce_y = 0
|
local acce_y = 0
|
||||||
local velo = entity.object:get_velocity() ; if not velo then return end
|
local velo = entity.object:get_velocity() ; if not velo then return end
|
||||||
@ -276,9 +261,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
|
|||||||
|
|
||||||
elseif ctrl.down then -- move backwards
|
elseif ctrl.down then -- move backwards
|
||||||
|
|
||||||
if entity.max_speed_reverse == 0 and entity.v == 0 then
|
if entity.max_speed_reverse == 0 and entity.v == 0 then return end
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
entity.v = entity.v - entity.accel * dtime
|
entity.v = entity.v - entity.accel * dtime
|
||||||
end
|
end
|
||||||
@ -290,12 +273,8 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
|
|||||||
|
|
||||||
horz = yaw
|
horz = yaw
|
||||||
|
|
||||||
if ctrl.left then
|
if ctrl.left then horz = horz + 0.05
|
||||||
horz = horz + 0.05
|
elseif ctrl.right then horz = horz - 0.05 end
|
||||||
|
|
||||||
elseif ctrl.right then
|
|
||||||
horz = horz - 0.05
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
horz = entity.driver:get_look_horizontal() or 0
|
horz = entity.driver:get_look_horizontal() or 0
|
||||||
end
|
end
|
||||||
@ -333,8 +312,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
|
|||||||
if ctrl.jump then -- jump (only when standing on solid surface)
|
if ctrl.jump then -- jump (only when standing on solid surface)
|
||||||
|
|
||||||
if velo.y == 0
|
if velo.y == 0
|
||||||
and entity.standing_on ~= "air"
|
and entity.standing_on ~= "air" and entity.standing_on ~= "ignore"
|
||||||
and entity.standing_on ~= "ignore"
|
|
||||||
and minetest.get_item_group(entity.standing_on, "liquid") == 0 then
|
and minetest.get_item_group(entity.standing_on, "liquid") == 0 then
|
||||||
velo.y = velo.y + entity.jump_height
|
velo.y = velo.y + entity.jump_height
|
||||||
acce_y = acce_y + (acce_y * 3) + 1
|
acce_y = acce_y + (acce_y * 3) + 1
|
||||||
@ -346,17 +324,13 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
|
|||||||
-- if not moving then set animation and return
|
-- if not moving then set animation and return
|
||||||
if entity.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then
|
if entity.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then
|
||||||
|
|
||||||
if stand_anim then
|
if stand_anim then entity:set_animation(stand_anim) end
|
||||||
entity:set_animation(stand_anim)
|
|
||||||
end
|
|
||||||
|
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
-- set moving animation
|
-- set moving animation
|
||||||
if moving_anim then
|
if moving_anim then entity:set_animation(moving_anim) end
|
||||||
entity:set_animation(moving_anim)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Stop!
|
-- Stop!
|
||||||
local s = get_sign(entity.v)
|
local s = get_sign(entity.v)
|
||||||
@ -392,9 +366,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
|
|||||||
|
|
||||||
if ni == "air" then
|
if ni == "air" then
|
||||||
|
|
||||||
if can_fly == true then
|
if can_fly == true then new_acce.y = 0 end
|
||||||
new_acce.y = 0
|
|
||||||
end
|
|
||||||
|
|
||||||
elseif ni == "liquid" or ni == "lava" then
|
elseif ni == "liquid" or ni == "lava" then
|
||||||
|
|
||||||
@ -441,8 +413,8 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
|
|||||||
entity.v2 = v
|
entity.v2 = v
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- fly mob in facing direction (by D00Med, edited by TenPlus1)
|
||||||
|
|
||||||
-- directional flying routine by D00Med (edited by TenPlus1)
|
|
||||||
function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim)
|
function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim)
|
||||||
|
|
||||||
local ctrl = entity.driver:get_player_control() ; if not ctrl then return end
|
local ctrl = entity.driver:get_player_control() ; if not ctrl then return end
|
||||||
@ -454,19 +426,13 @@ function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim)
|
|||||||
|
|
||||||
if ctrl.up then
|
if ctrl.up then
|
||||||
|
|
||||||
entity.object:set_velocity({
|
entity.object:set_velocity(
|
||||||
x = dir.x * speed,
|
{x = dir.x * speed, y = dir.y * speed + 2, z = dir.z * speed})
|
||||||
y = dir.y * speed + 2,
|
|
||||||
z = dir.z * speed
|
|
||||||
})
|
|
||||||
|
|
||||||
elseif ctrl.down then
|
elseif ctrl.down then
|
||||||
|
|
||||||
entity.object:set_velocity({
|
entity.object:set_velocity(
|
||||||
x = -dir.x * speed,
|
{x = -dir.x * speed, y = dir.y * speed + 2, z = -dir.z * speed})
|
||||||
y = dir.y * speed + 2,
|
|
||||||
z = -dir.z * speed
|
|
||||||
})
|
|
||||||
|
|
||||||
elseif not ctrl.down or ctrl.up or ctrl.jump then
|
elseif not ctrl.down or ctrl.up or ctrl.jump then
|
||||||
entity.object:set_velocity({x = 0, y = -2, z = 0})
|
entity.object:set_velocity({x = 0, y = -2, z = 0})
|
||||||
@ -501,11 +467,9 @@ function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- change animation if stopped
|
|
||||||
if velo.x == 0 and velo.y == 0 and velo.z == 0 then
|
if velo.x == 0 and velo.y == 0 and velo.z == 0 then
|
||||||
entity:set_animation(stand_anim)
|
entity:set_animation(stand_anim) -- stopped animation
|
||||||
else
|
else
|
||||||
-- moving animation
|
entity:set_animation(moving_anim) -- moving animation
|
||||||
entity:set_animation(moving_anim)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -66,8 +66,6 @@ mobs_can_hear (Enable Mob hearing) bool true
|
|||||||
[Pathfinding]
|
[Pathfinding]
|
||||||
# Enable pathfinding (default Enabled)
|
# Enable pathfinding (default Enabled)
|
||||||
mob_pathfinding_enable (Enable pathfinding) bool true
|
mob_pathfinding_enable (Enable pathfinding) bool true
|
||||||
# Use pathfinder mod if available (default Enabled)
|
|
||||||
mob_pathfinder_enable (Use pathfinder mod if available) bool true
|
|
||||||
# How long before stuck mobs starts searching (default 3.0)
|
# How long before stuck mobs starts searching (default 3.0)
|
||||||
mob_pathfinding_stuck_timeout (How long before stuck mobs start searching) float 3.0
|
mob_pathfinding_stuck_timeout (How long before stuck mobs start searching) float 3.0
|
||||||
# How long will mob follow path before giving up (default 5.0)
|
# How long will mob follow path before giving up (default 5.0)
|
||||||
|
67
spawner.lua
67
spawner.lua
@ -1,8 +1,9 @@
|
|||||||
|
|
||||||
local S = mobs.translate
|
local S = minetest.get_translator("mobs")
|
||||||
|
local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99)
|
||||||
|
|
||||||
|
-- helper functions
|
||||||
|
|
||||||
-- are we a real player ?
|
|
||||||
local function is_player(player)
|
local function is_player(player)
|
||||||
|
|
||||||
if player and type(player) == "userdata" and minetest.is_player(player) then
|
if player and type(player) == "userdata" and minetest.is_player(player) then
|
||||||
@ -21,8 +22,8 @@ local get_distance = function(a, b)
|
|||||||
return square(x * x + y * y + z * z)
|
return square(x * x + y * y + z * z)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- mob spawner
|
-- mob spawner
|
||||||
|
|
||||||
local spawner_default = "mobs_animal:pumba 10 15 0 0 0"
|
local spawner_default = "mobs_animal:pumba 10 15 0 0 0"
|
||||||
|
|
||||||
minetest.register_node("mobs:spawner", {
|
minetest.register_node("mobs:spawner", {
|
||||||
@ -35,6 +36,7 @@ minetest.register_node("mobs:spawner", {
|
|||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
_mcl_hardness = 1,
|
_mcl_hardness = 1,
|
||||||
_mcl_blast_resistance = 5,
|
_mcl_blast_resistance = 5,
|
||||||
|
sounds = mobs.node_sound_stone_defaults(),
|
||||||
|
|
||||||
on_construct = function(pos)
|
on_construct = function(pos)
|
||||||
|
|
||||||
@ -56,16 +58,12 @@ minetest.register_node("mobs:spawner", {
|
|||||||
|
|
||||||
on_right_click = function(pos, placer)
|
on_right_click = function(pos, placer)
|
||||||
|
|
||||||
if minetest.is_protected(pos, placer:get_player_name()) then
|
if minetest.is_protected(pos, placer:get_player_name()) then return end
|
||||||
return
|
|
||||||
end
|
|
||||||
end,
|
end,
|
||||||
|
|
||||||
on_receive_fields = function(pos, formname, fields, sender)
|
on_receive_fields = function(pos, formname, fields, sender)
|
||||||
|
|
||||||
if not fields.text or fields.text == "" then
|
if not fields.text or fields.text == "" then return end
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local comm = fields.text:split(" ")
|
local comm = fields.text:split(" ")
|
||||||
@ -76,35 +74,31 @@ minetest.register_node("mobs:spawner", {
|
|||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local mob = comm[1] -- mob to spawn
|
local mob = comm[1] or "" -- mob to spawn
|
||||||
local mlig = tonumber(comm[2]) -- min light
|
local mlig = tonumber(comm[2]) -- min light
|
||||||
local xlig = tonumber(comm[3]) -- max light
|
local xlig = tonumber(comm[3]) -- max light
|
||||||
local num = tonumber(comm[4]) -- total mobs in area
|
local num = tonumber(comm[4]) -- total mobs in area
|
||||||
local pla = tonumber(comm[5]) -- player distance (0 to disable)
|
local pla = tonumber(comm[5]) -- player distance (0 to disable)
|
||||||
local yof = tonumber(comm[6]) or 0 -- Y offset to spawn mob
|
local yof = tonumber(comm[6]) or 0 -- Y offset to spawn mob
|
||||||
|
|
||||||
if mob and mob ~= "" and mobs.spawning_mobs[mob]
|
if mob ~= "" and mobs.spawning_mobs[mob] and num and num >= 0 and num <= 10
|
||||||
and num and num >= 0 and num <= 10
|
and mlig and mlig >= 0 and mlig <= 15 and xlig and xlig >= 0 and xlig <= 15
|
||||||
and mlig and mlig >= 0 and mlig <= 15
|
and pla and pla >= 0 and pla <= 20 and yof and yof > -10 and yof < 10 then
|
||||||
and xlig and xlig >= 0 and xlig <= 15
|
|
||||||
and pla and pla >= 0 and pla <= 20
|
|
||||||
and yof and yof > -10 and yof < 10 then
|
|
||||||
|
|
||||||
meta:set_string("command", fields.text)
|
meta:set_string("command", fields.text)
|
||||||
meta:set_string("infotext", S("Spawner Active (@1)", mob))
|
meta:set_string("infotext", S("Spawner Active (@1)", mob))
|
||||||
|
|
||||||
else
|
else
|
||||||
minetest.chat_send_player(name, S("Mob Spawner settings failed!"))
|
minetest.chat_send_player(name, S("Mob Spawner settings failed!"))
|
||||||
minetest.chat_send_player(name,
|
minetest.chat_send_player(name,
|
||||||
S("Syntax: “name min_light[0-14] max_light[0-14] max_mobs_in_area[0 to disable] player_distance[1-20] y_offset[-10 to 10]”"))
|
S("Syntax: “name min_light[0-14] max_light[0-14] "
|
||||||
|
.. "max_mobs_in_area[0 to disable] player_distance[1-20] "
|
||||||
|
.. "y_offset[-10 to 10]”"))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99)
|
|
||||||
|
|
||||||
-- spawner abm
|
-- spawner abm
|
||||||
|
|
||||||
minetest.register_abm({
|
minetest.register_abm({
|
||||||
label = "Mob spawner node",
|
label = "Mob spawner node",
|
||||||
nodenames = {"mobs:spawner"},
|
nodenames = {"mobs:spawner"},
|
||||||
@ -115,9 +109,7 @@ minetest.register_abm({
|
|||||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||||
|
|
||||||
-- return if too many entities already
|
-- return if too many entities already
|
||||||
if active_object_count_wider >= max_per_block then
|
if active_object_count_wider >= max_per_block then return end
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- get meta and command
|
-- get meta and command
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
@ -132,9 +124,7 @@ minetest.register_abm({
|
|||||||
local yof = tonumber(comm[6]) or 0
|
local yof = tonumber(comm[6]) or 0
|
||||||
|
|
||||||
-- if amount is 0 then do nothing
|
-- if amount is 0 then do nothing
|
||||||
if num == 0 then
|
if num == 0 then return end
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- are we spawning a registered mob?
|
-- are we spawning a registered mob?
|
||||||
if not mobs.spawning_mobs[mob] then
|
if not mobs.spawning_mobs[mob] then
|
||||||
@ -152,15 +142,11 @@ minetest.register_abm({
|
|||||||
|
|
||||||
ent = obj:get_luaentity()
|
ent = obj:get_luaentity()
|
||||||
|
|
||||||
if ent and ent.name and ent.name == mob then
|
if ent and ent.name and ent.name == mob then count = count + 1 end
|
||||||
count = count + 1
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- is there too many of same type?
|
-- is there too many of same type?
|
||||||
if count >= num then
|
if count >= num then return end
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- when player distance above 0, spawn mob if player detected and in range
|
-- when player distance above 0, spawn mob if player detected and in range
|
||||||
if pla > 0 then
|
if pla > 0 then
|
||||||
@ -181,22 +167,18 @@ minetest.register_abm({
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- player not found
|
-- player not found
|
||||||
if not in_range then
|
if not in_range then return end
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- set medium mob usually spawns in (defaults to air)
|
-- set medium mob usually spawns in (defaults to air)
|
||||||
local reg = minetest.registered_entities[mob].fly_in
|
local reg = minetest.registered_entities[mob].fly_in
|
||||||
|
|
||||||
if not reg or type(reg) == "string" then
|
if not reg or type(reg) == "string" then reg = {(reg or "air")} end
|
||||||
reg = {(reg or "air")}
|
|
||||||
end
|
|
||||||
|
|
||||||
-- find air blocks within 5 nodes of spawner
|
-- find air blocks within 5 nodes of spawner
|
||||||
local air = minetest.find_nodes_in_area(
|
local air = minetest.find_nodes_in_area(
|
||||||
{x = pos.x - 5, y = pos.y + yof, z = pos.z - 5},
|
{x = pos.x - 5, y = pos.y + yof, z = pos.z - 5},
|
||||||
{x = pos.x + 5, y = pos.y + yof, z = pos.z + 5}, reg)
|
{x = pos.x + 5, y = pos.y + yof, z = pos.z + 5}, reg)
|
||||||
|
|
||||||
-- spawn in random air block
|
-- spawn in random air block
|
||||||
if air and #air > 0 then
|
if air and #air > 0 then
|
||||||
@ -207,8 +189,7 @@ minetest.register_abm({
|
|||||||
pos2.y = pos2.y + 0.5
|
pos2.y = pos2.y + 0.5
|
||||||
|
|
||||||
-- only if light levels are within range
|
-- only if light levels are within range
|
||||||
if lig >= mlig and lig <= xlig
|
if lig >= mlig and lig <= xlig and minetest.registered_entities[mob] then
|
||||||
and minetest.registered_entities[mob] then
|
|
||||||
minetest.add_entity(pos2, mob)
|
minetest.add_entity(pos2, mob)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user