mirror of
				https://codeberg.org/tenplus1/mobs_redo.git
				synced 2025-11-04 09:15:32 +01:00 
			
		
		
		
	Compare commits
	
		
			19 Commits
		
	
	
		
			469e35d6e0
			...
			d12576f0c8
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					d12576f0c8 | ||
| 
						 | 
					7f4d473fee | ||
| 
						 | 
					f7a1b27ea4 | ||
| 
						 | 
					f14050ad3c | ||
| 
						 | 
					b6fb1948e8 | ||
| 
						 | 
					67e4ede31b | ||
| 
						 | 
					3009da0efe | ||
| 
						 | 
					bd8be0905a | ||
| 
						 | 
					89523195d5 | ||
| 
						 | 
					c6dffd1390 | ||
| 
						 | 
					499d43a9aa | ||
| 
						 | 
					39002cf4e7 | ||
| 
						 | 
					477148962f | ||
| 
						 | 
					497ff7241f | ||
| 
						 | 
					9f02777f14 | ||
| 
						 | 
					ae62b1410d | ||
| 
						 | 
					81b5e40d09 | ||
| 
						 | 
					565c0851eb | ||
| 
						 | 
					cb465559a1 | 
							
								
								
									
										581
									
								
								api.lua
									
									
									
									
									
								
							
							
						
						
									
										581
									
								
								api.lua
									
									
									
									
									
								
							@@ -1,24 +1,18 @@
 | 
			
		||||
 | 
			
		||||
-- Intllib and CMI support check
 | 
			
		||||
-- Load support for intllib.
 | 
			
		||||
local MP = minetest.get_modpath(minetest.get_current_modname())
 | 
			
		||||
local S, NS = dofile(MP .. "/intllib.lua")
 | 
			
		||||
local S = minetest.get_translator and minetest.get_translator("mobs_redo") or
 | 
			
		||||
		dofile(MP .. "/intllib.lua")
 | 
			
		||||
 | 
			
		||||
-- CMI support check
 | 
			
		||||
local use_cmi = minetest.global_exists("cmi")
 | 
			
		||||
 | 
			
		||||
mobs = {
 | 
			
		||||
	mod = "redo",
 | 
			
		||||
	version = "20200723",
 | 
			
		||||
	version = "20201029",
 | 
			
		||||
	intllib = S,
 | 
			
		||||
	invis = minetest.global_exists("invisibility") and invisibility or {}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
-- creative check
 | 
			
		||||
local creative_cache = minetest.settings:get_bool("creative_mode")
 | 
			
		||||
function mobs.is_creative(name)
 | 
			
		||||
	return creative_cache or minetest.check_player_privs(name,
 | 
			
		||||
			{creative = true})
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- localize math functions
 | 
			
		||||
local pi = math.pi
 | 
			
		||||
local square = math.sqrt
 | 
			
		||||
@@ -40,24 +34,36 @@ local atan = function(x)
 | 
			
		||||
		return atann(x)
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
local table_copy = table.copy
 | 
			
		||||
local table_remove = table.remove
 | 
			
		||||
local vadd = vector.add
 | 
			
		||||
local vdirection = vector.direction
 | 
			
		||||
local vmultiply = vector.multiply
 | 
			
		||||
local vsubtract = vector.subtract
 | 
			
		||||
local settings = minetest.settings
 | 
			
		||||
 | 
			
		||||
-- creative check
 | 
			
		||||
local creative_cache = minetest.settings:get_bool("creative_mode")
 | 
			
		||||
function mobs.is_creative(name)
 | 
			
		||||
	return creative_cache or minetest.check_player_privs(name,
 | 
			
		||||
			{creative = true})
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Load settings
 | 
			
		||||
local damage_enabled = minetest.settings:get_bool("enable_damage")
 | 
			
		||||
local mobs_spawn = minetest.settings:get_bool("mobs_spawn") ~= false
 | 
			
		||||
local peaceful_only = minetest.settings:get_bool("only_peaceful_mobs")
 | 
			
		||||
local disable_blood = minetest.settings:get_bool("mobs_disable_blood")
 | 
			
		||||
local mobs_drop_items = minetest.settings:get_bool("mobs_drop_items") ~= false
 | 
			
		||||
local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false
 | 
			
		||||
local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false
 | 
			
		||||
local remove_far = minetest.settings:get_bool("remove_far_mobs") ~= false
 | 
			
		||||
local difficulty = tonumber(minetest.settings:get("mob_difficulty")) or 1.0
 | 
			
		||||
local show_health = minetest.settings:get_bool("mob_show_health") ~= false
 | 
			
		||||
local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 99)
 | 
			
		||||
local mob_nospawn_range = tonumber(minetest.settings:get("mob_nospawn_range") or 12)
 | 
			
		||||
local active_limit = tonumber(minetest.settings:get("mob_active_limit") or 0)
 | 
			
		||||
local mob_chance_multiplier =
 | 
			
		||||
		tonumber(minetest.settings:get("mob_chance_multiplier") or 1)
 | 
			
		||||
local damage_enabled = settings:get_bool("enable_damage")
 | 
			
		||||
local mobs_spawn = settings:get_bool("mobs_spawn") ~= false
 | 
			
		||||
local peaceful_only = settings:get_bool("only_peaceful_mobs")
 | 
			
		||||
local disable_blood = settings:get_bool("mobs_disable_blood")
 | 
			
		||||
local mobs_drop_items = settings:get_bool("mobs_drop_items") ~= false
 | 
			
		||||
local mobs_griefing = settings:get_bool("mobs_griefing") ~= false
 | 
			
		||||
local spawn_protected = settings:get_bool("mobs_spawn_protected") ~= false
 | 
			
		||||
local remove_far = settings:get_bool("remove_far_mobs") ~= false
 | 
			
		||||
local difficulty = tonumber(settings:get("mob_difficulty")) or 1.0
 | 
			
		||||
local show_health = settings:get_bool("mob_show_health") ~= false
 | 
			
		||||
local max_per_block = tonumber(settings:get("max_objects_per_block") or 99)
 | 
			
		||||
local mob_nospawn_range = tonumber(settings:get("mob_nospawn_range") or 12)
 | 
			
		||||
local active_limit = tonumber(settings:get("mob_active_limit") or 0)
 | 
			
		||||
local mob_chance_multiplier = tonumber(settings:get("mob_chance_multiplier") or 1)
 | 
			
		||||
local active_mobs = 0
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -70,7 +76,7 @@ if peaceful_only then
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- calculate aoc range for mob count
 | 
			
		||||
local aoc_range = tonumber(minetest.settings:get("active_block_range")) * 16
 | 
			
		||||
local aoc_range = tonumber(settings:get("active_block_range")) * 16
 | 
			
		||||
 | 
			
		||||
-- pathfinding settings
 | 
			
		||||
local enable_pathfinding = true
 | 
			
		||||
@@ -196,7 +202,7 @@ end
 | 
			
		||||
-- calculate distance
 | 
			
		||||
local get_distance = function(a, b)
 | 
			
		||||
 | 
			
		||||
--	if not a or not b then return 50 end -- nil check
 | 
			
		||||
	if not a or not b then return 50 end -- nil check
 | 
			
		||||
 | 
			
		||||
	local x, y, z = a.x - b.x, a.y - b.y, a.z - b.z
 | 
			
		||||
 | 
			
		||||
@@ -230,7 +236,7 @@ function mob_class:collision()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- check string against another string or table
 | 
			
		||||
-- check if string exists in another string or table
 | 
			
		||||
local check_for = function(look_for, look_inside)
 | 
			
		||||
 | 
			
		||||
	if type(look_inside) == "string" and look_inside == look_for then
 | 
			
		||||
@@ -291,8 +297,7 @@ function mob_class:set_velocity(v)
 | 
			
		||||
	local new_vel = {
 | 
			
		||||
		x = (sin(yaw) * -v) + c_x,
 | 
			
		||||
		y = vel.y,
 | 
			
		||||
		z = (cos(yaw) * v) + c_y
 | 
			
		||||
	}
 | 
			
		||||
		z = (cos(yaw) * v) + c_y}
 | 
			
		||||
 | 
			
		||||
	self.object:set_velocity(new_vel)
 | 
			
		||||
end
 | 
			
		||||
@@ -353,9 +358,9 @@ function mob_class:set_animation(anim, force)
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- check for more than one animation
 | 
			
		||||
	local num = 0
 | 
			
		||||
 | 
			
		||||
	-- check for more than one animation (max 4)
 | 
			
		||||
	for n = 1, 4 do
 | 
			
		||||
 | 
			
		||||
		if self.animation[anim .. n .. "_start"]
 | 
			
		||||
@@ -388,7 +393,7 @@ end
 | 
			
		||||
 | 
			
		||||
-- above function exported for mount.lua
 | 
			
		||||
function mobs:set_animation(entity, anim)
 | 
			
		||||
	mob_class.set_animation(entity, anim)
 | 
			
		||||
	entity.set_animation(entity, anim)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -468,7 +473,7 @@ local new_line_of_sight = function(self, pos1, pos2, stepsize)
 | 
			
		||||
 | 
			
		||||
	stepsize = stepsize or 1
 | 
			
		||||
 | 
			
		||||
	local stepv = vector.multiply(vector.direction(pos1, pos2), stepsize)
 | 
			
		||||
	local stepv = vmultiply(vdirection(pos1, pos2), stepsize)
 | 
			
		||||
 | 
			
		||||
	local s, pos = minetest.line_of_sight(pos1, pos2, stepsize)
 | 
			
		||||
 | 
			
		||||
@@ -491,7 +496,7 @@ local new_line_of_sight = function(self, pos1, pos2, stepsize)
 | 
			
		||||
	while minetest.registered_nodes[nn]
 | 
			
		||||
	and (minetest.registered_nodes[nn].walkable == false) do
 | 
			
		||||
 | 
			
		||||
		npos1 = vector.add(npos1, stepv)
 | 
			
		||||
		npos1 = vadd(npos1, stepv)
 | 
			
		||||
 | 
			
		||||
		if get_distance(npos1, pos2) < stepsize then return true end
 | 
			
		||||
 | 
			
		||||
@@ -571,10 +576,10 @@ function mob_class:attempt_flight_correction(override)
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local escape_target = flyable_nodes[random(#flyable_nodes)]
 | 
			
		||||
	local escape_direction = vector.direction(pos, escape_target)
 | 
			
		||||
	local escape_direction = vdirection(pos, escape_target)
 | 
			
		||||
 | 
			
		||||
	self.object:set_velocity(
 | 
			
		||||
		vector.multiply(escape_direction, 1)) --self.run_velocity))
 | 
			
		||||
		vmultiply(escape_direction, 1)) --self.run_velocity))
 | 
			
		||||
 | 
			
		||||
	return true
 | 
			
		||||
