-
Notifications
You must be signed in to change notification settings - Fork 578
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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.
- Loading branch information
Showing
5 changed files
with
79 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.