From e4623dec525de79394e2af4d7ddb6ad976da1b7b Mon Sep 17 00:00:00 2001 From: general Date: Sat, 30 Mar 2024 04:39:17 -0400 Subject: [PATCH] update information readme --- api.lua | 80 ++++++++++++++++++++++++++++++++++--------------------- api.txt | 9 +++++++ readme.MD | 6 ++++- 3 files changed, 64 insertions(+), 31 deletions(-) diff --git a/api.lua b/api.lua index 21b6ac3..1943fff 100644 --- a/api.lua +++ b/api.lua @@ -33,7 +33,7 @@ local use_mc2 = minetest.get_modpath("mcl_core") -- Global mobs = { mod = "redo", - version = "20231022", + version = "20231105", translate = S, intllib = S, invis = minetest.global_exists("invisibility") and invisibility or {}, node_ice = "default:ice", @@ -114,7 +114,8 @@ local pathfinder_enable = settings:get_bool("mob_pathfinder_enable") or true local pathfinding_stuck_timeout = tonumber( settings:get("mob_pathfinding_stuck_timeout")) or 3.0 -- how long will mob follow path before giving up -local pathfinding_stuck_path_timeout = tonumber(settings:get("mob_pathfinding_stuck_path_timeout")) or 5.0 +local pathfinding_stuck_path_timeout = tonumber( + settings:get("mob_pathfinding_stuck_path_timeout")) or 5.0 -- which algorithm to use, Dijkstra(default) or A*_noprefetch or A* -- fix settings not allowing "*" local pathfinding_algorithm = settings:get("mob_pathfinding_algorithm") or "Dijkstra" @@ -228,21 +229,20 @@ local mob_class_meta = {__index = mob_class} -- play sound function mob_class:mob_sound(sound) - if sound then + if not sound then return end - -- higher pitch for a child - local pitch = self.child and 1.5 or 1.0 + -- higher pitch for a child + local pitch = self.child and 1.5 or 1.0 - -- a little random pitch to be different - pitch = pitch + random(-10, 10) * 0.005 + -- a little random pitch to be different + pitch = pitch + random(-10, 10) * 0.005 - minetest.sound_play(sound, { - object = self.object, - gain = 1.0, - max_hear_distance = self.sounds.distance, - pitch = pitch - }, true) - end + minetest.sound_play(sound, { + object = self.object, + gain = 1.0, + max_hear_distance = (self.sounds and self.sounds.distance) or 10, + pitch = pitch + }, true) end @@ -2339,6 +2339,21 @@ function mob_class:dogswitch(dtime) end +-- stop attack +function mob_class:stop_attack() + + self.attack = nil + self.following = nil + self.v_start = false + self.timer = 0 + self.blinktimer = 0 + self.path.way = nil + self:set_velocity(0) + self.state = "stand" + self:set_animation("stand", true) +end + + -- execute current state (stand, walk, run, attacks) function mob_class:do_states(dtime) @@ -2517,19 +2532,28 @@ function mob_class:do_states(dtime) --print(" ** stop attacking **", self.name, self.health, dist, self.view_range) - self.attack = nil - self.following = nil - self.v_start = false - self.timer = 0 - self.blinktimer = 0 - self.path.way = nil - self:set_velocity(0) - self.state = "stand" - self:set_animation("stand", true) + self:stop_attack() return end + -- check enemy is in sight + local in_sight = self:line_of_sight( + {x = s.x, y = s.y + 0.5, z = s.z}, + {x = p.x, y = p.y + 0.5, z = p.z}) + + -- stop attacking when enemy not seen for 11 seconds + if not in_sight then + + self.target_time_lost = (self.target_time_lost or 0) + dtime + + if self.target_time_lost > self.attack_patience then + self:stop_attack() + end + else + self.target_time_lost = 0 + end + if self.attack_type == "explode" then yaw_to_pos(self, p) @@ -2544,7 +2568,7 @@ function mob_class:do_states(dtime) -- start timer when in reach and line of sight if not self.v_start and dist <= self.reach - and self:line_of_sight(s, p, 2) then + and in_sight then self.v_start = true self.timer = 0 @@ -2556,7 +2580,7 @@ function mob_class:do_states(dtime) -- stop timer if out of reach or direct line of sight elseif self.allow_fuse_reset and self.v_start - and (dist > self.reach or not self:line_of_sight(s, p, 2)) then + and (dist > self.reach or not in_sight) then --print("=== explosion timer stopped") @@ -2590,10 +2614,8 @@ function mob_class:do_states(dtime) self.blinktimer = 0 if self.blinkstatus then - self.object:set_texture_mod(self.texture_mods) else - self.object:set_texture_mod(self.texture_mods .. "^[brighten") end @@ -2606,10 +2628,9 @@ function mob_class:do_states(dtime) local pos = self.object:get_pos() - -- dont damage anything if area protected or next to waterpathfinding_max_jump + -- dont damage anything if area protected or next to water if minetest.find_node_near(pos, 1, {"group:water"}) or minetest.is_protected(pos, "") then - node_break_radius = 1 end @@ -4452,7 +4473,6 @@ end -- Register spawn eggs - -- Note: This also introduces the “spawn_egg” group: -- * spawn_egg=1: Spawn egg (generic mob, no metadata) -- * spawn_egg=2: Spawn egg (captured/tamed mob, metadata) diff --git a/api.txt b/api.txt index 8d7c645..53b5f08 100644 --- a/api.txt +++ b/api.txt @@ -387,6 +387,15 @@ for each mob. in it's name. +Internal Functions +------------------ + +Each mob contains a set of functions that can be called for use internally or from +another mod entirely, replace mob_class with the mob entity variable: + +mob_class:stop_attack() -- stops mob attacking + + Adding Mobs in World -------------------- diff --git a/readme.MD b/readme.MD index 803df73..b51f05f 100644 --- a/readme.MD +++ b/readme.MD @@ -4,7 +4,7 @@ MOBS REDO for MINETEST This mod contains the API only for adding your own mobs into the world, so please use the additional modpacks to add animals, monsters, and npcs. -https://forum.minetest.net/viewtopic.php?f=11&t=9917 +https://codeberg.org/minenux/minetest-mod-mobs_redo Information ----------- @@ -12,6 +12,10 @@ Information Built from PilzAdam's original Simple Mobs with additional mobs by KrupnoPavel, Zeg9, ExeterDad and AspireMint. +This mod is special one already compatible with older engines.. with backported +patches to work both in multicraft, minetest, mineclone and finetest, becouse +the tenplus1 only works in last minetest, admins will not wants to constant upgrades! + ## Crafts - **Nametag**. Can be crafted by paper, black dye, and string. Can be used