end
 | 
			
		||||
@@ -635,7 +640,7 @@ function mob_class:do_stay_near()
 | 
			
		||||
	local searchnodes = self.stay_near[1]
 | 
			
		||||
	local chance = self.stay_near[2] or 10
 | 
			
		||||
 | 
			
		||||
	if random(chance) > 1 then
 | 
			
		||||
	if not pos or random(chance) > 1 then
 | 
			
		||||
		return false
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
@@ -750,7 +755,7 @@ function mob_class:item_drop()
 | 
			
		||||
	-- was mob killed by player?
 | 
			
		||||
	local death_by_player = self.cause_of_death
 | 
			
		||||
		and self.cause_of_death.puncher
 | 
			
		||||
		and self.cause_of_death.puncher:is_player() or nil
 | 
			
		||||
		and self.cause_of_death.puncher:is_player()
 | 
			
		||||
 | 
			
		||||
	local obj, item, num
 | 
			
		||||
 | 
			
		||||
@@ -970,12 +975,11 @@ function mob_class:is_at_cliff()
 | 
			
		||||
		return false
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- if object no longer exists then return
 | 
			
		||||
	if not self.object:get_luaentity() then
 | 
			
		||||
		return false
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- get yaw but if nil returned object no longer exists
 | 
			
		||||
	local yaw = self.object:get_yaw()
 | 
			
		||||
 | 
			
		||||
	if not yaw then return false end
 | 
			
		||||
 | 
			
		||||
	local dir_x = -sin(yaw) * (self.collisionbox[4] + 0.5)
 | 
			
		||||
	local dir_z = cos(yaw) * (self.collisionbox[4] + 0.5)
 | 
			
		||||
	local pos = self.object:get_pos()
 | 
			
		||||
@@ -1027,7 +1031,7 @@ function mob_class:do_env_damage()
 | 
			
		||||
	-- halt mob if standing inside ignore node
 | 
			
		||||
	if self.standing_in == "ignore" then
 | 
			
		||||
 | 
			
		||||
		self.object:set_velocity({x  = 0, y = 0, z = 0})
 | 
			
		||||
		self.object:set_velocity({x = 0, y = 0, z = 0})
 | 
			
		||||
 | 
			
		||||
		return true
 | 
			
		||||
	end
 | 
			
		||||
@@ -1035,24 +1039,6 @@ function mob_class:do_env_damage()
 | 
			
		||||
	-- particle appears at random mob height
 | 
			
		||||
	pos.y = pos.y + random(self.collisionbox[2], self.collisionbox[5])
 | 
			
		||||
 | 
			
		||||
	-- is mob light sensative, or scared of the dark :P
 | 
			
		||||
	if self.light_damage ~= 0 then
 | 
			
		||||
 | 
			
		||||
		local light = minetest.get_node_light(pos) or 0
 | 
			
		||||
 | 
			
		||||
		if light >= self.light_damage_min
 | 
			
		||||
		and light <= self.light_damage_max then
 | 
			
		||||
 | 
			
		||||
			self.health = self.health - self.light_damage
 | 
			
		||||
 | 
			
		||||
			effect(pos, 5, "tnt_smoke.png")
 | 
			
		||||
 | 
			
		||||
			if self:check_for_death({type = "light"}) then
 | 
			
		||||
				return true
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local nodef = minetest.registered_nodes[self.standing_in]
 | 
			
		||||
 | 
			
		||||
	-- water
 | 
			
		||||
@@ -1098,6 +1084,24 @@ function mob_class:do_env_damage()
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- is mob light sensative, or scared of the dark :P
 | 
			
		||||
	if self.light_damage ~= 0 then
 | 
			
		||||
 | 
			
		||||
		local light = minetest.get_node_light(pos) or 0
 | 
			
		||||
 | 
			
		||||
		if light >= self.light_damage_min
 | 
			
		||||
		and light <= self.light_damage_max then
 | 
			
		||||
 | 
			
		||||
			self.health = self.health - self.light_damage
 | 
			
		||||
 | 
			
		||||
			effect(pos, 5, "tnt_smoke.png")
 | 
			
		||||
 | 
			
		||||
			if self:check_for_death({type = "light"}) then
 | 
			
		||||
				return true
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	--- suffocation inside solid node
 | 
			
		||||
	if (self.suffocation and self.suffocation ~= 0)
 | 
			
		||||
	and (nodef.walkable == nil or nodef.walkable == true)
 | 
			
		||||
@@ -1545,8 +1549,7 @@ local height_switcher = false
 | 
			
		||||
function mob_class:smart_mobs(s, p, dist, dtime)
 | 
			
		||||
 | 
			
		||||
	local s1 = self.path.lastpos
 | 
			
		||||
--	local target_pos = self.attack:get_pos()
 | 
			
		||||
local target_pos = p
 | 
			
		||||
	local target_pos = p
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	-- is it becoming stuck?
 | 
			
		||||
@@ -1620,7 +1623,7 @@ local target_pos = p
 | 
			
		||||
		end, self)
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	if abs(vector.subtract(s,target_pos).y) > self.stepheight then
 | 
			
		||||
	if abs(vsubtract(s,target_pos).y) > self.stepheight then
 | 
			
		||||
 | 
			
		||||
		if height_switcher then
 | 
			
		||||
			use_pathfind = true
 | 
			
		||||
@@ -1693,9 +1696,9 @@ local target_pos = p
 | 
			
		||||
 | 
			
		||||
		self.state = ""
 | 
			
		||||
 | 
			
		||||
if self.attack then
 | 
			
		||||
		self:do_attack(self.attack)
 | 
			
		||||
end
 | 
			
		||||
		if self.attack then
 | 
			
		||||
			self:do_attack(self.attack)
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		-- no path found, try something else
 | 
			
		||||
		if not self.path.way then
 | 
			
		||||
@@ -1785,7 +1788,6 @@ end
 | 
			
		||||
							minetest.add_item(p1, ItemStack(node1))
 | 
			
		||||
							minetest.set_node(p1, {name = "air"})
 | 
			
		||||
						end
 | 
			
		||||
 | 
			
		||||
					end
 | 
			
		||||
				end
 | 
			
		||||
			end
 | 
			
		||||
@@ -1798,11 +1800,12 @@ end
 | 
			
		||||
			self.path.following = true
 | 
			
		||||
		else
 | 
			
		||||
			-- yay i found path
 | 
			
		||||
if self.attack then
 | 
			
		||||
			self:mob_sound(self.sounds.war_cry)
 | 
			
		||||
else
 | 
			
		||||
			self:mob_sound(self.sounds.random)
 | 
			
		||||
end
 | 
			
		||||
			if self.attack then
 | 
			
		||||
				self:mob_sound(self.sounds.war_cry)
 | 
			
		||||
			else
 | 
			
		||||
				self:mob_sound(self.sounds.random)
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			self:set_velocity(self.walk_velocity)
 | 
			
		||||
 | 
			
		||||
			-- follow path now that it has it
 | 
			
		||||
@@ -1812,26 +1815,6 @@ end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- specific attacks
 | 
			
		||||
local specific_attack = function(list, what)
 | 
			
		||||
 | 
			
		||||
	-- no list so attack default (player, animals etc.)
 | 
			
		||||
	if list == nil then
 | 
			
		||||
		return true
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- found entity on list to attack?
 | 
			
		||||
	for no = 1, #list do
 | 
			
		||||
 | 
			
		||||
		if list[no] == what then
 | 
			
		||||
			return true
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- general attack function for all mobs
 | 
			
		||||
function mob_class:general_attack()
 | 
			
		||||
 | 
			
		||||
@@ -1859,7 +1842,8 @@ function mob_class:general_attack()
 | 
			
		||||
			or self.attack_players == false
 | 
			
		||||
			or (self.owner and self.type ~= "monster")
 | 
			
		||||
			or mobs.invis[objs[n]:get_player_name()]
 | 
			
		||||
			or not specific_attack(self.specific_attack, "player") then
 | 
			
		||||
			or (self.specific_attack
 | 
			
		||||
					and not check_for("player", self.specific_attack)) then
 | 
			
		||||
				objs[n] = nil
 | 
			
		||||
--print("- pla", n)
 | 
			
		||||
			end
 | 
			
		||||
@@ -1872,7 +1856,8 @@ function mob_class:general_attack()
 | 
			
		||||
			or (not self.attack_animals and ent.type == "animal")
 | 
			
		||||
			or (not self.attack_monsters and ent.type == "monster")
 | 
			
		||||
			or (not self.attack_npcs and ent.type == "npc")
 | 
			
		||||
			or not specific_attack(self.specific_attack, ent.name) then
 | 
			
		||||
			or (self.specific_attack
 | 
			
		||||
					and not check_for(ent.name, self.specific_attack)) then
 | 
			
		||||
				objs[n] = nil
 | 
			
		||||
--print("- mob", n, self.name, ent.name)
 | 
			
		||||
			end
 | 
			
		||||
@@ -1915,26 +1900,6 @@ function mob_class:general_attack()
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- specific runaway
 | 
			
		||||
local specific_runaway = function(list, what)
 | 
			
		||||
 | 
			
		||||
	-- no list so do not run
 | 
			
		||||
	if list == nil then
 | 
			
		||||
		return false
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- found entity on list to attack?
 | 
			
		||||
	for no = 1, #list do
 | 
			
		||||
 | 
			
		||||
		if list[no] == what then
 | 
			
		||||
			return true
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- find someone to runaway from
 | 
			
		||||
function mob_class:do_runaway_from()
 | 
			
		||||
 | 
			
		||||
@@ -1942,7 +1907,7 @@ function mob_class:do_runaway_from()
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local s = self.object:get_pos()
 | 
			
		||||
	local s = self.object:get_pos() ; if not s then return end
 | 
			
		||||
	local p, sp, dist, pname
 | 
			
		||||
	local player, obj, min_player, name
 | 
			
		||||
	local min_dist = self.view_range + 1
 | 
			
		||||
