123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- mobs:register_mob("nssm:morgut", {
- type = "monster",
- hp_max = 35,
- hp_min = 28,
- collisionbox = {-0.3, -0.1, -0.3, 0.3, 1.8, 0.3},
- visual = "mesh",
- rotate= 270,
- mesh = "morgut.x",
- textures = {
- {"morgut.png"}
- },
- visual_size = {x = 5, y = 5},
- makes_footstep_sound = true,
- view_range = 26,
- walk_velocity = 0.5,
- reach =2,
- run_velocity = 4,
- damage = 4,
- runaway = true,
- jump = true,
- sounds = {
- random = "morgut",
- },
- drops = {
- {name = "nssm:life_energy", chance = 1, min = 1, max = 3},
- {name = "nssm:gluttonous_soul_fragment", chance = 3, min = 1, max = 1},
- },
- armor = 70,
- drawtype = "front",
- water_damage = 0,
- fear_height = 4,
- floats = 1,
- lava_damage = 0,
- fire_damage = 0,
- light_damage = 0,
- group_attack = true,
- attack_animals = true,
- knock_back = 1,
- blood_texture = "morparticle.png",
- stepheight = 1.1,
- attack_type = "dogfight",
- animation = {
- speed_normal = 15,
- speed_run = 30,
- stand_start = 10,
- stand_end = 40,
- walk_start = 50,
- walk_end = 90,
- run_start = 100,
- run_end = 120,
- punch_start = 130,
- punch_end = 160,
- },
- do_custom = function (self)
- self.flag = (self.flag or 0)
- if self.inv_flag ~= 1 then
- self.inventory = {}
- for i = 1, 32 do
- self.inventory[i] = {name = '', num = 0}
- end
- end
- self.inv_flag = (self.inv_flag or 1)
- if self.flag == 1 then
- self.state = ""
- mobs:set_animation(self, "run")
- self.object:set_yaw(self.dir)
- self:set_velocity(4)
- if os.time() - self.morgut_timer > 3 then
- self.flag = 0
- self.state = "stand"
- end
- end
- end,
- custom_attack = function (self)
- self.curr_attack = (self.curr_attack or self.attack)
- self.morgut_timer = (self.morgut_timer or os.time())
- self.dir = (self.dir or 0)
- if (os.time() - self.morgut_timer) > 1 then
- if self.attack then
- local s = self.object:get_pos()
- local p = self.attack:get_pos()
- mobs:set_animation(self, "punch")
- local m = 2
- minetest.add_particlespawner({
- amount = 6,
- time = 1,
- minpos = {x=p.x-0.5, y=p.y-0.5, z=p.z-0.5},
- maxpos = {x=p.x+0.5, y=p.y+0.5, z=p.z+0.5},
- minvel = {x=(s.x-p.x)*m, y=(s.y-p.y)*m, z=(s.z-p.z)*m},
- maxvel = {x=(s.x-p.x)*m, y=(s.y-p.y)*m, z=(s.z-p.z)*m},
- minacc = {x=s.x-p.x, y=s.y-p.y, z=s.z-p.z},
- maxacc = {x=s.x-p.x, y=s.y-p.y, z=s.z-p.z},
- minexptime = 0.2,
- maxexptime = 0.3,
- minsize = 2,
- maxsize = 3,
- collisiondetection = false,
- texture = "roasted_duck_legs.png"
- })
- minetest.after(1, function(self)
- if self and self.attack:is_player() then
- local pname = self.attack:get_player_name()
- local player_inv = minetest.get_inventory(
- {type = 'player', name = pname})
- if player_inv:is_empty('main') then
- --minetest.chat_send_all("Inventory empty")
- else
- for i = 1, 32 do
- --minetest.chat_send_all("Inventory is not empty")
- local items = player_inv:get_stack('main', i)
- local n = items:get_name()
- if minetest.get_item_group(n, "eatable")==1 then
- local index
- local found = 0
- for j = 1,32 do
- if found == 0 then
- if self.inventory[j].num == 0 then
- --found an empty place
- found = 2
- index = j
- else
- --found a corrsponding itemstack
- if self.inventory[j].name == n then
- self.inventory[j].num = self.inventory[j].num +1
- found = 1
- end
- end
- end
- end
- if found == 2 then
- self.inventory[index].name = n
- self.inventory[index].num = 1
- end
- items:take_item()
- player_inv:set_stack('main', i, items)
- end
- end
- end
- mobs:set_animation(self, "run")
- self.flag = 1
- self.morgut_timer = os.time()
- self.curr_attack = self.attack
- self.state = ""
- local pyaw = self.curr_attack: get_look_yaw()
- self.dir = pyaw
- self.object:set_yaw(pyaw)
- if self then
- self:set_velocity(4)
- end
- end
- end, self)
- end
- end
- end,
- on_die = function(self)
- local pos = self.object:get_pos()
- if (self.inventory ~= nil) then
- local elem
- for i = 1,32 do
- if self.inventory[i].num ~= 0 then
- local items = ItemStack(self.inventory[i].name
- .. " " .. self.inventory[i].num)
- local obj = minetest.add_item(pos, items)
- obj:set_velocity({
- x = math.random(-1, 1),
- y = 6,
- z = math.random(-1, 1)
- })
- end
- end
- end
- self.object:remove()
- end,
- })
|