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
|
||||
|
||||
-- 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
|
||||
end
|
||||
else
|
||||
return false
|
||||
|
||||
-- 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)
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user