item_entity.lua replacement

edited by TenPlus1

Features:
- Items are destroyed by lava
- Items are pushed along by flowing water (thanks to QwertyMine3 and Gustavo6046)
- Items are removed after 900 seconds or the time that is specified by
   remove_items in minetest.conf (-1 disables it)
- Particle effects added
- Dropped items slide on nodes with {slippery} groups
- Items stuck inside solid nodes move to nearest empty space
- Added 'dropped_step(self, pos, dtime, moveresult)' custom on_step for dropped items
   'self.node_inside' contains node table that item is inside
   'self.def_inside' contains node definition for above
   'self.node_under' contains node table that is below item
   'self.def_under' contains node definition for above
   'self.age' holds age of dropped item in seconds
   'self.itemstring' contains itemstring e.g. "default:dirt", "default:ice 20"
   'self.is_moving' true if dropped item is moving
   'pos' holds position of dropped item
   'dtime' used for timers
   'moveresult' table containing collision info

   return false to skip further checks by builtin_item

License: MIT


dropped_step() examples:

-- if gunpowder dropped on burning tnt or gunpowder then remove

if minetest.registered_items["tnt:gunpowder"] then

	minetest.override_item("tnt:gunpowder", {

		dropped_step = function(self, pos)

			if (self.node_inside
			and self.node_inside.name == "tnt:gunpowder_burning")
			or (self.node_under
			and self.node_under.name == "tnt:tnt_burning") then

				minetest.sound_play("builtin_item_lava", {
					pos = pos,
					max_hear_distance = 6,
					gain = 0.5
				})

				self.itemstring = ""
				self.object:remove()

				return false -- return with no further action
			end
		end
	})
end


-- if 2x mese crystal and 2x crystal spike dropped in pool of water_source
-- then merge into a single crystal_ingot.

if minetest.registered_items["ethereal:crystal_spike"] then

	minetest.override_item("ethereal:crystal_spike", {

		dropped_step = function(self, pos, dtime)

			self.ctimer = (self.ctimer or 0) + dtime
			if self.ctimer < 5.0 then return end
			self.ctimer = 0

			if self.node_inside
			and self.node_inside.name ~= "default:water_source" then
				return
			end

			local objs = core.get_objects_inside_radius(pos, 0.8)

			if not objs or #objs ~= 2 then return end

			local crystal, mese, ent = nil, nil, nil

			for k, obj in pairs(objs) do

				ent = obj:get_luaentity()

				if ent and ent.name == "__builtin:item" then

					if ent.itemstring == "default:mese_crystal 2"
					and not mese then

						mese = obj

					elseif ent.itemstring == "ethereal:crystal_spike 2"
					and not crystal then

						crystal = obj
					end
				end
			end

			if mese and crystal then

				mese:remove()
				crystal:remove()

				core.add_item(pos, "ethereal:crystal_ingot")

				return false -- return with no further action
			end
		end
	})
end
