From d72ff66ad29c5b16671af22cbc159a7ddcc0da4a Mon Sep 17 00:00:00 2001 From: Ombridride Date: Wed, 18 Mar 2015 21:28:40 +0100 Subject: [PATCH] update mobs 02/02 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit stats mobs, oerkki peut détruire/enlever torchs, vache/sheep mangent l'herbe, bébé phacochère/mouton qui suivent leur "maman", npc => suit les diamonds, il peut etre soigné avec meat ou bread, clique droit avec "default:gold_lump" en main et il droppera un objet au hasard en échange, pumba => follow maintenant "default:apple" kittens => follow maintenant "fishing:fish_raw" --- mods/mobs/README.txt | 4 + mods/mobs/api.lua | 334 +++++++++++++++--------- mods/mobs/bee.lua | 52 ++-- mods/mobs/chicken.lua | 107 ++++---- mods/mobs/cow.lua | 86 +++--- mods/mobs/creeper.lua | 0 mods/mobs/dirtmonster.lua | 54 ++-- mods/mobs/dungeonmaster.lua | 98 +++---- mods/mobs/init.lua | 3 + mods/mobs/kitten.lua | 2 +- mods/mobs/lava_flan.lua | 86 +++--- mods/mobs/mese_monster.lua | 119 ++++----- mods/mobs/models/character.b3d | Bin 0 -> 86880 bytes mods/mobs/models/mobs_npc.png | Bin 0 -> 901 bytes mods/mobs/npc.lua | 83 ++++++ mods/mobs/oerkki.lua | 83 +++--- mods/mobs/rat.lua | 41 +-- mods/mobs/sandmonster.lua | 78 +++--- mods/mobs/sheep.lua | 70 +++-- mods/mobs/sounds/mobs_dirtmonster.ogg | Bin mods/mobs/sounds/mobs_dungeonmaster.ogg | Bin mods/mobs/sounds/mobs_lavaflan.ogg | Bin mods/mobs/sounds/mobs_mesemonster.ogg | Bin mods/mobs/sounds/mobs_oerkki.ogg | Bin mods/mobs/sounds/mobs_pig_angry.ogg | Bin 0 -> 7835 bytes mods/mobs/sounds/mobs_rat.ogg | Bin mods/mobs/sounds/mobs_sandmonster.ogg | Bin mods/mobs/sounds/mobs_spider.ogg | Bin mods/mobs/sounds/mobs_stonemonster.ogg | Bin mods/mobs/sounds/mobs_treemonster.ogg | Bin mods/mobs/spider.lua | 97 +++---- mods/mobs/stonemonster.lua | 89 +++---- mods/mobs/textures/tnt_smoke.png | Bin 0 -> 202 bytes mods/mobs/treemonster.lua | 71 +++-- mods/mobs/warthog.lua | 68 +++-- mods/mobs/wolf.lua | 2 +- 36 files changed, 915 insertions(+), 712 deletions(-) mode change 100755 => 100644 mods/mobs/creeper.lua create mode 100755 mods/mobs/models/character.b3d create mode 100755 mods/mobs/models/mobs_npc.png create mode 100755 mods/mobs/npc.lua mode change 100755 => 100644 mods/mobs/sounds/mobs_dirtmonster.ogg mode change 100755 => 100644 mods/mobs/sounds/mobs_dungeonmaster.ogg mode change 100755 => 100644 mods/mobs/sounds/mobs_lavaflan.ogg mode change 100755 => 100644 mods/mobs/sounds/mobs_mesemonster.ogg mode change 100755 => 100644 mods/mobs/sounds/mobs_oerkki.ogg create mode 100755 mods/mobs/sounds/mobs_pig_angry.ogg mode change 100755 => 100644 mods/mobs/sounds/mobs_rat.ogg mode change 100755 => 100644 mods/mobs/sounds/mobs_sandmonster.ogg mode change 100755 => 100644 mods/mobs/sounds/mobs_spider.ogg mode change 100755 => 100644 mods/mobs/sounds/mobs_stonemonster.ogg mode change 100755 => 100644 mods/mobs/sounds/mobs_treemonster.ogg create mode 100755 mods/mobs/textures/tnt_smoke.png diff --git a/mods/mobs/README.txt b/mods/mobs/README.txt index 1545333c..42548b18 100755 --- a/mods/mobs/README.txt +++ b/mods/mobs/README.txt @@ -28,6 +28,10 @@ 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.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 :) +1.03- Added mob drop/replace feature so that chickens can drop eggs, cow/sheep can eat grass/wheat etc. +1.02- Sheared sheep are remembered and spawn shaven, Warthogs will attack when threatened, Api additions 1.01- Mobs that suffer fall damage or die in water/lava/sunlight will now drop items 1.0 - more work on Api so that certain mobs can float in water while some sink like a brick :) 0.9 - Spawn eggs added for all mobs (admin only, cannot be placed in protected areas)... Api tweaked diff --git a/mods/mobs/api.lua b/mods/mobs/api.lua index 26e1ca53..5eb1f356 100755 --- a/mods/mobs/api.lua +++ b/mods/mobs/api.lua @@ -1,29 +1,24 @@ - -- Mobs Api (1st March 2015) + -- Mobs Api (15th March 2015) mobs = {} - --- Set global for other mod checks (e.g. Better HUD uses this) mobs.mod = "redo" -- Do mobs spawn in protected areas (0=yes, 1=no) mobs.protected = 0 --- Initial check to see if damage is enabled +-- Initial check to see if damage is enabled and peaceful mode active local damage_enabled = minetest.setting_getbool("enable_damage") - --- Check to see if in peaceful mode local peaceful_only = minetest.setting_getbool("only_peaceful_mobs") function mobs:register_mob(name, def) minetest.register_entity(name, { name = name, hp_min = def.hp_min or 5, - hp_max = def.hp_max, + hp_max = def.hp_max or 10, physical = true, collisionbox = def.collisionbox, visual = def.visual, - visual_size = def.visual_size, + visual_size = def.visual_size or {x=1, y=1}, mesh = def.mesh, - --textures = def.textures, makes_footstep_sound = def.makes_footstep_sound, view_range = def.view_range, walk_velocity = def.walk_velocity, @@ -32,7 +27,8 @@ function mobs:register_mob(name, def) light_damage = def.light_damage, water_damage = def.water_damage, lava_damage = def.lava_damage, - fall_damage = def.fall_damage or true, + fall_damage = def.fall_damage or 1, + fall_speed = def.fall_speed or -10, -- must be lower than -2 drops = def.drops, armor = def.armor, drawtype = def.drawtype, @@ -43,7 +39,7 @@ function mobs:register_mob(name, def) shoot_interval = def.shoot_interval, sounds = def.sounds or {}, animation = def.animation, - follow = def.follow, + follow = def.follow or "", jump = def.jump or true, exp_min = def.exp_min or 0, exp_max = def.exp_max or 0, @@ -53,12 +49,16 @@ function mobs:register_mob(name, def) --fov = def.fov or 120, passive = def.passive or false, recovery_time = def.recovery_time or 0.5, - knock_back = def.knock_back or 1, --knock_back = def.knock_back or 3, + knock_back = def.knock_back or 1, --default value is "or 3", blood_offset = def.blood_offset or 0, blood_amount = def.blood_amount or 5, blood_texture = def.blood_texture or "mobs_blood.png", shoot_offset = def.shoot_offset or 0, floats = def.floats or 1, -- floats in water by default + replace_rate = def.replace_rate, + replace_what = def.replace_what, + replace_with = def.replace_with, + replace_offset = def.replace_offset or 0, stimer = 0, timer = 0, @@ -71,6 +71,9 @@ function mobs:register_mob(name, def) tamed = false, last_state = nil, pause_timer = 0, + horny = false, + hornytimer = 0, + child = false, do_attack = function(self, player, dist) if self.state ~= "attack" then @@ -130,33 +133,25 @@ function mobs:register_mob(name, def) self.animation.current = "" end if type == "stand" and self.animation.current ~= "stand" then - if self.animation.stand_start - and self.animation.stand_end - and self.animation.speed_normal then + if self.animation.stand_start and self.animation.stand_end and self.animation.speed_normal then self.object:set_animation({x=self.animation.stand_start, y=self.animation.stand_end},self.animation.speed_normal, 0) self.animation.current = "stand" end elseif type == "walk" and self.animation.current ~= "walk" then - if self.animation.walk_start - and self.animation.walk_end - and self.animation.speed_normal then + if self.animation.walk_start and self.animation.walk_end and self.animation.speed_normal then self.object:set_animation({x=self.animation.walk_start,y=self.animation.walk_end}, self.animation.speed_normal, 0) self.animation.current = "walk" end elseif type == "run" and self.animation.current ~= "run" then - if self.animation.run_start - and self.animation.run_end - and self.animation.speed_run then + if self.animation.run_start and self.animation.run_end and self.animation.speed_run then self.object:set_animation({x=self.animation.run_start,y=self.animation.run_end}, self.animation.speed_run, 0) self.animation.current = "run" end elseif type == "punch" and self.animation.current ~= "punch" then - if self.animation.punch_start - and self.animation.punch_end - and self.animation.speed_normal then + if self.animation.punch_start and self.animation.punch_end and self.animation.speed_normal then self.object:set_animation({x=self.animation.punch_start,y=self.animation.punch_end}, self.animation.speed_normal, 0) self.animation.current = "punch" @@ -177,7 +172,7 @@ function mobs:register_mob(name, def) 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 + player_count = player_count + 1 break -- only really need 1 player to be found end end @@ -188,12 +183,12 @@ function mobs:register_mob(name, def) end end - -- drop egg - if name == "mobs:chicken" then - if math.random(1, 3000) <= 1 - and minetest.get_node(self.object:getpos()).name == "air" - and self.state == "stand" then - minetest.set_node(self.object:getpos(), {name="mobs:egg"}) + -- 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 then + local pos = self.object:getpos() ; pos.y = pos.y + self.replace_offset + if #minetest.find_nodes_in_area(pos,pos,self.replace_what) > 0 + and self.object:getvelocity().y == 0 and self.state == "stand" then + minetest.set_node(pos, {name = self.replace_with}) end end @@ -202,25 +197,21 @@ function mobs:register_mob(name, def) if minetest.get_item_group(minetest.get_node(self.object:getpos()).name, "water") ~= 0 then self.object:setacceleration({x = 0, y = 1.5, z = 0}) else - self.object:setacceleration({x = 0, y = -10, z = 0}) -- 14.5 + self.object:setacceleration({x = 0, y = self.fall_speed, z = 0}) end else - self.object:setacceleration({x=0, y=-10, z=0}) + self.object:setacceleration({x = 0, y = self.fall_speed, z = 0}) end -- fall damage - if self.fall_damage and self.object:getvelocity().y == 0 then - if not self.old_y then - self.old_y = self.object:getpos().y - else - local d = self.old_y - self.object:getpos().y - if d > 5 then - local damage = d-5 - self.object:set_hp(self.object:get_hp()-damage) - check_for_death(self) - end - self.old_y = self.object:getpos().y + if self.fall_damage == 1 and self.object:getvelocity().y == 0 then + local d = self.old_y - self.object:getpos().y + if d > 5 then + local damage = math.floor(d - 5) + self.object:set_hp(self.object:get_hp()-damage) + check_for_death(self) end + self.old_y = self.object:getpos().y end -- if pause state then this is where the loop ends @@ -254,19 +245,22 @@ function mobs:register_mob(name, def) if self.light_damage and self.light_damage ~= 0 and pos.y > 0 - and lit > 4 + and lit > 10 -- direct sunlight (was 4) and tod > 0.2 and tod < 0.8 then - self.object:set_hp(self.object:get_hp()-self.light_damage) ; --print ("light damage") + self.object:set_hp(self.object:get_hp()-self.light_damage) + effect(pos, 5, "tnt_smoke.png") end if self.water_damage and self.water_damage ~= 0 and minetest.get_item_group(n.name, "water") ~= 0 then - self.object:set_hp(self.object:get_hp()-self.water_damage) ; --print ("water damage") + self.object:set_hp(self.object:get_hp()-self.water_damage) + effect(pos, 5, "bubble.png") end if self.lava_damage and self.lava_damage ~= 0 and minetest.get_item_group(n.name, "lava") ~= 0 then - self.object:set_hp(self.object:get_hp()-self.lava_damage) ; --print ("lava damage") + self.object:set_hp(self.object:get_hp()-self.lava_damage) + effect(pos, 5, "fire_basic_flame.png") end check_for_death(self) @@ -281,7 +275,7 @@ function mobs:register_mob(name, def) end -- FIND SOMEONE TO ATTACK - if ( self.type == "monster" or self.type == "barbarian" ) and damage_enabled and self.state ~= "attack" then + if self.type == "monster" and damage_enabled and self.state ~= "attack" then local s = self.object:getpos() local inradius = minetest.get_objects_inside_radius(s,self.view_range) @@ -319,22 +313,20 @@ function mobs:register_mob(name, def) end -- NPC FIND A MONSTER TO ATTACK --- if self.type == "npc" and self.attacks_monsters and self.state ~= "attack" then --- local s = self.object:getpos() --- local inradius = minetest.get_objects_inside_radius(s,self.view_range) --- for _, oir in pairs(inradius) do --- local obj = oir:get_luaentity() --- if obj then --- if obj.type == "monster" or obj.type == "barbarian" then --- -- attack monster --- local p = obj.object:getpos() --- local dist = ((p.x-s.x)^2 + (p.y-s.y)^2 + (p.z-s.z)^2)^0.5 --- self.do_attack(self,obj.object,dist) --- break --- end --- end --- end --- end + if self.type == "npc" and self.attacks_monsters and self.state ~= "attack" then + local s = self.object:getpos() + local inradius = minetest.get_objects_inside_radius(s,self.view_range) + for _, oir in pairs(inradius) do + local obj = oir:get_luaentity() + if obj and obj.type == "monster" then + -- attack monster + local p = obj.object:getpos() + local dist = ((p.x-s.x)^2 + (p.y-s.y)^2 + (p.z-s.z)^2)^0.5 + self.do_attack(self,obj.object,dist) + break + end + end + end if self.follow ~= "" and not self.following then for _,player in pairs(minetest.get_connected_players()) do @@ -342,19 +334,29 @@ function mobs:register_mob(name, def) local p = player:getpos() local dist = ((p.x-s.x)^2 + (p.y-s.y)^2 + (p.z-s.z)^2)^0.5 if self.view_range and dist < self.view_range then - self.following = player + self.following = player ; self.following_player = true break + else self.following_player = nil end end end - if self.following and self.following:is_player() then + 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 - if self.following:get_wielded_item():get_name() ~= self.follow then - self.following = nil - else - local s = self.object:getpos() - local p = self.following:getpos() + if self.following then + + local s = self.object:getpos() + local p + if self.following.is_player and self.following:is_player() then + p = self.following:getpos() + elseif self.following.object then + p = self.following.object:getpos() + end + + if p then 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 @@ -392,6 +394,68 @@ function mobs:register_mob(name, def) end end + -- horny animal can mate for 40 seconds, afterwards horny animal cannot mate again for 60 seconds + if self.horny == true and self.hornytimer < 100 and self.child == false then + self.hornytimer = self.hornytimer + 1 + if self.hornytimer <= 40 then + effect(self.object:getpos(), 4, "heart.png") + end + if self.hornytimer >= 100 then + self.hornytimer = 0 + self.horny = false + end + end + + -- if animal is child take 120 seconds before growing into adult + if self.child == true then + self.hornytimer = self.hornytimer + 1 + if self.hornytimer > 120 then + self.child = false + self.hornytimer = 0 + self.object:set_properties({ + visual_size = {x=self.visual_size.x,y=self.visual_size.y}, + }) + end + end + + -- 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() + local ents = minetest.get_objects_inside_radius(pos, self.view_range) + local num = 0 + for i,obj in ipairs(ents) do + + local 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 + --print("2 horny "..name) + self.following = ent + ent.following = self + self.horny = false + self.hornytimer = 0 + self.following = nil + ent.horny = false + ent.following = nil + ent.hornytimer = 0 + + minetest.after(7, function(dtime) + --print ("spawned baby:",self.name) + local mob = minetest.add_entity(pos, self.name) + local ent2 = mob:get_luaentity() + + mob:set_properties({ + visual_size = {x=self.visual_size.x/2,y=self.visual_size.y/2}, + }) + ent2.child = true + ent2.tamed = true + end) + num = 0 + break + end + end + end + if self.state == "stand" then -- randomly turn if math.random(1, 4) == 1 then @@ -687,11 +751,11 @@ 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) ) -- reset HP + self.object:set_hp( math.random(self.hp_min, self.hp_max) ) -- set HP self.object:set_armor_groups({fleshy=self.armor}) - self.object:setacceleration({x=0, y=-10, z=0}) + self.object:setacceleration({x=0, y= self.fall_speed, z=0}) self.state = "stand" - self.object:setvelocity({x=0, y=self.object:getvelocity().y, z=0}) + self.object:setvelocity({x=0, y=self.object:getvelocity().y, z=0}) ; self.old_y = self.object:getpos().y self.object:setyaw(math.random(1, 360)/180*math.pi) if self.type == "monster" and peaceful_only then self.object:remove() @@ -711,8 +775,18 @@ function mobs:register_mob(name, def) if tmp.gotten then -- using this variable for obtaining something from mob (milk/wool) self.gotten = tmp.gotten end + if tmp.child then + self.child = tmp.child + end + if tmp.horny then + self.horny = tmp.horny + end + if tmp.hornytimer then + self.hornytimer = tmp.hornytimer + end end end + if self.lifetimer <= 0 and not self.tamed and self.type ~= "npc" then self.object:remove() end @@ -723,11 +797,30 @@ function mobs:register_mob(name, def) end, get_staticdata = function(self) + -- set mob texture and model + local textures = def.available_textures["texture_"..math.random(1,def.available_textures["total"])] + local mesh = self.mesh + local vis_size = self.visual_size + -- if object is a sheared sheep then set texture and model + if self.name == "mobs:sheep" and self.gotten == true then + textures = {"mobs_sheep_shaved.png"} + mesh = "mobs_sheep_shaved.x" + end + -- if object is child then set half size + if self.child == true then + vis_size = {x=self.visual_size.x/2,y=self.visual_size.y/2} + end + local tmp = { lifetimer = self.lifetimer, tamed = self.tamed, gotten = self.gotten, - textures = def.available_textures["texture_"..math.random(1,def.available_textures["total"])], + child = self.child, + horny = self.horny, + hornytimer = self.hornytimer, + mesh = mesh, + textures = textures, + visual_size = vis_size, } self.object:set_properties(tmp) return minetest.serialize(tmp) @@ -743,21 +836,7 @@ function mobs:register_mob(name, def) if self.blood_amount > 0 and pos then local p = pos p.y = p.y + self.blood_offset - minetest.add_particlespawner({ - amount = self.blood_amount, - time = 0.25, - minpos = {x=p.x-0.2, y=p.y-0.2, z=p.z-0.2}, - maxpos = {x=p.x+0.2, y=p.y+0.2, z=p.z+0.2}, - minvel = {x=-0, y=-2, z=-0}, - maxvel = {x=2, y=2, z=2}, - minacc = {x=-4, y=-4, z=-4}, - maxacc = {x=4, y=4, z=4}, - minexptime = 0.1, - maxexptime = 1, - minsize = 0.5, - maxsize = 1, - texture = self.blood_texture, - }) + effect(p, self.blood_amount, self.blood_texture) end -- knock back effect, adapted from blockmen's pyramids mod @@ -778,9 +857,9 @@ function mobs:register_mob(name, def) self.object:setvelocity({x=dir.x*kb,y=ykb,z=dir.z*kb}) self.pause_timer = r ---[[ + -- attack puncher and call other mobs for help - if self.passive == false then + if self.passive == false and not self.tamed then if self.state ~= "attack" then self.do_attack(self,hitter,1) end @@ -795,7 +874,7 @@ function mobs:register_mob(name, def) end end end -]]-- + end, }) @@ -811,7 +890,7 @@ function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_o chance = chance, action = function(pos, node, _, active_object_count_wider) - -- do not spawn if too many in one active area + -- do not spawn if too many active in area if active_object_count_wider > active_object_count or not mobs.spawning_mobs[name] or not pos then @@ -821,27 +900,24 @@ function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_o -- spawn above node pos.y = pos.y + 1 - -- Check if protected area, if so mobs will not spawn + -- mobs cannot spawn inside protected areas if enabled if mobs.protected == 1 and minetest.is_protected(pos, "") then return end -- check if light and height levels are ok to spawn - if not minetest.get_node_light(pos) - or minetest.get_node_light(pos) > max_light - or minetest.get_node_light(pos) < min_light + local light = minetest.get_node_light(pos) + if not light or light > max_light or light < min_light or pos.y > max_height then return end - -- are we spawning inside a node? + -- are we spawning inside a solid node? local nod = minetest.get_node_or_nil(pos) - if not nod then return end - if minetest.registered_nodes[nod.name].walkable == true then return end + if not nod or minetest.registered_nodes[nod.name].walkable == true then return end pos.y = pos.y + 1 nod = minetest.get_node_or_nil(pos) - if not nod then return end - if minetest.registered_nodes[nod.name].walkable == true then return end + if not nod or minetest.registered_nodes[nod.name].walkable == true then return end if minetest.setting_getbool("display_mob_spawn") then minetest.chat_send_all("[mobs] Add "..name.." at "..minetest.pos_to_string(pos)) @@ -849,7 +925,7 @@ function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_o -- spawn mob half block higher pos.y = pos.y - 0.5 - local mob = minetest.add_entity(pos, name) + minetest.add_entity(pos, name) -- set mob health (randomly between min and max) if mob then @@ -860,26 +936,42 @@ function mobs:register_spawn(name, nodes, max_light, min_light, chance, active_o }) end +-- particle effects +function effect(pos, amount, texture) + minetest.add_particlespawner({ + amount = amount, + time = 0.25, + minpos = {x=pos.x-0.2, y=pos.y-0.2, z=pos.z-0.2}, + maxpos = {x=pos.x+0.2, y=pos.y+0.2, z=pos.z+0.2}, + minvel = {x=-0, y=-2, z=-0}, + maxvel = {x=2, y=2, z=2}, + minacc = {x=-4, y=-4, z=-4}, + maxacc = {x=4, y=4, z=4}, + minexptime = 0.1, + maxexptime = 1, + minsize = 0.5, + maxsize = 1, + texture = texture, + }) +end + -- on mob death drop items function check_for_death(self) - if self.object:get_hp() < 1 then - local pos = self.object:getpos() - pos.y = pos.y + 0.5 -- drop items half a block higher - self.object:remove() - for _,drop in ipairs(self.drops) do - if math.random(1, drop.chance) == 1 then - local d = ItemStack(drop.name.." "..math.random(drop.min, drop.max)) - local obj = minetest.add_item(pos, d) - if obj then - obj:setvelocity({x=math.random(-1,1), y=5, z=math.random(-1,1)}) - end + if self.object:get_hp() > 0 then return end + local pos = self.object:getpos() + pos.y = pos.y + 0.5 -- drop items half a block higher + self.object:remove() + for _,drop in ipairs(self.drops) do + if math.random(1, drop.chance) == 1 then + local d = ItemStack(drop.name.." "..math.random(drop.min, drop.max)) + local obj = minetest.add_item(pos, d) + if obj then + obj:setvelocity({x=math.random(-1,1), y=5, z=math.random(-1,1)}) end end - - if self.sounds.death ~= nil then - minetest.sound_play(self.sounds.death,{object = self.object,}) - end - + end + if self.sounds.death ~= nil then + minetest.sound_play(self.sounds.death,{object = self.object,}) end end diff --git a/mods/mobs/bee.lua b/mods/mobs/bee.lua index 1f3cf6f8..522274cd 100755 --- a/mods/mobs/bee.lua +++ b/mods/mobs/bee.lua @@ -1,32 +1,43 @@ --- Bee +-- Bee by KrupnoPavel mobs:register_mob("mobs:bee", { + -- animal, monster, npc, barbarian type = "animal", - hp_min = 1, - hp_max = 2, + -- it is aggressive + passive = true, + -- health & armor + 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", - --textures = {"mobs_bee.png"}, + drawtype = "front", available_textures = { total = 1, texture_1 = {"mobs_bee.png"}, }, + -- sounds makes_footstep_sound = false, + sounds = { + random = "mobs_bee", + }, + -- speed and jump walk_velocity = 1, - armor = 200, + jump = true, + step = 1, + -- drops honey when killed drops = { - {name = "mobs:med_cooked", - chance = 1, - min = 1, - max = 2,}, + {name = "mobs:honey", + chance = 1, min = 1, max = 2,}, }, - drawtype = "front", + -- damage water_damage = 1, lava_damage = 1, light_damage = 0, - + fall_damage = 0, + fall_speed = -3, + -- model animation animation = { speed_normal = 15, stand_start = 0, @@ -37,36 +48,29 @@ mobs:register_mob("mobs:bee", { sounds = { random = "mobs_bee", }, + -- right click to pick up bee on_rightclick = function(self, clicker) if clicker:is_player() and clicker:get_inventory() then clicker:get_inventory():add_item("main", "mobs:bee") self.object:remove() end end, -jump = true, -step = 1, -passive = true, }) + +-- 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", {"default:dirt_with_grass"}, 20, 4, 7500, 1, 31000) + +-- register spawn egg mobs:register_egg("mobs:bee", "Bee", "mobs_bee_inv.png", 0) -- Honey - minetest.register_craftitem("mobs:honey", { description = "Honey", inventory_image = "mobs_honey_inv.png", on_use = minetest.item_eat(6), }) -minetest.register_craft({ - type = "cooking", - output = "mobs:med_cooked", - recipe = "mobs:bee", - cooktime = 5, -}) - --- Beehive - +-- Beehive (when placed, bee appears) minetest.register_node("mobs:beehive", { description = "Beehive", drawtype = "plantlike", diff --git a/mods/mobs/chicken.lua b/mods/mobs/chicken.lua index 6cdf26fb..0fc0e217 100755 --- a/mods/mobs/chicken.lua +++ b/mods/mobs/chicken.lua @@ -1,15 +1,18 @@ ---= Chicken (thanks to JK Murray for his chicken model) +-- Chicken by JK Murray mobs:register_mob("mobs:chicken", { + -- animal, monster, npc, barbarian type = "animal", - hp_min = 5, - hp_max = 10, - animaltype = "clucky", + -- is it aggressive + passive = true, + -- health & armor + hp_min = 5, hp_max = 10, armor = 200, + -- textures and model collisionbox = {-0.3, -0.75, -0.3, 0.3, 0.1, 0.3}, visual = "mesh", mesh = "chicken.x", - -- textures look repetative but they fix the wrapping bug + drawtype = "front", available_textures = { total = 2, texture_1 = {"mobs_chicken.png", "mobs_chicken.png", "mobs_chicken.png", @@ -19,19 +22,28 @@ mobs:register_mob("mobs:chicken", { "mobs_chicken_black.png", "mobs_chicken_black.png", "mobs_chicken_black.png", "mobs_chicken_black.png", "mobs_chicken_black.png", "mobs_chicken_black.png"}, }, - --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"}, + blood_texture = "mobs_blood.png", + -- sounds makes_footstep_sound = true, - walk_velocity = 1, - armor = 200, - drops = { - {name = "mobs:chicken_raw", chance = 1, min = 2, max = 2,}, + sounds = { + random = "mobs_chicken", }, - drawtype = "front", + -- speed and jump + walk_velocity = 1, + jump = true, + step = 1, + -- drops raw chicken when dead + drops = { + {name = "mobs:chicken_raw", + chance = 1, min = 2, max = 2}, + }, + -- damaged by water_damage = 1, lava_damage = 5, light_damage = 0, - jump = false, + fall_damage = 0, + fall_speed = -8, + -- model animation animation = { speed_normal = 15, stand_start = 0, @@ -39,12 +51,13 @@ mobs:register_mob("mobs:chicken", { walk_start = 20, walk_end = 40, }, - follow = "farming:wheat", - view_range = 8, - - sounds = { - random = "mobs_chicken", - }, + -- follows wheat + follow = "farming:wheat", view_range = 8, + -- replace air with egg (lay) + replace_rate = 1000, + replace_what = {"air"}, + replace_with = "mobs:egg", + -- right click to pick up chicken on_rightclick = function(self, clicker) local tool = clicker:get_wielded_item() if tool:get_name() == "farming:wheat" then @@ -66,44 +79,39 @@ mobs:register_mob("mobs:chicken", { self.object:remove() end end - end, - jump = true, - step = 1, - blood_texture = "mobs_blood.png", - passive = true, -}) +}) +-- spawn on default or bamboo grass between 8 and 20 light, 1 in 9000 change, 1 chicken in area up to 31000 in height mobs:register_spawn("mobs:chicken", {"default:dirt_with_grass"}, 20, 0, 9000, 1, 31000) +-- register spawn egg mobs:register_egg("mobs:chicken", "Chicken", "mobs_chicken_inv.png", 0) --- Egg (can be fried in furnace) - -minetest.register_node("mobs:egg", - { - description = "Chicken Egg", - tiles = {"mobs_chicken_egg.png"}, - inventory_image = "mobs_chicken_egg.png", - on_use = minetest.item_eat(1), - visual_scale = 0.7, - drawtype = "plantlike", - wield_image = "mobs_chicken_egg.png", - paramtype = "light", - walkable = false, - is_ground_content = true, - sunlight_propagates = true, - selection_box = { - type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} - }, - groups = {snappy=2, dig_immediate=3}, - after_place_node = function(pos, placer, itemstack) - if placer:is_player() then - minetest.set_node(pos, {name="mobs:egg", param2=1}) - end +-- Egg +minetest.register_node("mobs:egg", { + description = "Chicken Egg", + tiles = {"mobs_chicken_egg.png"}, + inventory_image = "mobs_chicken_egg.png", + visual_scale = 0.7, + drawtype = "plantlike", + wield_image = "mobs_chicken_egg.png", + paramtype = "light", + walkable = false, + is_ground_content = true, + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} + }, + groups = {snappy=2, dig_immediate=3}, + after_place_node = function(pos, placer, itemstack) + if placer:is_player() then + minetest.set_node(pos, {name="mobs:egg", param2=1}) end + end }) +-- Fried egg minetest.register_craftitem("mobs:chicken_egg_fried", { description = "Fried Egg", inventory_image = "mobs_chicken_egg_fried.png", @@ -117,7 +125,6 @@ minetest.register_craft({ }) -- 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 57b91f21..ccf51699 100755 --- a/mods/mobs/cow.lua +++ b/mods/mobs/cow.lua @@ -2,49 +2,69 @@ -- Cow by Krupnovpavel mobs:register_mob("mobs:cow", { + -- animal, monster, npc, barbarian type = "animal", - hp_min = 10, - hp_max = 15, + -- aggressive, does 6 damage to player when threatened + passive = false, + attack_type = "dogfight", + damage = 6, + -- health & armor + hp_min = 20, hp_max = 30, armor = 200, + -- textures and model collisionbox = {-0.4, -0.01, -0.4, 0.4, 1, 0.4}, - --textures = {"mobs_cow.png"}, + visual = "mesh", + mesh = "mobs_cow.x", + drawtype = "front", available_textures = { total = 1, -- à mettre à 2 quand "mobs_cow_brown.png" sera compatible texture_1 = {"mobs_cow.png"}, --texture_2 = {"mobs_cow_brown.png"}, -- dé-commenter quand "mobs_cow_brown.png" sera compatible }, - visual = "mesh", - mesh = "mobs_cow.x", + blood_texture = "mobs_blood.png", + visual_size = {x=1,y=1}, + -- sounds makes_footstep_sound = true, - view_range = 7, - walk_velocity = 1, - run_velocity = 2, - damage = 10, - armor = 200, - drops = { - {name = "mobs:meat_raw", - chance = 1, - min = 5, - max = 10,}, - }, - drawtype = "front", - water_damage = 1, - lava_damage = 5, - light_damage = 0, - follow = "farming:wheat", sounds = { random = "mobs_cow", }, + -- speed and jump + walk_velocity = 1, + run_velocity = 2, + jump = true, + step = 0.5, + -- drops raw meat when dead + drops = { + {name = "mobs:meat_raw", + chance = 1, min = 5, max = 10}, + }, + -- damaged by + water_damage = 1, + lava_damage = 5, + light_damage = 0, + -- model animation + animation = { + speed_normal = 15, speed_run = 15, + stand_start = 0, stand_end = 30, + walk_start = 35, walk_end = 65, + run_start = 105, run_end = 135, + punch_start = 70, punch_end = 100, + }, + -- follows wheat + follow = "farming:wheat", view_range = 8, + -- replace grass/wheat with air (eat) + replace_rate = 50, + replace_what = {"default:grass_3", "default:grass_4", "default:grass_5", "farming:wheat_8"}, + replace_with = "air", -- 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" then + if tool:get_name() == "bucket:bucket_empty" and self.child == false then if self.gotten then return end clicker:get_inventory():remove_item("main", "bucket:bucket_empty") clicker:get_inventory():add_item("main", "mobs:bucket_milk") self.gotten = true -- milked end - - if tool:get_name() == "farming:wheat" and self.gotten then + if tool:get_name() == "farming:wheat" then -- and self.gotten then if not minetest.setting_getbool("creative_mode") then tool:take_item(1) clicker:set_wielded_item(tool) @@ -52,6 +72,7 @@ mobs:register_mob("mobs:cow", { 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 -- 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,}) @@ -60,21 +81,10 @@ mobs:register_mob("mobs:cow", { end end, - - animation = { - speed_normal = 15, speed_run = 15, - stand_start = 0, stand_end = 30, - walk_start = 35, walk_end = 65, - run_start = 105, run_end = 135, - punch_start = 70, punch_end = 100, - }, - - jump = true, - step = 1, - blood_texture = "mobs_blood.png", - passive = true, }) -mobs:register_spawn("mobs:cow", {"default:dirt_with_grass"}, 20, 0, 9000, 1, 31000) +-- spawn on default;green;prairie grass between 0 and 20 light, 1 in 11000 chance, 1 cow in area up to 31000 in height +mobs:register_spawn("mobs:cow", {"default:dirt_with_grass"}, 20, 0, 10000, 1, 31000) +-- register spawn egg mobs:register_egg("mobs:cow", "Cow", "default_grass.png", 1) -- Bucket of Milk diff --git a/mods/mobs/creeper.lua b/mods/mobs/creeper.lua old mode 100755 new mode 100644 diff --git a/mods/mobs/dirtmonster.lua b/mods/mobs/dirtmonster.lua index 5c8aad74..6b9717f1 100755 --- a/mods/mobs/dirtmonster.lua +++ b/mods/mobs/dirtmonster.lua @@ -1,23 +1,38 @@ --- Dirt Monster + +-- Dirt Monster by PilzAdam mobs:register_mob("mobs:dirt_monster", { + -- animal, monster, npc, barbarian type = "monster", - hp_min = 25, - hp_max = 30, + -- aggressive, deals 4 damage to player when hit + passive = false, + attack_type = "dogfight", + damage = 4, + -- health & armor + 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", - --textures = {"mobs_dirt_monster.png"}, + drawtype = "front", available_textures = { total = 1, texture_1 = {"mobs_dirt_monster.png"}, }, visual_size = {x=3, y=2.6}, + blood_texture = "default_dirt.png", + -- sounds makes_footstep_sound = true, + sounds = { + random = "mobs_dirtmonster", + }, + -- speed and jump view_range = 16, walk_velocity = 3, run_velocity = 5, - damage = 4, + jump = true, + step = 1, + -- drops dirt and coins when dead drops = { {name = "default:dirt", chance = 1, @@ -28,32 +43,21 @@ mobs:register_mob("mobs:dirt_monster", { min = 2, max = 8,}, }, + -- damaged by light_resistant = false, - armor = 90, - drawtype = "front", water_damage = 1, lava_damage = 5, light_damage = 2, - on_rightclick = nil, - attack_type = "dogfight", + -- model animation animation = { - speed_normal = 15, - speed_run = 15, - stand_start = 0, - stand_end = 14, - walk_start = 15, - walk_end = 38, - run_start = 40, - run_end = 63, - punch_start = 40, - punch_end = 63, + speed_normal = 15, speed_run = 15, + stand_start = 0, stand_end = 14, + walk_start = 15, walk_end = 38, + run_start = 40, run_end = 63, + punch_start = 40, punch_end = 63, }, - sounds = { - random = "mobs_dirtmonster", - }, - jump = true, - step = 1, - blood_texture = "default_dirt.png", }) +-- 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, 9000, 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 index 10a8dff3..3496e45f 100755 --- a/mods/mobs/dungeonmaster.lua +++ b/mods/mobs/dungeonmaster.lua @@ -1,5 +1,5 @@ --- Dungeon Master (This one spits out fireballs at you) +-- Dungeon Master by PilzAdam -- Node which cannot be destroyed by DungeonMasters' fireballs local excluded = {"nether:netherrack","default:obsidian_glass","maptools:cobble", @@ -7,13 +7,22 @@ local excluded = {"nether:netherrack","default:obsidian_glass","maptools:cobble" } mobs:register_mob("mobs:dungeon_master", { + -- animal, monster, npc, barbarian type = "monster", - hp_min = 50, - hp_max = 60, + -- aggressive, shoots fireballs at player + 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", - --textures = {"mobs_dungeon_master.png"}, + drawtype = "front", available_textures = { total = 3, texture_1 = {"mobs_dungeon_master.png"}, @@ -21,72 +30,52 @@ mobs:register_mob("mobs:dungeon_master", { texture_3 = {"mobs_dungeon_master_strangewhite.png"}, }, visual_size = {x=8, y=8}, + blood_texture = "mobs_blood.png", + -- sounds makes_footstep_sound = true, - view_range = 16, + sounds = { + random = "mobs_dungeonmaster", + attack = "mobs_fireball", + }, + -- speed and jump walk_velocity = 1, - run_velocity = 3, - damage = 13, + run_velocity = 2, + jump = true, + step = 0.5, + view_range = 16, + -- drops mese or diamond when dead drops = { {name = "default:mese_crystal_fragment", - chance = 1, - min = 1, - max = 3,}, + chance = 1, min = 1, max = 3,}, {name = "default:diamond", - chance = 5, - min = 1, - max = 3,}, + chance = 5, min = 1, max = 3,}, {name = "default:mese_crystal", - chance = 2, - min = 1, - max = 3,}, + chance = 2, min = 1, max = 3,}, {name = "default:diamond_block", - chance = 30, - min = 1, - max = 1,}, + chance = 30, min = 1, max = 1,}, {name = "maptools:gold_coin", - chance = 15, - min = 1, - max = 2,}, + chance = 15, min = 1, max = 2,}, {name = "maptools:silver_coin", - chance = 1, - min = 2, - max = 10,}, + chance = 1, min = 2, max = 10,}, }, - armor = 60, - drawtype = "front", + -- damaged by water_damage = 1, lava_damage = 1, light_damage = 0, - on_rightclick = nil, - attack_type = "shoot", - arrow = "mobs:fireball", - shoot_interval = 2.5, - sounds = { - attack = "mobs_fireball", - }, + -- 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, + stand_start = 0, stand_end = 19, + walk_start = 20, walk_end = 35, + punch_start = 36, punch_end = 48, + speed_normal = 15, speed_run = 15, }, - sounds = { - random = "mobs_dungeonmaster", - }, - jump = true, - step = 0.5, - shoot_offset = 0, - blood_texture = "mobs_blood.png", }) +-- 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 (weapon) - +-- Fireball (dungeon masters weapon) mobs:register_arrow("mobs:fireball", { visual = "sprite", visual_size = {x=1, y=1}, @@ -100,12 +89,11 @@ mobs:register_arrow("mobs:fireball", { player:punch(self.object, 1.0, { full_punch_interval=1.0, damage_groups = {fleshy=13}, - }, 0) -- {x=s.x-p.x, y=s.y-p.y, z=s.z-p.z}) + }, 0) end, - -- node hit, bursts into flame (cannot blast through obsidian) + -- 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 @@ -123,7 +111,7 @@ mobs:register_arrow("mobs:fireball", { end if n ~= "default:obsidian" and n ~= "default:obsidianbrick" - and not n:find("protector:") then + and not n:find("protector:") then if minetest.registered_nodes[n].groups.flammable or math.random(1, 100) <= 30 then minetest.set_node(p, {name="fire:basic_flame"}) else diff --git a/mods/mobs/init.lua b/mods/mobs/init.lua index 5ee6c134..234c1d2b 100755 --- a/mods/mobs/init.lua +++ b/mods/mobs/init.lua @@ -33,6 +33,9 @@ dofile(minetest.get_modpath("mobs").."/mese_monster.lua") dofile(minetest.get_modpath("mobs").."/spider.lua") +-- NPC +dofile(minetest.get_modpath("mobs").."/npc.lua") + -- Creeper (fast impl by davedevils) dofile(minetest.get_modpath("mobs").."/creeper.lua") diff --git a/mods/mobs/kitten.lua b/mods/mobs/kitten.lua index 6a70db59..f1290b7e 100755 --- a/mods/mobs/kitten.lua +++ b/mods/mobs/kitten.lua @@ -104,7 +104,7 @@ mobs:register_mob("mobs:kitten", { on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() - if item:get_name() == "mobs:rat" then + if item:get_name() == "fishing:fish_raw" then if not minetest.setting_getbool("creative_mode") then item:take_item() clicker:set_wielded_item(item) diff --git a/mods/mobs/lava_flan.lua b/mods/mobs/lava_flan.lua index ab80b1d6..3ace65fa 100755 --- a/mods/mobs/lava_flan.lua +++ b/mods/mobs/lava_flan.lua @@ -1,67 +1,67 @@ ---= Lava Flan by Zeg9 - -minetest.register_craftitem("mobs:lava_orb", { - description = "Lava orb", - inventory_image = "zmobs_lava_orb.png", - on_place = function(itemstack, placer, pointed_thing) - end, -}) - -minetest.register_alias("zmobs:lava_orb", "mobs:lava_orb") +-- Lava Flan by Zeg9 mobs:register_mob("mobs:lava_flan", { + -- animal, monster, npc, barbarian type = "monster", - hp_min = 20, - hp_max = 35, + -- aggressive, deals 3 damage to player when hit + passive = false, + attack_type = "dogfight", + damage = 3, + -- health and armor + 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", - --textures = {"zmobs_lava_flan.png"}, + drawtype = "front", available_textures = { total = 1, texture_1 = {"zmobs_lava_flan.png"}, }, + blood_texture = "fire_basic_flame.png", visual_size = {x=1, y=1}, + -- sounds makes_footstep_sound = true, - view_range = 10, - walk_velocity = 0.5, - run_velocity = 2, - damage = 3, - drops = { - {name = "mobs:lava_orb", - chance = 10, - min = 1, - max = 1,}, - }, - light_resistant = true, - armor = 80, - drawtype = "front", - water_damage = 5, - lava_damage = 0, - light_damage = 0, - attack_type = "dogfight", - animation = { - speed_normal = 15, - speed_run = 15, - stand_start = 0, - stand_end = 8, - walk_start = 10, - walk_end = 18, - run_start = 20, - run_end = 28, - punch_start = 20, - punch_end = 28, - }, sounds = { random = "mobs_lavaflan", war_cry = "mobs_lavaflan", death = nil, }, + -- speed and jump, sinks in water + walk_velocity = 0.5, + run_velocity = 2, jump = true, step = 2, + view_range = 16, floats = 0, - blood_texture = "fire_basic_flame.png", + -- chance of dropping lava orb when dead + drops = { + {name = "mobs:lava_orb", + chance = 15, min = 1, max = 1,}, + }, + -- damaged by + light_resistant = true, + water_damage = 5, + lava_damage = 0, + light_damage = 0, + -- model animation + animation = { + speed_normal = 15, speed_run = 15, + stand_start = 0, stand_end = 8, + walk_start = 10, walk_end = 18, + run_start = 20, run_end = 28, + punch_start = 20, punch_end = 28, + }, }) +-- spawns in lava between -1 and 20 light, 1 in 2000 chance, 2 in area below 31000 in height mobs:register_spawn("mobs:lava_flan", {"default:lava_source"}, 20, -1, 2000, 2, 31000) +-- register spawn egg mobs:register_egg("mobs:lava_flan", "Lava Flan", "default_lava.png", 1) + +-- 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 6f29ed3e..cf9664c4 100755 --- a/mods/mobs/mese_monster.lua +++ b/mods/mobs/mese_monster.lua @@ -1,83 +1,70 @@ ---= Mese Monster by Zeg9 +-- Mese Monster by Zeg9 --- 9 mese crystal fragments = 1 mese crystal -minetest.register_craft({ - output = "default:mese_crystal", - recipe = { - {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, - {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, - {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, - } -}) - --- Mese Monster mobs:register_mob("mobs:mese_monster", { + -- animal, monster, npc, barbarian type = "monster", - hp_min = 30, - hp_max = 40, + -- agressive, deals 3 damage to player when hit + passive = false, + damage = 7, + attack_type = "shoot", + shoot_interval = .5, + arrow = "mobs:mese_arrow", + shoot_offset = 2, + -- health & armor + 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", mesh = "zmobs_mese_monster.x", - --textures = {"zmobs_mese_monster.png"}, available_textures = { total = 1, texture_1 = {"zmobs_mese_monster.png"}, }, visual_size = {x=1, y=1}, - makes_footstep_sound = true, - view_range = 16, - walk_velocity = 1, - run_velocity = 3, - damage = 6, - drops = { - {name = "default:mese_crystal", - chance = 9, - min = 1, - max = 3,}, - {name = "default:mese_crystal_fragment", - chance = 1, - min = 1, - max = 9,}, - {name = "maptools:silver_coin", - chance = 2, - min = 2, - max = 5,}, - {name = "returnmirror:mirror_inactive", - chance = 50, - min = 1, - max = 1,}, - }, - light_resistant = true, - armor = 80, drawtype = "front", - water_damage = 0, - lava_damage = 0, - light_damage = 0, - attack_type = "shoot", - arrow = "mobs:mese_arrow", - shoot_interval = .5, - animation = { - speed_normal = 15, - speed_run = 15, - stand_start = 0, - stand_end = 14, - walk_start = 15, - walk_end = 38, - run_start = 40, - run_end = 63, - punch_start = 15, -- 40 - punch_end = 38, -- 63 - }, + blood_texture = "default_mese_crystal_fragment.png", + -- sounds + makes_footstep_sound = true, sounds = { random = "mobs_mesemonster", }, + -- speed and jump + view_range = 16, + walk_velocity = 0.5, + run_velocity = 2, jump = true, step = 1, - shoot_offset = 2, - blood_texture = "default_mese_crystal_fragment.png", + fall_damage = 0, + fall_speed = -6, + -- drops mese when dead + drops = { + {name = "default:mese_crystal", + chance = 9, min = 1, max = 3,}, + {name = "default:mese_crystal_fragment", + chance = 1, min = 1, max = 9,}, + {name = "maptools:silver_coin", + chance = 2, min = 2, max = 5,}, + {name = "returnmirror:mirror_inactive", + chance = 50, min = 1, max = 1,}, + }, + -- damaged by + light_resistant = true, + water_damage = 0, + lava_damage = 0, + light_damage = 0, + -- model animation + animation = { + speed_normal = 15, speed_run = 15, + stand_start = 0, stand_end = 14, + walk_start = 15, walk_end = 38, + run_start = 40, run_end = 63, + punch_start = 15, punch_end = 38, -- was 40 & 63 + }, }) +-- spawn on stone between 20 and -1 light, 1 in 6000 chance, 1 in area below -25 mobs:register_spawn("mobs:mese_monster", {"default:stone", }, 20, -1, 6000, 1, -25) +-- register spawn egg mobs:register_egg("mobs:mese_monster", "Mese Monster", "default_mese_block.png", 1) -- Mese Monster Crystal Shards (weapon) @@ -95,9 +82,19 @@ mobs:register_arrow("mobs:mese_arrow", { player:punch(self.object, 1.0, { full_punch_interval=1.0, damage_groups = {fleshy=7}, - }, 0) -- {x=s.x-p.x, y=s.y-p.y, z=s.z-p.z}) + }, 0) end, hit_node = function(self, pos, node) end }) + +-- 9 mese crystal fragments = 1 mese crystal +minetest.register_craft({ + output = "default:mese_crystal", + recipe = { + {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, + {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, + {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, + } +}) diff --git a/mods/mobs/models/character.b3d b/mods/mobs/models/character.b3d new file mode 100755 index 0000000000000000000000000000000000000000..bc9d92735aa6bf688cfb55e4d552c347f453f3fe GIT binary patch literal 86880 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∓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 literal 0 HcmV?d00001 diff --git a/mods/mobs/models/mobs_npc.png b/mods/mobs/models/mobs_npc.png new file mode 100755 index 0000000000000000000000000000000000000000..93563989580324581cac10eaa5a91c427eaac724 GIT binary patch literal 901 zcmV;01A6?4P)067o8=&K2l_nO4V-n|G)B{ptiksc002fl!)YT zauTX)vt?PX*QHpQtAo{27_Eh=elm_*5!U(mUnpU$)#7J>>-Fo4Be(e#Kx-v*{UZS4 zZnrN!eVvd0rIA(%q5ce@l(y3Rroo#OoDxn5BmOL6EuA(($zK3|FCzprQV97r@HlH{ zm2^;0NbQW`OsrJ87FH>1p~;c@aW={tYmmRPsHJmCYKeYwwKZ^^coFY78zHgLn5_Y% z6lh6w75dUBA?ru^zCUiakMHZToP2Q2ue+M6=C)FxuZ46k^*_!UmA9fcdTU7Z5?r*U zF-`&DZ3-66XRHDOk|_hdP@5Y3Q5dj!Ct{&5(1d2Y5f;59Yb~?@s?cxC$Y+8wD`%8( zj&FlTLs;vK+pl+w!DG;_Q-Jw+4!rL1-q&;a4*sQ?!Z3^tZ2yiShVvQkVVtIMxC6{U zIL8!T06aFP_&^Sk^AFJjcpQd%K*pwcer)$c=(GkTimIdcl3tfpK& zXw3khAQqpO6XPc$EUbPE1OzG!Fk(EHee)e4Gjtl6LBe`win(Ke)$gM(oPeEn2L3+= zc}8vni@h?yhLrohFo55qa)GEnu~FMJZQJ;kP7e)I#{+yPo5U=plpo0i&Dq={Jj)i3ekvLUQ?c>wU)9kyd?HXbb9NVJ!%#CueOw`|tk zd!{O}eeXG#_`^eTABK@hu@5RJ2caCG0)&nq>K_0l&=VHHggs&gr&G5=l?rYQFuIL# zcuJv*MaTxoDRqT-Ov8|9GZY$^s6#NuvK$$NZWpWJB82jl;y9wA%V`~VM~Y0Hy#3R!0{9|`}$00000NkvXXu0mjfYEy{n literal 0 HcmV?d00001 diff --git a/mods/mobs/npc.lua b/mods/mobs/npc.lua new file mode 100755 index 00000000..11916434 --- /dev/null +++ b/mods/mobs/npc.lua @@ -0,0 +1,83 @@ + +-- Npc by TenPlus1 + +mobs.npc_drops = { "default:pick_steel", "mobs:meat", "default:sword_steel", "default:shovel_steel", "farming:bread", "bucket:bucket_water" } + +mobs:register_mob("mobs:npc", { + -- animal, monster, npc + type = "npc", + -- aggressive, deals 3 damage to player/monster when hit + passive = false, + damage = 3, + attack_type = "dogfight", + attacks_monsters = true, + -- health & armor + 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", + available_textures = { + total = 1, + texture_1 = {"mobs_npc.png"}, + }, + visual_size = {x=1, y=1}, + -- sounds + makes_footstep_sound = true, + sounds = {}, + -- speed and jump + walk_velocity = 1, + run_velocity = 2, + jump = true, + -- drops wood and chance of apples when dead + drops = { + {name = "default:wood", + chance = 1, min = 1, max = 3}, + {name = "default:apple", + chance = 2, min = 1, max = 2}, + {name = "default:axe_stone", + chance = 3, min = 1, max = 1}, + }, + -- damaged by + water_damage = 0, + lava_damage = 2, + light_damage = 0, + -- follow diamond + follow = "default:diamond", + view_range = 16, + -- model animation + animation = { + speed_normal = 30, speed_run = 30, + stand_start = 0, stand_end = 79, + walk_start = 168, walk_end = 187, + run_start = 168, run_end = 187, + punch_start = 200, punch_end = 219, + }, + -- right clicking with cooked meat 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 + local hp = self.object:get_hp() + 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) + -- 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 + item:take_item() + clicker:set_wielded_item(item) + end + local pos = self.object:getpos() + pos.y = pos.y + 0.5 + minetest.add_item(pos, {name = mobs.npc_drops[math.random(1,#mobs.npc_drops)]}) + end + end, +}) +-- spawning disabled for now +--mobs:register_spawn("mobs:npc", {"default:dirt_with_grass"}, 20, 0, 7000, 1, 31000) +-- register spawn egg +mobs:register_egg("mobs:npc", "Npc", "default_brick.png", 1) diff --git a/mods/mobs/oerkki.lua b/mods/mobs/oerkki.lua index ff3782b5..3826f727 100755 --- a/mods/mobs/oerkki.lua +++ b/mods/mobs/oerkki.lua @@ -1,61 +1,66 @@ --- Oerkki +-- Oerkki by PilzAdam mobs:register_mob("mobs:oerkki", { + -- animal, monster, npc, barbarian type = "monster", - hp_min = 40, - hp_max = 50, + -- aggressive, deals 5 damage when player hit + passive = false, + attack_type = "dogfight", + damage = 5, + -- health & armor + 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", - --textures = {"mobs_oerkki.png"}, + drawtype = "front", available_textures = { total = 2, texture_1 = {"mobs_oerkki.png"}, texture_2 = {"mobs_oerkki2.png"}, }, visual_size = {x=5, y=5}, + blood_texture = "mobs_blood.png", + -- sounds makes_footstep_sound = false, - view_range = 16, - walk_velocity = 2, - run_velocity = 4, - damage = 5, - drops = { - {name = "default:obsidian", - chance = 3, - min = 1, - max = 2,}, - {name = "maptools:silver_coin", - chance = 2, - min = 2, - max = 3,}, - }, - armor = 90, - drawtype = "front", - light_resistant = true, - water_damage = 1, - lava_damage = 1, - light_damage = 0, - attack_type = "dogfight", - animation = { - stand_start = 0, - stand_end = 23, - walk_start = 24, - walk_end = 36, - run_start = 37, - run_end = 49, - punch_start = 37, - punch_end = 49, - speed_normal = 15, - speed_run = 15, - }, sounds = { random = "mobs_oerkki", attack = "mobs_oerkki_attack", }, + -- speed and jump + walk_velocity = 2, + run_velocity = 4, + view_range = 16, jump = true, step = 1, - blood_texture = "mobs_blood.png", + -- chance of dropping obsidian and coins + drops = { + {name = "default:obsidian", + chance = 3, min = 1, max = 2,}, + {name = "maptools:silver_coin", + chance = 2, min = 2, max = 3,}, + }, + -- damaged by + light_resistant = true, + water_damage = 1, + lava_damage = 1, + light_damage = 0, + -- model animation + animation = { + stand_start = 0, stand_end = 23, + walk_start = 24, walk_end = 36, + run_start = 37, run_end = 49, + punch_start = 37, punch_end = 49, + speed_normal = 15, speed_run = 15, + }, + -- replace torch with air (remove) + replace_rate = 50, + replace_what = {"default:torch"}, + replace_with = "air", + replace_offset = -1, }) -mobs:register_spawn("mobs:oerkki", {"default:stone"}, 2, -1, 6000, 1, -10) +-- spawns on stone between 5 and -1 light, 1 in 7000 chance, 1 in area starting at -10 and below +mobs:register_spawn("mobs:oerkki", {"default:stone"}, 5, -1, 7000, 1, -10) +-- register spawn egg mobs:register_egg("mobs:oerkki", "Oerkki", "default_obsidian.png", 1) diff --git a/mods/mobs/rat.lua b/mods/mobs/rat.lua index f5f16d23..5afa2620 100755 --- a/mods/mobs/rat.lua +++ b/mods/mobs/rat.lua @@ -1,34 +1,39 @@ --- Rat +-- Rat by PilzAdam mobs:register_mob("mobs:rat", { + -- animal, monster, npc, barbarian type = "animal", - hp_min = 1, - hp_max = 4, -- 1 + -- not aggressive + passive = true, + -- health & armor + 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", - --textures = {"mobs_rat.png"}, + drawtype = "front", available_textures = { total = 2, texture_1 = {"mobs_rat.png"}, texture_2 = {"mobs_rat_brown.png"}, }, + -- sounds makes_footstep_sound = false, - walk_velocity = 1, - armor = 200, - drops = {}, - drawtype = "front", - water_damage = 0, - lava_damage = 1, - light_damage = 0, -jump = true, -step = 1, -passive = true, sounds = { random = "mobs_rat", }, - + -- speed and jump + walk_velocity = 1, + jump = true, + step = 1, + -- no drops + drops = {}, + -- damaged by + water_damage = 0, + lava_damage = 1, + light_damage = 0, + -- right click to pick up rat on_rightclick = function(self, clicker) if clicker:is_player() and clicker:get_inventory() then clicker:get_inventory():add_item("main", "mobs:rat") @@ -36,15 +41,15 @@ passive = true, end end, }) -mobs:register_spawn("mobs:rat", {"default:stone"}, 20, -1, 9000, 1, 31000) +-- spawn on stone between 1 and 20 light, 1 in 7000 chance, 1 per area up to 31000 in height +mobs:register_spawn("mobs:rat", {"default:stone"}, 20, 0, 9000, 1, 31000) +-- register spawn egg mobs:register_egg("mobs:rat", "Rat", "mobs_rat_inventory.png", 0) -- Cooked Rat, yummy! - minetest.register_craftitem("mobs:rat_cooked", { description = "Cooked Rat", inventory_image = "mobs_cooked_rat.png", - on_use = minetest.item_eat(3), }) diff --git a/mods/mobs/sandmonster.lua b/mods/mobs/sandmonster.lua index 06e1ee2d..268bc77d 100755 --- a/mods/mobs/sandmonster.lua +++ b/mods/mobs/sandmonster.lua @@ -1,61 +1,59 @@ --- Sand Monster +-- Sand Monster by PilzAdam mobs:register_mob("mobs:sand_monster", { + -- animal, monster, npc, barbarian type = "monster", - hp_min = 15, - hp_max = 20, + -- aggressive, deals 3 damage to player when hit + passive = false, + attack_type = "dogfight", + damage = 3, + -- health & armor + 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", - --textures = {"mobs_sand_monster.png"}, + drawtype = "front", available_textures = { total = 1, texture_1 = {"mobs_sand_monster.png"}, }, visual_size = {x=8,y=8}, + blood_texture = "mobs_blood.png", + -- sounds makes_footstep_sound = true, - view_range = 16, - walk_velocity = 3, - run_velocity = 5, - damage = 3, - drops = { - {name = "default:desert_sand", - chance = 1, - min = 3, - max = 5,}, - {name = "maptools:copper_coin", - chance = 2, - min = 2, - max = 4,}, - }, - light_resistant = true, - armor = 90, - drawtype = "front", - water_damage = 3, - lava_damage = 1, - light_damage = 0, - on_rightclick = nil, - attack_type = "dogfight", - animation = { - speed_normal = 15, - speed_run = 15, - stand_start = 0, - stand_end = 39, - walk_start = 41, - walk_end = 72, - run_start = 74, - run_end = 105, - punch_start = 74, - punch_end = 105, - }, sounds = { random = "mobs_sandmonster", }, + -- speed and jump, sinks in water + walk_velocity = 3, + run_velocity = 5, + view_range = 16, jump = true, step = 1, - blood_texture = "mobs_blood.png", floats = 0, + -- drops desert sand when dead + drops = { + {name = "default:desert_sand", + chance = 1, min = 3, max = 5,}, + {name = "maptools:copper_coin", + chance = 2, min = 2, max = 4,}, + }, + -- damaged by + water_damage = 3, + lava_damage = 1, + light_damage = 0, + -- model animation + animation = { + speed_normal = 15, speed_run = 15, + stand_start = 0, stand_end = 39, + walk_start = 41, walk_end = 72, + run_start = 74, run_end = 105, + punch_start = 74, punch_end = 105, + }, }) +-- spawns on desert sand between -1 and 20 light, 1 in 5000 chance, 1 sand monster in area up to 31000 in height mobs:register_spawn("mobs:sand_monster", {"default:desert_sand", "default:sand"}, 20, -1, 5000, 1, 31000) -mobs:register_egg("mobs:sand_monster", "Sand Monster", "default_desert_sand.png", 1) \ No newline at end of file +-- register spawn egg +mobs:register_egg("mobs:sand_monster", "Sand Monster", "default_desert_sand.png", 1) diff --git a/mods/mobs/sheep.lua b/mods/mobs/sheep.lua index 8883cec9..3a334609 100755 --- a/mods/mobs/sheep.lua +++ b/mods/mobs/sheep.lua @@ -1,47 +1,56 @@ --- Sheep +-- Sheep by PilzAdam mobs:register_mob("mobs:sheep", { + -- animal, monster, npc, barbarian type = "animal", - hp_min = 10, - hp_max = 15, + -- not aggressive + passive = true, + -- health & armor + hp_min = 10, hp_max = 15, armor = 200, + -- textures and model collisionbox = {-0.4, -0.01, -0.4, 0.4, 1, 0.4}, - --textures = {"mobs_sheep.png"}, + visual = "mesh", + mesh = "mobs_sheep.x", + drawtype = "front", available_textures = { total = 1, texture_1 = {"mobs_sheep.png"}, }, - visual = "mesh", - mesh = "mobs_sheep.x", + blood_texture = "mobs_blood.png", + visual_size = {x=1,y=1}, + -- sounds makes_footstep_sound = true, - walk_velocity = 1, - armor = 200, - drops = { - {name = "mobs:meat_raw", - chance = 1, - min = 2, - max = 3,}, - }, - drawtype = "front", - water_damage = 1, - lava_damage = 5, - light_damage = 0, sounds = { random = "mobs_sheep", }, - animation = { - speed_normal = 15, - stand_start = 0, - stand_end = 80, - walk_start = 81, - walk_end = 100, - }, + -- speed and jump + walk_velocity = 1, jump = true, step = 1, - blood_texture = "mobs_blood.png", - passive = true, + -- drops raw meat when dead + drops = { + {name = "mobs:meat_raw", + chance = 1, min = 2, max = 3,}, + }, + -- damaged by + water_damage = 1, + lava_damage = 5, + light_damage = 0, + -- model animation + animation = { + speed_normal = 15, speed_run = 15, + stand_start = 0, stand_end = 80, + walk_start = 81, walk_end = 100, + }, + -- follows wheat follow = "farming:wheat", view_range = 8, + -- replace grass/wheat with air (eat) + replace_rate = 50, + replace_what = {"default:grass_3", "default:grass_4", "default:grass_5", "farming:wheat_8"}, + replace_with = "air", + -- right click sheep to shear sheep and get wood, feed 8 wheat for wool to grow back on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() if item:get_name() == "farming:wheat" then @@ -52,6 +61,7 @@ mobs:register_mob("mobs:sheep", { 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 -- can be shaved again self.tamed = true self.object:set_properties({ @@ -62,7 +72,7 @@ mobs:register_mob("mobs:sheep", { end return end - if clicker:get_inventory() and not self.gotten then + if clicker:get_inventory() and not self.gotten and self.child == false then self.gotten = true -- shaved if minetest.registered_items["wool:white"] then clicker:get_inventory():add_item("main", ItemStack("wool:white "..math.random(1,3))) @@ -75,5 +85,7 @@ mobs:register_mob("mobs:sheep", { 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 mobs:register_spawn("mobs:sheep", {"default:dirt_with_grass"}, 20, 8, 9000, 1, 31000) -mobs:register_egg("mobs:sheep", "Sheep", "wool_white.png", 1) \ No newline at end of file +-- register spawn egg +mobs:register_egg("mobs:sheep", "Sheep", "wool_white.png", 1) diff --git a/mods/mobs/sounds/mobs_dirtmonster.ogg b/mods/mobs/sounds/mobs_dirtmonster.ogg old mode 100755 new mode 100644 diff --git a/mods/mobs/sounds/mobs_dungeonmaster.ogg b/mods/mobs/sounds/mobs_dungeonmaster.ogg old mode 100755 new mode 100644 diff --git a/mods/mobs/sounds/mobs_lavaflan.ogg b/mods/mobs/sounds/mobs_lavaflan.ogg old mode 100755 new mode 100644 diff --git a/mods/mobs/sounds/mobs_mesemonster.ogg b/mods/mobs/sounds/mobs_mesemonster.ogg old mode 100755 new mode 100644 diff --git a/mods/mobs/sounds/mobs_oerkki.ogg b/mods/mobs/sounds/mobs_oerkki.ogg old mode 100755 new mode 100644 diff --git a/mods/mobs/sounds/mobs_pig_angry.ogg b/mods/mobs/sounds/mobs_pig_angry.ogg new file mode 100755 index 0000000000000000000000000000000000000000..2a4f47b4f7454455e7b61b3e4d99ad590b569feb GIT binary patch literal 7835 zcmahtc|4Te_s<|(VcxP8Cfd-G0Bv2az(8>%&eh8+DAWUT;P)HH^)A?gM}Yvs?ly44LhBLJl%v>OWy3`U;D5{JRW)sX$3z}Xq{p0d(=IP2|+KKoWvbgmo9OKI+^@6 zQQ&{`e5+_Y57F8T{vy{pRgd#1G7a99Yi+8>aT3R?z9@>!FqJvqUW~12$O3=X|CMJ=Vw#SOEYu zwOlxrB|fp11vm`=Y-KVTZ)Gx0AadMI1oufmPeB3TSunpzHvh{9k{3thFOKS8LPd|O zqEH)nG>tjMRXhZkTy>4B3hy2he}2eAn3Koh03Z%p%~0k!l=WZc0o-H|$x_XWQP_+) zFNBY5*CHSI*dW=rw~~W?r&H4BP$+k`(VaWl)=T2K zHr*!hlHZzh0)Rw3zqPSM!at8>i9}(yUU*gU4Q|=$%8Jy}eez8Mr~8?Y<%Xs~^%bQT z&YyeBs2=BUMeYi_4=6LrZdvL5OHFZ5;Im7jT_KW2p^`6iY%rB;PQ#f`;ZP1OXoptJ)C9&kA2YWZ{a+I=wy&Zw0DLgc zs5DNkG|pH!mm>)&m#6_#ni)+psdvt0EEwlVn&elSkls5~c=?gNBPjP+_DOV^B+Ma0 zddUO=3xZGn5(YqPe-tevhw^uTGlh(EA*bHl;$5HilR7yQLwjiZ7(W83ouxH2!qS2 zVyv~gbRO2iRJt6D4}b&w9V{Qt5`gFy1BCNAnwD!SmvU7s`3;ab^d%KEZB29hyBQLt z^|uWQiNZ|Tpd9iwhg7siZBRohsBv%!){cAw)Hr4okDtMz==qqLO|+9>*d-K(ZiAjt zL(w+SQyb9^6L|MEP1L&CC|+w6=Q)nYIN{OgO*3S^IW5m~6pxw7^F&|uoZ37)ibId0 zJg0EzsW4BwHnhV=^e8@IF3;21&eK6S4857)M9X`RL(}a%?bK|+T_;+?`~=>$P}33x zaz+oSpzZKzXFD`);_PTHlk=1f+93?&jJBJ=52-LY�p9@|m3N^6_*WNbKqG17){? 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 literal 0 HcmV?d00001 diff --git a/mods/mobs/treemonster.lua b/mods/mobs/treemonster.lua index ea4695a0..be956276 100755 --- a/mods/mobs/treemonster.lua +++ b/mods/mobs/treemonster.lua @@ -1,75 +1,70 @@ --- Tree Monster (or Tree Gollum as I like to call it) +-- Tree Monster (or Tree Gollum) by PilzAdam mobs:register_mob("mobs:tree_monster", { + -- animal, monster, npc, barbarian type = "monster", - hp_min = 40, - hp_max = 50, + -- aggressive, deals 6 damage to player when hit + passive = false, + attack_type = "dogfight", + damage = 6, + -- health & armor + 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", - --textures = {"mobs_tree_monster.png"}, + drawtype = "front", available_textures = { total = 1, texture_1 = {"mobs_tree_monster.png"}, }, visual_size = {x=4.5,y=4.5}, + blood_texture = "default_wood.png", + -- sounds makes_footstep_sound = true, - view_range = 16, + sounds = { + random = "mobs_treemonster", + }, + -- speed and jumop walk_velocity = 0.5, run_velocity = 2.5, - damage = 6, + jump = true, + step = 0.5, + view_range = 16, + -- drops saplings or apple drops = { {name = "ethereal:tree_sapling", - chance = 3, - min = 1, - max = 2,}, + chance = 3, min = 1, max = 2}, {name = "ethereal:jungle_tree_sapling", - chance = 3, - min = 1, - max = 2,}, + chance = 3, min = 1, max = 2}, {name = "default:apple", - chance = 2, - min = 1, - max = 5,}, + chance = 2, min = 1, max = 3,}, {name = "maptools:silver_coin", chance = 2, min = 1, max = 1,}, }, - light_resistant = true, - armor = 80, - drawtype = "front", + -- damaged by water_damage = 1, lava_damage = 5, light_damage = 2, - disable_fall_damage = true, - attack_type = "dogfight", + fall_damage = 0, + -- model animation animation = { - speed_normal = 15, - speed_run = 15, - stand_start = 0, - stand_end = 24, - walk_start = 25, - walk_end = 47, - run_start = 48, - run_end = 62, - punch_start = 48, - punch_end = 62, + speed_normal = 15, speed_run = 15, + stand_start = 0, stand_end = 24, + walk_start = 25, walk_end = 47, + run_start = 48, run_end = 62, + punch_start = 48, punch_end = 62, }, - sounds = { - random = "mobs_treemonster", - }, - step = 0.5, - jump = true, - step = 1, - blood_texture = "default_wood.png", }) +-- spawn on leaves and beech_leaves, between 0 and 5 light, 1 in 7000 chance, 1 in area up to 31000 in height mobs:register_spawn("mobs:tree_monster", {"default:leaves", "moretrees:beech_leaves"}, 3, -1, 8000, 1, 31000) +-- register spawn egg mobs:register_egg("mobs:tree_monster", "Tree Monster", "default_tree_top.png", 1) -- 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 3e253f17..d6da9b60 100755 --- a/mods/mobs/warthog.lua +++ b/mods/mobs/warthog.lua @@ -1,56 +1,67 @@ --- Warthog + +-- Warthog by KrupnoPavel mobs:register_mob("mobs:pumba", { + -- animal, monster, npc, barbarian type = "animal", - hp_min = 10, - hp_max = 15, + -- aggressive, deals 2 damage to player when threatened + passive = false, + attack_type = "dogfight", + damage = 4, + -- health & armor + hp_min = 15, hp_max = 20, armor = 200, + -- textures and model collisionbox = {-0.4, -0.01, -0.4, 0.4, 1, 0.4}, - --textures = {"mobs_pumba.png"}, + visual = "mesh", + mesh = "mobs_pumba.x", + drawtype = "front", available_textures = { total = 1, texture_1 = {"mobs_pumba.png"}, }, - visual = "mesh", - mesh = "mobs_pumba.x", + visual_size = {x=1,y=1}, + blood_texture = "mobs_blood.png", + -- sounds makes_footstep_sound = true, + sounds = { + random = "mobs_pig", + attack = "mobs_pig_angry", + }, + -- speed and jump walk_velocity = 2, - armor = 200, + run_velocity = 3, + jump = true, + step = 1, + -- follows apple + follow = "default:apple", + view_range = 8, + -- drops raw pork when dead drops = { {name = "mobs:pork_raw", - chance = 1, - min = 2, - max = 3,}, + chance = 1, min = 2, max = 3,}, }, - drawtype = "front", + -- damaged by water_damage = 1, lava_damage = 5, light_damage = 0, - sounds = { - random = "mobs_pig", - }, + -- model animation animation = { speed_normal = 15, - stand_start = 25, - stand_end = 55, - walk_start = 70, - walk_end = 100, + stand_start = 25, stand_end = 55, + walk_start = 70, walk_end = 100, + punch_start = 70, punch_end = 100, }, - follow = "farming:wheat", - view_range = 8, - jump = true, - step = 1, - passive = true, - blood_texture = "mobs_blood.png", - + -- can be tamed by feeding 8 wheat (will not attack when tamed) on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() - if item:get_name() == "farming:wheat" then + if item:get_name() == "default:apple" then if not minetest.setting_getbool("creative_mode") then item:take_item() clicker:set_wielded_item(item) 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 self.tamed = true minetest.sound_play("mobs_pig", {object = self.object,gain = 1.0,max_hear_distance = 32,loop = false,}) @@ -60,11 +71,12 @@ mobs:register_mob("mobs:pumba", { end, }) +-- spawns on normal or shroom dirt, between 8 and 20 light, 1 in 10000 chance, 1 in area up to 31000 in height mobs:register_spawn("mobs:pumba", {"default:dirt_with_grass", "default:dirt"}, 20, 8, 10000, 1, 31000) +-- register spawn egg mobs:register_egg("mobs:pumba", "Warthog", "wool_pink.png", 1) --- Porkchops - +-- Porkchops (raw and cooked) minetest.register_craftitem("mobs:pork_raw", { description = "Raw Porkchop", inventory_image = "mobs_pork_raw.png", diff --git a/mods/mobs/wolf.lua b/mods/mobs/wolf.lua index 8f91cf68..f03c52ee 100755 --- a/mods/mobs/wolf.lua +++ b/mods/mobs/wolf.lua @@ -14,7 +14,7 @@ mobs:register_mob("mobs:wolf", { }, --visual_size = {x=1, y=1}, makes_footstep_sound = true, - view_range = 20, + view_range = 16, walk_velocity = 3, run_velocity = 5, damage = 4,