forked from minetest/minetest_game
Default: Destroy flammable items when in fire or lava
The check for igniters (fire/lava) will be performed every 10 secs if the item is flammable. if the item is found to be in lava it will then burn up and disappear in a smoke puff. If a non-lava igniter node is found, a combination of `flammable` value of the item and `igniter` group value of the node will be used to determine the chance for the item to be removed.
This commit is contained in:
parent
4ea74466e4
commit
bcb4426ec7
@ -183,6 +183,10 @@ Pithydon (CC BY-SA 3.0)
|
|||||||
default_coral_orange.png
|
default_coral_orange.png
|
||||||
default_coral_skeleton.png
|
default_coral_skeleton.png
|
||||||
|
|
||||||
|
Ferk (CC0 1.0)
|
||||||
|
default_item_smoke.png
|
||||||
|
default_item_smoke.ogg, based on sound by http://opengameart.org/users/bart
|
||||||
|
|
||||||
Glass breaking sounds (CC BY 3.0):
|
Glass breaking sounds (CC BY 3.0):
|
||||||
1: http://www.freesound.org/people/cmusounddesign/sounds/71947/
|
1: http://www.freesound.org/people/cmusounddesign/sounds/71947/
|
||||||
2: http://www.freesound.org/people/Tomlija/sounds/97669/
|
2: http://www.freesound.org/people/Tomlija/sounds/97669/
|
||||||
|
@ -42,6 +42,7 @@ dofile(default_path.."/trees.lua")
|
|||||||
dofile(default_path.."/nodes.lua")
|
dofile(default_path.."/nodes.lua")
|
||||||
dofile(default_path.."/furnace.lua")
|
dofile(default_path.."/furnace.lua")
|
||||||
dofile(default_path.."/tools.lua")
|
dofile(default_path.."/tools.lua")
|
||||||
|
dofile(default_path.."/item_entity.lua")
|
||||||
dofile(default_path.."/craftitems.lua")
|
dofile(default_path.."/craftitems.lua")
|
||||||
dofile(default_path.."/crafting.lua")
|
dofile(default_path.."/crafting.lua")
|
||||||
dofile(default_path.."/mapgen.lua")
|
dofile(default_path.."/mapgen.lua")
|
||||||
|
74
mods/default/item_entity.lua
Normal file
74
mods/default/item_entity.lua
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
-- mods/default/item_entity.lua
|
||||||
|
|
||||||
|
local builtin_item = minetest.registered_entities["__builtin:item"]
|
||||||
|
|
||||||
|
local item = {
|
||||||
|
set_item = function(self, itemstring)
|
||||||
|
builtin_item.set_item(self, itemstring)
|
||||||
|
|
||||||
|
local stack = ItemStack(itemstring)
|
||||||
|
local itemdef = minetest.registered_items[stack:get_name()]
|
||||||
|
if itemdef and itemdef.groups.flammable ~= 0 then
|
||||||
|
self.flammable = itemdef.groups.flammable
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
|
||||||
|
burn_up = function(self)
|
||||||
|
-- disappear in a smoke puff
|
||||||
|
self.object:remove()
|
||||||
|
local p = self.object:getpos()
|
||||||
|
minetest.sound_play("default_item_smoke", {
|
||||||
|
pos = p,
|
||||||
|
max_hear_distance = 8,
|
||||||
|
})
|
||||||
|
minetest.add_particlespawner({
|
||||||
|
amount = 3,
|
||||||
|
time = 0.1,
|
||||||
|
minpos = {x = p.x - 0.1, y = p.y + 0.1, z = p.z - 0.1 },
|
||||||
|
maxpos = {x = p.x + 0.1, y = p.y + 0.2, z = p.z + 0.1 },
|
||||||
|
minvel = {x = 0, y = 2.5, z = 0},
|
||||||
|
maxvel = {x = 0, y = 2.5, z = 0},
|
||||||
|
minacc = {x = -0.15, y = -0.02, z = -0.15},
|
||||||
|
maxacc = {x = 0.15, y = -0.01, z = 0.15},
|
||||||
|
minexptime = 4,
|
||||||
|
maxexptime = 6,
|
||||||
|
minsize = 5,
|
||||||
|
maxsize = 5,
|
||||||
|
collisiondetection = true,
|
||||||
|
texture = "default_item_smoke.png"
|
||||||
|
})
|
||||||
|
end,
|
||||||
|
|
||||||
|
on_step = function(self, dtime)
|
||||||
|
builtin_item.on_step(self, dtime)
|
||||||
|
|
||||||
|
if self.flammable then
|
||||||
|
-- flammable, check for igniters
|
||||||
|
self.ignite_timer = (self.ignite_timer or 0) + dtime
|
||||||
|
if self.ignite_timer > 10 then
|
||||||
|
self.ignite_timer = 0
|
||||||
|
|
||||||
|
local node = minetest.get_node_or_nil(self.object:getpos())
|
||||||
|
if not node then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Immediately burn up flammable items in lava
|
||||||
|
if minetest.get_item_group(node.name, "lava") > 0 then
|
||||||
|
self:burn_up()
|
||||||
|
else
|
||||||
|
-- otherwise there'll be a chance based on its igniter value
|
||||||
|
local burn_chance = self.flammable
|
||||||
|
* minetest.get_item_group(node.name, "igniter")
|
||||||
|
if burn_chance > 0 and math.random(0, burn_chance) ~= 0 then
|
||||||
|
self:burn_up()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
}
|
||||||
|
|
||||||
|
-- set defined item as new __builtin:item, with the old one as fallback table
|
||||||
|
setmetatable(item, builtin_item)
|
||||||
|
minetest.register_entity(":__builtin:item", item)
|
BIN
mods/default/sounds/default_item_smoke.ogg
Normal file
BIN
mods/default/sounds/default_item_smoke.ogg
Normal file
Binary file not shown.
BIN
mods/default/textures/default_item_smoke.png
Normal file
BIN
mods/default/textures/default_item_smoke.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 307 B |
Loading…
Reference in New Issue
Block a user