Updated api to 25-02-16 version and updated some mobs
This commit is contained in:
parent
8241f7a06d
commit
0e280b12f8
137
api.lua
137
api.lua
@ -169,21 +169,35 @@ set_animation = function(self, type)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- check line of sight for walkers and swimmers alike
|
||||||
|
function line_of_sight_water(self, pos1, pos2, stepsize)
|
||||||
|
|
||||||
|
local s, pos_w = minetest.line_of_sight(pos1, pos2, stepsize)
|
||||||
|
|
||||||
|
-- normal walking mobs can see you
|
||||||
|
if s == true
|
||||||
|
and not self.fly then
|
||||||
|
|
||||||
--NSSM additions: mobs can see through water
|
|
||||||
function line_of_sight_water(pos1, pos2, stepsize)
|
|
||||||
if not minetest.line_of_sight(pos1, pos2, stepsize) then
|
|
||||||
local s, posw
|
|
||||||
s, posw = minetest.line_of_sight(pos1, pos2, stepsize)
|
|
||||||
local n = minetest.env:get_node(posw).name
|
|
||||||
if n=="default:water_source" or n=="default:water_flowing" then
|
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
else
|
|
||||||
|
-- swimming mobs can see you through water
|
||||||
|
if s == false
|
||||||
|
and self.fly
|
||||||
|
and self.fly_in == "default:water_source" then
|
||||||
|
|
||||||
|
local nod = minetest.get_node(pos_w).name
|
||||||
|
|
||||||
|
if nod == "default:water_source"
|
||||||
|
or nod == "default:water_flowing" then
|
||||||
|
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
return false
|
return false
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
|
||||||
--end of NSSM additions
|
|
||||||
|
|
||||||
-- particle effects
|
-- particle effects
|
||||||
function effect(pos, amount, texture, max_size)
|
function effect(pos, amount, texture, max_size)
|
||||||
@ -369,6 +383,25 @@ local function is_at_cliff(self)
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- get node but use fallback for nil or unknown
|
||||||
|
local function node_ok(pos, fallback)
|
||||||
|
|
||||||
|
fallback = fallback or "default:dirt"
|
||||||
|
|
||||||
|
local node = minetest.get_node_or_nil(pos)
|
||||||
|
|
||||||
|
if not node then
|
||||||
|
return minetest.registered_nodes[fallback]
|
||||||
|
end
|
||||||
|
|
||||||
|
if minetest.registered_nodes[node.name] then
|
||||||
|
return node
|
||||||
|
end
|
||||||
|
|
||||||
|
return minetest.registered_nodes[fallback]
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
-- environmental damage (water, lava, fire, light)
|
-- environmental damage (water, lava, fire, light)
|
||||||
do_env_damage = function(self)
|
do_env_damage = function(self)
|
||||||
|
|
||||||
@ -399,13 +432,15 @@ do_env_damage = function(self)
|
|||||||
effect(pos, 5, "tnt_smoke.png")
|
effect(pos, 5, "tnt_smoke.png")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- what is mob standing in?
|
||||||
|
pos.y = pos.y + self.collisionbox[2] + 0.1 -- foot level
|
||||||
|
self.standing_in = node_ok(pos, "air").name
|
||||||
|
--print ("standing in " .. self.standing_in)
|
||||||
|
|
||||||
if self.water_damage ~= 0
|
if self.water_damage ~= 0
|
||||||
or self.lava_damage ~= 0 then
|
or self.lava_damage ~= 0 then
|
||||||
|
|
||||||
pos.y = pos.y + self.collisionbox[2] + 0.1 -- foot level
|
local nodef = minetest.registered_nodes[self.standing_in]
|
||||||
|
|
||||||
local nod = node_ok(pos, "air") ; --print ("standing in "..nod.name)
|
|
||||||
local nodef = minetest.registered_nodes[nod.name]
|
|
||||||
|
|
||||||
pos.y = pos.y + 1
|
pos.y = pos.y + 1
|
||||||
|
|
||||||
@ -421,8 +456,8 @@ do_env_damage = function(self)
|
|||||||
-- lava or fire
|
-- lava or fire
|
||||||
if self.lava_damage ~= 0
|
if self.lava_damage ~= 0
|
||||||
and (nodef.groups.lava
|
and (nodef.groups.lava
|
||||||
or nod.name == "fire:basic_flame"
|
or self.standing_in == "fire:basic_flame"
|
||||||
or nod.name == "fire:permanent_flame") then
|
or self.standing_in == "fire:permanent_flame") then
|
||||||
|
|
||||||
self.object:set_hp(self.object:get_hp() - self.lava_damage)
|
self.object:set_hp(self.object:get_hp() - self.lava_damage)
|
||||||
|
|
||||||
@ -542,24 +577,6 @@ function entity_physics(pos, radius)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- get node but use fallback for nil or unknown
|
|
||||||
function node_ok(pos, fallback)
|
|
||||||
|
|
||||||
fallback = fallback or "default:dirt"
|
|
||||||
|
|
||||||
local node = minetest.get_node_or_nil(pos)
|
|
||||||
|
|
||||||
if not node then
|
|
||||||
return minetest.registered_nodes[fallback]
|
|
||||||
end
|
|
||||||
|
|
||||||
if minetest.registered_nodes[node.name] then
|
|
||||||
return node
|
|
||||||
end
|
|
||||||
|
|
||||||
return minetest.registered_nodes[fallback]
|
|
||||||
end
|
|
||||||
|
|
||||||
-- should mob follow what I'm holding ?
|
-- should mob follow what I'm holding ?
|
||||||
function follow_holding(self, clicker)
|
function follow_holding(self, clicker)
|
||||||
|
|
||||||
@ -1219,21 +1236,13 @@ minetest.register_entity(name, {
|
|||||||
-- field of view check goes here
|
-- field of view check goes here
|
||||||
|
|
||||||
-- choose closest player to attack
|
-- choose closest player to attack
|
||||||
if minetest.line_of_sight(sp, p, 2) == true
|
--if minetest.line_of_sight(sp, p, 2) == true
|
||||||
|
if line_of_sight_water(self, sp, p, 2) == true
|
||||||
and dist < min_dist then
|
and dist < min_dist then
|
||||||
min_dist = dist
|
min_dist = dist
|
||||||
min_player = player
|
min_player = player
|
||||||
end
|
end
|
||||||
|
|
||||||
--NSSM additions
|
|
||||||
|
|
||||||
if line_of_sight_water(sp,p,2) and dist < min_dist then
|
|
||||||
min_dist = dist
|
|
||||||
min_player = player
|
|
||||||
end
|
|
||||||
|
|
||||||
--end of NSSM additions
|
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1394,6 +1403,20 @@ minetest.register_entity(name, {
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- water swimmers flop when on land
|
||||||
|
if self.fly
|
||||||
|
and self.fly_in == "default:water_source"
|
||||||
|
and self.standing_in ~= self.fly_in then
|
||||||
|
|
||||||
|
self.state = "flop"
|
||||||
|
self.object:setvelocity({x = 0, y = -5, z = 0})
|
||||||
|
|
||||||
|
set_animation(self, "stand")
|
||||||
|
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
if self.state == "stand" then
|
if self.state == "stand" then
|
||||||
|
|
||||||
if math.random(1, 4) == 1 then
|
if math.random(1, 4) == 1 then
|
||||||
@ -1461,22 +1484,6 @@ minetest.register_entity(name, {
|
|||||||
local s = self.object:getpos()
|
local s = self.object:getpos()
|
||||||
local lp = minetest.find_node_near(s, 1, {"group:water"})
|
local lp = minetest.find_node_near(s, 1, {"group:water"})
|
||||||
|
|
||||||
-- water swimmers cannot move out of water
|
|
||||||
if self.fly
|
|
||||||
and self.fly_in == "default:water_source"
|
|
||||||
and not lp then
|
|
||||||
|
|
||||||
--print ("out of water")
|
|
||||||
|
|
||||||
set_velocity(self, 0)
|
|
||||||
|
|
||||||
-- change to undefined state so nothing more happens
|
|
||||||
self.state = "flop"
|
|
||||||
set_animation(self, "stand")
|
|
||||||
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- if water nearby then turn away
|
-- if water nearby then turn away
|
||||||
if lp then
|
if lp then
|
||||||
|
|
||||||
@ -1902,7 +1909,8 @@ minetest.register_entity(name, {
|
|||||||
local s2 = s
|
local s2 = s
|
||||||
p2.y = p2.y + 1.5
|
p2.y = p2.y + 1.5
|
||||||
s2.y = s2.y + 1.5
|
s2.y = s2.y + 1.5
|
||||||
if minetest.line_of_sight(p2, s2) == true then
|
--if minetest.line_of_sight(p2, s2) == true then
|
||||||
|
if line_of_sight_water(self, p2, s2) == true then
|
||||||
-- play attack sound
|
-- play attack sound
|
||||||
if self.sounds.attack then
|
if self.sounds.attack then
|
||||||
minetest.sound_play(self.sounds.attack, {
|
minetest.sound_play(self.sounds.attack, {
|
||||||
@ -2218,7 +2226,8 @@ minetest.register_entity(name, {
|
|||||||
local up = 2
|
local up = 2
|
||||||
|
|
||||||
-- if already in air then dont go up anymore when hit
|
-- if already in air then dont go up anymore when hit
|
||||||
if v.y > 0 then
|
if v.y > 0
|
||||||
|
or self.fly then
|
||||||
up = 0
|
up = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -2263,14 +2272,13 @@ minetest.register_entity(name, {
|
|||||||
|
|
||||||
-- attack puncher and call other nssm for help
|
-- attack puncher and call other nssm for help
|
||||||
if self.passive == false
|
if self.passive == false
|
||||||
|
and self.state ~= "flop"
|
||||||
and self.child == false
|
and self.child == false
|
||||||
and hitter:get_player_name() ~= self.owner then
|
and hitter:get_player_name() ~= self.owner then
|
||||||
|
|
||||||
--if self.state ~= "attack" then
|
|
||||||
-- attack whoever punched mob
|
-- attack whoever punched mob
|
||||||
self.state = ""
|
self.state = ""
|
||||||
do_attack(self, hitter)
|
do_attack(self, hitter)
|
||||||
--end
|
|
||||||
|
|
||||||
-- alert others to the attack
|
-- alert others to the attack
|
||||||
local obj = nil
|
local obj = nil
|
||||||
@ -2389,6 +2397,7 @@ minetest.register_entity(name, {
|
|||||||
self.mesh = mesh
|
self.mesh = mesh
|
||||||
self.collisionbox = colbox
|
self.collisionbox = colbox
|
||||||
self.visual_size = vis_size
|
self.visual_size = vis_size
|
||||||
|
self.standing_in = ""
|
||||||
|
|
||||||
-- set anything changed above
|
-- set anything changed above
|
||||||
self.object:set_properties(self)
|
self.object:set_properties(self)
|
||||||
|
@ -64,6 +64,7 @@ nssm:register_mob("nssm:icelamander", {
|
|||||||
--Big_froster
|
--Big_froster
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:getpos()
|
||||||
local c=3
|
local c=3
|
||||||
|
local v = self.object:getvelocity()
|
||||||
for dx = -c*(math.abs(v.x))-1 , c*(math.abs(v.x))+1 do
|
for dx = -c*(math.abs(v.x))-1 , c*(math.abs(v.x))+1 do
|
||||||
for dy=-1,3 do
|
for dy=-1,3 do
|
||||||
for dz = -c*(math.abs(v.z))-1 , c*(math.abs(v.z))+1 do
|
for dz = -c*(math.abs(v.z))-1 , c*(math.abs(v.z))+1 do
|
||||||
|
@ -54,6 +54,7 @@ nssm:register_mob("nssm:icesnake", {
|
|||||||
--Froster
|
--Froster
|
||||||
local c=2
|
local c=2
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:getpos()
|
||||||
|
local v = self.object:getvelocity()
|
||||||
for dx = -c*(math.abs(v.x))-1 , c*(math.abs(v.x))+1 do
|
for dx = -c*(math.abs(v.x))-1 , c*(math.abs(v.x))+1 do
|
||||||
for dy=-1,0 do
|
for dy=-1,0 do
|
||||||
for dz = -c*(math.abs(v.z))-1 , c*(math.abs(v.z))+1 do
|
for dz = -c*(math.abs(v.z))-1 , c*(math.abs(v.z))+1 do
|
||||||
|
@ -63,6 +63,7 @@ nssm:register_mob("nssm:mese_dragon", {
|
|||||||
--transform the blocks he touches in mese_blocks
|
--transform the blocks he touches in mese_blocks
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:getpos()
|
||||||
local c=2
|
local c=2
|
||||||
|
local v = self.object:getvelocity()
|
||||||
for dx = -c*(math.abs(v.x))-2 , c*(math.abs(v.x))+2 do
|
for dx = -c*(math.abs(v.x))-2 , c*(math.abs(v.x))+2 do
|
||||||
for dy=-1,10 do
|
for dy=-1,10 do
|
||||||
for dz = -c*(math.abs(v.z))-2 , c*(math.abs(v.z))+2 do
|
for dz = -c*(math.abs(v.z))-2 , c*(math.abs(v.z))+2 do
|
||||||
|
@ -47,6 +47,7 @@ nssm:register_mob("nssm:sandworm", {
|
|||||||
--Worm
|
--Worm
|
||||||
local c=2
|
local c=2
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:getpos()
|
||||||
|
local v = self.object:getvelocity()
|
||||||
for dx = -c*(math.abs(v.x))-1 , c*(math.abs(v.x))+1 do
|
for dx = -c*(math.abs(v.x))-1 , c*(math.abs(v.x))+1 do
|
||||||
for dy=0,2 do
|
for dy=0,2 do
|
||||||
for dz = -c*(math.abs(v.z))-1 , c*(math.abs(v.z))+1 do
|
for dz = -c*(math.abs(v.z))-1 , c*(math.abs(v.z))+1 do
|
||||||
|
@ -17,6 +17,7 @@ nssm:register_mob("nssm:snow_biter", {
|
|||||||
sounds = {
|
sounds = {
|
||||||
random = "snow_biter",
|
random = "snow_biter",
|
||||||
},
|
},
|
||||||
|
--pathfinding = true,
|
||||||
damage = 5,
|
damage = 5,
|
||||||
jump = true,
|
jump = true,
|
||||||
drops = {
|
drops = {
|
||||||
@ -58,6 +59,7 @@ nssm:register_mob("nssm:snow_biter", {
|
|||||||
--Froster
|
--Froster
|
||||||
local c=2
|
local c=2
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:getpos()
|
||||||
|
local v = self.object:getvelocity()
|
||||||
for dx = -c*(math.abs(v.x))-1 , c*(math.abs(v.x))+1 do
|
for dx = -c*(math.abs(v.x))-1 , c*(math.abs(v.x))+1 do
|
||||||
for dy=-1,0 do
|
for dy=-1,0 do
|
||||||
for dz = -c*(math.abs(v.z))-1 , c*(math.abs(v.z))+1 do
|
for dz = -c*(math.abs(v.z))-1 , c*(math.abs(v.z))+1 do
|
||||||
|
@ -53,6 +53,7 @@ nssm:register_mob("nssm:stone_eater", {
|
|||||||
--Remove stone around
|
--Remove stone around
|
||||||
local pos = self.object:getpos()
|
local pos = self.object:getpos()
|
||||||
local c=3
|
local c=3
|
||||||
|
local v = self.object:getvelocity()
|
||||||
for dx = -c*(math.abs(v.x))-1 , c*(math.abs(v.x))+1 do
|
for dx = -c*(math.abs(v.x))-1 , c*(math.abs(v.x))+1 do
|
||||||
for dy=0,1 do
|
for dy=0,1 do
|
||||||
for dz = -c*(math.abs(v.z))-1 , c*(math.abs(v.z))+1 do
|
for dz = -c*(math.abs(v.z))-1 , c*(math.abs(v.z))+1 do
|
||||||
|
Loading…
x
Reference in New Issue
Block a user