1
0
mirror of https://codeberg.org/tenplus1/mobs_redo.git synced 2025-07-29 13:30:22 +02:00

Compare commits

..

75 Commits

Author SHA1 Message Date
dc29ed09e6 nil check for mobs:boom pos 2025-07-29 07:16:45 +01:00
ae21b80f08 report error if self.texture_mods is not a string 2025-07-21 14:03:05 +01:00
84377ee259 fix on_pick_up example in api.txt 2025-06-14 08:51:26 +01:00
5077217497 in peaceful mode dont register monster abm's 2025-06-03 13:41:39 +01:00
bae9cb12e2 add missing log level (thx Niklp) 2025-05-30 07:45:47 +01:00
126e5afc24 default active_block_range to 4 if not set 2025-05-26 07:23:15 +01:00
112c512c6e add mob repellent info 2025-05-25 13:32:46 +01:00
0f5b0e382d add recipe for mob repellent 2025-05-23 12:45:56 +01:00
5ed3a34cf3 remove self.attack_players check from do_punch 2025-05-20 08:13:06 +01:00
f44441c580 remove tester 2025-05-17 07:44:15 +01:00
2cf43ffc4e fix fear_height defaults 2025-05-17 07:43:26 +01:00
0d6b794fa0 default fear_height to 2 2025-05-16 10:46:45 +01:00
42da759407 tamed npc/animal wont attack players unless provoked 2025-05-15 15:44:22 +01:00
c0c4c3ea48 tweak general_attack 2025-05-15 14:34:38 +01:00
f5817061ce little tidy 2025-05-11 11:01:32 +01:00
43ad058efa change minetest. to core. 2025-05-04 12:25:59 +01:00
b977431e21 is_node_dangerous only if damage > 0 2025-05-01 08:01:12 +01:00
68b25c9d08 use tnt or mcl_explosions for mobs:boom 2025-04-11 10:12:30 +01:00
24adcae920 add self check in tnt boom 2025-04-11 08:46:01 +01:00
16a04547ab fix texture name 2025-04-10 09:42:58 +01:00
3a7b1bbfe6 added mobs_heart_particle.png 2025-04-09 15:15:41 +01:00
01a60d9a55 add particles to replace defaults 2025-04-09 15:11:47 +01:00
99f4fc1768 move deprecated functions from api to compatibility.lua 2025-04-08 08:33:25 +01:00
027620bfa3 tidy comments, change float var 2025-04-05 12:09:03 +01:00
854834f04e deprecate self.jump and add mobs.compatibility_check function. 2025-04-04 10:12:46 +01:00
5fb7b91db0 fix typo 2025-03-20 08:06:40 +00:00
badb889cf3 add 'mob_infotext' setting 2025-03-20 08:05:24 +00:00
ca7aeec95a add nil check on_punch 2025-03-18 08:06:40 +00:00
14f391bf2c add ukrainian translation (thx Fromkaniv) 2025-03-15 16:37:52 +00:00
0bf3915315 return func 2025-03-12 08:16:26 +00:00
b81c2aeab6 update dates, add sound_play check 2025-03-12 08:03:17 +00:00
0a62f05132 add mob repellent 2025-02-09 12:12:52 +00:00
9f472fb690 tweak do_jump 2025-02-04 15:06:59 +00:00
c62b013825 add pick_up and on_pick_up features. 2025-02-04 10:21:10 +00:00
4b825b3e86 call do_punch after damage calculated 2025-02-01 13:57:27 +00:00
f09b6d1730 pass mesh to arrow (thx kiedtl) 2025-01-20 08:00:26 +00:00
a3ede86365 update api.txt 2025-01-19 08:15:33 +00:00
4b556a4d16 pass damage to do_punch 2025-01-18 08:17:11 +00:00
01e015dc0f disable is_mob flag, something fishy with mineclonia 2025-01-17 08:08:24 +00:00
d7998a9ea7 abort on_step when mob expires (thx tour-ist) 2025-01-09 16:20:23 +00:00
57fe6cf2e3 tweak & tidy code, exploding mobs brighten and glow 2024-12-28 11:19:44 +00:00
b170b51f2d tweak do_jump so mobs dont jump on carpets 2024-12-26 11:08:36 +00:00
dca4159fc4 code tidy 2024-12-26 08:48:35 +00:00
219d477c2a wee tidy 2024-12-20 10:49:52 +00:00
c8e91d1958 tweak spawning 2024-12-19 07:36:23 +00:00
22d7ea79fd fix riding gravity 2024-12-13 15:49:52 +00:00
c24874a3bf fix map_load chance check 2024-12-08 10:33:54 +00:00
c25975e7ea fix typo 2024-12-02 06:34:28 +00:00
03ce8ada6b tweak/tidy, check env damage when riding mob 2024-12-01 12:18:44 +00:00
cc60499637 tweak n tidy 2024-11-30 12:35:22 +00:00
58792311c7 add immune_to check to is_node_dangerous function 2024-11-28 13:07:53 +00:00
527fe8c2d5 add nodes to immune_to ability. 2024-11-27 08:22:09 +00:00
6a7c221ce1 fix boom texture 2024-11-22 14:13:22 +00:00
b8052c817c replace empty var 2024-11-22 14:08:34 +00:00
e17ea86bf5 restore mobs:boom order 2024-11-22 08:11:25 +00:00
ca76558edd switch node/entity setting in mobs:boom 2024-11-21 15:35:07 +00:00
bde53c3475 add mobs:is_invisible() function, update api.txt 2024-11-16 08:16:55 +00:00
2e4664a5ce use invisibility mod api 2024-11-14 08:17:41 +00:00
39f9f8df31 add reach option to replace function. 2024-11-13 11:04:27 +00:00
1b1f681886 tidy spawning 2024-11-10 11:41:32 +00:00
627d468b9a add replace sound, tweak spawn egg y_pos 2024-10-28 13:27:39 +00:00
e9c3d6c505 add brazilian translation (thx pixelzone) 2024-10-26 10:21:27 +01:00
1f8ca901b5 fix russian typo 2024-10-23 08:02:34 +01:00
816461286b update russian translation (thx SkyBuilder1717) 2024-10-22 17:00:17 +01:00
430af1e91d add 'mobs_disable_damage_kb' setting 2024-10-20 09:19:52 +01:00
79fb4f7ead disable follow_stop 2024-10-19 15:06:59 +01:00
f746f4b1e0 fix knockback when breeding 2024-10-12 10:27:25 +01:00
e59fd53ee9 make sure def.gain has a value 2024-10-11 10:24:07 +01:00
faf511ff8c fix visharm indicate on active 2024-10-10 11:30:22 +01:00
a35afc8299 disable node hearing by default 2024-10-10 10:37:47 +01:00
219db764bf forgot def.loudness check 2024-10-02 15:51:05 +01:00
e4a5ead82c pass def onto hearing nodes 2024-10-02 15:13:37 +01:00
f4861ced2a add on_sound node support and example. 2024-10-02 14:57:07 +01:00
1dd81eb008 tweak mob hear function 2024-10-01 09:08:52 +01:00
64c6085f09 wee jump bug 2024-09-17 09:43:01 +01:00
22 changed files with 1275 additions and 1221 deletions

