diff --git a/mods/mobs/README.txt b/mods/mobs/README.txt index 39b57eca..4d108250 100755 --- a/mods/mobs/README.txt +++ b/mods/mobs/README.txt @@ -29,6 +29,9 @@ This mod contains the following additions: Changelog: beta- Npc mob added, kills monsters, attacks player when punched, right click with food to heal or gold lump for drop +1.09- reworked breeding routine, added mob rotation value, added footstep feature, added jumping mobs with sounds feature, added magic lasso for picking up animals +1.08- Mob throwing attack has been rehauled so that they can damage one another, also drops and on_die function added +1.07- Npc's can now be set to follow player or stand by using self.order and self.owner variables 1.06- Changed recovery times after breeding, and time taken to grow up (can be sped up by feeding baby animal) 1.05- Added ExeterDad's bunny's which can be picked up and tamed with 4 carrots from farming redo or farming_plus, also shears added to get wool from sheep and lastly Jordach/BSD's kitten 1.04- Added mating for sheep, cows and hogs... feed animals to make horny and hope for a baby which is half size, will grow up quick though :) diff --git a/mods/mobs/api.lua b/mods/mobs/api.lua index 61804991..bdee7e89 100755 --- a/mods/mobs/api.lua +++ b/mods/mobs/api.lua @@ -1,13 +1,14 @@ --- Mobs Api (2nd April 2015) +-- Mobs Api (11th April 2015) mobs = {} mobs.mod = "redo" -- Do mobs spawn in protected areas (0=yes, 1=no) mobs.protected = 0 --- Initial check to see if damage is enabled and peaceful mode active +-- Initial settings check local damage_enabled = minetest.setting_getbool("enable_damage") local peaceful_only = minetest.setting_getbool("only_peaceful_mobs") +local enable_blood = minetest.setting_getbool("mobs_enable_blood") or true function mobs:register_mob(name, def) minetest.register_entity(name, { @@ -15,7 +16,12 @@ function mobs:register_mob(name, def) owner = def.owner, order = def.order or "", - +on_die = def.on_die, +jump_height = def.jump_height or 6, +jump_chance = def.jump_chance or 0, +footstep = def.footstep, +rotate = def.rotate or 0, -- 0=front, 1.5=side, 3.0=back, 4.5=side2 +lifetimer = def.lifetimer or 600, hp_min = def.hp_min or 5, hp_max = def.hp_max or 10, physical = true, @@ -23,19 +29,19 @@ function mobs:register_mob(name, def) visual = def.visual, visual_size = def.visual_size or {x=1, y=1}, mesh = def.mesh, - makes_footstep_sound = def.makes_footstep_sound, + makes_footstep_sound = def.makes_footstep_sound or true, view_range = def.view_range or 5, - walk_velocity = def.walk_velocity, - run_velocity = def.run_velocity, + walk_velocity = def.walk_velocity or 1, + run_velocity = def.run_velocity or 2, damage = def.damage, light_damage = def.light_damage, water_damage = def.water_damage, lava_damage = def.lava_damage, fall_damage = def.fall_damage or 1, fall_speed = def.fall_speed or -10, -- must be lower than -2 - drops = def.drops, + drops = def.drops or {}, armor = def.armor, - drawtype = def.drawtype, + --drawtype = def.drawtype, on_rightclick = def.on_rightclick, type = def.type, attack_type = def.attack_type, @@ -60,17 +66,11 @@ function mobs:register_mob(name, def) replace_what = def.replace_what, replace_with = def.replace_with, replace_offset = def.replace_offset or 0, - - stimer = 0, timer = 0, env_damage_timer = 0, -- only if state = "attack" attack = {player=nil, dist=nil}, state = "stand", - v_start = false, - old_y = nil, - lifetimer = 600, tamed = false, - last_state = nil, pause_timer = 0, horny = false, hornytimer = 0, @@ -80,7 +80,8 @@ function mobs:register_mob(name, def) do_attack = function(self, player, dist) if self.state ~= "attack" then if math.random(0,100) < 90 and self.sounds.war_cry then - minetest.sound_play(self.sounds.war_cry,{ object = self.object }) + minetest.sound_play(self.sounds.war_cry,{object = self.object}) + print ("attack sound") end self.state = "attack" self.attack.player = player @@ -90,10 +91,8 @@ function mobs:register_mob(name, def) set_velocity = function(self, v) if not v then v = 0 end -- added - local yaw = self.object:getyaw() - if self.drawtype == "side" then - yaw = yaw+(math.pi/2) - end + if def.drawtype and def.drawtype == "side" then self.rotate = 1.5 end + local yaw = self.object:getyaw() + self.rotate local x = math.sin(yaw) * -v local z = math.cos(yaw) * v self.object:setvelocity({x=x, y=self.object:getvelocity().y, z=z}) @@ -106,10 +105,7 @@ function mobs:register_mob(name, def) --[[ in_fov = function(self,pos) -- checks if POS is in self's FOV - local yaw = self.object:getyaw() - if self.drawtype == "side" then - yaw = yaw+(math.pi/2) - end + 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) @@ -168,29 +164,31 @@ function mobs:register_mob(name, def) if self.type == "monster" and peaceful_only then self.object:remove() + return end - - self.lifetimer = self.lifetimer - dtime - if self.lifetimer <= 0 and not self.tamed and self.type ~= "npc" then - local player_count = 0 - for _,obj in ipairs(minetest.get_objects_inside_radius(self.object:getpos(), 10)) do - if obj:is_player() then - player_count = player_count + 1 - break -- only really need 1 player to be found + + -- if lifetimer run out and not npc, tamed or attacking then remove mob + if self.type ~= "npc" and not self.tamed then + self.lifetimer = self.lifetimer - dtime + if self.lifetimer <= 0 and self.state ~= "attack" then + for _,obj in ipairs(minetest.get_objects_inside_radius(self.object:getpos(), 10)) do + if obj:is_player() then + minetest.log("action","lifetimer expired, removed mob "..self.name) + self.object:remove() + return + end end end - if player_count == 0 and self.state ~= "attack" then - minetest.log("action","lifetimer expired, removed mob "..self.name) - self.object:remove() - return - end end -- check for mob drop/replace (used for chicken egg and sheep eating grass/wheat) if self.replace_rate and math.random(1,self.replace_rate) == 1 and self.child == false then local pos = self.object:getpos() ; pos.y = pos.y + self.replace_offset + if self.footstep and self.object:getvelocity().y == 0 then minetest.set_node(pos, {name = self.footstep}) end if #minetest.find_nodes_in_area(pos,pos,self.replace_what) > 0 - and self.object:getvelocity().y == 0 and self.state == "stand" then + and self.object:getvelocity().y == 0 + and self.replace_what + and self.state == "stand" then minetest.set_node(pos, {name = self.replace_with}) end end @@ -216,8 +214,7 @@ function mobs:register_mob(name, def) self.old_y = self.object:getpos().y end - -- if pause state then this is where the loop ends - -- pause is only set after a monster is hit + -- knock back timer if self.pause_timer > 0 then self.pause_timer = self.pause_timer - dtime if self.pause_timer < 1 then @@ -226,6 +223,7 @@ function mobs:register_mob(name, def) return end + -- attack timer self.timer = self.timer + dtime if self.state ~= "attack" then if self.timer < 1 then @@ -234,7 +232,7 @@ function mobs:register_mob(name, def) self.timer = 0 end - if self.sounds and self.sounds.random and math.random(1, 100) <= 1 then + if self.sounds.random and math.random(1, 100) <= 1 then minetest.sound_play(self.sounds.random, {object = self.object}) end @@ -268,6 +266,22 @@ function mobs:register_mob(name, def) check_for_death(self) end + local do_jump = function(self) + local pos = self.object:getpos() + pos.y = pos.y - (-self.collisionbox[2] + self.collisionbox[5]) + local nod = minetest.get_node(pos) + if not nod or not minetest.registered_nodes[nod.name] + or minetest.registered_nodes[nod.name].walkable == false then return end + local v = self.object:getvelocity() + v.y = self.jump_height + if self.following then v.y = v.y + 1 end + self.object:setvelocity(v) + if self.sounds.jump then + minetest.sound_play(self.sounds.jump, {object = self.object}) + end + end + + -- environmental damage timer self.env_damage_timer = self.env_damage_timer + dtime if self.state == "attack" and self.env_damage_timer > 1 then self.env_damage_timer = 0 @@ -276,7 +290,7 @@ function mobs:register_mob(name, def) do_env_damage(self) end - -- FIND SOMEONE TO ATTACK + -- find someone to attack if self.type == "monster" and damage_enabled and self.state ~= "attack" then local s = self.object:getpos() @@ -314,7 +328,7 @@ function mobs:register_mob(name, def) end end - -- NPC FIND A MONSTER TO ATTACK + -- npc, find monster to attack if self.type == "npc" and self.attacks_monsters and self.state ~= "attack" then local s = self.object:getpos() local obj = nil @@ -357,25 +371,17 @@ function mobs:register_mob(name, def) -- if animal is horny, find another same animal who is horny and mate if self.horny == true and self.hornytimer <= 40 then - local pos = self.object:getpos() - effect(pos, 4, "heart.png") + local pos = self.object:getpos() ; pos.y = pos.y + 1 + effect(pos, 4, "heart.png") ; pos.y = pos.y - 1 local ents = minetest.get_objects_inside_radius(pos, self.view_range) local num = 0 local ent = nil for i,obj in ipairs(ents) do - ent = obj:get_luaentity() if ent and ent.name == self.name and ent.horny == true and ent.hornytimer <= 40 then num = num + 1 end - if num > 1 then - self.following = ent - ent.following = self - self.horny = false - self.hornytimer = 0 - self.following = nil - ent.horny = false - ent.following = nil - ent.hornytimer = 0 + self.hornytimer = 41 + ent.hornytimer = 41 minetest.after(7, function(dtime) local mob = minetest.add_entity(pos, self.name) local ent2 = mob:get_luaentity() @@ -399,6 +405,7 @@ function mobs:register_mob(name, def) end end + -- find player to follow if (self.follow ~= "" 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 @@ -416,18 +423,16 @@ function mobs:register_mob(name, def) -- npc stop following player if not owner if self.following and self.type == "npc" and self.owner and self.owner ~= self.following:get_player_name() then self.following = nil - self.v_start = false end else -- stop following player if not holding specific item if self.following and self.following.is_player and self.following:get_wielded_item():get_name() ~= self.follow then self.following = nil - self.v_start = false end end + -- follow player or mob if self.following then - local s = self.object:getpos() local p @@ -441,13 +446,9 @@ function mobs:register_mob(name, def) local 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 = nil - self.v_start = false else local vec = {x=p.x-s.x, y=p.y-s.y, z=p.z-s.z} - local yaw = math.atan(vec.z/vec.x)+math.pi/2 - if self.drawtype == "side" then - yaw = yaw+(math.pi/2) - end + local yaw = (math.atan(vec.z/vec.x)+math.pi/2) + self.rotate if p.x > s.x then yaw = yaw+math.pi end @@ -455,23 +456,17 @@ function mobs:register_mob(name, def) -- anyone but standing npc's can move along if dist > 2 and self.order ~= "stand" then - if not self.v_start then - self.v_start = true - self.set_velocity(self, self.walk_velocity) - else - if self.jump and self.get_velocity(self) <= 0.5 and self.object:getvelocity().y == 0 then - local v = self.object:getvelocity() - v.y = 7 -- 6/6.5 (in older api.lua version) - self.object:setvelocity(v) - end - self.set_velocity(self, self.walk_velocity) + if (self.jump and self.get_velocity(self) <= 0.5 and self.object:getvelocity().y == 0) + or (self.object:getvelocity().y == 0 and self.jump_chance > 0) then + do_jump(self) + end + self.set_velocity(self, self.walk_velocity) + if self.walk_chance ~= 0 then + self:set_animation("walk") end - self:set_animation("walk") else - self.v_start = false self.set_velocity(self, 0) self:set_animation("stand") - end return end @@ -499,10 +494,7 @@ function mobs:register_mob(name, def) if lp ~= nil then local vec = {x=lp.x-s.x, y=lp.y-s.y, z=lp.z-s.z} - yaw = math.atan(vec.z/vec.x)+math.pi/2 - if self.drawtype == "side" then - yaw = yaw+(math.pi/2) - end + yaw = (math.atan(vec.z/vec.x)+math.pi/2) + self.rotate if lp.x > s.x then yaw = yaw+math.pi end @@ -521,11 +513,17 @@ function mobs:register_mob(name, def) self.state = "stand" self:set_animation("stand") else - if math.random(1, 100) <= self.walk_chance then + if self.walk_chance ~= 0 and math.random(1, 100) <= self.walk_chance then self.set_velocity(self, self.walk_velocity) self.state = "walk" self.set_animation(self, "walk") end + + -- jumping mobs only + if self.jump_chance ~= 0 and math.random(1, 100) <= self.jump_chance then + do_jump(self) + self.set_velocity(self, self.walk_velocity) + end end elseif self.state == "walk" then @@ -534,10 +532,9 @@ function mobs:register_mob(name, def) self.object:setyaw(self.object:getyaw()+((math.random(0,360)-180)/180*math.pi)) end if self.jump and self.get_velocity(self) <= 0.5 and self.object:getvelocity().y == 0 then - local v = self.object:getvelocity() - v.y = 5 - self.object:setvelocity(v) + do_jump(self) end + self:set_animation("walk") self.set_velocity(self, self.walk_velocity) if math.random(1, 100) <= 30 then @@ -545,7 +542,7 @@ function mobs:register_mob(name, def) self.state = "stand" self:set_animation("stand") end - elseif self.state == "attack" and self.attack_type == "kamicaze" then + elseif self.state == "attack" and self.attack_type == "kamicaze" then --Modif MFF, attack type Creeper if not self.attack.player or not self.attack.player:is_player() then self.state = "stand" self:set_animation("stand") @@ -684,7 +681,6 @@ function mobs:register_mob(name, def) local dist = ((p.x-s.x)^2 + (p.y-s.y)^2 + (p.z-s.z)^2)^0.5 if dist > self.view_range or self.attack.player:get_hp() <= 0 then self.state = "stand" - self.v_start = false self.set_velocity(self, 0) self.attack = {player=nil, dist=nil} self:set_animation("stand") @@ -694,31 +690,22 @@ function mobs:register_mob(name, def) end local vec = {x=p.x-s.x, y=p.y-s.y, z=p.z-s.z} - local yaw = math.atan(vec.z/vec.x)+math.pi/2 - if self.drawtype == "side" then - yaw = yaw+(math.pi/2) - end + local yaw = (math.atan(vec.z/vec.x)+math.pi/2) + self.rotate if p.x > s.x then yaw = yaw+math.pi end self.object:setyaw(yaw) if self.attack.dist > 2 then - if not self.v_start then - self.v_start = true - self.set_velocity(self, self.run_velocity) - else - if self.jump and self.get_velocity(self) <= 0.5 and self.object:getvelocity().y == 0 then - local v = self.object:getvelocity() - v.y = 5 - self.object:setvelocity(v) - end - self.set_velocity(self, self.run_velocity) + -- jump attack + if (self.jump and self.get_velocity(self) <= 0.5 and self.object:getvelocity().y == 0) + or (self.object:getvelocity().y == 0 and self.jump_chance > 0) then + do_jump(self) end + self.set_velocity(self, self.run_velocity) self:set_animation("run") else self.set_velocity(self, 0) self:set_animation("punch") - self.v_start = false if self.timer > 1 then self.timer = 0 local p2 = p @@ -726,7 +713,7 @@ function mobs:register_mob(name, def) p2.y = p2.y + 1.5 s2.y = s2.y + 1.5 if minetest.line_of_sight(p2,s2) == true then - if self.sounds and self.sounds.attack then + if self.sounds.attack then minetest.sound_play(self.sounds.attack, {object = self.object}) end self.attack.player:punch(self.object, 1.0, { @@ -755,7 +742,6 @@ function mobs:register_mob(name, def) local dist = ((p.x-s.x)^2 + (p.y-s.y)^2 + (p.z-s.z)^2)^0.5 if dist > self.view_range or self.attack.player:get_hp() <= 0 then self.state = "stand" - self.v_start = false self.set_velocity(self, 0) if self.type ~= "npc" then self.attack = {player=nil, dist=nil} @@ -767,22 +753,19 @@ function mobs:register_mob(name, def) end local vec = {x=p.x-s.x, y=p.y-s.y, z=p.z-s.z} - local yaw = math.atan(vec.z/vec.x)+math.pi/2 - if self.drawtype == "side" then - yaw = yaw+(math.pi/2) - end + local yaw = (math.atan(vec.z/vec.x)+math.pi/2) + self.rotate if p.x > s.x then yaw = yaw+math.pi end self.object:setyaw(yaw) self.set_velocity(self, 0) - if self.timer > self.shoot_interval and math.random(1, 100) <= 60 then + if self.shoot_interval and self.timer > self.shoot_interval and math.random(1, 100) <= 60 then self.timer = 0 self:set_animation("punch") - if self.sounds and self.sounds.attack then + if self.sounds.attack then minetest.sound_play(self.sounds.attack, {object = self.object}) end @@ -803,6 +786,7 @@ function mobs:register_mob(name, def) on_activate = function(self, staticdata, dtime_s) local pos = self.object:getpos() self.object:set_hp( math.random(self.hp_min, self.hp_max) ) -- set HP + self.oldhp = self.object:get_hp(self) self.object:set_armor_groups({fleshy=self.armor}) self.object:setacceleration({x=0, y= self.fall_speed, z=0}) self.state = "stand" @@ -811,14 +795,14 @@ function mobs:register_mob(name, def) if self.type == "monster" and peaceful_only then self.object:remove() end - if self.type ~= "npc" then - self.lifetimer = 600 - dtime_s - end +-- if self.type ~= "npc" then +-- self.lifetimer = self.lifetimer - dtime_s +-- end if staticdata then local tmp = minetest.deserialize(staticdata) if tmp then if tmp.lifetimer then - self.lifetimer = tmp.lifetimer - dtime_s + self.lifetimer = tmp.lifetimer -- - dtime_s end if tmp.tamed then self.tamed = tmp.tamed @@ -853,9 +837,9 @@ function mobs:register_mob(name, def) if self.type == "monster" and self.tamed == true then self.type = "npc" end - if self.lifetimer <= 0 and not self.tamed and self.type ~= "npc" then - self.object:remove() - end +-- if self.lifetimer <= 0 and not self.tamed and self.type ~= "npc" then +-- self.object:remove() +-- end end, get_staticdata = function(self) @@ -911,8 +895,8 @@ function mobs:register_mob(name, def) --blood_particles local pos = self.object:getpos() - pos.y = pos.y + (self.collisionbox[2] + self.collisionbox[5]) / 2 - if self.blood_amount > 0 and pos then + pos.y = pos.y + (-self.collisionbox[2] + self.collisionbox[5]) / 2 + if self.blood_amount > 0 and pos and enable_blood == true then effect(pos, self.blood_amount, self.blood_texture) end @@ -920,18 +904,13 @@ function mobs:register_mob(name, def) -- https://github.com/BlockMen/pyramids local kb = self.knock_back local r = self.recovery_time - + local ykb = 2 + local v = self.object:getvelocity() if tflp < tool_capabilities.full_punch_interval then kb = kb * ( tflp / tool_capabilities.full_punch_interval ) r = r * ( tflp / tool_capabilities.full_punch_interval ) end - - local ykb=2 - local v = self.object:getvelocity() - if v.y ~= 0 then - ykb = 0 - end - + if v.y ~= 0 then ykb = 0 end self.object:setvelocity({x=dir.x*kb,y=ykb,z=dir.z*kb}) self.pause_timer = r @@ -958,12 +937,13 @@ function mobs:register_mob(name, def) end mobs.spawning_mobs = {} -function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_object_count, max_height) + +function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, interval, chance, active_object_count, min_height, max_height) mobs.spawning_mobs[name] = true minetest.register_abm({ nodenames = nodes, - neighbors = {"air"}, - interval = 30, + neighbors = neighbors, + interval = interval, chance = chance, action = function(pos, node, _, active_object_count_wider) @@ -985,7 +965,7 @@ function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_o -- check if light and height levels are ok to spawn local light = minetest.get_node_light(pos) if not light or light > max_light or light < min_light - or pos.y > max_height then + or pos.y > max_height or pos.y < min_height then return end @@ -1005,11 +985,17 @@ function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_o -- spawn mob half block higher pos.y = pos.y - 0.5 minetest.add_entity(pos, name) + --print ("Spawned "..name.." at "..minetest.pos_to_string(pos)) end }) end +-- compatibility with older mob registration +function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_object_count, max_height) + mobs:spawn_specific(name, nodes, {"air"}, min_light, max_light, 30, chance, active_object_count, -32000, max_height) +end + -- particle effects function effect(pos, amount, texture) minetest.add_particlespawner({ @@ -1031,7 +1017,14 @@ end -- on mob death drop items function check_for_death(self) - if self.object:get_hp() > 0 then return end + local hp = self.object:get_hp() + if hp > 0 then + if self.sounds.damage ~= nil and hp < self.oldhp then + minetest.sound_play(self.sounds.damage,{object = self.object}) + self.oldhp = hp + end + return + end local pos = self.object:getpos() pos.y = pos.y + 0.5 -- drop items half a block higher self.object:remove() @@ -1045,10 +1038,14 @@ function check_for_death(self) end end if self.sounds.death ~= nil then - minetest.sound_play(self.sounds.death,{object = self.object,}) + minetest.sound_play(self.sounds.death,{object = self.object}) + end + if self.on_die then + pos.y = pos.y - 0.5 + self.on_die(self, pos) end end - +-- Modif MFF "fonction TNT" des creepers /DEBUT function do_tnt_physics(tnt_np,tntr,entity) local objs = minetest.get_objects_inside_radius(tnt_np, tntr) for k, obj in pairs(objs) do @@ -1068,9 +1065,10 @@ function do_tnt_physics(tnt_np,tntr,entity) end end end ---MODIFICATION MADE BY MFF +-- Modif MFF "fonction TNT" des creepers /FIN function mobs:register_arrow(name, def) + if not name or not def then return end -- errorcheck minetest.register_entity(name, { physical = false, visual = def.visual, @@ -1079,23 +1077,44 @@ function mobs:register_arrow(name, def) velocity = def.velocity, hit_player = def.hit_player, hit_node = def.hit_node, + hit_mob = def.hit_mob, + drop = def.drop or false, collisionbox = {0,0,0,0,0,0}, -- remove box around arrows on_step = function(self, dtime) + self.timer = (self.timer or 0) + 1 + if self.timer > 150 then self.object:remove() return end + local engage = 10 - (self.velocity / 2) -- clear entity before arrow becomes active local pos = self.object:getpos() local node = minetest.get_node(self.object:getpos()).name - if minetest.registered_nodes[node].walkable then + -- hit node you can walk on + if self.hit_node and node and minetest.registered_nodes[node] and minetest.registered_nodes[node].walkable then self.hit_node(self, pos, node) + if self.drop == true then + pos.y = pos.y + 1 ; self.lastpos = (self.lastpos or pos) + minetest.add_item(self.lastpos, self.object:get_luaentity().name) + end self.object:remove() return end - for _,player in pairs(minetest.get_objects_inside_radius(pos, 1)) do - if player:is_player() then - self.hit_player(self, player) - self.object:remove() - return + if self.hit_player or self.hit_mob then + for _,player in pairs(minetest.get_objects_inside_radius(pos, 1)) do + -- hit player + if self.hit_player and self.timer > engage and player:is_player() then + self.hit_player(self, player) + self.object:remove() + return + end + -- hit mob + if self.hit_mob and self.timer > engage and player:get_luaentity().name ~= self.object:get_luaentity().name + and player:get_luaentity().name ~= "__builtin:item" then + self.hit_mob(self, player) + self.object:remove() + return + end end + self.lastpos = pos end end }) diff --git a/mods/mobs/bee.lua b/mods/mobs/bee.lua index a150c422..0a5a0653 100755 --- a/mods/mobs/bee.lua +++ b/mods/mobs/bee.lua @@ -7,12 +7,13 @@ mobs:register_mob("mobs:bee", { -- it is aggressive passive = true, -- health & armor - hp_min = 1, hp_max = 2, armor = 200, + hp_min = 1, + hp_max = 2, + armor = 200, -- textures and model collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.2, 0.2}, visual = "mesh", mesh = "mobs_bee.x", - drawtype = "front", textures = { {"mobs_bee.png"}, }, @@ -45,7 +46,10 @@ mobs:register_mob("mobs:bee", { }, -- right click to pick up bee on_rightclick = function(self, clicker) - if clicker:is_player() and clicker:get_inventory() and clicker:get_inventory():room_for_item("main", "mobs:bee") then + if clicker:is_player() + and clicker:get_inventory() + and self.child == false + and clicker:get_inventory():room_for_item("main", "mobs:bee") then clicker:get_inventory():add_item("main", "mobs:bee") self.object:remove() end @@ -53,18 +57,17 @@ mobs:register_mob("mobs:bee", { }) -- spawn on group:flowers between 4 and 20 light, 1 in 5000 chance, 1 bee in area up to 31000 in height mobs:register_spawn("mobs:bee", {"group:flower"}, 20, 4, 5000, 1, 31000) - -- register spawn egg mobs:register_egg("mobs:bee", "Bee", "mobs_bee_inv.png", 0) --- Honey +-- honey minetest.register_craftitem("mobs:honey", { description = "Honey", inventory_image = "mobs_honey_inv.png", on_use = minetest.item_eat(6), }) --- Beehive (when placed, bee appears) +-- beehive (when placed spawns bee) minetest.register_node("mobs:beehive", { description = "Beehive", drawtype = "plantlike", @@ -93,7 +96,7 @@ minetest.register_craft({ } }) --- Honey Block +-- honey block minetest.register_node("mobs:honey_block", { description = "Honey Block", tiles = {"mobs_honey_block.png"}, diff --git a/mods/mobs/bunny.lua b/mods/mobs/bunny.lua index 7f3ca77f..51d56dbf 100755 --- a/mods/mobs/bunny.lua +++ b/mods/mobs/bunny.lua @@ -7,12 +7,13 @@ mobs:register_mob("mobs:bunny", { -- is it aggressive passive = true, -- health & armor - hp_min = 3, hp_max = 6, armor = 200, + hp_min = 3, + hp_max = 6, + armor = 200, -- textures and model collisionbox = {-0.268, -0.5, -0.268, 0.268, 0.167, 0.268}, visual = "mesh", mesh = "mobs_bunny.b3d", - drawtype = "front", textures = { {"mobs_bunny_grey.png"}, {"mobs_bunny_brown.png"}, @@ -31,7 +32,7 @@ mobs:register_mob("mobs:bunny", { }, -- damaged by water_damage = 1, - lava_damage = 1, + lava_damage = 4, light_damage = 0, -- model animation animation = { @@ -48,9 +49,9 @@ mobs:register_mob("mobs:bunny", { replace_with = "air", -- right click to pick up rabbit on_rightclick = function(self, clicker) - local item = clicker:get_wielded_item() - if item:get_name() == "farming_plus:carrot_item" or item:get_name() == "farming:carrot" then + if item:get_name() == "farming_plus:carrot_item" + or item:get_name() == "farming:carrot" then if not minetest.setting_getbool("creative_mode") then item:take_item() clicker:set_wielded_item(item) @@ -62,7 +63,11 @@ mobs:register_mob("mobs:bunny", { end return end - if clicker:is_player() and clicker:get_inventory() and clicker:get_inventory():room_for_item("main", "mobs:bunny") then + + if clicker:is_player() + and clicker:get_inventory() + and self.child == false + and clicker:get_inventory():room_for_item("main", "mobs:bunny") then clicker:get_inventory():add_item("main", "mobs:bunny") self.object:remove() end diff --git a/mods/mobs/chicken.lua b/mods/mobs/chicken.lua index ee4c0c16..9b7695c5 100755 --- a/mods/mobs/chicken.lua +++ b/mods/mobs/chicken.lua @@ -7,12 +7,13 @@ mobs:register_mob("mobs:chicken", { -- is it aggressive passive = true, -- health & armor - hp_min = 4, hp_max = 8, armor = 200, + hp_min = 4, + hp_max = 8, + armor = 200, -- textures and model collisionbox = {-0.3, -0.75, -0.3, 0.3, 0.1, 0.3}, visual = "mesh", mesh = "mobs_chicken.x", - drawtype = "front", textures = { {"mobs_chicken.png", "mobs_chicken.png", "mobs_chicken.png", "mobs_chicken.png", "mobs_chicken.png", "mobs_chicken.png", "mobs_chicken.png", "mobs_chicken.png", "mobs_chicken.png"}, @@ -52,7 +53,8 @@ mobs:register_mob("mobs:chicken", { walk_end = 40, }, -- follows wheat - follow = "farming:seed_wheat", view_range = 8, + follow = "farming:seed_wheat", + view_range = 8, -- replace air with egg (lay) replace_rate = 2000, replace_what = {"air"}, @@ -60,43 +62,42 @@ mobs:register_mob("mobs:chicken", { -- right click to pick up chicken on_rightclick = function(self, clicker) local tool = clicker:get_wielded_item() - - if tool:get_name() == "farming:seed_wheat" then -- and self.gotten then + if tool:get_name() == "farming:seed_wheat" then if not minetest.setting_getbool("creative_mode") then tool:take_item(1) clicker:set_wielded_item(tool) end - self.food = (self.food or 0) + 1 if self.child == true then self.hornytimer = self.hornytimer + 10 + return end + self.food = (self.food or 0) + 1 if self.food >= 8 then self.food = 0 - if self.child == false then self.horny = true end - self.gotten = false -- reset + if self.hornytimer == 0 then + self.horny = true + end self.tamed = true minetest.sound_play("mobs_chicken", {object = self.object,gain = 1.0,max_hear_distance = 16,loop = false,}) end - return tool - else - if clicker:is_player() and clicker:get_inventory() and clicker:get_inventory():room_for_item("main", "mobs:chicken") then - clicker:get_inventory():add_item("main", "mobs:chicken") - self.object:remove() - end + return end - if clicker:is_player() and clicker:get_inventory() and self.child == false + + if clicker:is_player() + and clicker:get_inventory() + and self.child == false and clicker:get_inventory():room_for_item("main", "mobs:chicken") then clicker:get_inventory():add_item("main", "mobs:chicken") self.object:remove() end end, }) --- spawn on default or bamboo grass between 8 and 20 light, 1 in 9000 change, 1 chicken in area up to 31000 in height +-- spawn on default or bamboo grass between 8 and 20 light, 1 in 10000 change, 1 chicken in area up to 31000 in height mobs:register_spawn("mobs:chicken", {"default:dirt_with_grass"}, 20, 0, 10000, 1, 31000) -- register spawn egg mobs:register_egg("mobs:chicken", "Chicken", "mobs_chicken_inv.png", 0) --- Egg +-- egg minetest.register_node("mobs:egg", { description = "Chicken Egg", tiles = {"mobs_chicken_egg.png"}, @@ -120,7 +121,7 @@ minetest.register_node("mobs:egg", { end }) --- Fried egg +-- fried egg minetest.register_craftitem("mobs:chicken_egg_fried", { description = "Fried Egg", inventory_image = "mobs_chicken_egg_fried.png", @@ -133,7 +134,7 @@ minetest.register_craft({ output = "mobs:chicken_egg_fried", }) --- Chicken (raw and cooked) +-- chicken (raw and cooked) minetest.register_craftitem("mobs:chicken_raw", { description = "Raw Chicken", inventory_image = "mobs_chicken_raw.png", diff --git a/mods/mobs/cow.lua b/mods/mobs/cow.lua index 32f98ce9..2767bc00 100755 --- a/mods/mobs/cow.lua +++ b/mods/mobs/cow.lua @@ -9,15 +9,16 @@ mobs:register_mob("mobs:cow", { attack_type = "dogfight", damage = 5, -- health & armor - hp_min = 20, hp_max = 30, armor = 200, + hp_min = 20, + hp_max = 30, + armor = 200, -- textures and model collisionbox = {-0.4, -0.01, -0.4, 0.4, 1, 0.4}, visual = "mesh", mesh = "mobs_cow.x", - drawtype = "front", textures = { {"mobs_cow.png"}, - {"mobs_cow_brown.png"}, -- dé-commenter quand "mobs_cow_brown.png" sera compatible + --{"mobs_cow_brown.png"}, -- dé-commenter quand "mobs_cow_brown.png" sera compatible }, blood_texture = "mobs_blood.png", visual_size = {x=1,y=1}, @@ -58,8 +59,11 @@ mobs:register_mob("mobs:cow", { -- right-click cow with empty bucket to get milk, then feed 8 wheat to replenish milk on_rightclick = function(self, clicker) local tool = clicker:get_wielded_item() - if tool:get_name() == "bucket:bucket_empty" and self.child == false then - if self.gotten then return end + if tool:get_name() == "bucket:bucket_empty" then + if self.gotten == true + or self.child == true then + return + end local inv = clicker:get_inventory() inv:remove_item("main", "bucket:bucket_empty") -- if room add bucket of milk to inventory, otherwise drop as item @@ -72,25 +76,39 @@ mobs:register_mob("mobs:cow", { end self.gotten = true -- milked end - if tool:get_name() == "farming:wheat" then -- and self.gotten then + + if tool:get_name() == "farming:wheat" then if not minetest.setting_getbool("creative_mode") then tool:take_item(1) clicker:set_wielded_item(tool) end - self.food = (self.food or 0) + 1 if self.child == true then self.hornytimer = self.hornytimer + 10 + return end + self.food = (self.food or 0) + 1 if self.food >= 8 then self.food = 0 - if self.child == false then self.horny = true end + if self.hornytimer == 0 then + self.horny = true + end self.gotten = false -- ready to be milked again self.tamed = true minetest.sound_play("mobs_cow", {object = self.object,gain = 1.0,max_hear_distance = 32,loop = false,}) end - return tool + return + end + + if tool:get_name() == "mobs:magic_lasso" + and clicker:is_player() + and clicker:get_inventory() + and self.child == false + and clicker:get_inventory():room_for_item("main", "mobs:cow") then + clicker:get_inventory():add_item("main", "mobs:cow") + self.object:remove() + tool:add_wear(3000) -- 22 uses + clicker:set_wielded_item(tool) end - end, }) -- spawn on default;green;prairie grass between 0 and 20 light, 1 in 11000 chance, 1 cow in area up to 31000 in height @@ -98,13 +116,13 @@ mobs:register_spawn("mobs:cow", {"default:dirt_with_grass"}, 20, 0, 10000, 1, 31 -- register spawn egg mobs:register_egg("mobs:cow", "Cow", "default_grass.png", 1) --- Leather +-- leather minetest.register_craftitem("mobs:leather", { description = "Leather", inventory_image = "mobs_leather.png", }) --- Bucket of Milk +-- bucket of milk minetest.register_craftitem("mobs:bucket_milk", { description = "Bucket of Milk", inventory_image = "mobs_bucket_milk.png", @@ -112,7 +130,7 @@ minetest.register_craftitem("mobs:bucket_milk", { on_use = minetest.item_eat(8, 'bucket:bucket_empty'), }) --- Cheese Wedge +-- cheese wedge minetest.register_craftitem("mobs:cheese", { description = "Cheese", inventory_image = "mobs_cheese.png", @@ -127,7 +145,7 @@ minetest.register_craft({ replacements = {{ "mobs:bucket_milk", "bucket:bucket_empty"}} }) --- Cheese Block +-- cheese block minetest.register_node("mobs:cheeseblock", { description = "Cheese Block", tiles = {"mobs_cheeseblock.png"}, diff --git a/mods/mobs/dirtmonster.lua b/mods/mobs/dirtmonster.lua index 3bc9e589..175d8dad 100755 --- a/mods/mobs/dirtmonster.lua +++ b/mods/mobs/dirtmonster.lua @@ -9,12 +9,13 @@ mobs:register_mob("mobs:dirt_monster", { attack_type = "dogfight", damage = 6, -- health & armor - hp_min = 25, hp_max = 30, armor = 90, + hp_min = 25, + hp_max = 30, + armor = 90, -- textures and model collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.9, 0.4}, visual = "mesh", mesh = "mobs_stone_monster.x", - drawtype = "front", textures = { {"mobs_dirt_monster.png"}, }, @@ -33,13 +34,9 @@ mobs:register_mob("mobs:dirt_monster", { -- drops dirt and coins when dead drops = { {name = "default:dirt", - chance = 1, - min = 3, - max = 5,}, + chance = 1, min = 3, max = 5,}, {name = "maptools:copper_coin", - chance = 2, - min = 2, - max = 8,}, + chance = 2, min = 2, max = 8,}, }, -- damaged by water_damage = 1, @@ -55,6 +52,6 @@ mobs:register_mob("mobs:dirt_monster", { }, }) -- spawn on normal;grey dirt between 0 and 5 light, 1 in 7000 change, 1 dirt monster in area up to 31000 in height -mobs:register_spawn("mobs:dirt_monster", {"default:dirt_with_grass"}, 3, -1, 9500, 1, 31000) +mobs:register_spawn("mobs:dirt_monster", {"default:dirt_with_grass"}, 5, -1, 9500, 1, 31000) -- register spawn egg mobs:register_egg("mobs:dirt_monster", "Dirt Monster", "default_dirt.png", 1) diff --git a/mods/mobs/dungeonmaster.lua b/mods/mobs/dungeonmaster.lua deleted file mode 100755 index f20db6b7..00000000 --- a/mods/mobs/dungeonmaster.lua +++ /dev/null @@ -1,133 +0,0 @@ - --- Dungeon Master by PilzAdam - --- Node which cannot be destroyed by DungeonMasters' fireballs -local excluded = {"nether:netherrack","default:obsidian_glass","default:obsidian", "default:obsidian_cooled", "default:bedrock", "doors:door_steel_b_1", "doors:door_steel_t_1", "doors:door_steel_b_2", "doors:door_steel_t_2","default:chest_locked"} - -mobs:register_mob("mobs:dungeon_master", { - -- animal, monster, npc, barbarian - type = "monster", - -- aggressive, shoots fireballs at player, deal 13 damages - passive = false, - damage = 13, - attack_type = "shoot", - shoot_interval = 2.5, - arrow = "mobs:fireball", - shoot_offset = 0, - -- health & armor - hp_min = 50, hp_max = 60, armor = 60, - -- textures and model - collisionbox = {-0.7, -0.01, -0.7, 0.7, 2.6, 0.7}, - visual = "mesh", - mesh = "mobs_dungeon_master.x", - drawtype = "front", - textures = { - {"mobs_dungeon_master.png"}, - {"mobs_dungeon_master_cobblestone.png"}, - {"mobs_dungeon_master_strangewhite.png"}, - }, - visual_size = {x=8, y=8}, - blood_texture = "mobs_blood.png", - -- sounds - makes_footstep_sound = true, - sounds = { - random = "mobs_dungeonmaster", - attack = "mobs_fireball", - }, - -- speed and jump - walk_velocity = 1, - run_velocity = 2, - jump = false, - view_range = 16, - -- drops mese or diamond when dead - drops = { - {name = "default:mese_crystal_fragment", - chance = 1, min = 1, max = 3,}, - {name = "default:diamond", - chance = 5, min = 1, max = 3,}, - {name = "default:mese_crystal", - chance = 2, min = 1, max = 3,}, - {name = "default:diamond_block", - chance = 30, min = 1, max = 1,}, - {name = "maptools:gold_coin", - chance = 15, min = 1, max = 2,}, - {name = "maptools:silver_coin", - chance = 1, min = 2, max = 10,}, - }, - -- damaged by - water_damage = 1, - lava_damage = 1, - light_damage = 0, - -- model animation - animation = { - stand_start = 0, stand_end = 19, - walk_start = 20, walk_end = 35, - punch_start = 36, punch_end = 48, - speed_normal = 15, speed_run = 15, - }, -}) --- spawn on stone between 20 and -1 light, 1 in 7000 chance, 1 dungeon master in area starting at -100 and below -mobs:register_spawn("mobs:dungeon_master", {"default:stone, nether:netherrack"}, 20, -1, 7000, 1, -100) --- register spawn egg -mobs:register_egg("mobs:dungeon_master", "Dungeon Master", "fire_basic_flame.png", 1) - --- Fireball (dungeon masters weapon) -mobs:register_arrow("mobs:fireball", { - visual = "sprite", - visual_size = {x=1, y=1}, - textures = {"mobs_fireball.png"}, - velocity = 5, - - -- direct hit, no fire... just plenty of pain - hit_player = function(self, player) - local s = self.object:getpos() - local p = player:getpos() - player:punch(self.object, 1.0, { - full_punch_interval=1.0, - damage_groups = {fleshy=13}, - }, 0) - end, - - -- node hit, bursts into flame (cannot blast through obsidian or protection redo mod items) - hit_node = function(self, pos, node) - for dx=-1,1 do - for dy=-1,1 do - for dz=-1,1 do - local p = {x=pos.x+dx, y=pos.y+dy, z=pos.z+dz} - local n = minetest.get_node(p).name - local excluding = minetest.get_item_group(n, "unbreakable") == 1 - or n:split(":")[1] == "nether" - or next(areas:getAreasAtPos(p)) ~= nil - for _,i in ipairs(excluded) do - if i == n then excluding = true end - end - --if p.y < -19600 and including and n:split(":")[1] == "nether" then - if excluding then - return - end - if n == "default:chest" then - meta = minetest.get_meta(p) - inv = meta:get_inventory() - for i = 1,32 do - m_stack = inv:get_stack("main",i) - obj = minetest.add_item(pos,m_stack) - if obj then - obj:setvelocity({x=math.random(-2,1), y=7, z=math.random(-2,1)}) - end - end - end - if minetest.registered_nodes[n].groups.flammable or math.random(1, 100) <= 30 then - minetest.set_node(p, {name="fire:basic_flame"}) - else - minetest.set_node(p, {name="air"}) - end - if n == "doors:door_wood_b_1" then - minetest.remove_node({x=p.x,y=p.y+1,z=p.z}) - elseif n == "doors:door_wood_t_1" then - minetest.remove_node({x=p.x,y=p.y-1,z=p.z}) - end - end - end - end - end -}) diff --git a/mods/mobs/init.lua b/mods/mobs/init.lua index d85b2324..b0023b4f 100755 --- a/mods/mobs/init.lua +++ b/mods/mobs/init.lua @@ -53,6 +53,22 @@ minetest.register_craft({ cooktime = 5, }) +-- Golden Lasso + +minetest.register_tool("mobs:magic_lasso", { + description = "Magic Lasso (right-click animal to put in inventory)", + inventory_image = "mobs_magic_lasso.png", +}) + +minetest.register_craft({ + output = "mobs:magic_lasso", + recipe = { + {"farming:string", "default:gold_lump", "farming:string"}, + {"default:gold_lump", "default:diamondblock", "default:gold_lump"}, + {"farming:string", "default:gold_lump", "farming:string"}, + } +}) + if minetest.setting_get("log_mods") then minetest.log("action", "mobs loaded") end diff --git a/mods/mobs/kitten.lua b/mods/mobs/kitten.lua index 5c7b01e2..b138a48a 100755 --- a/mods/mobs/kitten.lua +++ b/mods/mobs/kitten.lua @@ -7,7 +7,9 @@ mobs:register_mob("mobs:kitten", { -- is it aggressive passive = true, -- health & armor - hp_min = 4, hp_max = 8, armor = 200, + hp_min = 4, + hp_max = 8, + armor = 200, -- textures and model collisionbox = {-0.3, -0.3, -0.3, 0.3, 0.1, 0.3}, visual = "mesh", @@ -50,7 +52,8 @@ mobs:register_mob("mobs:kitten", { -- feed with raw fish to tame or right click to pick up on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() - if item:get_name() == "fishing:fish_raw" or item:get_name() == "ethereal:fish_raw" then + if item:get_name() == "fishing:fish_raw" + or item:get_name() == "ethereal:fish_raw" then if not minetest.setting_getbool("creative_mode") then item:take_item() clicker:set_wielded_item(item) @@ -63,11 +66,15 @@ mobs:register_mob("mobs:kitten", { end return end - if clicker:is_player() and clicker:get_inventory() and clicker:get_inventory():room_for_item("main", "mobs:kitten") then + + if clicker:is_player() + and clicker:get_inventory() + and self.child == false + and clicker:get_inventory():room_for_item("main", "mobs:kitten") then clicker:get_inventory():add_item("main", "mobs:kitten") self.object:remove() end - end + end, }) mobs:register_spawn("mobs:kitten", {"default:dirt_with_grass"}, 20, 0, 10000, 1, 31000) diff --git a/mods/mobs/lava_flan.lua b/mods/mobs/lava_flan.lua index 1b194da0..92f9497a 100755 --- a/mods/mobs/lava_flan.lua +++ b/mods/mobs/lava_flan.lua @@ -9,23 +9,23 @@ mobs:register_mob("mobs:lava_flan", { attack_type = "dogfight", damage = 5, -- health and armor - hp_min = 20, hp_max = 35, armor = 80, + hp_min = 20, + hp_max = 35, + armor = 80, -- textures and model collisionbox = {-0.5, -0.5, -0.5, 0.5, 1.5, 0.5}, visual = "mesh", mesh = "zmobs_lava_flan.x", - drawtype = "front", textures = { {"zmobs_lava_flan.png"}, }, blood_texture = "fire_basic_flame.png", visual_size = {x=1, y=1}, -- sounds - makes_footstep_sound = true, + makes_footstep_sound = false, sounds = { random = "mobs_lavaflan", war_cry = "mobs_lavaflan", - death = nil, }, -- speed and jump, sinks in water walk_velocity = 0.5, @@ -51,15 +51,19 @@ mobs:register_mob("mobs:lava_flan", { run_start = 20, run_end = 28, punch_start = 20, punch_end = 28, }, + on_die = function(self, pos) + minetest.set_node(pos, {name="fire:basic_flame"}) + end, }) -- spawns in lava between -1 and 20 light, 1 in 2000 chance, 3 in area below 31000 in height mobs:register_spawn("mobs:lava_flan", {"default:lava_source"}, 20, -1, 2500, 3, 31000) -- register spawn egg mobs:register_egg("mobs:lava_flan", "Lava Flan", "default_lava.png", 1) --- Lava Orb +-- lava orb minetest.register_craftitem("mobs:lava_orb", { description = "Lava orb", inventory_image = "zmobs_lava_orb.png", }) + minetest.register_alias("zmobs:lava_orb", "mobs:lava_orb") diff --git a/mods/mobs/mese_monster.lua b/mods/mobs/mese_monster.lua index fa626f7c..abd28ce6 100755 --- a/mods/mobs/mese_monster.lua +++ b/mods/mobs/mese_monster.lua @@ -12,7 +12,9 @@ mobs:register_mob("mobs:mese_monster", { arrow = "mobs:mese_arrow", shoot_offset = 2, -- health & armor - hp_min = 30, hp_max = 40, armor = 80, + hp_min = 30, + hp_max = 40, + armor = 80, -- textures and model collisionbox = {-0.5, -1.5, -0.5, 0.5, 0.5, 0.5}, visual = "mesh", @@ -21,10 +23,9 @@ mobs:register_mob("mobs:mese_monster", { {"zmobs_mese_monster.png"}, }, visual_size = {x=1, y=1}, - drawtype = "front", blood_texture = "default_mese_crystal_fragment.png", -- sounds - makes_footstep_sound = true, + makes_footstep_sound = false, sounds = { random = "mobs_mesemonster", }, @@ -33,6 +34,7 @@ mobs:register_mob("mobs:mese_monster", { walk_velocity = 0.5, run_velocity = 2, jump = true, + jump_height = 8, fall_damage = 0, fall_speed = -6, -- drops mese when dead @@ -64,28 +66,32 @@ mobs:register_spawn("mobs:mese_monster", {"default:stone", }, 20, -1, 7000, 1, - -- register spawn egg mobs:register_egg("mobs:mese_monster", "Mese Monster", "default_mese_block.png", 1) --- Mese Monster Crystal Shards (weapon) +-- mese arrow (weapon) mobs:register_arrow("mobs:mese_arrow", { visual = "sprite", visual_size = {x=.5, y=.5}, textures = {"default_mese_crystal_fragment.png"}, - velocity = 5, - - hit_player = function(self, player) - local s = self.object:getpos() - local p = player:getpos() + velocity = 6, + hit_player = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups = {fleshy=1}, + }, 0) + end, + + hit_mob = function(self, player) player:punch(self.object, 1.0, { full_punch_interval=1.0, damage_groups = {fleshy=9}, }, 0) end, - + hit_node = function(self, pos, node) end }) --- 9 mese crystal fragments = 1 mese crystal +-- 9x mese crystal fragments = 1x mese crystal minetest.register_craft({ output = "default:mese_crystal", recipe = { diff --git a/mods/mobs/npc.lua b/mods/mobs/npc.lua index 8b51fd9f..59dfba63 100755 --- a/mods/mobs/npc.lua +++ b/mods/mobs/npc.lua @@ -17,12 +17,13 @@ mobs:register_mob("mobs:npc", { attack_type = "dogfight", attacks_monsters = true, -- health & armor - hp_min = mobs.npc_max_hp, hp_max = mobs.npc_max_hp, armor = 100, + hp_min = 20, + hp_max = 20, + armor = 100, -- textures and model collisionbox = {-0.35,-1.0,-0.35, 0.35,0.8,0.35}, visual = "mesh", mesh = "character.b3d", - drawtype = "front", textures = { {"mobs_npc.png"}, }, @@ -66,14 +67,17 @@ mobs:register_mob("mobs:npc", { -- right clicking with "cooked meat" or "bread" will give npc more health on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() - if item:get_name() == "mobs:meat" or item:get_name() == "farming:bread" then + if item:get_name() == "mobs:meat" + or item:get_name() == "farming:bread" then local hp = self.object:get_hp() - if hp + 4 > mobs.npc_max_hp then return end + if hp + 4 > self.hp_max then + return + end if not minetest.setting_getbool("creative_mode") then item:take_item() clicker:set_wielded_item(item) end - self.object:set_hp(hp+4) + self.object:set_hp(hp + 4) -- right clicking with gold lump drops random item from mobs.npc_drops elseif item:get_name() == "default:gold_lump" then if not minetest.setting_getbool("creative_mode") then diff --git a/mods/mobs/oerkki.lua b/mods/mobs/oerkki.lua index c1499d2d..7f1a0830 100755 --- a/mods/mobs/oerkki.lua +++ b/mods/mobs/oerkki.lua @@ -9,12 +9,13 @@ mobs:register_mob("mobs:oerkki", { attack_type = "dogfight", damage = 7, -- health & armor - hp_min = 40, hp_max = 50, armor = 90, + hp_min = 40, + hp_max = 50, + armor = 90, -- textures and model collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.9, 0.4}, visual = "mesh", mesh = "mobs_oerkki.x", - drawtype = "front", textures = { {"mobs_oerkki.png"}, {"mobs_oerkki2.png"}, @@ -40,8 +41,8 @@ mobs:register_mob("mobs:oerkki", { chance = 2, min = 2, max = 3,}, }, -- damaged by - water_damage = 1, - lava_damage = 1, + water_damage = 2, + lava_damage = 2, light_damage = 1, -- model animation animation = { diff --git a/mods/mobs/rat.lua b/mods/mobs/rat.lua index 01b19871..03502890 100755 --- a/mods/mobs/rat.lua +++ b/mods/mobs/rat.lua @@ -7,12 +7,13 @@ mobs:register_mob("mobs:rat", { -- not aggressive passive = true, -- health & armor - hp_min = 2, hp_max = 4, armor = 200, + hp_min = 1, + hp_max = 4, + armor = 200, -- textures and model collisionbox = {-0.2, -0.01, -0.2, 0.2, 0.2, 0.2}, visual = "mesh", mesh = "mobs_rat.x", - drawtype = "front", textures = { {"mobs_rat.png"}, {"mobs_rat_brown.png"}, @@ -30,11 +31,14 @@ mobs:register_mob("mobs:rat", { drops = {}, -- damaged by water_damage = 0, - lava_damage = 1, + lava_damage = 4, light_damage = 0, -- right click to pick up rat on_rightclick = function(self, clicker) - if clicker:is_player() and clicker:get_inventory() and clicker:get_inventory():room_for_item("main", "mobs:rat") then + if clicker:is_player() + and clicker:get_inventory() + and self.child == false + and clicker:get_inventory():room_for_item("main", "mobs:rat") then clicker:get_inventory():add_item("main", "mobs:rat") self.object:remove() end @@ -45,7 +49,7 @@ mobs:register_spawn("mobs:rat", {"default:stone"}, 20, 0, 10000, 1, 31000) -- register spawn egg mobs:register_egg("mobs:rat", "Rat", "mobs_rat_inventory.png", 0) --- Cooked Rat, yummy! +-- cooked rat, yummy! minetest.register_craftitem("mobs:rat_cooked", { description = "Cooked Rat", inventory_image = "mobs_cooked_rat.png", diff --git a/mods/mobs/sandmonster.lua b/mods/mobs/sandmonster.lua index 95e27317..60487411 100755 --- a/mods/mobs/sandmonster.lua +++ b/mods/mobs/sandmonster.lua @@ -9,12 +9,13 @@ mobs:register_mob("mobs:sand_monster", { attack_type = "dogfight", damage = 5, -- health & armor - hp_min = 15, hp_max = 20, armor = 90, + hp_min = 15, + hp_max = 20, + armor = 90, -- textures and model collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.9, 0.4}, visual = "mesh", mesh = "mobs_sand_monster.x", - drawtype = "front", textures = { {"mobs_sand_monster.png"}, }, @@ -40,7 +41,7 @@ mobs:register_mob("mobs:sand_monster", { }, -- damaged by water_damage = 3, - lava_damage = 1, + lava_damage = 4, light_damage = 0, -- model animation animation = { diff --git a/mods/mobs/sheep.lua b/mods/mobs/sheep.lua index 04c4aa0f..61473c6e 100755 --- a/mods/mobs/sheep.lua +++ b/mods/mobs/sheep.lua @@ -7,12 +7,13 @@ mobs:register_mob("mobs:sheep", { -- not aggressive passive = true, -- health & armor - hp_min = 10, hp_max = 15, armor = 200, + hp_min = 10, + hp_max = 15, + armor = 200, -- textures and model collisionbox = {-0.4, -0.01, -0.4, 0.4, 1, 0.4}, visual = "mesh", mesh = "mobs_sheep.x", - drawtype = "front", textures = { {"mobs_sheep.png"}, }, @@ -61,13 +62,16 @@ mobs:register_mob("mobs:sheep", { item:take_item() clicker:set_wielded_item(item) end - self.food = (self.food or 0) + 1 if self.child == true then self.hornytimer = self.hornytimer + 10 + return end + self.food = (self.food or 0) + 1 if self.food >= 8 then self.food = 0 - if self.child == false then self.horny = true end + if self.hornytimer == 0 then + self.horny = true + end self.gotten = false -- can be shaved again self.tamed = true self.object:set_properties({ @@ -76,11 +80,12 @@ mobs:register_mob("mobs:sheep", { }) minetest.sound_play("mobs_sheep", {object = self.object,gain = 1.0,max_hear_distance = 32,loop = false,}) end - return + return end - -- need shears to get wool from sheep - local inv = clicker:get_inventory() - if inv and item:get_name() == "mobs:shears" and not self.gotten and self.child == false then + + if item:get_name() == "mobs:shears" + and self.gotten == false + and self.child == false then self.gotten = true -- shaved if minetest.registered_items["wool:white"] then local pos = self.object:getpos() @@ -89,7 +94,7 @@ mobs:register_mob("mobs:sheep", { if obj then obj:setvelocity({x=math.random(-1,1), y=5, z=math.random(-1,1)}) end - item:add_wear(65535/100) + item:add_wear(650) -- 100 uses clicker:set_wielded_item(item) end self.object:set_properties({ @@ -97,6 +102,18 @@ mobs:register_mob("mobs:sheep", { mesh = "mobs_sheep_shaved.x", }) end + + if item:get_name() == "mobs:magic_lasso" + and clicker:is_player() + and clicker:get_inventory() + and self.child == false + and clicker:get_inventory():room_for_item("main", "mobs:sheep") then + clicker:get_inventory():add_item("main", "mobs:sheep") + self.object:remove() + item:add_wear(3000) -- 22 uses + print ("wear", item:get_wear()) + clicker:set_wielded_item(item) + end end, }) -- spawn on default;green grass between 20 and 8 light, 1 in 9000 chance, 1 sheep in area up to 31000 in height @@ -104,7 +121,7 @@ mobs:register_spawn("mobs:sheep", {"default:dirt_with_grass"}, 20, 8, 10000, 1, -- register spawn egg mobs:register_egg("mobs:sheep", "Sheep", "wool_white.png", 1) --- shears tool (right click sheep to shear) +-- shears (right click sheep to shear wool) minetest.register_tool("mobs:shears", { description = "Steel Shears (right-click sheep to shear)", inventory_image = "mobs_shears.png", diff --git a/mods/mobs/spider.lua b/mods/mobs/spider.lua index 048b77d9..8e2b001c 100755 --- a/mods/mobs/spider.lua +++ b/mods/mobs/spider.lua @@ -9,12 +9,13 @@ mobs:register_mob("mobs:spider", { attack_type = "dogfight", damage = 6, -- health & armor - hp_min = 30, hp_max = 40, armor = 100, + hp_min = 30, + hp_max = 40, + armor = 100, -- textures and model collisionbox = {-0.9, -0.01, -0.7, 0.7, 0.6, 0.7}, visual = "mesh", mesh = "mobs_spider.x", - drawtype = "front", textures = { {"mobs_spider.png"}, }, @@ -61,12 +62,12 @@ mobs:register_spawn("mobs:spider", {"default:jungleleaves", "default:jungletree" -- register spawn egg mobs:register_egg("mobs:spider", "Spider", "mobs_cobweb.png", 1) --- Ethereal crystal spike compatibility +-- ethereal crystal spike compatibility if not minetest.get_modpath("ethereal") then minetest.register_alias("ethereal:crystal_spike", "default:sandstone") end --- Spider Cobweb +-- spider cobweb minetest.register_node("mobs:spider_cobweb", { description = "Spider Cobweb", --Description changé pour éviter conflit avec homedecor_modpack drawtype = "plantlike", @@ -87,7 +88,7 @@ minetest.register_node("mobs:spider_cobweb", { sounds = default.node_sound_leaves_defaults(), }) --- Spider Cobweb craft (MFF : indentation modifié) +-- spider cobweb craft (MFF : indentation modifié) minetest.register_craft( { output = "mobs:spider_cobweb", recipe = { diff --git a/mods/mobs/stonemonster.lua b/mods/mobs/stonemonster.lua index 35ed83aa..8a70288d 100755 --- a/mods/mobs/stonemonster.lua +++ b/mods/mobs/stonemonster.lua @@ -9,12 +9,13 @@ mobs:register_mob("mobs:stone_monster", { attack_type = "dogfight", damage = 8, -- health & armor - hp_min = 30, hp_max = 35, armor = 60, + hp_min = 30, + hp_max = 35, + armor = 60, -- textures and model collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.9, 0.4}, visual = "mesh", mesh = "mobs_stone_monster.x", - drawtype = "front", textures = { {"mobs_stone_monster.png"}, }, @@ -45,7 +46,7 @@ mobs:register_mob("mobs:stone_monster", { }, -- damaged by water_damage = 0, - lava_damage = 0, + lava_damage = 0 light_damage = 0, -- model animation animation = { diff --git a/mods/mobs/treemonster.lua b/mods/mobs/treemonster.lua index 3eb28b3b..f993bf5f 100755 --- a/mods/mobs/treemonster.lua +++ b/mods/mobs/treemonster.lua @@ -9,12 +9,13 @@ mobs:register_mob("mobs:tree_monster", { attack_type = "dogfight", damage = 9, -- health & armor - hp_min = 40, hp_max = 50, armor = 80, + hp_min = 40, + hp_max = 50, + armor = 80, -- textures and model collisionbox = {-0.4, -0.01, -0.4, 0.4, 1.9, 0.4}, visual = "mesh", mesh = "mobs_tree_monster.x", - drawtype = "front", textures = { {"mobs_tree_monster.png"}, }, @@ -60,7 +61,7 @@ mobs:register_spawn("mobs:tree_monster", {"default:leaves", "moretrees:beech_lea -- register spawn egg mobs:register_egg("mobs:tree_monster", "Tree Monster", "default_tree_top.png", 1) --- Ethereal sapling compatibility +-- ethereal sapling compatibility if not minetest.get_modpath("ethereal") then minetest.register_alias("ethereal:tree_sapling", "default:sapling") minetest.register_alias("ethereal:jungle_tree_sapling", "default:junglesapling") diff --git a/mods/mobs/warthog.lua b/mods/mobs/warthog.lua index 43c73479..c2475ae0 100755 --- a/mods/mobs/warthog.lua +++ b/mods/mobs/warthog.lua @@ -9,12 +9,13 @@ mobs:register_mob("mobs:pumba", { attack_type = "dogfight", damage = 5, -- health & armor - hp_min = 15, hp_max = 20, armor = 200, + hp_min = 15, + hp_max = 20, + armor = 200, -- textures and model collisionbox = {-0.4, -0.01, -0.4, 0.4, 1, 0.4}, visual = "mesh", mesh = "mobs_pumba.x", - drawtype = "front", textures = { {"mobs_pumba.png"}, }, @@ -57,15 +58,32 @@ mobs:register_mob("mobs:pumba", { item:take_item() clicker:set_wielded_item(item) end + if self.child == true then + self.hornytimer = self.hornytimer + 10 + return + end self.food = (self.food or 0) + 1 if self.food >= 8 then - if self.child == false then self.horny = true end self.food = 0 + if self.hornytimer == 0 then + self.horny = true + end self.tamed = true - minetest.sound_play("mobs_pig", {object = self.object,gain = 1.0,max_hear_distance = 32,loop = false,}) + minetest.sound_play("mobs_pig", {object = self.object,gain = 1.0, max_hear_distance = 32,loop = false,}) end return end + + if item:get_name() == "mobs:magic_lasso" + and clicker:is_player() + and clicker:get_inventory() + and self.child == false + and clicker:get_inventory():room_for_item("main", "mobs:pumba") then + clicker:get_inventory():add_item("main", "mobs:pumba") + self.object:remove() + item:add_wear(3000) -- 22 uses + clicker:set_wielded_item(item) + end end, }) -- spawns on normal or shroom dirt, between 8 and 20 light, 1 in 10000 chance, 1 in area up to 31000 in height @@ -73,7 +91,7 @@ mobs:register_spawn("mobs:pumba", {"default:dirt_with_grass", "default:dirt"}, 2 -- register spawn egg mobs:register_egg("mobs:pumba", "Warthog", "wool_pink.png", 1) --- Porkchops (raw and cooked) +-- porkchop (raw and cooked) minetest.register_craftitem("mobs:pork_raw", { description = "Raw Porkchop", inventory_image = "mobs_pork_raw.png",