1
0
mirror of https://codeberg.org/tenplus1/mobs_redo.git synced 2025-07-16 15:20:28 +02:00

Compare commits

...

54 Commits

Author SHA1 Message Date
ca34cc2274 fix api typo (thanks bastrabun :) 2022-05-21 08:04:38 +01:00
168014b86f tidy api 2022-05-14 11:21:36 +01:00
6f8b6fe3f5 select proper animation for flying mobs 2022-05-01 08:15:25 +01:00
dd16d63e8e revert hover 2022-04-30 14:35:59 +01:00
7bb5e2b382 add "hover" animation 2022-04-30 12:26:36 +01:00
7b429df9e9 tweak riding functions 2022-04-21 08:28:35 +01:00
0e72f0ca81 tweak mobs.drive() speed (thanks auouymous) 2022-04-18 08:31:25 +01:00
fb42be6b28 nil checks 2022-03-14 08:29:25 +00:00
f54c3da9d7 add nil check 2022-03-13 16:30:20 +00:00
65e369e5fc add 0.4.x compatibility when riding mod 2022-03-01 09:04:38 +00:00
9f74408792 remove owner infotext if no owner present 2022-02-05 12:25:01 +00:00
18c7f0a422 update translation checks (thanks mckaygerhard) 2022-01-20 08:54:08 +00:00
2fb7bf2c66 update api.txt for mob_object change 2022-01-18 06:41:29 +00:00
f01e8a61d0 rename var 2022-01-16 07:44:53 +00:00
b756aa50f5 fix crash (thanks SwissalpS) 2022-01-16 07:05:49 +00:00
e83620553d add mobs:is_node_dangerous(self, nodename) global function 2022-01-15 09:41:21 +00:00
e5d1958e16 add nil checks for riding mobs 2022-01-03 17:35:51 +00:00
6a4a02f3fb fix translations (thanks nixnoxus) 2021-12-12 08:13:54 +00:00
5d88766b74 add pointed_thing to on_rightclick vars 2021-11-16 20:22:15 +00:00
d31da2d069 mod loaded msg 2021-11-14 14:21:32 +00:00
00db86c924 fix intllib return 2021-11-14 14:18:28 +00:00
26ec61ee29 lasso can pick up animal babies 2021-09-20 10:49:19 +01:00
a8ca00dc56 fix self.follow list 2021-09-05 08:16:40 +01:00
4c80a55c04 add breeding info on hover and items followed on shift+rightclick mob (thanks nixnoxus) 2021-08-16 10:48:16 +01:00
deee28fc59 added 'arrow_override' function to mob definition 2021-08-01 18:58:21 +01:00
ab44080ff8 do not despawn tamed monsters 2021-07-31 08:35:53 +01:00
9f46182bb4 remove need for default mod 2021-07-22 09:48:56 +01:00
2535b5636e add support for MarkBu's pathfinder mod 2021-07-22 09:34:21 +01:00
2d014a75c4 tweak "stand" mobs velocity 2021-07-21 19:38:41 +01:00
db3831dccf update api.txt 2021-07-14 15:53:20 +01:00
29b2204f7c add 'mobs_spawn_monster_protected' switch (thanks 0siribix) 2021-07-14 15:43:02 +01:00
7fbfd9d59c fix "stand" mobs fall jitter 2021-07-13 16:56:53 +01:00
e50d04a6aa fix facing fence jump bug 2021-06-14 09:30:03 +01:00
33589ebda0 improve pathfinding level 2 digging/building, add infotext, stop mob attack spin, tweak & tidy code 2021-06-13 09:39:59 +01:00
6670938c3d add mob height check for glitching through blocks 2021-06-11 22:25:00 +01:00
f131806008 add 'mob_smooth_rotate' setting 2021-06-01 14:17:25 +01:00
49325c9c8d fix weapon sound selection 2021-05-27 15:42:21 +01:00
8012250258 nil check for mount 2021-05-21 17:46:10 +01:00
ec44aa91c4 add 'damage_group' and 'damage_texture_modifier' settings to mob definition 2021-05-15 09:33:35 +01:00
f58841ab3e show current texture for mob reset stick 2021-05-10 14:57:21 +01:00
350fc3647c add extra settings to arrow definition 2021-05-04 08:02:43 +01:00
70c68f6ebc change so only players can push mobs 2021-04-18 09:05:16 +01:00
c023ecc36f reduce shapeless crafts 2021-04-13 21:09:34 +01:00
9be934ec25 make it possible to use advanced protector on normally protected mob 2021-04-13 12:41:09 +01:00
f6e16a5503 return actual damage position (created particle py), check for nil damage groups 2021-04-11 17:23:22 +01:00
c06d071220 allow players with 'protection_bypass' to rename owned tamed mobs 2021-04-07 10:35:36 +01:00
ccbfe93f12 players with protection_bypass can pick up owned animals from other players 2021-04-06 15:26:36 +01:00
6750d176ee tweak damage and protectors 2021-04-05 08:52:48 +01:00
246b2769f7 add level 2 mob protector 2021-04-04 22:25:40 +01:00
34b06df758 add ability to follow group: items 2021-03-23 17:09:26 +00:00
0f1f3b4fb3 simplify mobs floating in water 2021-03-18 20:23:55 +00:00
774ce6671f add 'ignore_invisibility' setting to mob definition 2021-03-10 08:14:42 +00:00
11e1d52cfb replace minetest 5.0 check 2021-02-06 17:10:50 +00:00
c158e84e28 stop grown child mobs sinking into blocks below 2021-02-03 21:29:26 +00:00
13 changed files with 601 additions and 395 deletions

