diff --git a/mods/_various/mobs/api.lua b/mods/_various/mobs/api.lua index d8ca0d985..3d46764cd 100644 --- a/mods/_various/mobs/api.lua +++ b/mods/_various/mobs/api.lua @@ -1861,6 +1861,11 @@ end -- deal damage and effects when mob punched function mobs:mob_punch(self, hitter, tflp, tool_capabilities, dir) + -- TEMPORARY FIX (remove when refactoring) + if not hitter then + return + end + -- mob health check if self.health <= 0 then -- kill mob diff --git a/mods/lord/Core/projectiles/src/projectiles/api.lua b/mods/lord/Core/projectiles/src/projectiles/api.lua index b804714d9..c85dccfb2 100644 --- a/mods/lord/Core/projectiles/src/projectiles/api.lua +++ b/mods/lord/Core/projectiles/src/projectiles/api.lua @@ -60,7 +60,40 @@ local flame_node = function(pos) end end -local flame_area = function(p1, p2) +-- `explosive_object` is temporary workaround for mobs to be affected by the explosion +local explode_objects = function(pos, radius, explosive_object, damage_groups) + for obj in core.objects_inside_radius(pos, radius) do + if obj == explosive_object then + goto continue + end + local obj_pos = obj:get_pos() + local distance_vector = vector.subtract(obj_pos, pos) + local distance_length = vector.length(distance_vector) + local dir_vector = vector.normalize(distance_vector) + local explosion_power + + if distance_length == 0 then + explosion_power = radius + else + explosion_power = -math.log10((distance_length/radius)^2) + if explosion_power > radius then + explosion_power = radius + end + end + local dealt_damage = table.mul_values(table.div_values(damage_groups, {}, radius), {}, explosion_power) + obj:punch(explosive_object, 1.4, { + full_punch_interval = 1.4, + damage_groups = dealt_damage + }, vector.multiply(dir_vector, explosion_power)) + ::continue:: + end +end + +local explode_area = function(pos, burn_radius, explosion_radius, explosive_object, damage_groups) + local rad_vec = vector.new(burn_radius, burn_radius, burn_radius) + local p1 = vector.subtract(pos, rad_vec) + local p2 = vector.add(pos, rad_vec) + explode_objects(pos, explosion_radius, explosive_object, damage_groups) for y = p1.y, p2.y do for z = p1.z, p2.z do minetest.punch_node({ x = p1.x - 1, y = y, z = z }) @@ -93,7 +126,7 @@ end return { - flame_area = flame_area, + explode_area = explode_area, register_projectile = register_projectile, get_projectiles = function() return registered_projectiles end, } diff --git a/mods/lord/Core/projectiles/src/projectiles/entity.lua b/mods/lord/Core/projectiles/src/projectiles/entity.lua index 51cd54b5a..e3d62a0cb 100644 --- a/mods/lord/Core/projectiles/src/projectiles/entity.lua +++ b/mods/lord/Core/projectiles/src/projectiles/entity.lua @@ -252,9 +252,11 @@ local register_projectile_entity = function(name, entity_reg) flight_processing(self, environment, self._rotation_formula) end + local stack = self._projectile_stack + local is_in_creative = minetest.registered_items[stack:get_name()].groups.not_in_creative_inventory - if update_life_timer(self, dtime) then - minetest.add_item(pos, self._projectile_stack) + if update_life_timer(self, dtime) and not is_in_creative then + minetest.add_item(pos, stack) end end, on_punch = function(self, puncher, time_from_last_punch, tool_capabilities, dir, damage) diff --git a/mods/lord/Entities/lottmobs/src/racial/others/balrog.lua b/mods/lord/Entities/lottmobs/src/racial/others/balrog.lua index 3be99a297..87897d703 100644 --- a/mods/lord/Entities/lottmobs/src/racial/others/balrog.lua +++ b/mods/lord/Entities/lottmobs/src/racial/others/balrog.lua @@ -14,10 +14,11 @@ mobs:register_mob("lottmobs:balrog", { }, makes_footstep_sound = true, view_range = 50, - armor = 100, + armor = { fleshy = 80, fire = 0, soul = 200 }, walk_velocity = 1, run_velocity = 3, - damage = 30, + damage = 15, + damage_type = "fire", drops = { { name = "lottores:mithril_ingot", chance = 5, min = 1, max = 5, }, -- temporary reduced x 10 { name = "lottores:mithrilsword", chance = 5, min = 1, max = 1, }, diff --git a/mods/lord/Tools/lord_projectiles/src/lord_projectiles/config.lua b/mods/lord/Tools/lord_projectiles/src/lord_projectiles/config.lua index 6117382d8..cc8e294c8 100644 --- a/mods/lord/Tools/lord_projectiles/src/lord_projectiles/config.lua +++ b/mods/lord/Tools/lord_projectiles/src/lord_projectiles/config.lua @@ -228,7 +228,7 @@ return { wield_item = "lord_projectiles:fire_ball", visual_size = vector.new(1, 1, 1), }, - max_speed = 35, + max_speed = 40, sound_hit_node = { name = "lord_projectiles_explosion", gain = 3.0 }, sound_hit_object = { name = "lord_projectiles_explosion", gain = 3.0 }, damage_groups = { fire = 15, }, @@ -238,7 +238,7 @@ return { local rad_vec = vector.new(radius, radius, radius) local min_pos = vector.subtract(node_pos, rad_vec) local max_pos = vector.add(node_pos, rad_vec) - projectiles.flame_area(min_pos, max_pos) + projectiles.explode_area(node_pos, radius, 5, projectile.object, { fleshy = 15 }) minetest.add_particlespawner({ pos = { min = min_pos, @@ -269,6 +269,7 @@ return { local rad_vec = vector.new(radius, radius, radius) local min_pos = vector.subtract(pos, rad_vec) local max_pos = vector.add(pos, rad_vec) + projectiles.explode_area(pos, radius, 5, projectile.object, { fleshy = 15 }) minetest.add_particlespawner({ pos = { min = min_pos, @@ -296,7 +297,7 @@ return { after_hit_node = function(projectile) projectile.object:remove() end, - after_hit_entity = function(projectile) + after_hit_object = function(projectile) projectile.object:remove() end }, @@ -329,7 +330,7 @@ return { local rad_vec = vector.new(radius, radius, radius) local min_pos = vector.subtract(node_pos, rad_vec) local max_pos = vector.add(node_pos, rad_vec) - projectiles.flame_area(min_pos, max_pos) + projectiles.explode_area(node_pos, radius, 3, projectile.object, { fleshy = 5 }) minetest.add_particlespawner({ pos = { min = min_pos, @@ -360,6 +361,7 @@ return { local rad_vec = vector.new(radius, radius, radius) local min_pos = vector.subtract(pos, rad_vec) local max_pos = vector.add(pos, rad_vec) + projectiles.explode_area(pos, radius, 3, projectile.object, { fleshy = 5 }) minetest.add_particlespawner({ pos = { min = min_pos, @@ -387,7 +389,7 @@ return { after_hit_node = function(projectile) projectile.object:remove() end, - after_hit_entity = function(projectile) + after_hit_object = function(projectile) projectile.object:remove() end },