From 7e240b5bd8071521053c8339447a083cb50ea5eb Mon Sep 17 00:00:00 2001 From: ElCeejo <40281901+ElCeejo@users.noreply.github.com> Date: Fri, 20 Aug 2021 13:08:17 -0700 Subject: [PATCH] Add new mobs, bug fixes, improved behavior --- api/api.lua | 1642 +++++++++++++++++++++++++++-------- api/legacy_convert.lua | 81 ++ craftitems.lua | 359 +++++++- init.lua | 211 ++++- mobs/cat.lua | 329 +++++++ mobs/chicken.lua | 238 +++-- mobs/cow.lua | 235 ++--- mobs/horse.lua | 295 +++++++ mobs/pig.lua | 173 ++-- mobs/sheep.lua | 206 +++-- mobs/turkey.lua | 182 ++-- mobs/wolf.lua | 237 +++++ mod.conf | 5 +- models/animalia_cat.b3d | Bin 0 -> 126257 bytes models/animalia_chicken.b3d | Bin 0 -> 98778 bytes models/animalia_cow.b3d | Bin 0 -> 78972 bytes models/animalia_horse.b3d | Bin 0 -> 254352 bytes models/animalia_lasso.b3d | Bin 0 -> 1406 bytes models/animalia_pig.b3d | Bin 0 -> 46746 bytes models/animalia_sheep.b3d | Bin 0 -> 76227 bytes models/animalia_turkey.b3d | Bin 0 -> 89973 bytes models/animalia_wolf.b3d | Bin 0 -> 68751 bytes settingtypes.txt | 5 + 23 files changed, 3328 insertions(+), 870 deletions(-) create mode 100644 api/legacy_convert.lua create mode 100644 mobs/cat.lua create mode 100644 mobs/horse.lua create mode 100644 mobs/wolf.lua create mode 100644 models/animalia_cat.b3d create mode 100644 models/animalia_chicken.b3d create mode 100644 models/animalia_cow.b3d create mode 100644 models/animalia_horse.b3d create mode 100644 models/animalia_lasso.b3d create mode 100644 models/animalia_pig.b3d create mode 100644 models/animalia_sheep.b3d create mode 100644 models/animalia_turkey.b3d create mode 100644 models/animalia_wolf.b3d create mode 100644 settingtypes.txt diff --git a/api/api.lua b/api/api.lua index de9b443..0558ba8 100644 --- a/api/api.lua +++ b/api/api.lua @@ -3,30 +3,117 @@ ------------- -- Ver 0.1 -- +local hitbox = mob_core.get_hitbox + +local find_string = mob_core.find_val + +---------- +-- Math -- +---------- + local random = math.random +local min = math.min local pi = math.pi local abs = math.abs local ceil = math.ceil +local floor = math.floor +local function diff(a, b) -- Get difference between 2 angles + return math.atan2(math.sin(b - a), math.cos(b - a)) +end +local function round(x) -- Round to nearest multiple of 0.5 + return x + 0.5 - (x + 0.5) % 1 +end +local function clamp(num, min, max) + if num < min then + num = min + elseif num > max then + num = max + end + + return num +end + +local yaw2dir = minetest.yaw_to_dir +local dir2yaw = minetest.dir_to_yaw local vec_dist = vector.distance +local vec_dir = vector.direction -local abr = minetest.get_mapgen_setting('active_block_range') +local function dist_2d(pos1, pos2) + local a = vector.new(pos1.x, 0, pos1.z) + local b = vector.new(pos2.x, 0, pos2.z) + return vec_dist(a, b) +end -local function hitbox(self) return self.object:get_properties().collisionbox end +local function get_average_pos(vectors) + local sum = {x = 0, y = 0, z = 0} + for _, vec in pairs(vectors) do sum = vector.add(sum, vec) end + local avg = vector.divide(sum, #vectors) + avg.x = math.floor(avg.x) + 0.5 + avg.y = math.floor(avg.y) + 0.5 + avg.z = math.floor(avg.z) + 0.5 + return avg +end -local walkable_nodes = {} +local function pos_to_neighbor(self, pos2) + local pos = self.object:get_pos() + local dir = vector.direction(pos, pos2) + local neighbor = self._neighbors[mobkit.dir2neighbor(dir)] + local vec = { + x = neighbor.x, + y = 0, + z = neighbor.z + } + return vector.add(pos, vec) +end -minetest.register_on_mods_loaded(function() - for name in pairs(minetest.registered_nodes) do - if name ~= "air" and name ~= "ignore" then - if minetest.registered_nodes[name].walkable then - table.insert(walkable_nodes,name) +local function get_random_offset(pos, range) + if not pos then return nil end + range = (range * 0.5) or 3 + local pos_x = pos.x + random(-range, range) + local pos_z = pos.z + random(-range, range) + local node = nil + for i = -1, 1 do + i_pos = vector.new(pos_x, pos.y + i, pos_z) + if minetest.registered_nodes[minetest.get_node(vector.new(i_pos.x, i_pos.y - 1, i_pos.z)).name].walkable then + node = i_pos + break + end + end + if not node then return nil end + return node +end + +local is_movable = mob_core.is_moveable + +------------------- +-- API Functions -- +------------------- + +function animalia.is_prey(name1, name2) + if name1 == name2 then return 0 end + local def1 = minetest.registered_entities[name1] + local def2 = minetest.registered_entities[name2] + if find_string(paleotest.mobkit_mobs, name2) + and def1.follow + and def2.drops then + for _, drop in ipairs(def2.drops) do + if drop.name + and find_string(def1.follow, drop.name) + and def1.prey_params["height"] >= get_height(name2) + and def1.prey_params["health"] >= def2.max_hp then + -- Mob is prey + return 2 end end + -- Mob can be attacked + return 1 end -end) + -- Not a mobkit mob + return 0 +end -function better_fauna.particle_spawner(pos, texture, type, min_pos, max_pos) +function animalia.particle_spawner(pos, texture, type, min_pos, max_pos) type = type or "float" min_pos = min_pos or { x = pos.x - 2, @@ -71,157 +158,43 @@ function better_fauna.particle_spawner(pos, texture, type, min_pos, max_pos) end end ---------------------------- --- Mob Control Functions -- ---------------------------- - -local function can_fit(pos, width) - local pos1 = vector.new(pos.x - width, pos.y, pos.z - width) - local pos2 = vector.new(pos.x + width, pos.y, pos.z + width) - for x = pos1.x, pos2.x do - for y = pos1.y, pos2.y do - for z = pos1.z, pos2.z do - local p2 = vector.new(x, y, z) - local node = minetest.get_node(p2) - if minetest.registered_nodes[node.name].walkable then - local p3 = vector.new(p2.x, p2.y + 1, p2.z) - local node2 = minetest.get_node(p3) - if minetest.registered_nodes[node2.name].walkable then - return false - end - end - end +function animalia.can_reach(self, pos2) + if pos2 then + local pos = mobkit.get_stand_pos(self) + local box = hitbox(self) + local path_data = mob_core.find_path(pos, pos2, box[4] - 0.1, self.height, 100) + if path_data and #path_data > 2 then + return true, path_data end end - return true + return false end -local function move_from_wall(pos, width) - local pos1 = vector.new(pos.x - width, pos.y, pos.z - width) - local pos2 = vector.new(pos.x + width, pos.y, pos.z + width) - for x = pos1.x, pos2.x do - for y = pos1.y, pos2.y do - for z = pos1.z, pos2.z do - local p2 = vector.new(x, y, z) - if can_fit(p2, width) then - return p2 - end - end +function animalia.find_collision(self, dir) + local pos = mobkit.get_stand_pos(self) + local pos2 = vector.add(pos, vector.multiply(dir, 16)) + local ray = minetest.raycast(pos, pos2, false, false) + for pointed_thing in ray do + if pointed_thing.type == "node" then + return pointed_thing.under end end - return pos + return nil end -function better_fauna.find_path(pos, tpos, width) - - local endpos = tpos - - if not minetest.registered_nodes[minetest.get_node( - vector.new(endpos.x, endpos.y - 1, endpos.z)) - .name].walkable then - local min = vector.subtract(endpos, 1) - local max = vector.add(endpos, 1) - - local index_table = minetest.find_nodes_in_area_under_air( min, max, better_fauna.walkable_nodes) - for _, i_pos in pairs(index_table) do - if minetest.registered_nodes[minetest.get_node(i_pos) - .name].walkable then - endpos = vector.new(i_pos.x, i_pos.y + 1, i_pos.z) - break - end +function animalia.get_nearby_mate(self, name) + for _, obj in ipairs(self.nearby_objects) do + if mobkit.is_alive(obj) + and not obj:is_player() + and obj:get_luaentity().name == name + and obj:get_luaentity().gender ~= self.gender + and obj:get_luaentity().breeding then + return obj end - end - - local path = minetest.find_path(pos, endpos, 32, 1, 1, "A*_noprefetch") - - if not path - or #path < 2 then return end - - table.remove(path, 1) - table.remove(path, #path) - - for i = #path, 1, -1 do - if not path then return end - if not can_fit(path[i], width + 1) then - local clear = move_from_wall(path[i], width + 1) - if clear and can_fit(clear, width) then - path[i] = clear - end - end - if #path > 3 then - local pos1 = path[i - 2] - local pos2 = path[i] - -- Handle Diagonals - if pos1 - and pos2 - and pos1.x ~= pos2.x - and pos1.z ~= pos2.z then - if minetest.line_of_sight(pos1, pos2) then - local pos3 = vector.divide(vector.add(pos1, pos2), 2) - if can_fit(pos, width) then - table.remove(path, i - 1) - end - end - end - -- Reduce Straight Lines - if pos1 - and pos2 - and pos1.x == pos2.x - and pos1.z ~= pos2.z - and pos1.y == pos2.y then - if minetest.line_of_sight(pos1, pos2) then - local pos3 = vector.divide(vector.add(pos1, pos2), 2) - if can_fit(pos, width) then - table.remove(path, i - 1) - end - end - elseif pos1 - and pos2 - and pos1.x ~= pos2.x - and pos1.z == pos2.z - and pos1.y == pos2.y then - if minetest.line_of_sight(pos1, pos2) then - local pos3 = vector.divide(vector.add(pos1, pos2), 2) - if can_fit(pos, width) then - table.remove(path, i - 1) - end - end - end - end - end - - if #path > 2 then - if vector.distance(pos, path[2]) <= width + 1 then - for i = 3, #path do - path[i - 1] = path[i] - end - end - end - - return path + end end -function better_fauna.path_to_next_waypoint(self, tpos, speed_factor) - speed_factor = speed_factor or 1 - local pos = self.object:get_pos() - local path_data = better_fauna.find_path(pos, tpos, 1) - if not path_data - or #path_data < 2 then - return true - end - local pos2 = path_data[2] - if pos2 then - local yaw = self.object:get_yaw() - local tyaw = minetest.dir_to_yaw(vector.direction(pos, pos2)) - if abs(tyaw - yaw) > 0.1 then - mobkit.lq_turn2pos(self, pos2) - end - mobkit.lq_dumbwalk(self, pos2, speed_factor) - return true - end -end - -function better_fauna.feed_tame(self, clicker, feed_count, tame, breed) +function animalia.feed_tame(self, clicker, feed_count, tame, breed) local item = clicker:get_wielded_item() local pos = self.object:get_pos() local mob_name = mob_core.get_name_proper(self.name) @@ -266,20 +239,20 @@ function better_fauna.feed_tame(self, clicker, feed_count, tame, breed) }) if self.food >= feed_count then self.food = mobkit.remember(self, "food", 0) - if tame and not self.tamed then + if tame + and not self.tamed + and self.follow[1] == item:get_name() then mob_core.set_owner(self, clicker:get_player_name()) minetest.chat_send_player(clicker:get_player_name(), mob_name.." has been tamed!") mobkit.clear_queue_high(self) - paleotest.particle_spawner(pos, "mob_core_green_particle.png", "float", min, max) + animalia.particle_spawner(pos, "mob_core_green_particle.png", "float", minppos, maxppos) end if breed then if self.child then return false end if self.breeding then return false end if self.breeding_cooldown <= 0 then self.breeding = true - local min = vector.subtract(pos, 0.5) - local max = vector.add(pos, 0.5) - better_fauna.particle_spawner(pos, "heart.png", "float", min, max) + animalia.particle_spawner(pos, "heart.png", "float", minppos, maxppos) end end end @@ -287,250 +260,485 @@ function better_fauna.feed_tame(self, clicker, feed_count, tame, breed) return false end ------------------- --- HQ Functions -- ------------------- - -function better_fauna.hq_sporadic_flee(self, prty, player) - local tyaw = 0 - local init = true - local timer = 1 - if not player then return true end - local func = function(self) - if not mobkit.is_alive(player) then return true end - if not mobkit.is_alive(self) then return true end - local pos = mobkit.get_stand_pos(self) - local yaw = self.object:get_yaw() - local tpos = vector.add(pos, vector.multiply(minetest.yaw_to_dir(yaw), 4)) - - if init then - tyaw = minetest.dir_to_yaw(vector.direction(pos, tpos)) - end - if self._anim ~= "run" then - mobkit.animate(self, "run") - end - - if mobkit.is_queue_empty_low(self) then - timer = timer - self.dtime - if timer < 0 then - tyaw = yaw - random(1.6, 3.2) - timer = 1 - end - if abs(tyaw - yaw) > 0.1 then - mobkit.turn2yaw(self, tyaw) - end - mobkit.go_forward_horizontal(self, self.max_speed) - if timer <= 0 then return true end - end - end - mobkit.queue_high(self, func, prty) +local function is_within_reach(self, target) + local dist = vec_dist(mobkit.get_stand_pos(self), mobkit.get_stand_pos(target)) - (hitbox(self)[4] + hitbox(target)[4]) + if dist <= self.reach then + return true + end + return false end -function better_fauna.hq_follow_player(self, prty, player) -- Follow Player - if not player then return end - if not mob_core.follow_holding(self, player) then return end - local func = function(self) - if not mobkit.is_alive(player) then - mobkit.clear_queue_high(self) +local function is_on_ground(object) + if object then + local pos = object:get_pos() + local sub = 1 + if not object:is_player() then + sub = math.abs(hitbox(object)[2]) + 1 + end + pos.y = pos.y - sub + if minetest.registered_nodes[minetest.get_node(pos).name].walkable then return true - end - if mobkit.is_queue_empty_low(self) then - local pos = mobkit.get_stand_pos(self) - local tpos = player:get_pos() - if mob_core.follow_holding(self, player) then - self.status = mobkit.remember(self, "status", "following") - local dist = vec_dist(pos, tpos) - local yaw = self.object:get_yaw() - local tyaw = minetest.dir_to_yaw(vector.direction(pos, tpos)) - if dist > self.view_range then - self.status = mobkit.remember(self, "status", "") - return true - end - better_fauna.path_to_next_waypoint(self, tpos, 0.85) - if vec_dist(pos, tpos) < hitbox(self)[4] + 2 then - mobkit.lq_idle(self, 0.1, "stand") - end - else - self.status = mobkit.remember(self, "status", "") - mobkit.lq_idle(self, 0.1, "stand") - return true - end - end - end - mobkit.queue_high(self, func, prty) -end - -function better_fauna.get_nearby_mate(self, name) - for _,obj in ipairs(self.nearby_objects) do - if mobkit.is_alive(obj) - and not obj:is_player() - and obj:get_luaentity().name == name - and obj:get_luaentity().gender ~= self.gender - and obj:get_luaentity().breeding then - return obj end - end - return -end - -function better_fauna.hq_breed(self, prty) - local mate = better_fauna.get_nearby_mate(self, self.name) - if not mate then return end - local speed_factor = 0.5 - local func = function(self) - if mobkit.is_queue_empty_low(self) then - local pos = mobkit.get_stand_pos(self) - local tpos = mate:get_pos() - local dist = vec_dist(pos, tpos) - math.abs(hitbox(self)[4]) - if dist > 1.5 then - speed_factor = 0.5 - else - speed_factor = 0.1 - end - mob_core.goto_next_waypoint(self, tpos, speed_factor) - if dist < 1.75 then - self.breeding_time = self.breeding_time + 1 - end - if self.breeding_time >= 2 - or mate:get_luaentity().breeding_time >= 2 then - if self.gender == "female" then - mob_core.spawn_child(pos, self.name) - end - self.breeding = false - self.breeding_time = 0 - self.breeding_cooldown = 300 - mobkit.remember(self, "breeding", self.breeding) - mobkit.remember(self, "breeding_time", self.breeding_time) - mobkit.remember(self, "breeding_cooldown", self.breeding_cooldown) - return true - end + pos.y = pos.y - 1 + if minetest.registered_nodes[minetest.get_node(pos).name].walkable then + return true end end - mobkit.queue_high(self, func, prty) + return false end -function better_fauna.hq_fowl_breed(self, prty) - local mate = better_fauna.get_nearby_mate(self, self.name) - if not mate then return end - local speed_factor = 0.5 - local func = function(self) - if mobkit.is_queue_empty_low(self) then - local pos = mobkit.get_stand_pos(self) - local tpos = mate:get_pos() - local dist = vec_dist(pos, tpos) - math.abs(hitbox(self)[4]) - if dist > 1.5 then - speed_factor = 0.5 - else - speed_factor = 0.1 - end - mob_core.goto_next_waypoint(self, tpos, speed_factor) - if dist < 1.75 then - self.breeding_time = self.breeding_time + 1 - end - if self.breeding_time >= 2 - or mate:get_luaentity().breeding_time >= 2 then - if self.gender == "female" then - minetest.add_particlespawner({ - amount = 6, - time = 0.25, - minpos = {x = pos.x - 7/16, y = pos.y - 5/16, z = pos.z - 7/16}, - maxpos = {x = pos.x + 7/16, y = pos.y - 5/16, z = pos.z + 7/16}, - minvel = vector.new(-1, 2, -1), - maxvel = vector.new(1, 5, 1), - minacc = vector.new(0, -9.81, 0), - maxacc = vector.new(0, -9.81, 0), - collisiondetection = true, - texture = "better_fauna_egg_fragment.png", - }) - mob_core.spawn_child(pos, self.name) - end - self.breeding = false - self.breeding_time = 0 - self.breeding_cooldown = 300 - mobkit.remember(self, "breeding", self.breeding) - mobkit.remember(self, "breeding_time", self.breeding_time) - mobkit.remember(self, "breeding_cooldown", self.breeding_cooldown) - return true - end - end - end - mobkit.queue_high(self, func, prty) +local function get_height(name) + local def = minetest.registered_entities[name] + return abs(def.collisionbox[2]) + abs(def.collisionbox[5]) end -function better_fauna.hq_eat(self, prty) - local func = function(self) +------------------ +-- LQ Functions -- +------------------ + +function animalia.lq_follow_path(self, path_data, speed_factor, anim) + speed_factor = speed_factor or 1 + anim = anim or "walk" + local dest = nil + local timer = #path_data -- failsafe + local width = hitbox(self)[4] + local init = false + local func = function(self) local pos = mobkit.get_stand_pos(self) - local under = vector.new(pos.x, pos.y - 1, pos.z) - for _, node in ipairs(self.consumable_nodes) do - if node.name == minetest.get_node(under).name then - minetest.set_node(under, {name = node.replacement}) - local def = minetest.registered_nodes[node.name] - local texture = def.tiles[1] - texture = texture .. "^[resize:8x8" - minetest.add_particlespawner({ - amount = 6, - time = 0.1, - minpos = vector.new( - pos.x - 0.5, - pos.y + 0.1, - pos.z - 0.5 - ), - maxpos = vector.new( - pos.x + 0.5, - pos.y + 0.1, - pos.z + 0.5 - ), - minvel = {x=-1, y=1, z=-1}, - maxvel = {x=1, y=2, z=1}, - minacc = {x=0, y=-5, z=0}, - maxacc = {x=0, y=-9, z=0}, - minexptime = 1, - maxexptime = 1, - minsize = 1, - maxsize = 2, - collisiondetection = true, - vertical = false, - texture = texture, - }) - self.gotten = false - mobkit.remember(self, "gotten", self.gotten) - return true + local yaw = self.object:get_yaw() + local s_fctr = speed_factor + if path_data and #path_data > 1 then + if #path_data >= math.ceil(width) then + dest = path_data[1] else return true end + else + return true + end + + if not self.isonground then + table.remove(path_data, 1) + timer = timer - 1 + s_fctr = 0.25 + end + + timer = timer - self.dtime + if timer < 0 then return true end + + local y = self.object:get_velocity().y + + local tyaw = minetest.dir_to_yaw(vector.direction(pos, dest)) + + mobkit.turn2yaw(self, tyaw, self.turn_rate or 4) + + if vec_dist(pos, path_data[#path_data]) < math.ceil(width) then + if not self.isonground and not self.isinliquid and + mob_core.fall_check(self, pos, self.max_fall or self.jump_height) then + self.object:set_velocity({x = 0, y = y, z = 0}) + end + return true + end + + if vec_dist(pos, path_data[1]) < 2.5 + and diff(yaw, tyaw) < 1.5 then + table.remove(path_data, 1) + timer = timer - 1 + end + + if mob_core.fall_check(self, pos, self.max_fall or self.jump_height) then + self.object:set_velocity({x = 0, y = y, z = 0}) + return true + end + + if self.isonground or self.isinliquid then + local forward_dir = vector.normalize(minetest.yaw_to_dir(yaw)) + forward_dir = vector.multiply(forward_dir, + self.max_speed * s_fctr) + forward_dir.y = y + self.object:set_velocity(forward_dir) + if not init then + mobkit.animate(self, anim) + init = true + end + end + end + mobkit.queue_low(self, func) +end + +function animalia.lq_dumb_follow_path(self, path_data, speed_factor, anim) + speed_factor = speed_factor or 1 + anim = anim or "walk" + local dest = nil + local timer = 3 -- failsafe + local width = hitbox(self)[4] + local stop_thresh = 1 + local init = false + local func = function(self) + local pos = mobkit.get_stand_pos(self) + local yaw = self.object:get_yaw() + if path_data and #path_data > 1 then + dest = path_data[1] + else + return true + end + + if not self.isonground then table.remove(path_data, 1) end + + timer = timer - self.dtime + if timer < 0 then return true end + + local y = self.object:get_velocity().y + + local tyaw = minetest.dir_to_yaw(vector.direction(pos, dest)) + + if #path_data > 2 + and ((dist_2d(pos, path_data[1]) < 1 + or abs(tyaw - yaw) < 3) + or dist_2d(pos, path_data[1]) >= dist_2d(pos, path_data[2])) then + table.remove(path_data, 1) + end + + if abs(yaw - tyaw) > 0.5 then + mobkit.turn2yaw(self, tyaw, 8) + end + + if dist_2d(pos, path_data[#path_data]) < 0.6 then + if not self.isonground and not self.isinliquid and + mob_core.fall_check(self, pos, self.max_fall or self.jump_height) then + self.object:set_velocity({x = 0, y = y, z = 0}) + end + mobkit.animate(self, "stand") + return true + end + + if dist_2d(pos, path_data[#path_data]) < 0.6 then + mobkit.animate(self, "stand") + return true + end + + if mob_core.fall_check(self, pos, self.max_fall or self.jump_height) then + self.object:set_velocity({x = 0, y = y, z = 0}) + return true + end + + if self.isonground or self.isinliquid then + local forward_dir = vector.normalize(minetest.yaw_to_dir(yaw)) + forward_dir = vector.multiply(forward_dir, + self.max_speed * speed_factor) + forward_dir.y = y + self.object:set_velocity(forward_dir) + if not init then + mobkit.animate(self, anim) + init = true + end + end + end + mobkit.queue_low(self, func) +end + +function animalia.lq_idle(self, duration, anim) + anim = anim or 'stand' + local random_yaw = nil + local init = true + local func = function(self) + if init then + mobkit.animate(self, anim) + init = false + end + duration = duration - self.dtime + if random(6) < 2 + and not random_yaw then + random_yaw = self.object:get_yaw() + random(-2, 2) + elseif random_yaw + and abs(self.object:get_yaw() - random_yaw) > 0.1 then + mobkit.turn2yaw(self, random_yaw, 3) + self._tyaw = random_yaw + end + if duration <= 0 then return true end + end + mobkit.queue_low(self, func) +end + +--------------------------- +-- Mob Control Functions -- +--------------------------- + +function animalia.go_to_pos(self, tpos, speed_factor, anim) + speed_factor = speed_factor or 1 + local pos = self.object:get_pos() + local dist = vec_dist(pos, tpos) + if dist < 5 + and minetest.line_of_sight(pos, tpos) then + local _, pos2 = mob_core.get_next_waypoint(self, tpos) + if pos2 then + mob_core.lq_dumbwalk(self, pos2, speed_factor, anim) + return + end + else + local box = hitbox(self) + local path_data = mob_core.find_path(mobkit.get_stand_pos(self), tpos, box[4] - 0.1, self.height, 100) + if path_data then + mob_core.lq_follow_path(self, path_data, speed_factor, anim) + return + end + end + mob_core.lq_dumbwalk(self, tpos, speed_factor, anim) +end + +function animalia.go_to_pos_lite(self, tpos, speed_factor) + speed_factor = speed_factor or 1 + if mobkit.is_queue_empty_low(self) then + local _, pos2 = mob_core.get_next_waypoint(self, tpos) + if pos2 then + mob_core.lq_dumbwalk(self, tpos, speed_factor) + return true + else + local box = hitbox(self) + local path_data = mob_core.find_path(mobkit.get_stand_pos(self), tpos, box[4] - 0.1, self.height, 100) + if path_data and #path_data > 2 then + mob_core.lq_follow_path(self, path_data, speed_factor, anim) + return true + end end end - mobkit.queue_high(self, func, prty) + return false end --------------------------------- -- Entity Definition Functions -- --------------------------------- -function better_fauna.on_step(self, dtime, moveresult) +local function sensors() + local timer = 2 + local pulse = 1 + return function(self) + timer = timer - self.dtime + if timer < 0 then + pulse = pulse + 1 + local range = self.view_range + if pulse > 2 then + pulse = 1 + else + range = self.view_range * 0.5 + end + + local pos = self.object:get_pos() + self.group = {} + self.nearby_objects = minetest.get_objects_inside_radius(pos, range) + for i, obj in ipairs(self.nearby_objects) do + if obj ~= self.object + and obj:get_luaentity() + and obj:get_luaentity().name == self.name then + table.insert(self.group, obj) + elseif obj == self.object then + table.remove(self.nearby_objects, i) + break + end + end + timer = 2 + end + end +end + +function animalia.on_activate(self, staticdata, dtime_s) + mob_core.on_activate(self, staticdata, dtime_s) + self.sensefunc = sensors() + self.order = mobkit.recall(self, "order") or "wander" + self.gotten = mobkit.recall(self, "gotten") or false + self.attention_span = mobkit.recall(self, "attention_span") or 0 + self.breeding = mobkit.recall(self, "breeding") or false + self.breeding_time = mobkit.recall(self, "breeding_time") or 0 + self.breeding_cooldown = mobkit.recall(self, "breeding_cooldown") or 0 + self.lasso_pos = mobkit.recall(self, "lasso_pos") or nil + self.liquid_recovery_cooldown = 0 + self.target_blacklist = {} + if self.lasso_pos then + self.caught_with_lasso = true + if minetest.get_item_group(minetest.get_node(self.lasso_pos).name, "fence") > 0 then + local object = minetest.add_entity(self.lasso_pos, "animalia:lasso_fence_ent") + object:get_luaentity().parent = self.object + end + end + for name in pairs(minetest.registered_entities) do + if self.targets + and self.prey_params then + if animalia.is_prey(self.name, name) == 2 then + table.insert(self.targets, name) + end + end + end +end + +local function lasso_effect(self, pos2) + local pos = mobkit.get_stand_pos(self) + pos.y = pos.y + (self.height * 0.5) + local object = minetest.add_entity(pos2, "animalia:lasso_visual") + local ent = object:get_luaentity() + ent.parent = self.object + ent.anchor_pos = pos2 + return object +end + +local function is_under_solid(pos) + local pos2 = vector.new(pos.x, pos.y + 1, pos.z) + local def = minetest.registered_nodes[minetest.get_node(pos2).name] + return (def.walkable or mobkit.get_node_height(pos2) < 1.5) +end + +local function vec_center(vec) + for _, v in pairs(vec) do + v = floor(v + 0.5) + end + return vec +end + +local function do_step(self, moveresult) + local pos = mobkit.get_stand_pos(self) + local width = hitbox(self)[4] - 0.1 + if not self._step then + for _, data in ipairs(moveresult.collisions) do + if data.type == "node" + and data.node_pos.y + 0.5 > pos.y + and not is_under_solid(data.node_pos) + and not vector.equals(vec_center(pos), vec_center(data.node_pos)) then + local vel_yaw = self.object:get_yaw() + local dir_yaw = minetest.dir_to_yaw(vector.direction(pos, data.node_pos)) + if diff(vel_yaw, dir_yaw) < 1.6 then + self._step = data.node_pos + break + end + end + end + else + local vel = self.object:get_velocity() + self.object:set_velocity(vector.new(vel.x, 4, vel.z)) + if self._step.y < pos.y - 0.5 then + self.object:set_velocity(vector.new(vel.x, 0.5, vel.z)) + self._step = nil + end + end +end + +function animalia.on_step(self, dtime, moveresult) mob_core.on_step(self, dtime, moveresult) + mob_core.vitals(self) if mobkit.timer(self, 1) then if self.breeding_cooldown > 0 then self.breeding_cooldown = self.breeding_cooldown - 1 end mobkit.remember(self, "breeding_cooldown", self.breeding_cooldown) end -end - -function better_fauna.on_activate(self, staticdata, dtime_s) - mob_core.on_activate(self, staticdata, dtime_s) - self.gotten = mobkit.recall(self, "gotten") or false - self.attention_span = mobkit.recall(self, "attention_span") or 0 - self.breeding = mobkit.recall(self, "breeding") or false - self.breeding_time = mobkit.recall(self, "breeding_time") or 0 - self.breeding_cooldown = mobkit.recall(self, "breeding_cooldown") or 0 + if mobkit.timer(self, 4) + and #self.target_blacklist > 0 then + table.remove(self.target_blacklist, 1) + end + if self.caught_with_lasso then + if self.lasso_player + and mobkit.is_alive(self) then + local player = self.lasso_player + local pos = mobkit.get_stand_pos(self) + pos.y = pos.y + (self.height * 0.5) + local ppos = player:get_pos() + ppos.y = ppos.y + 1 + if not self.lasso_visual + or not self.lasso_visual:get_luaentity() then + self.lasso_visual = lasso_effect(self, ppos) + else + self.lasso_visual:get_luaentity().anchor_pos = ppos + end + local dist = vector.distance(pos, ppos) + local dist = vector.distance(pos, ppos) + if dist_2d(pos, ppos) > 6 + or abs(ppos.y - pos.y) > 8 then + local p_target = vector.add(pos, vector.multiply(vector.direction(pos, ppos), dist * 0.8)) + local g = -0.18 + local v = vector.new(0, 0, 0) + v.x = (1.0 + (0.005 * dist)) * (p_target.x - pos.x) / dist + v.y = -((1.0 + (0.03 * dist)) * ((ppos.y - 4) - pos.y) / (dist * (g * dist))) + v.z = (1.0 + (0.005 * dist)) * (p_target.z - pos.z) / dist + self.object:add_velocity(v) + end + if player:get_wielded_item():get_name() ~= "animalia:lasso" + or vector.distance(pos, ppos) > 20 then + self.caught_with_lasso = nil + self.lasso_player = nil + if self.lasso_visual then + self.lasso_visual:remove() + self.lasso_visual = nil + end + end + elseif self.lasso_pos + and mobkit.is_alive(self) then + mobkit.remember(self, "lasso_pos", self.lasso_pos) + local pos = mobkit.get_stand_pos(self) + pos.y = pos.y + (self.height * 0.5) + local ppos = self.lasso_pos + if not self.lasso_visual + or not self.lasso_visual:get_luaentity() then + self.lasso_visual = lasso_effect(self, ppos) + else + self.lasso_visual:get_luaentity().anchor_pos = ppos + end + local dist = vector.distance(pos, ppos) + if dist_2d(pos, ppos) > 6 + or abs(ppos.y - pos.y) > 8 then + local p_target = vector.add(pos, vector.multiply(vector.direction(pos, ppos), dist * 0.8)) + local g = -0.18 + local v = vector.new(0, 0, 0) + v.x = (1.0 + (0.005 * dist)) * (p_target.x - pos.x) / dist + v.y = -((1.0 + (0.03 * dist)) * ((ppos.y - 4) - pos.y) / (dist * (g * dist))) + v.z = (1.0 + (0.005 * dist)) * (p_target.z - pos.z) / dist + self.object:add_velocity(v) + end + local objects = minetest.get_objects_inside_radius(ppos, 1) + local is_lasso_attached = false + for _, object in ipairs(objects) do + if object + and object:get_luaentity() + and object:get_luaentity().name == "animalia:lasso_fence_ent" then + is_lasso_attached = true + end + end + if not is_lasso_attached then + + self.caught_with_lasso = nil + self.lasso_pos = nil + if self.lasso_visual then + self.lasso_visual:remove() + self.lasso_visual = nil + end + end + else + if self.lasso_pos then + local objects = minetest.get_objects_inside_radius(self.lasso_pos, 0.4) + for _, object in ipairs(objects) do + if object + and object:get_luaentity() + and object:get_luaentity().name == "animalia:lasso_fence_ent" then + minetest.add_item(object:get_pos(), "animalia:lasso") + object:remove() + end + end + end + self.caught_with_lasso = nil + self.lasso_pos = nil + if self.lasso_visual then + self.lasso_visual:remove() + self.lasso_visual = nil + end + end + end + if mobkit.is_alive(self) then + do_step(self, moveresult) + end end ------------- -- Physics -- ------------- -function better_fauna.lightweight_physics(self) +function animalia.lightweight_physics(self) local vel = self.object:get_velocity() if self.isonground and not self.isinliquid then self.object:set_velocity({x= vel.x> 0.2 and vel.x*mobkit.friction or 0, @@ -581,3 +789,709 @@ function better_fauna.lightweight_physics(self) self.object:set_acceleration({x=0,y=-2.8,z=0}) end end + +------------------ +-- HQ Functions -- +------------------ + +function animalia.hq_eat(self, prty) + local func = function(self) + local pos = mobkit.get_stand_pos(self) + local under = vector.new(pos.x, pos.y - 1, pos.z) + for _, node in ipairs(self.consumable_nodes) do + if node.name == minetest.get_node(under).name then + minetest.set_node(under, {name = node.replacement}) + local def = minetest.registered_nodes[node.name] + local texture = def.tiles[1] + texture = texture .. "^[resize:8x8" + minetest.add_particlespawner({ + amount = 6, + time = 0.1, + minpos = vector.new( + pos.x - 0.5, + pos.y + 0.1, + pos.z - 0.5 + ), + maxpos = vector.new( + pos.x + 0.5, + pos.y + 0.1, + pos.z + 0.5 + ), + minvel = {x=-1, y=1, z=-1}, + maxvel = {x=1, y=2, z=1}, + minacc = {x=0, y=-5, z=0}, + maxacc = {x=0, y=-9, z=0}, + minexptime = 1, + maxexptime = 1, + minsize = 1, + maxsize = 2, + collisiondetection = true, + vertical = false, + texture = texture, + }) + self.gotten = false + mobkit.remember(self, "gotten", self.gotten) + return true + else + return true + end + end + end + mobkit.queue_high(self, func, prty) +end + +-- Wandering -- + +function animalia.hq_go_to_land(self, prty) + local init = false + local tpos = nil + local func = function(self) + if self.liquid_recovery_cooldown > 0 then + self.liquid_recovery_cooldown = self.liquid_recovery_cooldown - 1 + return true + end + if not init then + for i = 1, 359, 15 do + local yaw = math.rad(i) + local dir = minetest.yaw_to_dir(yaw) + tpos = animalia.find_collision(self, dir) + if tpos then + local node = minetest.get_node({x = tpos.x, y = tpos.y + 1, z = tpos.z}) + if node.name == "air" then + break + else + tpos = nil + end + end + end + init = true + end + if tpos then + local pos = mobkit.get_stand_pos(self) + local yaw = self.object:get_yaw() + local tyaw = minetest.dir_to_yaw(vec_dir(pos, tpos)) + if abs(tyaw - yaw) > 0.1 then + mobkit.turn2yaw(self, tyaw) + else + mobkit.go_forward_horizontal(self, self.max_speed * 0.66) + mobkit.animate(self, "walk") + end + if dist_2d(pos, tpos) < 1 + or (not self.isinliquid + and self.isonground) then + return true + end + else + self.liquid_recovery_cooldown = 5 + return true + end + end + mobkit.queue_high(self, func, prty) +end + +function animalia.hq_wander_ranged(self, prty) + local idle_time = 3 + local move_probability = 3 + local func = function(self) + if mobkit.is_queue_empty_low(self) then + local pos = self.object:get_pos() + local random_goal = vector.new( + pos.x + random(-1, 1), + pos.y, + pos.z + random(-1, 1) + ) + local node = minetest.get_node(random_goal) + if minetest.registered_nodes[node.name].drawtype == "liquid" + or minetest.registered_nodes[node.name].walkable then + random_goal = nil + end + if self.lasso_pos + and vec_dist(pos, self.lasso_pos) > 10 then + random_goal = self.lasso_pos + end + if random(move_probability) < 2 + and random_goal then + local _, pos2 = mobkit.get_next_waypoint(self, random_goal) + if pos2 then + random_goal = pos2 + end + mob_core.lq_dumbwalk(self, random_goal, 0.5) + else + animalia.lq_idle(self, idle_time) + end + end + end + mobkit.queue_high(self, func, prty) +end + +function animalia.hq_wander_group(self, prty, group_range) + local idle_time = 3 + local move_probability = 3 + local group_tick = 0 + local func = function(self) + if mobkit.is_queue_empty_low(self) then + group_tick = group_tick - 1 + local pos = self.object:get_pos() + local group_positions = {} + local random_goal = vector.new( + pos.x + random(-1, 1), + pos.y, + pos.z + random(-1, 1) + ) + if group_tick <= 0 + and self.group + and #self.group > 0 then + for _, obj in ipairs(self.group) do + if obj + and mobkit.is_alive(obj) + and #group_positions < 4 then + table.insert(group_positions, obj:get_pos()) + end + end + if #group_positions > 2 then + group_range = group_range + #group_positions + local center = get_average_pos(group_positions) + if center + and ((vec_dist(random_goal, center) > group_range) + or vec_dist(pos, center) > group_range) then + random_goal = pos_to_neighbor(self, center) + end + end + group_tick = 3 + end + local node = minetest.get_node(random_goal) + if minetest.registered_nodes[node.name].drawtype == "liquid" + or minetest.registered_nodes[node.name].walkable then + random_goal = nil + end + if self.lasso_pos + and vec_dist(pos, self.lasso_pos) > 10 then + random_goal = self.lasso_pos + end + if random(move_probability) < 2 + and random_goal then + local _, pos2 = mobkit.get_next_waypoint(self, random_goal) + if pos2 then + random_goal = pos2 + end + mob_core.lq_dumbwalk(self, random_goal, 0.5) + else + animalia.lq_idle(self, idle_time) + end + end + end + mobkit.queue_high(self, func, prty) +end + +-- Breeding -- + +function animalia.hq_breed(self, prty) + local mate = animalia.get_nearby_mate(self, self.name) + if not mate then return end + local func = function(self) + if not mobkit.is_alive(mate) then + return true + end + local pos = mobkit.get_stand_pos(self) + local tpos = mate:get_pos() + local dist = vec_dist(pos, tpos) - math.abs(hitbox(self)[4]) + local speed_factor = clamp(dist, 0.1, 0.65) + if dist < 1.75 then + self.breeding_time = self.breeding_time + 1 + end + if self.breeding_time >= 2 + or mate:get_luaentity().breeding_time >= 2 then + if self.gender == "female" then + mob_core.spawn_child(pos, self.name) + end + self.breeding = false + self.breeding_time = 0 + self.breeding_cooldown = 300 + mobkit.remember(self, "breeding", self.breeding) + mobkit.remember(self, "breeding_time", self.breeding_time) + mobkit.remember(self, "breeding_cooldown", self.breeding_cooldown) + return true + end + if mobkit.is_queue_empty_low(self) then + animalia.go_to_pos(self, tpos, speed_factor) + end + end + mobkit.queue_high(self, func, prty) +end + +function animalia.hq_fowl_breed(self, prty) + local mate = animalia.get_nearby_mate(self, self.name) + if not mate then return end + local speed_factor = 0.5 + local func = function(self) + if mobkit.is_queue_empty_low(self) then + local pos = mobkit.get_stand_pos(self) + local tpos = mate:get_pos() + local dist = vec_dist(pos, tpos) - math.abs(hitbox(self)[4]) + if dist > 1.5 then + speed_factor = 0.5 + else + speed_factor = 0.1 + end + mob_core.goto_next_waypoint(self, tpos, speed_factor) + if dist < 1.75 then + self.breeding_time = self.breeding_time + 1 + end + if self.breeding_time >= 2 + or mate:get_luaentity().breeding_time >= 2 then + if self.gender == "female" then + minetest.add_particlespawner({ + amount = 6, + time = 0.25, + minpos = {x = pos.x - 7/16, y = pos.y - 5/16, z = pos.z - 7/16}, + maxpos = {x = pos.x + 7/16, y = pos.y - 5/16, z = pos.z + 7/16}, + minvel = vector.new(-1, 2, -1), + maxvel = vector.new(1, 5, 1), + minacc = vector.new(0, -9.81, 0), + maxacc = vector.new(0, -9.81, 0), + collisiondetection = true, + texture = "animalia_egg_fragment.png", + }) + mob_core.spawn_child(pos, self.name) + end + self.breeding = false + self.breeding_time = 0 + self.breeding_cooldown = 300 + mobkit.remember(self, "breeding", self.breeding) + mobkit.remember(self, "breeding_time", self.breeding_time) + mobkit.remember(self, "breeding_cooldown", self.breeding_cooldown) + return true + end + end + end + mobkit.queue_high(self, func, prty) +end + +-- Player Interaction -- + + +function animalia.hq_sporadic_flee(self, prty) + local timer = 12 + local func = function(self) + if mobkit.is_queue_empty_low(self) then + local pos = self.object:get_pos() + local random_goal = vector.new( + pos.x + random(-6, 6), + pos.y, + pos.z + random(-6, 6) + ) + local node = minetest.get_node({x = random_goal.x, y = random_goal.y + 1, z = random_goal.z}) + if minetest.registered_nodes[node.name].drawtype == "liquid" then + random_goal = nil + end + if random_goal then + local anim = "walk" + if self.animation["run"] then + anim = "run" + end + mob_core.lq_dumbwalk(self, random_goal, 1, anim) + else + animalia.lq_idle(self, 0.1) + end + end + timer = timer - self.dtime + if timer <= 0 then + return true + end + end + mobkit.queue_high(self, func, prty) +end + +function animalia.hq_attack(self, prty, target) + local func = function(self) + if not mobkit.is_alive(target) then + return true + end + mob_core.punch_timer(self) + local pos = mobkit.get_stand_pos(self) + local tpos = target:get_pos() + if not is_on_ground(target) then + table.insert(self.target_blacklist, target) + return true + end + local can_punch = is_within_reach(self, target) + if mobkit.is_queue_empty_low(self) then + animalia.go_to_pos(self, tpos, 1, "run") + end + if self.punch_timer <= 0 + and can_punch then + target:punch(self.object, 1.0, { + full_punch_interval = 0.1, + damage_groups = {fleshy = self.damage} + }, nil) + mob_core.knockback(self, target) + mob_core.punch_timer(self, self.punch_cooldown or 1) + return true + end + end + mobkit.queue_high(self, func, prty) +end + +function animalia.hq_follow_player(self, prty, player, force) -- Follow Player + if not player then return end + if not force + and not mob_core.follow_holding(self, player) then return end + local func = function(self) + if not mobkit.is_alive(player) then + return true + end + local pos = mobkit.get_stand_pos(self) + local tpos = player:get_pos() + if mob_core.follow_holding(self, player) + or force then + self.status = mobkit.remember(self, "status", "following") + local dist = vec_dist(pos, tpos) + local yaw = self.object:get_yaw() + local tyaw = minetest.dir_to_yaw(vector.direction(pos, tpos)) + if dist > self.view_range then + self.status = mobkit.remember(self, "status", "") + return true + end + if mobkit.is_queue_empty_low(self) then + if vec_dist(pos, tpos) > hitbox(self)[4] + 2 then + animalia.go_to_pos(self, tpos, 0.6) + else + mobkit.lq_idle(self, 0.1, "stand") + end + end + elseif mobkit.is_queue_empty_low(self) then + self.status = mobkit.remember(self, "status", "") + mobkit.lq_idle(self, 0.1, "stand") + return true + end + end + mobkit.queue_high(self, func, prty) +end + +------------------------------- +-- Mob Specific HQ Functions -- +------------------------------- + +-- Cat -- + +function animalia.hq_find_and_break_glass(self, prty) + local timer = 6 + local moving = false + local pos2 = nil + mobkit.clear_queue_low(self) + local func = function(self) + local pos = mobkit.get_stand_pos(self) + if not pos2 then + local nodes = minetest.find_nodes_in_area( + vector.subtract(pos, 8), + vector.add(pos, 8), + {"vessels:glass_bottle", "vessels:drinking_glass"} + ) + if #nodes > 0 then + pos2 = nodes[1] + end + end + if not pos2 then return true end + timer = timer - self.dtime + if mobkit.is_queue_empty_low(self) then + if dist_2d(pos, pos2) > 0.5 then + animalia.go_to_pos(self, pos2, 0.35) + end + end + if dist_2d(pos, pos2) <= 0.5 then + mobkit.lq_idle(self, 0.7, "smack") + minetest.remove_node(pos2) + minetest.add_item(pos2, "vessels:glass_fragments") + if minetest.get_node(pos2).name == "air" then + return true + end + end + if timer < 0 then return true end + end + mobkit.queue_high(self, func, prty) +end + +function animalia.hq_walk_in_front_of_player(self, prty, player) + if not player then return end + local can_reach = false + local path_data = nil + local timer = 8 + local func = function(self) + if not mobkit.is_alive(player) then + return true + end + local pos = mobkit.get_stand_pos(self) + local tpos = player:get_pos() + local dir = player:get_look_dir() + tpos.x = tpos.x + dir.x + tpos.z = tpos.z + dir.z + self.status = mobkit.remember(self, "status", "following") + local dist = vec_dist(pos, tpos) + local yaw = self.object:get_yaw() + local tyaw = minetest.dir_to_yaw(vector.direction(pos, tpos)) + if dist > self.view_range then + self.status = mobkit.remember(self, "status", "") + return true + end + if mobkit.is_queue_empty_low(self) then + if vec_dist(pos, tpos) > hitbox(self)[4] + 0.5 then + if not can_reach then + can_reach, path_data = animalia.can_reach(self, tpos) + else + animalia.lq_dumb_follow_path(self, path_data, 1, "run") + end + else + can_reach = false + path_data = nil + mobkit.lq_idle(self, 0.1, "stand") + end + else + can_reach = false + path_data = nil + end + timer = timer - self.dtime + if timer < 0 then return true end + end + mobkit.queue_high(self, func, prty) +end + +-- Horse -- + +function animalia.hq_mount_logic(self, prty) + local tvel = 0 + local rearing = false + local jumping = false + local anim = "stand" + local func = function(self) + if not self.driver then return true end + -- if horse is rearing, stop moving + if rearing then + if mobkit.timer(self, 1.5) then + rearing = false + end + return + end + -- Controls + local vel = self.object:get_velocity() + local ctrl = self.driver:get_player_control() + if ctrl.up then + tvel = self.speed + if ctrl.aux1 then + tvel = self.speed * 2 + end + elseif tvel < 0.25 or tvel == 0 then + tvel = 0 + self.object:set_velocity({ + x = 0, + y = vel.y, + z = 0 + }) + anim = "stand" + end + if self.isonground then + if ctrl.jump then + jumping = true + vel.y = self.jump_power + 4.405 + else + jumping = false + end + end + -- Physics and Animation + if not ctrl.up + and self.isonground then + tvel = tvel * 0.75 + elseif not self.isonground then + if self.isinliquid then + tvel = tvel * 0.4 + vel.y = vel.y * 0.4 + elseif jumping then + tvel = tvel * 0.4 + end + end + if tvel > 0 then + if jumping then + anim = "rear_constant" + else + if ctrl.aux1 then + anim = "run" + else + anim = "walk" + end + end + end + if random(1024) < 2 then + tvel = 0 + anim = "rear" + rearing = true + end + mobkit.animate(self, anim) + local tyaw = self.driver:get_look_horizontal() or 0 + self._tyaw = tyaw + self.object:set_yaw(tyaw) + local nvel = vector.multiply(minetest.yaw_to_dir(self.object:get_yaw()), tvel) + self.object:set_velocity({ + x = nvel.x, + y = vel.y, + z = nvel.z + }) + if ctrl.sneak then + mob_core.detach(self.driver, {x = 1, y = 0, z = 1}) + return true + end + end + mobkit.queue_high(self, func, prty) +end + +function animalia.hq_horse_breed(self, prty) + local mate = animalia.get_nearby_mate(self, self.name) + if not mate then return end + local speed_factor = 0.5 + local func = function(self) + if mobkit.is_queue_empty_low(self) then + local pos = mobkit.get_stand_pos(self) + local tpos = mate:get_pos() + local dist = vec_dist(pos, tpos) - math.abs(hitbox(self)[4]) + if dist > 1.5 then + speed_factor = 0.5 + else + speed_factor = 0.1 + end + mob_core.goto_next_waypoint(self, tpos, speed_factor) + if dist < 1.75 then + self.breeding_time = self.breeding_time + 1 + end + if self.breeding_time >= 2 + or mate:get_luaentity().breeding_time >= 2 then + if self.gender == "female" then + local obj = mob_core.spawn_child(pos, self.name) + local ent = obj:get_luaentity() + local tex_no = self.texture_no + if random(2) < 2 then + tex_no = mate:get_luaentity().texture_no + end + mobkit.remember(ent, "texture_no", self.texture_no) + mobkit.remember(ent, "speed", random(mate:get_luaentity().speed, self.speed)) + mobkit.remember(ent, "jump_power", random(mate:get_luaentity().jump_power, self.jump_power)) + mobkit.remember(ent, "max_hp", random(mate:get_luaentity().max_hp, self.max_hp)) + ent.speed = mobkit.recall(ent, "speed") + ent.jump_power = mobkit.recall(ent, "jump_power") + ent.max_hp = mobkit.recall(ent, "max_hp") + ent.object:set_properties({ + texture = ent.textures[ent.texture_no] .. "^" .. mobkit.recall(ent, "pattern") + }) + end + self.breeding = false + self.breeding_time = 0 + self.breeding_cooldown = 300 + mobkit.remember(self, "breeding", self.breeding) + mobkit.remember(self, "breeding_time", self.breeding_time) + mobkit.remember(self, "breeding_cooldown", self.breeding_cooldown) + return true + end + end + end + mobkit.queue_high(self, func, prty) +end + +----------------------- +-- Dynamic Animation -- +----------------------- + +local function clamp_bone_rot(n) -- Fixes issues with bones jittering when yaw clamps + if n < -180 then + n = n + 360 + elseif n > 180 then + n = n - 360 + end + if n < -60 then + n = -60 + elseif n > 60 then + n = 60 + end + return n +end + +local function interp(a, b, w) -- Smoothens bone movement + local pi = math.pi + if math.abs(a - b) > math.deg(pi) then + if a < b then + return ((a + (b - a) * w) + (math.deg(pi) * 2)) + elseif a > b then + return ((a + (b - a) * w) - (math.deg(pi) * 2)) + end + end + return a + (b - a) * w +end + +local function move_head(self, tyaw, pitch) + local data = self.head_data + local _, rot = self.object:get_bone_position(data.bone or "Head.CTRL") + local yaw = self.object:get_yaw() + local look_yaw = clamp_bone_rot(math.deg(yaw - tyaw)) + local look_pitch = 0 + if pitch then + look_pitch = clamp_bone_rot(math.deg(pitch)) + end + if tyaw ~= yaw then + look_yaw = look_yaw * 0.66 + end + local yaw = interp(rot.z, look_yaw, 0.1) + local ptch = interp(rot.x, look_pitch + data.pitch_correction, 0.1) + self.object:set_bone_position(data.bone or "Head.CTRL", data.offset, {x = ptch, y = yaw, z = yaw}) +end + +function animalia.head_tracking(self) + if not self.head_data then return end + local yaw = self.object:get_yaw() + local pos = mobkit.get_stand_pos(self) + local v = vector.add(pos, vector.multiply(yaw2dir(yaw), self.head_data.pivot_h)) + pos.x = v.x + pos.y = pos.y + self.head_data.pivot_v + pos.z = v.z + --[[minetest.add_particle({ + pos = pos, + velocity = {x=0, y=0, z=0}, + acceleration = {x=0, y=0, z=0}, + expirationtime = 0.1, + size = 8, + collisiondetection = false, + vertical = false, + texture = "mob_core_green_particle.png", + playername = "singleplayer" + })]] + if not self.head_tracking then + local objects = minetest.get_objects_inside_radius(pos, 6) + for _, object in ipairs(objects) do + if object:is_player() then + local dir_2_plyr = vector.direction(pos, object:get_pos()) + local yaw_2_plyr = dir2yaw(dir_2_plyr) + if abs(yaw - yaw_2_plyr) < 1 + or abs(yaw - yaw_2_plyr) > 5.3 then + self.head_tracking = object + end + break + end + end + if self._anim == "stand" then + move_head(self, yaw) + else + move_head(self, self._tyaw) + end + else + if not mobkit.exists(self.head_tracking) then + self.head_tracking = nil + return + end + local ppos = self.head_tracking:get_pos() + ppos.y = ppos.y + 1.4 + local dir = vector.direction(pos, ppos) + local tyaw = minetest.dir_to_yaw(dir) + if abs(yaw - tyaw) > 1 + and abs(yaw - tyaw) < 5.3 then + self.head_tracking = nil + dir.y = 0 + return + end + move_head(self, tyaw, dir.y) + end +end \ No newline at end of file diff --git a/api/legacy_convert.lua b/api/legacy_convert.lua new file mode 100644 index 0000000..410bb1b --- /dev/null +++ b/api/legacy_convert.lua @@ -0,0 +1,81 @@ +-------------------------------------- +-- Convert Better Fauna to Animalia -- +-------------------------------------- + +for i = 1, #animalia.mobs do + local new_mob = animalia.mobs[i] + local old_mob = "better_fauna:" .. new_mob:split(":")[2] + minetest.register_entity(":" .. old_mob, { + on_activate = mob_core.on_activate + }) + minetest.register_alias_force("better_fauna:spawn_" .. new_mob:split(":")[2], "animalia:spawn_" .. new_mob:split(":")[2]) +end + +minetest.register_globalstep(function(dtime) + local mobs = minetest.luaentities + for _, mob in pairs(mobs) do + if mob + and mob.name:match("better_fauna:") then + if mob.name:find("lasso_fence_ent") then + local pos = mob.object:get_pos() + if pos then + minetest.add_entity(pos, "animalia:lasso_fence_ent") + end + mob.object:remove() + elseif mob.name:find("lasso_visual") then + if pos then + minetest.add_entity(pos, "animalia:lasso_visual") + end + mob.object:remove() + end + for i = 1, #animalia.mobs do + local ent = animalia.mobs[i] + local new_name = ent:split(":")[2] + local old_name = mob.name:split(":")[2] + if new_name == old_name then + local pos = mob.object:get_pos() + if pos then + local new_mob = minetest.add_entity(pos, ent) + local mem = nil + if mob.memory then + mem = mob.memory + end + minetest.after(0.1, function() + if mem then + new_mob:get_luaentity().memory = mem + new_mob:get_luaentity():on_activate(new_mob, nil, dtime) + end + end) + end + mob.object:remove() + end + end + end + end +end) + + +-- Tools + +minetest.register_alias_force("better_fauna:net", "animalia:net") +minetest.register_alias_force("better_fauna:lasso", "animalia:lasso") +minetest.register_alias_force("better_fauna:cat_toy", "animalia:cat_toy") +minetest.register_alias_force("better_fauna:saddle", "animalia:saddle") +minetest.register_alias_force("better_fauna:shears", "animalia:shears") + +-- Drops + +minetest.register_alias_force("better_fauna:beef_raw", "animalia:beef_raw") +minetest.register_alias_force("better_fauna:beef_cooked", "animalia:beef_cooked") +minetest.register_alias_force("better_fauna:bucket_milk", "animalia:bucket_milk") +minetest.register_alias_force("better_fauna:leather", "animalia:leather") +minetest.register_alias_force("better_fauna:chicken_egg", "animalia:chicken_egg") +minetest.register_alias_force("better_fauna:chicken_raw", "animalia:chicken_raw") +minetest.register_alias_force("better_fauna:chicken_cooked", "animalia:chicken_cooked") +minetest.register_alias_force("better_fauna:feather", "animalia:feather") +minetest.register_alias_force("better_fauna:mutton_raw", "animalia:mutton_raw") +minetest.register_alias_force("better_fauna:mutton_cooked", "animalia:mutton_cooked") +minetest.register_alias_force("better_fauna:porkchop_raw", "animalia:porkchop_raw") +minetest.register_alias_force("better_fauna:porkchop_cooked", "animalia:porkchop_cooked") +minetest.register_alias_force("better_fauna:turkey_raw", "animalia:turkey_raw") +minetest.register_alias_force("better_fauna:turkey_cooked", "animalia:turkey_cooked") \ No newline at end of file diff --git a/craftitems.lua b/craftitems.lua index ed78d24..680b21a 100644 --- a/craftitems.lua +++ b/craftitems.lua @@ -3,67 +3,344 @@ ---------------- ---- Ver 0.1 --- +---------------- +-- Animal Net -- Used to capture and store animals +---------------- -minetest.register_craftitem("better_fauna:net", { +minetest.register_craftitem("animalia:net", { description = "Animal Net", - inventory_image = "better_fauna_net.png", + inventory_image = "animalia_net.png", + stack_max = 1, on_secondary_use = function(itemstack, placer, pointed_thing) - if pointed_thing.type == "object" then - if pointed_thing.ref:is_player() then + if pointed_thing.type == "object" then + if pointed_thing.ref:is_player() then return end + local ent = pointed_thing.ref:get_luaentity() + if not ent.name:match("^animalia:") or not ent.catch_with_net then return end - local ent = pointed_thing.ref:get_luaentity() - if not ent.name:match("^better_fauna:") - or not ent.catch_with_net then - return - end local ent_name = mob_core.get_name_proper(ent.name) + local ent_gender = mob_core.get_name_proper(ent.gender) local meta = itemstack:get_meta() - if not meta:get_string("mob") - or meta:get_string("mob") == "" then + if not meta:get_string("mob") or meta:get_string("mob") == "" then + if placer:get_wielded_item():get_count() > 1 then + if placer:get_inventory():room_for_item("main", {name = "animalia:net"}) then + itemstack:take_item(1) + placer:get_inventory():add_item("main", "animalia:net") + return itemstack + else + return + end + end meta:set_string("mob", ent.name) meta:set_string("staticdata", ent:get_staticdata()) - local desc = "Animal Net \n" .. minetest.colorize("#a9a9a9", ent_name) + local desc = "Animal Net \n" .. minetest.colorize("#a9a9a9", ent_name) .. "\n" .. minetest.colorize("#a9a9a9", ent_gender) + if ent.name == "animalia:cat" + and ent.trust + and ent.trust[placer:get_player_name()] then + desc = desc .. "\n" .. minetest.colorize("#a9a9a9", ent.trust[placer:get_player_name()]) + end meta:set_string("description", desc) placer:set_wielded_item(itemstack) ent.object:remove() return itemstack else - minetest.chat_send_player(placer:get_player_name(), "This Net already contains a "..ent_name) + minetest.chat_send_player(placer:get_player_name(), + "This Net already contains a " .. + mob_core.get_name_proper( + meta:get_string("mob"))) return end end - end, - on_place = function(itemstack, placer, pointed_thing) - local pos = pointed_thing.above - if pos then - local under = minetest.get_node(pointed_thing.under) - local node = minetest.registered_nodes[under.name] - if node and node.on_rightclick then - return node.on_rightclick(pointed_thing.under, under, placer, itemstack) - end - if pos - and not minetest.is_protected(pos, placer:get_player_name()) then - local mob = itemstack:get_meta():get_string("mob") - local staticdata = itemstack:get_meta():get_string("staticdata") - if mob ~= "" then - pos.y = pos.y + math.abs(minetest.registered_entities[mob].collisionbox[2]) - minetest.add_entity(pos, mob, staticdata) - itemstack:get_meta():set_string("mob", nil) - itemstack:get_meta():set_string("staticdata", nil) - itemstack:get_meta():set_string("description", "Animal Net") - end - end - end - return itemstack - end + end, + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + if pos then + local under = minetest.get_node(pointed_thing.under) + local node = minetest.registered_nodes[under.name] + if node and node.on_rightclick then + return node.on_rightclick(pointed_thing.under, under, placer, + itemstack) + end + if pos and not minetest.is_protected(pos, placer:get_player_name()) then + local mob = itemstack:get_meta():get_string("mob") + local staticdata = itemstack:get_meta():get_string("staticdata") + if mob ~= "" then + pos.y = pos.y + + math.abs( + minetest.registered_entities[mob] + .collisionbox[2]) + minetest.add_entity(pos, mob, staticdata) + itemstack:get_meta():set_string("mob", nil) + itemstack:get_meta():set_string("staticdata", nil) + itemstack:get_meta():set_string("description", "Animal Net") + end + end + end + return itemstack + end }) minetest.register_craft({ - output = "better_fauna:net", + output = "animalia:net", + recipe = { + {"farming:string", "", "farming:string"}, + {"farming:string", "", "farming:string"}, + {"group:stick", "farming:string", ""} + } +}) + +----------- +-- Lasso -- Used to pull animals around, and can be attached to fences +----------- + +local function is_lasso_in_use(player) + for _, ent in pairs(minetest.luaentities) do + if ent.name + and ent.name:match("^animalia:") then + if ent.lasso_player + and ent.lasso_player == player then + return true + end + end + end + return false +end + + +minetest.register_entity("animalia:lasso_visual", { + hp_max = 1, + armor_groups = {immortal = 1}, + physical = false, + collisionbox = {0, 0, 0, 0, 0, 0}, + visual = "mesh", + mesh = "animalia_lasso.b3d", + visual_size = {x = 2, y = 2}, + textures = {"animalia_lasso_cube.png"}, + is_visible = true, + makes_footstep_sound = false, + glow = 1, + on_step = function(self, dtime) + self.object:set_armor_groups({immortal = 1}) + if not self.parent + or not self.anchor_pos + or (self.parent + and (not mobkit.is_alive(self.parent) + or not self.parent:get_luaentity().caught_with_lasso)) then + self.object:remove() + return + end + local pos = mobkit.get_stand_pos(self.parent) + pos.y = pos.y + (self.parent:get_luaentity().height * 0.5) + self.object:set_pos(self.anchor_pos) + local rot = vector.dir_to_rotation(vector.direction(self.anchor_pos, pos)) + self.object:set_rotation(rot) + self.object:set_properties({ + visual_size = {x = 6, z = 10 * vector.distance(self.anchor_pos, pos), y = 6} + }) + end +}) + +minetest.register_entity("animalia:lasso_fence_ent", { + hp_max = 1, + physical = false, + collisionbox = {-0.25,-0.25,-0.25, 0.25,0.25,0.25}, + visual = "cube", + visual_size = {x = 0.3, y = 0.3}, + mesh = "model", + textures = { + "animalia_lasso_cube.png", + "animalia_lasso_cube.png", + "animalia_lasso_cube.png", + "animalia_lasso_cube.png", + "animalia_lasso_cube.png", + "animalia_lasso_cube.png", + }, + makes_footstep_sound = false, + on_step = function(self) + if not self.parent + or not self.parent:get_luaentity() + or not self.parent:get_luaentity().lasso_pos then + self.object:remove() + return + end + local pos = self.object:get_pos() + local node = minetest.get_node(pos) + if not minetest.registered_nodes[node.name].walkable + or minetest.get_item_group(node.name, "fence") < 1 then + local ent = self.parent:get_luaentity() + ent.lasso_pos = mobkit.remember(ent, "lasso_pos", nil) + ent.caught_with_lasso = nil + if ent.lasso_visual then + ent.lasso_visual:remove() + ent.lasso_visual = nil + end + minetest.add_item(self.object:get_pos(), "animalia:lasso") + self.object:remove() + return + end + end, + on_rightclick = function(self) + if self.parent then + local ent = self.parent:get_luaentity() + ent.lasso_pos = mobkit.remember(ent, "lasso_pos", nil) + ent.caught_with_lasso = nil + if ent.lasso_visual then + ent.lasso_visual:remove() + ent.lasso_visual = nil + end + end + local dirs = { + vector.new(1, 0, 0), + vector.new(-1, 0, 0), + vector.new(0, 1, 0), + vector.new(0, -1, 0), + vector.new(0, 0, 1), + vector.new(0, 0, -1), + } + for i = 1, 6 do + local pos = vector.add(self.object:get_pos(), dirs[i]) + local name = minetest.get_node(pos).name + if not minetest.registered_nodes[name].walkable then + minetest.add_item(pos, "animalia:lasso") + break + end + end + self.object:remove() + end, + on_punch = function(self) + if self.parent then + local ent = self.parent:get_luaentity() + ent.lasso_pos = mobkit.remember(ent, "lasso_pos", nil) + ent.caught_with_lasso = nil + if ent.lasso_visual then + ent.lasso_visual:remove() + ent.lasso_visual = nil + end + end + local dirs = { + vector.new(1, 0, 0), + vector.new(-1, 0, 0), + vector.new(0, 1, 0), + vector.new(0, -1, 0), + vector.new(0, 0, 1), + vector.new(0, 0, -1), + } + for i = 1, 6 do + local pos = vector.add(self.object:get_pos(), dirs[i]) + local name = minetest.get_node(pos).name + if not minetest.registered_nodes[name].walkable then + minetest.add_item(pos, "animalia:lasso") + break + end + end + self.object:remove() + end +}) + +minetest.register_craftitem("animalia:lasso", { + description = "Lasso", + inventory_image = "animalia_lasso.png", + on_secondary_use = function(itemstack, placer, pointed_thing) + if pointed_thing.type == "object" then + if pointed_thing.ref:is_player() then return end + local ent = pointed_thing.ref:get_luaentity() + if not ent.name:match("^animalia:") or not ent.catch_with_net then + return + end + if not ent.caught_with_lasso + and not is_lasso_in_use(placer) then + ent.caught_with_lasso = true + ent.lasso_player = placer + elseif ent.lasso_player + and ent.lasso_player == placer then + ent.caught_with_lasso = nil + ent.lasso_player = nil + end + end + end, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + local pos = minetest.get_pointed_thing_position(pointed_thing) + if minetest.get_item_group(minetest.get_node(pos).name, "fence") > 0 then + local objects = minetest.get_objects_inside_radius(placer:get_pos(), 21) + for _, obj in ipairs(objects) do + if obj:get_luaentity() + and obj:get_luaentity().lasso_player + and obj:get_luaentity().lasso_player == placer then + obj:get_luaentity().lasso_pos = pos + obj:get_luaentity().lasso_player = nil + local object = minetest.add_entity(pos, "animalia:lasso_fence_ent") + object:get_luaentity().parent = obj + itemstack:take_item(1) + break + end + end + end + end + return itemstack + end +}) + +minetest.register_craft({ + output = "animalia:lasso", + recipe = { + {"", "farming:string", "farming:string"}, + {"", "animalia:leather", "farming:string"}, + {"farming:string", "", ""} + } +}) + +------------- +-- Cat Toy -- Used to quickly increase trust with Cats +------------- + +minetest.register_craftitem("animalia:cat_toy", { + description = "Cat Toy", + inventory_image = "animalia_cat_toy.png", + wield_image = "animalia_cat_toy.png^[transformFYR90", +}) + +minetest.register_craft({ + output = "animalia:cat_toy", + recipe = { + {"", "", "farming:string"}, + {"", "group:stick", "farming:string"}, + {"group:stick", "", "group:feather"} + } +}) + +------------ +-- Saddle -- Can be attached to a tamed Horse to make it ridable +------------ + +minetest.register_craftitem("animalia:saddle", { + description = "Saddle", + inventory_image = "animalia_saddle.png", +}) + +minetest.register_craft({ + output = "animalia:saddle", + recipe = { + {"animalia:leather", "animalia:leather", "animalia:leather"}, + {"animalia:leather", "default:steel_ingot", "animalia:leather"}, + {"farming:string", "", "farming:string"} + } +}) + +------------ +-- Shears -- Used to shear Sheep +------------ + +minetest.register_tool("animalia:shears", { + description = "Shears", + inventory_image = "animalia_shears.png", + groups = {flammable = 2} +}) + +minetest.register_craft({ + output = "animalia:shears", recipe = { - {"farming:string", "", "farming:string"}, - {"farming:string", "", "farming:string"}, - {"group:stick", "farming:string", ""} + {"", "default:steel_ingot", ""}, + {"", "animalia:leather", "default:steel_ingot"} } }) \ No newline at end of file diff --git a/init.lua b/init.lua index 7980a4c..a6e9449 100644 --- a/init.lua +++ b/init.lua @@ -1,32 +1,229 @@ -better_fauna = {} +animalia = {} +better_fauna = animalia -better_fauna.walkable_nodes = {} +animalia.mobkit_mobs = {} +animalia.walkable_nodes = {} +animalia.spawn_interval = 60 +animalia.mobs = {} minetest.register_on_mods_loaded(function() + for name in pairs(minetest.registered_entities) do + local mob = minetest.registered_entities[name] + if mob.logic or mob.brainfunc then + table.insert(animalia.mobkit_mobs, name) + end + end for name in pairs(minetest.registered_nodes) do if name ~= "air" and name ~= "ignore" then if minetest.registered_nodes[name].walkable then - table.insert(better_fauna.walkable_nodes, name) + table.insert(animalia.walkable_nodes, name) end end end end) -better_fauna.frame_blend = 0 +animalia.grassland_biomes = {} + +animalia.temperate_biomes = {} + +animalia.boreal_biomes = {} + +animalia.tropical_biomes = {} + +minetest.register_on_mods_loaded(function() + for name in pairs(minetest.registered_biomes) do + local biome = minetest.registered_biomes[name] + if name:find("forest") then + local turf = biome.node_top + local heat = biome.heat_point or 0 + local humidity = biome.humidity_point or 50 + if turf then + if turf:find("dirt") then + if heat >= 40 + and humidity >= 60 then + table.insert(animalia.tropical_biomes, name) + else + table.insert(animalia.boreal_biomes, name) + end + elseif turf:find("grass") then + if heat >= 40 then + table.insert(animalia.boreal_biomes, name) + else + table.insert(animalia.temperate_biomes, name) + end + elseif turf:find("litter") then + if heat >= 40 + and humidity >= 60 then + table.insert(animalia.tropical_biomes, name) + else + table.insert(animalia.temperate_biomes, name) + end + elseif turf:find("snow") then + table.insert(animalia.temperate_biomes, name) + end + end + else + local turf = biome.node_top + local heat = biome.heat_point or 0 + --local humidity = biome.humidity_point or 50 + if turf then + if turf:find("grass") + or (turf:find("dirt") + and heat < 60) then + table.insert(animalia.grassland_biomes, name) + end + end + end + end +end) + +animalia.frame_blend = 0 if minetest.has_feature("object_step_has_moveresult") then - better_fauna.frame_blend = 0.3 + animalia.frame_blend = 0.3 end -local path = minetest.get_modpath("better_fauna") +function animalia.register_mob(name, def) + minetest.register_entity("animalia:".. name, { + physical = true, + collide_with_objects = true, + visual = "mesh", + makes_footstep_sound = true, + static_save = true, + timeout = 0, + -- Stats + max_hp = def.health or 20, + armor_groups = {fleshy = def.fleshy}, + view_range = def.view_range or 32, + lung_capacity = def.lung_capacity or 10, + -- Visual + collisionbox = def.collisionbox, + visual_size = def.visual_size, + mesh = def.mesh, + textures = def.textures or nil, + scale_stage1 = def.scale_stage1 or 0.75, + scale_stage2 = def.scale_stage2 or 0.85, + scale_stage3 = def.scale_stage3 or 0.95, + female_textures = def.female_textures or nil, + male_textures = def.male_textures or nil, + child_textures = def.child_textures or nil, + animation = def.animations, + -- Physics + ignore_liquidflag = false, + push_on_collide = true, + buoyancy = def.buoyancy or 0.25, + max_speed = def.speed, + jump_height = def.jump_height or 1.1, + stepheight = def.stepheight or 0, + max_fall = def.max_fall or 2, + -- Attributes + sounds = def.sounds, + obstacle_avoidance_range = def.obstacle_avoidance_range or nil, + surface_avoidance_range = def.surface_avoidance_range or nil, + floor_avoidance_range = def.floor_avoidance_range or nil, + fall_damage = def.fall_damage or true, + igniter_damage = def.igniter_damage or 2, + reach = def.reach or 2, + damage = def.damage or 2, + knockback = def.knockback or 4, + punch_cooldown = def.punch_cooldown or 1, + core_growth = def.growth or true, + catch_with_net = def.catch_with_net or true, + driver_scale = def.driver_scale or nil, + player_rotation = def.player_rotation or nil, + driver_attach_at = def.driver_attach_at or nil, + driver_attach_bone = def.driver_attach_bone or nil, + driver_eye_offset = def.driver_eye_offset or nil, + -- Behavior + defend_owner = def.defend_owner, + follow = def.follow, + consumable_nodes = def.consumable_nodes or nil, + drops = def.drops, + -- Functions + head_data = def.head_data or nil, + register_targets = def.register_targets or nil, + physics = def.physics or nil, + logic = def.logic, + get_staticdata = mobkit.statfunc, + on_step = def.on_step, + on_activate = def.on_activate, + on_rightclick = def.on_rightclick, + on_punch = def.on_punch, + }) + table.insert(animalia.mobs, "animalia:" .. name) +end + +local path = minetest.get_modpath("animalia") dofile(path.."/api/api.lua") dofile(path.."/craftitems.lua") +dofile(path.."/mobs/cat.lua") dofile(path.."/mobs/chicken.lua") dofile(path.."/mobs/cow.lua") +dofile(path.."/mobs/horse.lua") dofile(path.."/mobs/pig.lua") dofile(path.."/mobs/sheep.lua") dofile(path.."/mobs/turkey.lua") +dofile(path.."/mobs/wolf.lua") +dofile(path.."/api/legacy_convert.lua") + +animalia.chunks_since_last_spawn = 0 + +local chunk_spawn_add_int = tonumber(minetest.settings:get("chunk_spawn_add_int")) or 32 + +animalia.spawn_queue = {} + +minetest.register_on_generated(function(minp, maxp) + animalia.chunks_since_last_spawn = animalia.chunks_since_last_spawn + 1 + local heightmap = minetest.get_mapgen_object("heightmap") + if not heightmap then return end + local pos = { + x = minp.x + math.floor((maxp.x - minp.x) / 2), + y = minp.y, + z = minp.z + math.floor((maxp.z - minp.z) / 2) + } + local hm_i = (pos.x - minp.x + 1) + (((pos.z - minp.z)) * 80) + pos.y = heightmap[hm_i] + if animalia.chunks_since_last_spawn > chunk_spawn_add_int + and pos.y > 0 then + local heightmap = minetest.get_mapgen_object("heightmap") + if not heightmap then return end + local center = { + x = math.floor(minp.x + ((maxp.x - minp.x) * 0.5) + 0.5), + y = minp.y, + z = math.floor(minp.z + ((maxp.z - minp.z) * 0.5) + 0.5), + } + local light = minetest.get_natural_light(center) + while center.y < maxp.y + and light < 10 do + center.y = center.y + 1 + light = minetest.get_natural_light(center) + end + table.insert(animalia.spawn_queue, {pos = center, mob = animalia.mobs[math.random(#animalia.mobs)]}) + animalia.chunks_since_last_spawn = 0 + end +end) + +local chunk_spawn_queue_int = tonumber(minetest.settings:get("chunk_spawn_queue_int")) or 10 + +local function spawn_queued() + local queue = animalia.spawn_queue + if #queue > 0 then + for i = #queue, 1, -1 do + local def = mob_core.registered_spawns[queue[i].mob].def + mob_core.spawn_at_pos( + queue[i].pos, + def.name, + def.nodes or nil, + def.group or 1, + def.optional or nil + ) + table.remove(animalia.spawn_queue, i) + end + end + minetest.after(chunk_spawn_queue_int, spawn_queued) +end +minetest.after(chunk_spawn_queue_int, spawn_queued) -minetest.log("action", "[MOD] Better Fauna [0.1] loaded") +minetest.log("action", "[MOD] Animalia [0.2] loaded") diff --git a/mobs/cat.lua b/mobs/cat.lua new file mode 100644 index 0000000..bff0d5f --- /dev/null +++ b/mobs/cat.lua @@ -0,0 +1,329 @@ +--------- +-- Cat -- +--------- + +local clamp_bone_rot = animalia.clamp_bone_rot + +local interp = animalia.interp + +local follow = { + "animalia:poultry_raw" +} + +if minetest.registered_items["ethereal:fish_raw"] then + follow = { + "ethereal:fish_raw", + "animalia:poultry_raw" + } +end + +local function cat_logic(self) + + if self.hp <= 0 then + mob_core.on_die(self) + return + end + + if self._anim == "run" then + local pos = self.object:get_pos() + minetest.add_particlespawner({ + amount = 1, + time = 0.25, + minpos = pos, + maxpos = pos, + minvel = vector.new(-1, 1, -1), + maxvel = vector.new(1, 2, 1), + minacc = vector.new(0, -9.81, 0), + maxacc = vector.new(0, -9.81, 0), + minsize = 0.25, + maxsize = 0.5, + collisiondetection = true, + texture = "default_dirt.png", + }) + end + + animalia.head_tracking(self, 0.25, 0.25) + + if mobkit.timer(self, 1) then + + local prty = mobkit.get_queue_priority(self) + local player = mobkit.get_nearby_player(self) + local trust = 0 + + mob_core.random_sound(self, 30) + mob_core.growth(self) + + if player then + if not self.trust[player:get_player_name()] then + self.trust[player:get_player_name()] = 0 + mobkit.remember(self, "trust", self.trust) + else + trust = self.trust[player:get_player_name()] + end + end + + if self.trust_cooldown > 0 then + self.trust_cooldown = mobkit.remember(self, "trust_cooldown", self.trust_cooldown - 1) + end + + if self.interact_sound_cooldown > 0 then + self.interact_sound_cooldown = self.interact_sound_cooldown - 1 + end + + if self.owner + and self.trust[self.owner] > 7 then + if prty < 22 + and self.order == "sit" then + if not mobkit.is_queue_empty_high(self) then + mobkit.clear_queue_high(self) + end + mobkit.animate(self, "sit") + return + end + + if prty < 21 + and self.owner_target then + if not mob_core.shared_owner(self, self.owner_target) then + animalia.hq_attack(self, 21, self.owner_target) + end + end + + if prty < 20 + and self.order == "follow" + and minetest.get_player_by_name(self.owner) then + local owner = minetest.get_player_by_name(self.owner) + animalia.hq_follow_player(self, 20, owner, true) + end + + if prty < 4 + and self.breeding then + animalia.hq_breed(self, 3) + end + end + + if prty < 5 + and self.isinliquid then + animalia.hq_go_to_land(self, 5) + end + + if prty < 3 + and player then + if player:get_velocity() + and vector.length(player:get_velocity()) < 2 then + if mob_core.follow_holding(self, player) + and trust >= 4 then + animalia.hq_follow_player(self, 3, player) + end + elseif player:get_wielded_item():get_name() == "animalia:cat_toy" then + animalia.hq_follow_player(self, 3, player, true) + return + end + end + + if player + and prty == 3 + and not mob_core.follow_holding(self, player) + and player:get_wielded_item():get_name() ~= "animalia:cat_toy" then + mobkit.clear_queue_high(self) + end + + if prty < 2 + and player + and trust > 4 then + local r = math.random(48) + if r < 2 then + animalia.hq_walk_in_front_of_player(self, 2, player) + elseif r < 3 then + animalia.hq_find_and_break_glass(self, 2) + end + end + + if mobkit.is_queue_empty_high(self) then + animalia.hq_wander_ranged(self, 0) + end + end +end + +animalia.register_mob("cat", { + -- Stats + health = 10, + fleshy = 100, + view_range = 32, + lung_capacity = 10, + -- Visual + collisionbox = {-0.2, 0, -0.2, 0.2, 0.4, 0.2}, + visual_size = {x = 6, y = 6}, + scale_stage1 = 0.5, + scale_stage2 = 0.65, + scale_stage3 = 0.80, + mesh = "animalia_cat.b3d", + textures = { + "animalia_cat_1.png", + "animalia_cat_2.png", + "animalia_cat_3.png", + "animalia_cat_4.png" + }, + animations = { + stand = {range = {x = 1, y = 39}, speed = 10, frame_blend = 0.3, loop = true}, + walk = {range = {x = 50, y = 90}, speed = 45, frame_blend = 0.3, loop = true}, + run = {range = {x = 100, y = 130}, speed = 50, frame_blend = 0.3, loop = true}, + sit = {range = {x = 140, y = 180}, speed = 10, frame_blend = 0.3, loop = true}, + smack = {range = {x = 190, y = 210}, speed = 40, frame_blend = 0.1, loop = true}, + }, + -- Physics + speed = 8, + max_fall = 4, + -- Attributes + sounds = { + alter_child_pitch = true, + random = { + name = "animalia_cat_idle", + gain = 0.25, + distance = 8 + }, + purr = { + name = "animalia_cat_purr", + gain = 0.6, + distance = 8 + }, + hurt = { + name = "animalia_cat_hurt", + gain = 0.25, + distance = 8 + }, + death = { + name = "animalia_cat_hurt", + gain = 0.25, + distance = 8 + } + }, + reach = 2, + damage = 3, + knockback = 2, + punch_cooldown = 1, + -- Behavior + defend_owner = true, + follow = follow, + -- Functions + head_data = { + offset = {x = 0, y = 0.17, z = 0}, + pitch_correction = -20, + pivot_h = 0.35, + pivot_v = 0.2 + }, + logic = cat_logic, + get_staticdata = mobkit.statfunc, + on_step = animalia.on_step, + on_activate = function(self, staticdata, dtime_s) + animalia.on_activate(self, staticdata, dtime_s) + self.trust = mobkit.recall(self, "trust") or {} + self.trust_cooldown = mobkit.recall(self, "trust_cooldown") or 0 + self.interact_sound_cooldown = 0 + end, + on_rightclick = function(self, clicker) + local item = clicker:get_wielded_item():get_name() + if item == "animalia:net" then return end + if not self.trust[clicker:get_player_name()] then + self.trust[clicker:get_player_name()] = 0 + mobkit.remember(self, "trust", self.trust) + end + local trust = self.trust[clicker:get_player_name()] + local pos = self.object:get_pos() + local prt_pos = vector.new(pos.x, pos.y + 0.5, pos.z) + local minppos = vector.add(prt_pos, 1) + local maxppos = vector.subtract(prt_pos, 1) + if animalia.feed_tame(self, clicker, math.random(3, 5), trust >= 10, trust >= 10) then + if self.trust_cooldown <= 0 + and trust < 10 then + self.trust[clicker:get_player_name()] = trust + 1 + self.trust_cooldown = mobkit.remember(self, "trust_cooldown", 60) + mobkit.remember(self, "trust", self.trust) + animalia.particle_spawner(prt_pos, "mob_core_green_particle.png", "float", minppos, maxppos) + end + return + end + mob_core.protect(self, clicker, true) + mob_core.nametag(self, clicker, true) + if mobkit.get_queue_priority(self) == 3 + and clicker:get_wielded_item():get_name() == "animalia:cat_toy" then + if trust < 10 then + self.trust[clicker:get_player_name()] = trust + 1 + mobkit.remember(self, "trust", self.trust) + animalia.particle_spawner(prt_pos, "mob_core_green_particle.png", "float", minppos, maxppos) + if self.interact_sound_cooldown <= 0 then + self.sounds["purr"].gain = 1 + self.interact_sound_cooldown = 3 + mobkit.make_sound(self, "purr") + end + end + end + + if not self.owner + or clicker:get_player_name() ~= self.owner then + return + end + if clicker:get_player_control().sneak then + if self.interact_sound_cooldown <= 0 then + self.sounds["purr"].gain = 0.15 * self.trust[self.owner] + self.interact_sound_cooldown = 3 + mobkit.make_sound(self, "purr") + end + end + if trust <= 7 then + if self.interact_sound_cooldown <= 0 then + self.interact_sound_cooldown = 3 + mobkit.make_sound(self, "random") + end + return + end + if self.order == "wander" then + self.order = "follow" + elseif self.order == "follow" then + self.order = "sit" + else + self.order = "wander" + end + mobkit.remember(self, "order", self.order) + end, + on_punch = function(self, puncher, _, tool_capabilities, dir) + mob_core.on_punch_basic(self, puncher, tool_capabilities, dir) + animalia.hq_sporadic_flee(self, 10) + if not self.trust[puncher:get_player_name()] then + self.trust[puncher:get_player_name()] = 0 + else + local trust = self.trust[puncher:get_player_name()] + self.trust[puncher:get_player_name()] = trust - 1 + end + local pos = self.object:get_pos() + local prt_pos = vector.new(pos.x, pos.y + 0.5, pos.z) + local minppos = vector.add(prt_pos, 1) + local maxppos = vector.subtract(prt_pos, 1) + animalia.particle_spawner(prt_pos, "mob_core_red_particle.png", "float", minppos, maxppos) + mobkit.remember(self, "trust", self.trust) + end +}) + +mob_core.register_spawn_egg("animalia:cat", "db9764" ,"cf8d5a") + +local house_nodes = {} + +minetest.register_on_mods_loaded(function() + for name in pairs(minetest.registered_nodes) do + if minetest.get_item_group(name, "stairs") > 0 + or minetest.get_item_group(name, "wood") > 0 then + table.insert(house_nodes, name) + end + end +end) + +mob_core.register_spawn({ + name = "animalia:cat", + nodes = house_nodes, + min_light = 0, + max_light = 15, + min_height = -31000, + max_height = 31000, + min_rad = 24, + max_rad = 256, + group = 0, +}, animalia.spawn_interval, 1) \ No newline at end of file diff --git a/mobs/chicken.lua b/mobs/chicken.lua index 900dc47..2ed0ee4 100644 --- a/mobs/chicken.lua +++ b/mobs/chicken.lua @@ -2,134 +2,167 @@ -- Chicken -- ------------- -local blend = better_fauna.frame_blend +local clamp_bone_rot = animalia.clamp_bone_rot + +local interp = animalia.interp local random = math.random local function chicken_logic(self) - if self.hp <= 0 then mob_core.on_die(self) return end - local prty = mobkit.get_queue_priority(self) - local player = mobkit.get_nearby_player(self) - if mobkit.timer(self,1) then + if self.status ~= "following" then + if self.attention_span > 1 then + self.attention_span = self.attention_span - self.dtime + mobkit.remember(self, "attention_span", self.attention_span) + end + else + self.attention_span = self.attention_span + self.dtime + mobkit.remember(self, "attention_span", self.attention_span) + end - mob_core.vitals(self) - mob_core.random_drop(self, 10, 1800, "better_fauna:chicken_egg") - mob_core.random_sound(self, 8) + if self.fall_start + and self.fall_start - mobkit.get_stand_pos(self).y > 2 then + mobkit.animate(self, "flap") + self.object:set_acceleration({x = 0, y = -3.1, z = 0}) + end + + animalia.head_tracking(self, 0.45, 0.25) + + if mobkit.timer(self, 4) then + + local prty = mobkit.get_queue_priority(self) + local player = mobkit.get_nearby_player(self) + + mob_core.random_sound(self, 14) + mob_core.random_drop(self, 10, 1800, "animalia:chicken_egg") + + if prty < 4 + and self.isinliquid then + animalia.hq_go_to_land(self, 4) + end if prty < 3 and self.breeding then - better_fauna.hq_fowl_breed(self, 3) - end - - if prty < 2 - and player then - if self.attention_span < 5 then - if mob_core.follow_holding(self, player) then - better_fauna.hq_follow_player(self, 2, player) - self.attention_span = self.attention_span + 1 - end - end + animalia.hq_fowl_breed(self, 3) end + if prty == 2 + and not self.lasso_player + and (not player + or not mob_core.follow_holding(self, player)) then + mobkit.clear_queue_high(self) + end + + if prty < 2 then + if self.caught_with_lasso + and self.lasso_player then + animalia.hq_follow_player(self, 2, self.lasso_player, true) + elseif player then + if self.attention_span < 5 then + if mob_core.follow_holding(self, player) then + animalia.hq_follow_player(self, 2, player) + self.attention_span = self.attention_span + 1 + end + end + end + end + if mobkit.is_queue_empty_high(self) then - mob_core.hq_roam(self, 0) + animalia.hq_wander_group(self, 0, 8) end end end -minetest.register_entity("better_fauna:chicken",{ - max_hp = 10, - view_range = 16, - armor_groups = {fleshy = 100}, - physical = true, - collide_with_objects = true, +animalia.register_mob("chicken", { + -- Stats + health = 10, + fleshy = 100, + view_range = 8, + lung_capacity = 10, + -- Visual collisionbox = {-0.2, -0.15, -0.2, 0.2, 0.3, 0.2}, visual_size = {x = 6, y = 6}, - scale_stage1 = 0.25, - scale_stage2 = 0.5, - scale_stage3 = 0.75, - visual = "mesh", - mesh = "better_fauna_chicken.b3d", + mesh = "animalia_chicken.b3d", female_textures = { - "better_fauna_chicken_1.png", - "better_fauna_chicken_2.png", - "better_fauna_chicken_3.png" + "animalia_chicken_1.png", + "animalia_chicken_2.png", + "animalia_chicken_3.png" }, male_textures = { - "better_fauna_rooster_1.png", - "better_fauna_rooster_2.png", - "better_fauna_rooster_3.png" + "animalia_rooster_1.png", + "animalia_rooster_2.png", + "animalia_rooster_3.png" }, - child_textures = {"better_fauna_chick.png"}, - animation = { - stand = {range = {x = 0, y = 0}, speed = 1, frame_blend = blend, loop = true}, - walk = {range = {x = 10, y = 30}, speed = 30, frame_blend = blend, loop = true}, - run = {range = {x = 10, y = 30}, speed = 45, frame_blend = blend, loop = true}, - fall = {range = {x = 40, y = 60}, speed = 30, frame_blend = blend, loop = true}, + child_textures = {"animalia_chick.png"}, + animations = { + stand = {range = {x = 0, y = 0}, speed = 1, frame_blend = 0.3, loop = true}, + walk = {range = {x = 10, y = 30}, speed = 30, frame_blend = 0.3, loop = true}, + run = {range = {x = 10, y = 30}, speed = 45, frame_blend = 0.3, loop = true}, + fall = {range = {x = 40, y = 60}, speed = 30, frame_blend = 0.3, loop = true}, }, + -- Physics + speed = 5, + max_fall = 6, + -- Attributes sounds = { alter_child_pitch = true, random = { - name = "better_fauna_chicken_idle", - gain = 1.0, + name = "animalia_chicken_idle", + gain = 0.5, distance = 8 }, hurt = { - name = "better_fauna_chicken_hurt", - gain = 1.0, + name = "animalia_chicken_hurt", + gain = 0.5, distance = 8 }, death = { - name = "better_fauna_chicken_death", - gain = 1.0, + name = "animalia_chicken_death", + gain = 0.5, distance = 8 } }, - max_speed = 4, - stepheight = 1.1, - jump_height = 1.1, - buoyancy = 0.25, - lung_capacity = 10, - timeout = 1200, - ignore_liquidflag = false, - core_growth = false, - push_on_collide = true, - catch_with_net = true, + fall_damage = false, + -- Behavior + defend_owner = false, follow = { "farming:seed_cotton", "farming:seed_wheat" }, drops = { - {name = "better_fauna:feather", chance = 1, min = 1, max = 2}, - {name = "better_fauna:chicken_raw", chance = 1, min = 1, max = 4} + {name = "animalia:feather", chance = 1, min = 1, max = 2}, + {name = "animalia:chicken_raw", chance = 1, min = 1, max = 4} + }, + -- Functions + head_data = { + offset = {x = 0, y = 0.15, z = 0}, + pitch_correction = 55, + pivot_h = 0.25, + pivot_v = 0.55 }, - on_step = better_fauna.on_step, - on_activate = better_fauna.on_activate, - get_staticdata = mobkit.statfunc, - phsyics = better_fauna.lightweight_physics, logic = chicken_logic, + get_staticdata = mobkit.statfunc, + on_step = animalia.on_step, + on_activate = animalia.on_activate, on_rightclick = function(self, clicker) - if better_fauna.feed_tame(self, clicker, 1, false, true) then return end - mob_core.protect(self, clicker, false) + if animalia.feed_tame(self, clicker, 1, false, true) then return end + mob_core.protect(self, clicker, true) mob_core.nametag(self, clicker, true) end, on_punch = function(self, puncher, _, tool_capabilities, dir) - mobkit.clear_queue_high(self) mob_core.on_punch_basic(self, puncher, tool_capabilities, dir) - better_fauna.hq_sporadic_flee(self, 10, puncher) + animalia.hq_sporadic_flee(self, 10) end, }) -mob_core.register_spawn_egg("better_fauna:chicken", "c6c6c6", "d22222") +mob_core.register_spawn_egg("animalia:chicken", "c6c6c6", "d22222") mob_core.register_spawn({ - name = "better_fauna:chicken", - nodes = {"default:dry_dirt_with_dry_grass", "default:dirt_with_grass"}, + name = "animalia:chicken", min_light = 0, max_light = 15, min_height = -31000, @@ -139,41 +172,39 @@ mob_core.register_spawn({ group = 6, optional = { biomes = { - "grassland", - "savanna", - "rainforest" + unpack(animalia.grassland_biomes), + unpack(animalia.tropical_biomes) } } -}, 16, 6) +}, animalia.spawn_interval, 4) - -minetest.register_craftitem("better_fauna:chicken_raw", { - description = "Raw Chicken", - inventory_image = "better_fauna_chicken_raw.png", +minetest.register_craftitem("animalia:poultry_raw", { + description = "Raw Poultry", + inventory_image = "animalia_poultry_raw.png", on_use = minetest.item_eat(1), groups = {flammable = 2}, }) -minetest.register_craftitem("better_fauna:chicken_cooked", { - description = "Cooked Chicken", - inventory_image = "better_fauna_chicken_cooked.png", +minetest.register_craftitem("animalia:poultry_cooked", { + description = "Cooked Poultry", + inventory_image = "animalia_poultry_cooked.png", on_use = minetest.item_eat(6), groups = {flammable = 2}, }) minetest.register_craft({ type = "cooking", - recipe = "better_fauna:chicken_raw", - output = "better_fauna:chicken_cooked", + recipe = "animalia:poultry_raw", + output = "animalia:poultry_cooked", }) -minetest.register_entity("better_fauna:chicken_egg_sprite", { +minetest.register_entity("animalia:chicken_egg_sprite", { hp_max = 1, physical = true, collisionbox = {0, 0, 0, 0, 0, 0}, visual = "sprite", visual_size = {x = 0.5, y = 0.5}, - textures = {"better_fauna_egg.png"}, + textures = {"animalia_egg.png"}, initial_sprite_basepos = {x = 0, y = 0}, is_visible = true, on_step = function(self, dtime) @@ -182,7 +213,7 @@ minetest.register_entity("better_fauna:chicken_egg_sprite", { local cube = minetest.find_nodes_in_area( vector.new(pos.x - 0.5, pos.y - 0.5, pos.z - 0.5), vector.new(pos.x + 0.5, pos.y + 0.5, pos.z + 0.5), - better_fauna.walkable_nodes) + animalia.walkable_nodes) if #objects >= 2 then if objects[2]:get_armor_groups().fleshy then objects[2]:punch(self.object, 2.0, {full_punch_interval = 0.1, damage_groups = {fleshy = 1}}, nil) @@ -199,10 +230,10 @@ minetest.register_entity("better_fauna:chicken_egg_sprite", { minacc = vector.new(0, -9.81, 0), maxacc = vector.new(0, -9.81, 0), collisiondetection = true, - texture = "better_fauna_egg_fragment.png", + texture = "animalia_egg_fragment.png", }) - if random(1, 3) == 1 then - mob_core.spawn_child(pos, "better_fauna:chicken") + if random(1, 3) < 2 then + mob_core.spawn_child(pos, "animalia:chicken") self.object:remove() else self.object:remove() @@ -227,7 +258,7 @@ local mobs_shoot_egg = function (item, player, pointed_thing) x = pos.x, y = pos.y +1.5, z = pos.z - }, "better_fauna:chicken_egg_sprite") + }, "animalia:chicken_egg_sprite") local ent = obj:get_luaentity() local dir = player:get_look_dir() @@ -256,9 +287,28 @@ local mobs_shoot_egg = function (item, player, pointed_thing) return item end -minetest.register_craftitem("better_fauna:chicken_egg", { +minetest.register_craftitem("animalia:chicken_egg", { description = "Chicken Egg", - inventory_image = "better_fauna_egg.png", + inventory_image = "animalia_egg.png", on_use = mobs_shoot_egg, groups = {flammable = 2}, +}) + +minetest.register_craftitem("animalia:chicken_egg_fried", { + description = "Fried Chicken Egg", + inventory_image = "animalia_egg_fried.png", + on_use = minetest.item_eat(4), + groups = {flammable = 2}, +}) + +minetest.register_craft({ + type = "cooking", + recipe = "animalia:chicken_egg", + output = "animalia:chicken_egg_fried", +}) + +minetest.register_craftitem("animalia:feather", { + description = "Feather", + inventory_image = "animalia_feather.png", + groups = {flammable = 2, feather = 1}, }) \ No newline at end of file diff --git a/mobs/cow.lua b/mobs/cow.lua index 4cf6ed0..1d01b86 100644 --- a/mobs/cow.lua +++ b/mobs/cow.lua @@ -2,7 +2,12 @@ -- Cow -- --------- -local blend = better_fauna.frame_blend +local clamp_bone_rot = animalia.clamp_bone_rot + +local interp = animalia.interp + +local random = math.random +local blend = animalia.frame_blend local function cow_logic(self) @@ -11,126 +16,161 @@ local function cow_logic(self) return end - local pos = mobkit.get_stand_pos(self) - local prty = mobkit.get_queue_priority(self) - local player = mobkit.get_nearby_player(self) + if self.status ~= "following" then + if self.attention_span > 1 then + self.attention_span = self.attention_span - self.dtime + mobkit.remember(self, "attention_span", self.attention_span) + end + else + self.attention_span = self.attention_span + self.dtime + mobkit.remember(self, "attention_span", self.attention_span) + end - mob_core.random_sound(self, 16/self.dtime) + animalia.head_tracking(self, 0.75, 0.75) - if mobkit.timer(self,1) then + if mobkit.timer(self, 3) then - mob_core.vitals(self) + local prty = mobkit.get_queue_priority(self) + local player = mobkit.get_nearby_player(self) + + mob_core.random_sound(self, 14) mob_core.growth(self) - if math.random(1, 64) == 1 then + if random(1, 64) < 2 then self.gotten = mobkit.remember(self, "gotten", false) end - if self.status ~= "following" then - if self.attention_span > 1 then - self.attention_span = self.attention_span - 1 - mobkit.remember(self, "attention_span", self.attention_span) - end - else - self.attention_span = self.attention_span + 1 - mobkit.remember(self, "attention_span", self.attention_span) + if prty < 5 + and self.isinliquid then + animalia.hq_go_to_land(self, 5) end if prty < 4 and self.breeding then - better_fauna.hq_breed(self, 4) + animalia.hq_breed(self, 4) end if prty < 3 and self.gotten - and math.random(1, 16) == 1 then - better_fauna.hq_eat(self, 3) + and random(1, 16) < 2 then + animalia.hq_eat(self, 3) end - - if prty < 2 - and player then - if self.attention_span < 5 then - if mob_core.follow_holding(self, player) then - better_fauna.hq_follow_player(self, 2, player) - self.attention_span = self.attention_span + 1 - end - end + + if prty == 2 + and not self.lasso_player + and (not player + or not mob_core.follow_holding(self, player)) then + mobkit.clear_queue_high(self) + end + + if prty < 2 then + if self.caught_with_lasso + and self.lasso_player then + animalia.hq_follow_player(self, 2, self.lasso_player, true) + elseif player then + if self.attention_span < 5 then + if mob_core.follow_holding(self, player) then + animalia.hq_follow_player(self, 2, player) + self.attention_span = self.attention_span + 1 + end + end + end end if mobkit.is_queue_empty_high(self) then - mob_core.hq_roam(self, 0) + animalia.hq_wander_group(self, 0, 10) end end end -local random = math.random - -minetest.register_entity("better_fauna:cow",{ - max_hp = 20, - view_range = 16, - armor_groups = {fleshy = 100}, - physical = true, - collide_with_objects = true, - collisionbox = {-0.45, -0.55, -0.45, 0.45, 0.4, 0.45}, - visual_size = {x = 13, y = 13}, - scale_stage1 = 0.5, - scale_stage2 = 0.65, - scale_stage3 = 0.80, - visual = "mesh", - mesh = "better_fauna_cow.b3d", - textures = { - "better_fauna_cow_1.png", - "better_fauna_cow_2.png", - "better_fauna_cow_3.png", - "better_fauna_cow_4.png" +animalia.register_mob("cow", { + -- Stats + health = 20, + fleshy = 100, + view_range = 32, + lung_capacity = 10, + -- Visual + collisionbox = {-0.45, 0, -0.45, 0.45, 0.9, 0.45}, + visual_size = {x = 10, y = 10}, + mesh = "animalia_cow.b3d", + female_textures = { + "animalia_cow_1.png^animalia_cow_udder.png", + "animalia_cow_2.png^animalia_cow_udder.png", + "animalia_cow_3.png^animalia_cow_udder.png", + "animalia_cow_4.png^animalia_cow_udder.png" }, - animation = { - stand = {range = {x = 30, y = 50}, speed = 10, frame_blend = blend, loop = true}, - walk = {range = {x = 1, y = 20}, speed = 20, frame_blend = blend, loop = true}, - run = {range = {x = 1, y = 20}, speed = 30, frame_blend = blend, loop = true}, + male_textures = { + "animalia_cow_1.png", + "animalia_cow_2.png", + "animalia_cow_3.png", + "animalia_cow_4.png" }, + child_textures = { + "animalia_cow_1.png", + "animalia_cow_2.png", + "animalia_cow_3.png", + "animalia_cow_4.png" + }, + animations = { + stand = {range = {x = 1, y = 60}, speed = 10, frame_blend = 0.3, loop = true}, + walk = {range = {x = 70, y = 110}, speed = 40, frame_blend = 0.3, loop = true}, + run = {range = {x = 70, y = 110}, speed = 50, frame_blend = 0.3, loop = true}, + }, + -- Physics + speed = 4, + max_fall = 3, + -- Attributes sounds = { alter_child_pitch = true, random = { - name = "better_fauna_cow_idle", + name = "animalia_cow_idle", gain = 1.0, distance = 8 }, hurt = { - name = "better_fauna_cow_hurt", + name = "animalia_cow_hurt", gain = 1.0, distance = 8 }, death = { - name = "better_fauna_cow_death", + name = "animalia_cow_death", gain = 1.0, distance = 8 } }, - max_speed = 4, - stepheight = 1.1, - jump_height = 1.1, - buoyancy = 0.25, - lung_capacity = 10, - timeout = 1200, - ignore_liquidflag = false, - core_growth = false, - push_on_collide = true, - catch_with_net = true, + -- Behavior + defend_owner = false, follow = { "farming:wheat", }, - drops = { - {name = "mobs:leather", chance = 1, min = 1, max = 2}, - {name = "better_fauna:beef_raw", chance = 1, min = 1, max = 4} + consumable_nodes = { + { + name = "default:dirt_with_grass", + replacement = "default:dirt" + }, + { + name = "default:dry_dirt_with_dry_grass", + replacement = "default:dry_dirt" + } }, - on_step = better_fauna.on_step, - on_activate = better_fauna.on_activate, - get_staticdata = mobkit.statfunc, - logic = cow_logic, + drops = { + {name = "animalia:leather", chance = 2, min = 1, max = 2}, + {name = "animalia:beef_raw", chance = 1, min = 1, max = 4} + }, + -- Functions + head_data = { + offset = {x = 0, y = 0.5, z = 0}, + pitch_correction = -45, + pivot_h = 0.75, + pivot_v = 1 + }, + logic = cow_logic, + get_staticdata = mobkit.statfunc, + on_step = animalia.on_step, + on_activate = animalia.on_activate, on_rightclick = function(self, clicker) - if better_fauna.feed_tame(self, clicker, 1, false, true) then return end - mob_core.protect(self, clicker, false) + if animalia.feed_tame(self, clicker, 1, false, true) then return end + mob_core.protect(self, clicker, true) mob_core.nametag(self, clicker, true) local tool = clicker:get_wielded_item() @@ -152,12 +192,12 @@ minetest.register_entity("better_fauna:cow",{ tool:take_item() clicker:set_wielded_item(tool) - if inv:room_for_item("main", {name = "better_fauna:bucket_milk"}) then - clicker:get_inventory():add_item("main", "better_fauna:bucket_milk") + if inv:room_for_item("main", {name = "animalia:bucket_milk"}) then + clicker:get_inventory():add_item("main", "animalia:bucket_milk") else local pos = self.object:get_pos() pos.y = pos.y + 0.5 - minetest.add_item(pos, {name = "better_fauna:bucket_milk"}) + minetest.add_item(pos, {name = "animalia:bucket_milk"}) end self.gotten = mobkit.remember(self, "gotten", true) @@ -165,58 +205,55 @@ minetest.register_entity("better_fauna:cow",{ end end, on_punch = function(self, puncher, _, tool_capabilities, dir) - mobkit.clear_queue_high(self) mob_core.on_punch_basic(self, puncher, tool_capabilities, dir) - better_fauna.hq_sporadic_flee(self, 20, puncher) + animalia.hq_sporadic_flee(self, 10) end }) -minetest.register_craftitem("better_fauna:bucket_milk", { +minetest.register_craftitem("animalia:leather", { + description = "Leather", + inventory_image = "animalia_leather.png" +}) + +minetest.register_craftitem("animalia:bucket_milk", { description = "Bucket of Milk", - inventory_image = "better_fauna_milk_bucket.png", + inventory_image = "animalia_milk_bucket.png", stack_max = 1, on_use = minetest.item_eat(8, "bucket:bucket_empty"), groups = {food_milk = 1, flammable = 3}, }) -minetest.register_craftitem("better_fauna:beef_raw", { +minetest.register_craftitem("animalia:beef_raw", { description = "Raw Beef", - inventory_image = "better_fauna_beef_raw.png", + inventory_image = "animalia_beef_raw.png", on_use = minetest.item_eat(1), groups = {flammable = 2}, }) -minetest.register_craftitem("better_fauna:beef_cooked", { +minetest.register_craftitem("animalia:beef_cooked", { description = "Steak", - inventory_image = "better_fauna_beef_cooked.png", + inventory_image = "animalia_beef_cooked.png", on_use = minetest.item_eat(8), groups = {flammable = 2}, }) minetest.register_craft({ type = "cooking", - recipe = "better_fauna:beef_raw", - output = "better_fauna:beef_cooked", + recipe = "animalia:beef_raw", + output = "animalia:beef_cooked", }) -mob_core.register_spawn_egg("better_fauna:cow", "cac3a1" ,"464438") +mob_core.register_spawn_egg("animalia:cow", "cac3a1" ,"464438") mob_core.register_spawn({ - name = "better_fauna:cow", - nodes = { - "default:dirt_with_grass", - "default:dry_dirt_with_dry_grass" - }, + name = "animalia:cow", min_light = 0, max_light = 15, min_height = -31000, max_height = 31000, group = 3, optional = { - biomes = { - "grassland", - "savanna" - } + biomes = animalia.grassland_biomes } -}, 4, 6) \ No newline at end of file +}, animalia.spawn_interval, 2) \ No newline at end of file diff --git a/mobs/horse.lua b/mobs/horse.lua new file mode 100644 index 0000000..72253e9 --- /dev/null +++ b/mobs/horse.lua @@ -0,0 +1,295 @@ +----------- +-- Horse -- +----------- + +local random = math.random + +local function set_pattern(self) + local types = { + "spots", + "patches" + } + if mobkit.recall(self, "pattern") + and not mobkit.recall(self, "pattern"):find("better_fauna") then + local pattern = mobkit.recall(self, "pattern") + local texture = self.object:get_properties().textures[1] + self.object:set_properties({ + textures = {texture .. "^" .. pattern} + }) + else + local type = types[random(#types)] + local overlay = "(animalia_horse_".. type ..".png)" + if type == "patches" then + local colors = { + "brown", + "white" + } + if self.texture_no < 1 then + table.insert(colors, "black") + else + table.remove(colors, 1) + end + overlay = "(animalia_horse_".. colors[random(#colors)] .."_patches.png)" + end + if random(100) > 50 then + overlay = "transparency.png" + end + local texture = self.object:get_properties().textures[1] + self.object:set_properties({ + textures = {texture .. "^" .. overlay} + }) + mobkit.remember(self, "pattern", overlay) + end +end + +local function horse_logic(self) + + if self.hp <= 0 then + mob_core.on_die(self) + return + end + + if self.status ~= "following" then + if self.attention_span > 1 then + self.attention_span = self.attention_span - self.dtime + mobkit.remember(self, "attention_span", self.attention_span) + end + else + self.attention_span = self.attention_span + self.dtime + mobkit.remember(self, "attention_span", self.attention_span) + end + + animalia.head_tracking(self) + + if mobkit.timer(self, 1) then + + local prty = mobkit.get_queue_priority(self) + local player = mobkit.get_nearby_player(self) + local pos = self.object:get_pos() + + mob_core.random_sound(self, 14) + mob_core.growth(self) + + if self.breaking then + if not minetest.get_player_by_name(self.breaker) + or not self.driver then + self.breaking = nil + self.breaker = nil + else + local yaw = self.object:get_yaw() + local yaw2 = minetest.get_player_by_name(self.breaker):get_look_horizontal() + if math.abs(yaw - yaw2) > 5.8 + or math.abs(yaw - yaw2) < 0.5 then + self.breaking_progress = self.breaking_progress + 1 + else + self.breaking_progress = self.breaking_progress - 1 + end + animalia.hq_sporadic_flee(self, 10) + if self.breaking_progress < -5 + or minetest.get_player_by_name(self.breaker):get_player_control().sneak then + mob_core.detach(self.driver, {x = 1, y = 0, z = 1}) + mobkit.lq_idle(self, 0.5, "rear") + self.breaking = nil + self.breaker = nil + self.breaking_progress = nil + elseif self.breaking_progress > 5 then + mob_core.set_owner(self, self.breaker) + self.breaking = nil + self.breaker = nil + self.breaking_progress = nil + local prt_pos = vector.new(pos.x, pos.y + 2, pos.z) + local minppos = vector.add(prt_pos, 1) + local maxppos = vector.subtract(prt_pos, 1) + animalia.particle_spawner(prt_pos, "mob_core_green_particle.png", "float", minppos, maxppos) + mobkit.clear_queue_high(self) + end + end + return + end + + if prty < 20 + and self.driver + and not self.breaking then + animalia.hq_mount_logic(self, 20) + end + + if prty < 5 + and self.isinliquid then + animalia.hq_go_to_land(self, 5) + end + + if prty < 4 + and self.breeding then + animalia.hq_horse_breed(self, 4) + end + + if prty == 2 + and not self.lasso_player + and (not player + or not mob_core.follow_holding(self, player)) then + mobkit.clear_queue_high(self) + end + + if prty < 2 then + if self.caught_with_lasso + and self.lasso_player then + animalia.hq_follow_player(self, 2, self.lasso_player, true) + elseif player then + if self.attention_span < 5 then + if mob_core.follow_holding(self, player) then + animalia.hq_follow_player(self, 2, player) + self.attention_span = self.attention_span + 1 + end + end + end + end + + if mobkit.is_queue_empty_high(self) then + animalia.hq_wander_group(self, 0, 12) + end + end +end + +animalia.register_mob("horse", { + -- Stats + health = 40, + fleshy = 100, + view_range = 32, + lung_capacity = 10, + -- Visual + collisionbox = {-0.65, 0, -0.65, 0.65, 1.95, 0.65}, + visual_size = {x = 10, y = 10}, + mesh = "animalia_horse.b3d", + textures = { + "animalia_horse_1.png", + "animalia_horse_2.png", + "animalia_horse_3.png", + "animalia_horse_4.png", + "animalia_horse_5.png", + "animalia_horse_6.png" + }, + animations = { + stand = {range = {x = 1, y = 60}, speed = 10, frame_blend = 0.3, loop = true}, + walk = {range = {x = 70, y = 110}, speed = 25, frame_blend = 0.3, loop = true}, + run = {range = {x = 70, y = 110}, speed = 45, frame_blend = 0.3, loop = true}, + rear = {range = {x = 120, y = 150}, speed = 27, frame_blend = 0.2, loop = false}, + rear_constant = {range = {x = 130, y = 140}, speed = 20, frame_blend = 0.3, loop = true} + }, + -- Physics + speed = 10, + max_fall = 8, + -- Attributes + sounds = { + alter_child_pitch = true, + random = { + { + name = "animalia_horse_idle_1", + gain = 1.0, + distance = 8 + }, + { + name = "animalia_horse_idle_2", + gain = 1.0, + distance = 8 + }, + { + name = "animalia_horse_idle_3", + gain = 1.0, + distance = 8 + } + }, + hurt = { + name = "animalia_horse_hurt", + gain = 1.0, + distance = 8 + }, + death = { + name = "animalia_horse_death", + gain = 1.0, + distance = 8 + } + }, + -- Behavior + defend_owner = false, + follow = { + "farming:wheat", + }, + drops = { + {name = "animalia:leather", chance = 2, min = 1, max = 4}, + }, + player_rotation = {x = -60, y = 180, z = 0}, + driver_scale = {x = 0.1, y = 0.1}, + driver_attach_at = {x = 0, y = 1.1, z = 0.5}, + driver_attach_bone = "Torso", + driver_eye_offset = {{x = 0, y = 15, z = 0}, {x = 0, y = 15, z = 15}}, + -- Functions + head_data = { + bone = "Neck.CTRL", + offset = {x = 0, y = 1.98, z = 0}, + pitch_correction = 35, + pivot_h = 1, + pivot_v = 1.5 + }, + logic = horse_logic, + get_staticdata = mobkit.statfunc, + on_step = animalia.on_step, + on_activate = function(self, staticdata, dtime_s) + animalia.on_activate(self, staticdata, dtime_s) + set_pattern(self) + self.saddled = mobkit.recall(self, "saddled") or false + self.max_hp = mobkit.recall(self, "max_hp") or random(30, 45) + self.speed = mobkit.recall(self, "speed") or random(5, 10) + self.jump_power = mobkit.recall(self, "speed") or random(2, 5) + if self.saddled then + local texture = self.object:get_properties().textures[1] + self.object:set_properties({ + textures = {texture .. "^animalia_horse_saddle.png"} + }) + end + end, + on_rightclick = function(self, clicker) + if animalia.feed_tame(self, clicker, 1, false, true) then return end + mob_core.protect(self, clicker, false) + mob_core.nametag(self, clicker, true) + local tool = clicker:get_wielded_item() + if self.tamed + and self.owner == clicker:get_player_name() then + if self.saddled + and tool:get_name() == "" then + mob_core.mount(self, clicker) + elseif tool:get_name() == "animalia:saddle" then + self.saddled = mobkit.remember(self, "saddled", true) + local texture = self.object:get_properties().textures[1] + self.object:set_properties({ + textures = {texture .. "^animalia_horse_saddle.png"} + }) + tool:take_item() + clicker:set_wielded_item(tool) + end + elseif not self.tamed + and tool:get_name() == "" then + mob_core.mount(self, clicker) + self.breaking = true + self.breaker = clicker:get_player_name() + self.breaking_progress = 0 + end + end, + on_punch = function(self, puncher, _, tool_capabilities, dir) + mob_core.on_punch_basic(self, puncher, tool_capabilities, dir) + animalia.hq_sporadic_flee(self, 10) + end +}) + +mob_core.register_spawn_egg("animalia:horse", "ebdfd8" ,"653818") + +mob_core.register_spawn({ + name = "animalia:horse", + min_light = 0, + max_light = 15, + min_height = -31000, + max_height = 31000, + group = 6, + optional = { + biomes = animalia.grassland_biomes + } +}, animalia.spawn_interval, 8) \ No newline at end of file diff --git a/mobs/pig.lua b/mobs/pig.lua index e4c20e0..4df077f 100644 --- a/mobs/pig.lua +++ b/mobs/pig.lua @@ -2,8 +2,6 @@ -- Pig -- --------- -local blend = better_fauna.frame_blend - local function pig_logic(self) if self.hp <= 0 then @@ -11,148 +9,162 @@ local function pig_logic(self) return end - local pos = mobkit.get_stand_pos(self) - local prty = mobkit.get_queue_priority(self) - local player = mobkit.get_nearby_player(self) + if self.status ~= "following" then + if self.attention_span > 1 then + self.attention_span = self.attention_span - self.dtime + mobkit.remember(self, "attention_span", self.attention_span) + end + else + self.attention_span = self.attention_span + self.dtime + mobkit.remember(self, "attention_span", self.attention_span) + end - mob_core.random_sound(self, 16/self.dtime) + if mobkit.timer(self, 3) then - if mobkit.timer(self,1) then + local prty = mobkit.get_queue_priority(self) + local player = mobkit.get_nearby_player(self) - mob_core.vitals(self) + mob_core.random_sound(self, 14) mob_core.growth(self) - if self.status ~= "following" then - if self.attention_span > 1 then - self.attention_span = self.attention_span - 1 - mobkit.remember(self, "attention_span", self.attention_span) - end - else - self.attention_span = self.attention_span + 1 - mobkit.remember(self, "attention_span", self.attention_span) + if prty < 4 + and self.isinliquid then + animalia.hq_go_to_land(self, 4) end if prty < 3 and self.breeding then - better_fauna.hq_breed(self, 3) + animalia.hq_breed(self, 3) end - if prty < 2 - and player then - if self.attention_span < 5 then - if mob_core.follow_holding(self, player) then - better_fauna.hq_follow_player(self, 2, player) - self.attention_span = self.attention_span + 1 - end - end + if prty == 2 + and not self.lasso_player + and (not player + or not mob_core.follow_holding(self, player)) then + mobkit.clear_queue_high(self) + end + + if prty < 2 then + if self.caught_with_lasso + and self.lasso_player then + animalia.hq_follow_player(self, 2, self.lasso_player, true) + elseif player then + if self.attention_span < 5 then + if mob_core.follow_holding(self, player) then + animalia.hq_follow_player(self, 2, player) + self.attention_span = self.attention_span + 3 + end + end + end end if mobkit.is_queue_empty_high(self) then - mob_core.hq_roam(self, 0) + animalia.hq_wander_group(self, 0, 8) end end end -local random = math.random - -minetest.register_entity("better_fauna:pig",{ - max_hp = 20, - view_range = 16, - armor_groups = {fleshy = 100}, - physical = true, - collide_with_objects = true, +animalia.register_mob("pig", { + -- Stats + health = 20, + fleshy = 100, + view_range = 32, + lung_capacity = 10, + -- Visual collisionbox = {-0.35, -0.45, -0.35, 0.35, 0.4, 0.35}, visual_size = {x = 11, y = 11}, - scale_stage1 = 0.5, - scale_stage2 = 0.65, - scale_stage3 = 0.80, - visual = "mesh", - mesh = "better_fauna_pig.b3d", - textures = { - "better_fauna_pig_1.png", - "better_fauna_pig_2.png", - "better_fauna_pig_3.png" + mesh = "animalia_pig.b3d", + female_textures = { + "animalia_pig_1.png", + "animalia_pig_2.png", + "animalia_pig_3.png" }, - animation = { - stand = {range = {x = 30, y = 50}, speed = 10, frame_blend = blend, loop = true}, - walk = {range = {x = 1, y = 20}, speed = 30, frame_blend = blend, loop = true}, - run = {range = {x = 1, y = 20}, speed = 45, frame_blend = blend, loop = true}, + male_textures = { + "animalia_pig_1.png^animalia_pig_tusks.png", + "animalia_pig_2.png^animalia_pig_tusks.png", + "animalia_pig_3.png^animalia_pig_tusks.png" }, + child_textures = { + "animalia_pig_1.png", + "animalia_pig_2.png", + "animalia_pig_3.png" + }, + animations = { + stand = {range = {x = 30, y = 50}, speed = 10, frame_blend = 0.3, loop = true}, + walk = {range = {x = 1, y = 20}, speed = 30, frame_blend = 0.3, loop = true}, + run = {range = {x = 1, y = 20}, speed = 45, frame_blend = 0.3, loop = true}, + }, + -- Physics + speed = 4, + max_fall = 3, + -- Attributes sounds = { alter_child_pitch = true, random = { - name = "better_fauna_pig_idle", + name = "animalia_pig_idle", gain = 1.0, distance = 8 }, hurt = { - name = "better_fauna_pig_idle", + name = "animalia_pig_idle", gain = 1.0, pitch = 0.5, distance = 8 }, death = { - name = "better_fauna_pig_death", + name = "animalia_pig_death", gain = 1.0, distance = 8 } }, - max_speed = 4, - stepheight = 1.1, - jump_height = 1.1, - buoyancy = 0.25, - lung_capacity = 10, - timeout = 1200, - ignore_liquidflag = false, - core_growth = false, - push_on_collide = true, - catch_with_net = true, + -- Behavior + defend_owner = false, follow = { "farming:carrot" }, drops = { - {name = "better_fauna:porkchop_raw", chance = 1, min = 1, max = 4} + {name = "animalia:porkchop_raw", chance = 1, min = 1, max = 4} }, - on_step = better_fauna.on_step, - on_activate = better_fauna.on_activate, - get_staticdata = mobkit.statfunc, - logic = pig_logic, + -- Functions + logic = pig_logic, + get_staticdata = mobkit.statfunc, + on_step = animalia.on_step, + on_activate = animalia.on_activate, on_rightclick = function(self, clicker) - if better_fauna.feed_tame(self, clicker, 1, false, true) then return end - mob_core.protect(self, clicker, false) + if animalia.feed_tame(self, clicker, 1, false, true) then return end + mob_core.protect(self, clicker, true) mob_core.nametag(self, clicker, true) end, on_punch = function(self, puncher, _, tool_capabilities, dir) - mobkit.clear_queue_high(self) mob_core.on_punch_basic(self, puncher, tool_capabilities, dir) - better_fauna.hq_sporadic_flee(self, 20, puncher) + animalia.hq_sporadic_flee(self, 10) end }) -minetest.register_craftitem("better_fauna:porkchop_raw", { +minetest.register_craftitem("animalia:porkchop_raw", { description = "Raw Porkchop", - inventory_image = "better_fauna_porkchop_raw.png", + inventory_image = "animalia_porkchop_raw.png", on_use = minetest.item_eat(1), groups = {flammable = 2}, }) -minetest.register_craftitem("better_fauna:porkchop_cooked", { +minetest.register_craftitem("animalia:porkchop_cooked", { description = "Cooked Porkchop", - inventory_image = "better_fauna_porkchop_cooked.png", + inventory_image = "animalia_porkchop_cooked.png", on_use = minetest.item_eat(7), groups = {flammable = 2}, }) minetest.register_craft({ type = "cooking", - recipe = "better_fauna:porkchop_raw", - output = "better_fauna:porkchop_cooked", + recipe = "animalia:porkchop_raw", + output = "animalia:porkchop_cooked", }) -mob_core.register_spawn_egg("better_fauna:pig", "e0b1a7" ,"cc9485") +mob_core.register_spawn_egg("animalia:pig", "e0b1a7" ,"cc9485") mob_core.register_spawn({ - name = "better_fauna:pig", + name = "animalia:pig", nodes = {"default:dirt_with_grass"}, min_light = 0, max_light = 15, @@ -161,8 +173,9 @@ mob_core.register_spawn({ group = 3, optional = { biomes = { - "grassland", - "deciduous_forest" + unpack(animalia.grassland_biomes), + unpack(animalia.temperate_biomes), + unpack(animalia.boreal_biomes) } } -}, 16, 1) \ No newline at end of file +}, animalia.spawn_interval, 4) \ No newline at end of file diff --git a/mobs/sheep.lua b/mobs/sheep.lua index b7626c3..1e63c9b 100644 --- a/mobs/sheep.lua +++ b/mobs/sheep.lua @@ -2,7 +2,7 @@ -- Sheep -- ----------- -local blend = better_fauna.frame_blend +local creative = minetest.settings:get_bool("creative_mode") local palette = { {"black", "Black", "#000000b0"}, @@ -22,6 +22,10 @@ local palette = { {"yellow", "Yellow", "#e3ff0070"}, } +local clamp_bone_rot = animalia.clamp_bone_rot + +local interp = animalia.interp + local min = math.min local abs = math.abs local random = math.random @@ -33,109 +37,113 @@ local function sheep_logic(self) return end - local pos = mobkit.get_stand_pos(self) - local prty = mobkit.get_queue_priority(self) - local player = mobkit.get_nearby_player(self) + if self.status ~= "following" then + if self.attention_span > 1 then + self.attention_span = self.attention_span - self.dtime + mobkit.remember(self, "attention_span", self.attention_span) + end + else + self.attention_span = self.attention_span + self.dtime + mobkit.remember(self, "attention_span", self.attention_span) + end - mob_core.random_sound(self, 16/self.dtime) + animalia.head_tracking(self, 0.5, 0.5) - if mobkit.timer(self,1) then + if mobkit.timer(self, 3) then - mob_core.vitals(self) + local pos = mobkit.get_stand_pos(self) + local prty = mobkit.get_queue_priority(self) + local player = mobkit.get_nearby_player(self) + + mob_core.random_sound(self, 14) mob_core.growth(self) - if self.status ~= "following" then - if self.attention_span > 1 then - self.attention_span = self.attention_span - 1 - mobkit.remember(self, "attention_span", self.attention_span) - end - else - self.attention_span = self.attention_span + 1 - mobkit.remember(self, "attention_span", self.attention_span) + if prty < 5 + and self.isinliquid then + animalia.hq_go_to_land(self, 5) end if prty < 4 and self.breeding then - better_fauna.hq_breed(self, 4) + animalia.hq_breed(self, 4) end if prty < 3 and self.gotten and math.random(1, 16) == 1 then - better_fauna.hq_eat(self, 3) + animalia.hq_eat(self, 3) end - - if prty < 2 - and player then - if self.attention_span < 5 then - if mob_core.follow_holding(self, player) then - better_fauna.hq_follow_player(self, 2, player) - self.attention_span = self.attention_span + 1 - end - end + + if prty == 2 + and not self.lasso_player + and (not player + or not mob_core.follow_holding(self, player)) then + mobkit.clear_queue_high(self) + end + + if prty < 2 then + if self.caught_with_lasso + and self.lasso_player then + animalia.hq_follow_player(self, 2, self.lasso_player, true) + elseif player then + if self.attention_span < 5 then + if mob_core.follow_holding(self, player) then + animalia.hq_follow_player(self, 2, player) + self.attention_span = self.attention_span + 3 + end + end + end end if mobkit.is_queue_empty_high(self) then - mob_core.hq_roam(self, 0) + animalia.hq_wander_group(self, 0, 12) end end end -minetest.register_entity("better_fauna:sheep",{ - max_hp = 20, - view_range = 16, - armor_groups = {fleshy = 100}, - physical = true, - collide_with_objects = true, - collisionbox = {-0.4, -0.4, -0.4, 0.4, 0.4, 0.4}, +animalia.register_mob("sheep", { + -- Stats + health = 20, + fleshy = 100, + view_range = 32, + lung_capacity = 10, + -- Visual + collisionbox = {-0.4, 0, -0.4, 0.4, 0.8, 0.4}, visual_size = {x = 10, y = 10}, - scale_stage1 = 0.5, - scale_stage2 = 0.65, - scale_stage3 = 0.80, - visual = "mesh", - mesh = "better_fauna_sheep.b3d", - textures = {"better_fauna_sheep.png^better_fauna_sheep_wool.png"}, - child_textures = {"better_fauna_sheep.png"}, - animation = { - stand = {range = {x = 30, y = 50}, speed = 10, frame_blend = blend, loop = true}, - walk = {range = {x = 1, y = 20}, speed = 30, frame_blend = blend, loop = true}, - run = {range = {x = 1, y = 20}, speed = 45, frame_blend = blend, loop = true}, + mesh = "animalia_sheep.b3d", + textures = {"animalia_sheep.png^animalia_sheep_wool.png"}, + child_textures = {"animalia_sheep.png"}, + animations = { + stand = {range = {x = 1, y = 60}, speed = 10, frame_blend = 0.3, loop = true}, + walk = {range = {x = 70, y = 110}, speed = 40, frame_blend = 0.3, loop = true}, + run = {range = {x = 70, y = 110}, speed = 50, frame_blend = 0.3, loop = true}, }, + -- Physics + speed = 4, + max_fall = 3, + -- Attributes sounds = { alter_child_pitch = true, random = { - name = "better_fauna_sheep_idle", + name = "animalia_sheep_idle", gain = 1.0, distance = 8 }, hurt = { - name = "better_fauna_sheep_idle", + name = "animalia_sheep_hurt", gain = 1.0, - pitch = 0.5, distance = 8 }, death = { - name = "better_fauna_sheep_idle", + name = "animalia_sheep_death", gain = 1.0, - pitch = 0.25, distance = 8 } }, - max_speed = 4, - stepheight = 1.1, - jump_height = 1.1, - buoyancy = 0.25, - lung_capacity = 10, - timeout = 1200, - ignore_liquidflag = false, - core_growth = false, - push_on_collide = true, - catch_with_net = true, + -- Behavior + defend_owner = false, follow = { - "farming:wheat" - }, - drops = { - {name = "better_fauna:mutton_raw", chance = 1, min = 1, max = 4} + "farming:wheat", }, consumable_nodes = { { @@ -147,43 +155,53 @@ minetest.register_entity("better_fauna:sheep",{ replacement = "default:dry_dirt" } }, - get_staticdata = mobkit.statfunc, - logic = sheep_logic, + drops = { + {name = "animalia:mutton_raw", chance = 1, min = 1, max = 4} + }, + -- Functions + head_data = { + offset = {x = 0, y = 0.41, z = 0}, + pitch_correction = -45, + pivot_h = 0.75, + pivot_v = 0.85 + }, + logic = sheep_logic, + get_staticdata = mobkit.statfunc, on_step = function(self, dtime, moveresult) - better_fauna.on_step(self, dtime, moveresult) + animalia.on_step(self, dtime, moveresult) if mobkit.is_alive(self) then - if self.object:get_properties().textures[1] == "better_fauna_sheep.png" + if self.object:get_properties().textures[1] == "animalia_sheep.png" and not self.gotten then self.object:set_properties({ - textures = {"better_fauna_sheep.png^better_fauna_sheep_wool.png"}, + textures = {"animalia_sheep.png^animalia_sheep_wool.png"}, }) end end end, on_activate = function(self, staticdata, dtime_s) - better_fauna.on_activate(self, staticdata, dtime_s) + animalia.on_activate(self, staticdata, dtime_s) self.dye_color = mobkit.recall(self, "dye_color") or "white" self.dye_hex = mobkit.recall(self, "dye_hex") or "" if self.dye_color ~= "white" and not self.gotten then self.object:set_properties({ - textures = {"better_fauna_sheep.png^(better_fauna_sheep_wool.png^[colorize:" .. self.dye_hex .. ")"}, + textures = {"animalia_sheep.png^(animalia_sheep_wool.png^[colorize:" .. self.dye_hex .. ")"}, }) end if self.gotten then self.object:set_properties({ - textures = {"better_fauna_sheep.png"}, + textures = {"animalia_sheep.png"}, }) end end, on_rightclick = function(self, clicker) - if better_fauna.feed_tame(self, clicker, 1, false, true) then return end - mob_core.protect(self, clicker, false) + if animalia.feed_tame(self, clicker, 1, false, true) then return end + mob_core.protect(self, clicker, true) mob_core.nametag(self, clicker, true) local item = clicker:get_wielded_item() local itemname = item:get_name() local name = clicker:get_player_name() - if itemname == "mobs:shears" + if itemname == "animalia:shears" and not self.gotten and not self.child then if not minetest.get_modpath("wool") then @@ -204,7 +222,7 @@ minetest.register_entity("better_fauna:sheep",{ clicker:set_wielded_item(item) self.object:set_properties({ - textures = {"better_fauna_sheep.png"}, + textures = {"animalia_sheep.png"}, }) end for _, color in ipairs(palette) do @@ -218,15 +236,15 @@ minetest.register_entity("better_fauna:sheep",{ self.dye_hex = mobkit.remember(self, "dye_hex", color[3]) self.drops = { - {name = "better_fauna:mutton_raw", chance = 1, min = 1, max = 4}, + {name = "animalia:mutton_raw", chance = 1, min = 1, max = 4}, {name = "wool:"..self.dye_color, chance = 2, min = 1, max = 2}, } self.object:set_properties({ - textures = {"better_fauna_sheep.png^(better_fauna_sheep_wool.png^[colorize:" .. color[3] .. ")"}, + textures = {"animalia_sheep.png^(animalia_sheep_wool.png^[colorize:" .. color[3] .. ")"}, }) - if not mobs.is_creative(clicker:get_player_name()) then + if not creative then item:take_item() clicker:set_wielded_item(item) end @@ -235,44 +253,44 @@ minetest.register_entity("better_fauna:sheep",{ end end end, - on_punch = function(self, puncher, _, tool_capabilities, dir) - mobkit.clear_queue_high(self) mob_core.on_punch_basic(self, puncher, tool_capabilities, dir) - better_fauna.hq_sporadic_flee(self, 10, puncher) - end, + animalia.hq_sporadic_flee(self, 10) + end }) -mob_core.register_spawn_egg("better_fauna:sheep", "f4e6cf", "e1ca9b") +mob_core.register_spawn_egg("animalia:sheep", "f4e6cf", "e1ca9b") mob_core.register_spawn({ - name = "better_fauna:sheep", - nodes = {"default:dirt_with_grass"}, + name = "animalia:sheep", min_light = 0, max_light = 15, min_height = -31000, max_height = 31000, min_rad = 24, max_rad = 256, - group = 6 -}, 2, 8) + group = 6, + optional = { + biomes = animalia.grassland_biomes + } +}, animalia.spawn_interval, 4) -minetest.register_craftitem("better_fauna:mutton_raw", { +minetest.register_craftitem("animalia:mutton_raw", { description = "Raw Mutton", - inventory_image = "better_fauna_mutton_raw.png", + inventory_image = "animalia_mutton_raw.png", on_use = minetest.item_eat(1), groups = {flammable = 2}, }) -minetest.register_craftitem("better_fauna:mutton_cooked", { +minetest.register_craftitem("animalia:mutton_cooked", { description = "Cooked Mutton", - inventory_image = "better_fauna_mutton_cooked.png", + inventory_image = "animalia_mutton_cooked.png", on_use = minetest.item_eat(6), groups = {flammable = 2}, }) minetest.register_craft({ type = "cooking", - recipe = "better_fauna:mutton_raw", - output = "better_fauna:mutton_cooked", + recipe = "animalia:mutton_raw", + output = "animalia:mutton_cooked", }) \ No newline at end of file diff --git a/mobs/turkey.lua b/mobs/turkey.lua index b878060..99d139f 100644 --- a/mobs/turkey.lua +++ b/mobs/turkey.lua @@ -2,7 +2,9 @@ -- Turkey -- ------------ -local blend = better_fauna.frame_blend +local clamp_bone_rot = animalia.clamp_bone_rot + +local interp = animalia.interp local function turkey_logic(self) @@ -10,115 +12,141 @@ local function turkey_logic(self) mob_core.on_die(self) return end - local prty = mobkit.get_queue_priority(self) - local player = mobkit.get_nearby_player(self) - if mobkit.timer(self,1) then + if self.status ~= "following" then + if self.attention_span > 1 then + self.attention_span = self.attention_span - self.dtime + mobkit.remember(self, "attention_span", self.attention_span) + end + else + self.attention_span = self.attention_span + self.dtime + mobkit.remember(self, "attention_span", self.attention_span) + end - mob_core.vitals(self) - mob_core.random_sound(self, 12) + animalia.head_tracking(self, 0.45, 0.25) + + if mobkit.timer(self, 3) then + + local prty = mobkit.get_queue_priority(self) + local player = mobkit.get_nearby_player(self) + + mob_core.random_sound(self, 14) + + if prty < 4 + and self.isinliquid then + animalia.hq_go_to_land(self, 4) + end if prty < 3 and self.breeding then - better_fauna.hq_fowl_breed(self, 3) - end - - if prty < 2 - and player then - if self.attention_span < 5 then - if mob_core.follow_holding(self, player) then - better_fauna.hq_follow_player(self, 2, player) - self.attention_span = self.attention_span + 1 - end - end + animalia.hq_fowl_breed(self, 3) end + if prty == 2 + and not self.lasso_player + and (not player + or not mob_core.follow_holding(self, player)) then + mobkit.clear_queue_high(self) + end + + if prty < 2 then + if self.caught_with_lasso + and self.lasso_player then + animalia.hq_follow_player(self, 2, self.lasso_player, true) + elseif player then + if self.attention_span < 5 then + if mob_core.follow_holding(self, player) then + animalia.hq_follow_player(self, 2, player) + self.attention_span = self.attention_span + 3 + end + end + end + end + if mobkit.is_queue_empty_high(self) then - mob_core.hq_roam(self, 0) + animalia.hq_wander_group(self, 0, 8) end end end -minetest.register_entity("better_fauna:turkey",{ - max_hp = 10, - view_range = 16, - armor_groups = {fleshy = 100}, - physical = true, - collide_with_objects = true, +animalia.register_mob("turkey", { + -- Stats + health = 15, + fleshy = 100, + view_range = 26, + lung_capacity = 10, + -- Visual collisionbox = {-0.3, -0.2, -0.3, 0.3, 0.4, 0.3}, visual_size = {x = 7, y = 7}, - scale_stage1 = 0.25, - scale_stage2 = 0.5, - scale_stage3 = 0.75, - visual = "mesh", - mesh = "better_fauna_turkey.b3d", - female_textures = {"better_fauna_turkey_hen.png"}, - male_textures = {"better_fauna_turkey_tom.png"}, - child_textures = {"better_fauna_turkey_chick.png"}, - animation = { - stand = {range = {x = 0, y = 0}, speed = 1, frame_blend = blend, loop = true}, - walk = {range = {x = 10, y = 30}, speed = 30, frame_blend = blend, loop = true}, - run = {range = {x = 10, y = 30}, speed = 45, frame_blend = blend, loop = true}, - fall = {range = {x = 40, y = 60}, speed = 30, frame_blend = blend, loop = true}, + mesh = "animalia_turkey.b3d", + female_textures = {"animalia_turkey_hen.png"}, + male_textures = {"animalia_turkey_tom.png"}, + child_textures = {"animalia_turkey_chick.png"}, + animations = { + stand = {range = {x = 0, y = 0}, speed = 1, frame_blend = 0.3, loop = true}, + walk = {range = {x = 10, y = 30}, speed = 30, frame_blend = 0.3, loop = true}, + run = {range = {x = 40, y = 60}, speed = 45, frame_blend = 0.3, loop = true}, + fall = {range = {x = 70, y = 90}, speed = 30, frame_blend = 0.3, loop = true}, }, + -- Physics + speed = 5, + max_fall = 6, + -- Attributes sounds = { alter_child_pitch = true, random = { - name = "better_fauna_turkey_idle", + name = "animalia_turkey_idle", gain = 1.0, distance = 8 }, hurt = { - name = "better_fauna_turkey_hurt", + name = "animalia_turkey_hurt", gain = 1.0, distance = 8 }, death = { - name = "better_fauna_turkey_death", + name = "animalia_turkey_death", gain = 1.0, distance = 8 } }, - max_speed = 4, - stepheight = 1.1, - jump_height = 1.1, - buoyancy = 0.25, - lung_capacity = 10, - timeout = 1200, - ignore_liquidflag = false, - core_growth = false, - push_on_collide = true, - catch_with_net = true, + -- Behavior + defend_owner = false, follow = { "farming:seed_cotton", "farming:seed_wheat" }, drops = { - {name = "better_fauna:feather", chance = 1, min = 1, max = 2}, - {name = "better_fauna:turkey_raw", chance = 1, min = 3, max = 5} + {name = "animalia:feather", chance = 1, min = 1, max = 2}, + {name = "animalia:poultry_raw", chance = 1, min = 2, max = 5} }, - on_step = better_fauna.on_step, - on_activate = better_fauna.on_activate, - get_staticdata = mobkit.statfunc, - phsyics = better_fauna.lightweight_physics, + -- Functions + head_data = { + offset = {x = 0, y = 0.15, z = 0}, + pitch_correction = 45, + pivot_h = 0.45, + pivot_v = 0.65 + }, + physics = animalia.lightweight_physics, logic = turkey_logic, + get_staticdata = mobkit.statfunc, + on_step = animalia.on_step, + on_activate = animalia.on_activate, on_rightclick = function(self, clicker) - if better_fauna.feed_tame(self, clicker, 1, false, true) then return end - mob_core.protect(self, clicker, false) + if animalia.feed_tame(self, clicker, 1, false, true) then return end + mob_core.protect(self, clicker, true) mob_core.nametag(self, clicker, true) end, on_punch = function(self, puncher, _, tool_capabilities, dir) - mobkit.clear_queue_high(self) mob_core.on_punch_basic(self, puncher, tool_capabilities, dir) - better_fauna.hq_sporadic_flee(self, 10, puncher) + animalia.hq_sporadic_flee(self, 10) end, }) -mob_core.register_spawn_egg("better_fauna:turkey", "352b22", "2f2721") +mob_core.register_spawn_egg("animalia:turkey", "352b22", "2f2721") mob_core.register_spawn({ - name = "better_fauna:turkey", - nodes = {"default:dry_dirt_with_dry_grass", "default:dirt_with_grass"}, + name = "animalia:turkey", min_light = 0, max_light = 15, min_height = -31000, @@ -127,30 +155,6 @@ mob_core.register_spawn({ max_rad = 256, group = 6, optional = { - biomes = { - "deciduous_forest", - "taiga" - } + biomes = animalia.temperate_biomes } -}, 16, 6) - - -minetest.register_craftitem("better_fauna:turkey_raw", { - description = "Raw Turkey", - inventory_image = "better_fauna_turkey_raw.png", - on_use = minetest.item_eat(1), - groups = {flammable = 2}, -}) - -minetest.register_craftitem("better_fauna:turkey_cooked", { - description = "Cooked Turkey", - inventory_image = "better_fauna_turkey_cooked.png", - on_use = minetest.item_eat(6), - groups = {flammable = 2}, -}) - -minetest.register_craft({ - type = "cooking", - recipe = "better_fauna:turkey_raw", - output = "better_fauna:turkey_cooked", -}) \ No newline at end of file +}, animalia.spawn_interval, 6) \ No newline at end of file diff --git a/mobs/wolf.lua b/mobs/wolf.lua new file mode 100644 index 0000000..cff5c35 --- /dev/null +++ b/mobs/wolf.lua @@ -0,0 +1,237 @@ +---------- +-- Wolf -- +---------- + +local clamp_bone_rot = animalia.clamp_bone_rot + +local interp = animalia.interp + +local follow = { + "animalia:mutton_raw", + "animalia:beef_raw", + "animalia:porkchop_raw", + "animalia:poultry_raw" +} + +if minetest.registered_items["bonemeal:bone"] then + follow = { + "bonemeal:bone", + "animalia:beef_raw", + "animalia:porkchop_raw", + "animalia:mutton_raw", + "animalia:poultry_raw" + } +end + +function animalia.bh_attack(self, prty, target) + if mobkit.is_alive(target) then + if target:is_player() then + if not self.tamed + or target:get_player_name() ~= self.owner then + animalia.hq_attack(self, prty, target) + end + elseif target:get_luaentity() then + if not self.tamed + or not mob_core.shared_owner(self, target) then + animalia.hq_attack(self, prty, target) + end + end + end +end + +local function wolf_logic(self) + + if self.hp <= 0 then + mob_core.on_die(self) + return + end + + animalia.head_tracking(self, 0.5, 0.75) + + if mobkit.timer(self, 1) then + + local prty = mobkit.get_queue_priority(self) + local player = mobkit.get_nearby_player(self) + + mob_core.random_sound(self, 22) + mob_core.growth(self) + + if self.status ~= "following" then + if self.attention_span > 1 then + self.attention_span = self.attention_span - 1 + mobkit.remember(self, "attention_span", self.attention_span) + end + else + self.attention_span = self.attention_span + 1 + mobkit.remember(self, "attention_span", self.attention_span) + end + + if prty < 22 + and self.order == "sit" then + if not mobkit.is_queue_empty_high(self) then + mobkit.clear_queue_high(self) + end + mobkit.animate(self, "sit") + return + end + + if prty < 21 + and self.owner_target then + if not mob_core.shared_owner(self, self.owner_target) then + animalia.hq_attack(self, 21, self.owner_target) + end + end + + if prty < 20 + and self.order == "follow" + and self.owner + and minetest.get_player_by_name(self.owner) then + local owner = minetest.get_player_by_name(self.owner) + animalia.hq_follow_player(self, 20, owner, true) + end + + if prty < 5 + and self.isinliquid then + animalia.hq_go_to_land(self, 5) + end + + if prty < 4 + and self.breeding then + animalia.hq_breed(self, 4) + end + + if prty == 3 + and not self.lasso_player + and (not player + or not mob_core.follow_holding(self, player)) then + mobkit.clear_queue_high(self) + end + + if prty < 3 then + if self.caught_with_lasso + and self.lasso_player then + animalia.hq_follow_player(self, 3, self.lasso_player, true) + elseif player then + if self.attention_span < 5 then + if mob_core.follow_holding(self, player) then + animalia.hq_follow_player(self, 3, player) + self.attention_span = self.attention_span + 3 + end + end + end + end + + if prty < 2 then + local target = mobkit.get_closest_entity(self, "animalia:sheep") + if target then + animalia.bh_attack(self, 2, target) + end + end + + if mobkit.is_queue_empty_high(self) then + animalia.hq_wander_group(self, 0, 8) + end + end +end + +animalia.register_mob("wolf", { + -- Stats + health = 25, + fleshy = 100, + view_range = 32, + lung_capacity = 10, + -- Visual + collisionbox = {-0.35, -0.375, -0.35, 0.35, 0.4, 0.35}, + visual_size = {x = 9, y = 9}, + scale_stage1 = 0.5, + scale_stage2 = 0.65, + scale_stage3 = 0.80, + mesh = "animalia_wolf.b3d", + textures = {"animalia_wolf.png"}, + animations = { + stand = {range = {x = 30, y = 49}, speed = 10, frame_blend = 0.3, loop = true}, + sit = {range = {x = 60, y = 90}, speed = 20, frame_blend = 0.3, loop = true}, + walk = {range = {x = 1, y = 20}, speed = 30, frame_blend = 0.3, loop = true}, + run = {range = {x = 1, y = 20}, speed = 45, frame_blend = 0.3, loop = true}, + }, + -- Physics + speed = 8, + max_fall = 4, + -- Attributes + sounds = { + alter_child_pitch = true, + random = { + name = "animalia_wolf_idle", + gain = 1.0, + distance = 8 + }, + hurt = { + name = "animalia_wolf_hurt", + gain = 1.0, + pitch = 0.5, + distance = 8 + }, + death = { + name = "animalia_wolf_death", + gain = 1.0, + distance = 8 + } + }, + reach = 2, + damage = 3, + knockback = 2, + punch_cooldown = 1, + -- Behavior + defend_owner = true, + follow = { + "bonemeal:bone", + "animalia:beef_raw", + "animalia:porkchop_raw", + "animalia:mutton_raw", + "animalia:poultry_raw" + }, + -- Functions + head_data = { + offset = {x = 0, y = 0.22, z = 0}, + pitch_correction = -20, + pivot_h = 0.65, + pivot_v = 0.65 + }, + logic = wolf_logic, + get_staticdata = mobkit.statfunc, + on_step = animalia.on_step, + on_activate = animalia.on_activate, + on_rightclick = function(self, clicker) + if animalia.feed_tame(self, clicker, math.random(3, 5), true, true) then return end + mob_core.protect(self, clicker, false) + mob_core.nametag(self, clicker, true) + if not self.owner + or clicker:get_player_name() ~= self.owner then return end + if self.order == "wander" then + self.order = "follow" + elseif self.order == "follow" then + self.order = "sit" + else + self.order = "wander" + end + mobkit.remember(self, "order", self.order) + end, + on_punch = function(self, puncher, _, tool_capabilities, dir) + mob_core.on_punch_basic(self, puncher, tool_capabilities, dir) + animalia.bh_attack(self, 10, puncher) + end +}) + +mob_core.register_spawn_egg("animalia:wolf", "a19678" ,"231b13") + +mob_core.register_spawn({ + name = "animalia:wolf", + min_light = 0, + max_light = 15, + min_height = -31000, + max_height = 31000, + group = 4, + optional = { + biomes = animalia.temperate_biomes + } +}, animalia.spawn_interval, 4) \ No newline at end of file diff --git a/mod.conf b/mod.conf index a7f02c8..6cb5b52 100644 --- a/mod.conf +++ b/mod.conf @@ -1,3 +1,4 @@ -name = better_fauna -depends = mobkit, mob_core, default +name = animalia +depends = mobkit, mob_core +optional_depends = default description = Basic Fauna for Minetest Game diff --git a/models/animalia_cat.b3d b/models/animalia_cat.b3d new file mode 100644 index 0000000000000000000000000000000000000000..de68a36cc9463ac4cc56fe1520c8dcadc797e8ca GIT binary patch literal 126257 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 literal 0 HcmV?d00001 diff --git a/models/animalia_chicken.b3d b/models/animalia_chicken.b3d new file mode 100644 index 0000000000000000000000000000000000000000..f67463963a6a2eb8c2558192e794260716e87eb2 GIT binary patch literal 98778 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�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 literal 0 HcmV?d00001 diff --git a/models/animalia_cow.b3d b/models/animalia_cow.b3d new file mode 100644 index 0000000000000000000000000000000000000000..91bea08e98043733a0defc28b3a0a9862e94a346 GIT binary patch literal 78972 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 literal 0 HcmV?d00001 diff --git a/models/animalia_horse.b3d b/models/animalia_horse.b3d new file mode 100644 index 0000000000000000000000000000000000000000..93e779b7beb05243fbb969ffa836fe426dda7b14 GIT binary patch literal 254352 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 C8+7ad literal 0 HcmV?d00001 diff --git a/models/animalia_lasso.b3d b/models/animalia_lasso.b3d new file mode 100644 index 0000000000000000000000000000000000000000..ddeb5c0df6b7210e6287ee9f85450f82537d9f7c GIT binary patch literal 1406 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

>2WRPpOiYwr%XerA&5plh$l^ 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 literal 0 HcmV?d00001 diff --git a/models/animalia_wolf.b3d b/models/animalia_wolf.b3d new file mode 100644 index 0000000000000000000000000000000000000000..6f43a4081e2e70f25db5f4205d5c73e3cdcf9ee9 GIT binary patch literal 68751 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 i?_}Fq?2MDBv*pru-j}xXM!(kn