From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: wangxyper Date: Mon, 9 Jan 2023 12:40:56 +0800 Subject: [PATCH] Hearse: Fix some problems in ItemEntity Original license: MIT Original project: https://github.com/NaturalCodeClub/HearseRewrite diff --git a/src/main/java/co/earthme/hearse/HearseConfig.java b/src/main/java/co/earthme/hearse/HearseConfig.java index 912da4787f83f656da67e9533b60183c17e6c345..0a1de52bcdf675b9bfcbf14d39959818a7a0cbbb 100644 --- a/src/main/java/co/earthme/hearse/HearseConfig.java +++ b/src/main/java/co/earthme/hearse/HearseConfig.java @@ -1,4 +1,5 @@ package co.earthme.hearse; public class HearseConfig { + } diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java index c58496c84b2b3f86890050813041fa49711f3a01..3e8b68b4390a6086b1b1983fe6f8b545c2847ef8 100644 --- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java @@ -4,6 +4,8 @@ import java.util.Iterator; import java.util.List; import java.util.Objects; import java.util.UUID; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; import javax.annotation.Nullable; import net.minecraft.world.damagesource.DamageSource; import net.minecraft.world.entity.Entity; @@ -239,21 +241,24 @@ public class ItemEntity extends Entity { this.setDeltaMovement(vec3d.x * 0.949999988079071D, vec3d.y + (double) (vec3d.y < 0.05999999865889549D ? 5.0E-4F : 0.0F), vec3d.z * 0.949999988079071D); } + private final Lock mergeLock = new ReentrantLock(); + private void mergeWithNeighbours() { - if (this.isMergable()) { - // Spigot start - double radius = level.spigotConfig.itemMerge; - List list = this.level.getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate(radius, radius - 0.5D, radius), (entityitem) -> { - // Spigot end - return entityitem != this && entityitem.isMergable(); - }); - Iterator iterator = list.iterator(); - - while (iterator.hasNext()) { - ItemEntity entityitem = (ItemEntity) iterator.next(); - - if (entityitem.isMergable()) { - // Paper Start - Fix items merging through walls + if (!this.mergeLock.tryLock()){ + return; + } + try { + if (this.isMergable()) { + // Spigot start + double radius = level.spigotConfig.itemMerge; + List list = this.level.getEntitiesOfClass(ItemEntity.class, this.getBoundingBox().inflate(radius, radius - 0.5D, radius), (entityitem) -> { + // Spigot end + return entityitem != this && entityitem.isMergable(); + }); + + for (ItemEntity entityitem : list) { + if (entityitem.isMergable()) { + // Paper Start - Fix items merging through walls if (this.level.paperConfig().fixes.fixItemsMergingThroughWalls) { // Pufferfish start - skip the allocations /* @@ -263,17 +268,19 @@ public class ItemEntity extends Entity { if (rayTraceResult.getType() == net.minecraft.world.phys.HitResult.Type.BLOCK) continue; */ if (level.rayTraceDirect(this.position(), entityitem.position(), net.minecraft.world.phys.shapes.CollisionContext.of(this)) == - net.minecraft.world.phys.HitResult.Type.BLOCK) continue; + net.minecraft.world.phys.HitResult.Type.BLOCK) continue; // Pufferfish end } - // Paper End - this.tryToMerge(entityitem); - if (this.isRemoved()) { - break; + // Paper End + this.tryToMerge(entityitem); + if (this.isRemoved()) { + break; + } } } } - + }finally { + this.mergeLock.unlock(); } }