]> git.lizzy.rs Git - Crafter.git/blobdiff - mods/mob/api/interaction.lua
Overhaul snowman with ElCeejo's remake of 22i's snowman model :D
[Crafter.git] / mods / mob / api / interaction.lua
index 9f2ed3293978d6ccd6d369aec20baf444949da61..a98d8f4f8f522be16626a4d4c048a34c3f0f9f8c 100644 (file)
@@ -66,21 +66,22 @@ mobs.create_interaction_functions = function(def,mob_register)
                        end
                end
        end
-       
-       mob_register.fall_damage = function(self)
-               local vel = self.object:get_velocity()
-               if vel and self.oldvel then
-                  if self.oldvel.y < -7 and vel.y == 0 then
-                         local damage = math.abs(self.oldvel.y + 7)
-                         damage = math.floor(damage/1.5)
-                         self.object:punch(self.object, 2, 
-                                {
-                                 full_punch_interval=1.5,
-                                 damage_groups = {damage=damage},
-                                })
-                  end
+       if def.takes_fall_damage == nil or def.takes_fall_damage == true then
+               mob_register.fall_damage = function(self)
+                       local vel = self.object:get_velocity()
+                       if vel and self.oldvel then
+                               if self.oldvel.y < -7 and vel.y == 0 then
+                                       local damage = math.abs(self.oldvel.y + 7)
+                                       damage = math.floor(damage/1.5)
+                                       self.object:punch(self.object, 2, 
+                                               {
+                                               full_punch_interval=1.5,
+                                               damage_groups = {damage=damage},
+                                               })
+                               end
+                       end
+                       self.oldvel = vel
                end
-               self.oldvel = vel
        end
 
        --this controls what happens when the mob gets punched
@@ -108,7 +109,7 @@ mobs.create_interaction_functions = function(def,mob_register)
                local hp = hp-hurt
 
                if (self.punched_timer <= 0 and hp > 1) and not self.dead then
-                       self.object:set_texture_mod("^[colorize:red:130")
+                       self.object:set_texture_mod("^[colorize:"..self.damage_color..":130")
                        self.hurt_color_timer = 0.25
                        if puncher ~= self.object then
                                self.punched_timer = 0.8
@@ -147,7 +148,7 @@ mobs.create_interaction_functions = function(def,mob_register)
                        self.object:add_velocity(dir)
                        self.add_sword_wear(self, puncher, time_from_last_punch, tool_capabilities, dir)
                elseif (self.punched_timer <= 0 and self.death_animation_timer == 0) then
-                       self.object:set_texture_mod("^[colorize:red:130")
+                       self.object:set_texture_mod("^[colorize:"..self.damage_color..":130")
                        self.hurt_color_timer = 0.25
                        if puncher ~= self.object then
                                self.punched_timer = 0.8
@@ -203,19 +204,23 @@ mobs.create_interaction_functions = function(def,mob_register)
                --only throw items if registered
                if self.item_drop then
                        --detect if multiple items are going to be added
-                       if self.item_amount  and self.item_minumum then
-                               local data_item_amount = math.random(self.item_minimum, self.item_amount)
-                               for i = self.item_minimum,data_item_amount do
-                                       minetest.throw_item(pos,self.item_drop)
+                       if self.item_max then
+                               local data_item_amount = math.random(self.item_minimum, self.item_max)
+                               for i = ,data_item_amount do
+                                       minetest.throw_item(vector.new(pos.x,pos.y+0.1,pos.z),self.item_drop)
                                end
                        else
-                               minetest.throw_item(pos,self.item_drop)
+                               minetest.throw_item(vector.new(pos.x,pos.y+0.1,pos.z),self.item_drop)
                        end
                end
                        
                global_mob_amount = global_mob_amount - 1
                print("Mobs Died. Current Mobs: "..global_mob_amount)
                
+               if self.custom_on_death then
+                       self.custom_on_death(self)
+               end
+
                self.object:remove()
        end
        
@@ -257,7 +262,8 @@ mobs.create_interaction_functions = function(def,mob_register)
                                --print(self.hostile)
                                if self.hostile == true then
                                        local distance = vector.distance(pos,pos2)
-                                       
+                                       self.following_pos = vector.new(pos2.x,pos2.y-1.625,pos2.z)
+
                                        --punch the player
                                        if self.attack_type == "punch" then
                                                if distance < 2.5 and self.punch_timer <= 0 and object:get_hp() > 0 then
@@ -290,15 +296,22 @@ mobs.create_interaction_functions = function(def,mob_register)
                                                if self.projectile_timer <= 0 then
                                                        self.projectile_timer = self.projectile_timer_cooldown
                                                        
-                                                       local obj = minetest.add_entity(pos, self.projectile_type)
+                                                       local obj = minetest.add_entity(vector.new(pos.x,pos.y+self.object:get_properties().collisionbox[5],pos.z), self.projectile_type)
                                                        if obj then
-                                                               local dir = vector.multiply(vector.direction(pos,pos2), 50)
+                                                               local dir = vector.multiply(vector.direction(pos,vector.new(pos2.x,pos2.y-3,pos2.z)), 50)
                                                                obj:set_velocity(dir)
                                                                obj:get_luaentity().timer = 2
+                                                               obj:get_luaentity().owner = self.object
                                                        end
                                                end
                                        end
-                                       self.direction = vector.direction(vector.new(pos.x,0,pos.z),vector.new(pos2.x,0,pos2.z))
+                                       --smart
+                                       if self.path_data and table.getn(self.path_data) > 0 then
+                                               self.direction = vector.direction(vector.new(pos.x,0,pos.z), vector.new(self.path_data[1].x,0,self.path_data[1].z))
+                                       --dumb
+                                       else
+                                               self.direction = vector.direction(vector.new(pos.x,0,pos.z),vector.new(pos2.x,0,pos2.z))
+                                       end
                                        self.speed = self.max_speed
                                        self.following = true
                                end
@@ -308,7 +321,12 @@ mobs.create_interaction_functions = function(def,mob_register)
                end
                --stare straight if not found
                if player_found == false then
-                       self.move_head(self,nil,dtime)
+                       if self.move_head then
+                               self.move_head(self,nil,dtime)
+                       end
+                       if self.following_pos then
+                               self.following_pos = nil
+                       end
                        if self.manage_hostile_timer then
                                self.manage_hostile_timer(self,dtime)
                        end
@@ -316,4 +334,4 @@ mobs.create_interaction_functions = function(def,mob_register)
        end
        
        return(mob_register)
-end
+end
\ No newline at end of file