From 9dbf0966a8dc53be89299df23d9c8cba87c78102 Mon Sep 17 00:00:00 2001 From: TenPlus1 Date: Sat, 28 Nov 2015 11:13:38 +0000 Subject: [PATCH] Sheep regrows wool and cow produces more milk when eating grass/wheat, also api tweaks --- api.lua | 75 ++++++++++++++++++++---------------------------------- bunny.lua | 2 +- cow.lua | 2 +- oerkki.lua | 2 +- sheep.lua | 2 +- 5 files changed, 32 insertions(+), 51 deletions(-) diff --git a/api.lua b/api.lua index ca6ea9c..dfb33bb 100644 --- a/api.lua +++ b/api.lua @@ -1,4 +1,4 @@ --- Mobs Api (18th November 2015) +-- Mobs Api (28th November 2015) mobs = {} mobs.mod = "redo" @@ -214,7 +214,7 @@ end -- environmental damage (water, lava, fire, light) do_env_damage = function(self) - -- feed/tame text timer (so mob full messages dont spam chat) + -- feed/tame text timer (so mob 'full' messages dont spam chat) if self.htimer > 0 then self.htimer = self.htimer - 1 end @@ -260,7 +260,6 @@ do_env_damage = function(self) if self.lava_damage ~= 0 and (nodef.groups.lava or nod.name == "fire:basic_flame" - or nod.name == "fire:eternal_flame" or nod.name == "fire:permanent_flame") then self.object:set_hp(self.object:get_hp() - self.lava_damage) effect(pos, 5, "fire_basic_flame.png") @@ -325,25 +324,6 @@ do_jump = function(self) end end --- check if POS is in mobs field of view -in_fov = function(self, pos) - - local yaw = self.object:getyaw() + self.rotate - local vx = math.sin(yaw) - local vz = math.cos(yaw) - local ds = math.sqrt(vx ^ 2 + vz ^ 2) - local ps = math.sqrt(pos.x ^ 2 + pos.z ^ 2) - local d = {x = vx / ds, z = vz / ds} - local p = {x = pos.x / ps, z = pos.z / ps} - local an = (d.x * p.x) + (d.z * p.z) - - if math.deg(math.acos(an)) > (self.fov / 2) then - return false - end - - return true -end - -- blast damage to entities nearby (modified from TNT mod) function entity_physics(pos, radius) @@ -498,7 +478,7 @@ local function breed(self) ent.hornytimer = 41 -- spawn baby - minetest.after(7, function(dtime) + minetest.after(5, function(dtime) local mob = minetest.add_entity(pos, self.name) local ent2 = mob:get_luaentity() @@ -549,11 +529,16 @@ function replace(self, pos) and self.object:getvelocity().y == 0 and #minetest.find_nodes_in_area(pos, pos, self.replace_what) > 0 then minetest.set_node(pos, {name = self.replace_with}) + -- when cow/sheep eats grass, replace wool and milk + if self.gotten == true then + self.gotten = false + self.object:set_properties(self) + end end end end --- chceck if daytime and if mob is docile during daylight hours +-- check if daytime and also if mob is docile during daylight hours function day_docile(self) if self.docile_by_day == false then @@ -629,8 +614,6 @@ minetest.register_entity(name, { replace_offset = def.replace_offset or 0, timer = 0, env_damage_timer = 0, -- only used when state = "attack" - attack = {player = nil, dist = nil}, - state = "stand", tamed = false, pause_timer = 0, horny = false, @@ -665,9 +648,6 @@ minetest.register_entity(name, { end end - -- node replace check (chicken lays egg, cow eats grass etc.) - replace(self, pos) - if not self.fly then -- floating in water (or falling) local v = self.object:getvelocity() @@ -744,6 +724,9 @@ minetest.register_entity(name, { self.timer = 1 end + -- node replace check (cow eats grass etc.) + replace(self, pos) + -- mob plays random sound at times if self.sounds.random and math.random(1, 100) <= 1 then @@ -811,7 +794,7 @@ minetest.register_entity(name, { dist = ((p.x - s.x) ^ 2 + (p.y - s.y) ^ 2 + (p.z - s.z) ^ 2) ^ 0.5 if dist < self.view_range then - -- and self.in_fov(self,p) then + -- field of view check goes here -- choose closest player to attack if minetest.line_of_sight(sp, p, 2) == true and dist < min_dist then @@ -859,7 +842,7 @@ minetest.register_entity(name, { end end - -- breed mobs and grow children + -- breed and grow children breed(self) -- find player to follow @@ -867,11 +850,15 @@ minetest.register_entity(name, { or self.order == "follow") and not self.following and self.state ~= "attack" then + local s, p, dist + for _,player in pairs(minetest.get_connected_players()) do + s = self.object:getpos() p = player:getpos() dist = ((p.x - s.x) ^ 2 + (p.y - s.y) ^ 2 + (p.z - s.z) ^ 2) ^ 0.5 + if dist < self.view_range then self.following = player break @@ -1194,7 +1181,6 @@ minetest.register_entity(name, { self.object:setyaw(yaw) -- move towards enemy if beyond mob reach - -- set reach for each mob (default is 3) if dist > self.reach then -- jump attack if (self.jump @@ -1302,6 +1288,7 @@ minetest.register_entity(name, { end end else + self.object:remove() return end @@ -1373,7 +1360,9 @@ minetest.register_entity(name, { get_staticdata = function(self) -- remove mob when out of range unless tamed - if mobs.remove and self.remove_ok and not self.tamed then + if mobs.remove + and self.remove_ok + and not self.tamed then --print ("REMOVED", self.remove_ok, self.name) self.object:remove() return nil @@ -1400,7 +1389,7 @@ minetest.register_entity(name, { on_punch = function(self, hitter, tflp, tool_capabilities, dir) - -- cannot punch spamming + -- no punch punch spamming if tflp < 0.45 then return end @@ -1453,9 +1442,7 @@ minetest.register_entity(name, { local v = self.object:getvelocity() local r = 1.4 - math.min(punch_interval, 1.4) - --local r = self.recovery_time local kb = r * 5 - --local kb = self.knock_back self.object:setvelocity({ x = dir.x * kb, @@ -1464,12 +1451,6 @@ minetest.register_entity(name, { }) self.pause_timer = r - --set_animation(self, "stand") - --self.state = "nada" -- temporary state - - --minetest.after(r, function() - --self.state = "stand" - --end) end -- attack puncher and call other mobs for help @@ -1562,7 +1543,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, return end - -- spawn mob half block higher then ground + -- spawn mob half block higher than ground pos.y = pos.y - 0.5 minetest.add_entity(pos, name) --print ("Spawned "..name.." at "..minetest.pos_to_string(pos).." on "..node.name.." near "..neighbors[1]) @@ -1608,6 +1589,7 @@ function mobs:explosion(pos, radius, fire, smoke, sound) }) end + pos = vector.round(pos) -- voxelmanip doesn't work properly unless pos is rounded ?!?! local vm = VoxelManip() local minp, maxp = vm:read_from_map(vector.subtract(pos, radius), vector.add(pos, radius)) local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) @@ -1663,10 +1645,9 @@ function mobs:explosion(pos, radius, fire, smoke, sound) minetest.set_node(p, {name = "fire:basic_flame"}) else minetest.set_node(p, {name = "air"}) - end - - if smoke > 0 then - effect(p, 2, "tnt_smoke.png", 5) + if smoke > 0 then + effect(p, 2, "tnt_smoke.png", 5) + end end end end diff --git a/bunny.lua b/bunny.lua index 8c477b6..2c48c50 100644 --- a/bunny.lua +++ b/bunny.lua @@ -40,7 +40,7 @@ mobs:register_mob("mobs:bunny", { }, follow = {"farming:carrot", "farming_plus:carrot_item"}, view_range = 8, - replace_rate = 80, + replace_rate = 10, replace_what = {"farming:carrot_7", "farming:carrot_8", "farming_plus:carrot"}, replace_with = "air", on_rightclick = function(self, clicker) diff --git a/cow.lua b/cow.lua index 5d8cebb..597e76e 100644 --- a/cow.lua +++ b/cow.lua @@ -46,7 +46,7 @@ mobs:register_mob("mobs:cow", { }, follow = "farming:wheat", view_range = 7, - replace_rate = 50, + replace_rate = 10, replace_what = {"default:grass_3", "default:grass_4", "default:grass_5", "farming:wheat_8"}, replace_with = "air", on_rightclick = function(self, clicker) diff --git a/oerkki.lua b/oerkki.lua index 4f749dd..a4cb88f 100644 --- a/oerkki.lua +++ b/oerkki.lua @@ -44,7 +44,7 @@ mobs:register_mob("mobs:oerkki", { speed_normal = 15, speed_run = 15, }, - replace_rate = 40, + replace_rate = 5, replace_what = {"default:torch"}, replace_with = "air", replace_offset = -1, diff --git a/sheep.lua b/sheep.lua index a965fd9..a7574fb 100644 --- a/sheep.lua +++ b/sheep.lua @@ -47,7 +47,7 @@ for _, col in ipairs(all_colours) do }, follow = {"farming:wheat", "default:grass_5"}, view_range = 8, - replace_rate = 50, + replace_rate = 10, replace_what = {"default:grass_3", "default:grass_4", "default:grass_5", "farming:wheat_8"}, replace_with = "air", replace_offset = -1,