diff --git a/api.lua b/api.lua index 80e7a7c..461c10f 100644 --- a/api.lua +++ b/api.lua @@ -1,4 +1,4 @@ - -- Mobs Api (5th March 2015) + -- Mobs Api (6th March 2015) mobs = {} -- Set global for other mod checks (e.g. Better HUD uses this) @@ -17,7 +17,7 @@ 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, @@ -279,7 +279,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) @@ -317,22 +317,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 diff --git a/chicken.lua b/chicken.lua index ed5e24e..b4d505e 100644 --- a/chicken.lua +++ b/chicken.lua @@ -52,6 +52,7 @@ mobs:register_mob("mobs:chicken", { follow = "farming:wheat", view_range = 5, -- right click to pick up chicken on_rightclick = function(self, clicker) + local item = clicker:get_wielded_item() if clicker:is_player() and clicker:get_inventory() then clicker:get_inventory():add_item("main", "mobs:chicken") self.object:remove() diff --git a/init.lua b/init.lua index 52d6536..99835b9 100644 --- a/init.lua +++ b/init.lua @@ -29,6 +29,9 @@ dofile(minetest.get_modpath("mobs").."/mese_monster.lua") dofile(minetest.get_modpath("mobs").."/spider.lua") +-- NPC +dofile(minetest.get_modpath("mobs").."/npc.lua") + -- Meat & Cooked Meat minetest.register_craftitem("mobs:meat_raw", { diff --git a/models/character.b3d b/models/character.b3d new file mode 100644 index 0000000..bc9d927 Binary files /dev/null and b/models/character.b3d differ diff --git a/models/mobs_npc.png b/models/mobs_npc.png new file mode 100644 index 0000000..9356398 Binary files /dev/null and b/models/mobs_npc.png differ diff --git a/npc.lua b/npc.lua new file mode 100644 index 0000000..61059e1 --- /dev/null +++ b/npc.lua @@ -0,0 +1,70 @@ + +-- Npc by TenPlus1 + +mobs:register_mob("mobs:npc", { + -- animal, monster, npc, barbarian + type = "npc", + -- aggressive, deals 1 damage to player/mob when hit + passive = false, + damage = 1, + attack_type = "dogfight", + attacks_monsters = true, + -- health & armor + hp_min = 10, 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}, + }, + -- damaged by + water_damage = 1, + lava_damage = 2, + light_damage = 0, + -- follow diamond + follow = "default:diamond", + view_range = 15, + -- 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" then + if not minetest.setting_getbool("creative_mode") then + item:take_item() + clicker:set_wielded_item(item) + end + local hp = self.object:get_hp() + 4 + if hp > self.hp_max then hp = self.hp_max end + self.object:set_hp(hp) + 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)