1
0
Fork 0

Merge pull request 'Fix issue with drops turning black due to clipping into walls and floors and visually demonstrate drops merging' (#3667) from fix_clipping_mining_drops into master

Reviewed-on: MineClone2/MineClone2#3667
Reviewed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 <mrrar@noreply.git.minetest.land>
This commit is contained in:
commit 8ef653fb77
1 changed files with 26 additions and 11 deletions

View File

@ -621,13 +621,17 @@ minetest.register_entity(":__builtin:item", {
if speed ~= nil then self.random_velocity = speed end if speed ~= nil then self.random_velocity = speed end
local vel = self.object:get_velocity() local vel = self.object:get_velocity()
-- There is perhaps a cleverer way of making this physical so it bounces off the wall like swords.
local max_vel = 6.5 -- Faster than this and it throws it into the wall / floor and turns black because of clipping.
if vel and vel.x == 0 and vel.z == 0 and self.random_velocity > 0 then if vel and vel.x == 0 and vel.z == 0 and self.random_velocity > 0 then
local v = self.random_velocity local v = self.random_velocity
local x = math.random(5, 10) / 10 * v local x = math.random(5, max_vel) / 10 * v
if math.random(0, 10) < 5 then x = -x end if math.random(0, 10) < 5 then x = -x end
local z = math.random(5, 10) / 10 * v local z = math.random(5, max_vel) / 10 * v
if math.random(0, 10) < 5 then z = -z end if math.random(0, 10) < 5 then z = -z end
local y = math.random(2, 4) local y = math.random(1, 2)
self.object:set_velocity(vector.new(x, y, z)) self.object:set_velocity(vector.new(x, y, z))
end end
self.random_velocity = 0 self.random_velocity = 0
@ -804,11 +808,19 @@ minetest.register_entity(":__builtin:item", {
if total_count > max_count then if total_count > max_count then
return false return false
end end
-- Merge the remote stack into this one
-- local pos = object:get_pos() -- Merge the remote stack into this one
-- pos.y = pos.y + ((total_count - count) / max_count) * 0.15 local self_pos = self.object:get_pos()
-- self.object:move_to(pos) local pos = object:get_pos()
--local y = pos.y + ((total_count - count) / max_count) * 0.15
local x_diff = (self_pos.x - pos.x) / 2
local z_diff = (self_pos.z - pos.z) / 2
local new_pos = vector.offset(pos, x_diff, 0, z_diff)
new_pos.y = math.max(self_pos.y, pos.y) + 0.1
self.object:move_to(new_pos)
self.age = 0 -- Handle as new entity self.age = 0 -- Handle as new entity
own_stack:set_count(total_count) own_stack:set_count(total_count)
@ -829,6 +841,7 @@ minetest.register_entity(":__builtin:item", {
self.object:set_acceleration(vector.zero()) self.object:set_acceleration(vector.zero())
return return
end end
self.age = self.age + dtime self.age = self.age + dtime
if self._collector_timer then if self._collector_timer then
self._collector_timer = self._collector_timer + dtime self._collector_timer = self._collector_timer + dtime
@ -858,6 +871,9 @@ minetest.register_entity(":__builtin:item", {
return return
end end
if self.is_clock then if self.is_clock then
self.object:set_properties({ self.object:set_properties({
textures = { "mcl_clock:clock_" .. (mcl_worlds.clock_works(p) and mcl_clock.old_time or mcl_clock.random_frame) } textures = { "mcl_clock:clock_" .. (mcl_worlds.clock_works(p) and mcl_clock.old_time or mcl_clock.random_frame) }
@ -907,14 +923,13 @@ minetest.register_entity(":__builtin:item", {
local is_on_floor = def and (def.walkable local is_on_floor = def and (def.walkable
and not def.groups.slippery and v.y == 0) and not def.groups.slippery and v.y == 0)
if not minetest.registered_nodes[nn] if not minetest.registered_nodes[nn] or is_floating or is_on_floor then
or is_floating or is_on_floor then
local own_stack = ItemStack(self.object:get_luaentity().itemstring) local own_stack = ItemStack(self.object:get_luaentity().itemstring)
-- Merge with close entities of the same item -- Merge with close entities of the same item
for _, object in pairs(minetest.get_objects_inside_radius(p, 0.8)) do for _, object in pairs(minetest.get_objects_inside_radius(p, 0.8)) do
local obj = object:get_luaentity() local obj = object:get_luaentity()
if obj and obj.name == "__builtin:item" if obj and obj.name == "__builtin:item" and obj.physical_state == false then
and obj.physical_state == false then
if self:try_merge_with(own_stack, object, obj) then if self:try_merge_with(own_stack, object, obj) then
return return
end end