@@ -1973,7 +1938,7 @@ function mob_class:do_runaway_from()
 | 
			
		||||
 | 
			
		||||
		-- find specific mob to runaway from
 | 
			
		||||
		if name ~= "" and name ~= self.name
 | 
			
		||||
		and specific_runaway(self.runaway_from, name) then
 | 
			
		||||
		and (self.runaway_from and check_for(name, self.runaway_from)) then
 | 
			
		||||
 | 
			
		||||
			sp = s
 | 
			
		||||
			p = player and player:get_pos() or s
 | 
			
		||||
@@ -2298,7 +2263,7 @@ function mob_class:do_states(dtime)
 | 
			
		||||
 | 
			
		||||
		-- get mob and enemy positions and distance between
 | 
			
		||||
		local s = self.object:get_pos()
 | 
			
		||||
		local p = self.attack:get_pos()
 | 
			
		||||
		local p = self.attack and self.attack:get_pos()
 | 
			
		||||
		local dist = p and get_distance(p, s) or 500
 | 
			
		||||
 | 
			
		||||
		-- stop attacking if player out of range or invisible
 | 
			
		||||
@@ -2506,9 +2471,9 @@ function mob_class:do_states(dtime)
 | 
			
		||||
					return
 | 
			
		||||
				end
 | 
			
		||||
 | 
			
		||||
				if abs(p1.x-s.x) + abs(p1.z - s.z) < 0.6 then
 | 
			
		||||
				if abs(p1.x - s.x) + abs(p1.z - s.z) < 0.6 then
 | 
			
		||||
					-- reached waypoint, remove it from queue
 | 
			
		||||
					table.remove(self.path.way, 1)
 | 
			
		||||
					table_remove(self.path.way, 1)
 | 
			
		||||
				end
 | 
			
		||||
 | 
			
		||||
				-- set new temporary target
 | 
			
		||||
@@ -2664,9 +2629,9 @@ function mob_class:falling(pos)
 | 
			
		||||
 | 
			
		||||
	-- in water then use liquid viscosity for float/sink speed
 | 
			
		||||
	if (self.standing_in
 | 
			
		||||
	and minetest.registered_nodes[self.standing_in].groups.liquid) --water)
 | 
			
		||||
	and minetest.registered_nodes[self.standing_in].groups.liquid)
 | 
			
		||||
	or (self.standing_on
 | 
			
		||||
	and minetest.registered_nodes[self.standing_in].groups.liquid) then -- water) then
 | 
			
		||||
	and minetest.registered_nodes[self.standing_in].groups.liquid) then
 | 
			
		||||
 | 
			
		||||
		local visc = min(
 | 
			
		||||
				minetest.registered_nodes[self.standing_in].liquid_viscosity, 7)
 | 
			
		||||
@@ -2723,20 +2688,20 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage)
 | 
			
		||||
 | 
			
		||||
	-- mob health check
 | 
			
		||||
	if self.health <= 0 then
 | 
			
		||||
		return
 | 
			
		||||
		return true
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- custom punch function
 | 
			
		||||
	if self.do_punch
 | 
			
		||||
	and self:do_punch(hitter, tflp, tool_capabilities, dir) == false then
 | 
			
		||||
		return
 | 
			
		||||
		return true
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- error checking when mod profiling is enabled
 | 
			
		||||
	if not tool_capabilities then
 | 
			
		||||
		minetest.log("warning",
 | 
			
		||||
				"[mobs] Mod profiling enabled, damage not enabled")
 | 
			
		||||
		return
 | 
			
		||||
		return true
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- is mob protected?
 | 
			
		||||
@@ -2747,7 +2712,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage)
 | 
			
		||||
		minetest.chat_send_player(hitter:get_player_name(),
 | 
			
		||||
				S("Mob has been protected!"))
 | 
			
		||||
 | 
			
		||||
		return
 | 
			
		||||
		return true
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local weapon = hitter:get_wielded_item()
 | 
			
		||||
@@ -2808,7 +2773,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage)
 | 
			
		||||
	if use_cmi
 | 
			
		||||
	and cmi.notify_punch(
 | 
			
		||||
			self.object, hitter, tflp, tool_capabilities, dir, damage) then
 | 
			
		||||
		return
 | 
			
		||||
		return true
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- add weapon wear
 | 
			
		||||
@@ -2913,7 +2878,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage)
 | 
			
		||||
		local v = self.object:get_velocity()
 | 
			
		||||
 | 
			
		||||
		-- sanity check
 | 
			
		||||
		if not v then return end
 | 
			
		||||
		if not v then return true end
 | 
			
		||||
 | 
			
		||||
		local kb = damage or 1
 | 
			
		||||
		local up = 2
 | 
			
		||||
@@ -2928,7 +2893,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage)
 | 
			
		||||
		dir = dir or {x = 0, y = 0, z = 0}
 | 
			
		||||
 | 
			
		||||
		-- use tool knockback value or default
 | 
			
		||||
		kb = tool_capabilities.damage_groups["knockback"] or kb -- (kb * 1.5)
 | 
			
		||||
		kb = tool_capabilities.damage_groups["knockback"] or kb
 | 
			
		||||
 | 
			
		||||
		self.object:set_velocity({
 | 
			
		||||
			x = dir.x * kb,
 | 
			
		||||
@@ -3180,7 +3145,7 @@ function mob_class:mob_activate(staticdata, def, dtime)
 | 
			
		||||
	-- Armor groups (immortal = 1 for custom damage handling)
 | 
			
		||||
	local armor
 | 
			
		||||
	if type(self.armor) == "table" then
 | 
			
		||||
		armor = table.copy(self.armor)
 | 
			
		||||
		armor = table_copy(self.armor)
 | 
			
		||||
--		armor.immortal = 1
 | 
			
		||||
	else
 | 
			
		||||
--		armor = {immortal = 1, fleshy = self.armor}
 | 
			
		||||
@@ -3222,7 +3187,7 @@ function mob_class:mob_activate(staticdata, def, dtime)
 | 
			
		||||
	-- run on_spawn function if found
 | 
			
		||||
	if self.on_spawn and not self.on_spawn_run then
 | 
			
		||||
		if self.on_spawn(self) then
 | 
			
		||||
			self.on_spawn_run = true --  if true, set flag to run once only
 | 
			
		||||
			self.on_spawn_run = true -- if true, set flag to run once only
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
@@ -3629,6 +3594,68 @@ local count_mobs = function(pos, type)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- do we have enough space to spawn mob? (thanks wuzzy)
 | 
			
		||||
local can_spawn = function(pos, name)
 | 
			
		||||
 | 
			
		||||
	local ent = minetest.registered_entities[name]
 | 
			
		||||
	local width_x = max(1, ceil(ent.collisionbox[4] - ent.collisionbox[1]))
 | 
			
		||||
	local min_x, max_x
 | 
			
		||||
 | 
			
		||||
	if width_x % 2 == 0 then
 | 
			
		||||
		max_x = floor(width_x / 2)
 | 
			
		||||
		min_x = -(max_x - 1)
 | 
			
		||||
	else
 | 
			
		||||
		max_x = floor(width_x / 2)
 | 
			
		||||
		min_x = -max_x
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local width_z = max(1, ceil(ent.collisionbox[6] - ent.collisionbox[3]))
 | 
			
		||||
	local min_z, max_z
 | 
			
		||||
 | 
			
		||||
	if width_z % 2 == 0 then
 | 
			
		||||
		max_z = floor(width_z / 2)
 | 
			
		||||
		min_z = -(max_z - 1)
 | 
			
		||||
	else
 | 
			
		||||
		max_z = floor(width_z / 2)
 | 
			
		||||
		min_z = -max_z
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	local max_y = max(0, ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1)
 | 
			
		||||
	local pos2
 | 
			
		||||
 | 
			
		||||
	for y = 0, max_y do
 | 
			
		||||
	for x = min_x, max_x do
 | 
			
		||||
	for z = min_z, max_z do
 | 
			
		||||
 | 
			
		||||
		pos2 = {x = pos.x + x, y = pos.y + y, z = pos.z + z}
 | 
			
		||||
 | 
			
		||||
		if minetest.registered_nodes[node_ok(pos2).name].walkable == true then
 | 
			
		||||
			return nil
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	end
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- spawn mob 1/2 node above ground
 | 
			
		||||
	pos.y = pos.y + 0.5
 | 
			
		||||
 | 
			
		||||
	-- tweak X/Z spawn pos
 | 
			
		||||
	if width_x % 2 == 0 then
 | 
			
		||||
		pos.x = pos.x + 0.5
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	if width_z % 2 == 0 then
 | 
			
		||||
		pos.z = pos.z + 0.5
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	return pos
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function mobs:can_spawn(pos, name)
 | 
			
		||||
	return can_spawn(pos, name)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- global functions
 | 
			
		||||
 | 
			
		||||
function mobs:add_mob(pos, def)
 | 
			
		||||
@@ -3737,16 +3764,17 @@ function mobs:spawn_abm_check(pos, node, name)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light,
 | 
			
		||||
		interval, chance, aoc, min_height, max_height, day_toggle, on_spawn)
 | 
			
		||||
function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval,
 | 
			
		||||
		chance, aoc, min_height, max_height, day_toggle, on_spawn, map_load)
 | 
			
		||||
 | 
			
		||||
	-- Do mobs spawn at all?
 | 
			
		||||
	if not mobs_spawn or not mobs.spawning_mobs[name] then
 | 
			
		||||
--print ("--- spawning not registered for " .. name)
 | 
			
		||||
		return
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	-- chance/spawn number override in minetest.conf for registered mob
 | 
			
		||||
	local numbers = minetest.settings:get(name)
 | 
			
		||||
	local numbers = settings:get(name)
 | 
			
		||||
 | 
			
		||||
	if numbers then
 | 
			
		||||
		numbers = numbers:split(",")
 | 
			
		||||
