1
0
mirror of https://github.com/sys4-fr/server-nalc.git synced 2024-11-15 23:10:31 +01:00

update mobs mod

This commit is contained in:
crabman77 2016-02-03 04:22:41 +01:00
parent 9d5b804399
commit 641780dd26
4 changed files with 83 additions and 39 deletions

View File

@ -28,6 +28,7 @@ This mod contains the following additions:
Changelog: Changelog:
1.25- Mobs no longer spawn within 12 blocks of player or despawn within same range, spawners now have player detection, Code tidy and tweak.
1.24- Added feature where certain animals run away when punched (runaway = true in mob definition) 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.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 1.22- Added ability to name tamed animals and npc using nametags, also npc will attack anyone who punches them apart from owner

View File

@ -1,4 +1,4 @@
-- Mobs Api (29th January 2016) -- Mobs Api (2nd February 2016)
mobs = {} mobs = {}
mobs.mod = "redo" mobs.mod = "redo"
@ -35,21 +35,12 @@ end
set_velocity = function(self, v) 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 local yaw = (self.object:getyaw() + self.rotate) or 0
x = math.sin(yaw) * -v
z = math.cos(yaw) * v
end
self.object:setvelocity({ self.object:setvelocity({
x = x, x = math.sin(yaw) * -v,
y = self.object:getvelocity().y, y = self.object:getvelocity().y,
z = z z = math.cos(yaw) * v
}) })
end end
@ -775,6 +766,19 @@ minetest.register_entity(name, {
if self.lifetimer <= 0 then if self.lifetimer <= 0 then
-- only despawn away from player
local objs = minetest.get_objects_inside_radius(pos, 10)
for _,oir in pairs(objs) do
if oir:is_player() then
self.lifetimer = 20
return
end
end
minetest.log("action", minetest.log("action",
"lifetimer expired, removed " .. self.name) "lifetimer expired, removed " .. self.name)
@ -1073,7 +1077,7 @@ minetest.register_entity(name, {
} }
if vec.x ~= 0 if vec.x ~= 0
or vec.z ~= 0 then and vec.z ~= 0 then
yaw = (math.atan(vec.z / vec.x) + pi / 2) - self.rotate yaw = (math.atan(vec.z / vec.x) + pi / 2) - self.rotate
@ -1142,7 +1146,7 @@ minetest.register_entity(name, {
} }
if vec.x ~= 0 if vec.x ~= 0
or vec.z ~= 0 then and vec.z ~= 0 then
yaw = (math.atan(vec.z / vec.x) + pi / 2) - self.rotate yaw = (math.atan(vec.z / vec.x) + pi / 2) - self.rotate
@ -1151,7 +1155,7 @@ minetest.register_entity(name, {
end end
end end
else else
yaw = self.object:getyaw() + ((math.random(0, 360) - 180) / 180 * pi) yaw = (math.random(0, 360) - 180) / 180 * pi
end end
self.object:setyaw(yaw) self.object:setyaw(yaw)
@ -1205,7 +1209,7 @@ minetest.register_entity(name, {
} }
if vec.x ~= 0 if vec.x ~= 0
or vec.z ~= 0 then and vec.z ~= 0 then
yaw = math.atan(vec.z / vec.x) + 3 * pi / 2 - self.rotate yaw = math.atan(vec.z / vec.x) + 3 * pi / 2 - self.rotate
@ -1219,7 +1223,7 @@ minetest.register_entity(name, {
-- otherwise randomly turn -- otherwise randomly turn
elseif math.random(1, 100) <= 30 then elseif math.random(1, 100) <= 30 then
yaw = self.object:getyaw() + ((math.random(0, 360) - 180) / 180 * pi) yaw = (math.random(0, 360) - 180) / 180 * pi
self.object:setyaw(yaw) self.object:setyaw(yaw)
end end
@ -1307,7 +1311,7 @@ minetest.register_entity(name, {
} }
if vec.x ~= 0 if vec.x ~= 0
or vec.z ~= 0 then and vec.z ~= 0 then
yaw = math.atan(vec.z / vec.x) + pi / 2 - self.rotate yaw = math.atan(vec.z / vec.x) + pi / 2 - self.rotate
@ -1456,7 +1460,7 @@ minetest.register_entity(name, {
} }
if vec.x ~= 0 if vec.x ~= 0
or vec.z ~= 0 then and vec.z ~= 0 then
yaw = (math.atan(vec.z / vec.x) + pi / 2) - self.rotate yaw = (math.atan(vec.z / vec.x) + pi / 2) - self.rotate
@ -1538,7 +1542,7 @@ minetest.register_entity(name, {
} }
if vec.x ~= 0 if vec.x ~= 0
or vec.z ~= 0 then and vec.z ~= 0 then
yaw = (math.atan(vec.z / vec.x) + pi / 2) - self.rotate yaw = (math.atan(vec.z / vec.x) + pi / 2) - self.rotate
@ -1573,8 +1577,7 @@ minetest.register_entity(name, {
local obj = minetest.add_entity(p, self.arrow) local obj = minetest.add_entity(p, self.arrow)
local ent = obj:get_luaentity() local ent = obj:get_luaentity()
local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5
local amount = (vec.x ^ 2 + vec.y ^ 2 + vec.z ^ 2) ^ 0.5
local v = ent.velocity local v = ent.velocity
ent.switch = 1 ent.switch = 1
@ -1670,7 +1673,7 @@ minetest.register_entity(name, {
} }
if vec.x ~= 0 if vec.x ~= 0
or vec.z ~= 0 then and vec.z ~= 0 then
local yaw = math.atan(vec.z / vec.x) + 3 * pi / 2 - self.rotate local yaw = math.atan(vec.z / vec.x) + 3 * pi / 2 - self.rotate
@ -1791,8 +1794,8 @@ minetest.register_entity(name, {
self.object:set_hp(self.health) self.object:set_hp(self.health)
self.object:set_armor_groups({fleshy = self.armor}) self.object:set_armor_groups({fleshy = self.armor})
self.old_y = self.object:getpos().y self.old_y = self.object:getpos().y
self.object:setyaw(math.random(1, 360) / 180 * pi) self.object:setyaw((math.random(0, 360) - 180) / 180 * pi)
self.sounds.distance = (self.sounds.distance or 10) self.sounds.distance = self.sounds.distance or 10
self.textures = textures self.textures = textures
self.mesh = mesh self.mesh = mesh
self.collisionbox = colbox self.collisionbox = colbox
@ -1893,6 +1896,16 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light,
-- spawn above node -- spawn above node
pos.y = pos.y + 1 pos.y = pos.y + 1
-- only spawn away from player
local objs = minetest.get_objects_inside_radius(pos, 10)
for _,oir in pairs(objs) do
if oir:is_player() then
return
end
end
-- mobs cannot spawn in protected areas when enabled -- mobs cannot spawn in protected areas when enabled
if spawn_protected == 1 if spawn_protected == 1
and minetest.is_protected(pos, "") and minetest.is_protected(pos, "")

View File

@ -37,7 +37,7 @@ mobs:register_mob("mobs:mese_monster", {
jump_height = 8, jump_height = 8,
fall_damage = 0, fall_damage = 0,
fall_speed = -6, fall_speed = -6,
stepheight = 3, stepheight = 2.1,
-- drops mese when dead -- drops mese when dead
drops = { drops = {
{name = "default:mese_crystal", {name = "default:mese_crystal",

View File

@ -1,6 +1,6 @@
-- mob spawner -- mob spawner
local spawner_default = "mobs:pig 10 15 0" local spawner_default = "mobs:pig 10 15 0 0"
minetest.register_node("mobs:spawner", { minetest.register_node("mobs:spawner", {
tiles = {"mob_spawner.png"}, tiles = {"mob_spawner.png"},
@ -15,13 +15,18 @@ minetest.register_node("mobs:spawner", {
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
-- text entry formspec -- text entry formspec
meta:set_string("formspec", "field[text;mob_name min_light max_light amount;${command}]") meta:set_string("formspec", "field[text;Mob MinLight MaxLight Amount PlayerDist;${command}]")
meta:set_string("infotext", "Spawner Not Active (enter settings)") meta:set_string("infotext", "Spawner Not Active (enter settings)")
meta:set_string("command", spawner_default) meta:set_string("command", spawner_default)
end, end,
on_right_click = function(pos, placer) on_right_click = function(pos, placer)
local meta = minetest.get_meta(pos)
if minetest.is_protected(pos, placer:get_player_name()) then
return
end
-- local meta = minetest.get_meta(pos)
end, end,
on_receive_fields = function(pos, formname, fields, sender) on_receive_fields = function(pos, formname, fields, sender)
@ -39,15 +44,17 @@ minetest.register_node("mobs:spawner", {
return return
end end
local mob = comm[1] local mob = comm[1] -- mob to spawn
local mlig = tonumber(comm[2]) local mlig = tonumber(comm[2]) -- min light
local xlig = tonumber(comm[3]) local xlig = tonumber(comm[3]) -- max light
local num = tonumber(comm[4]) local num = tonumber(comm[4]) -- total mobs in area
local pla = tonumber(comm[5])-- player distance (0 to disable)
if mob and mob ~= "" if mob and mob ~= "" and mobs.spawning_mobs[mob] == true
and num and num >= 0 and num <= 10 and num and num >= 0 and num <= 10
and mlig and mlig >= 0 and mlig <= 15 and mlig and mlig >= 0 and mlig <= 15
and xlig and xlig >= 0 and xlig <= 15 then and xlig and xlig >= 0 and xlig <= 15
and pla and pla >=0 and pla <= 20 then
meta:set_string("command", fields.text) meta:set_string("command", fields.text)
meta:set_string("infotext", "Spawner Active (" .. mob .. ")") meta:set_string("infotext", "Spawner Active (" .. mob .. ")")
@ -79,6 +86,7 @@ minetest.register_abm({
local mlig = tonumber(comm[2]) local mlig = tonumber(comm[2])
local xlig = tonumber(comm[3]) local xlig = tonumber(comm[3])
local num = tonumber(comm[4]) local num = tonumber(comm[4])
local pla = tonumber(comm[5]) or 0
-- if amount is 0 then do nothing -- if amount is 0 then do nothing
if num == 0 then if num == 0 then
@ -88,7 +96,7 @@ minetest.register_abm({
local count = 0 local count = 0
local ent = nil local ent = nil
-- count objects of same type in area -- count mob objects of same type in area
for k, obj in pairs(objs) do for k, obj in pairs(objs) do
ent = obj:get_luaentity() ent = obj:get_luaentity()
@ -103,6 +111,28 @@ minetest.register_abm({
return return
end end
-- spawn mob if player detected and in range
if pla > 0 then
local in_range = 0
local objs = minetest.get_objects_inside_radius(pos, pla)
for _,oir in pairs(objs) do
if oir:is_player() then
in_range = 1
break
end
end
-- player not found
if in_range == 0 then
return
end
end
-- 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, z = pos.z - 5}, {x = pos.x - 5, y = pos.y, z = pos.z - 5},
@ -113,12 +143,12 @@ minetest.register_abm({
if air and #air > 0 then if air and #air > 0 then
local pos2 = air[math.random(#air)] local pos2 = air[math.random(#air)]
local lig = minetest.get_node_light(pos2) local lig = minetest.get_node_light(pos2) or 0
pos2.y = pos2.y + 0.5 pos2.y = pos2.y + 0.5
-- only if light levels are within range -- only if light levels are within range
if lig and lig >= mlig and lig <= xlig then if lig >= mlig and lig <= xlig then
minetest.add_entity(pos2, mob) minetest.add_entity(pos2, mob)
end end
end end