1865
api.lua

File diff suppressed because it is too large Load Diff

92
api.txt
View File

@ -50,7 +50,7 @@ functions needed for the mob to work properly which contains the following:
set to 0 for jumping mobs only.
'randomly_turn' if set to false then mob will not turn to face player or
randomly turn while walking or standing.
'jump' when true allows your mob to jump updwards.
'jump' when true allows your mob to jump updwards[DEPRECATED].
'jump_height' holds the height your mob can jump, 0 to disable jumping.
'can_leap' when true obstacles like fences or pits wont stop a mob
from trying to jump out.
@ -85,8 +85,6 @@ functions needed for the mob to work properly which contains the following:
'fire_damage' holds the damage per second inflicted to mobs when standing
'node_damage' True by default, will harm mobs when inside damage_per_second
nodes.
in fire.
'light_damage' holds the damage per second inflicted to mobs when light
level is between the min and max values below
'light_damage_min' minimum light value when mob is affected (default: 14)
@ -94,7 +92,7 @@ functions needed for the mob to work properly which contains the following:
When set to 16 then only natural light will kill mob.
'suffocation' when > 0 mobs will suffocate inside solid blocks and will be
hurt by the value given every second (0 to disable).
'floats' when set to 1 mob will float in water, 0 has them sink.
'floats' when True mob will float in water, otherwise they sink.
'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
breed e.g. {"farming:wheat", "default:apple", "group:fish"}
@ -104,7 +102,8 @@ functions needed for the mob to work properly which contains the following:
'docile_by_day' when true has mobs wandering around during daylight
hours and only attacking player at night or when
provoked.
'attack_chance' 0 to 100 chance the mob will attack (default is 5).
'attack_chance' 0 to 100 chance the mob will attack (default is 5),
set to 100 so that mob needs to be provoked to attack.
'attack_patience' Time in seconds before mob gives up attacking if
player isn't seen (Defaults to 11).
'attack_monsters' when true mob will attack monsters.
@ -178,6 +177,9 @@ functions needed for the mob to work properly which contains the following:
{"default:gold_lump", -10} -- heals by 10 health points.
{"default:coal_block", 20} -- 20 damage when hit on head with coal blocks.
{"all"} -- stops all weapons causing damage apart from those on list.
nodes can also be added so that node_per_second damage
does not affect the mob either e.g.
{"ethereal:crystal_spike", 0} -- causes no damage.
'makes_footstep_sound' when true you can hear mobs walking.
'sounds' this is a table with sounds of the mob
@ -229,8 +231,6 @@ functions needed for the mob to work properly which contains the following:
'rotate' custom model rotation, 0 = front, 90 = side, 180 = back,
270 = other side.
'glow' has mob glow without light source, 0 to 15 or nil to disable
'double_melee_attack' when true has the api choose between 'punch' and
'punch2' animations. [DEPRECATED]
'animation' holds a table containing animation names and settings for use with
mesh models:
@ -289,11 +289,12 @@ eating.
y offset by using this instead:
{
{"group:grass", "air", 0},
{"default:dirt_with_grass", "default:dirt", -1}
{"default:dirt_with_grass", "default:dirt", -1, 0}
}
'replace_with' replace with what e.g. "air" or in chickens case "mobs:egg"
'replace_rate' how random should the replace rate be (typically 10)
'replace_offset' +/- value to check specific node to replace
'replace_offset' +/- y offset value to check specific node to replace
'reach' horizontal reach around mob for replace, default is 0
'on_replace(self, pos, oldnode, newnode)' is called when mob is about to
replace a node.
@ -308,6 +309,25 @@ eating.
properties. (DEPRECATED, use on_replace to make changes).
Pickup Items
------------
'pick_up' table of itemstrings the mob will pick up.
'on_pick_up' function that will be called on item pickup - arguments are
(self, itemtable) and can return nil or a a modified itemstack e.g.
on_pick_up = function(self, itemtable)
local istack = ItemStack(itemtable.itemstring)
print("-- took", istack:get_name())
istack:take_item()
return istack
end,
Custom Definition Functions
---------------------------
@ -329,8 +349,9 @@ enhance mob functionality and have them do many interesting things:
'on_grown' is called when a child mob has grown up, only paramater is
(self).
'do_punch' called when mob is punched with paramaters (self, hitter,
time_from_last_punch, tool_capabilities, direction), return
false to stop punch damage and knockback from taking place.
time_from_last_punch, tool_capabilities, direction, damage),
return false to stop punch damage and knockback from taking
place.
'custom_attack' when set this function is called instead of the normal mob
melee attack, parameters are (self, to_attack) and if true
is returned normal attack function continued.
@ -348,16 +369,23 @@ enhance mob functionality and have them do many interesting things:
'on_sound' (self, def) called when mob is inside the hearing distance of
a sound, passes a def table containing:
'sound' the sound being played,
'pos' position the sound originated,
'pos' position the sound originated (only sounds with pos detected),
'gain' original gain of sound,
'distance' distance of mob from sound source,
'loudness' how loud sound is to mob (0 = cant hear, 1.0 = near sound), this
would be used as the main value inside on_sound function,
'player' player name sound originated,
'object' object reference sound originated,
'loudness' how loud sound is to mob (percentage of gain heard at distance)
'player' player name sound originated, [NOT IN USE]
'object' object reference sound originated, [NOT IN USE]
'max_hear_distance' max distance sound can be heard from source.
Hearing Nodes
-------------
If a node has the {on_sound = 1} group and an on_sound() function set as above then
nodes within 8 blocks of a sound will be activated and the function run. Check the
"mobs:hearing_vines" node as an example which has mesecons support when active.
Internal Variables
------------------
@ -557,6 +585,7 @@ This function registers a arrow for mobs with the attack type shoot.
'definition' is a table with the following values:
'visual' same is in minetest.register_entity()
'visual_size' same is in minetest.register_entity()
'mesh' same is in minetest.register_entity()
'textures' same is in minetest.register_entity()
'collide_with_objects' same as above
'velocity' the velocity of the arrow
@ -611,11 +640,11 @@ Explosion Function
mobs:explosion(pos, radius) -- DEPRECATED!!! use mobs:boom() instead
mobs:boom(self, pos, radius, damage_radius, texture)
mobs:boom(self, pos, damage_radius, entity_radius, texture)
'self' mob entity
'pos' centre position of explosion
'radius' radius of explosion (typically set to 3)
'damage_radius' radius of damage around explosion
'damage_radius' radius of node damage (typically 3)
'entity_radius' radius of explosion to players and mobs
'texture' particle texture during explosion, defaults to "tnt_smoke.png"
This function generates an explosion which removes nodes in a specific radius
@ -840,8 +869,8 @@ External Settings for "minetest.conf"
mob for obstructions before spawning, otherwise it
defaults to checking the height of the mob only.
'mob_smooth_rotate' Enables smooth rotation when mobs turn by default.
'mob_height_fix' Enabled by default, increases smaller mob heights so they wont
glitch through certain nodes.
'mob_height_fix' Disabled by default, increases smaller mob heights so they
cannot glitch through certain nodes.
'mob_pathfinding_enable' Enable pathfinding.
'mob_pathfinding_stuck_timeout' How long before stuck mobs start searching. (default 3.0)
'mob_pathfinding_stuck_path_timeout' How long will mob follow path before giving up. (default 5.0)
@ -850,6 +879,13 @@ External Settings for "minetest.conf"
'mob_pathfinding_searchdistance' max search distance from search positions (default 16)
'mob_pathfinding_max_jump' max jump height for pathfinding (default 4)
'mob_pathfinding_max_drop' max drop height for pathfinding (default 6)
'mobs_can_hear' Enabled by default, overrides minetest.sound_play and enables
nearby mobs to run a custom on_sound function.
'mobs_can_hear_node' Disabled by default, allows nearby nodes to hear and run a
custom on_sound function.
'mobs_disable_damage_kb' Knockback is calculated by hit damage or uses knockback value
from the weapon used, this setting lets you disable the former.
'mob_infotext' True by default, shows mob information when you hover over one.
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
@ -890,3 +926,17 @@ Rideable Horse Example Mob
--------------------------
See mob_horse mod https://codeberg.org/tenplus1/mob_horse
External Functions
------------------
These are a list of utility functions that can be called from 3rd party mods.
mobs:alias_mob(old_name, new_name)
mobs:is_invisible(self, player_name)
mobs:is_dangerous(self, nodename)
mobs:yaw_to_pos(self, target, rotation_steps)
mobs:line_of_sight(self, pos1, pos2)
mobs:set_animation(self, animation)
mobs:yaw(self, yaw, rotation_steps)

