localised functions, mobs floats on water only, damage_per_sec nodes hurt mobs

master
TenPlus1 2017-05-27 21:29:46 +01:00
parent ff4dfe4b4d
commit d6ff282917
3 changed files with 50 additions and 38 deletions

72
api.lua
View File

@ -74,7 +74,7 @@ local stuck_path_timeout = 10 -- how long will mob follow path before giving up
-- play sound -- play sound
mob_sound = function(self, sound) local mob_sound = function(self, sound)
if sound then if sound then
minetest.sound_play(sound, { minetest.sound_play(sound, {
@ -87,7 +87,7 @@ end
-- attack player/mob -- attack player/mob
do_attack = function(self, player) local do_attack = function(self, player)
if self.state == "attack" then if self.state == "attack" then
return return
@ -103,7 +103,7 @@ end
-- move mob in facing direction -- move mob in facing direction
set_velocity = function(self, v) local set_velocity = function(self, v)
local yaw = (self.object:getyaw() or 0) + self.rotate local yaw = (self.object:getyaw() or 0) + self.rotate
@ -116,7 +116,7 @@ end
-- get overall speed of mob -- get overall speed of mob
get_velocity = function(self) local get_velocity = function(self)
local v = self.object:getvelocity() local v = self.object:getvelocity()
@ -125,7 +125,7 @@ end
-- set yaw -- set yaw
set_yaw = function(self, yaw) local set_yaw = function(self, yaw)
if not yaw or yaw ~= yaw then if not yaw or yaw ~= yaw then
yaw = 0 yaw = 0
@ -138,7 +138,7 @@ end
-- set defined animation -- set defined animation
set_animation = function(self, anim) local set_animation = function(self, anim)
if not self.animation then return end if not self.animation then return end
@ -160,6 +160,12 @@ set_animation = function(self, anim)
end end
-- above function exported for mount.lua
function mobs:set_animation(anim)
set_animation(self, anim)
end
-- this is a faster way to calculate distance -- this is a faster way to calculate distance
local get_distance = function(a, b) local get_distance = function(a, b)
@ -170,7 +176,7 @@ end
-- check line of sight (BrunoMine) -- check line of sight (BrunoMine)
function line_of_sight(self, pos1, pos2, stepsize) local line_of_sight = function(self, pos1, pos2, stepsize)
stepsize = stepsize or 1 stepsize = stepsize or 1
@ -241,7 +247,7 @@ end
-- are we flying in what we are suppose to? (taikedz) -- are we flying in what we are suppose to? (taikedz)
local function flight_check(self, pos_w) local flight_check = function(self, pos_w)
local nod = self.standing_in local nod = self.standing_in
@ -266,7 +272,7 @@ end
-- particle effects -- particle effects
function effect(pos, amount, texture, min_size, max_size, radius, gravity) local effect = function(pos, amount, texture, min_size, max_size, radius, gravity)
radius = radius or 2 radius = radius or 2
min_size = min_size or 0.5 min_size = min_size or 0.5
@ -292,7 +298,7 @@ end
-- update nametag colour -- update nametag colour
function update_tag(self) local update_tag = function(self)
local col = "#00FF00" local col = "#00FF00"
local qua = self.hp_max / 4 local qua = self.hp_max / 4
@ -318,7 +324,7 @@ end
-- drop items -- drop items
function item_drop(self, cooked) local item_drop = function(self, cooked)
local obj, item, num local obj, item, num
local pos = self.object:getpos() local pos = self.object:getpos()
@ -364,12 +370,7 @@ end
-- check if mob is dead or only hurt -- check if mob is dead or only hurt
function check_for_death(self, cause) local check_for_death = function(self, cause)
-- has health actually changed?
-- if self.health == self.old_health then
-- return
-- end
self.old_health = self.health self.old_health = self.health
@ -407,6 +408,8 @@ function check_for_death(self, cause)
mob_sound(self, self.sounds.death) mob_sound(self, self.sounds.death)
local pos = self.object:getpos()
-- execute custom death function -- execute custom death function
if self.on_die then if self.on_die then
@ -444,7 +447,7 @@ end
-- check if within physical map limits (-30911 to 30927) -- check if within physical map limits (-30911 to 30927)
function within_limits(pos, radius) local within_limits = function(pos, radius)
if (pos.x - radius) > -30913 if (pos.x - radius) > -30913
and (pos.x + radius) < 30928 and (pos.x + radius) < 30928
@ -460,7 +463,7 @@ end
-- is mob facing a cliff -- is mob facing a cliff
local function is_at_cliff(self) local is_at_cliff = function(self)
if self.fear_height == 0 then -- 0 for no falling protection! if self.fear_height == 0 then -- 0 for no falling protection!
return false return false
@ -485,7 +488,7 @@ end
-- get node but use fallback for nil or unknown -- get node but use fallback for nil or unknown
local function node_ok(pos, fallback) local node_ok = function(pos, fallback)
fallback = fallback or "default:dirt" fallback = fallback or "default:dirt"
@ -504,7 +507,7 @@ end
-- environmental damage (water, lava, fire, light) -- environmental damage (water, lava, fire, light)
do_env_damage = function(self) local do_env_damage = function(self)
-- feed/tame text timer (so mob 'full' messages dont spam chat) -- feed/tame text timer (so mob 'full' messages dont spam chat)
if self.htimer > 0 then if self.htimer > 0 then
@ -585,13 +588,13 @@ do_env_damage = function(self)
if check_for_death(self, "lava") then return end if check_for_death(self, "lava") then return end
-- damage_per_second node check -- damage_per_second node check
-- elseif minetest.registered_nodes[self.standing_in].damage_per_second ~= 0 then elseif minetest.registered_nodes[self.standing_in].damage_per_second ~= 0 then
-- local dps = minetest.registered_nodes[self.standing_in].damage_per_second local dps = minetest.registered_nodes[self.standing_in].damage_per_second
-- self.health = self.health - dps self.health = self.health - dps
-- effect(pos, 5, "tnt_smoke.png") effect(pos, 5, "tnt_smoke.png")
end end
end end
@ -600,7 +603,7 @@ end
-- jump if facing a solid node (not fences or gates) -- jump if facing a solid node (not fences or gates)
do_jump = function(self) local do_jump = function(self)
if not self.jump if not self.jump
or self.jump_height == 0 or self.jump_height == 0
@ -671,7 +674,7 @@ end
-- blast damage to entities nearby (modified from TNT mod) -- blast damage to entities nearby (modified from TNT mod)
function entity_physics(pos, radius) local entity_physics = function(pos, radius)
radius = radius * 2 radius = radius * 2
@ -698,7 +701,7 @@ end
-- should mob follow what I'm holding ? -- should mob follow what I'm holding ?
function follow_holding(self, clicker) local follow_holding = function(self, clicker)
if mobs.invis[clicker:get_player_name()] then if mobs.invis[clicker:get_player_name()] then
return false return false
@ -728,7 +731,7 @@ end
-- find two animals of same type and breed if nearby and horny -- find two animals of same type and breed if nearby and horny
local function breed(self) local breed = function(self)
-- child takes 240 seconds before growing into adult -- child takes 240 seconds before growing into adult
if self.child == true then if self.child == true then
@ -863,7 +866,7 @@ end
-- find and replace what mob is looking for (grass, wheat etc.) -- find and replace what mob is looking for (grass, wheat etc.)
function replace(self, pos) local replace = function(self, pos)
if not self.replace_rate if not self.replace_rate
or not self.replace_what or not self.replace_what
@ -906,7 +909,7 @@ end
-- check if daytime and also if mob is docile during daylight hours -- check if daytime and also if mob is docile during daylight hours
function day_docile(self) local day_docile = function(self)
if self.docile_by_day == false then if self.docile_by_day == false then
@ -922,7 +925,7 @@ end
-- path finding and smart mob routine by rnd -- path finding and smart mob routine by rnd
function smart_mobs(self, s, p, dist, dtime) local smart_mobs = function(self, s, p, dist, dtime)
local s1 = self.path.lastpos local s1 = self.path.lastpos
@ -1199,7 +1202,7 @@ local npc_attack = function(self)
if obj and obj.type == "monster" then if obj and obj.type == "monster" then
p = obj.object:getpos() local p = obj.object:getpos()
dist = get_distance(p, s) dist = get_distance(p, s)
@ -1900,7 +1903,8 @@ local falling = function(self, pos)
end end
-- in water then float up -- in water then float up
if minetest.registered_nodes[node_ok(pos).name].groups.liquid then -- if minetest.registered_nodes[node_ok(pos).name].groups.liquid then
if minetest.registered_nodes[node_ok(pos).name].groups.water then
if self.floats == 1 then if self.floats == 1 then

View File

@ -309,6 +309,14 @@ This function allows an attached player to fly the mob around using directional
'stand_animation' string containing movement animation e.g. "stand" 'stand_animation' string containing movement animation e.g. "stand"
mobs:set_animation(self, name)
This function sets the current animation for mob, defaulting to "stand" if not found.
'self' mob information
'name' name of animation
Certain variables need to be set before using the above functions: Certain variables need to be set before using the above functions:
'self.v2' toggle switch 'self.v2' toggle switch

View File

@ -241,7 +241,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
if entity.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then if entity.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then
if stand_anim then if stand_anim then
set_animation(entity, stand_anim) mobs:set_animation(entity, stand_anim)
end end
return return
@ -249,7 +249,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime)
-- set moving animation -- set moving animation
if moving_anim then if moving_anim then
set_animation(entity, moving_anim) mobs:set_animation(entity, moving_anim)
end end
-- Stop! -- Stop!
@ -429,9 +429,9 @@ function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim)
-- change animation if stopped -- change animation if stopped
if velo.x == 0 and velo.y == 0 and velo.z == 0 then if velo.x == 0 and velo.y == 0 and velo.z == 0 then
set_animation(entity, stand_anim) mobs:set_animation(entity, stand_anim)
else else
-- moving animation -- moving animation
set_animation(entity, moving_anim) mobs:set_animation(entity, moving_anim)
end end
end end