@@ -3762,191 +3790,168 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light,
 | 
			
		||||
		minetest.log("action", string.format(
 | 
			
		||||
				"[mobs] Chance setting for %s changed to %s (total: %s)",
 | 
			
		||||
				name, chance, aoc))
 | 
			
		||||
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	mobs.spawning_mobs[name].aoc = aoc
 | 
			
		||||
 | 
			
		||||
	minetest.register_abm({
 | 
			
		||||
	local spawn_action = function(pos, node, active_object_count,
 | 
			
		||||
			active_object_count_wider)
 | 
			
		||||
 | 
			
		||||
		label = name .. " spawning",
 | 
			
		||||
		nodenames = nodes,
 | 
			
		||||
		neighbors = neighbors,
 | 
			
		||||
		interval = interval,
 | 
			
		||||
		chance = max(1, (chance * mob_chance_multiplier)),
 | 
			
		||||
		catch_up = false,
 | 
			
		||||
		-- use instead of abm's chance setting when using lbm
 | 
			
		||||
		if map_load and random(max(1, (chance * mob_chance_multiplier))) > 1 then
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		action = function(pos, node, active_object_count,
 | 
			
		||||
				active_object_count_wider)
 | 
			
		||||
		-- use instead of abm's neighbor setting when using lbm
 | 
			
		||||
		if map_load and not minetest.find_node_near(pos, 1, neighbors) then
 | 
			
		||||
--print("--- lbm neighbors not found")
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
			-- is mob actually registered?
 | 
			
		||||
			if not mobs.spawning_mobs[name]
 | 
			
		||||
			or not minetest.registered_entities[name] then
 | 
			
		||||
		-- is mob actually registered?
 | 
			
		||||
		if not mobs.spawning_mobs[name]
 | 
			
		||||
		or not minetest.registered_entities[name] then
 | 
			
		||||
--print("--- mob doesn't exist", name)
 | 
			
		||||
				return
 | 
			
		||||
			end
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
			-- are we over active mob limit
 | 
			
		||||
			if active_limit > 0 and active_mobs >= active_limit then
 | 
			
		||||
		-- are we over active mob limit
 | 
			
		||||
		if active_limit > 0 and active_mobs >= active_limit then
 | 
			
		||||
--print("--- active mob limit reached", active_mobs, active_limit)
 | 
			
		||||
				return
 | 
			
		||||
			end
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
			-- additional custom checks for spawning mob
 | 
			
		||||
			if mobs:spawn_abm_check(pos, node, name) == true then
 | 
			
		||||
				return
 | 
			
		||||
			end
 | 
			
		||||
		-- additional custom checks for spawning mob
 | 
			
		||||
		if mobs:spawn_abm_check(pos, node, name) == true then
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
			-- do not spawn if too many entities in area
 | 
			
		||||
			if active_object_count_wider >= max_per_block then
 | 
			
		||||
		-- do not spawn if too many entities in area
 | 
			
		||||
		if active_object_count_wider
 | 
			
		||||
		and active_object_count_wider >= max_per_block then
 | 
			
		||||
--print("--- too many entities in area", active_object_count_wider)
 | 
			
		||||
				return
 | 
			
		||||
			end
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
			-- get total number of this mob in area
 | 
			
		||||
			local num_mob, is_pla = count_mobs(pos, name)
 | 
			
		||||
		-- get total number of this mob in area
 | 
			
		||||
		local num_mob, is_pla = count_mobs(pos, name)
 | 
			
		||||
 | 
			
		||||
			if not is_pla then
 | 
			
		||||
		if not is_pla then
 | 
			
		||||
--print("--- no players within active area, will not spawn " .. name)
 | 
			
		||||
				return
 | 
			
		||||
			end
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
			if num_mob >= aoc then
 | 
			
		||||
		if num_mob >= aoc then
 | 
			
		||||
--print("--- too many " .. name .. " in area", num_mob .. "/" .. aoc)
 | 
			
		||||
				return
 | 
			
		||||
			end
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
			-- if toggle set to nil then ignore day/night check
 | 
			
		||||
			if day_toggle ~= nil then
 | 
			
		||||
		if day_toggle ~= nil then
 | 
			
		||||
 | 
			
		||||
				local tod = (minetest.get_timeofday() or 0) * 24000
 | 
			
		||||
			local tod = (minetest.get_timeofday() or 0) * 24000
 | 
			
		||||
 | 
			
		||||
				if tod > 4500 and tod < 19500 then
 | 
			
		||||
					-- daylight, but mob wants night
 | 
			
		||||
					if day_toggle == false then
 | 
			
		||||
			if tod > 4500 and tod < 19500 then
 | 
			
		||||
				-- daylight, but mob wants night
 | 
			
		||||
				if day_toggle == false then
 | 
			
		||||
--print("--- mob needs night", name)
 | 
			
		||||
						return
 | 
			
		||||
					end
 | 
			
		||||
				else
 | 
			
		||||
					-- night time but mob wants day
 | 
			
		||||
					if day_toggle == true then
 | 
			
		||||
					return
 | 
			
		||||
				end
 | 
			
		||||
			else
 | 
			
		||||
				-- night time but mob wants day
 | 
			
		||||
				if day_toggle == true then
 | 
			
		||||
--print("--- mob needs day", name)
 | 
			
		||||
						return
 | 
			
		||||
					end
 | 
			
		||||
					return
 | 
			
		||||
				end
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
			-- spawn above node
 | 
			
		||||
			pos.y = pos.y + 1
 | 
			
		||||
		-- spawn above node
 | 
			
		||||
		pos.y = pos.y + 1
 | 
			
		||||
 | 
			
		||||
			-- are we spawning within height limits?
 | 
			
		||||
			if pos.y > max_height
 | 
			
		||||
			or pos.y < min_height then
 | 
			
		||||
		-- are we spawning within height limits?
 | 
			
		||||
		if pos.y > max_height
 | 
			
		||||
		or pos.y < min_height then
 | 
			
		||||
--print("--- height limits not met", name, pos.y)
 | 
			
		||||
				return
 | 
			
		||||
			end
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
			-- are light levels ok?
 | 
			
		||||
			local light = minetest.get_node_light(pos)
 | 
			
		||||
			if not light
 | 
			
		||||
			or light > max_light
 | 
			
		||||
			or light < min_light then
 | 
			
		||||
		-- are light levels ok?
 | 
			
		||||
		local light = minetest.get_node_light(pos)
 | 
			
		||||
		if not light
 | 
			
		||||
		or light > max_light
 | 
			
		||||
		or light < min_light then
 | 
			
		||||
--print("--- light limits not met", name, light)
 | 
			
		||||
				return
 | 
			
		||||
			end
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
			-- mobs cannot spawn in protected areas when enabled
 | 
			
		||||
			if not spawn_protected
 | 
			
		||||
			and minetest.is_protected(pos, "") then
 | 
			
		||||
		-- mobs cannot spawn in protected areas when enabled
 | 
			
		||||
		if not spawn_protected
 | 
			
		||||
		and minetest.is_protected(pos, "") then
 | 
			
		||||
--print("--- inside protected area", name)
 | 
			
		||||
			return
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
		-- only spawn a set distance away from player
 | 
			
		||||
		local objs = minetest.get_objects_inside_radius(pos, mob_nospawn_range)
 | 
			
		||||
 | 
			
		||||
		for n = 1, #objs do
 | 
			
		||||
 | 
			
		||||
			if objs[n]:is_player() then
 | 
			
		||||
--print("--- player too close", name)
 | 
			
		||||
				return
 | 
			
		||||
			end
 | 
			
		||||
		end
 | 
			
		||||
 | 
			
		||||
			-- only spawn a set distance away from player
 | 
			
		||||
			local objs = minetest.get_objects_inside_radius(
 | 
			
		||||
					pos, mob_nospawn_range)
 | 
			
		||||
		-- returns position if we have enough space to spawn mob
 | 
			
		||||
		pos = can_spawn(pos, name)
 | 
			
		||||
 | 
			
		||||
			for n = 1, #objs do
 | 
			
		||||
 | 
			
		||||
				if objs[n]:is_player() then
 | 
			
		||||
--print("--- player too close", name)
 | 
			
		||||
					return
 | 
			
		||||
				end
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			-- do we have enough space to spawn mob? (thanks wuzzy)
 | 
			
		||||
			local ent = minetest.registered_entities[name]
 | 
			
		||||
			local width_x = max(1,
 | 
			
		||||
					ceil(ent.collisionbox[4] - ent.collisionbox[1]))
 | 
			
		||||
			local min_x, max_x
 | 
			
		||||
 | 
			
		||||
			if width_x % 2 == 0 then
 | 
			
		||||
				max_x = floor(width_x / 2)
 | 
			
		||||
				min_x = -(max_x - 1)
 | 
			
		||||
			else
 | 
			
		||||
				max_x = floor(width_x / 2)
 | 
			
		||||
				min_x = -max_x
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			local width_z = max(1,
 | 
			
		||||
					ceil(ent.collisionbox[6] - ent.collisionbox[3]))
 | 
			
		||||
			local min_z, max_z
 | 
			
		||||
 | 
			
		||||
			if width_z % 2 == 0 then
 | 
			
		||||
				max_z = floor(width_z / 2)
 | 
			
		||||
				min_z = -(max_z - 1)
 | 
			
		||||
			else
 | 
			
		||||
				max_z = floor(width_z / 2)
 | 
			
		||||
				min_z = -max_z
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			local max_y = max(0,
 | 
			
		||||
					ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1)
 | 
			
		||||
 | 
			
		||||
			for y = 0, max_y do
 | 
			
		||||
			for x = min_x, max_x do
 | 
			
		||||
			for z = min_z, max_z do
 | 
			
		||||
 | 
			
		||||
				local pos2 = {
 | 
			
		||||
					x = pos.x + x,
 | 
			
		||||
					y = pos.y + y,
 | 
			
		||||
					z = pos.z + z}
 | 
			
		||||
 | 
			
		||||
				if minetest.registered_nodes[
 | 
			
		||||
						node_ok(pos2).name].walkable == true then
 | 
			
		||||
--print("--- not enough space to spawn", name)
 | 
			
		||||
					return
 | 
			
		||||
				end
 | 
			
		||||
			end
 | 
			
		||||
			end
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			-- spawn mob 1/2 node above ground
 | 
			
		||||
			pos.y = pos.y + 0.5
 | 
			
		||||
 | 
			
		||||
			-- tweak X/Z spawn pos
 | 
			
		||||
			if width_x % 2 == 0 then
 | 
			
		||||
				pos.x = pos.x + 0.5
 | 
			
		||||
			end
 | 
			
		||||
 | 
			
		||||
			if width_z % 2 == 0 then
 | 
			
		||||
				pos.z = pos.z + 0.5
 | 
			
		||||
			end
 | 
			
		||||
		if pos then
 | 
			
		||||
 | 
			
		||||
			local mob = minetest.add_entity(pos, name)
 | 
			
		||||
 | 
			
		||||
--			print("[mobs] Spawned " .. name .. " at "
 | 
			
		||||
--			.. minetest.pos_to_string(pos) .. " on "
 | 
			
		||||
--			.. node.name .. " near " .. neighbors[1])
 | 
			
		||||
--		print("[mobs] Spawned " .. name .. " at "
 | 
			
		||||
--		.. minetest.pos_to_string(pos) .. " on "
 | 
			
		||||
--		.. node.name .. " near " .. neighbors[1])
 | 
			
		||||
 | 
			
		||||
			if on_spawn then
 | 
			
		||||
 | 
			
		||||
				local ent = mob:get_luaentity()
 | 
			
		||||
 | 
			
		||||
				on_spawn(ent, pos)
 | 
			
		||||
				on_spawn(mob:get_luaentity(), pos)
 | 
			
		||||
			end
 | 
			
		||||
		else
 | 
			
		||||
--print("--- not enough space to spawn", name)
 | 
			
		||||
		end
 | 
			
		||||
	})
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	-- are we registering an abm or lbm?
 | 
			
		||||
	if map_load == true then
 | 
			
		||||
 | 
			
		||||
		minetest.register_lbm({
 | 
			
		||||
			name = name .. "_spawning",
 | 
			
		||||
			label = name .. " spawning",
 | 
			
		||||
			nodenames = nodes,
 | 
			
		||||
			run_at_every_load = false,
 | 
			
		||||
 | 
			
		||||
			action = function(pos, node)
 | 
			
		||||
				spawn_action(pos, node)
 | 
			
		||||
			end
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
	else
 | 
			
		||||
 | 
			
		||||
		minetest.register_abm({
 | 
			
		||||
			label = name .. " spawning",
 | 
			
		||||
			nodenames = nodes,
 | 
			
		||||
			neighbors = neighbors,
 | 
			
		||||
			interval = interval,
 | 
			
		||||
			chance = max(1, (chance * mob_chance_multiplier)),
 | 
			
		||||
			catch_up = false,
 | 
			
		||||
 | 
			
		||||
			action = function(pos, node, active_object_count, active_object_count_wider)
 | 
			
		||||
				spawn_action(pos, node, active_object_count, active_object_count_wider)
 | 
			
		||||
			end
 | 
			
		||||
		})
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -3959,7 +3964,7 @@ function mobs:register_spawn(name, nodes, max_light, min_light, chance,
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- MarkBu's spawn function
 | 
			
		||||
-- MarkBu's spawn function (USE this one please)
 | 
			
		||||
function mobs:spawn(def)
 | 
			
		||||
 | 
			
		||||
	mobs:spawn_specific(
 | 
			
		||||
@@ -3974,7 +3979,8 @@ function mobs:spawn(def)
 | 
			
		||||
		def.min_height or -31000,
 | 
			
		||||
		def.max_height or 31000,
 | 
			
		||||
		def.day_toggle,
 | 
			
		||||
		def.on_spawn)
 | 
			
		||||
		def.on_spawn,
 | 
			
		||||
		def.on_map_load)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -4592,14 +4598,17 @@ function mobs:feed_tame(self, clicker, feed_count, breed, tame)
 | 
			
		||||
		mob_sta[name] = item
 | 
			
		||||
 | 
			
		||||
		local tag = self.nametag or ""
 | 
			
		||||
		local esc = minetest.formspec_escape
 | 
			
		||||
 | 
			
		||||
		minetest.show_formspec(name, "mobs_nametag",
 | 
			
		||||
			"size[8,4]"
 | 
			
		||||
			.. "field[0.5,1;7.5,0;name;"
 | 
			
		||||
			.. minetest.formspec_escape(S("Enter name:"))
 | 
			
		||||
			.. ";" .. tag .. "]"
 | 
			
		||||
			.. "button_exit[2.5,3.5;3,1;mob_rename;"
 | 
			
		||||
			.. minetest.formspec_escape(S("Rename")) .. "]")
 | 
			
		||||
			"size[8,4]" ..
 | 
			
		||||
			"field[0.5,1;7.5,0;name;" ..
 | 
			
		||||
			esc(S("Enter name:")) ..
 | 
			
		||||
			";" .. tag .. "]" ..
 | 
			
		||||
			"button_exit[2.5,3.5;3,1;mob_rename;" ..
 | 
			
		||||
			esc(S("Rename")) .. "]")
 | 
			
		||||
 | 
			
		||||
		return true
 | 
			
		||||
	end
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								api.txt
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								api.txt
									
									
									
									
									
								
							@@ -199,7 +199,8 @@ functions needed for the mob to work properly which contains the following:
 | 
			
		||||
   '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:
 | 
			
		||||
   'animation'       holds a table containing animation names and settings for use with
 | 
			
		||||
                     mesh models:
 | 
			
		||||
      'stand_start'  start frame for when mob stands still.
 | 
			
		||||
      'stand_end'    end frame of stand animation.
 | 
			
		||||
      'stand_speed'  speed of animation in frames per second.
 | 
			
		||||
@@ -344,6 +345,15 @@ Adding Mobs in World
 | 
			
		||||
Returns false if mob could not be added, returns mob object if spawned ok.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Removing Mob from World
 | 
			
		||||
-----------------------
 | 
			
		||||
 | 
			
		||||
	mobs:remove(self, decrease)
 | 
			
		||||
 | 
			
		||||
Removes mob 'self' from the world and if 'decrease' is true then the mob counter
 | 
			
		||||
will also be decreased by one.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Spawning Mobs in World
 | 
			
		||||
----------------------
 | 
			
		||||
 | 
			
		||||
@@ -373,6 +383,9 @@ default setting and can be omitted:
 | 
			
		||||
                          anytime
 | 
			
		||||
    'on_spawn'            is a custom function which runs after mob has spawned
 | 
			
		||||
                          and gives self and pos values.
 | 
			
		||||
    'on_map_load'         when true mobs will have a chance of spawning only
 | 
			
		||||
                          when new areas of map are loaded, interval will not be
 | 
			
		||||
                          used.
 | 
			
		||||
 | 
			
		||||
The older spawn functions are still active and working but have no defaults like
 | 
			
		||||
the mobs:spawn, so it is recommended to use the above instead.
 | 
			
		||||
@@ -647,6 +660,13 @@ Use this instead:
 | 
			
		||||
    mob_class:line_of_sight(pos1, pos2, stepsize)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
mobs:can_spawn(pos, name)
 | 
			
		||||
 | 
			
		||||
This function checks the surrounding area at [pos] to see if there is enough empty
 | 
			
		||||
space to spawn mob [name], if so then a new position is returned for use,
 | 
			
		||||
otherwise nil is returned.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
External Settings for "minetest.conf"
 | 
			
		||||
------------------------------------
 | 
			
		||||
 | 
			
		||||
@@ -688,8 +708,8 @@ mobs_monster:sand_monster 100
 | 
			
		||||
...you can also change how many of a certain mob appear in an active mapblock by
 | 
			
		||||
adding a comma and then a new value e.g.
 | 
			
		||||
 | 
			
		||||
mobs_animal:cow 8000,4            <-- 4 cows per mapblock at 8000 spawn chance
 | 
			
		||||
mobs_monster:dirt_monster ,20     <-- 20 dirt monsters per mapblock
 | 
			
		||||
mobs_animal:cow = 8000,4            <-- 4 cows per mapblock at 8000 spawn chance
 | 
			
		||||
mobs_monster:dirt_monster = ,20     <-- 20 dirt monsters per mapblock
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Rideable Horse Example Mob
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								crafts.lua
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								crafts.lua
									
									
									
									
									
								
							@@ -331,3 +331,25 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
 | 
			
		||||
		tex_obj = nil
 | 
			
		||||
	end
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- Meat Block (thanks to painterlypack.net for allowing me to use these textures)
 | 
			
		||||
minetest.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, flammable = 2},
 | 
			
		||||
	sounds = default.node_sound_leaves_defaults(),
 | 
			
		||||
	on_place = minetest.rotate_node,
 | 
			
		||||
	on_use = minetest.item_eat(20),
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
minetest.register_craft({
 | 
			
		||||
	output = "mobs:meatblock",
 | 
			
		||||
	type = "shapeless",
 | 
			
		||||
	recipe = {
 | 
			
		||||
		"group:food_meat", "group:food_meat", "group:food_meat",
 | 
			
		||||
		"group:food_meat", "group:food_meat", "group:food_meat",
 | 
			
		||||
		"group:food_meat", "group:food_meat", "group:food_meat"
 | 
			
		||||
	}
 | 
			
		||||
})
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										46
									
								
								intllib.lua
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								intllib.lua
									
									
									
									
									
								
							@@ -1,45 +1,3 @@
 | 
			
		||||
