Localize minetest library

This commit is contained in:
jordan4ibanez 2021-04-12 08:47:07 -04:00
parent adaf74fc5c
commit 6fff719322

View file

@ -4,6 +4,33 @@
-- lua locals -- lua locals
--localize minetest functions
local minetest_settings = minetest.settings
local minetest_get_objects_inside_radius = minetest.get_objects_inside_radius
local minetest_get_modpath = minetest.get_modpath
local minetest_registered_nodes = minetest.registered_nodes
local minetest_get_node = minetest.get_node
local minetest_get_item_group = minetest.get_item_group
local minetest_registered_entities = minetest.registered_entities
local minetest_line_of_sight = minetest.line_of_sight
local minetest_after = minetest.after
local minetest_sound_play = minetest.sound_play
local minetest_add_particlespawner = minetest.add_particlespawner
local minetest_registered_items = minetest.registered_items
local minetest_set_node = minetest.set_node
local minetest_add_item = minetest.add_item
local minetest_get_craft_result = minetest.get_craft_result
local minetest_find_path = minetest.find_path
local minetest_is_protected = minetest.is_protected
local minetest_is_creative_enabled = minetest.is_creative_enabled
local minetest_find_node_near = minetest.find_node_near
local minetest_find_nodes_in_area_under_air = minetest.find_nodes_in_area_under_air
local minetest_raycast = minetest.raycast
local minetest_get_us_time = minetest.get_us_time
local minetest_add_entity = minetest.add_entity
local minetest_get_natural_light = minetest.get_natural_light
local minetest_get_node_or_nil = minetest.get_node_or_nil
-- localize math functions -- localize math functions
local math_pi = math.pi local math_pi = math.pi
local math_sin = math.sin local math_sin = math.sin
@ -16,21 +43,21 @@ local math_random = math.random
local math_floor = math.floor local math_floor = math.floor
mobs = {} mobs = {}
-- mob constants
local MAX_MOB_NAME_LENGTH = 30 local MAX_MOB_NAME_LENGTH = 30
local BREED_TIME = 30 local BREED_TIME = 30
local BREED_TIME_AGAIN = 300 local BREED_TIME_AGAIN = 300
local CHILD_GROW_TIME = 60*20 local CHILD_GROW_TIME = 60*20
local DEATH_DELAY = 0.5 local DEATH_DELAY = 0.5
local DEFAULT_FALL_SPEED = -10 local DEFAULT_FALL_SPEED = -10
local FLOP_HEIGHT = 5.0 local FLOP_HEIGHT = 5.0
local FLOP_HOR_SPEED = 1.5 local FLOP_HOR_SPEED = 1.5
local MOB_CAP = {} local MOB_CAP = {}
MOB_CAP.hostile = 70 MOB_CAP.hostile = 70
MOB_CAP.passive = 10 MOB_CAP.passive = 10
MOB_CAP.ambient = 15 MOB_CAP.ambient = 15
MOB_CAP.water = 15 MOB_CAP.water = 15
-- Localize -- Localize
local S = minetest.get_translator("mcl_mobs") local S = minetest.get_translator("mcl_mobs")
@ -62,22 +89,22 @@ end
-- Load settings -- Load settings
local damage_enabled = minetest.settings:get_bool("enable_damage") local damage_enabled = minetest_settings:get_bool("enable_damage")
local disable_blood = minetest.settings:get_bool("mobs_disable_blood") local disable_blood = minetest_settings:get_bool("mobs_disable_blood")
local mobs_drop_items = minetest.settings:get_bool("mobs_drop_items") ~= false local mobs_drop_items = minetest_settings:get_bool("mobs_drop_items") ~= false
local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false local mobs_griefing = minetest_settings:get_bool("mobs_griefing") ~= false
local spawn_protected = minetest.settings:get_bool("mobs_spawn_protected") ~= false local spawn_protected = minetest_settings:get_bool("mobs_spawn_protected") ~= false
local remove_far = true local remove_far = true
local difficulty = tonumber(minetest.settings:get("mob_difficulty")) or 1.0 local difficulty = tonumber(minetest_settings:get("mob_difficulty")) or 1.0
local show_health = false local show_health = false
local max_per_block = tonumber(minetest.settings:get("max_objects_per_block") or 64) local max_per_block = tonumber(minetest_settings:get("max_objects_per_block") or 64)
local mobs_spawn_chance = tonumber(minetest.settings:get("mobs_spawn_chance") or 2.5) local mobs_spawn_chance = tonumber(minetest_settings:get("mobs_spawn_chance") or 2.5)
-- Shows helpful debug info above each mob -- Shows helpful debug info above each mob
local mobs_debug = minetest.settings:get_bool("mobs_debug", false) local mobs_debug = minetest_settings:get_bool("mobs_debug", false)
-- Peaceful mode message so players will know there are no monsters -- Peaceful mode message so players will know there are no monsters
if minetest.settings:get_bool("only_peaceful_mobs", false) then if minetest_settings:get_bool("only_peaceful_mobs", false) then
minetest.register_on_joinplayer(function(player) minetest.register_on_joinplayer(function(player)
minetest.chat_send_player(player:get_player_name(), minetest.chat_send_player(player:get_player_name(),
S("Peaceful mode active! No monsters will spawn.")) S("Peaceful mode active! No monsters will spawn."))
@ -95,13 +122,13 @@ local node_snowblock = "mcl_core:snowblock"
local node_snow = "mcl_core:snow" local node_snow = "mcl_core:snow"
mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dirt" mobs.fallback_node = minetest.registered_aliases["mapgen_dirt"] or "mcl_core:dirt"
local mod_weather = minetest.get_modpath("mcl_weather") ~= nil local mod_weather = minetest_get_modpath("mcl_weather") ~= nil
local mod_explosions = minetest.get_modpath("mcl_explosions") ~= nil local mod_explosions = minetest_get_modpath("mcl_explosions") ~= nil
local mod_mobspawners = minetest.get_modpath("mcl_mobspawners") ~= nil local mod_mobspawners = minetest_get_modpath("mcl_mobspawners") ~= nil
local mod_hunger = minetest.get_modpath("mcl_hunger") ~= nil local mod_hunger = minetest_get_modpath("mcl_hunger") ~= nil
local mod_worlds = minetest.get_modpath("mcl_worlds") ~= nil local mod_worlds = minetest_get_modpath("mcl_worlds") ~= nil
local mod_armor = minetest.get_modpath("mcl_armor") ~= nil local mod_armor = minetest_get_modpath("mcl_armor") ~= nil
local mod_experience = minetest.get_modpath("mcl_experience") ~= nil local mod_experience = minetest_get_modpath("mcl_experience") ~= nil
----For Water Flowing: ----For Water Flowing:
local enable_physics = function(object, luaentity, ignore_check) local enable_physics = function(object, luaentity, ignore_check)
@ -161,7 +188,7 @@ local mob_sound = function(self, soundname, is_opinion, fixed_pitch)
-- randomize the pitch a bit -- randomize the pitch a bit
pitch = pitch + math_random(-10, 10) * 0.005 pitch = pitch + math_random(-10, 10) * 0.005
end end
minetest.sound_play(sound, { minetest_sound_play(sound, {
object = self.object, object = self.object,
gain = 1.0, gain = 1.0,
max_hear_distance = self.sounds.distance, max_hear_distance = self.sounds.distance,
@ -229,7 +256,7 @@ local collision = function(self)
collision_count = 0 collision_count = 0
for _,object in ipairs(minetest.get_objects_inside_radius(pos, radius*1.25)) do for _,object in ipairs(minetest_get_objects_inside_radius(pos, radius*1.25)) do
if object ~= self.object and (object:is_player() or object:get_luaentity()._cmi_is_mob == true) and if object ~= self.object and (object:is_player() or object:get_luaentity()._cmi_is_mob == true) and
--don't collide with rider, rider don't collide with thing --don't collide with rider, rider don't collide with thing
(not object:get_attach() or (object:get_attach() and object:get_attach() ~= self.object)) and (not object:get_attach() or (object:get_attach() and object:get_attach() ~= self.object)) and
@ -469,16 +496,16 @@ end
local is_node_dangerous = function(self, nodename) local is_node_dangerous = function(self, nodename)
local nn = nodename local nn = nodename
if self.lava_damage > 0 then if self.lava_damage > 0 then
if minetest.get_item_group(nn, "lava") ~= 0 then if minetest_get_item_group(nn, "lava") ~= 0 then
return true return true
end end
end end
if self.fire_damage > 0 then if self.fire_damage > 0 then
if minetest.get_item_group(nn, "fire") ~= 0 then if minetest_get_item_group(nn, "fire") ~= 0 then
return true return true
end end
end end
if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].damage_per_second and minetest.registered_nodes[nn].damage_per_second > 0 then if minetest_registered_nodes[nn] and minetest_registered_nodes[nn].damage_per_second and minetest_registered_nodes[nn].damage_per_second > 0 then
return true return true
end end
return false return false
@ -489,15 +516,15 @@ end
local is_node_waterhazard = function(self, nodename) local is_node_waterhazard = function(self, nodename)
local nn = nodename local nn = nodename
if self.water_damage > 0 then if self.water_damage > 0 then
if minetest.get_item_group(nn, "water") ~= 0 then if minetest_get_item_group(nn, "water") ~= 0 then
return true return true
end end
end end
if minetest.registered_nodes[nn] and minetest.registered_nodes[nn].drowning and minetest.registered_nodes[nn].drowning > 0 then if minetest_registered_nodes[nn] and minetest_registered_nodes[nn].drowning and minetest_registered_nodes[nn].drowning > 0 then
if self.breath_max ~= -1 then if self.breath_max ~= -1 then
-- check if the mob is water-breathing _and_ the block is water; only return true if neither is the case -- check if the mob is water-breathing _and_ the block is water; only return true if neither is the case
-- this will prevent water-breathing mobs to classify water or e.g. sand below them as dangerous -- this will prevent water-breathing mobs to classify water or e.g. sand below them as dangerous
if not self.breathes_in_water and minetest.get_item_group(nn, "water") ~= 0 then if not self.breathes_in_water and minetest_get_item_group(nn, "water") ~= 0 then
return true return true
end end
end end
@ -511,7 +538,7 @@ local line_of_sight = function(self, pos1, pos2, stepsize)
stepsize = stepsize or 1 stepsize = stepsize or 1
local s, pos = minetest.line_of_sight(pos1, pos2, stepsize) local s, pos = minetest_line_of_sight(pos1, pos2, stepsize)
-- normal walking and flying mobs can see you through air -- normal walking and flying mobs can see you through air
if s == true then if s == true then
@ -521,13 +548,13 @@ local line_of_sight = function(self, pos1, pos2, stepsize)
-- New pos1 to be analyzed -- New pos1 to be analyzed
local npos1 = {x = pos1.x, y = pos1.y, z = pos1.z} local npos1 = {x = pos1.x, y = pos1.y, z = pos1.z}
local r, pos = minetest.line_of_sight(npos1, pos2, stepsize) local r, pos = minetest_line_of_sight(npos1, pos2, stepsize)
-- Checks the return -- Checks the return
if r == true then return true end if r == true then return true end
-- Nodename found -- Nodename found
local nn = minetest.get_node(pos).name local nn = minetest_get_node(pos).name
-- Target Distance (td) to travel -- Target Distance (td) to travel
local td = vector.distance(pos1, pos2) local td = vector.distance(pos1, pos2)
@ -537,8 +564,8 @@ local line_of_sight = function(self, pos1, pos2, stepsize)
-- It continues to advance in the line of sight in search of a real -- It continues to advance in the line of sight in search of a real
-- obstruction which counts as 'normal' nodebox. -- obstruction which counts as 'normal' nodebox.
while minetest.registered_nodes[nn] while minetest_registered_nodes[nn]
and minetest.registered_nodes[nn].walkable == false do and minetest_registered_nodes[nn].walkable == false do
-- Check if you can still move forward -- Check if you can still move forward
if td < ad + stepsize then if td < ad + stepsize then
@ -563,12 +590,12 @@ local line_of_sight = function(self, pos1, pos2, stepsize)
ad = ad + stepsize ad = ad + stepsize
-- scan again -- scan again
r, pos = minetest.line_of_sight(npos1, pos2, stepsize) r, pos = minetest_line_of_sight(npos1, pos2, stepsize)
if r == true then return true end if r == true then return true end
-- New Nodename found -- New Nodename found
nn = minetest.get_node(pos).name nn = minetest_get_node(pos).name
end end
@ -580,7 +607,7 @@ end
local flight_check = function(self) local flight_check = function(self)
local nod = self.standing_in local nod = self.standing_in
local def = minetest.registered_nodes[nod] local def = minetest_registered_nodes[nod]
if not def then return false end -- nil check if not def then return false end -- nil check
@ -597,7 +624,7 @@ local flight_check = function(self)
if nod == checknode then if nod == checknode then
return true return true
elseif checknode == "__airlike" and def.walkable == false and elseif checknode == "__airlike" and def.walkable == false and
(def.liquidtype == "none" or minetest.get_item_group(nod, "fake_liquid") == 1) then (def.liquidtype == "none" or minetest_get_item_group(nod, "fake_liquid") == 1) then
return true return true
end end
end end
@ -623,7 +650,7 @@ local effect = function(pos, amount, texture, min_size, max_size, radius, gravit
ym = -radius ym = -radius
end end
minetest.add_particlespawner({ minetest_add_particlespawner({
amount = amount, amount = amount,
time = 0.25, time = 0.25,
minpos = pos, minpos = pos,
@ -682,7 +709,7 @@ mobs.death_effect = function(pos, yaw, collisionbox, rotate)
max = vector.multiply(max, 0.5) max = vector.multiply(max, 0.5)
end end
minetest.add_particlespawner({ minetest_add_particlespawner({
amount = 50, amount = 50,
time = 0.001, time = 0.001,
minpos = vector.add(pos, min), minpos = vector.add(pos, min),
@ -698,7 +725,7 @@ mobs.death_effect = function(pos, yaw, collisionbox, rotate)
texture = "mcl_particles_mob_death.png^[colorize:#000000:255", texture = "mcl_particles_mob_death.png^[colorize:#000000:255",
}) })
minetest.sound_play("mcl_mobs_mob_poof", { minetest_sound_play("mcl_mobs_mob_poof", {
pos = pos, pos = pos,
gain = 1.0, gain = 1.0,
max_hear_distance = 8, max_hear_distance = 8,
@ -780,7 +807,7 @@ local item_drop = function(self, cooked, looting_level)
-- cook items when true -- cook items when true
if cooked then if cooked then
local output = minetest.get_craft_result({ local output = minetest_get_craft_result({
method = "cooking", width = 1, items = {item}}) method = "cooking", width = 1, items = {item}})
if output and output.item and not output.item:is_empty() then if output and output.item and not output.item:is_empty() then
@ -790,7 +817,7 @@ local item_drop = function(self, cooked, looting_level)
-- add item if it exists -- add item if it exists
for x = 1, num do for x = 1, num do
obj = minetest.add_item(pos, ItemStack(item .. " " .. 1)) obj = minetest_add_item(pos, ItemStack(item .. " " .. 1))
end end
if obj and obj:get_luaentity() then if obj and obj:get_luaentity() then
@ -836,7 +863,7 @@ local check_for_death = function(self, cause, cmi_cause)
-- play damage sound if health was reduced and make mob flash red. -- play damage sound if health was reduced and make mob flash red.
if damaged then if damaged then
add_texture_mod(self, "^[colorize:red:130") add_texture_mod(self, "^[colorize:red:130")
minetest.after(.2, function(self) minetest_after(.2, function(self)
if self and self.object then if self and self.object then
remove_texture_mod(self, "^[colorize:red:130") remove_texture_mod(self, "^[colorize:red:130")
end end
@ -879,7 +906,7 @@ local check_for_death = function(self, cause, cmi_cause)
local looting = mcl_enchanting.get_enchantment(wielditem, "looting") local looting = mcl_enchanting.get_enchantment(wielditem, "looting")
item_drop(self, cooked, looting) item_drop(self, cooked, looting)
if mod_experience and ((not self.child) or self.type ~= "animal") and (minetest.get_us_time() - self.xp_timestamp <= 5000000) then if mod_experience and ((not self.child) or self.type ~= "animal") and (minetest_get_us_time() - self.xp_timestamp <= 5000000) then
mcl_experience.throw_experience(self.object:get_pos(), math_random(self.xp_min, self.xp_max)) mcl_experience.throw_experience(self.object:get_pos(), math_random(self.xp_min, self.xp_max))
end end
end end
@ -972,7 +999,7 @@ local check_for_death = function(self, cause, cmi_cause)
if length <= 0 then if length <= 0 then
kill(self) kill(self)
else else
minetest.after(length, kill, self) minetest_after(length, kill, self)
end end
return true return true
@ -1016,18 +1043,18 @@ local is_at_cliff_or_danger = function(self)
local pos = self.object:get_pos() local pos = self.object:get_pos()
local ypos = pos.y + self.collisionbox[2] -- just above floor local ypos = pos.y + self.collisionbox[2] -- just above floor
local free_fall, blocker = minetest.line_of_sight( local free_fall, blocker = minetest_line_of_sight(
{x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z},
{x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z}) {x = pos.x + dir_x, y = ypos - self.fear_height, z = pos.z + dir_z})
if free_fall then if free_fall then
return true return true
else else
local bnode = minetest.get_node(blocker) local bnode = minetest_get_node(blocker)
local danger = is_node_dangerous(self, bnode.name) local danger = is_node_dangerous(self, bnode.name)
if danger then if danger then
return true return true
else else
local def = minetest.registered_nodes[bnode.name] local def = minetest_registered_nodes[bnode.name]
if def and def.walkable then if def and def.walkable then
return false return false
end end
@ -1051,13 +1078,13 @@ local is_at_water_danger = function(self)
local pos = self.object:get_pos() local pos = self.object:get_pos()
local ypos = pos.y + self.collisionbox[2] -- just above floor local ypos = pos.y + self.collisionbox[2] -- just above floor
local free_fall, blocker = minetest.line_of_sight( local free_fall, blocker = minetest_line_of_sight(
{x = pos.x + dir_x, y = ypos, z = pos.z + dir_z}, {x = pos.x + dir_x, y = ypos, z = pos.z + dir_z},
{x = pos.x + dir_x, y = ypos - 3, z = pos.z + dir_z}) {x = pos.x + dir_x, y = ypos - 3, z = pos.z + dir_z})
if free_fall then if free_fall then
return true return true
else else
local bnode = minetest.get_node(blocker) local bnode = minetest_get_node(blocker)
local waterdanger = is_node_waterhazard(self, bnode.name) local waterdanger = is_node_waterhazard(self, bnode.name)
if if
waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) then waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) then
@ -1065,7 +1092,7 @@ local is_at_water_danger = function(self)
elseif waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) == false then elseif waterdanger and (is_node_waterhazard(self, self.standing_in) or is_node_waterhazard(self, self.standing_on)) == false then
return true return true
else else
local def = minetest.registered_nodes[bnode.name] local def = minetest_registered_nodes[bnode.name]
if def and def.walkable then if def and def.walkable then
return false return false
end end
@ -1081,13 +1108,13 @@ local node_ok = function(pos, fallback)
fallback = fallback or mobs.fallback_node fallback = fallback or mobs.fallback_node
local node = minetest.get_node_or_nil(pos) local node = minetest_get_node_or_nil(pos)
if node and minetest.registered_nodes[node.name] then if node and minetest_registered_nodes[node.name] then
return node return node
end end
return minetest.registered_nodes[fallback] return minetest_registered_nodes[fallback]
end end
@ -1135,7 +1162,7 @@ local do_env_damage = function(self)
-- Use get_node_light for Minetest version 5.3 where get_natural_light -- Use get_node_light for Minetest version 5.3 where get_natural_light
-- does not exist yet. -- does not exist yet.
local get_light = minetest.get_natural_light or minetest.get_node_light local get_light = minetest_get_natural_light or minetest_get_node_light
local sunlight = get_light(pos, self.time_of_day) local sunlight = get_light(pos, self.time_of_day)
-- bright light harms mob -- bright light harms mob
@ -1174,7 +1201,7 @@ local do_env_damage = function(self)
self.object:set_velocity({x = 0, y = 0, z = 0}) self.object:set_velocity({x = 0, y = 0, z = 0})
end end
local nodef = minetest.registered_nodes[self.standing_in] local nodef = minetest_registered_nodes[self.standing_in]
-- rain -- rain
if self.rain_damage > 0 and mod_weather then if self.rain_damage > 0 and mod_weather then
@ -1256,7 +1283,7 @@ local do_env_damage = function(self)
if self.breath_max ~= -1 then if self.breath_max ~= -1 then
local drowning = false local drowning = false
if self.breathes_in_water then if self.breathes_in_water then
if minetest.get_item_group(self.standing_in, "water") == 0 then if minetest_get_item_group(self.standing_in, "water") == 0 then
drowning = true drowning = true
end end
elseif nodef.drowning > 0 then elseif nodef.drowning > 0 then
@ -1348,7 +1375,7 @@ local do_jump = function(self)
local nod = node_ok(pos) local nod = node_ok(pos)
if minetest.registered_nodes[nod.name].walkable == false then if minetest_registered_nodes[nod.name].walkable == false then
return false return false
end end
@ -1372,7 +1399,7 @@ local do_jump = function(self)
}, "air") }, "air")
-- we don't attempt to jump if there's a stack of blocks blocking -- we don't attempt to jump if there's a stack of blocks blocking
if minetest.registered_nodes[nodTop.name].walkable == true then if minetest_registered_nodes[nodTop.name].walkable == true then
return false return false
end end
@ -1382,11 +1409,11 @@ local do_jump = function(self)
end end
if self.walk_chance == 0 if self.walk_chance == 0
or minetest.registered_items[nod.name].walkable then or minetest_registered_items[nod.name].walkable then
if minetest.get_item_group(nod.name, "fence") == 0 if minetest_get_item_group(nod.name, "fence") == 0
and minetest.get_item_group(nod.name, "fence_gate") == 0 and minetest_get_item_group(nod.name, "fence_gate") == 0
and minetest.get_item_group(nod.name, "wall") == 0 then and minetest_get_item_group(nod.name, "wall") == 0 then
local v = self.object:get_velocity() local v = self.object:get_velocity()
@ -1397,7 +1424,7 @@ local do_jump = function(self)
self.object:set_velocity(v) self.object:set_velocity(v)
-- when in air move forward -- when in air move forward
minetest.after(0.3, function(self, v) minetest_after(0.3, function(self, v)
if (not self.object) or (not self.object:get_luaentity()) or (self.state == "die") then if (not self.object) or (not self.object:get_luaentity()) or (self.state == "die") then
return return
end end
@ -1444,7 +1471,7 @@ local entity_physics = function(pos, radius)
radius = radius * 2 radius = radius * 2
local objs = minetest.get_objects_inside_radius(pos, radius) local objs = minetest_get_objects_inside_radius(pos, radius)
local obj_pos, dist local obj_pos, dist
for n = 1, #objs do for n = 1, #objs do
@ -1555,7 +1582,7 @@ local breed = function(self)
effect({x = pos.x, y = pos.y + 1, z = pos.z}, 8, "heart.png", 3, 4, 1, 0.1) effect({x = pos.x, y = pos.y + 1, z = pos.z}, 8, "heart.png", 3, 4, 1, 0.1)
local objs = minetest.get_objects_inside_radius(pos, 3) local objs = minetest_get_objects_inside_radius(pos, 3)
local num = 0 local num = 0
local ent = nil local ent = nil
@ -1599,7 +1626,7 @@ local breed = function(self)
ent.hornytimer = BREED_TIME + 1 ent.hornytimer = BREED_TIME + 1
-- spawn baby -- spawn baby
minetest.after(5, function(parent1, parent2, pos) minetest_after(5, function(parent1, parent2, pos)
if not parent1.object:get_luaentity() then if not parent1.object:get_luaentity() then
return return
end end
@ -1678,7 +1705,7 @@ local replace = function(self, pos)
pos.y = pos.y + y_offset pos.y = pos.y + y_offset
local node = minetest.get_node(pos) local node = minetest_get_node(pos)
if node.name == what then if node.name == what then
local oldnode = {name = what, param2 = node.param2} local oldnode = {name = what, param2 = node.param2}
@ -1692,7 +1719,7 @@ local replace = function(self, pos)
if on_replace_return ~= false then if on_replace_return ~= false then
if mobs_griefing then if mobs_griefing then
minetest.set_node(pos, newnode) minetest_set_node(pos, newnode)
end end
end end
@ -1736,7 +1763,7 @@ local smart_mobs = function(self, s, p, dist, dtime)
self.path.lastpos = {x = s.x, y = s.y, z = s.z} self.path.lastpos = {x = s.x, y = s.y, z = s.z}
local use_pathfind = false local use_pathfind = false
local has_lineofsight = minetest.line_of_sight( local has_lineofsight = minetest_line_of_sight(
{x = s.x, y = (s.y) + .5, z = s.z}, {x = s.x, y = (s.y) + .5, z = s.z},
{x = target_pos.x, y = (target_pos.y) + 1.5, z = target_pos.z}, .2) {x = target_pos.x, y = (target_pos.y) + 1.5, z = target_pos.z}, .2)
@ -1753,7 +1780,7 @@ local smart_mobs = function(self, s, p, dist, dtime)
los_switcher = true los_switcher = true
use_pathfind = false use_pathfind = false
minetest.after(1, function(self) minetest_after(1, function(self)
if not self.object:get_luaentity() then if not self.object:get_luaentity() then
return return
end end
@ -1767,7 +1794,7 @@ local smart_mobs = function(self, s, p, dist, dtime)
use_pathfind = true use_pathfind = true
self.path.stuck_timer = 0 self.path.stuck_timer = 0
minetest.after(1, function(self) minetest_after(1, function(self)
if not self.object:get_luaentity() then if not self.object:get_luaentity() then
return return
end end
@ -1780,7 +1807,7 @@ local smart_mobs = function(self, s, p, dist, dtime)
use_pathfind = true use_pathfind = true
self.path.stuck_timer = 0 self.path.stuck_timer = 0
minetest.after(1, function(self) minetest_after(1, function(self)
if not self.object:get_luaentity() then if not self.object:get_luaentity() then
return return
end end
@ -1811,7 +1838,7 @@ local smart_mobs = function(self, s, p, dist, dtime)
s.x = math_floor(s.x + 0.5) s.x = math_floor(s.x + 0.5)
s.z = math_floor(s.z + 0.5) s.z = math_floor(s.z + 0.5)
local ssight, sground = minetest.line_of_sight(s, { local ssight, sground = minetest_line_of_sight(s, {
x = s.x, y = s.y - 4, z = s.z}, 1) x = s.x, y = s.y - 4, z = s.z}, 1)
-- determine node above ground -- determine node above ground
@ -1833,7 +1860,7 @@ local smart_mobs = function(self, s, p, dist, dtime)
elseif self.stepheight > 0.5 then elseif self.stepheight > 0.5 then
jumpheight = 1 jumpheight = 1
end end
self.path.way = minetest.find_path(s, p1, 16, jumpheight, dropheight, "A*_noprefetch") self.path.way = minetest_find_path(s, p1, 16, jumpheight, dropheight, "A*_noprefetch")
self.state = "" self.state = ""
do_attack(self, self.attack) do_attack(self, self.attack)
@ -1850,13 +1877,13 @@ local smart_mobs = function(self, s, p, dist, dtime)
if s.y < p1.y then if s.y < p1.y then
-- build upwards -- build upwards
if not minetest.is_protected(s, "") then if not minetest_is_protected(s, "") then
local ndef1 = minetest.registered_nodes[self.standing_in] local ndef1 = minetest_registered_nodes[self.standing_in]
if ndef1 and (ndef1.buildable_to or ndef1.groups.liquid) then if ndef1 and (ndef1.buildable_to or ndef1.groups.liquid) then
minetest.set_node(s, {name = mobs.fallback_node}) minetest_set_node(s, {name = mobs.fallback_node})
end end
end end
@ -1866,10 +1893,10 @@ local smart_mobs = function(self, s, p, dist, dtime)
s.y = s.y + sheight s.y = s.y + sheight
-- remove one block above to make room to jump -- remove one block above to make room to jump
if not minetest.is_protected(s, "") then if not minetest_is_protected(s, "") then
local node1 = node_ok(s, "air").name local node1 = node_ok(s, "air").name
local ndef1 = minetest.registered_nodes[node1] local ndef1 = minetest_registered_nodes[node1]
if node1 ~= "air" if node1 ~= "air"
and node1 ~= "ignore" and node1 ~= "ignore"
@ -1878,8 +1905,8 @@ local smart_mobs = function(self, s, p, dist, dtime)
and not ndef1.groups.unbreakable and not ndef1.groups.unbreakable
and not ndef1.groups.liquid then and not ndef1.groups.liquid then
minetest.set_node(s, {name = "air"}) minetest_set_node(s, {name = "air"})
minetest.add_item(s, ItemStack(node1)) minetest_add_item(s, ItemStack(node1))
end end
end end
@ -1896,10 +1923,10 @@ local smart_mobs = function(self, s, p, dist, dtime)
z = s.z + math_sin(yaw1) z = s.z + math_sin(yaw1)
} }
if not minetest.is_protected(p1, "") then if not minetest_is_protected(p1, "") then
local node1 = node_ok(p1, "air").name local node1 = node_ok(p1, "air").name
local ndef1 = minetest.registered_nodes[node1] local ndef1 = minetest_registered_nodes[node1]
if node1 ~= "air" if node1 ~= "air"
and node1 ~= "ignore" and node1 ~= "ignore"
@ -1908,13 +1935,13 @@ local smart_mobs = function(self, s, p, dist, dtime)
and not ndef1.groups.unbreakable and not ndef1.groups.unbreakable
and not ndef1.groups.liquid then and not ndef1.groups.liquid then
minetest.add_item(p1, ItemStack(node1)) minetest_add_item(p1, ItemStack(node1))
minetest.set_node(p1, {name = "air"}) minetest_set_node(p1, {name = "air"})
end end
p1.y = p1.y + 1 p1.y = p1.y + 1
node1 = node_ok(p1, "air").name node1 = node_ok(p1, "air").name
ndef1 = minetest.registered_nodes[node1] ndef1 = minetest_registered_nodes[node1]
if node1 ~= "air" if node1 ~= "air"
and node1 ~= "ignore" and node1 ~= "ignore"
@ -1923,8 +1950,8 @@ local smart_mobs = function(self, s, p, dist, dtime)
and not ndef1.groups.unbreakable and not ndef1.groups.unbreakable
and not ndef1.groups.liquid then and not ndef1.groups.liquid then
minetest.add_item(p1, ItemStack(node1)) minetest_add_item(p1, ItemStack(node1))
minetest.set_node(p1, {name = "air"}) minetest_set_node(p1, {name = "air"})
end end
end end
@ -1973,7 +2000,7 @@ local monster_attack = function(self)
if self.type ~= "monster" if self.type ~= "monster"
or not damage_enabled or not damage_enabled
or minetest.is_creative_enabled("") or minetest_is_creative_enabled("")
or self.passive or self.passive
or self.state == "attack" or self.state == "attack"
or day_docile(self) then or day_docile(self) then
@ -1985,7 +2012,7 @@ local monster_attack = function(self)
local player, obj, min_player local player, obj, min_player
local type, name = "", "" local type, name = "", ""
local min_dist = self.view_range + 1 local min_dist = self.view_range + 1
local objs = minetest.get_objects_inside_radius(s, self.view_range) local objs = minetest_get_objects_inside_radius(s, self.view_range)
for n = 1, #objs do for n = 1, #objs do
@ -2051,7 +2078,7 @@ local npc_attack = function(self)
local p, sp, obj, min_player local p, sp, obj, min_player
local s = self.object:get_pos() local s = self.object:get_pos()
local min_dist = self.view_range + 1 local min_dist = self.view_range + 1
local objs = minetest.get_objects_inside_radius(s, self.view_range) local objs = minetest_get_objects_inside_radius(s, self.view_range)
for n = 1, #objs do for n = 1, #objs do
@ -2114,7 +2141,7 @@ local runaway_from = function(self)
local player, obj, min_player local player, obj, min_player
local type, name = "", "" local type, name = "", ""
local min_dist = self.view_range + 1 local min_dist = self.view_range + 1
local objs = minetest.get_objects_inside_radius(s, self.view_range) local objs = minetest_get_objects_inside_radius(s, self.view_range)
for n = 1, #objs do for n = 1, #objs do
@ -2296,7 +2323,7 @@ local follow_flop = function(self)
self.state = "flop" self.state = "flop"
self.object:set_acceleration({x = 0, y = DEFAULT_FALL_SPEED, z = 0}) self.object:set_acceleration({x = 0, y = DEFAULT_FALL_SPEED, z = 0})
local sdef = minetest.registered_nodes[self.standing_on] local sdef = minetest_registered_nodes[self.standing_on]
-- Flop on ground -- Flop on ground
if sdef and sdef.walkable then if sdef and sdef.walkable then
mob_sound(self, "flop") mob_sound(self, "flop")
@ -2359,7 +2386,7 @@ local do_states = function(self, dtime)
local lp = nil local lp = nil
local s = self.object:get_pos() local s = self.object:get_pos()
local objs = minetest.get_objects_inside_radius(s, 3) local objs = minetest_get_objects_inside_radius(s, 3)
for n = 1, #objs do for n = 1, #objs do
@ -2415,19 +2442,19 @@ local do_states = function(self, dtime)
and self.lava_damage > 0) and self.lava_damage > 0)
or self.breath_max ~= -1 then or self.breath_max ~= -1 then
lp = minetest.find_node_near(s, 1, {"group:water", "group:lava"}) lp = minetest_find_node_near(s, 1, {"group:water", "group:lava"})
elseif self.water_damage > 0 then elseif self.water_damage > 0 then
lp = minetest.find_node_near(s, 1, {"group:water"}) lp = minetest_find_node_near(s, 1, {"group:water"})
elseif self.lava_damage > 0 then elseif self.lava_damage > 0 then
lp = minetest.find_node_near(s, 1, {"group:lava"}) lp = minetest_find_node_near(s, 1, {"group:lava"})
elseif self.fire_damage > 0 then elseif self.fire_damage > 0 then
lp = minetest.find_node_near(s, 1, {"group:fire"}) lp = minetest_find_node_near(s, 1, {"group:fire"})
end end
@ -2441,7 +2468,7 @@ local do_states = function(self, dtime)
-- If mob in or on dangerous block, look for land -- If mob in or on dangerous block, look for land
if is_in_danger then if is_in_danger then
-- Better way to find shore - copied from upstream -- Better way to find shore - copied from upstream
lp = minetest.find_nodes_in_area_under_air( lp = minetest_find_nodes_in_area_under_air(
{x = s.x - 5, y = s.y - 0.5, z = s.z - 5}, {x = s.x - 5, y = s.y - 0.5, z = s.z - 5},
{x = s.x + 5, y = s.y + 1, z = s.z + 5}, {x = s.x + 5, y = s.y + 1, z = s.z + 5},
{"group:solid"}) {"group:solid"})
@ -2637,10 +2664,10 @@ local do_states = function(self, dtime)
local pos = self.object:get_pos() local pos = self.object:get_pos()
if mod_explosions then if mod_explosions then
if mobs_griefing and not minetest.is_protected(pos, "") then if mobs_griefing and not minetest_is_protected(pos, "") then
mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { drop_chance = 1.0 }, self.object) mcl_explosions.explode(mcl_util.get_object_center(self.object), self.explosion_strength, { drop_chance = 1.0 }, self.object)
else else
minetest.sound_play(self.sounds.explode, { minetest_sound_play(self.sounds.explode, {
pos = pos, pos = pos,
gain = 1.0, gain = 1.0,
max_hear_distance = self.sounds.distance or 32 max_hear_distance = self.sounds.distance or 32
@ -2860,7 +2887,7 @@ local do_states = function(self, dtime)
if self.shoot_interval if self.shoot_interval
and self.timer > self.shoot_interval and self.timer > self.shoot_interval
and not minetest.raycast(p, self.attack:get_pos(), false, false):next() and not minetest_raycast(p, self.attack:get_pos(), false, false):next()
and math_random(1, 100) <= 60 then and math_random(1, 100) <= 60 then
self.timer = 0 self.timer = 0
@ -2870,16 +2897,16 @@ local do_states = function(self, dtime)
mob_sound(self, "shoot_attack") mob_sound(self, "shoot_attack")
-- Shoot arrow -- Shoot arrow
if minetest.registered_entities[self.arrow] then if minetest_registered_entities[self.arrow] then
local arrow, ent local arrow, ent
local v = 1 local v = 1
if not self.shoot_arrow then if not self.shoot_arrow then
self.firing = true self.firing = true
minetest.after(1, function() minetest_after(1, function()
self.firing = false self.firing = false
end) end)
arrow = minetest.add_entity(p, self.arrow) arrow = minetest_add_entity(p, self.arrow)
ent = arrow:get_luaentity() ent = arrow:get_luaentity()
if ent.velocity then if ent.velocity then
v = ent.velocity v = ent.velocity
@ -2946,7 +2973,7 @@ local falling = function(self, pos)
self.object:set_acceleration({x = 0, y = 0, z = 0}) self.object:set_acceleration({x = 0, y = 0, z = 0})
end end
if minetest.registered_nodes[node_ok(pos).name].groups.lava then if minetest_registered_nodes[node_ok(pos).name].groups.lava then
if self.floats_on_lava == 1 then if self.floats_on_lava == 1 then
@ -2959,7 +2986,7 @@ local falling = function(self, pos)
end end
-- in water then float up -- in water then float up
if minetest.registered_nodes[node_ok(pos).name].groups.water then if minetest_registered_nodes[node_ok(pos).name].groups.water then
if self.floats == 1 then if self.floats == 1 then
@ -2979,7 +3006,7 @@ local falling = function(self, pos)
if d > 5 then if d > 5 then
local add = minetest.get_item_group(self.standing_on, "fall_damage_add_percent") local add = minetest_get_item_group(self.standing_on, "fall_damage_add_percent")
local damage = d - 5 local damage = d - 5
if add ~= 0 then if add ~= 0 then
damage = damage + damage * (add/100) damage = damage + damage * (add/100)
@ -3032,12 +3059,12 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
if is_player then if is_player then
-- is mob protected? -- is mob protected?
if self.protected and minetest.is_protected(self.object:get_pos(), hitter:get_player_name()) then if self.protected and minetest_is_protected(self.object:get_pos(), hitter:get_player_name()) then
return return
end end
-- set/update 'drop xp' timestamp if hitted by player -- set/update 'drop xp' timestamp if hitted by player
self.xp_timestamp = minetest.get_us_time() self.xp_timestamp = minetest_get_us_time()
end end
@ -3115,11 +3142,11 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
-- add weapon wear manually -- add weapon wear manually
-- Required because we have custom health handling ("health" property) -- Required because we have custom health handling ("health" property)
if minetest.is_creative_enabled("") ~= true if minetest_is_creative_enabled("") ~= true
and tool_capabilities then and tool_capabilities then
if tool_capabilities.punch_attack_uses then if tool_capabilities.punch_attack_uses then
-- Without this delay, the wear does not work. Quite hacky ... -- Without this delay, the wear does not work. Quite hacky ...
minetest.after(0, function(name) minetest_after(0, function(name)
local player = minetest.get_player_by_name(name) local player = minetest.get_player_by_name(name)
if not player then return end if not player then return end
local weapon = hitter:get_wielded_item(player) local weapon = hitter:get_wielded_item(player)
@ -3143,12 +3170,12 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
local s = math_random(0, #weapon:get_definition().sounds) local s = math_random(0, #weapon:get_definition().sounds)
minetest.sound_play(weapon:get_definition().sounds[s], { minetest_sound_play(weapon:get_definition().sounds[s], {
object = self.object, --hitter, object = self.object, --hitter,
max_hear_distance = 8 max_hear_distance = 8
}, true) }, true)
else else
minetest.sound_play("default_punch", { minetest_sound_play("default_punch", {
object = self.object, object = self.object,
max_hear_distance = 5 max_hear_distance = 5
}, true) }, true)
@ -3251,7 +3278,7 @@ local mob_punch = function(self, hitter, tflp, tool_capabilities, dir)
end end
-- alert others to the attack -- alert others to the attack
local objs = minetest.get_objects_inside_radius(hitter:get_pos(), self.view_range) local objs = minetest_get_objects_inside_radius(hitter:get_pos(), self.view_range)
local obj = nil local obj = nil
for n = 1, #objs do for n = 1, #objs do
@ -3343,7 +3370,7 @@ local mob_activate = function(self, staticdata, def, dtime)
-- remove monsters in peaceful mode -- remove monsters in peaceful mode
if self.type == "monster" if self.type == "monster"
and minetest.settings:get_bool("only_peaceful_mobs", false) then and minetest_settings:get_bool("only_peaceful_mobs", false) then
mcl_burning.extinguish(self.object) mcl_burning.extinguish(self.object)
self.object:remove() self.object:remove()
@ -3680,10 +3707,10 @@ local mob_step = function(self, dtime)
-- Add water flowing for mobs from mcl_item_entity -- Add water flowing for mobs from mcl_item_entity
local p, node, nn, def local p, node, nn, def
p = self.object:get_pos() p = self.object:get_pos()
node = minetest.get_node_or_nil(p) node = minetest_get_node_or_nil(p)
if node then if node then
nn = node.name nn = node.name
def = minetest.registered_nodes[nn] def = minetest_registered_nodes[nn]
end end
-- Move item around on flowing liquids -- Move item around on flowing liquids
@ -3990,7 +4017,7 @@ minetest.register_entity(name, {
}) })
if minetest.get_modpath("doc_identifier") ~= nil then if minetest_get_modpath("doc_identifier") ~= nil then
doc.sub.identifier.register_object(name, "basics", "mobs") doc.sub.identifier.register_object(name, "basics", "mobs")
end end
@ -4054,7 +4081,7 @@ function mobs:register_arrow(name, def)
local node = node_ok(pos).name local node = node_ok(pos).name
if minetest.registered_nodes[node].walkable then if minetest_registered_nodes[node].walkable then
self.hit_node(self, pos, node) self.hit_node(self, pos, node)
@ -4064,7 +4091,7 @@ function mobs:register_arrow(name, def)
self.lastpos = (self.lastpos or pos) self.lastpos = (self.lastpos or pos)
minetest.add_item(self.lastpos, self.object:get_luaentity().name) minetest_add_item(self.lastpos, self.object:get_luaentity().name)
end end
self.object:remove(); self.object:remove();
@ -4075,7 +4102,7 @@ function mobs:register_arrow(name, def)
if self.hit_player or self.hit_mob or self.hit_object then if self.hit_player or self.hit_mob or self.hit_object then
for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do for _,player in pairs(minetest_get_objects_inside_radius(pos, 1.5)) do
if self.hit_player if self.hit_player
and player:is_player() then and player:is_player() then
@ -4117,7 +4144,7 @@ end
-- no damage to nodes explosion -- no damage to nodes explosion
function mobs:safe_boom(self, pos, strength) function mobs:safe_boom(self, pos, strength)
minetest.sound_play(self.sounds and self.sounds.explode or "tnt_explode", { minetest_sound_play(self.sounds and self.sounds.explode or "tnt_explode", {
pos = pos, pos = pos,
gain = 1.0, gain = 1.0,
max_hear_distance = self.sounds and self.sounds.distance or 32 max_hear_distance = self.sounds and self.sounds.distance or 32
@ -4132,7 +4159,7 @@ end
function mobs:boom(self, pos, strength, fire) function mobs:boom(self, pos, strength, fire)
self.object:remove() self.object:remove()
if mod_explosions then if mod_explosions then
if mobs_griefing and not minetest.is_protected(pos, "") then if mobs_griefing and not minetest_is_protected(pos, "") then
mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object) mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object)
else else
mobs:safe_boom(self, pos, strength) mobs:safe_boom(self, pos, strength)
@ -4179,20 +4206,20 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative)
local pos = pointed_thing.above local pos = pointed_thing.above
-- am I clicking on something with existing on_rightclick function? -- am I clicking on something with existing on_rightclick function?
local under = minetest.get_node(pointed_thing.under) local under = minetest_get_node(pointed_thing.under)
local def = minetest.registered_nodes[under.name] local def = minetest_registered_nodes[under.name]
if def and def.on_rightclick then if def and def.on_rightclick then
return def.on_rightclick(pointed_thing.under, under, placer, itemstack) return def.on_rightclick(pointed_thing.under, under, placer, itemstack)
end end
if pos if pos
and within_limits(pos, 0) and within_limits(pos, 0)
and not minetest.is_protected(pos, placer:get_player_name()) then and not minetest_is_protected(pos, placer:get_player_name()) then
local name = placer:get_player_name() local name = placer:get_player_name()
local privs = minetest.get_player_privs(name) local privs = minetest.get_player_privs(name)
if mod_mobspawners and under.name == "mcl_mobspawners:spawner" then if mod_mobspawners and under.name == "mcl_mobspawners:spawner" then
if minetest.is_protected(pointed_thing.under, name) then if minetest_is_protected(pointed_thing.under, name) then
minetest.record_protection_violation(pointed_thing.under, name) minetest.record_protection_violation(pointed_thing.under, name)
return itemstack return itemstack
end end
@ -4207,19 +4234,19 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative)
return itemstack return itemstack
end end
if not minetest.registered_entities[mob] then if not minetest_registered_entities[mob] then
return itemstack return itemstack
end end
if minetest.settings:get_bool("only_peaceful_mobs", false) if minetest_settings:get_bool("only_peaceful_mobs", false)
and minetest.registered_entities[mob].type == "monster" then and minetest_registered_entities[mob].type == "monster" then
minetest.chat_send_player(name, S("Only peaceful mobs allowed!")) minetest.chat_send_player(name, S("Only peaceful mobs allowed!"))
return itemstack return itemstack
end end
pos.y = pos.y - 0.5 pos.y = pos.y - 0.5
local mob = minetest.add_entity(pos, mob) local mob = minetest_add_entity(pos, mob)
minetest.log("action", "Mob spawned: "..name.." at "..minetest.pos_to_string(pos)) minetest.log("action", "Mob spawned: "..name.." at "..minetest.pos_to_string(pos))
local ent = mob:get_luaentity() local ent = mob:get_luaentity()
@ -4343,7 +4370,7 @@ end
-- Spawn a child -- Spawn a child
function mobs:spawn_child(pos, mob_type) function mobs:spawn_child(pos, mob_type)
local child = minetest.add_entity(pos, mob_type) local child = minetest_add_entity(pos, mob_type)
if not child then if not child then
return return
end end
@ -4401,8 +4428,8 @@ function mobs:alias_mob(old_name, new_name)
on_step = function(self) on_step = function(self)
if minetest.registered_entities[new_name] then if minetest_registered_entities[new_name] then
minetest.add_entity(self.object:get_pos(), new_name) minetest_add_entity(self.object:get_pos(), new_name)
end end
self.object:remove() self.object:remove()
@ -4418,7 +4445,7 @@ minetest.register_globalstep(function(dtime)
if timer < 1 then return end if timer < 1 then return end
for _, player in pairs(minetest.get_connected_players()) do for _, player in pairs(minetest.get_connected_players()) do
local pos = player:get_pos() local pos = player:get_pos()
for _, obj in pairs(minetest.get_objects_inside_radius(pos, 47)) do for _, obj in pairs(minetest_get_objects_inside_radius(pos, 47)) do
local lua = obj:get_luaentity() local lua = obj:get_luaentity()
if lua and lua._cmi_is_mob then if lua and lua._cmi_is_mob then
lua.lifetimer = math.max(20, lua.lifetimer) lua.lifetimer = math.max(20, lua.lifetimer)