769
api.lua

File diff suppressed because it is too large Load Diff

26
api.txt
View File

@ -56,6 +56,8 @@ functions needed for the mob to work properly which contains the following:
'view_range' how many nodes in distance the mob can see a player. 'view_range' how many nodes in distance the mob can see a player.
'damage' how many health points the mob does to a player or another 'damage' how many health points the mob does to a player or another
mob when melee attacking. mob when melee attacking.
'damage_group' group in which damage is dealt, dedaults to "fleshy".
'damage_texture_modifier' applies texture modifier on hit e.g "^[brighten"
'knock_back' when true has mobs falling backwards when hit, the greater 'knock_back' when true has mobs falling backwards when hit, the greater
the damage the more they move back. the damage the more they move back.
'fear_height' is how high a cliff or edge has to be before the mob stops 'fear_height' is how high a cliff or edge has to be before the mob stops
@ -66,7 +68,10 @@ functions needed for the mob to work properly which contains the following:
water. water.
'air_damage' holds damage per second inflicted to mob when standing in air. 'air_damage' holds damage per second inflicted to mob when standing in air.
'lava_damage' holds the damage per second inflicted to mobs when standing 'lava_damage' holds the damage per second inflicted to mobs when standing
in lava or fire or an ignition source. in lava.
'fire_damage' holds the damage per second inflicted to mobs when standing
in fire.
'light_damage' holds the damage per second inflicted to mobs when light 'light_damage' holds the damage per second inflicted to mobs when light
level is between the min and max values below level is between the min and max values below
'light_damage_min' minimum light value when mob is affected (default: 14) 'light_damage_min' minimum light value when mob is affected (default: 14)
@ -76,7 +81,7 @@ functions needed for the mob to work properly which contains the following:
'floats' when set to 1 mob will float in water, 0 has them sink. 'floats' when set to 1 mob will float in water, 0 has them sink.
'follow' mobs follow player when holding any of the items which appear 'follow' mobs follow player when holding any of the items which appear
on this table, the same items can be fed to a mob to tame or on this table, the same items can be fed to a mob to tame or
breed e.g. {"farming:wheat", "default:apple"} breed e.g. {"farming:wheat", "default:apple", "group:fish"}
'reach' is how far the mob can attack player when standing 'reach' is how far the mob can attack player when standing
nearby, default is 3 nodes. nearby, default is 3 nodes.
@ -118,6 +123,8 @@ functions needed for the mob to work properly which contains the following:
continue chasing. continue chasing.
'arrow' holds the pre-defined arrow object to shoot when 'arrow' holds the pre-defined arrow object to shoot when
attacking. attacking.
'arrow_override' function that allows tweaking of arrow entity from
inside mob definition (self) passed to function.
'dogshoot_switch' allows switching between attack types by using timers 'dogshoot_switch' allows switching between attack types by using timers
(1 for shoot, 2 for dogfight) (1 for shoot, 2 for dogfight)
'dogshoot_count_max' contains how many seconds before switching from 'dogshoot_count_max' contains how many seconds before switching from
@ -131,6 +138,8 @@ functions needed for the mob to work properly which contains the following:
e.g. {"player", "mobs_animal:chicken"}. e.g. {"player", "mobs_animal:chicken"}.
'runaway_from' contains a table with mob names to run away from, add 'runaway_from' contains a table with mob names to run away from, add
"player" to list to runaway from player also. "player" to list to runaway from player also.
'ignore_invisibility' When true mob will still be able to see and attack
player even if invisible (invisibility mod only).
'blood_amount' contains the number of blood droplets to appear when 'blood_amount' contains the number of blood droplets to appear when
mob is hit. mob is hit.
'blood_texture' has the texture name to use for droplets e.g. 'blood_texture' has the texture name to use for droplets e.g.
@ -406,7 +415,7 @@ the mobs:spawn, so it is recommended to use the above instead.
mobs:register_spawn(name, nodes, max_light, min_light, chance, mobs:register_spawn(name, nodes, max_light, min_light, chance,
active_object_count, max_height, day_toggle) active_object_count, max_height, day_toggle)
mobs:spawn_specfic(name, nodes, neighbors, min_light, max_light, interval, mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval,
chance, active_object_count, min_height, max_height, day_toggle, on_spawn) chance, active_object_count, min_height, max_height, day_toggle, on_spawn)
A simpler way to handle mob spawns has been added with the mobs:spawn(def) A simpler way to handle mob spawns has been added with the mobs:spawn(def)
@ -460,6 +469,8 @@ This function registers a arrow for mobs with the attack type shoot.
'visual' same is in minetest.register_entity() 'visual' same is in minetest.register_entity()
'visual_size' same is in minetest.register_entity() 'visual_size' same is in minetest.register_entity()
'textures' same is in minetest.register_entity() 'textures' same is in minetest.register_entity()
'physical' same is in minetest.register_entity() [default: false]
'collide_with_objects' same as above
'velocity' the velocity of the arrow 'velocity' the velocity of the arrow
'drop' if set to true any arrows hitting a node will drop as item 'drop' if set to true any arrows hitting a node will drop as item
'hit_player' a function that is called when the arrow hits a player; 'hit_player' a function that is called when the arrow hits a player;
@ -680,6 +691,12 @@ space to spawn mob [name], if so then a new position is returned for use,
otherwise nil is returned. otherwise nil is returned.
mobs:is_node_dangerous(mob_object, nodename)
This function returns true if the node name given is harmful to the mob (mob_object),
it is mainly used when a mob is near a node it has to avoid.
External Settings for "minetest.conf" External Settings for "minetest.conf"
------------------------------------ ------------------------------------
@ -690,6 +707,8 @@ External Settings for "minetest.conf"
is false) is false)
'mobs_spawn_protected' if set to false then mobs will not spawn in protected 'mobs_spawn_protected' if set to false then mobs will not spawn in protected
areas (default is true) areas (default is true)
'mobs_spawn_monster_protected' if set to false then monsters will not spawn in
protected areas (default is true)
'remove_far_mobs' if true then untamed mobs that are outside players 'remove_far_mobs' if true then untamed mobs that are outside players
visual range will be removed (default is true) visual range will be removed (default is true)
'mobname' can change specific mob chance rate (0 to disable) and 'mobname' can change specific mob chance rate (0 to disable) and
@ -713,6 +732,7 @@ External Settings for "minetest.conf"
'mob_area_spawn' When true will check surrounding area the size of the 'mob_area_spawn' When true will check surrounding area the size of the
mob for obstructions before spawning, otherwise it mob for obstructions before spawning, otherwise it
defaults to checking the height of the mob only. defaults to checking the height of the mob only.
'mob_smooth_rotate' Enables smooth rotation when mobs turn by default.
Players can override the spawn chance for each mob registered by adding a line Players can override the spawn chance for each mob registered by adding a line
to their minetest.conf file with a new value, the lower the value the more each to their minetest.conf file with a new value, the lower the value the more each

