Updated api to 25-02-16 version and updated some mobs

This commit is contained in:
npx 2016-02-25 16:32:21 +01:00
parent 8241f7a06d
commit 0e280b12f8
7 changed files with 82 additions and 66 deletions

141
api.lua
View File

@ -169,21 +169,35 @@ set_animation = function(self, type)
end
end
-- check line of sight for walkers and swimmers alike
function line_of_sight_water(self, pos1, pos2, stepsize)
--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
end
else
return false
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
return true
end
-- 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
end
--end of NSSM additions
-- particle effects
function effect(pos, amount, texture, max_size)
@ -369,6 +383,25 @@ local function is_at_cliff(self)
return false
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)
do_env_damage = function(self)
@ -399,13 +432,15 @@ do_env_damage = function(self)
effect(pos, 5, "tnt_smoke.png")
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
or self.lava_damage ~= 0 then
pos.y = pos.y + self.collisionbox[2] + 0.1 -- foot level
local nod = node_ok(pos, "air") ; --print ("standing in "..nod.name)
local nodef = minetest.registered_nodes[nod.name]
local nodef = minetest.registered_nodes[self.standing_in]
pos.y = pos.y + 1
@ -421,8 +456,8 @@ do_env_damage = function(self)
-- lava or fire
if self.lava_damage ~= 0
and (nodef.groups.lava
or nod.name == "fire:basic_flame"
or nod.name == "fire:permanent_flame") then
or self.standing_in == "fire:basic_flame"
or self.standing_in == "fire:permanent_flame") then
self.object:set_hp(self.object:get_hp() - self.lava_damage)
@ -542,24 +577,6 @@ function entity_physics(pos, radius)
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 ?
function follow_holding(self, clicker)
@ -1219,21 +1236,13 @@ minetest.register_entity(name, {
-- field of view check goes here
-- 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
min_dist = dist
min_player = player
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
@ -1394,6 +1403,20 @@ minetest.register_entity(name, {
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 math.random(1, 4) == 1 then
@ -1461,22 +1484,6 @@ minetest.register_entity(name, {
local s = self.object:getpos()
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 lp then
@ -1902,7 +1909,8 @@ minetest.register_entity(name, {
local s2 = s
p2.y = p2.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
if self.sounds.attack then
minetest.sound_play(self.sounds.attack, {
@ -2218,7 +2226,8 @@ minetest.register_entity(name, {
local up = 2
-- 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
end
@ -2263,14 +2272,13 @@ minetest.register_entity(name, {
-- attack puncher and call other nssm for help
if self.passive == false
and self.state ~= "flop"
and self.child == false
and hitter:get_player_name() ~= self.owner then
--if self.state ~= "attack" then
-- attack whoever punched mob
self.state = ""
do_attack(self, hitter)
--end
-- alert others to the attack
local obj = nil
@ -2389,6 +2397,7 @@ minetest.register_entity(name, {
self.mesh = mesh
self.collisionbox = colbox
self.visual_size = vis_size
self.standing_in = ""
-- set anything changed above
self.object:set_properties(self)

View File

@ -64,6 +64,7 @@ nssm:register_mob("nssm:icelamander", {
--Big_froster
local pos = self.object:getpos()
local c=3
local v = self.object:getvelocity()
for dx = -c*(math.abs(v.x))-1 , c*(math.abs(v.x))+1 do
for dy=-1,3 do
for dz = -c*(math.abs(v.z))-1 , c*(math.abs(v.z))+1 do

View File

@ -54,6 +54,7 @@ nssm:register_mob("nssm:icesnake", {
--Froster
local c=2
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 dy=-1,0 do
for dz = -c*(math.abs(v.z))-1 , c*(math.abs(v.z))+1 do

View File

@ -63,6 +63,7 @@ nssm:register_mob("nssm:mese_dragon", {
--transform the blocks he touches in mese_blocks
local pos = self.object:getpos()
local c=2
local v = self.object:getvelocity()
for dx = -c*(math.abs(v.x))-2 , c*(math.abs(v.x))+2 do
for dy=-1,10 do
for dz = -c*(math.abs(v.z))-2 , c*(math.abs(v.z))+2 do

View File

@ -47,6 +47,7 @@ nssm:register_mob("nssm:sandworm", {
--Worm
local c=2
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 dy=0,2 do
for dz = -c*(math.abs(v.z))-1 , c*(math.abs(v.z))+1 do

View File

@ -17,6 +17,7 @@ nssm:register_mob("nssm:snow_biter", {
sounds = {
random = "snow_biter",
},
--pathfinding = true,
damage = 5,
jump = true,
drops = {
@ -58,6 +59,7 @@ nssm:register_mob("nssm:snow_biter", {
--Froster
local c=2
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 dy=-1,0 do
for dz = -c*(math.abs(v.z))-1 , c*(math.abs(v.z))+1 do

View File

@ -53,6 +53,7 @@ nssm:register_mob("nssm:stone_eater", {
--Remove stone around
local pos = self.object:getpos()
local c=3
local v = self.object:getvelocity()
for dx = -c*(math.abs(v.x))-1 , c*(math.abs(v.x))+1 do
for dy=0,1 do
for dz = -c*(math.abs(v.z))-1 , c*(math.abs(v.z))+1 do