mirror of
https://codeberg.org/tenplus1/mobs_redo.git
synced 2025-01-28 01:50:18 +01:00
tweak and tidy code (thanks MoNTE48)
This commit is contained in:
parent
351fce8ee8
commit
d125d0a5db
119
api.lua
119
api.lua
@ -6,7 +6,7 @@ local use_cmi = minetest.global_exists("cmi")
|
|||||||
|
|
||||||
mobs = {
|
mobs = {
|
||||||
mod = "redo",
|
mod = "redo",
|
||||||
version = "20200519",
|
version = "20200521",
|
||||||
intllib = S,
|
intllib = S,
|
||||||
invis = minetest.global_exists("invisibility") and invisibility or {}
|
invis = minetest.global_exists("invisibility") and invisibility or {}
|
||||||
}
|
}
|
||||||
@ -27,9 +27,11 @@ local cos = math.cos
|
|||||||
local abs = math.abs
|
local abs = math.abs
|
||||||
local min = math.min
|
local min = math.min
|
||||||
local max = math.max
|
local max = math.max
|
||||||
local atann = math.atan
|
|
||||||
local random = math.random
|
local random = math.random
|
||||||
local floor = math.floor
|
local floor = math.floor
|
||||||
|
local ceil = math.ceil
|
||||||
|
local rad = math.rad
|
||||||
|
local atann = math.atan
|
||||||
local atan = function(x)
|
local atan = function(x)
|
||||||
if not x or x ~= x then
|
if not x or x ~= x then
|
||||||
--error("atan bassed NaN")
|
--error("atan bassed NaN")
|
||||||
@ -47,7 +49,6 @@ local peaceful_only = minetest.settings:get_bool("only_peaceful_mobs")
|
|||||||
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 creative = minetest.settings:get_bool("creative_mode")
|
|
||||||
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 = minetest.settings:get_bool("remove_far_mobs") ~= false
|
local remove_far = minetest.settings:get_bool("remove_far_mobs") ~= false
|
||||||
local difficulty = tonumber(minetest.settings:get("mob_difficulty")) or 1.0
|
local difficulty = tonumber(minetest.settings:get("mob_difficulty")) or 1.0
|
||||||
@ -163,7 +164,7 @@ function mob_class:mob_sound(sound)
|
|||||||
if self.child then pitch = pitch * 1.5 end
|
if self.child then pitch = pitch * 1.5 end
|
||||||
|
|
||||||
-- a little random pitch to be different
|
-- a little random pitch to be different
|
||||||
pitch = pitch + math.random(-10, 10) * 0.005
|
pitch = pitch + random(-10, 10) * 0.005
|
||||||
|
|
||||||
if sound then
|
if sound then
|
||||||
minetest.sound_play(sound, {
|
minetest.sound_play(sound, {
|
||||||
@ -532,7 +533,7 @@ function mob_class:attempt_flight_correction(override)
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
local escape_target = flyable_nodes[math.random(1, #flyable_nodes)]
|
local escape_target = flyable_nodes[random(#flyable_nodes)]
|
||||||
local escape_direction = vector.direction(pos, escape_target)
|
local escape_direction = vector.direction(pos, escape_target)
|
||||||
|
|
||||||
self.object:set_velocity(
|
self.object:set_velocity(
|
||||||
@ -608,7 +609,7 @@ function mob_class:do_stay_near()
|
|||||||
local searchnodes = self.stay_near[1]
|
local searchnodes = self.stay_near[1]
|
||||||
local chance = self.stay_near[2] or 10
|
local chance = self.stay_near[2] or 10
|
||||||
|
|
||||||
if random(1, chance) > 1 then
|
if random(chance) > 1 then
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -716,7 +717,7 @@ function mob_class:item_drop()
|
|||||||
|
|
||||||
for n = 1, #self.drops do
|
for n = 1, #self.drops do
|
||||||
|
|
||||||
if random(1, self.drops[n].chance) == 1 then
|
if random(self.drops[n].chance) == 1 then
|
||||||
|
|
||||||
num = random(self.drops[n].min or 0, self.drops[n].max or 1)
|
num = random(self.drops[n].min or 0, self.drops[n].max or 1)
|
||||||
item = self.drops[n].name
|
item = self.drops[n].name
|
||||||
@ -1315,11 +1316,12 @@ function mob_class:breed()
|
|||||||
|
|
||||||
local pos = self.object:get_pos()
|
local pos = self.object:get_pos()
|
||||||
|
|
||||||
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
|
||||||
|
|
||||||
for n = 1, #objs do
|
for n = 1, #objs do
|
||||||
|
|
||||||
@ -1333,12 +1335,12 @@ function mob_class:breed()
|
|||||||
if ent.name == self.name then
|
if ent.name == self.name then
|
||||||
canmate = true
|
canmate = true
|
||||||
else
|
else
|
||||||
local entname = string.split(ent.name,":")
|
local entname = ent.name:split(":")
|
||||||
local selfname = string.split(self.name,":")
|
local selfname = self.name:split(":")
|
||||||
|
|
||||||
if entname[1] == selfname[1] then
|
if entname[1] == selfname[1] then
|
||||||
entname = string.split(entname[2],"_")
|
entname = entname[2]:split("_")
|
||||||
selfname = string.split(selfname[2],"_")
|
selfname = selfname[2]:split("_")
|
||||||
|
|
||||||
if entname[1] == selfname[1] then
|
if entname[1] == selfname[1] then
|
||||||
canmate = true
|
canmate = true
|
||||||
@ -1446,7 +1448,7 @@ function mob_class:replace(pos)
|
|||||||
or not self.replace_what
|
or not self.replace_what
|
||||||
or self.child == true
|
or self.child == true
|
||||||
or vel.y ~= 0
|
or vel.y ~= 0
|
||||||
or random(1, self.replace_rate) > 1 then
|
or random(self.replace_rate) > 1 then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -1606,10 +1608,9 @@ function mob_class:smart_mobs(s, p, dist, dtime)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- lets try find a path, first take care of positions
|
||||||
|
-- since pathfinder is very sensitive
|
||||||
if use_pathfind then
|
if use_pathfind then
|
||||||
-- lets try find a path, first take care of positions
|
|
||||||
-- since pathfinder is very sensitive
|
|
||||||
local sheight = self.collisionbox[5] - self.collisionbox[2]
|
|
||||||
|
|
||||||
-- round position to center of node to avoid stuck in walls
|
-- round position to center of node to avoid stuck in walls
|
||||||
-- also adjust height for player models!
|
-- also adjust height for player models!
|
||||||
@ -1637,7 +1638,8 @@ function mob_class:smart_mobs(s, p, dist, dtime)
|
|||||||
local jumpheight = 0
|
local jumpheight = 0
|
||||||
|
|
||||||
if self.jump and self.jump_height >= 4 then
|
if self.jump and self.jump_height >= 4 then
|
||||||
jumpheight = min(math.ceil(self.jump_height / 4), 4)
|
jumpheight = min(ceil(self.jump_height / 4), 4)
|
||||||
|
|
||||||
elseif self.stepheight > 0.5 then
|
elseif self.stepheight > 0.5 then
|
||||||
jumpheight = 1
|
jumpheight = 1
|
||||||
end
|
end
|
||||||
@ -1689,7 +1691,7 @@ function mob_class:smart_mobs(s, p, dist, dtime)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local sheight = math.ceil(self.collisionbox[5]) + 1
|
local sheight = ceil(self.collisionbox[5]) + 1
|
||||||
|
|
||||||
-- assume mob is 2 blocks high so it digs above its head
|
-- assume mob is 2 blocks high so it digs above its head
|
||||||
s.y = s.y + sheight
|
s.y = s.y + sheight
|
||||||
@ -1821,7 +1823,8 @@ function mob_class:general_attack()
|
|||||||
if objs[n]:is_player() then
|
if objs[n]:is_player() then
|
||||||
|
|
||||||
-- if player invisible or mob cannot attack then remove from list
|
-- if player invisible or mob cannot attack then remove from list
|
||||||
if self.attack_players == false
|
if not damage_enabled
|
||||||
|
or self.attack_players == false
|
||||||
or (self.owner and self.type ~= "monster")
|
or (self.owner and self.type ~= "monster")
|
||||||
or mobs.invis[objs[n]:get_player_name()]
|
or mobs.invis[objs[n]:get_player_name()]
|
||||||
or not specific_attack(self.specific_attack, "player") then
|
or not specific_attack(self.specific_attack, "player") then
|
||||||
@ -1874,7 +1877,7 @@ function mob_class:general_attack()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- attack closest player or mob
|
-- attack closest player or mob
|
||||||
if min_player and random(1, 100) > self.attack_chance then
|
if min_player and random(100) > self.attack_chance then
|
||||||
self:do_attack(min_player)
|
self:do_attack(min_player)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -2061,8 +2064,6 @@ function mob_class:follow_flop()
|
|||||||
-- swimmers flop when out of their element, and swim again when back in
|
-- swimmers flop when out of their element, and swim again when back in
|
||||||
if self.fly then
|
if self.fly then
|
||||||
|
|
||||||
local s = self.object:get_pos()
|
|
||||||
|
|
||||||
if not self:attempt_flight_correction() then
|
if not self:attempt_flight_correction() then
|
||||||
|
|
||||||
self.state = "flop"
|
self.state = "flop"
|
||||||
@ -2115,7 +2116,7 @@ function mob_class:do_states(dtime)
|
|||||||
|
|
||||||
if self.state == "stand" then
|
if self.state == "stand" then
|
||||||
|
|
||||||
if random(1, 4) == 1 then
|
if random(4) == 1 then
|
||||||
|
|
||||||
local lp
|
local lp
|
||||||
local s = self.object:get_pos()
|
local s = self.object:get_pos()
|
||||||
@ -2146,7 +2147,7 @@ function mob_class:do_states(dtime)
|
|||||||
if self.order ~= "stand"
|
if self.order ~= "stand"
|
||||||
and self.walk_chance ~= 0
|
and self.walk_chance ~= 0
|
||||||
and self.facing_fence ~= true
|
and self.facing_fence ~= true
|
||||||
and random(1, 100) <= self.walk_chance
|
and random(100) <= self.walk_chance
|
||||||
and self.at_cliff == false then
|
and self.at_cliff == false then
|
||||||
|
|
||||||
self:set_velocity(self.walk_velocity)
|
self:set_velocity(self.walk_velocity)
|
||||||
@ -2157,7 +2158,7 @@ function mob_class:do_states(dtime)
|
|||||||
elseif self.state == "walk" then
|
elseif self.state == "walk" then
|
||||||
|
|
||||||
local s = self.object:get_pos()
|
local s = self.object:get_pos()
|
||||||
local lp = nil
|
local lp
|
||||||
|
|
||||||
-- is there something I need to avoid?
|
-- is there something I need to avoid?
|
||||||
if self.water_damage > 0
|
if self.water_damage > 0
|
||||||
@ -2203,7 +2204,7 @@ function mob_class:do_states(dtime)
|
|||||||
yaw = self:set_yaw(yaw, 8)
|
yaw = self:set_yaw(yaw, 8)
|
||||||
|
|
||||||
-- otherwise randomly turn
|
-- otherwise randomly turn
|
||||||
elseif random(1, 100) <= 30 then
|
elseif random(100) <= 30 then
|
||||||
|
|
||||||
yaw = yaw + random(-0.5, 0.5)
|
yaw = yaw + random(-0.5, 0.5)
|
||||||
|
|
||||||
@ -2219,7 +2220,7 @@ function mob_class:do_states(dtime)
|
|||||||
-- stand for great fall in front
|
-- stand for great fall in front
|
||||||
if self.facing_fence == true
|
if self.facing_fence == true
|
||||||
or self.at_cliff
|
or self.at_cliff
|
||||||
or random(1, 100) <= self.stand_chance then
|
or random(100) <= self.stand_chance then
|
||||||
|
|
||||||
-- don't stand if mob flies and keep_flying set
|
-- don't stand if mob flies and keep_flying set
|
||||||
if (self.fly and not self.keep_flying)
|
if (self.fly and not self.keep_flying)
|
||||||
@ -2273,7 +2274,8 @@ function mob_class:do_states(dtime)
|
|||||||
or not self.attack
|
or not self.attack
|
||||||
or not self.attack:get_pos()
|
or not self.attack:get_pos()
|
||||||
or self.attack:get_hp() <= 0
|
or self.attack:get_hp() <= 0
|
||||||
or (self.attack:is_player() and mobs.invis[ self.attack:get_player_name() ]) then
|
or (self.attack:is_player()
|
||||||
|
and mobs.invis[ self.attack:get_player_name() ]) then
|
||||||
|
|
||||||
--print(" ** stop attacking **", dist, self.view_range)
|
--print(" ** stop attacking **", dist, self.view_range)
|
||||||
|
|
||||||
@ -2323,7 +2325,7 @@ function mob_class:do_states(dtime)
|
|||||||
self.timer = 0
|
self.timer = 0
|
||||||
self.blinktimer = 0
|
self.blinktimer = 0
|
||||||
self.blinkstatus = false
|
self.blinkstatus = false
|
||||||
self.object:settexturemod("")
|
self.object:set_texture_mod("")
|
||||||
end
|
end
|
||||||
|
|
||||||
-- walk right up to player unless the timer is active
|
-- walk right up to player unless the timer is active
|
||||||
@ -2540,9 +2542,11 @@ function mob_class:do_states(dtime)
|
|||||||
|
|
||||||
-- punch player (or what player is attached to)
|
-- punch player (or what player is attached to)
|
||||||
local attached = self.attack:get_attach()
|
local attached = self.attack:get_attach()
|
||||||
|
|
||||||
if attached then
|
if attached then
|
||||||
self.attack = attached
|
self.attack = attached
|
||||||
end
|
end
|
||||||
|
|
||||||
self.attack:punch(self.object, 1.0, {
|
self.attack:punch(self.object, 1.0, {
|
||||||
full_punch_interval = 1.0,
|
full_punch_interval = 1.0,
|
||||||
damage_groups = {fleshy = self.damage}
|
damage_groups = {fleshy = self.damage}
|
||||||
@ -2568,8 +2572,6 @@ function mob_class:do_states(dtime)
|
|||||||
p.y = p.y - .5
|
p.y = p.y - .5
|
||||||
s.y = s.y + .5
|
s.y = s.y + .5
|
||||||
|
|
||||||
local dist = get_distance(p, s)
|
|
||||||
|
|
||||||
local vec = {
|
local vec = {
|
||||||
x = p.x - s.x,
|
x = p.x - s.x,
|
||||||
y = p.y - s.y,
|
y = p.y - s.y,
|
||||||
@ -2582,7 +2584,7 @@ function mob_class:do_states(dtime)
|
|||||||
|
|
||||||
if self.shoot_interval
|
if self.shoot_interval
|
||||||
and self.timer > self.shoot_interval
|
and self.timer > self.shoot_interval
|
||||||
and random(1, 100) <= 60 then
|
and random(100) <= 60 then
|
||||||
|
|
||||||
self.timer = 0
|
self.timer = 0
|
||||||
self:set_animation("shoot")
|
self:set_animation("shoot")
|
||||||
@ -2847,7 +2849,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage)
|
|||||||
|
|
||||||
-- do we have a single blood texture or multiple?
|
-- do we have a single blood texture or multiple?
|
||||||
if type(self.blood_texture) == "table" then
|
if type(self.blood_texture) == "table" then
|
||||||
blood = self.blood_texture[random(1, #self.blood_texture)]
|
blood = self.blood_texture[random(#self.blood_texture)]
|
||||||
end
|
end
|
||||||
|
|
||||||
effect(pos, amount, blood, 1, 2, 1.75, nil, nil, true)
|
effect(pos, amount, blood, 1, 2, 1.75, nil, nil, true)
|
||||||
@ -2871,10 +2873,11 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage)
|
|||||||
|
|
||||||
if not self.object:get_luaentity() then return end
|
if not self.object:get_luaentity() then return end
|
||||||
|
|
||||||
self.object:settexturemod("^[colorize:#c9900070")
|
self.object:set_texture_mod("^[colorize:#c9900070")
|
||||||
|
|
||||||
core.after(0.3, function()
|
minetest.after(0.3, function()
|
||||||
self.object:settexturemod("")
|
if not self.object:get_luaentity() then return end
|
||||||
|
self.object:set_texture_mod(self.texture_mods)
|
||||||
end)
|
end)
|
||||||
end) ]]
|
end) ]]
|
||||||
|
|
||||||
@ -2942,7 +2945,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir, damage)
|
|||||||
-- alert others to the attack
|
-- alert others to the attack
|
||||||
local objs = minetest.get_objects_inside_radius(
|
local objs = minetest.get_objects_inside_radius(
|
||||||
hitter:get_pos(), self.view_range)
|
hitter:get_pos(), self.view_range)
|
||||||
local obj = nil
|
local obj
|
||||||
|
|
||||||
for n = 1, #objs do
|
for n = 1, #objs do
|
||||||
|
|
||||||
@ -3002,7 +3005,7 @@ function mob_class:mob_staticdata()
|
|||||||
|
|
||||||
-- used to rotate older mobs
|
-- used to rotate older mobs
|
||||||
if self.drawtype and self.drawtype == "side" then
|
if self.drawtype and self.drawtype == "side" then
|
||||||
self.rotate = math.rad(90)
|
self.rotate = rad(90)
|
||||||
end
|
end
|
||||||
|
|
||||||
if use_cmi then
|
if use_cmi then
|
||||||
@ -3077,7 +3080,7 @@ function mob_class:mob_activate(staticdata, def, dtime)
|
|||||||
end
|
end
|
||||||
|
|
||||||
self.base_texture = def.textures and
|
self.base_texture = def.textures and
|
||||||
def.textures[random(1, #def.textures)]
|
def.textures[random(#def.textures)]
|
||||||
self.base_mesh = def.mesh
|
self.base_mesh = def.mesh
|
||||||
self.base_size = self.visual_size
|
self.base_size = self.visual_size
|
||||||
self.base_colbox = self.collisionbox
|
self.base_colbox = self.collisionbox
|
||||||
@ -3385,7 +3388,7 @@ function mob_class:on_step(dtime, moveresult)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- mob plays random sound at times
|
-- mob plays random sound at times
|
||||||
if random(1, 100) == 1 then
|
if random(100) == 1 then
|
||||||
self:mob_sound(self.sounds.random)
|
self:mob_sound(self.sounds.random)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -3457,7 +3460,7 @@ minetest.register_entity(name, setmetatable({
|
|||||||
do_custom = def.do_custom,
|
do_custom = def.do_custom,
|
||||||
jump_height = def.jump_height,
|
jump_height = def.jump_height,
|
||||||
drawtype = def.drawtype, -- DEPRECATED, use rotate instead
|
drawtype = def.drawtype, -- DEPRECATED, use rotate instead
|
||||||
rotate = math.rad(def.rotate or 0), -- 0=front 90=side 180=back 270=side2
|
rotate = rad(def.rotate or 0), -- 0=front 90=side 180=back 270=side2
|
||||||
glow = def.glow,
|
glow = def.glow,
|
||||||
lifetimer = def.lifetimer,
|
lifetimer = def.lifetimer,
|
||||||
hp_min = max(1, (def.hp_min or 5) * difficulty),
|
hp_min = max(1, (def.hp_min or 5) * difficulty),
|
||||||
@ -3731,31 +3734,31 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light,
|
|||||||
-- do we have enough space to spawn mob? (thanks wuzzy)
|
-- do we have enough space to spawn mob? (thanks wuzzy)
|
||||||
local ent = minetest.registered_entities[name]
|
local ent = minetest.registered_entities[name]
|
||||||
local width_x = max(1,
|
local width_x = max(1,
|
||||||
math.ceil(ent.collisionbox[4] - ent.collisionbox[1]))
|
ceil(ent.collisionbox[4] - ent.collisionbox[1]))
|
||||||
local min_x, max_x
|
local min_x, max_x
|
||||||
|
|
||||||
if width_x % 2 == 0 then
|
if width_x % 2 == 0 then
|
||||||
max_x = math.floor(width_x / 2)
|
max_x = floor(width_x / 2)
|
||||||
min_x = -(max_x - 1)
|
min_x = -(max_x - 1)
|
||||||
else
|
else
|
||||||
max_x = math.floor(width_x / 2)
|
max_x = floor(width_x / 2)
|
||||||
min_x = -max_x
|
min_x = -max_x
|
||||||
end
|
end
|
||||||
|
|
||||||
local width_z = max(1,
|
local width_z = max(1,
|
||||||
math.ceil(ent.collisionbox[6] - ent.collisionbox[3]))
|
ceil(ent.collisionbox[6] - ent.collisionbox[3]))
|
||||||
local min_z, max_z
|
local min_z, max_z
|
||||||
|
|
||||||
if width_z % 2 == 0 then
|
if width_z % 2 == 0 then
|
||||||
max_z = math.floor(width_z / 2)
|
max_z = floor(width_z / 2)
|
||||||
min_z = -(max_z - 1)
|
min_z = -(max_z - 1)
|
||||||
else
|
else
|
||||||
max_z = math.floor(width_z / 2)
|
max_z = floor(width_z / 2)
|
||||||
min_z = -max_z
|
min_z = -max_z
|
||||||
end
|
end
|
||||||
|
|
||||||
local max_y = max(0,
|
local max_y = max(0,
|
||||||
math.ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1)
|
ceil(ent.collisionbox[5] - ent.collisionbox[2]) - 1)
|
||||||
|
|
||||||
for y = 0, max_y do
|
for y = 0, max_y do
|
||||||
for x = min_x, max_x do
|
for x = min_x, max_x do
|
||||||
@ -4015,7 +4018,7 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative)
|
|||||||
local grp = {spawn_egg = 1}
|
local grp = {spawn_egg = 1}
|
||||||
|
|
||||||
-- do NOT add this egg to creative inventory (e.g. dungeon master)
|
-- do NOT add this egg to creative inventory (e.g. dungeon master)
|
||||||
if creative and no_creative == true then
|
if no_creative == true then
|
||||||
grp.not_in_creative_inventory = 1
|
grp.not_in_creative_inventory = 1
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -4058,8 +4061,8 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative)
|
|||||||
pos.y = pos.y + 1
|
pos.y = pos.y + 1
|
||||||
|
|
||||||
local data = itemstack:get_metadata()
|
local data = itemstack:get_metadata()
|
||||||
local mob = minetest.add_entity(pos, mob, data)
|
local smob = minetest.add_entity(pos, mob, data)
|
||||||
local ent = mob and mob:get_luaentity()
|
local ent = smob and smob:get_luaentity()
|
||||||
|
|
||||||
if not ent then return end -- sanity check
|
if not ent then return end -- sanity check
|
||||||
|
|
||||||
@ -4117,8 +4120,8 @@ function mobs:register_egg(mob, desc, background, addegg, no_creative)
|
|||||||
|
|
||||||
pos.y = pos.y + 1
|
pos.y = pos.y + 1
|
||||||
|
|
||||||
local mob = minetest.add_entity(pos, mob)
|
local smob = minetest.add_entity(pos, mob)
|
||||||
local ent = mob and mob:get_luaentity()
|
local ent = smob and smob:get_luaentity()
|
||||||
|
|
||||||
if not ent then return end -- sanity check
|
if not ent then return end -- sanity check
|
||||||
|
|
||||||
@ -4248,7 +4251,7 @@ function mobs:capture_mob(self, clicker, chance_hand, chance_net,
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- calculate chance.. add to inventory if successful?
|
-- calculate chance.. add to inventory if successful?
|
||||||
if chance and chance > 0 and random(1, 100) <= chance then
|
if chance and chance > 0 and random(100) <= chance then
|
||||||
|
|
||||||
-- default mob egg
|
-- default mob egg
|
||||||
local new_stack = ItemStack(mobname)
|
local new_stack = ItemStack(mobname)
|
||||||
@ -4481,8 +4484,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- limit name entered to 64 characters long
|
-- limit name entered to 64 characters long
|
||||||
if string.len(fields.name) > 64 then
|
if fields.name:len() > 64 then
|
||||||
fields.name = string.sub(fields.name, 1, 64)
|
fields.name = fields.name:sub(1, 64)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- update nametag
|
-- update nametag
|
||||||
@ -4527,8 +4530,6 @@ function mobs:alias_mob(old_name, new_name)
|
|||||||
|
|
||||||
minetest.add_entity(self.object:get_pos(),
|
minetest.add_entity(self.object:get_pos(),
|
||||||
new_name, staticdata)
|
new_name, staticdata)
|
||||||
else
|
|
||||||
-- active_mobs = active_mobs - 1
|
|
||||||
end
|
end
|
||||||
|
|
||||||
remove_mob(self)
|
remove_mob(self)
|
||||||
|
@ -302,8 +302,6 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||||||
and fields.name
|
and fields.name
|
||||||
and fields.name ~= "" then
|
and fields.name ~= "" then
|
||||||
|
|
||||||
local name = player:get_player_name()
|
|
||||||
|
|
||||||
-- does mob still exist?
|
-- does mob still exist?
|
||||||
if not tex_obj
|
if not tex_obj
|
||||||
or not tex_obj:get_luaentity() then
|
or not tex_obj:get_luaentity() then
|
||||||
@ -318,8 +316,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- limit name entered to 64 characters long
|
-- limit name entered to 64 characters long
|
||||||
if string.len(fields.name) > 64 then
|
if fields.name:len() > 64 then
|
||||||
fields.name = string.sub(fields.name, 1, 64)
|
fields.name = fields.name:sub(1, 64)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- update texture
|
-- update texture
|
||||||
|
14
spawner.lua
14
spawner.lua
@ -19,7 +19,8 @@ minetest.register_node("mobs:spawner", {
|
|||||||
|
|
||||||
-- text entry formspec
|
-- text entry formspec
|
||||||
meta:set_string("formspec",
|
meta:set_string("formspec",
|
||||||
"field[text;" .. S("Mob MinLight MaxLight Amount PlayerDist") .. ";${command}]")
|
"field[text;" .. S("Mob MinLight MaxLight Amount PlayerDist")
|
||||||
|
.. ";${command}]")
|
||||||
meta:set_string("infotext", S("Spawner Not Active (enter settings)"))
|
meta:set_string("infotext", S("Spawner Not Active (enter settings)"))
|
||||||
meta:set_string("command", spawner_default)
|
meta:set_string("command", spawner_default)
|
||||||
end,
|
end,
|
||||||
@ -115,10 +116,10 @@ minetest.register_abm({
|
|||||||
-- check objects inside 9x9 area around spawner
|
-- check objects inside 9x9 area around spawner
|
||||||
local objs = minetest.get_objects_inside_radius(pos, 9)
|
local objs = minetest.get_objects_inside_radius(pos, 9)
|
||||||
local count = 0
|
local count = 0
|
||||||
local ent = nil
|
local ent
|
||||||
|
|
||||||
-- count mob objects of same type in area
|
-- count mob objects of same type in area
|
||||||
for k, obj in ipairs(objs) do
|
for _, obj in ipairs(objs) do
|
||||||
|
|
||||||
ent = obj:get_luaentity()
|
ent = obj:get_luaentity()
|
||||||
|
|
||||||
@ -136,9 +137,9 @@ minetest.register_abm({
|
|||||||
if pla > 0 then
|
if pla > 0 then
|
||||||
|
|
||||||
local in_range = 0
|
local in_range = 0
|
||||||
local objs = minetest.get_objects_inside_radius(pos, pla)
|
local objsp = minetest.get_objects_inside_radius(pos, pla)
|
||||||
|
|
||||||
for _,oir in pairs(objs) do
|
for _, oir in pairs(objsp) do
|
||||||
|
|
||||||
if oir:is_player() then
|
if oir:is_player() then
|
||||||
|
|
||||||
@ -157,8 +158,7 @@ minetest.register_abm({
|
|||||||
-- find air blocks within 5 nodes of spawner
|
-- find air blocks within 5 nodes of spawner
|
||||||
local air = minetest.find_nodes_in_area(
|
local air = minetest.find_nodes_in_area(
|
||||||
{x = pos.x - 5, y = pos.y + yof, z = pos.z - 5},
|
{x = pos.x - 5, y = pos.y + yof, z = pos.z - 5},
|
||||||
{x = pos.x + 5, y = pos.y + yof, z = pos.z + 5},
|
{x = pos.x + 5, y = pos.y + yof, z = pos.z + 5}, {"air"})
|
||||||
{"air"})
|
|
||||||
|
|
||||||
-- spawn in random air block
|
-- spawn in random air block
|
||||||
if air and #air > 0 then
|
if air and #air > 0 then
|
||||||
|
Loading…
Reference in New Issue
Block a user