View File

@ -10,9 +10,8 @@ minetest.register_craftitem("mobs:nametag", {
if minetest.get_modpath("dye") and minetest.get_modpath("farming") then if minetest.get_modpath("dye") and minetest.get_modpath("farming") then
minetest.register_craft({ minetest.register_craft({
type = "shapeless",
output = "mobs:nametag", output = "mobs:nametag",
recipe = {"default:paper", "dye:black", "farming:string"} recipe = {{"default:paper", "dye:black", "farming:string"}}
}) })
end end
@ -115,6 +114,22 @@ minetest.register_craft({
} }
}) })
-- level 2 protection rune
minetest.register_craftitem("mobs:protector2", {
description = S("Mob Protection Rune (Level 2)"),
inventory_image = "mobs_protector2.png",
groups = {flammable = 2}
})
minetest.register_craft({
output = "mobs:protector2",
recipe = {
{"mobs:protector", "default:mese_crystal", "mobs:protector"},
{"default:mese_crystal", "default:diamondblock", "default:mese_crystal"},
{"mobs:protector", "default:mese_crystal", "mobs:protector"}
}
})
-- saddle -- saddle
minetest.register_craftitem("mobs:saddle", { minetest.register_craftitem("mobs:saddle", {
description = S("Saddle"), description = S("Saddle"),
@ -133,7 +148,7 @@ minetest.register_craft({
-- make sure we can register fences -- make sure we can register fences
if default.register_fence then if minetest.get_modpath("default") 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", {
@ -149,6 +164,7 @@ default.register_fence("mobs:fence_wood", {
} }
} }
}) })
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", {
@ -181,8 +197,6 @@ minetest.register_craft({
} }
}) })
end
-- items that can be used as fuel -- items that can be used as fuel
minetest.register_craft({ minetest.register_craft({
@ -283,12 +297,18 @@ minetest.register_tool(":mobs:mob_reset_stick", {
tex_obj = obj tex_obj = obj
-- get base texture
local bt = tex_obj:get_luaentity().base_texture[1]
if type(bt) ~= "string" then
bt = ""
end
local name = user:get_player_name() local name = user:get_player_name()
local tex = ""
minetest.show_formspec(name, "mobs_texture", "size[8,4]" minetest.show_formspec(name, "mobs_texture", "size[8,4]"
.. "field[0.5,1;7.5,0;name;" .. "field[0.5,1;7.5,0;name;"
.. minetest.formspec_escape(S("Enter texture:")) .. ";" .. tex .. "]" .. minetest.formspec_escape(S("Enter texture:")) .. ";" .. bt .. "]"
.. "button_exit[2.5,3.5;3,1;mob_texture_change;" .. "button_exit[2.5,3.5;3,1;mob_texture_change;"
.. minetest.formspec_escape(S("Change")) .. "]") .. minetest.formspec_escape(S("Change")) .. "]")
end end
@ -339,17 +359,17 @@ minetest.register_node("mobs:meatblock", {
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 = {choppy = 1, oddly_breakable_by_hand = 1, flammable = 2}, groups = {choppy = 1, oddly_breakable_by_hand = 1, flammable = 2},
sounds = default.node_sound_leaves_defaults(), sounds = default and default.node_sound_leaves_defaults(),
on_place = minetest.rotate_node, on_place = minetest.rotate_node,
on_use = minetest.item_eat(20), on_use = minetest.item_eat(20)
}) })
minetest.register_craft({ minetest.register_craft({
output = "mobs:meatblock", output = "mobs:meatblock",
type = "shapeless", -- type = "shapeless",
recipe = { recipe = {
"group:food_meat", "group:food_meat", "group:food_meat", {"group:food_meat", "group:food_meat", "group:food_meat"},
"group:food_meat", "group:food_meat", "group:food_meat", {"group:food_meat", "group:food_meat", "group:food_meat"},
"group:food_meat", "group:food_meat", "group:food_meat" {"group:food_meat", "group:food_meat", "group:food_meat"}
} }
}) })

View File

@ -1,4 +1,4 @@
default default?
tnt? tnt?
dye? dye?
farming? farming?
@ -7,3 +7,5 @@ intllib?
lucky_block? lucky_block?
cmi? cmi?
toolranks? toolranks?
pathfinder?
player_api?

View File

@ -22,4 +22,4 @@ dofile(path .. "/spawner.lua")
-- Lucky Blocks -- Lucky Blocks
dofile(path .. "/lucky_block.lua") dofile(path .. "/lucky_block.lua")
minetest.log("action", "[MOD] Mobs Redo loaded") print("[MOD] Mobs Redo loaded")

View File

@ -1,3 +0,0 @@
-- Support for the old multi-load method
dofile(minetest.get_modpath("intllib").."/init.lua")

View File

@ -11,7 +11,7 @@ msgstr ""
"PO-Revision-Date: 2017-07-02 14:27+0200\n" "PO-Revision-Date: 2017-07-02 14:27+0200\n"
"Last-Translator: Wuzzy <almikes@aol.com>\n" "Last-Translator: Wuzzy <almikes@aol.com>\n"
"Language-Team: \n" "Language-Team: \n"
"Language: de_DE\n" "Language: de\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"

View File

@ -1,4 +1,4 @@
name = mobs name = mobs
depends = default depends =
optional_depends = tnt, dye, farming, invisibility, intllib, lucky_block, cmi, toolranks optional_depends = default, tnt, dye, farming, invisibility, intllib, lucky_block, cmi, toolranks, pathfinder, player_api
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.

131
mount.lua
View File

@ -1,14 +1,16 @@
-- lib_mount by Blert2112 (edited by TenPlus1) -- lib_mount by Blert2112 (edited by TenPlus1)
local is_50 = minetest.get_modpath("player_api") -- 5.x compatibility
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)
fallback = fallback or mobs.fallback_node fallback = fallback or mobs.fallback_node
local node = minetest.get_node_or_nil(pos) local node = minetest.get_node_or_nil(pos)
@ -22,6 +24,7 @@ end
local function node_is(pos) local function node_is(pos)
local node = node_ok(pos) local node = node_ok(pos)
if node.name == "air" then if node.name == "air" then
@ -45,6 +48,7 @@ end
local function get_sign(i) local function get_sign(i)
i = i or 0 i = i or 0
if i == 0 then if i == 0 then
@ -56,6 +60,7 @@ end
local function get_velocity(v, yaw, y) local function get_velocity(v, yaw, y)
local x = -sin(yaw) * v local x = -sin(yaw) * v
local z = cos(yaw) * v local z = cos(yaw) * v
@ -69,6 +74,9 @@ end
local function force_detach(player) local function force_detach(player)
if not player then return end
local attached_to = player:get_attach() local attached_to = player:get_attach()
if not attached_to then if not attached_to then
@ -83,35 +91,46 @@ local function force_detach(player)
end end
player:set_detach() player:set_detach()
player_api.player_attached[player:get_player_name()] = false
player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
player_api.set_animation(player, "stand", 30)
player:set_properties({visual_size = {x = 1, y = 1}})
local name = player:get_player_name()
if is_50 then
player_api.player_attached[name] = false
player_api.set_animation(player, "stand", 30)
else
default.player_attached[name] = false
default.player_set_animation(player, "stand", 30)
end
player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0})
player:set_properties({visual_size = {x = 1, y = 1}})
end end
-------------------------------------------------------------------------------
minetest.register_on_leaveplayer(function(player) minetest.register_on_leaveplayer(function(player)
force_detach(player) force_detach(player)
end) end)
minetest.register_on_shutdown(function() minetest.register_on_shutdown(function()
local players = minetest.get_connected_players() local players = minetest.get_connected_players()
for i = 1, #players do for i = 1, #players do
force_detach(players[i]) force_detach(players[i])
end end
end) end)
minetest.register_on_dieplayer(function(player) minetest.register_on_dieplayer(function(player)
force_detach(player) force_detach(player)
return true return true
end) end)
-------------------------------------------------------------------------------
-- Just for correct detaching -- 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 = 1, z = 0},
@ -124,10 +143,14 @@ local function find_free_pos(pos)
} }
for _, c in pairs(check) do for _, c in pairs(check) do
local npos = {x = pos.x + c.x, y = pos.y + c.y, z = pos.z + c.z} local npos = {x = pos.x + c.x, y = pos.y + c.y, z = pos.z + c.z}
local node = minetest.get_node_or_nil(npos) local node = minetest.get_node_or_nil(npos)
if node and node.name then if node and node.name then
local def = minetest.registered_nodes[node.name] local def = minetest.registered_nodes[node.name]
if def and not def.walkable and if def and not def.walkable and
def.liquidtype == "none" then def.liquidtype == "none" then
return npos return npos
@ -138,9 +161,9 @@ local function find_free_pos(pos)
return pos return pos
end end
-------------------------------------------------------------------------------
function mobs.attach(entity, player) function mobs.attach(entity, player)
entity.player_rotation = entity.player_rotation or {x = 0, y = 0, z = 0} entity.player_rotation = entity.player_rotation or {x = 0, y = 0, z = 0}
entity.driver_attach_at = entity.driver_attach_at or {x = 0, y = 0, z = 0} entity.driver_attach_at = entity.driver_attach_at or {x = 0, y = 0, z = 0}
entity.driver_eye_offset = entity.driver_eye_offset or {x = 0, y = 0, z = 0} entity.driver_eye_offset = entity.driver_eye_offset or {x = 0, y = 0, z = 0}
@ -154,12 +177,18 @@ function mobs.attach(entity, player)
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
entity.driver = player entity.driver = player
force_detach(player) force_detach(player)
if is_50 then
player_api.player_attached[player:get_player_name()] = true
else
default.player_attached[player:get_player_name()] = true
end
player:set_attach(entity.object, "", attach_at, entity.player_rotation) player:set_attach(entity.object, "", attach_at, entity.player_rotation)
player_api.player_attached[player:get_player_name()] = true
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({
@ -170,8 +199,14 @@ function mobs.attach(entity, player)
}) })
minetest.after(0.2, function() minetest.after(0.2, function()
if player and player:is_player() then if player and player:is_player() then
player_api.set_animation(player, "sit", 30)
if is_50 then
player_api.set_animation(player, "sit", 30)
else
default.player_set_animation(player, "sit", 30)
end
end end
end) end)
@ -180,12 +215,17 @@ end
function mobs.detach(player) function mobs.detach(player)
force_detach(player) force_detach(player)
minetest.after(0.1, function() minetest.after(0.1, function()
if player and player:is_player() then if player and player:is_player() then
local pos = find_free_pos(player:get_pos()) local pos = find_free_pos(player:get_pos())
pos.y = pos.y + 0.5 pos.y = pos.y + 0.5
player:set_pos(pos) player:set_pos(pos)
end end
end) end)
@ -193,8 +233,8 @@ end
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
@ -202,30 +242,35 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
end end
local acce_y = 0 local acce_y = 0
local velo = entity.object:get_velocity() local velo = entity.object:get_velocity() ; if not velo then return end
entity.v = get_v(velo) * get_sign(entity.v) entity.v = get_v(velo) * get_sign(entity.v)
-- process controls -- process controls
if entity.driver then if entity.driver then
local ctrl = entity.driver:get_player_control() local ctrl = entity.driver:get_player_control()
-- move forwards -- move forwards
if ctrl.up then if ctrl.up then
entity.v = entity.v + entity.accel / 10
entity.v = entity.v + entity.accel * dtime
-- move backwards -- move backwards
elseif ctrl.down then elseif ctrl.down then
if entity.max_speed_reverse == 0 and entity.v == 0 then if entity.max_speed_reverse == 0 and entity.v == 0 then
return return
end end
entity.v = entity.v - entity.accel / 10 entity.v = entity.v - entity.accel * dtime
end end
-- mob rotation -- mob rotation
local horz local horz
if entity.alt_turn == true then if entity.alt_turn == true then
horz = yaw horz = yaw
if ctrl.left then if ctrl.left then
@ -241,23 +286,32 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
entity.object:set_yaw(horz - entity.rotate) entity.object:set_yaw(horz - entity.rotate)
if can_fly then if can_fly then
-- fly up -- fly up
if ctrl.jump then if ctrl.jump then
velo.y = velo.y + 1 velo.y = velo.y + 1
if velo.y > entity.accel then velo.y = entity.accel end if velo.y > entity.accel then velo.y = entity.accel end
elseif velo.y > 0 then elseif velo.y > 0 then
velo.y = velo.y - 0.1
velo.y = velo.y - dtime
if velo.y < 0 then velo.y = 0 end if velo.y < 0 then velo.y = 0 end
end end
-- fly down -- fly down
if ctrl.sneak then if ctrl.sneak then
velo.y = velo.y - 1 velo.y = velo.y - 1
if velo.y < -entity.accel then velo.y = -entity.accel end if velo.y < -entity.accel then velo.y = -entity.accel end
elseif velo.y < 0 then elseif velo.y < 0 then
velo.y = velo.y + 0.1
velo.y = velo.y + dtime
if velo.y > 0 then velo.y = 0 end if velo.y > 0 then velo.y = 0 end
end end
else else
@ -274,6 +328,7 @@ 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
mobs:set_animation(entity, stand_anim) mobs:set_animation(entity, stand_anim)
end end
@ -292,27 +347,26 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
entity.v = entity.v - 0.02 * s entity.v = entity.v - 0.02 * s
if s ~= get_sign(entity.v) then if s ~= get_sign(entity.v) then
entity.object:set_velocity({x = 0, y = 0, z = 0}) entity.object:set_velocity({x = 0, y = 0, z = 0})
entity.v = 0 entity.v = 0
return return
end end
-- enforce speed limit forward and reverse -- enforce speed limit forward and reverse
local max_spd = entity.max_speed_reverse if entity.v > entity.max_speed_forward then
entity.v = entity.max_speed_forward
if get_sign(entity.v) >= 0 then elseif entity.v < -entity.max_speed_reverse then
max_spd = entity.max_speed_forward entity.v = -entity.max_speed_reverse
end
if abs(entity.v) > max_spd then
entity.v = entity.v - get_sign(entity.v)
end end
-- Set position, velocity and acceleration -- Set position, velocity and acceleration
local p = entity.object:get_pos() local p = entity.object:get_pos()
if not p then return end if not p then return end
local new_acce = {x = 0, y = -9.81, z = 0} local new_acce = {x = 0, y = entity.fall_speed, z = 0}
p.y = p.y - 0.5 p.y = p.y - 0.5
@ -320,18 +374,23 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
local v = entity.v local v = entity.v
if ni == "air" then if ni == "air" then
if can_fly == true then if can_fly == true then
new_acce.y = 0 new_acce.y = 0
end end
elseif ni == "liquid" or ni == "lava" then elseif ni == "liquid" or ni == "lava" then
if ni == "lava" and entity.lava_damage ~= 0 then if ni == "lava" and entity.lava_damage ~= 0 then
entity.lava_counter = (entity.lava_counter or 0) + dtime entity.lava_counter = (entity.lava_counter or 0) + dtime
if entity.lava_counter > 1 then if entity.lava_counter > 1 then
minetest.sound_play("default_punch", { minetest.sound_play("default_punch", {
object = entity.object, object = entity.object,
max_hear_distance = 5 max_hear_distance = 5
}) }, true)
entity.object:punch(entity.object, 1.0, { entity.object:punch(entity.object, 1.0, {
full_punch_interval = 1.0, full_punch_interval = 1.0,
@ -343,11 +402,14 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
end end
local terrain_type = entity.terrain_type local terrain_type = entity.terrain_type
if terrain_type == 2 or terrain_type == 3 then if terrain_type == 2 or terrain_type == 3 then
new_acce.y = 0 new_acce.y = 0
p.y = p.y + 1 p.y = p.y + 1
if node_is(p) == "liquid" then if node_is(p) == "liquid" then
if velo.y >= 5 then if velo.y >= 5 then
velo.y = 5 velo.y = 5
elseif velo.y < 0 then elseif velo.y < 0 then
@ -357,7 +419,9 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
end end
else else
if abs(velo.y) < 1 then if abs(velo.y) < 1 then
local pos = entity.object:get_pos() local pos = entity.object:get_pos()
if not pos then return end if not pos then return end
pos.y = floor(pos.y) + 0.5 pos.y = floor(pos.y) + 0.5
@ -371,6 +435,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
end end
local new_velo = get_velocity(v, yaw - rot_view, velo.y) local new_velo = get_velocity(v, yaw - rot_view, velo.y)
new_acce.y = new_acce.y + acce_y new_acce.y = new_acce.y + acce_y
entity.object:set_velocity(new_velo) entity.object:set_velocity(new_velo)
@ -382,12 +447,16 @@ end
-- directional flying routine 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()
local ctrl = entity.driver:get_player_control() ; if not ctrl then return end
local velo = entity.object:get_velocity() local velo = entity.object:get_velocity()
local dir = entity.driver:get_look_dir() local dir = entity.driver:get_look_dir()
local yaw = entity.driver:get_look_horizontal() + 1.57 -- offset fix between old and new commands local yaw = entity.driver:get_look_horizontal() + 1.57
if not ctrl or not velo then return end
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, y = dir.y * speed + 2,
@ -395,6 +464,7 @@ function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim)
}) })
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, y = dir.y * speed + 2,
@ -409,6 +479,7 @@ function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim)
-- firing arrows -- firing arrows
if ctrl.LMB and ctrl.sneak and shoots then if ctrl.LMB and ctrl.sneak and shoots then
local pos = entity.object:get_pos() local pos = entity.object:get_pos()
local obj = minetest.add_entity({ local obj = minetest.add_entity({
x = pos.x + 0 + dir.x * 2.5, x = pos.x + 0 + dir.x * 2.5,
@ -416,11 +487,15 @@ function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim)
z = pos.z + 0 + dir.z * 2.5}, arrow) z = pos.z + 0 + dir.z * 2.5}, arrow)
local ent = obj:get_luaentity() local ent = obj:get_luaentity()
if ent then if ent then
ent.switch = 1 -- for mob specific arrows ent.switch = 1 -- for mob specific arrows
ent.owner_id = tostring(entity.object) -- so arrows dont hurt entity you are riding ent.owner_id = tostring(entity.object) -- so arrows dont hurt entity you are riding
local vec = {x = dir.x * 6, y = dir.y * 6, z = dir.z * 6} local vec = {x = dir.x * 6, y = dir.y * 6, z = dir.z * 6}
yaw = entity.driver:get_look_horizontal() yaw = entity.driver:get_look_horizontal()
obj:set_yaw(yaw + pi / 2) obj:set_yaw(yaw + pi / 2)
obj:set_velocity(vec) obj:set_velocity(vec)
else else