-- Support for the old multi-load method
 | 
			
		||||
dofile(minetest.get_modpath("intllib").."/init.lua")
 | 
			
		||||
 | 
			
		||||
-- Fallback functions for when `intllib` is not installed.
 | 
			
		||||
-- Code released under Unlicense <http://unlicense.org>.
 | 
			
		||||
 | 
			
		||||
-- Get the latest version of this file at:
 | 
			
		||||
--   https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua
 | 
			
		||||
 | 
			
		||||
local function format(str, ...)
 | 
			
		||||
	local args = { ... }
 | 
			
		||||
	local function repl(escape, open, num, close)
 | 
			
		||||
		if escape == "" then
 | 
			
		||||
			local replacement = tostring(args[tonumber(num)])
 | 
			
		||||
			if open == "" then
 | 
			
		||||
				replacement = replacement..close
 | 
			
		||||
			end
 | 
			
		||||
			return replacement
 | 
			
		||||
		else
 | 
			
		||||
			return "@"..open..num..close
 | 
			
		||||
		end
 | 
			
		||||
	end
 | 
			
		||||
	return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl))
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local gettext, ngettext
 | 
			
		||||
if minetest.get_modpath("intllib") then
 | 
			
		||||
	if intllib.make_gettext_pair then
 | 
			
		||||
		-- New method using gettext.
 | 
			
		||||
		gettext, ngettext = intllib.make_gettext_pair()
 | 
			
		||||
	else
 | 
			
		||||
		-- Old method using text files.
 | 
			
		||||
		gettext = intllib.Getter()
 | 
			
		||||
	end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Fill in missing functions.
 | 
			
		||||
 | 
			
		||||
gettext = gettext or function(msgid, ...)
 | 
			
		||||
	return format(msgid, ...)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
ngettext = ngettext or function(msgid, msgid_plural, n, ...)
 | 
			
		||||
	return format(n==1 and msgid or msgid_plural, ...)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
return gettext, ngettext
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								locale/fr.po
									
									
									
									
									
								
							
							
						
						
									
										23
									
								
								locale/fr.po
									
									
									
									
									
								
							@@ -3,20 +3,19 @@
 | 
			
		||||
