Remove corals.mts credit
[oweals/minetest_game.git] / mods / default / item_entity.lua
1 -- mods/default/item_entity.lua
2
3 local builtin_item = minetest.registered_entities["__builtin:item"]
4
5 local item = {
6         set_item = function(self, itemstring)
7                 builtin_item.set_item(self, itemstring)
8
9                 local stack = ItemStack(itemstring)
10                 local itemdef = minetest.registered_items[stack:get_name()]
11                 if itemdef and itemdef.groups.flammable ~= 0 then
12                         self.flammable = itemdef.groups.flammable
13                 end
14         end,
15
16         burn_up = function(self)
17                 -- disappear in a smoke puff
18                 self.object:remove()
19                 local p = self.object:get_pos()
20                 minetest.sound_play("default_item_smoke", {
21                         pos = p,
22                         max_hear_distance = 8,
23                 })
24                 minetest.add_particlespawner({
25                         amount = 3,
26                         time = 0.1,
27                         minpos = {x = p.x - 0.1, y = p.y + 0.1, z = p.z - 0.1 },
28                         maxpos = {x = p.x + 0.1, y = p.y + 0.2, z = p.z + 0.1 },
29                         minvel = {x = 0, y = 2.5, z = 0},
30                         maxvel = {x = 0, y = 2.5, z = 0},
31                         minacc = {x = -0.15, y = -0.02, z = -0.15},
32                         maxacc = {x = 0.15, y = -0.01, z = 0.15},
33                         minexptime = 4,
34                         maxexptime = 6,
35                         minsize = 5,
36                         maxsize = 5,
37                         collisiondetection = true,
38                         texture = "default_item_smoke.png"
39                 })
40         end,
41
42         on_step = function(self, dtime)
43                 builtin_item.on_step(self, dtime)
44
45                 if self.flammable then
46                         -- flammable, check for igniters
47                         self.ignite_timer = (self.ignite_timer or 0) + dtime
48                         if self.ignite_timer > 10 then
49                                 self.ignite_timer = 0
50
51                                 local node = minetest.get_node_or_nil(self.object:get_pos())
52                                 if not node then
53                                         return
54                                 end
55
56                                 -- Immediately burn up flammable items in lava
57                                 if minetest.get_item_group(node.name, "lava") > 0 then
58                                         self:burn_up()
59                                 else
60                                         --  otherwise there'll be a chance based on its igniter value
61                                         local burn_chance = self.flammable
62                                                 * minetest.get_item_group(node.name, "igniter")
63                                         if burn_chance > 0 and math.random(0, burn_chance) ~= 0 then
64                                                 self:burn_up()
65                                         end
66                                 end
67                         end
68                 end
69         end,
70 }
71
72 -- set defined item as new __builtin:item, with the old one as fallback table
73 setmetatable(item, builtin_item)
74 minetest.register_entity(":__builtin:item", item)