diff --git a/api/behaviors.lua b/api/behaviors.lua index d711cd9..08b39c3 100644 --- a/api/behaviors.lua +++ b/api/behaviors.lua @@ -58,9 +58,10 @@ if farming_enabled then for name, def in pairs(minetest.registered_nodes) do local item_string = name:sub(1, #name - 2) local item_name = item_string:split(":")[2] + local growth_stage = tonumber(name:sub(-1)) or 1 if farming.registered_plants[item_string] or farming.registered_plants[item_name] then - def.groups.crop = 2 + def.groups.crop = growth_stage end minetest.register_node(":" .. name, def) end @@ -1032,7 +1033,7 @@ creatura.register_utility("animalia:follow_player", function(self, player, force end) creatura.register_utility("animalia:flee_from_target", function(self, target) - local los_timeout = 3 + local los_timeout = 5 local function func(_self) local pos = _self.object:get_pos() if not pos then return end @@ -1041,16 +1042,16 @@ creatura.register_utility("animalia:flee_from_target", function(self, target) if not los then los_timeout = los_timeout - _self.dtime else - los_timeout = 3 + los_timeout = 5 end if los_timeout <= 0 then self._puncher = nil return true end local dist = vec_dist(pos, tgt_pos) if dist > _self.tracking_range then self._puncher = nil return true end if not _self:get_action() then local flee_dir = vec_dir(tgt_pos, pos) - local pos2 = _self:get_wander_pos(2, 3, flee_dir) + local pos2 = _self:get_wander_pos(1, 2, flee_dir) local anim = (_self.animations["run"] and "run") or "walk" - creatura.action_move(_self, pos2, 2, "creatura:context_based_steering", 1, anim) + creatura.action_move(_self, pos2, 1, "creatura:context_based_steering", 1, anim) end end self:set_utility(func) @@ -1560,7 +1561,7 @@ creatura.register_utility("animalia:mount_horse", function(self, player) and vel.y < 1 then _self.object:add_velocity({ x = 0, - y = _self.jump_power, + y = _self.jump_power * 2, z = 0 }) elseif not _self.touching_ground then diff --git a/api/lasso.lua b/api/lasso.lua index b5df4c2..b14c9dc 100644 --- a/api/lasso.lua +++ b/api/lasso.lua @@ -36,6 +36,7 @@ minetest.register_entity("animalia:lasso_entity", { if not pos or not parent or not point_to then self.object:remove() return end if type(parent) == "string" then parent = minetest.get_player_by_name(parent) + if not parent then self.object:remove() return end local tgt_pos = parent:get_pos() tgt_pos.y = tgt_pos.y + 1 point_to.y = point_to.y + pointed_ent.height * 0.5 @@ -126,7 +127,7 @@ local function add_lasso(self, origin) -- Attachment point of entity ent._attached = origin if type(origin) == "string" then - local player = minetest.get_player_by_name(origin) + --local player = minetest.get_player_by_name(origin) --object:set_attach(player) else object:set_pos(origin) @@ -171,22 +172,24 @@ function animalia.update_lasso_effects(self) using_lasso[lasso] = self local name = lasso lasso = minetest.get_player_by_name(lasso) - if lasso:get_wielded_item():get_name() ~= "animalia:lasso" then - using_lasso[name] = nil - self._lasso_ent:remove() - self._lasso_ent = nil - self._lassod_to = nil - self:forget("_lassod_to") + if lasso then + if lasso:get_wielded_item():get_name() ~= "animalia:lasso" then + using_lasso[name] = nil + self._lasso_ent:remove() + self._lasso_ent = nil + self._lassod_to = nil + self:forget("_lassod_to") + return + end + local lasso_pos = lasso:get_pos() + local dist = vec_dist(pos, lasso_pos) + local vel = self.object:get_velocity() + if not vel or dist < 8 and self.touching_ground then return end + if vec_len(vel) < 8 then + self.object:add_velocity(get_rope_velocity(pos, lasso_pos, dist)) + end return end - local lasso_pos = lasso:get_pos() - local dist = vec_dist(pos, lasso_pos) - local vel = self.object:get_velocity() - if not vel or dist < 8 and self.touching_ground then return end - if vec_len(vel) < 8 then - self.object:add_velocity(get_rope_velocity(pos, lasso_pos, dist)) - end - return elseif type(lasso) == "table" then local dist = vec_dist(pos, lasso) local vel = self.object:get_velocity() diff --git a/craftitems.lua b/craftitems.lua index 6fb9a81..3017512 100644 --- a/craftitems.lua +++ b/craftitems.lua @@ -4,20 +4,10 @@ local random = math.random -local walkable_nodes = {} +local vec_add, vec_sub = vector.add, vector.subtract local color = minetest.colorize -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) - end - end - end -end) - local function correct_name(str) if str then if str:match(":") then str = str:split(":")[2] end @@ -288,7 +278,7 @@ minetest.register_craftitem("animalia:venison_raw", { groups = {flammable = 2, meat = 1, food_meat = 1}, }) -minetest.register_craftitem("animalia:venison_raw_cooked", { +minetest.register_craftitem("animalia:venison_cooked", { description = "Venison Steak", inventory_image = "animalia_venison_cooked.png", on_use = minetest.item_eat(10), @@ -388,45 +378,38 @@ minetest.register_craftitem("animalia:bucket_guano", { inventory_image = "animalia_guano_bucket.png", stack_max = 1, groups = {flammable = 3}, - 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 - if guano_fert then - local nodes = minetest.find_nodes_in_area_under_air( - vector.subtract(pos, 5), - vector.add(pos, 5), - {"group:grass", "group:plant", "group:flora"} - ) - if #nodes > 0 then - for n = 1, #nodes do - grow_crops(nodes[n], minetest.get_node(nodes[n]).name) - end - local replace = itemstack:get_meta():get_string("original_item") - if not replace - or replace == "" then - replace = "bucket:bucket_empty" - end - itemstack:set_name(replace) - end - else - minetest.set_node(pos, {name = "animalia:guano"}) - local replace = itemstack:get_meta():get_string("original_item") - if not replace - or replace == "" then - replace = "bucket:bucket_empty" - end - itemstack:set_name(replace) - end + on_place = function(itemstack, placer, pointed) + local pos = pointed.under + local node = minetest.get_node(pos) + if node + and node.on_rightclick then + return node.on_rightclick(pointed_thing.under, under, placer, itemstack) + end + if minetest.is_protected(pos, placer:get_player_name()) then + return + end + local crops = minetest.find_nodes_in_area_under_air( + vec_sub(pos, 5), + vec_add(pos, 5), + {"group:grass", "group:plant", "group:flora", "group:crop"} + ) or {} + local crops_grown = 0 + for _, crop in ipairs(crops) do + local crop_name = minetest.get_node(crop).name + local growth_stage = tonumber(crop_name:sub(-1)) or 1 + local new_name = crop_name:sub(1, #crop_name - 1) .. (growth_stage + 1) + local new_def = minetest.registered_nodes[new_name] + if new_def then + local p2 = new_def.place_param2 or 1 + minetest.set_node(crop, {name = new_name, param2 = p2}) + crops_grown = crops_grown + 1 end end + if crops_grown < 1 then minetest.set_node(pointed.above, {name = "animalia:guano"}) end + local meta = itemstack:get_meta() + local og_item = meta:get_string("original_item") + if og_item == "" then og_item = "bucket:bucket_empty" end + itemstack:replace(ItemStack(og_item)) return itemstack end }) @@ -591,12 +574,16 @@ minetest.register_node("animalia:guano", { }, groups = {crumbly = 3, falling_node = 1, not_in_creative_inventory = 1}, on_punch = function(pos, _, player) - local item_name = player:get_wielded_item():get_name() - if item_name:find("bucket") - and item_name:find("empty") then - local stack = ItemStack("animalia:bucket_guano") + local inv = player:get_inventory() + local stack = ItemStack("animalia:bucket_guano") + if not inv:room_for_item("main", stack) then return end + local item = player:get_wielded_item() + local item_name = item:get_name() + if item_name:match("bucket_empty") then + item:take_item() stack:get_meta():set_string("original_item", item_name) - player:set_wielded_item(stack) + inv:add_item("main", stack) + player:set_wielded_item(item) minetest.remove_node(pos) end end diff --git a/init.lua b/init.lua index b26fbd0..61a1b32 100644 --- a/init.lua +++ b/init.lua @@ -79,18 +79,13 @@ minetest.register_on_mods_loaded(function() local on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage) old_punch(self, puncher, time_from_last_punch, tool_capabilities, dir, damage) local pos = self.object:get_pos() - if not pos then - return - end - if puncher:is_player() - and animalia.pets[puncher:get_player_name()] then - local pets = animalia.pets[puncher:get_player_name()] - if #pets < 1 then return end - for i = 1, #pets do - local ent = pets[i]:get_luaentity() - if ent.assist_owner then - ent.owner_target = self - end + if not pos then return end + local name = puncher:is_player() and puncher:get_player_name() + local pets = (name and animalia.pets[name]) or {} + for _, obj in ipairs(pets) do + local ent = obj and obj:get_luaentity() + if ent.assist_owner then + ent.owner_target = self end end end diff --git a/mobs/bat.lua b/mobs/bat.lua index 673f7ef..5c35d18 100644 --- a/mobs/bat.lua +++ b/mobs/bat.lua @@ -201,4 +201,9 @@ creatura.register_mob("animalia:bat", { on_punch = animalia.punch }) -creatura.register_spawn_egg("animalia:bat", "392517", "321b0b") \ No newline at end of file +creatura.register_spawn_egg("animalia:bat", "392517", "321b0b") + +creatura.register_spawn_item("animalia:bat", { + col1 = "392517", + col2 = "321b0b" +}) \ No newline at end of file diff --git a/mobs/bird.lua b/mobs/bird.lua index c36652b..23e9624 100644 --- a/mobs/bird.lua +++ b/mobs/bird.lua @@ -28,7 +28,7 @@ creatura.register_mob("animalia:bird", { -- Entity Physics stepheight = 1.1, max_fall = 0, - turn_rate = 6, + turn_rate = 3, boid_seperation = 0.4, -- Visuals mesh = "animalia_bird.b3d",