# This file is distributed under the same license as the PACKAGE package.
 | 
			
		||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 | 
			
		||||
#
 | 
			
		||||
#, fuzzy
 | 
			
		||||
msgid ""
 | 
			
		||||
msgstr ""
 | 
			
		||||
"Project-Id-Version: \n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2017-07-29 09:13+0200\n"
 | 
			
		||||
"PO-Revision-Date: 2017-07-29 09:20+0200\n"
 | 
			
		||||
"PO-Revision-Date: 2020-08-13 21:20+0500\n"
 | 
			
		||||
"Last-Translator: Olivier Dragon <odragon@protonmail.com>\n"
 | 
			
		||||
"Language-Team: \n"
 | 
			
		||||
"Language: fr\n"
 | 
			
		||||
"MIME-Version: 1.0\n"
 | 
			
		||||
"Content-Type: text/plain; charset=UTF-8\n"
 | 
			
		||||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"X-Generator: Poedit 1.8.12\n"
 | 
			
		||||
"Last-Translator: fat115 <fat115@framasoft.org>\n"
 | 
			
		||||
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
 | 
			
		||||
"Language: fr\n"
 | 
			
		||||
 | 
			
		||||
#: api.lua
 | 
			
		||||
msgid "** Peaceful Mode Active - No Monsters Will Spawn"
 | 
			
		||||
@@ -64,7 +63,7 @@ msgstr "Renommer"
 | 
			
		||||
 | 
			
		||||
#: crafts.lua
 | 
			
		||||
msgid "Name Tag"
 | 
			
		||||
msgstr "Étiquette pour collier"
 | 
			
		||||
msgstr "Étiquette de collier"
 | 
			
		||||
 | 
			
		||||
#: crafts.lua
 | 
			
		||||
msgid "Leather"
 | 
			
		||||
@@ -102,18 +101,26 @@ msgstr "Selle"
 | 
			
		||||
msgid "Mob Fence"
 | 
			
		||||
msgstr "Clôture à animaux"
 | 
			
		||||
 | 
			
		||||
#: crafts.lua
 | 
			
		||||
msgid "Mob Fence Top"
 | 
			
		||||
msgstr "Haut de clôture à animaux"
 | 
			
		||||
 | 
			
		||||
#: spawner.lua
 | 
			
		||||
msgid "Mob Spawner"
 | 
			
		||||
msgstr "Générateur de mob"
 | 
			
		||||
 | 
			
		||||
#: spawner.lua
 | 
			
		||||
msgid "Mob MinLight MaxLight Amount PlayerDist"
 | 
			
		||||
msgstr "Mob MinLumière MaxLumière Quantité DistanceJoueur"
 | 
			
		||||
msgid "(mob name) (min light) (max light) (amount) (player distance) (Y offset)"
 | 
			
		||||
msgstr "(Nom) (MinLumière) (MaxLumière) (Quantité) (Distance du Joueur) (Décalage en Y)"
 | 
			
		||||
 | 
			
		||||
#: spawner.lua
 | 
			
		||||
msgid "Spawner Not Active (enter settings)"
 | 
			
		||||
msgstr "Générateur non actif (entrez les paramètres)"
 | 
			
		||||
 | 
			
		||||
#: spawner.lua
 | 
			
		||||
msgid "Command:"
 | 
			
		||||
msgstr "Commande:"
 | 
			
		||||
 | 
			
		||||
#: spawner.lua
 | 
			
		||||
msgid "Spawner Active (@1)"
 | 
			
		||||
msgstr "Générateur actif (@1)"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										34
									
								
								locale/mobs.de_DE.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.de_DE.tr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
# textdomain:mobs
 | 
			
		||||
#** Peaceful Mode Active - No Monsters Will Spawn=
 | 
			
		||||
@1 (Tamed)=@1 (Gezähmt)
 | 
			
		||||
@1 at full health (@2)=@1 bei voller Gesundheit (@2)
 | 
			
		||||
@1 has been tamed!=@1 wurde gezähmt!
 | 
			
		||||
@1 is owner!=@1 ist der Besitzer!
 | 
			
		||||
#Active Mob Limit Reached!=
 | 
			
		||||
Already protected!=Bereits geschützt!
 | 
			
		||||
#Change=
 | 
			
		||||
#Command:=
 | 
			
		||||
Enter name:=Namen eingeben:
 | 
			
		||||
#Enter texture:=
 | 
			
		||||
Lasso (right-click animal to put in inventory)=Lasso (Rechtsklick auf Tier, um es zu nehmen)
 | 
			
		||||
Leather=Leder
 | 
			
		||||
Meat=Fleisch
 | 
			
		||||
Missed!=Daneben!
 | 
			
		||||
Mob Fence=Kreaturen Zaun
 | 
			
		||||
#Mob Fence Top=
 | 
			
		||||
Mob Protection Rune=Kreaturschutzrune
 | 
			
		||||
#Mob Reset Stick=
 | 
			
		||||
#Mob Spawner=
 | 
			
		||||
Mob Spawner settings failed!=Kreaturenspawner-Einstellungen gescheitert!
 | 
			
		||||
Mob has been protected!=Kreatur wurde geschützt!
 | 
			
		||||
Name Tag=Namensschild
 | 
			
		||||
Net (right-click animal to put in inventory)=Netz (Rechtsklick auf Tier, um es zu nehmen)
 | 
			
		||||
Not tamed!=Nicht gezähmt!
 | 
			
		||||
Raw Meat=Rohes Fleisch
 | 
			
		||||
Rename=Umbenennen
 | 
			
		||||
Saddle=Sattel
 | 
			
		||||
Spawner Active (@1)=Spawner aktiv (@1)
 | 
			
		||||
Spawner Not Active (enter settings)=Nicht aktiv (Einstellungen eingeben)
 | 
			
		||||
Steel Shears (right-click to shear)=Stahlschere (Rechtsklick zum Scheren)
 | 
			
		||||
#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]”=
 | 
			
		||||
#lifetimer expired, removed @1=
 | 
			
		||||
							
								
								
									
										34
									
								
								locale/mobs.en.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.en.tr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
# textdomain:mobs
 | 
			
		||||
#** Peaceful Mode Active - No Monsters Will Spawn=
 | 
			
		||||
#@1 (Tamed)=
 | 
			
		||||
#@1 at full health (@2)=
 | 
			
		||||
#@1 has been tamed!=
 | 
			
		||||
#@1 is owner!=
 | 
			
		||||
#Active Mob Limit Reached!=
 | 
			
		||||
#Already protected!=
 | 
			
		||||
#Change=
 | 
			
		||||
#Command:=
 | 
			
		||||
#Enter name:=
 | 
			
		||||
#Enter texture:=
 | 
			
		||||
#Lasso (right-click animal to put in inventory)=
 | 
			
		||||
#Leather=
 | 
			
		||||
#Meat=
 | 
			
		||||
#Missed!=
 | 
			
		||||
#Mob Fence=
 | 
			
		||||
#Mob Fence Top=
 | 
			
		||||
#Mob Protection Rune=
 | 
			
		||||
#Mob Reset Stick=
 | 
			
		||||
#Mob Spawner=
 | 
			
		||||
#Mob Spawner settings failed!=
 | 
			
		||||
#Mob has been protected!=
 | 
			
		||||
#Name Tag=
 | 
			
		||||
#Net (right-click animal to put in inventory)=
 | 
			
		||||
#Not tamed!=
 | 
			
		||||
#Raw Meat=
 | 
			
		||||
#Rename=
 | 
			
		||||
#Saddle=
 | 
			
		||||
#Spawner Active (@1)=
 | 
			
		||||
#Spawner Not Active (enter settings)=
 | 
			
		||||
#Steel Shears (right-click to shear)=
 | 
			
		||||
#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]”=
 | 
			
		||||
#lifetimer expired, removed @1=
 | 
			
		||||
							
								
								
									
										34
									
								
								locale/mobs.es.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.es.tr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
# textdomain:mobs
 | 
			
		||||
#** Peaceful Mode Active - No Monsters Will Spawn=
 | 
			
		||||
@1 (Tamed)=@1 (Domesticado)
 | 
			
		||||
@1 at full health (@2)=@1 con salud llena (@2)
 | 
			
		||||
@1 has been tamed!=@1 ha sido domesticado!
 | 
			
		||||
@1 is owner!=@1 es el dueño!
 | 
			
		||||
#Active Mob Limit Reached!=
 | 
			
		||||
Already protected!=Ya está protegido!
 | 
			
		||||
#Change=
 | 
			
		||||
#Command:=
 | 
			
		||||
Enter name:=Ingrese nombre:
 | 
			
		||||
#Enter texture:=
 | 
			
		||||
Lasso (right-click animal to put in inventory)=Lazo (click derecho en animal para colocar en inventario)
 | 
			
		||||
Leather=Cuero
 | 
			
		||||
Meat=Carne
 | 
			
		||||
Missed!=Perdido!
 | 
			
		||||
#Mob Fence=
 | 
			
		||||
#Mob Fence Top=
 | 
			
		||||
Mob Protection Rune=Runa de protección de Mob
 | 
			
		||||
#Mob Reset Stick=
 | 
			
		||||
#Mob Spawner=
 | 
			
		||||
Mob Spawner settings failed!=Configuracion de generador de Mob falló!
 | 
			
		||||
Mob has been protected!=El mob ha sido protegido!
 | 
			
		||||
Name Tag=Nombrar etiqueta
 | 
			
		||||
Net (right-click animal to put in inventory)=Red (click derecho en animal para colocar en inventario)
 | 
			
		||||
Not tamed!=No domesticado!
 | 
			
		||||
Raw Meat=Carne cruda
 | 
			
		||||
Rename=Renombrar
 | 
			
		||||
Saddle=Montura
 | 
			
		||||
Spawner Active (@1)=Generador activo (@1)
 | 
			
		||||
Spawner Not Active (enter settings)=Generador no activo (ingrese config)
 | 
			
		||||
Steel Shears (right-click to shear)=Tijera de acero (click derecho para esquilar)
 | 
			
		||||
#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]”=
 | 
			
		||||
#lifetimer expired, removed @1=
 | 
			
		||||
							
								
								
									
										34
									
								
								locale/mobs.fr.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.fr.tr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
# textdomain:mobs
 | 
			
		||||
** Peaceful Mode Active - No Monsters Will Spawn=** Mode pacifique activé - aucun monstre ne sera généré
 | 
			
		||||
@1 (Tamed)=@1 (apprivoisé)
 | 
			
		||||
