0d3601b831
Be consistent with the principle that the mere presence of a player does not affect the behavior of objects in the world. Items should "fall through" players instead of bouncing off them, i.e. being deflected.
45 lines
1.4 KiB
Lua
45 lines
1.4 KiB
Lua
-- LUALOCALS < ---------------------------------------------------------
|
|
local ItemStack, minetest, nodecore, pairs
|
|
= ItemStack, minetest, nodecore, pairs
|
|
-- LUALOCALS > ---------------------------------------------------------
|
|
|
|
local function getcrushdamage(name, alreadyloose)
|
|
local def = minetest.registered_items[name]
|
|
if def and def.crush_damage then return def.crush_damage end
|
|
if alreadyloose then return 0 end
|
|
return name and getcrushdamage(name .. "_loose", true) or 0
|
|
end
|
|
|
|
local function maketick(mult, getname, oldtick)
|
|
oldtick = oldtick or function() end
|
|
return function(self, dtime, ...)
|
|
self.crush_damage = self.crush_damage or getcrushdamage(getname(self))
|
|
if self.crush_damage <= 0 then
|
|
return oldtick(self, dtime, ...)
|
|
end
|
|
|
|
local pos = self.object:get_pos()
|
|
if not pos then return end
|
|
pos.y = pos.y - 1
|
|
local vel = self.object:get_velocity()
|
|
local v = vel and -vel.y or 0
|
|
if v <= 0 then
|
|
return oldtick(self, dtime, ...)
|
|
end
|
|
local q = v * v * dtime * self.crush_damage * mult
|
|
for _, o in pairs(minetest.get_objects_inside_radius(pos, 1)) do
|
|
if o:is_player() then
|
|
nodecore.addphealth(o, -q, {
|
|
nc_type = "crushing",
|
|
entity = self
|
|
})
|
|
end
|
|
end
|
|
|
|
return oldtick(self, dtime, ...)
|
|
end
|
|
end
|
|
|
|
nodecore.register_falling_node_step(maketick(1, function(s) return s.node.name end))
|
|
nodecore.register_item_entity_step(maketick(0.2, function(s) return ItemStack(s.itemstring):get_name() end))
|