Mobs spawn and despawn away from player, tweaked and tidied code

master
TenPlus1 2016-02-02 10:32:43 +00:00
parent 9885b76b74
commit 629ac9186b
2 changed files with 28 additions and 18 deletions

View File

@ -28,6 +28,7 @@ This mod contains the following additions:
Changelog:
1.25- Mobs no longer spawn within 12 blocks of player or despawn within same range. Code tidy and tweak.
1.24- Added feature where certain animals run away when punched (runaway = true in mob definition)
1.23- Added mob spawner block for admin to setup spawners in-game (place and right click to enter settings)
1.22- Added ability to name tamed animals and npc using nametags, also npc will attack anyone who punches them apart from owner

45
api.lua
View File

@ -1,4 +1,4 @@
-- Mobs Api (1st February 2016)
-- Mobs Api (2nd February 2016)
mobs = {}
mobs.mod = "redo"
@ -35,21 +35,12 @@ end
set_velocity = function(self, v)
local x = 0
local z = 0
-- if v and v ~= 0 then
local yaw = (self.object:getyaw() + self.rotate) or 0
x = math.sin(yaw) * -v
z = math.cos(yaw) * v
-- end
local yaw = (self.object:getyaw() + self.rotate) or 0
self.object:setvelocity({
x = x,
x = math.sin(yaw) * -v,
y = self.object:getvelocity().y,
z = z
z = math.cos(yaw) * v
})
end
@ -322,13 +313,11 @@ do_env_damage = function(self)
pos.y = pos.y + self.collisionbox[2] + 0.1 -- foot level
local nod = node_ok(pos, "air") ; --print ("standing in "..nod)
--local nodef = minetest.registered_nodes[nod]
pos.y = pos.y + 1
-- water
if self.water_damage ~= 0
--and nodef.groups.water then
and minetest.get_item_group(nod, "water") ~= 0 then
self.object:set_hp(self.object:get_hp() - self.water_damage)
@ -338,7 +327,6 @@ do_env_damage = function(self)
-- lava or fire
if self.lava_damage ~= 0
--and (nodef.groups.lava
and (minetest.get_item_group(nod, "lava") ~= 0
or nod == "fire:basic_flame"
or nod == "fire:permanent_flame") then
@ -758,6 +746,19 @@ minetest.register_entity(name, {
if self.lifetimer <= 0 then
-- only despawn away from player
local objs = minetest.get_objects_inside_radius(pos, 12)
for _,oir in pairs(objs) do
if oir:is_player() then
self.lifetimer = 20
return
end
end
minetest.log("action",
"lifetimer expired, removed " .. self.name)
@ -785,7 +786,6 @@ minetest.register_entity(name, {
end
-- in water then float up
--if minetest.registered_nodes[node_ok(pos)].groups.water then
if minetest.get_item_group(node_ok(pos), "water") ~= 0 then
if self.floats == 1 then
@ -1872,6 +1872,16 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light,
-- spawn above node
pos.y = pos.y + 1
-- only spawn away from player
local objs = minetest.get_objects_inside_radius(pos, 12)
for _,oir in pairs(objs) do
if oir:is_player() then
return
end
end
-- mobs cannot spawn in protected areas when enabled
if spawn_protected == 1
and minetest.is_protected(pos, "") then
@ -2015,7 +2025,6 @@ function mobs:explosion(pos, radius, fire, smoke, sound)
-- after effects
if fire > 0
--and (minetest.registered_nodes[n].groups.flammable
and (minetest.get_item_group(n, "flammable") ~= 0
or math.random(1, 100) <= 30) then