@1 at full health (@2)=@1 est en pleine forme (@2) 
 | 
			
		||||
@1 has been tamed!=@1 a été apprivoisé ! 
 | 
			
		||||
@1 is owner!=Appartient à @1 !
 | 
			
		||||
Active Mob Limit Reached!=Limite atteinte du nombre des êtres vivants actifs !
 | 
			
		||||
Already protected!=Déjà protégé !
 | 
			
		||||
Change=Changer
 | 
			
		||||
Command:=Commande :
 | 
			
		||||
Enter name:=Saisissez un nom :
 | 
			
		||||
Enter texture:=Saisissez une texture :
 | 
			
		||||
Lasso (right-click animal to put in inventory)=Lasso (clic droit sur l'animal pour le mettre dans l'inventaire)
 | 
			
		||||
Leather=Cuir
 | 
			
		||||
Meat=Viande
 | 
			
		||||
Missed!=Raté !
 | 
			
		||||
Mob Fence= Clôture à animaux
 | 
			
		||||
Mob Fence Top=Haut de clôture à animaux
 | 
			
		||||
Mob Protection Rune=Rune de protection des animaux
 | 
			
		||||
Mob Reset Stick=Baguette de réinitialisation des êtres vivants
 | 
			
		||||
Mob Spawner=Créateur d'êtres vivants
 | 
			
		||||
Mob Spawner settings failed!=Échec des paramètres du créateur d'être vivants !
 | 
			
		||||
Mob has been protected!=L'animal a été protégé !
 | 
			
		||||
Name Tag=Étiquette de collier
 | 
			
		||||
Net (right-click animal to put in inventory)=Filet (clic droit sur l'animal pour le mettre dans l'inventaire)
 | 
			
		||||
Not tamed!=Non-apprivoisé !
 | 
			
		||||
Raw Meat=Viande crue
 | 
			
		||||
Rename=Renommer
 | 
			
		||||
Saddle=Selle
 | 
			
		||||
Spawner Active (@1)=Créateur actif (@1)
 | 
			
		||||
Spawner Not Active (enter settings)=Créateur non actif (entrez les paramètres)
 | 
			
		||||
Steel Shears (right-click to shear)=Ciseaux à laine (clic droit pour tondre)
 | 
			
		||||
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]”=Syntaxe : «name min_lumière[0-14] max_lumière[0-14] max_être_vivant_dans_région[0 pour désactiver] distance_joueur[1-20] décalage_y[-10 to 10]»
 | 
			
		||||
lifetimer expired, removed @1=Être immortel expiré ; @1 retiré
 | 
			
		||||
							
								
								
									
										34
									
								
								locale/mobs.it.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.it.tr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
# textdomain:mobs
 | 
			
		||||
** Peaceful Mode Active - No Monsters Will Spawn=** Modalità pacifica attiva - non comparirà nessun mostro
 | 
			
		||||
@1 (Tamed)=@1 (Addomesticato)
 | 
			
		||||
@1 at full health (@2)=@1 in piena salute (@2)
 | 
			
		||||
@1 has been tamed!=@1 è stato addomesticato!
 | 
			
		||||
@1 is owner!=Il padrone è @1!
 | 
			
		||||
#Active Mob Limit Reached!=
 | 
			
		||||
Already protected!=Già protetto!
 | 
			
		||||
#Change=
 | 
			
		||||
#Command:=
 | 
			
		||||
Enter name:=Inserire il nome:
 | 
			
		||||
#Enter texture:=
 | 
			
		||||
Lasso (right-click animal to put in inventory)=Lazo (click di destro per mettere l'animale nell'inventario)
 | 
			
		||||
Leather=Pelle
 | 
			
		||||
Meat=Carne
 | 
			
		||||
Missed!=Mancato!
 | 
			
		||||
Mob Fence=Recinzione per mob
 | 
			
		||||
#Mob Fence Top=
 | 
			
		||||
Mob Protection Rune=Runa di protezione per mob
 | 
			
		||||
#Mob Reset Stick=
 | 
			
		||||
#Mob Spawner=
 | 
			
		||||
Mob Spawner settings failed!=Impostazioni del generatore di mob fallite!
 | 
			
		||||
Mob has been protected!=Il mob è stato protetto!
 | 
			
		||||
Name Tag=Targhetta
 | 
			
		||||
Net (right-click animal to put in inventory)=Rete (click destro per mettere l'animale nell'inventario)
 | 
			
		||||
Not tamed!=Non addomesticato!
 | 
			
		||||
Raw Meat=Carne cruda
 | 
			
		||||
Rename=Rinomina
 | 
			
		||||
Saddle=Sella
 | 
			
		||||
Spawner Active (@1)=Generatore attivo (@1)
 | 
			
		||||
Spawner Not Active (enter settings)=Generatore inattivo (inserire le impostazioni)
 | 
			
		||||
Steel Shears (right-click to shear)=Cesoie d'acciaio (click destro per tosare)
 | 
			
		||||
#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]”=
 | 
			
		||||
#lifetimer expired, removed @1=
 | 
			
		||||
							
								
								
									
										34
									
								
								locale/mobs.ms.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.ms.tr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
# textdomain:mobs
 | 
			
		||||
** Peaceful Mode Active - No Monsters Will Spawn=** Mod Aman Diaktifkan - Tiada Raksasa Akan Muncul
 | 
			
		||||
@1 (Tamed)=@1 (Jinak)
 | 
			
		||||
@1 at full health (@2)=Mata kesihatan @1 telah penuh (@2)
 | 
			
		||||
@1 has been tamed!=@1 telah dijinakkan!
 | 
			
		||||
@1 is owner!=Ini hak milik @1!
 | 
			
		||||
#Active Mob Limit Reached!=
 | 
			
		||||
Already protected!=Telah dilindungi!
 | 
			
		||||
#Change=
 | 
			
		||||
#Command:=
 | 
			
		||||
Enter name:=Masukkan nama:
 | 
			
		||||
#Enter texture:=
 | 
			
		||||
Lasso (right-click animal to put in inventory)=Tanjul (klik-kanan haiwan untuk masukkan ke inventori)
 | 
			
		||||
Leather=Kulit
 | 
			
		||||
Meat=Daging Bakar
 | 
			
		||||
Missed!=Terlepas!
 | 
			
		||||
Mob Fence=Pagar Mob
 | 
			
		||||
#Mob Fence Top=
 | 
			
		||||
Mob Protection Rune=Rune Perlindungan Mob
 | 
			
		||||
#Mob Reset Stick=
 | 
			
		||||
#Mob Spawner=
 | 
			
		||||
Mob Spawner settings failed!=Penetapan Pewujud Mob gagal!
 | 
			
		||||
Mob has been protected!=Mob telah pun dilindungi!
 | 
			
		||||
Name Tag=Tanda Nama
 | 
			
		||||
Net (right-click animal to put in inventory)=Jaring (klik-kanan haiwan untuk masukkan ke inventori)
 | 
			
		||||
Not tamed!=Belum dijinakkan!
 | 
			
		||||
Raw Meat=Daging Mentah
 | 
			
		||||
Rename=Namakan semula
 | 
			
		||||
Saddle=Pelana
 | 
			
		||||
Spawner Active (@1)=Pewujud Mob Aktif (@1)
 | 
			
		||||
Spawner Not Active (enter settings)=Pewujud Mob Tidak Aktif (masukkan tetapan)
 | 
			
		||||
Steel Shears (right-click to shear)=Ketam Keluli (klik-kanan untuk mengetam bulu biri-biri)
 | 
			
		||||
#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]”=
 | 
			
		||||
#lifetimer expired, removed @1=
 | 
			
		||||
							
								
								
									
										34
									
								
								locale/mobs.pt.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.pt.tr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
# textdomain:mobs
 | 
			
		||||
#** Peaceful Mode Active - No Monsters Will Spawn=
 | 
			
		||||
#@1 (Tamed)=
 | 
			
		||||
@1 at full health (@2)=@1 em plena saude (@2)
 | 
			
		||||
@1 has been tamed!=@1 foi domesticado!
 | 
			
		||||
@1 is owner!=Dono @1!
 | 
			
		||||
#Active Mob Limit Reached!=
 | 
			
		||||
#Already protected!=
 | 
			
		||||
#Change=
 | 
			
		||||
#Command:=
 | 
			
		||||
Enter name:=Insira um nome:
 | 
			
		||||
#Enter texture:=
 | 
			
		||||
Lasso (right-click animal to put in inventory)=Laço (clique-direito no animal para por no inventario)
 | 
			
		||||
Leather=Couro
 | 
			
		||||
Meat=Carne
 | 
			
		||||
Missed!=Faltou!
 | 
			
		||||
#Mob Fence=
 | 
			
		||||
#Mob Fence Top=
 | 
			
		||||
#Mob Protection Rune=
 | 
			
		||||
#Mob Reset Stick=
 | 
			
		||||
#Mob Spawner=
 | 
			
		||||
Mob Spawner settings failed!=Configuraçao de Spawnador do Mob falhou!
 | 
			
		||||
#Mob has been protected!=
 | 
			
		||||
Name Tag=Etiqueta
 | 
			
		||||
Net (right-click animal to put in inventory)=Net (clique-direito no animal para por no inventario)
 | 
			
		||||
Not tamed!=Indomesticado!
 | 
			
		||||
Raw Meat=Carne crua
 | 
			
		||||
Rename=Renomear
 | 
			
		||||
#Saddle=
 | 
			
		||||
Spawner Active (@1)=Spawnador Ativo (@1)
 | 
			
		||||
Spawner Not Active (enter settings)=Spawnador Inativo (configurar)
 | 
			
		||||
Steel Shears (right-click to shear)=Tesoura de Aço (clique-direito para tosquiar)
 | 
			
		||||
#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]”=
 | 
			
		||||
#lifetimer expired, removed @1=
 | 
			
		||||
							
								
								
									
										34
									
								
								locale/mobs.ru.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.ru.tr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
# textdomain:mobs
 | 
			
		||||
** Peaceful Mode Active - No Monsters Will Spawn=** Мирный модус активирован - монстры не спаунятся
 | 
			
		||||
@1 (Tamed)=@1 (Прирученный)
 | 
			
		||||
@1 at full health (@2)=@1 при полном здоровье (@2)
 | 
			
		||||
@1 has been tamed!=@1 приручен
 | 
			
		||||
@1 is owner!=@1 владелец
 | 
			
		||||
#Active Mob Limit Reached!=
 | 
			
		||||
