Compare commits
75 Commits
e8e774566b
...
master
Author | SHA1 | Date | |
---|---|---|---|
dc29ed09e6 | |||
ae21b80f08 | |||
84377ee259 | |||
5077217497 | |||
bae9cb12e2 | |||
126e5afc24 | |||
112c512c6e | |||
0f5b0e382d | |||
5ed3a34cf3 | |||
f44441c580 | |||
2cf43ffc4e | |||
0d6b794fa0 | |||
42da759407 | |||
c0c4c3ea48 | |||
f5817061ce | |||
43ad058efa | |||
b977431e21 | |||
68b25c9d08 | |||
24adcae920 | |||
16a04547ab | |||
3a7b1bbfe6 | |||
01a60d9a55 | |||
99f4fc1768 | |||
027620bfa3 | |||
854834f04e | |||
5fb7b91db0 | |||
badb889cf3 | |||
ca7aeec95a | |||
14f391bf2c | |||
0bf3915315 | |||
b81c2aeab6 | |||
0a62f05132 | |||
9f472fb690 | |||
c62b013825 | |||
4b825b3e86 | |||
f09b6d1730 | |||
a3ede86365 | |||
4b556a4d16 | |||
01e015dc0f | |||
d7998a9ea7 | |||
57fe6cf2e3 | |||
b170b51f2d | |||
dca4159fc4 | |||
219d477c2a | |||
c8e91d1958 | |||
22d7ea79fd | |||
c24874a3bf | |||
c25975e7ea | |||
03ce8ada6b | |||
cc60499637 | |||
58792311c7 | |||
527fe8c2d5 | |||
6a7c221ce1 | |||
b8052c817c | |||
e17ea86bf5 | |||
ca76558edd | |||
bde53c3475 | |||
2e4664a5ce | |||
39f9f8df31 | |||
1b1f681886 | |||
627d468b9a | |||
e9c3d6c505 | |||
1f8ca901b5 | |||
816461286b | |||
430af1e91d | |||
79fb4f7ead | |||
f746f4b1e0 | |||
e59fd53ee9 | |||
faf511ff8c | |||
a35afc8299 | |||
219db764bf | |||
e4a5ead82c | |||
f4861ced2a | |||
1dd81eb008 | |||
64c6085f09 |
92
api.txt
@ -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
@ -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
|
175
crafts.lua
@ -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
|
||||
})
|
||||
|
13
init.lua
@ -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
|
||||
|
||||
|
@ -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
@ -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]”=
|
@ -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
@ -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]”
|
@ -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"}}
|
||||
})
|
||||
|
2
mod.conf
@ -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
|
||||
|
92
mount.lua
@ -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}
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
42
spawner.lua
@ -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
|
||||
|
BIN
textures/mobs_bubble_particle.png
Normal file
After Width: | Height: | Size: 331 B |
BIN
textures/mobs_fire_particle.png
Normal file
After Width: | Height: | Size: 343 B |
BIN
textures/mobs_hearing_vines.png
Normal file
After Width: | Height: | Size: 114 B |
BIN
textures/mobs_hearing_vines_active.png
Normal file
After Width: | Height: | Size: 126 B |
BIN
textures/mobs_heart_particle.png
Normal file
After Width: | Height: | Size: 279 B |
BIN
textures/mobs_repellent.png
Normal file
After Width: | Height: | Size: 415 B |
Before Width: | Height: | Size: 202 B After Width: | Height: | Size: 202 B |