View File

@ -23,7 +23,8 @@ Lucky Blocks: 9
Changelog: Changelog:
- 1.55 - Add 'peaceful_player' privelage and setting so mobs don't attack specific players (thanks sfence) - 1.56 - Added arrow_override function to mob definition to tweak arrow entity settings, tamed monsters no longer despawn when outside loaded map area.
- 1.55 - Add 'peaceful_player' privelage and setting so mobs don't attack specific players (thanks sfence), add support for MarkBu's pathfinder mod, remove need for default mod
- 1.54 - Simplified animal breeding function, added editable settings (thanks Wuzzy), Child mobs now take 20 mins to grow up, reverted to simple mob spawning with setting to use area checks, on_flop added, air_damage added. - 1.54 - Simplified animal breeding function, added editable settings (thanks Wuzzy), Child mobs now take 20 mins to grow up, reverted to simple mob spawning with setting to use area checks, on_flop added, air_damage added.
- 1.53 - Added 'on_map_load' settings to mobs:spawn so that mobs will only spawn when new areas of map are loaded. - 1.53 - Added 'on_map_load' settings to mobs:spawn so that mobs will only spawn when new areas of map are loaded.
- 1.52 - Added 'mob_active_limit' in settings to set number of mobs in game, - 1.52 - Added 'mob_active_limit' in settings to set number of mobs in game,

View File

@ -13,6 +13,9 @@ mobs_griefing (Griefing Mobs) bool true
# If false then Mobs no longer spawn inside player protected areas # If false then Mobs no longer spawn inside player protected areas
mobs_spawn_protected (Spawn Mobs in protected areas) bool true mobs_spawn_protected (Spawn Mobs in protected areas) bool true
# If false then Monsters no longer spawn inside player protected areas
mobs_spawn_monster_protected (Spawn Monsters in protected areas) bool true
# If true Mobs will be removed once a map chunk is out of view # If true Mobs will be removed once a map chunk is out of view
remove_far_mobs (Remove far Mobs) bool true remove_far_mobs (Remove far Mobs) bool true
@ -39,3 +42,6 @@ mob_area_spawn (Mob Area Spawn) bool false
# Enable peaceful player attack prevention # Enable peaceful player attack prevention
enable_peaceful_player (Mobs do not attack peaceful player without reason) bool false enable_peaceful_player (Mobs do not attack peaceful player without reason) bool false
# Enable mobs smooth rotation
mob_smooth_rotate (Smooth rotation for mobs) bool true

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 B