Fix current level unloading on the client.
This commit is contained in:
@@ -37,7 +37,7 @@ import java.util.concurrent.CompletableFuture;
|
||||
|
||||
public class DhClientServerWorld extends AbstractDhServerWorld<DhClientServerLevel> implements IDhClientWorld
|
||||
{
|
||||
private final Set<DhClientServerLevel> dhLevels = Collections.synchronizedSet(new HashSet<>());
|
||||
private final Map<DhClientServerLevel, Set<ILevelWrapper>> dhLevels = Collections.synchronizedMap(new HashMap<>());
|
||||
|
||||
private final Timer clientTickTimer = TimerUtil.CreateTimer("ClientTickTimer");
|
||||
|
||||
@@ -57,7 +57,7 @@ public class DhClientServerWorld extends AbstractDhServerWorld<DhClientServerLev
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
DhClientServerWorld.this.dhLevels.forEach(DhClientServerLevel::clientTick);
|
||||
DhClientServerWorld.this.dhLevels.keySet().forEach(DhClientServerLevel::clientTick);
|
||||
}
|
||||
}, 0, IDhClientWorld.TICK_RATE_IN_MS);
|
||||
}
|
||||
@@ -78,7 +78,7 @@ public class DhClientServerWorld extends AbstractDhServerWorld<DhClientServerLev
|
||||
try
|
||||
{
|
||||
DhClientServerLevel level = new DhClientServerLevel(this.saveStructure, (IServerLevelWrapper) levelWrapper, this.getServerPlayerStateManager());
|
||||
this.dhLevels.add(level);
|
||||
this.dhLevels.computeIfAbsent(level, k -> Collections.synchronizedSet(new HashSet<>()));
|
||||
ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelLoadEvent.class, new DhApiLevelLoadEvent.EventParam(wrapper));
|
||||
return level;
|
||||
}
|
||||
@@ -119,13 +119,14 @@ public class DhClientServerWorld extends AbstractDhServerWorld<DhClientServerLev
|
||||
|
||||
level.startRenderer();
|
||||
clientLevelWrapper.setDhLevel(level);
|
||||
dhLevels.get(level).add(wrapper);
|
||||
return level;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unloadLevel(@NotNull ILevelWrapper wrapper)
|
||||
public boolean unloadLevel(@NotNull ILevelWrapper wrapper)
|
||||
{
|
||||
if (this.dhLevelByLevelWrapper.containsKey(wrapper))
|
||||
{
|
||||
@@ -143,11 +144,18 @@ public class DhClientServerWorld extends AbstractDhServerWorld<DhClientServerLev
|
||||
// If the level wrapper is a Client Level Wrapper, then that means the client side leaves the level,
|
||||
// but note that the server side still has the level loaded. So, we don't want to unload the level,
|
||||
// we just want to stop rendering it.
|
||||
this.dhLevelByLevelWrapper.remove(wrapper).stopRenderer(); // Ignore resource warning. The level obj is referenced elsewhere.
|
||||
DhClientServerLevel level = this.dhLevelByLevelWrapper.remove(wrapper); // Ignore resource warning. The level obj is referenced elsewhere.
|
||||
Set<ILevelWrapper> wrappers = dhLevels.get(level);
|
||||
wrappers.remove(wrapper);
|
||||
if (wrappers.isEmpty()) {
|
||||
level.stopRenderer();
|
||||
}
|
||||
wrapper.onUnload(); // We still want to unload the wrapper though.
|
||||
}
|
||||
ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelUnloadEvent.class, new DhApiLevelUnloadEvent.EventParam(wrapper));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -165,7 +173,7 @@ public class DhClientServerWorld extends AbstractDhServerWorld<DhClientServerLev
|
||||
synchronized (this.dhLevels)
|
||||
{
|
||||
// close each level
|
||||
for (DhClientServerLevel level : this.dhLevels)
|
||||
for (DhClientServerLevel level : this.dhLevels.keySet())
|
||||
{
|
||||
// level wrapper shouldn't be null, but just in case
|
||||
IServerLevelWrapper serverLevelWrapper = level.getServerLevelWrapper();
|
||||
|
||||
@@ -132,11 +132,11 @@ public class DhClientWorld extends AbstractDhWorld implements IDhClientWorld
|
||||
public int getLoadedLevelCount() { return this.levels.size(); }
|
||||
|
||||
@Override
|
||||
public void unloadLevel(@NotNull ILevelWrapper wrapper)
|
||||
public boolean unloadLevel(@NotNull ILevelWrapper wrapper)
|
||||
{
|
||||
if (!(wrapper instanceof IClientLevelWrapper))
|
||||
{
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this.levels.containsKey(wrapper))
|
||||
@@ -145,7 +145,9 @@ public class DhClientWorld extends AbstractDhWorld implements IDhClientWorld
|
||||
wrapper.onUnload();
|
||||
this.levels.remove(wrapper).close();
|
||||
ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelUnloadEvent.class, new DhApiLevelUnloadEvent.EventParam(wrapper));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -85,11 +85,11 @@ public class DhServerWorld extends AbstractDhServerWorld<DhServerLevel>
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unloadLevel(@NotNull ILevelWrapper wrapper)
|
||||
public boolean unloadLevel(@NotNull ILevelWrapper wrapper)
|
||||
{
|
||||
if (!(wrapper instanceof IServerLevelWrapper))
|
||||
{
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (this.dhLevelByLevelWrapper.containsKey(wrapper))
|
||||
@@ -97,7 +97,9 @@ public class DhServerWorld extends AbstractDhServerWorld<DhServerLevel>
|
||||
wrapper.onUnload();
|
||||
this.dhLevelByLevelWrapper.remove(wrapper).close();
|
||||
ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelUnloadEvent.class, new DhApiLevelUnloadEvent.EventParam(wrapper));
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -49,6 +49,6 @@ public interface IDhWorld extends Closeable
|
||||
Iterable<? extends IDhLevel> getAllLoadedLevels();
|
||||
int getLoadedLevelCount();
|
||||
|
||||
void unloadLevel(@NotNull ILevelWrapper levelWrapper);
|
||||
boolean unloadLevel(@NotNull ILevelWrapper levelWrapper);
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user