From d6ff2829178418fda28a2060da378b4e09be88ac Mon Sep 17 00:00:00 2001 From: TenPlus1 Date: Sat, 27 May 2017 21:29:46 +0100 Subject: [PATCH] localised functions, mobs floats on water only, damage_per_sec nodes hurt mobs --- api.lua | 72 +++++++++++++++++++++++++++++-------------------------- api.txt | 8 +++++++ mount.lua | 8 +++---- 3 files changed, 50 insertions(+), 38 deletions(-) diff --git a/api.lua b/api.lua index 7cf6db0..246cf15 100644 --- a/api.lua +++ b/api.lua @@ -74,7 +74,7 @@ local stuck_path_timeout = 10 -- how long will mob follow path before giving up -- play sound -mob_sound = function(self, sound) +local mob_sound = function(self, sound) if sound then minetest.sound_play(sound, { @@ -87,7 +87,7 @@ end -- attack player/mob -do_attack = function(self, player) +local do_attack = function(self, player) if self.state == "attack" then return @@ -103,7 +103,7 @@ end -- 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 @@ -116,7 +116,7 @@ end -- get overall speed of mob -get_velocity = function(self) +local get_velocity = function(self) local v = self.object:getvelocity() @@ -125,7 +125,7 @@ end -- set yaw -set_yaw = function(self, yaw) +local set_yaw = function(self, yaw) if not yaw or yaw ~= yaw then yaw = 0 @@ -138,7 +138,7 @@ end -- set defined animation -set_animation = function(self, anim) +local set_animation = function(self, anim) if not self.animation then return end @@ -160,6 +160,12 @@ set_animation = function(self, anim) 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 local get_distance = function(a, b) @@ -170,7 +176,7 @@ end -- 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 @@ -241,7 +247,7 @@ end -- 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 @@ -266,7 +272,7 @@ end -- 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 min_size = min_size or 0.5 @@ -292,7 +298,7 @@ end -- update nametag colour -function update_tag(self) +local update_tag = function(self) local col = "#00FF00" local qua = self.hp_max / 4 @@ -318,7 +324,7 @@ end -- drop items -function item_drop(self, cooked) +local item_drop = function(self, cooked) local obj, item, num local pos = self.object:getpos() @@ -364,12 +370,7 @@ end -- check if mob is dead or only hurt -function check_for_death(self, cause) - - -- has health actually changed? --- if self.health == self.old_health then --- return --- end +local check_for_death = function(self, cause) self.old_health = self.health @@ -407,6 +408,8 @@ function check_for_death(self, cause) mob_sound(self, self.sounds.death) + local pos = self.object:getpos() + -- execute custom death function if self.on_die then @@ -444,7 +447,7 @@ end -- 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 and (pos.x + radius) < 30928 @@ -460,7 +463,7 @@ end -- 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! return false @@ -485,7 +488,7 @@ end -- 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" @@ -504,7 +507,7 @@ end -- 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) if self.htimer > 0 then @@ -585,13 +588,13 @@ do_env_damage = function(self) if check_for_death(self, "lava") then return end -- 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 @@ -600,7 +603,7 @@ end -- jump if facing a solid node (not fences or gates) -do_jump = function(self) +local do_jump = function(self) if not self.jump or self.jump_height == 0 @@ -671,7 +674,7 @@ end -- blast damage to entities nearby (modified from TNT mod) -function entity_physics(pos, radius) +local entity_physics = function(pos, radius) radius = radius * 2 @@ -698,7 +701,7 @@ end -- 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 return false @@ -728,7 +731,7 @@ end -- 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 if self.child == true then @@ -863,7 +866,7 @@ end -- 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 or not self.replace_what @@ -906,7 +909,7 @@ end -- 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 @@ -922,7 +925,7 @@ end -- 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 @@ -1199,7 +1202,7 @@ local npc_attack = function(self) if obj and obj.type == "monster" then - p = obj.object:getpos() + local p = obj.object:getpos() dist = get_distance(p, s) @@ -1900,7 +1903,8 @@ local falling = function(self, pos) end -- 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 diff --git a/api.txt b/api.txt index 43d0db7..dd56748 100644 --- a/api.txt +++ b/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" +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: 'self.v2' toggle switch diff --git a/mount.lua b/mount.lua index 84874ef..b26f8ac 100644 --- a/mount.lua +++ b/mount.lua @@ -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 stand_anim then - set_animation(entity, stand_anim) + mobs:set_animation(entity, stand_anim) end return @@ -249,7 +249,7 @@ function mobs.drive(entity, moving_anim, stand_anim, can_fly, dtime) -- set moving animation if moving_anim then - set_animation(entity, moving_anim) + mobs:set_animation(entity, moving_anim) end -- Stop! @@ -429,9 +429,9 @@ function mobs.fly(entity, dtime, speed, shoots, arrow, moving_anim, stand_anim) -- change animation if stopped 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 -- moving animation - set_animation(entity, moving_anim) + mobs:set_animation(entity, moving_anim) end end