mirror of
https://github.com/Minestom/Minestom.git
synced 2025-02-20 14:21:29 +01:00
Use flare thread-safe collections
Signed-off-by: TheMode <themode@outlook.fr>
This commit is contained in:
parent
d865e9f75a
commit
895642dd44
@ -108,6 +108,8 @@ dependencies {
|
|||||||
|
|
||||||
// https://mvnrepository.com/artifact/it.unimi.dsi/fastutil
|
// https://mvnrepository.com/artifact/it.unimi.dsi/fastutil
|
||||||
api 'it.unimi.dsi:fastutil:8.5.6'
|
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
|
// https://mvnrepository.com/artifact/com.google.code.gson/gson
|
||||||
api 'com.google.code.gson:gson:2.8.9'
|
api 'com.google.code.gson:gson:2.8.9'
|
||||||
|
@ -53,6 +53,7 @@ import org.jetbrains.annotations.ApiStatus;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jglrxavpok.hephaistos.nbt.mutable.MutableNBTCompound;
|
import org.jglrxavpok.hephaistos.nbt.mutable.MutableNBTCompound;
|
||||||
|
import space.vectrix.flare.fastutil.Int2ObjectSyncMap;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.temporal.TemporalUnit;
|
import java.time.temporal.TemporalUnit;
|
||||||
@ -73,7 +74,7 @@ import java.util.function.UnaryOperator;
|
|||||||
*/
|
*/
|
||||||
public class Entity implements Viewable, Tickable, Schedulable, TagHandler, PermissionHandler, HoverEventSource<ShowEntity>, Sound.Emitter {
|
public class Entity implements Viewable, Tickable, Schedulable, TagHandler, PermissionHandler, HoverEventSource<ShowEntity>, Sound.Emitter {
|
||||||
|
|
||||||
private static final Map<Integer, Entity> ENTITY_BY_ID = new ConcurrentHashMap<>();
|
private static final Int2ObjectSyncMap<Entity> ENTITY_BY_ID = Int2ObjectSyncMap.hashmap();
|
||||||
private static final Map<UUID, Entity> ENTITY_BY_UUID = new ConcurrentHashMap<>();
|
private static final Map<UUID, Entity> ENTITY_BY_UUID = new ConcurrentHashMap<>();
|
||||||
private static final AtomicInteger LAST_ENTITY_ID = new AtomicInteger();
|
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
|
* @return the entity having the specified id, null if not found
|
||||||
*/
|
*/
|
||||||
public static @Nullable Entity getEntity(int id) {
|
public static @Nullable Entity getEntity(int id) {
|
||||||
return Entity.ENTITY_BY_ID.getOrDefault(id, null);
|
return Entity.ENTITY_BY_ID.get(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -28,6 +28,7 @@ import net.minestom.server.world.DimensionType;
|
|||||||
import org.jetbrains.annotations.ApiStatus;
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import space.vectrix.flare.fastutil.Long2ObjectSyncMap;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
@ -48,7 +49,7 @@ public class InstanceContainer extends Instance {
|
|||||||
private ChunkGenerator chunkGenerator;
|
private ChunkGenerator chunkGenerator;
|
||||||
// (chunk index -> chunk) map, contains all the chunks in the instance
|
// (chunk index -> chunk) map, contains all the chunks in the instance
|
||||||
// used as a monitor when access is required
|
// used as a monitor when access is required
|
||||||
private final Long2ObjectMap<Chunk> chunks = new Long2ObjectOpenHashMap<>();
|
private final Long2ObjectSyncMap<Chunk> chunks = Long2ObjectSyncMap.hashmap();
|
||||||
private final Long2ObjectMap<CompletableFuture<Chunk>> loadingChunks = new Long2ObjectOpenHashMap<>();
|
private final Long2ObjectMap<CompletableFuture<Chunk>> loadingChunks = new Long2ObjectOpenHashMap<>();
|
||||||
|
|
||||||
private final Lock changingBlockLock = new ReentrantLock();
|
private final Lock changingBlockLock = new ReentrantLock();
|
||||||
@ -220,9 +221,7 @@ public class InstanceContainer extends Instance {
|
|||||||
// Remove all entities in chunk
|
// Remove all entities in chunk
|
||||||
getEntityTracker().chunkEntities(chunkX, chunkZ, EntityTracker.Target.ENTITIES, Entity::remove);
|
getEntityTracker().chunkEntities(chunkX, chunkZ, EntityTracker.Target.ENTITIES, Entity::remove);
|
||||||
// Clear cache
|
// Clear cache
|
||||||
synchronized (chunks) {
|
this.chunks.remove(index);
|
||||||
this.chunks.remove(index);
|
|
||||||
}
|
|
||||||
chunk.unload();
|
chunk.unload();
|
||||||
UPDATE_MANAGER.signalChunkUnload(chunk);
|
UPDATE_MANAGER.signalChunkUnload(chunk);
|
||||||
}
|
}
|
||||||
@ -230,9 +229,7 @@ public class InstanceContainer extends Instance {
|
|||||||
@Override
|
@Override
|
||||||
public Chunk getChunk(int chunkX, int chunkZ) {
|
public Chunk getChunk(int chunkX, int chunkZ) {
|
||||||
final long index = ChunkUtils.getChunkIndex(chunkX, chunkZ);
|
final long index = ChunkUtils.getChunkIndex(chunkX, chunkZ);
|
||||||
synchronized (chunks) {
|
return chunks.get(index);
|
||||||
return chunks.get(index);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -379,13 +376,11 @@ public class InstanceContainer extends Instance {
|
|||||||
InstanceContainer copiedInstance = new InstanceContainer(UUID.randomUUID(), getDimensionType());
|
InstanceContainer copiedInstance = new InstanceContainer(UUID.randomUUID(), getDimensionType());
|
||||||
copiedInstance.srcInstance = this;
|
copiedInstance.srcInstance = this;
|
||||||
copiedInstance.lastBlockChangeTime = lastBlockChangeTime;
|
copiedInstance.lastBlockChangeTime = lastBlockChangeTime;
|
||||||
synchronized (chunks) {
|
for (Chunk chunk : chunks.values()) {
|
||||||
for (Chunk chunk : chunks.values()) {
|
final int chunkX = chunk.getChunkX();
|
||||||
final int chunkX = chunk.getChunkX();
|
final int chunkZ = chunk.getChunkZ();
|
||||||
final int chunkZ = chunk.getChunkZ();
|
final Chunk copiedChunk = chunk.copy(copiedInstance, chunkX, chunkZ);
|
||||||
final Chunk copiedChunk = chunk.copy(copiedInstance, chunkX, chunkZ);
|
copiedInstance.cacheChunk(copiedChunk);
|
||||||
copiedInstance.cacheChunk(copiedChunk);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return copiedInstance;
|
return copiedInstance;
|
||||||
}
|
}
|
||||||
@ -437,9 +432,7 @@ public class InstanceContainer extends Instance {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public @NotNull Collection<@NotNull Chunk> getChunks() {
|
public @NotNull Collection<@NotNull Chunk> getChunks() {
|
||||||
synchronized (chunks) {
|
return chunks.values();
|
||||||
return List.copyOf(chunks.values());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -529,9 +522,7 @@ public class InstanceContainer extends Instance {
|
|||||||
|
|
||||||
private void cacheChunk(@NotNull Chunk chunk) {
|
private void cacheChunk(@NotNull Chunk chunk) {
|
||||||
final long index = ChunkUtils.getChunkIndex(chunk);
|
final long index = ChunkUtils.getChunkIndex(chunk);
|
||||||
synchronized (chunks) {
|
this.chunks.put(index, chunk);
|
||||||
this.chunks.put(index, chunk);
|
|
||||||
}
|
|
||||||
UPDATE_MANAGER.signalChunkLoad(chunk);
|
UPDATE_MANAGER.signalChunkLoad(chunk);
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user