From 0e280b12f84cc1e3bcd05c79b90c7a45b4de2775 Mon Sep 17 00:00:00 2001 From: npx Date: Thu, 25 Feb 2016 16:32:21 +0100 Subject: [PATCH] Updated api to 25-02-16 version and updated some mobs --- api.lua | 141 +++++++++++++++++++++++++----------------------- icelamander.lua | 1 + icesnake.lua | 1 + mese_dragon.lua | 1 + sandworm.lua | 1 + snow_biter.lua | 2 + stone_eater.lua | 1 + 7 files changed, 82 insertions(+), 66 deletions(-) diff --git a/api.lua b/api.lua index 6d038a4..d0958d6 100644 --- a/api.lua +++ b/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) ---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) diff --git a/icelamander.lua b/icelamander.lua index 76d935d..2734587 100644 --- a/icelamander.lua +++ b/icelamander.lua @@ -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 diff --git a/icesnake.lua b/icesnake.lua index 5955599..33c3ff0 100644 --- a/icesnake.lua +++ b/icesnake.lua @@ -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 diff --git a/mese_dragon.lua b/mese_dragon.lua index cf238c7..f89485a 100644 --- a/mese_dragon.lua +++ b/mese_dragon.lua @@ -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 diff --git a/sandworm.lua b/sandworm.lua index d16bdb4..33548d5 100644 --- a/sandworm.lua +++ b/sandworm.lua @@ -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 diff --git a/snow_biter.lua b/snow_biter.lua index 4e09564..007dcde 100644 --- a/snow_biter.lua +++ b/snow_biter.lua @@ -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 diff --git a/stone_eater.lua b/stone_eater.lua index 4d0b1ef..ce03971 100644 --- a/stone_eater.lua +++ b/stone_eater.lua @@ -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