forked from mtcontrib/mobs_redo
localised functions, mobs floats on water only, damage_per_sec nodes hurt mobs
This commit is contained in:
parent
ff4dfe4b4d
commit
d6ff282917
72
api.lua
72
api.lua
|
@ -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
|
||||||
|
|
||||||
|
|
8
api.txt
8
api.txt
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user