Add fire explosions

This commit is contained in:
Wuzzy 2020-05-02 19:05:56 +02:00
parent 00acbf8a2a
commit bc740efafe
5 changed files with 19 additions and 13 deletions

View File

@ -14,6 +14,8 @@ mcl_explosions = {}
local creative_mode = minetest.settings:get_bool("creative_mode") local creative_mode = minetest.settings:get_bool("creative_mode")
local mod_death_messages = minetest.get_modpath("mcl_death_messages") ~= nil local mod_death_messages = minetest.get_modpath("mcl_death_messages") ~= nil
local mod_fire = minetest.get_modpath("mcl_fire") ~= nil
local CONTENT_FIRE = minetest.get_content_id("mcl_fire:fire")
local S = minetest.get_translator("mcl_explosions") local S = minetest.get_translator("mcl_explosions")
@ -134,12 +136,13 @@ end
-- raydirs - The directions for each ray -- raydirs - The directions for each ray
-- radius - The maximum distance each ray will go -- radius - The maximum distance each ray will go
-- drop_chance - The chance that destroyed nodes will drop their items -- drop_chance - The chance that destroyed nodes will drop their items
-- fire - If true, 1/3 of destroyed nodes become fire
-- puncher - object that punches other objects (optional) -- puncher - object that punches other objects (optional)
-- --
-- Note that this function has been optimized, it contains code which has been -- Note that this function has been optimized, it contains code which has been
-- inlined to avoid function calls and unnecessary table creation. This was -- inlined to avoid function calls and unnecessary table creation. This was
-- measured to give a significant performance increase. -- measured to give a significant performance increase.
local function trace_explode(pos, strength, raydirs, radius, drop_chance, puncher) local function trace_explode(pos, strength, raydirs, radius, drop_chance, fire, puncher)
local vm = minetest.get_voxel_manip() local vm = minetest.get_voxel_manip()
local emin, emax = vm:read_from_map(vector.subtract(pos, radius), local emin, emax = vm:read_from_map(vector.subtract(pos, radius),
@ -325,9 +328,13 @@ local function trace_explode(pos, strength, raydirs, radius, drop_chance, punche
end end
end end
if remove then if remove then
if mod_fire and math.random(1, 3) == 1 then
data[idx] = CONTENT_FIRE
else
data[idx] = minetest.CONTENT_AIR data[idx] = minetest.CONTENT_AIR
end end
end end
end
-- Log explosion -- Log explosion
minetest.log('action', 'Explosion at ' .. minetest.pos_to_string(pos) .. minetest.log('action', 'Explosion at ' .. minetest.pos_to_string(pos) ..
@ -361,7 +368,7 @@ function mcl_explosions.explode(pos, strength, info, puncher)
end end
shape = sphere_shapes[radius] shape = sphere_shapes[radius]
trace_explode(pos, strength, shape, radius, (info and info.drop_chance) or 1 / strength, puncher) trace_explode(pos, strength, shape, radius, (info and info.drop_chance) or 1 / strength, info.fire == true, puncher)
if not (info and info.no_sound) then if not (info and info.no_sound) then
add_particles(pos, radius) add_particles(pos, radius)

View File

@ -1,2 +1,3 @@
name = mcl_explosions name = mcl_explosions
description = A common API to create explosions. description = A common API to create explosions.
optional_depends = mcl_fire

View File

@ -3824,7 +3824,7 @@ end
-- no damage to nodes explosion -- no damage to nodes explosion
function mobs:safe_boom(self, pos, radius) function mobs:safe_boom(self, pos, strength)
minetest.sound_play(self.sounds and self.sounds.explode or "tnt_explode", { minetest.sound_play(self.sounds and self.sounds.explode or "tnt_explode", {
pos = pos, pos = pos,
gain = 1.0, gain = 1.0,
@ -3837,13 +3837,13 @@ end
-- make explosion with protection and tnt mod check -- make explosion with protection and tnt mod check
function mobs:boom(self, pos, radius) function mobs:boom(self, pos, strength, fire)
if mod_explosions then if mod_explosions then
if mobs_griefing and not minetest.is_protected(pos, "") then if mobs_griefing and not minetest.is_protected(pos, "") then
mcl_explosions.explode(pos, self.explosion_strength, { drop_chance = 1.0 }, self.object) mcl_explosions.explode(pos, strength, { drop_chance = 1.0, fire = fire }, self.object)
else else
mobs:safe_boom(self, pos, radius) mobs:safe_boom(self, pos, strength)
end end
else else
mobs:safe_boom(self, pos, radius) mobs:safe_boom(self, pos, radius)

View File

@ -79,13 +79,12 @@ mobs:register_arrow("mobs_mc:fireball", {
textures = {"mcl_fire_fire_charge.png"}, textures = {"mcl_fire_fire_charge.png"},
velocity = 15, velocity = 15,
-- direct hit, no fire... just plenty of pain
hit_player = function(self, player) hit_player = function(self, player)
player:punch(self.object, 1.0, { player:punch(self.object, 1.0, {
full_punch_interval = 1.0, full_punch_interval = 1.0,
damage_groups = {fleshy = 6}, damage_groups = {fleshy = 6},
}, nil) }, nil)
mobs:boom(self, self.object:get_pos(), 3) mobs:boom(self, self.object:get_pos(), 1, true)
end, end,
hit_mob = function(self, mob) hit_mob = function(self, mob)
@ -93,12 +92,11 @@ mobs:register_arrow("mobs_mc:fireball", {
full_punch_interval = 1.0, full_punch_interval = 1.0,
damage_groups = {fleshy = 6}, damage_groups = {fleshy = 6},
}, nil) }, nil)
mobs:boom(self, self.object:get_pos(), 3) mobs:boom(self, self.object:get_pos(), 1, true)
end, end,
-- node hit, explode
hit_node = function(self, pos, node) hit_node = function(self, pos, node)
mobs:boom(self, pos, 3) mobs:boom(self, pos, 1, true)
end end
}) })

View File

@ -3,7 +3,7 @@ mcl_sounds?
mcl_worlds? mcl_worlds?
mcl_wool? mcl_wool?
mcl_dye? mcl_dye?
mcl_tnt? mcl_explosions?
mcl_weather? mcl_weather?
mcl_spawn? mcl_spawn?
doc? doc?