Already protected!=Уже защищен!
 | 
			
		||||
#Change=
 | 
			
		||||
#Command:=
 | 
			
		||||
Enter name:=Введите имя:
 | 
			
		||||
#Enter texture:=
 | 
			
		||||
Lasso (right-click animal to put in inventory)=Лассо (Правый клик - положить животное в инвентарь)
 | 
			
		||||
Leather=Кожа
 | 
			
		||||
Meat=Мясо
 | 
			
		||||
Missed!=Промазал!
 | 
			
		||||
Mob Fence=Забор от мобов
 | 
			
		||||
#Mob Fence Top=
 | 
			
		||||
Mob Protection Rune=Защитная руна мобов
 | 
			
		||||
#Mob Reset Stick=
 | 
			
		||||
#Mob Spawner=
 | 
			
		||||
Mob Spawner settings failed!=Настройки спаунера моба провалились
 | 
			
		||||
Mob has been protected!=Моб защищен!
 | 
			
		||||
Name Tag=Новый тэг
 | 
			
		||||
Net (right-click animal to put in inventory)=Сеть (Правый клик - положить животное в инвентарь)
 | 
			
		||||
Not tamed!=Не прирученный
 | 
			
		||||
Raw Meat=Сырое мясо
 | 
			
		||||
Rename=Переименовать
 | 
			
		||||
Saddle=Седло
 | 
			
		||||
Spawner Active (@1)=Активные спаунер (@1)
 | 
			
		||||
Spawner Not Active (enter settings)=Спаунер не активен (введите настройки)
 | 
			
		||||
Steel Shears (right-click to shear)=Ножницы (Правый клик - подстричь)
 | 
			
		||||
#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]”=
 | 
			
		||||
#lifetimer expired, removed @1=
 | 
			
		||||
							
								
								
									
										34
									
								
								locale/mobs.tr.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.tr.tr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
# textdomain:mobs
 | 
			
		||||
#** Peaceful Mode Active - No Monsters Will Spawn=
 | 
			
		||||
#@1 (Tamed)=
 | 
			
		||||
@1 at full health (@2)=@1 tam canında (@2)
 | 
			
		||||
@1 has been tamed!=@1 tamamen evcilleştirilmiştir!
 | 
			
		||||
@1 is owner!=Sahibi @1!
 | 
			
		||||
#Active Mob Limit Reached!=
 | 
			
		||||
#Already protected!=
 | 
			
		||||
#Change=
 | 
			
		||||
#Command:=
 | 
			
		||||
Enter name:=İsim gir:
 | 
			
		||||
#Enter texture:=
 | 
			
		||||
Lasso (right-click animal to put in inventory)=Kement (hayvana sağ tıklayarak envantere koy)
 | 
			
		||||
Leather=Deri
 | 
			
		||||
Meat=Et
 | 
			
		||||
Missed!=Kaçırdın!
 | 
			
		||||
Mob Fence=Canavar Yaratıcı
 | 
			
		||||
#Mob Fence Top=
 | 
			
		||||
#Mob Protection Rune=
 | 
			
		||||
#Mob Reset Stick=
 | 
			
		||||
#Mob Spawner=
 | 
			
		||||
Mob Spawner settings failed!=Yaratıcı ayarları uygulanamadı.
 | 
			
		||||
#Mob has been protected!=
 | 
			
		||||
Name Tag=İsim etiketi
 | 
			
		||||
Net (right-click animal to put in inventory)=Ağ (hayvana sağ tıklayarak envantere koy)
 | 
			
		||||
Not tamed!=Evcil değil!
 | 
			
		||||
Raw Meat=Çiğ et
 | 
			
		||||
Rename=Yeniden adlandır
 | 
			
		||||
#Saddle=
 | 
			
		||||
Spawner Active (@1)=Yaratıcı aktif (@1)
 | 
			
		||||
Spawner Not Active (enter settings)=Yaratıcı aktif değil (ayarlara gir)
 | 
			
		||||
Steel Shears (right-click to shear)=Çelik makas (sağ tıklayarak kes)
 | 
			
		||||
#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]”=
 | 
			
		||||
#lifetimer expired, removed @1=
 | 
			
		||||
							
								
								
									
										34
									
								
								locale/mobs.zh_CN.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.zh_CN.tr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
# textdomain:mobs
 | 
			
		||||
** Peaceful Mode Active - No Monsters Will Spawn=** 和平模式已激活——没有怪物会产生
 | 
			
		||||
@1 (Tamed)=@1(已驯服)
 | 
			
		||||
@1 at full health (@2)=@1已经满血(@2)
 | 
			
		||||
@1 has been tamed!=@1已经被驯服!
 | 
			
		||||
@1 is owner!=@1 是主人
 | 
			
		||||
#Active Mob Limit Reached!=
 | 
			
		||||
Already protected!=已经被保护!
 | 
			
		||||
#Change=
 | 
			
		||||
#Command:=
 | 
			
		||||
Enter name:=输入名称:
 | 
			
		||||
#Enter texture:=
 | 
			
		||||
Lasso (right-click animal to put in inventory)=套索(右键单击动物以放入物品栏)
 | 
			
		||||
Leather=皮革
 | 
			
		||||
Meat=肉
 | 
			
		||||
Missed!=没抓住!
 | 
			
		||||
Mob Fence=Mob 栅栏
 | 
			
		||||
#Mob Fence Top=
 | 
			
		||||
Mob Protection Rune=Mob 保护符文
 | 
			
		||||
#Mob Reset Stick=
 | 
			
		||||
#Mob Spawner=
 | 
			
		||||
Mob Spawner settings failed!=Mob 孵化器设置失败!
 | 
			
		||||
Mob has been protected!=Mob 已经被保护了!
 | 
			
		||||
Name Tag=名称标签
 | 
			
		||||
Net (right-click animal to put in inventory)=网(右键单击动物以放入物品栏)
 | 
			
		||||
Not tamed!=没有驯服!
 | 
			
		||||
Raw Meat=生肉
 | 
			
		||||
Rename=重新命名
 | 
			
		||||
Saddle=鞍
 | 
			
		||||
Spawner Active (@1)=孵化器正在运转(@1)
 | 
			
		||||
Spawner Not Active (enter settings)=孵化器未使用(输入设置)
 | 
			
		||||
Steel Shears (right-click to shear)=钢剪(右键单击以剪切)
 | 
			
		||||
#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]”=
 | 
			
		||||
#lifetimer expired, removed @1=
 | 
			
		||||
							
								
								
									
										34
									
								
								locale/mobs.zh_TW.tr
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								locale/mobs.zh_TW.tr
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
# textdomain:mobs
 | 
			
		||||
** Peaceful Mode Active - No Monsters Will Spawn=** 和平模式已激活——沒有怪物會產生
 | 
			
		||||
@1 (Tamed)=@1(已馴服)
 | 
			
		||||
@1 at full health (@2)=@1已經滿血(@2)
 | 
			
		||||
@1 has been tamed!=@1已經被馴服!
 | 
			
		||||
@1 is owner!=@1 是主人
 | 
			
		||||
#Active Mob Limit Reached!=
 | 
			
		||||
Already protected!=已經被保護!
 | 
			
		||||
#Change=
 | 
			
		||||
#Command:=
 | 
			
		||||
Enter name:=輸入名稱:
 | 
			
		||||
#Enter texture:=
 | 
			
		||||
Lasso (right-click animal to put in inventory)=套索(右鍵單擊動物以放入物品欄)
 | 
			
		||||
Leather=皮革
 | 
			
		||||
Meat=肉
 | 
			
		||||
Missed!=沒抓住!
 | 
			
		||||
Mob Fence=Mob 柵欄
 | 
			
		||||
#Mob Fence Top=
 | 
			
		||||
Mob Protection Rune=Mob 保護符文
 | 
			
		||||
#Mob Reset Stick=
 | 
			
		||||
#Mob Spawner=
 | 
			
		||||
Mob Spawner settings failed!=Mob 孵化器設置失敗!
 | 
			
		||||
Mob has been protected!=Mob 已經被保護了!
 | 
			
		||||
Name Tag=名稱標籤
 | 
			
		||||
Net (right-click animal to put in inventory)=網(右鍵單擊動物以放入物品欄)
 | 
			
		||||
Not tamed!=沒有馴服!
 | 
			
		||||
Raw Meat=生肉
 | 
			
		||||
Rename=重新命名
 | 
			
		||||
Saddle=鞍
 | 
			
		||||
Spawner Active (@1)=孵化器正在運轉(@1)
 | 
			
		||||
Spawner Not Active (enter settings)=孵化器未使用(輸入設置)
 | 
			
		||||
Steel Shears (right-click to shear)=鋼剪(右鍵單擊以剪切)
 | 
			
		||||
#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]”=
 | 
			
		||||
#lifetimer expired, removed @1=
 | 
			
		||||
@@ -101,6 +101,10 @@ msgstr ""
 | 
			
		||||
msgid "Mob Fence"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: crafts.lua
 | 
			
		||||
msgid "Mob Fence Top"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: spawner.lua
 | 
			
		||||
msgid "Mob Spawner"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 
 | 
			
		||||
@@ -23,7 +23,8 @@ Lucky Blocks: 9
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Changelog:
 | 
			
		||||
- 1.52 - Added 'mob_active_limit' in settings to set number of mobs in game
 | 
			
		||||
- 1.53 - Added 'on_map_load' settings to mobs:spawn so that mobs will only spawn when new areas of map are loaded.
 | 
			
		||||
- 1.52 - Added 'mob_active_limit' in settings to set number of mobs in game,
 | 
			
		||||
(default is 0 for unlimited), removed {immortal} from mob armor, fluid viscocity slows mobs
 | 
			
		||||
- 1.51 - Added some node checks for dangerous nodes, jumping and falling tweaks, spawn area check (thx for idea wuzzy), re-enabled mob suffocation, add 'mob_nospawn_range' setting
 | 
			
		||||
- 1.50 - Added new line_of_sight function that uses raycasting if mt5.0 is found,  (thanks Astrobe), dont spawn mobs if world anchor nearby (technic or simple_anchor mods), chinese local added
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								textures/mobs_meat_bottom.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								textures/mobs_meat_bottom.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 253 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/mobs_meat_side.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								textures/mobs_meat_side.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 271 B  | 
							
								
								
									
										
											BIN
										
									
								
								textures/mobs_meat_top.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								textures/mobs_meat_top.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 287 B  | 
		Reference in New Issue
	
	Block a user