diff --git a/core/src/main/java/com/seibel/distanthorizons/core/world/AbstractDhServerWorld.java b/core/src/main/java/com/seibel/distanthorizons/core/world/AbstractDhServerWorld.java index eefa32141..0b02b85c6 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/world/AbstractDhServerWorld.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/world/AbstractDhServerWorld.java @@ -12,14 +12,26 @@ import org.jetbrains.annotations.NotNull; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; +import java.util.concurrent.ConcurrentHashMap; public abstract class AbstractDhServerWorld extends AbstractDhWorld implements IDhServerWorld { - protected final HashMap dhLevelByLevelWrapper = new HashMap<>(); + /** + * Concurrent since levels can be added/remove while other processing is happening. + * (Otherwise we may need to just put the logic in a lock. + */ + protected final ConcurrentHashMap dhLevelByLevelWrapper = new ConcurrentHashMap<>(); public final LocalSaveStructure saveStructure = new LocalSaveStructure(); private final ServerPlayerStateManager serverPlayerStateManager; + + + //=============// + // constructor // + //=============// + public AbstractDhServerWorld(EWorldEnvironment worldEnvironment) { super(worldEnvironment); @@ -31,7 +43,6 @@ public abstract class AbstractDhServerWorld) this.dhLevelByLevelWrapper.values().stream().distinct()::iterator) + Iterator it = this.dhLevelByLevelWrapper.values().stream().distinct().iterator(); + while (it.hasNext()) { + TDhServerLevel level = it.next(); level.registerNetworkHandlers(playerState); }