41
compatibility.lua Normal file
View File

@ -0,0 +1,41 @@
-- called after mob registration to check for older settings
function mobs.compatibility_check(self)
-- simple mobs rotation setting
if self.drawtype == "side" then self.rotate = math.rad(90) end
-- replace floats var from number to bool
if self.floats == 1 then self.floats = true
elseif self.floats == 0 then self.floats = false end
end
-- deprecated functions
function mobs:yaw(entity, yaw, delay)
entity:set_yaw(yaw, delay)
end
function mobs:set_animation(entity, anim)
entity:set_animation(anim)
end
function mobs:line_of_sight(entity, pos1, pos2)
return entity:line_of_sight(pos1, pos2)
end
function mobs:yaw_to_pos(entity, target, rot)
return entity:yaw_to_pos(target, rot)
end
function mobs:register_spawn(name, nodes, max_light, min_light, chance,
active_object_count, max_height, day_toggle)
mobs:spawn_specific(name, nodes, {"air"}, min_light, max_light, 30,
chance, active_object_count, -31000, max_height, day_toggle)
end
function mobs:explosion(pos, radius)
mobs:boom({sounds = {explode = "tnt_explode"}}, pos, radius, radius, "mobs_tnt_smoke.png")
end

View File

@ -1,8 +1,8 @@
local S = minetest.get_translator("mobs")
local FS = function(...) return minetest.formspec_escape(S(...)) end
local mc2 = minetest.get_modpath("mcl_core")
local mod_def = minetest.get_modpath("default")
local S = core.get_translator("mobs")
local FS = function(...) return core.formspec_escape(S(...)) end
local mc2 = core.get_modpath("mcl_core")
local mod_def = core.get_modpath("default")
-- determine which sounds to use, default or mcl_sounds
@ -29,7 +29,7 @@ sound_helper("node_sound_glass_defaults")
function mobs.add_eatable(item, hp)
local def = minetest.registered_items[item]
local def = core.registered_items[item]
if def then
@ -37,7 +37,7 @@ function mobs.add_eatable(item, hp)
groups.eatable = hp ; groups.flammable = 2
minetest.override_item(item, {groups = groups})
core.override_item(item, {groups = groups})
end
end
@ -46,6 +46,7 @@ end
local items = {
paper = mc2 and "mcl_core:paper" or "default:paper",
dye_black = mc2 and "mcl_dye:black" or "dye:black",
dye_red = mc2 and "mcl_dye:red" or "dye:red",
string = mc2 and "mcl_mobitems:string" or "farming:string",
stick = mc2 and "mcl_core:stick" or "default:stick",
diamond = mc2 and "mcl_core:diamond" or "default:diamond",
@ -58,17 +59,18 @@ local items = {
fence_wood = mc2 and "group:fence_wood" or "default:fence_wood",
meat_raw = mc2 and "mcl_mobitems:beef" or "group:food_meat_raw",
meat_cooked = mc2 and "mcl_mobitems:cooked_beef" or "group:food_meat",
obsidian = mc2 and "mcl_core:obsidian" or "default:obsidian"
}
-- name tag
minetest.register_craftitem("mobs:nametag", {
core.register_craftitem("mobs:nametag", {
description = S("Name Tag") .. " " .. S("\nRight-click Mobs Redo mob to apply"),
inventory_image = "mobs_nametag.png",
groups = {flammable = 2, nametag = 1}
})
minetest.register_craft({
core.register_craft({
output = "mobs:nametag",
recipe = {
{ items.paper, items.dye_black, items.string }
@ -77,7 +79,7 @@ minetest.register_craft({
-- leather
minetest.register_craftitem("mobs:leather", {
core.register_craftitem("mobs:leather", {
description = S("Leather"),
inventory_image = "mobs_leather.png",
groups = {flammable = 2, leather = 1}
@ -85,10 +87,10 @@ minetest.register_craftitem("mobs:leather", {
-- raw meat
minetest.register_craftitem("mobs:meat_raw", {
core.register_craftitem("mobs:meat_raw", {
description = S("Raw Meat"),
inventory_image = "mobs_meat_raw.png",
on_use = minetest.item_eat(3),
on_use = core.item_eat(3),
groups = {food_meat_raw = 1}
})
@ -96,16 +98,16 @@ mobs.add_eatable("mobs:meat_raw", 3)
-- cooked meat
minetest.register_craftitem("mobs:meat", {
core.register_craftitem("mobs:meat", {
description = S("Meat"),
inventory_image = "mobs_meat.png",
on_use = minetest.item_eat(8),
on_use = core.item_eat(8),
groups = {food_meat = 1}
})
mobs.add_eatable("mobs:meat", 8)
minetest.register_craft({
core.register_craft({
type = "cooking",
output = "mobs:meat",
recipe = "mobs:meat_raw",
@ -114,13 +116,13 @@ minetest.register_craft({
-- lasso
minetest.register_tool("mobs:lasso", {
core.register_tool("mobs:lasso", {
description = S("Lasso (right-click animal to put in inventory)"),
inventory_image = "mobs_magic_lasso.png",
groups = {flammable = 2}
})
minetest.register_craft({
core.register_craft({
output = "mobs:lasso",
recipe = {
{ items.string, "", items.string},
@ -129,17 +131,17 @@ minetest.register_craft({
}
})
minetest.register_alias("mobs:magic_lasso", "mobs:lasso")
core.register_alias("mobs:magic_lasso", "mobs:lasso")
-- net
minetest.register_tool("mobs:net", {
core.register_tool("mobs:net", {
description = S("Net (right-click animal to put in inventory)"),
inventory_image = "mobs_net.png",
groups = {flammable = 2}
})
minetest.register_craft({
core.register_craft({
output = "mobs:net",
recipe = {
{ items.stick, "", items.stick },
@ -150,13 +152,13 @@ minetest.register_craft({
-- shears (right click to shear animal)
minetest.register_tool("mobs:shears", {
core.register_tool("mobs:shears", {
description = S("Steel Shears (right-click to shear)"),
inventory_image = "mobs_shears.png",
groups = {flammable = 2}
})
minetest.register_craft({
core.register_craft({
output = "mobs:shears",
recipe = {
{ "", items.steel_ingot, "" },
@ -166,13 +168,13 @@ minetest.register_craft({
-- protection rune
minetest.register_craftitem("mobs:protector", {
core.register_craftitem("mobs:protector", {
description = S("Mob Protection Rune"),
inventory_image = "mobs_protector.png",
groups = {flammable = 2}
})
minetest.register_craft({
core.register_craft({
output = "mobs:protector",
recipe = {
{ items.stone, items.stone, items.stone },
@ -183,13 +185,13 @@ minetest.register_craft({
-- protection rune (level 2)
minetest.register_craftitem("mobs:protector2", {
core.register_craftitem("mobs:protector2", {
description = S("Mob Protection Rune (Level 2)"),
inventory_image = "mobs_protector2.png",
groups = {flammable = 2}
})
minetest.register_craft({
core.register_craft({
output = "mobs:protector2",
recipe = {
{ "mobs:protector", items.mese_crystal, "mobs:protector" },
@ -198,15 +200,34 @@ minetest.register_craft({
}
})
-- mob repellent node
core.register_node("mobs:mob_repellent", {
description = S("Mob Repellent (Stops mobs spawning within 16 block radius)"),
tiles = {"mobs_repellent.png"},
is_ground_content = false,
groups = {handy = 1, cracky = 3},
sounds = mobs.node_sound_stone_defaults()
})
core.register_craft({
output = "mobs:mob_repellent",
recipe = {
{ items.obsidian, items.dye_red, items.obsidian },
{ items.obsidian, "mobs:protector", items.obsidian },
{ items.obsidian, items.obsidian, items.obsidian }
}
})
-- saddle
minetest.register_craftitem("mobs:saddle", {
core.register_craftitem("mobs:saddle", {
description = S("Saddle"),
inventory_image = "mobs_saddle.png",
groups = {flammable = 2, saddle = 1}
})
minetest.register_craft({
core.register_craft({
output = "mobs:saddle",
recipe = {
{"group:leather", "group:leather", "group:leather"},
@ -234,7 +255,7 @@ end
-- mob fence top (has enlarged collisionbox to stop mobs getting over)
minetest.register_node("mobs:fence_top", {
core.register_node("mobs:fence_top", {
description = S("Mob Fence Top"),
drawtype = "nodebox",
tiles = {"default_wood.png"},
@ -247,7 +268,7 @@ minetest.register_node("mobs:fence_top", {
selection_box = {type = "fixed", fixed = {-0.4, -1.5, -0.4, 0.4, 0, 0.4}}
})
minetest.register_craft({
core.register_craft({
output = "mobs:fence_top 12",
recipe = {
{"group:wood", "group:wood", "group:wood"},
@ -257,13 +278,13 @@ minetest.register_craft({
-- items that can be used as fuel
minetest.register_craft({type = "fuel", recipe = "mobs:nametag", burntime = 3})
minetest.register_craft({type = "fuel", recipe = "mobs:lasso", burntime = 7})
minetest.register_craft({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})
core.register_craft({type = "fuel", recipe = "mobs:nametag", burntime = 3})
core.register_craft({type = "fuel", recipe = "mobs:lasso", burntime = 7})
core.register_craft({type = "fuel", recipe = "mobs:net", burntime = 8})
core.register_craft({type = "fuel", recipe = "mobs:leather", burntime = 4})
core.register_craft({type = "fuel", recipe = "mobs:saddle", burntime = 7})
core.register_craft({type = "fuel", recipe = "mobs:fence_wood", burntime = 7})
core.register_craft({type = "fuel", recipe = "mobs:fence_top", burntime = 2})
-- this tool spawns same mob and adds owner, protected, nametag info
@ -272,7 +293,7 @@ minetest.register_craft({type = "fuel", recipe = "mobs:fence_top", burntime = 2}
local tex_obj
minetest.register_tool(":mobs:mob_reset_stick", {
core.register_tool(":mobs:mob_reset_stick", {
description = S("Mob Reset Stick"),
inventory_image = "default_stick.png^[colorize:#ff000050",
stack_max = 1,
@ -290,7 +311,7 @@ minetest.register_tool(":mobs:mob_reset_stick", {
if obj and not sneak then
local self = obj:get_luaentity()
local obj2 = minetest.add_entity(obj:get_pos(), self.name)
local obj2 = core.add_entity(obj:get_pos(), self.name)
if obj2 then
@ -326,7 +347,7 @@ minetest.register_tool(":mobs:mob_reset_stick", {
local name = user:get_player_name()
minetest.show_formspec(name, "mobs_texture", "size[8,4]"
core.show_formspec(name, "mobs_texture", "size[8,4]"
.. "field[0.5,1;7.5,0;name;"
.. FS("Enter texture:") .. ";" .. bt .. "]"
.. "button_exit[2.5,3.5;3,1;mob_texture_change;"
@ -335,7 +356,7 @@ minetest.register_tool(":mobs:mob_reset_stick", {
end
})
minetest.register_on_player_receive_fields(function(player, formname, fields)
core.register_on_player_receive_fields(function(player, formname, fields)
-- right-clicked with nametag and name entered?
if formname == "mobs_texture" and fields.name and fields.name ~= "" then
@ -365,22 +386,22 @@ end)
-- Meat Block
minetest.register_node("mobs:meatblock", {
core.register_node("mobs:meatblock", {
description = S("Meat Block"),
tiles = {"mobs_meat_top.png", "mobs_meat_bottom.png", "mobs_meat_side.png"},
paramtype2 = "facedir",
groups = {choppy = 1, oddly_breakable_by_hand = 1, axey = 1, handy = 1},
is_ground_content = false,
sounds = mobs.node_sound_dirt_defaults(),
on_place = minetest.rotate_node,
on_use = minetest.item_eat(20),
on_place = core.rotate_node,
on_use = core.item_eat(20),
_mcl_hardness = 0.8,
_mcl_blast_resistance = 1
})
mobs.add_eatable("mobs:meatblock", 20)
minetest.register_craft({
core.register_craft({
output = "mobs:meatblock",
recipe = {
{ items.meat_cooked, items.meat_cooked, items.meat_cooked },
@ -391,22 +412,22 @@ minetest.register_craft({
-- Meat Block (raw)
minetest.register_node("mobs:meatblock_raw", {
core.register_node("mobs:meatblock_raw", {
description = S("Raw Meat Block"),
tiles = {"mobs_meat_raw_top.png", "mobs_meat_raw_bottom.png", "mobs_meat_raw_side.png"},
paramtype2 = "facedir",
groups = {choppy = 1, oddly_breakable_by_hand = 1, axey = 1, handy = 1},
is_ground_content = false,
sounds = mobs.node_sound_dirt_defaults(),
on_place = minetest.rotate_node,
on_use = minetest.item_eat(20),
on_place = core.rotate_node,
on_use = core.item_eat(20),
_mcl_hardness = 0.8,
_mcl_blast_resistance = 1
})
mobs.add_eatable("mobs:meatblock_raw", 20)
minetest.register_craft({
core.register_craft({
output = "mobs:meatblock_raw",
recipe = {
{ items.meat_raw, items.meat_raw, items.meat_raw },
@ -415,9 +436,65 @@ minetest.register_craft({
}
})
minetest.register_craft({
core.register_craft({
type = "cooking",
output = "mobs:meatblock",
recipe = "mobs:meatblock_raw",
cooktime = 30
})
-- hearing vines (if mesecons active it acts like blinkyplant)
local mod_mese = core.get_modpath("mesecons")
core.register_node("mobs:hearing_vines", {
description = S("Hearing Vines"),
drawtype = "firelike",
waving = 1,
tiles = {"mobs_hearing_vines.png"},
inventory_image = "mobs_hearing_vines.png",
wield_image = "mobs_hearing_vines.png",
paramtype = "light",
sunlight_propagates = true,
walkable = false,
buildable_to = true,
groups = {snappy = 3, flammable = 3, attached_node = 1, on_sound = 1},
sounds = mobs.node_sound_leaves_defaults(),
selection_box = {
type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16},
},
on_sound = function(pos, def)
if def.loudness > 0.5 then
core.set_node(pos, {name = "mobs:hearing_vines_active"})
end
end
})
core.register_node("mobs:hearing_vines_active", {
description = S("Active Hearing Vines"),
drawtype = "firelike",
waving = 1,
tiles = {"mobs_hearing_vines_active.png"},
inventory_image = "mobs_hearing_vines_active.png",
wield_image = "mobs_hearing_vines_active.png",
paramtype = "light",
sunlight_propagates = true,
walkable = false,
buildable_to = true,
light_source = 1,
damage_per_second = 4,
drop = "mobs:hearing_vines",
groups = {snappy = 3, flammable = 3, attached_node = 1, not_in_creative_inventory = 1},
sounds = mobs.node_sound_leaves_defaults(),
selection_box = {
type = "fixed", fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16},
},
on_construct = function(pos)
core.get_node_timer(pos):start(1)
if mod_mese then mesecon.receptor_on(pos) end
end,
on_timer = function(pos)
core.set_node(pos, {name = "mobs:hearing_vines"})
if mod_mese then mesecon.receptor_off(pos) end
end
})

View File

@ -1,22 +1,25 @@
local S = core.get_translator("mobs")
-- peaceful player privilege
minetest.register_privilege("peaceful_player", {
core.register_privilege("peaceful_player", {
description = "Prevents Mobs Redo mobs from attacking player",
give_to_singleplayer = false
})
-- fallback node
minetest.register_node("mobs:fallback_node", {
description = "Fallback Node",
core.register_node("mobs:fallback_node", {
description = S("Fallback Node"),
tiles = {"mobs_fallback.png"},
is_ground_content = false,
groups = {handy = 1, crumbly = 3, not_in_creative_inventory = 1},
drop = ""
})
local path = minetest.get_modpath("mobs")
local path = core.get_modpath("mobs")
dofile(path .. "/api.lua") -- mob API
@ -28,7 +31,7 @@ dofile(path .. "/spawner.lua") -- mob spawner
-- Lucky Blocks
if minetest.get_modpath("lucky_block") then
if core.get_modpath("lucky_block") then
dofile(path .. "/lucky_block.lua")
end

View File

@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2016 TenPlus1
Copyright (c) 2025 TenPlus1
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@ -20,6 +20,10 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
Textures borrowed from minetest_game (CC BY-SA 3.0):
mobs_tnt_smoke.png
mobs_bubble_particle.png
mobs_heart_particle.png
Textures under CC0 license by TenPlus1

38
locale/mobs.pt_BR.tr Normal file
View File

@ -0,0 +1,38 @@
# textdomain: mobs
** Peaceful Mode Active - No Monsters Will Spawn=
Active Mob Limit Reached!=Limite de Mob Ativo Atingido!
Mob has been protected!=Mob foi protegido
@1 (Tamed)=@1 (Domesticado)
Not tamed!=Não domesticado!
@1 is owner!=Dono @1!
Missed!=Faltou!
Already protected!=
@1 has been tamed!=@1 foi domesticado!
@1 follows:=@1 Segue:
@1 mobs removed.=@1 mobs removido.
Enter name:=Insira um nome:
Rename=Renomear
Name Tag=Etiqueta
Leather=Couro
Raw Meat=Carne crua
Meat=Carne
Lasso (right-click animal to put in inventory)=Laço (clique-direito no animal para por no inventario)
Net (right-click animal to put in inventory)=Net (clique-direito no animal para por no inventario)
Steel Shears (right-click to shear)=Tesoura de Aço (clique-direito para tosquiar)
Mob Protection Rune=Runa de Proteção para Mob
Mob Protection Rune (Level 2)=Runa de Proteção para Mob (Nivel 2)
Saddle=Sela
Mob Fence= Cerca para mob
Mob Fence Top= Topo da cerca para mob
Mob Reset Stick=
Meat Block=Bloco de carne
Raw Meat Block=Bloco de Carne crua
Enter texture:=Insira a textura:
Change=Mudar
Mob Spawner=Spawner de mob
(mob name) (min light) (max light) (amount) (player distance) (Y offset)=(Nome do mob) (min light) (max light) (amount) (player distance) (Y offset)
Command:=Comando:
Spawner Not Active (enter settings)=Spawner Inativo (configurar)
Spawner Active (@1)=Spawner Ativo (@1)
Mob Spawner settings failed!=Configuraçao de Spawner do Mob falhou!
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]”=

View File

@ -1,38 +1,38 @@
# textdomain: mobs
** Peaceful Mode Active - No Monsters Will Spawn=** Мирный модус активирован - монстры не спаунятся
Active Mob Limit Reached!=
Mob has been protected!=Моб защищен!
** Peaceful Mode Active - No Monsters Will Spawn=** Мирный Режим Активен - Никаких Монстров Не Появиться
Active Mob Limit Reached!=Лимит Активных Мобов Достигнут!
Mob has been protected!=Моб был защищён!
@1 (Tamed)=@1 (Прирученный)
Not tamed!=Не прирученный
@1 is owner!=@1 владелец
Not tamed!=Не прирученный!
@1 is owner!=@1 владелец!
Missed!=Промазал!
Already protected!=Уже защищен!
@1 has been tamed!=@1 приручен
@1 follows:=
@1 mobs removed.=
Already protected!=Уже защищён!
@1 has been tamed!=@1 был приручен!
@1 follows:=@1 следует:
@1 mobs removed.=@1 мобов удалено.
Enter name:=Введите имя:
Rename=Переименовать
Name Tag=Новый тэг
Name Tag=Новый Тег
Leather=Кожа
Raw Meat=Сырое мясо
Raw Meat=Сырое Мясо
Meat=Мясо
Lasso (right-click animal to put in inventory)=Лассо (Правый клик - положить животное в инвентарь)
Net (right-click animal to put in inventory)=Сеть (Правый клик - положить животное в инвентарь)
Steel Shears (right-click to shear)=Ножницы (Правый клик - подстричь)
Mob Protection Rune=Защитная руна мобов
Mob Protection Rune (Level 2)=
Steel Shears (right-click to shear)=Железные Ножницы (Правый клик - подстричь)
Mob Protection Rune=Руна Защиты Моба
Mob Protection Rune (Level 2)=Руна Защиты Моба (2 Уровень)
Saddle=Седло
Mob Fence=Забор от мобов
Mob Fence Top=
Mob Reset Stick=
Meat Block=
Raw Meat Block=
Enter texture:=
Change=
Mob Spawner=
(mob name) (min light) (max light) (amount) (player distance) (Y offset)=
Command:=
Spawner Not Active (enter settings)=Спаунер не активен (введите настройки)
Spawner Active (@1)=Активные спаунер (@1)
Mob Spawner settings failed!=Настройки спаунера моба провалились
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]”=
Mob Fence=Забор для Мобов
Mob Fence Top=Верхний Забор для Мобов
Mob Reset Stick=Палка Сброса Моба
Meat Block=Мясной Блок
Raw Meat Block=Сырой Мясной Блок
Enter texture:=Введите текстуру:
Change=Изменить
Mob Spawner=Спавнер Мобов
(mob name) (min light) (max light) (amount) (player distance) (Y offset)=(имя моба) (минимальный свет) (максимальный свет) (количество) (дистанция игрока) (смещение Y)
Command:=Команда:
Spawner Not Active (enter settings)=Спавнер Не Активен (введите настройки)
Spawner Active (@1)=Спавнер Активен (@1)
Mob Spawner settings failed!=Настроить Спавнер Мобов не удалось!
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]”=Синтаксис: “имя мин_свет[0-14] макс_свет[0-14] максобов_в_зоне[0 чтобы выключить] дистанция_игроков[1-20] смещение_y[-10 to 10]”

43
locale/mobs.uk.tr Normal file
View File

@ -0,0 +1,43 @@
# textdomain: mobs
Mobs Redo API=API для мобів
Simple and feature rich API to quickly add mobs into your world.=Простий і функціональний API для швидкого додавання мобів у світ.
Adds a mob api for mods to add animals or monsters etc.=Додає API для модів про тварин, монстрів тощо.
** Peaceful Mode Active - No Monsters Will Spawn=** Під час мирного режиму моби не спавняться
Active Mob Limit Reached!=Ліміт активних мобів досягнуто!
Mob has been protected!=Моб був захищений!
@1 (Tamed)=@1 (Приручений)
Not tamed!=Не приручений!
@1 is owner!=@1 є власником!
Missed!=Промах!
Already protected!=Уже захищено!
@1 has been tamed!=@1 приручено!
@1 follows:=@1 слідує:
@1 mobs removed.=@1 мобів видалено.
Enter name:=Введіть ім'я:
Rename=Перейменувати
Name Tag=Теґ для назви
Mob Repellent=Відлякувач мобів
Hearing Vines=Чутливі ліани
Leather=Шкіра
Raw Meat=Сире м'ясо
Meat=М'ясо
Lasso (right-click animal to put in inventory)=Ласо (ПКМ - покласти тварину в інвентар)
Net (right-click animal to put in inventory)=Сітка (ПКМ - покласти тварину в інвентар)
Steel Shears (right-click to shear)=Залізні ножиці (ПКМ - підстригти)
Mob Protection Rune=Руна Захисту Мобу
Mob Protection Rune (Level 2)=Руна Захисту Мобу (II рівень)
Saddle=Сідло
Mob Fence=Паркан для мобів
Mob Fence Top=Верхній паркан для мобів
Mob Reset Stick=Палиця скидання мобу
Meat Block=М'ясний блок
Raw Meat Block=Сирий м'ясний блок
Enter texture:=Введіть текстуру:
Change=Змінити
Mob Spawner=Спавнер мобів
(mob name) (min light) (max light) (amount) (player distance) (Y offset)=(ім'я мобу) (мін. світло) (макс. світло) (кількість) (дистанція гравця) (зміщення Y)
Command:=Команда:
Spawner Not Active (enter settings)=Спавнер не активний (введіть налаштування)
Spawner Active (@1)=Спавнер активний (@1)
Mob Spawner settings failed!=Не вдалося налаштувати спавнер мобів!
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]”=Синтаксис: “ім'я мін.світло[0-14] макс.світло[0-14] максобів_уоні[0 для вимкнення] дистанція_гравців[1-20] зміщення_y[-10 до 10]”

View File

@ -1,5 +1,5 @@
local S = minetest.get_translator("mobs")
local S = core.get_translator("mobs")
-- add lucky blocks
@ -15,12 +15,13 @@ lucky_block:add_blocks({
{"dro", {"mobs:protector"}, 1},
{"dro", {"mobs:fence_wood"}, 10},
{"dro", {"mobs:fence_top"}, 12},
{"lig"}
{"lig"},
{"dro", {"mobs:mob_repellent"}, 1}
})
-- pint sized rune, use on tamed mob to shrink to half-size
minetest.register_craftitem(":mobs:pint_sized_rune", {
core.register_craftitem(":mobs:pint_sized_rune", {
description = S("Pint Sized Rune"),
inventory_image = "mobs_pint_sized_rune.png",
groups = {flammable = 2},
@ -38,17 +39,17 @@ minetest.register_craftitem(":mobs:pint_sized_rune", {
local self = pointed_thing.ref:get_luaentity()
if not self._cmi_is_mob then
minetest.chat_send_player(name, S("Not a Mobs Redo mob!"))
core.chat_send_player(name, S("Not a Mobs Redo mob!"))
return
end
if not self.tamed then
minetest.chat_send_player(name, S("Not tamed!"))
core.chat_send_player(name, S("Not tamed!"))
return
end
if self.pint_size_potion then
minetest.chat_send_player(name, S("Potion already applied!"))
core.chat_send_player(name, S("Potion already applied!"))
return
end
@ -91,7 +92,7 @@ minetest.register_craftitem(":mobs:pint_sized_rune", {
end
})
minetest.register_craft({
core.register_craft({
output = "lucky_block:pint_sized_rune",
recipe = {{"lucky_block:pint_sized_potion", "mobs:protector"}}
})

View File

@ -1,4 +1,4 @@
name = mobs
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, mcl_sounds
optional_depends = default, tnt, invisibility, lucky_block, cmi, toolranks, pathfinder, player_api, mtobjid, visual_harm_1ndicators, mcl_sounds, mesecons
min_minetest_version = 5.0

View File

@ -1,11 +1,11 @@
-- lib_mount by Blert2112 (edited by TenPlus1)
local is_mc2 = minetest.get_modpath("mcl_mobs") -- MineClone2 check
local is_mc2 = core.get_modpath("mcl_mobs") -- MineClone2 check
-- 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 core.get_modpath("player_api") and not is_mc2 then
function mobs.attach() end
function mobs.detach() end
@ -22,35 +22,17 @@ local abs, cos, floor, sin, sqrt, pi =
-- helper functions
local node_ok = function(pos, fallback)
fallback = fallback or mobs.fallback_node
local node = minetest.get_node_or_nil(pos)
if node and minetest.registered_nodes[node.name] then return node end
return {name = fallback}
end
local function node_is(entity)
if not entity.standing_on then return "other" end
if entity.standing_on == "air" then return "air" end
if minetest.get_item_group(entity.standing_on, "lava") ~= 0 then
return "lava"
end
local def = core.registered_nodes[entity.standing_on]
if minetest.get_item_group(entity.standing_on, "liquid") ~= 0 then
return "liquid"
end
if minetest.registered_nodes[entity.standing_on].walkable == true then
return "walkable"
end
if def.groups.lava then return "lava" end
if def.groups.liquid then return "liquid" end
if def.groups.walkable then return "walkable" end
return "other"
end
@ -108,15 +90,15 @@ end
-- detach player on leaving
minetest.register_on_leaveplayer(function(player)
core.register_on_leaveplayer(function(player)
force_detach(player)
end)
-- detatch all players on shutdown
minetest.register_on_shutdown(function()
core.register_on_shutdown(function()
local players = minetest.get_connected_players()
local players = core.get_connected_players()
for i = 1, #players do
force_detach(players[i])
@ -125,7 +107,7 @@ end)
-- detatch player when dead
minetest.register_on_dieplayer(function(player)
core.register_on_dieplayer(function(player)
force_detach(player)
return true
end)
@ -143,11 +125,11 @@ local function find_free_pos(pos)
for _, c in pairs(check) do
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 = core.get_node_or_nil(npos)
if node and node.name then
local def = minetest.registered_nodes[node.name]
local def = core.registered_nodes[node.name]
if def and not def.walkable and def.liquidtype == "none" then
return npos
@ -162,7 +144,7 @@ end
local function is_player(player)
if player and type(player) == "userdata" and minetest.is_player(player) then
if player and type(player) == "userdata" and core.is_player(player) then
return true
end
end
@ -202,7 +184,7 @@ function mobs.attach(entity, player)
visual_size = {x = entity.driver_scale.x, y = entity.driver_scale.y}
})
minetest.after(0.2, function()
core.after(0.2, function()
if is_player(player) then
@ -223,7 +205,7 @@ function mobs.detach(player)
force_detach(player)
minetest.after(0.1, function()
core.after(0.1, function()
if player and player:is_player() then
@ -236,6 +218,10 @@ function mobs.detach(player)
end)
end
-- vars
local damage_counter = 0
-- ride mob like car or horse
function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
@ -313,7 +299,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
if velo.y == 0
and entity.standing_on ~= "air" and entity.standing_on ~= "ignore"
and minetest.get_item_group(entity.standing_on, "liquid") == 0 then
and core.get_item_group(entity.standing_on, "liquid") == 0 then
velo.y = velo.y + entity.jump_height
acce_y = acce_y + (acce_y * 3) + 1
end
@ -321,6 +307,35 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
end
end
local ni = node_is(entity)
-- env damage
if ni == "liquid" or ni == "lava" then
damage_counter = damage_counter + dtime
if damage_counter > 1 then
local damage = 0
if entity.lava_damage > 0 and ni == "lava" then
damage = entity.lava_damage
elseif entity.water_damage > 0 and ni == "liquid" then
damage = entity.water_damage
end
if damage >= 1 then
entity.object:punch(entity.object, 1.0, {
full_punch_interval = 1.0,
damage_groups = {fleshy = damage}
}, nil)
end
damage_counter = 0
end
end
-- 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
@ -361,12 +376,11 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
p.y = p.y - 0.5
local ni = node_is(entity)
local v = entity.v
if ni == "air" then
if can_fly == true then new_acce.y = 0 end
if can_fly then new_acce.y = 0 ; acce_y = 0 end
elseif ni == "liquid" or ni == "lava" then
@ -377,7 +391,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
new_acce.y = 0
p.y = p.y + 1
if minetest.get_item_group(entity.standing_in, "liquid") ~= 0 then
if core.get_item_group(entity.standing_in, "liquid") ~= 0 then
if velo.y >= 5 then
velo.y = 5
@ -444,7 +458,7 @@ function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim)
if ctrl.LMB and ctrl.sneak and shoots then
local pos = entity.object:get_pos()
local obj = minetest.add_entity({
local obj = core.add_entity({
x = pos.x + 0 + dir.x * 2.5,
y = pos.y + 1.5 + dir.y,
z = pos.z + 0 + dir.z * 2.5}, arrow)
@ -454,7 +468,7 @@ function mobs.fly(entity, _, speed, shoots, arrow, moving_anim, stand_anim)
if ent then
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 mob
local vec = {x = dir.x * 6, y = dir.y * 6, z = dir.z * 6}

View File

@ -19,8 +19,9 @@ https://forum.minetest.net/viewtopic.php?f=11&t=9917
- **Shears**. Used to right-click sheep and return 1-3 wool.
- **Protection Rune**. Protects tamed mobs from being harmed by other players.
- **Mob Fence and Fence Top**. Stops mobs escaping or glitching throughfences.
- Add mobs:mob_repellent block to stop mobs spawning within 16 node radius.
**Lucky Blocks**: 12
**Lucky Blocks**: 13
## Changelog
@ -31,6 +32,8 @@ https://forum.minetest.net/viewtopic.php?f=11&t=9917
* Added {eatable} group to food items and HP in description
* Fixed timer bug when attacking
* Fixed fall damage check when riding mob
* Calculate damage before do_punch function called
* Add function to check for dropped items and for mob to do something with them
### Version 1.61

View File

@ -56,13 +56,19 @@ enable_peaceful_player (Mobs do not attack peaceful player without reason) bool
mob_smooth_rotate (Smooth rotation for mobs) bool true
# Fix Mob Height if too low so they cannot escape through specific nodes
mob_height_fix (Fix Mob Height) bool true
mob_height_fix (Fix Mob Height) bool false
mob_log_spawn (Log Mob Spawning) bool false
# Mob hearing, when enabled will override minetest.sound_play for mobs to hear
mobs_can_hear (Enable Mob hearing) bool true
# Node hearing, when enabled will allow nodes to hear nearby sounds
mobs_can_hear_node (Enable Node hearing) bool false
# By default mobs are dealt knockback from damage, this lets you disable it
mobs_disable_damage_kb (Disable knockback from damage only) bool false
[Pathfinding]
# Enable pathfinding (default Enabled)
mob_pathfinding_enable (Enable pathfinding) bool true
@ -82,3 +88,6 @@ mob_pathfinding_searchdistance (path search distance) int 16
mob_pathfinding_max_jump (path max jump height) int 4
# max drop height for pathfinding (default 6)
mob_pathfinding_max_drop (path max drop height) int 6
# Enable mob infotext on hover
mob_infotext (Enable mob infotext on hover) bool true

View File

@ -1,12 +1,12 @@
local S = minetest.get_translator("mobs")
local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99)
local S = core.get_translator("mobs")
local max_per_block = tonumber(core.settings:get("max_objects_per_block") or 99)
-- helper functions
local function is_player(player)
if player and type(player) == "userdata" and minetest.is_player(player) then
if player and type(player) == "userdata" and core.is_player(player) then
return true
end
end
@ -26,7 +26,7 @@ end
local spawner_default = "mobs_animal:pumba 10 15 0 0 0"
minetest.register_node("mobs:spawner", {
core.register_node("mobs:spawner", {
tiles = {"mob_spawner.png"},
drawtype = "glasslike",
paramtype = "light",
@ -40,7 +40,7 @@ minetest.register_node("mobs:spawner", {
on_construct = function(pos)
local meta = minetest.get_meta(pos)
local meta = core.get_meta(pos)
-- setup formspec
local head = S("(mob name) (min light) (max light) (amount)"
@ -48,7 +48,7 @@ minetest.register_node("mobs:spawner", {
-- text entry formspec
meta:set_string("formspec", "size[10,3.5]"
.. "label[0.15,0.5;" .. minetest.formspec_escape(head) .. "]"
.. "label[0.15,0.5;" .. core.formspec_escape(head) .. "]"
.. "field[1,2.5;8.5,0.8;text;" .. S("Command:")
.. ";${command}]")
@ -58,19 +58,19 @@ minetest.register_node("mobs:spawner", {
on_right_click = function(pos, placer)
if minetest.is_protected(pos, placer:get_player_name()) then return end
if core.is_protected(pos, placer:get_player_name()) then return end
end,
on_receive_fields = function(pos, formname, fields, sender)
if not fields.text or fields.text == "" then return end
local meta = minetest.get_meta(pos)
local meta = core.get_meta(pos)
local comm = fields.text:split(" ")
local name = sender:get_player_name()
if minetest.is_protected(pos, name) then
minetest.record_protection_violation(pos, name)
if core.is_protected(pos, name) then
core.record_protection_violation(pos, name)
return
end
@ -88,8 +88,8 @@ minetest.register_node("mobs:spawner", {
meta:set_string("command", fields.text)
meta:set_string("infotext", S("Spawner Active (@1)", mob))
else
minetest.chat_send_player(name, S("Mob Spawner settings failed!"))
minetest.chat_send_player(name,
core.chat_send_player(name, S("Mob Spawner settings failed!"))
core.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]”"))
@ -99,7 +99,7 @@ minetest.register_node("mobs:spawner", {
-- spawner abm
minetest.register_abm({
core.register_abm({
label = "Mob spawner node",
nodenames = {"mobs:spawner"},
interval = 10,
@ -112,7 +112,7 @@ minetest.register_abm({
if active_object_count_wider >= max_per_block then return end
-- get meta and command
local meta = minetest.get_meta(pos)
local meta = core.get_meta(pos)
local comm = meta:get_string("command"):split(" ")
-- get settings from command
@ -133,7 +133,7 @@ minetest.register_abm({
end
-- check objects inside 9x9 area around spawner
local objs = minetest.get_objects_inside_radius(pos, 9)
local objs = core.get_objects_inside_radius(pos, 9)
local count = 0
local ent
@ -152,7 +152,7 @@ minetest.register_abm({
if pla > 0 then
local in_range, player
local players = minetest.get_connected_players()
local players = core.get_connected_players()
for i = 1, #players do
@ -171,12 +171,12 @@ minetest.register_abm({
end
-- set medium mob usually spawns in (defaults to air)
local reg = minetest.registered_entities[mob].fly_in
local reg = core.registered_entities[mob].fly_in
if not reg or type(reg) == "string" then reg = {(reg or "air")} end
-- find air blocks within 5 nodes of spawner
local air = minetest.find_nodes_in_area(
local air = core.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}, reg)
@ -184,13 +184,13 @@ minetest.register_abm({
if air and #air > 0 then
local pos2 = air[math.random(#air)]
local lig = minetest.get_node_light(pos2) or 0
local lig = core.get_node_light(pos2) or 0
pos2.y = pos2.y + 0.5
-- only if light levels are within range
if lig >= mlig and lig <= xlig and minetest.registered_entities[mob] then
minetest.add_entity(pos2, mob)
if lig >= mlig and lig <= xlig and core.registered_entities[mob] then
core.add_entity(pos2, mob)
end
end
end

Binary file not shown.

After

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 279 B

BIN
textures/mobs_repellent.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 B

View File

Before

Width:  |  Height:  |  Size: 202 B

After

Width:  |  Height:  |  Size: 202 B