forked from VoxeLibre/VoxeLibre
Merge branch 'burning_objects' into animated_chests
This commit is contained in:
commit
5ce8c229db
|
@ -53,7 +53,7 @@ end
|
||||||
function mcl_burning.get_highest_group_value(obj, groupname)
|
function mcl_burning.get_highest_group_value(obj, groupname)
|
||||||
local nodes = mcl_burning.get_touching_nodes(obj, "group:" .. groupname, true)
|
local nodes = mcl_burning.get_touching_nodes(obj, "group:" .. groupname, true)
|
||||||
local highest_group_value = 0
|
local highest_group_value = 0
|
||||||
|
|
||||||
for _, pos in pairs(nodes) do
|
for _, pos in pairs(nodes) do
|
||||||
local node = minetest.get_node(pos)
|
local node = minetest.get_node(pos)
|
||||||
local group_value = minetest.get_item_group(node.name, groupname)
|
local group_value = minetest.get_item_group(node.name, groupname)
|
||||||
|
@ -61,7 +61,7 @@ function mcl_burning.get_highest_group_value(obj, groupname)
|
||||||
highest_group_value = group_value
|
highest_group_value = group_value
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
return highest_group_value
|
return highest_group_value
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -72,15 +72,15 @@ function mcl_burning.damage(obj)
|
||||||
if luaentity then
|
if luaentity then
|
||||||
health = luaentity.health
|
health = luaentity.health
|
||||||
end
|
end
|
||||||
|
|
||||||
local hp = health or obj:get_hp()
|
local hp = health or obj:get_hp()
|
||||||
|
|
||||||
if hp <= 0 then
|
if hp <= 0 then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local do_damage = true
|
local do_damage = true
|
||||||
|
|
||||||
if obj:is_player() then
|
if obj:is_player() then
|
||||||
if mcl_potions.player_has_effect(obj, "fire_proof") then
|
if mcl_potions.player_has_effect(obj, "fire_proof") then
|
||||||
do_damage = false
|
do_damage = false
|
||||||
|
@ -121,33 +121,33 @@ function mcl_burning.set_on_fire(obj, burn_time, damage, reason)
|
||||||
|
|
||||||
local old_burn_time = mcl_burning.get(obj, "float", "burn_time")
|
local old_burn_time = mcl_burning.get(obj, "float", "burn_time")
|
||||||
local max_fire_prot_lvl = 0
|
local max_fire_prot_lvl = 0
|
||||||
|
|
||||||
if obj:is_player() then
|
if obj:is_player() then
|
||||||
local inv = obj:get_inventory()
|
local inv = obj:get_inventory()
|
||||||
|
|
||||||
for i = 2, 5 do
|
for i = 2, 5 do
|
||||||
local stack = inv:get_stack("armor", i)
|
local stack = inv:get_stack("armor", i)
|
||||||
|
|
||||||
local fire_prot_lvl = mcl_enchanting.get_enchantment(stack, "fire_protection")
|
local fire_prot_lvl = mcl_enchanting.get_enchantment(stack, "fire_protection")
|
||||||
max_fire_prot_lvl = math.max(max_fire_prot_lvl, fire_prot_lvl)
|
max_fire_prot_lvl = math.max(max_fire_prot_lvl, fire_prot_lvl)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if max_fire_prot_lvl > 0 then
|
if max_fire_prot_lvl > 0 then
|
||||||
burn_time = burn_time - math.floor(burn_time * max_fire_prot_lvl * 0.15)
|
burn_time = burn_time - math.floor(burn_time * max_fire_prot_lvl * 0.15)
|
||||||
end
|
end
|
||||||
|
|
||||||
if old_burn_time <= burn_time then
|
if old_burn_time <= burn_time then
|
||||||
local sound_id = mcl_burning.get(obj, "int", "sound_id")
|
local sound_id = mcl_burning.get(obj, "int", "sound_id")
|
||||||
if sound_id == 0 then
|
if sound_id == 0 then
|
||||||
sound_id = minetest.sound_play("fire_fire", {
|
sound_id = minetest.sound_play("fire_fire", {
|
||||||
object = obj,
|
object = obj,
|
||||||
gain = 0.18,
|
gain = 0.18,
|
||||||
max_hear_distance = 32,
|
max_hear_distance = 16,
|
||||||
loop = true,
|
loop = true,
|
||||||
}) + 1
|
}) + 1
|
||||||
end
|
end
|
||||||
|
|
||||||
local hud_id
|
local hud_id
|
||||||
if obj:is_player() then
|
if obj:is_player() then
|
||||||
hud_id = mcl_burning.get(obj, "int", "hud_id")
|
hud_id = mcl_burning.get(obj, "int", "hud_id")
|
||||||
|
@ -166,14 +166,14 @@ function mcl_burning.set_on_fire(obj, burn_time, damage, reason)
|
||||||
mcl_burning.set(obj, "string", "reason", reason)
|
mcl_burning.set(obj, "string", "reason", reason)
|
||||||
mcl_burning.set(obj, "int", "hud_id", hud_id)
|
mcl_burning.set(obj, "int", "hud_id", hud_id)
|
||||||
mcl_burning.set(obj, "int", "sound_id", sound_id)
|
mcl_burning.set(obj, "int", "sound_id", sound_id)
|
||||||
|
|
||||||
local fire_entity = minetest.add_entity(obj:get_pos(), "mcl_burning:fire")
|
local fire_entity = minetest.add_entity(obj:get_pos(), "mcl_burning:fire")
|
||||||
local minp, maxp = mcl_burning.get_collisionbox(obj)
|
local minp, maxp = mcl_burning.get_collisionbox(obj)
|
||||||
local obj_size = obj:get_properties().visual_size
|
local obj_size = obj:get_properties().visual_size
|
||||||
|
|
||||||
local vertical_grow_factor = 1.1
|
local vertical_grow_factor = 1.2
|
||||||
local horizontal_grow_factor = 0.9
|
local horizontal_grow_factor = 1.1
|
||||||
local grow_vector = vector.new(horizontal_grow_factor, vertical_grow_factor, horizontal_grow_factor)
|
local grow_vector = vector.new(horizontal_grow_factor, vertical_grow_factor, horizontal_grow_factor)
|
||||||
|
|
||||||
local size = vector.subtract(maxp, minp)
|
local size = vector.subtract(maxp, minp)
|
||||||
size = vector.multiply(size, grow_vector)
|
size = vector.multiply(size, grow_vector)
|
||||||
|
@ -190,7 +190,7 @@ function mcl_burning.extinguish(obj)
|
||||||
if mcl_burning.is_burning(obj) then
|
if mcl_burning.is_burning(obj) then
|
||||||
local sound_id = mcl_burning.get(obj, "int", "sound_id") - 1
|
local sound_id = mcl_burning.get(obj, "int", "sound_id") - 1
|
||||||
minetest.sound_stop(sound_id)
|
minetest.sound_stop(sound_id)
|
||||||
|
|
||||||
if obj:is_player() then
|
if obj:is_player() then
|
||||||
local hud_id = mcl_burning.get(obj, "int", "hud_id") - 1
|
local hud_id = mcl_burning.get(obj, "int", "hud_id") - 1
|
||||||
obj:hud_remove(hud_id)
|
obj:hud_remove(hud_id)
|
||||||
|
@ -210,7 +210,7 @@ function mcl_burning.catch_fire_tick(obj, dtime)
|
||||||
mcl_burning.extinguish(obj)
|
mcl_burning.extinguish(obj)
|
||||||
else
|
else
|
||||||
local set_on_fire_value = mcl_burning.get_highest_group_value(obj, "set_on_fire")
|
local set_on_fire_value = mcl_burning.get_highest_group_value(obj, "set_on_fire")
|
||||||
|
|
||||||
if set_on_fire_value > 0 then
|
if set_on_fire_value > 0 then
|
||||||
mcl_burning.set_on_fire(obj, set_on_fire_value)
|
mcl_burning.set_on_fire(obj, set_on_fire_value)
|
||||||
end
|
end
|
||||||
|
@ -219,19 +219,19 @@ end
|
||||||
|
|
||||||
function mcl_burning.tick(obj, dtime)
|
function mcl_burning.tick(obj, dtime)
|
||||||
local burn_time = mcl_burning.get(obj, "float", "burn_time") - dtime
|
local burn_time = mcl_burning.get(obj, "float", "burn_time") - dtime
|
||||||
|
|
||||||
if burn_time <= 0 then
|
if burn_time <= 0 then
|
||||||
mcl_burning.extinguish(obj)
|
mcl_burning.extinguish(obj)
|
||||||
else
|
else
|
||||||
mcl_burning.set(obj, "float", "burn_time", burn_time)
|
mcl_burning.set(obj, "float", "burn_time", burn_time)
|
||||||
|
|
||||||
local damage_timer = mcl_burning.get(obj, "float", "damage_timer") + dtime
|
local damage_timer = mcl_burning.get(obj, "float", "damage_timer") + dtime
|
||||||
|
|
||||||
if damage_timer >= 1 then
|
if damage_timer >= 1 then
|
||||||
damage_timer = 0
|
damage_timer = 0
|
||||||
mcl_burning.damage(obj)
|
mcl_burning.damage(obj)
|
||||||
end
|
end
|
||||||
|
|
||||||
mcl_burning.set(obj, "float", "damage_timer", damage_timer)
|
mcl_burning.set(obj, "float", "damage_timer", damage_timer)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -255,9 +255,9 @@ function mcl_burning.fire_entity_step(self, dtime)
|
||||||
local obj = self.object
|
local obj = self.object
|
||||||
local parent = obj:get_attach()
|
local parent = obj:get_attach()
|
||||||
local do_remove
|
local do_remove
|
||||||
|
|
||||||
self.doing_step = true
|
self.doing_step = true
|
||||||
|
|
||||||
if not parent or not mcl_burning.is_burning(parent) then
|
if not parent or not mcl_burning.is_burning(parent) then
|
||||||
do_remove = true
|
do_remove = true
|
||||||
else
|
else
|
||||||
|
@ -269,15 +269,15 @@ function mcl_burning.fire_entity_step(self, dtime)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
self.doing_step = false
|
self.doing_step = false
|
||||||
|
|
||||||
if do_remove then
|
if do_remove then
|
||||||
self.removed = true
|
self.removed = true
|
||||||
obj:remove()
|
obj:remove()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local animation_timer = self.animation_timer + dtime
|
local animation_timer = self.animation_timer + dtime
|
||||||
if animation_timer >= 0.015 then
|
if animation_timer >= 0.015 then
|
||||||
animation_timer = 0
|
animation_timer = 0
|
||||||
|
|
Loading…
Reference in New Issue