diff --git a/build.gradle b/build.gradle index 96c867941..7ec7a787a 100644 --- a/build.gradle +++ b/build.gradle @@ -108,6 +108,8 @@ dependencies { // https://mvnrepository.com/artifact/it.unimi.dsi/fastutil api 'it.unimi.dsi:fastutil:8.5.6' + implementation group: 'space.vectrix.flare', name: 'flare', version: '2.0.0' + implementation group: 'space.vectrix.flare', name: 'flare-fastutil', version: '2.0.0' // https://mvnrepository.com/artifact/com.google.code.gson/gson api 'com.google.code.gson:gson:2.8.9' diff --git a/src/main/java/net/minestom/server/entity/Entity.java b/src/main/java/net/minestom/server/entity/Entity.java index b039a3e33..15ba9f511 100644 --- a/src/main/java/net/minestom/server/entity/Entity.java +++ b/src/main/java/net/minestom/server/entity/Entity.java @@ -53,6 +53,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jglrxavpok.hephaistos.nbt.mutable.MutableNBTCompound; +import space.vectrix.flare.fastutil.Int2ObjectSyncMap; import java.time.Duration; import java.time.temporal.TemporalUnit; @@ -73,7 +74,7 @@ import java.util.function.UnaryOperator; */ public class Entity implements Viewable, Tickable, Schedulable, TagHandler, PermissionHandler, HoverEventSource, Sound.Emitter { - private static final Map ENTITY_BY_ID = new ConcurrentHashMap<>(); + private static final Int2ObjectSyncMap ENTITY_BY_ID = Int2ObjectSyncMap.hashmap(); private static final Map ENTITY_BY_UUID = new ConcurrentHashMap<>(); private static final AtomicInteger LAST_ENTITY_ID = new AtomicInteger(); @@ -217,7 +218,7 @@ public class Entity implements Viewable, Tickable, Schedulable, TagHandler, Perm * @return the entity having the specified id, null if not found */ public static @Nullable Entity getEntity(int id) { - return Entity.ENTITY_BY_ID.getOrDefault(id, null); + return Entity.ENTITY_BY_ID.get(id); } /** diff --git a/src/main/java/net/minestom/server/instance/InstanceContainer.java b/src/main/java/net/minestom/server/instance/InstanceContainer.java index 3ca632c8e..f323dedc0 100644 --- a/src/main/java/net/minestom/server/instance/InstanceContainer.java +++ b/src/main/java/net/minestom/server/instance/InstanceContainer.java @@ -28,6 +28,7 @@ import net.minestom.server.world.DimensionType; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import space.vectrix.flare.fastutil.Long2ObjectSyncMap; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -48,7 +49,7 @@ public class InstanceContainer extends Instance { private ChunkGenerator chunkGenerator; // (chunk index -> chunk) map, contains all the chunks in the instance // used as a monitor when access is required - private final Long2ObjectMap chunks = new Long2ObjectOpenHashMap<>(); + private final Long2ObjectSyncMap chunks = Long2ObjectSyncMap.hashmap(); private final Long2ObjectMap> loadingChunks = new Long2ObjectOpenHashMap<>(); private final Lock changingBlockLock = new ReentrantLock(); @@ -220,9 +221,7 @@ public class InstanceContainer extends Instance { // Remove all entities in chunk getEntityTracker().chunkEntities(chunkX, chunkZ, EntityTracker.Target.ENTITIES, Entity::remove); // Clear cache - synchronized (chunks) { - this.chunks.remove(index); - } + this.chunks.remove(index); chunk.unload(); UPDATE_MANAGER.signalChunkUnload(chunk); } @@ -230,9 +229,7 @@ public class InstanceContainer extends Instance { @Override public Chunk getChunk(int chunkX, int chunkZ) { final long index = ChunkUtils.getChunkIndex(chunkX, chunkZ); - synchronized (chunks) { - return chunks.get(index); - } + return chunks.get(index); } @Override @@ -379,13 +376,11 @@ public class InstanceContainer extends Instance { InstanceContainer copiedInstance = new InstanceContainer(UUID.randomUUID(), getDimensionType()); copiedInstance.srcInstance = this; copiedInstance.lastBlockChangeTime = lastBlockChangeTime; - synchronized (chunks) { - for (Chunk chunk : chunks.values()) { - final int chunkX = chunk.getChunkX(); - final int chunkZ = chunk.getChunkZ(); - final Chunk copiedChunk = chunk.copy(copiedInstance, chunkX, chunkZ); - copiedInstance.cacheChunk(copiedChunk); - } + for (Chunk chunk : chunks.values()) { + final int chunkX = chunk.getChunkX(); + final int chunkZ = chunk.getChunkZ(); + final Chunk copiedChunk = chunk.copy(copiedInstance, chunkX, chunkZ); + copiedInstance.cacheChunk(copiedChunk); } return copiedInstance; } @@ -437,9 +432,7 @@ public class InstanceContainer extends Instance { */ @Override public @NotNull Collection<@NotNull Chunk> getChunks() { - synchronized (chunks) { - return List.copyOf(chunks.values()); - } + return chunks.values(); } /** @@ -529,9 +522,7 @@ public class InstanceContainer extends Instance { private void cacheChunk(@NotNull Chunk chunk) { final long index = ChunkUtils.getChunkIndex(chunk); - synchronized (chunks) { - this.chunks.put(index, chunk); - } + this.chunks.put(index, chunk); UPDATE_MANAGER.signalChunkLoad(chunk); } } \ No newline at end of file