From 21ad5faf7dfa7cd1cf64eadd8df6e6137695cf0f Mon Sep 17 00:00:00 2001 From: ElCeejo Date: Sat, 5 Nov 2022 21:07:25 -0700 Subject: [PATCH] Fixes and Bird Eggs --- api/api.lua | 13 ++++--- api/behaviors.lua | 25 ++++++++------ api/lasso.lua | 2 ++ api/spawning.lua | 7 ++-- craftitems.lua | 32 ++++++++++++++---- mobs/horse.lua | 1 - textures/items/animalia_song_bird_egg.png | Bin 0 -> 5812 bytes .../items/animalia_song_bird_egg_fried.png | Bin 0 -> 6613 bytes textures/{items => nodes}/animalia_guano.png | Bin textures/{ => nodes}/animalia_nest.png | Bin 10 files changed, 54 insertions(+), 26 deletions(-) create mode 100644 textures/items/animalia_song_bird_egg.png create mode 100644 textures/items/animalia_song_bird_egg_fried.png rename textures/{items => nodes}/animalia_guano.png (100%) rename textures/{ => nodes}/animalia_nest.png (100%) diff --git a/api/api.lua b/api/api.lua index efae149..7d5cffd 100644 --- a/api/api.lua +++ b/api/api.lua @@ -455,7 +455,7 @@ function animalia.add_trust(self, player, amount) self:memorize("trust", self.trust) end -function animalia.feed(self, clicker, breed, tame) +function animalia.feed(self, clicker, tame, breed) local yaw = self.object:get_yaw() local pos = self.object:get_pos() if not pos then return end @@ -507,10 +507,13 @@ function animalia.feed(self, clicker, breed, tame) texture = "creatura_particle_green.png" }) end - if breed - and self.owner - and self.owner == name then - -- TODO: Breeding + if breed then + if self.breeding then return false end + if self.breeding_cooldown <= 0 then + self.breeding = true + self.breeding_cooldown = 60 + animalia.particle_spawner(pos, "heart.png", "float", minp, maxp) + end end self._despawn = self:memorize("_despawn", false) self.despawn_after = self:memorize("despawn_after", false) diff --git a/api/behaviors.lua b/api/behaviors.lua index 0855c4c..d711cd9 100644 --- a/api/behaviors.lua +++ b/api/behaviors.lua @@ -496,7 +496,7 @@ function animalia.action_move_boid(self, pos2, timeout, method, speed_factor, an local safe = true local max_fall = (_self.max_fall or 0) > 0 and _self.max_fall if max_fall then - safe = _self:is_pos_safe(goal) + safe = _self:is_pos_safe(pos2) end -- Boid calculation local boid_dir, boids = move_data.boid_dir or creatura.get_boid_dir(self) @@ -743,22 +743,25 @@ creatura.register_utility("animalia:wander_group", function(self) local idle_duration = self.idle_time or 3 local center = self.object:get_pos() if not center then return end - local group_tick = 500 + local cntr_timer = 30 local move = self.wander_action or animalia.action_move_boid local function func(_self) - group_tick = group_tick - 1 - if group_tick <= 0 then - local pos = _self.object:get_pos() - if not pos then return end + local pos = _self.object:get_pos() + if not pos then return end + cntr_timer = cntr_timer - _self.dtime + if cntr_timer <= 0 then local grp_pos = get_group_positions(_self) center = animalia.get_average_pos(grp_pos) or pos - group_tick = 500 + cntr_timer = 30 end if not _self:get_action() then - local pos2 = _self:get_wander_pos(2, 3) - if random(move_chance) < 2 - and vec_dist(pos2, center) < _self.tracking_range * 0.5 then - move(_self, pos2, 2, "creatura:obstacle_avoidance", 0.5, "walk", true) + if random(move_chance) < 2 then + local move_dir + if vec_dist(pos, center) > _self.tracking_range * 0.25 then + move_dir = vec_dir(pos, center) + end + local pos2 = _self:get_wander_pos(2, 3, move_dir) + move(_self, pos2, 2) else creatura.action_idle(_self, random(idle_duration)) end diff --git a/api/lasso.lua b/api/lasso.lua index 0175e2f..b5df4c2 100644 --- a/api/lasso.lua +++ b/api/lasso.lua @@ -37,6 +37,8 @@ minetest.register_entity("animalia:lasso_entity", { if type(parent) == "string" then parent = minetest.get_player_by_name(parent) local tgt_pos = parent:get_pos() + tgt_pos.y = tgt_pos.y + 1 + point_to.y = point_to.y + pointed_ent.height * 0.5 local dist = vec_dist(pos, tgt_pos) if dist > 0.5 then self.object:set_pos(tgt_pos) diff --git a/api/spawning.lua b/api/spawning.lua index e0b605d..729b768 100644 --- a/api/spawning.lua +++ b/api/spawning.lua @@ -168,10 +168,11 @@ creatura.register_abm_spawn("animalia:bird", { min_light = 0, min_height = 1, max_height = 1024, - min_group = 12, - max_group = 16, + min_group = 6, + max_group = 12, spawn_cap = 12, - nodes = {"group:leaves"} + nodes = {"group:leaves"}, + neighbors = {"group:leaves"} }) creatura.register_on_spawn("animalia:bird", function(self, pos) diff --git a/craftitems.lua b/craftitems.lua index 611a129..6fb9a81 100644 --- a/craftitems.lua +++ b/craftitems.lua @@ -30,17 +30,17 @@ local function register_egg(name, def) minetest.register_entity(def.mob .. "_egg_entity", { hp_max = 1, physical = true, - collisionbox = {0, 0, 0, 0, 0, 0}, + collisionbox = {-0.1, -0.1, -0.1, 0.1, 0.1, 0.1}, visual = "sprite", visual_size = {x = 0.5, y = 0.5}, - textures = {"animalia_egg.png"}, + textures = {def.inventory_image .. ".png"}, initial_sprite_basepos = {x = 0, y = 0}, is_visible = true, on_step = function(self, _, moveresult) local pos = self.object:get_pos() if not pos then return end if moveresult.collides then - for _, collision in ipairs(moveresult.collision) do + for _, collision in ipairs(moveresult.collisions) do if collision.type == "nodes" then minetest.add_particlespawner({ amount = 6, @@ -61,7 +61,7 @@ local function register_egg(name, def) break end end - if random(1, 3) < 2 then + if random(3) < 2 then local object = minetest.add_entity(pos, def.mob) local ent = object and object:get_luaentity() ent.growth_scale = 0.7 @@ -313,6 +313,12 @@ register_egg("animalia:turkey_egg", { mob = "animalia:turkey" }) +register_egg("animalia:song_bird_egg", { + description = "Song Bird Egg", + inventory_image = "animalia_song_bird_egg", + mob = "animalia:bird" +}) + ---------- -- Misc -- ---------- @@ -434,7 +440,7 @@ minetest.register_node("animalia:nest_song_bird", { sunlight_propagates = true, walkable = false, stack_max = 1, - groups = {snappy = 3, flammable = 3}, + groups = {snappy = 3, flammable = 3, falling_node = 1}, selection_box = { type = "fixed", fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, -0.31, 5 / 16}, @@ -443,7 +449,21 @@ minetest.register_node("animalia:nest_song_bird", { type = "fixed", fixed = {-5 / 16, -0.5, -5 / 16, 5 / 16, -0.31, 5 / 16}, }, - drops = "default:stick" + drop = { + items = { + { + items = {"animalia:song_bird_egg"}, + rarity = 2, + }, + { + items = {"animalia:song_bird_egg 2"}, + rarity = 4, + }, + { + items = {"default:stick"}, + } + } + }, }) ----------- diff --git a/mobs/horse.lua b/mobs/horse.lua index 8cae9e9..6c2265c 100644 --- a/mobs/horse.lua +++ b/mobs/horse.lua @@ -168,7 +168,6 @@ creatura.register_mob("animalia:horse", { animalia.initialize_api(ent) animalia.protect_from_despawn(ent) end, - wander_action = animalia.action_move_flock, utility_stack = { { utility = "animalia:wander_group", diff --git a/textures/items/animalia_song_bird_egg.png b/textures/items/animalia_song_bird_egg.png new file mode 100644 index 0000000000000000000000000000000000000000..446824ede124f20fe43366b6f054c7f2a598731b GIT binary patch literal 5812 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