more da more thing
This commit is contained in:
@@ -23,6 +23,7 @@ public class WorldEngine {
|
|||||||
private ISectionChangeCallback dirtyCallback;
|
private ISectionChangeCallback dirtyCallback;
|
||||||
private ISectionSaveCallback saveCallback;
|
private ISectionSaveCallback saveCallback;
|
||||||
private final int maxMipLevels;
|
private final int maxMipLevels;
|
||||||
|
private volatile boolean isLive = true;
|
||||||
|
|
||||||
public void setDirtyCallback(ISectionChangeCallback callback) {
|
public void setDirtyCallback(ISectionChangeCallback callback) {
|
||||||
this.dirtyCallback = callback;
|
this.dirtyCallback = callback;
|
||||||
@@ -33,6 +34,7 @@ public class WorldEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Mapper getMapper() {return this.mapper;}
|
public Mapper getMapper() {return this.mapper;}
|
||||||
|
public boolean isLive() {return this.isLive;}
|
||||||
public WorldEngine(SectionStorage storage, int cacheCount) {
|
public WorldEngine(SectionStorage storage, int cacheCount) {
|
||||||
this(storage, MAX_LOD_LAYERS, cacheCount);
|
this(storage, MAX_LOD_LAYERS, cacheCount);
|
||||||
}
|
}
|
||||||
@@ -46,18 +48,22 @@ public class WorldEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public WorldSection acquireIfExists(int lvl, int x, int y, int z) {
|
public WorldSection acquireIfExists(int lvl, int x, int y, int z) {
|
||||||
|
if (!this.isLive) throw new IllegalStateException("World is not live");
|
||||||
return this.sectionTracker.acquire(lvl, x, y, z, true);
|
return this.sectionTracker.acquire(lvl, x, y, z, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public WorldSection acquire(int lvl, int x, int y, int z) {
|
public WorldSection acquire(int lvl, int x, int y, int z) {
|
||||||
|
if (!this.isLive) throw new IllegalStateException("World is not live");
|
||||||
return this.sectionTracker.acquire(lvl, x, y, z, false);
|
return this.sectionTracker.acquire(lvl, x, y, z, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public WorldSection acquire(long pos) {
|
public WorldSection acquire(long pos) {
|
||||||
|
if (!this.isLive) throw new IllegalStateException("World is not live");
|
||||||
return this.sectionTracker.acquire(pos, false);
|
return this.sectionTracker.acquire(pos, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public WorldSection acquireIfExists(long pos) {
|
public WorldSection acquireIfExists(long pos) {
|
||||||
|
if (!this.isLive) throw new IllegalStateException("World is not live");
|
||||||
return this.sectionTracker.acquire(pos, true);
|
return this.sectionTracker.acquire(pos, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,6 +98,7 @@ public class WorldEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void markDirty(WorldSection section, int changeState) {
|
public void markDirty(WorldSection section, int changeState) {
|
||||||
|
if (!this.isLive) throw new IllegalStateException("World is not live");
|
||||||
if (this.dirtyCallback != null) {
|
if (this.dirtyCallback != null) {
|
||||||
this.dirtyCallback.accept(section, changeState);
|
this.dirtyCallback.accept(section, changeState);
|
||||||
}
|
}
|
||||||
@@ -106,6 +113,7 @@ public class WorldEngine {
|
|||||||
|
|
||||||
//NOTE: THIS RUNS ON THE THREAD IT WAS EXECUTED ON, when this method exits, the calling method may assume that VoxelizedSection is no longer needed
|
//NOTE: THIS RUNS ON THE THREAD IT WAS EXECUTED ON, when this method exits, the calling method may assume that VoxelizedSection is no longer needed
|
||||||
public void insertUpdate(VoxelizedSection section) {//TODO: add a bitset of levels to update and if it should force update
|
public void insertUpdate(VoxelizedSection section) {//TODO: add a bitset of levels to update and if it should force update
|
||||||
|
if (!this.isLive) throw new IllegalStateException("World is not live");
|
||||||
boolean shouldCheckEmptiness = false;
|
boolean shouldCheckEmptiness = false;
|
||||||
WorldSection previousSection = null;
|
WorldSection previousSection = null;
|
||||||
|
|
||||||
@@ -200,6 +208,7 @@ public class WorldEngine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void shutdown() {
|
public void shutdown() {
|
||||||
|
this.isLive = false;
|
||||||
try {this.mapper.close();} catch (Exception e) {Logger.error(e);}
|
try {this.mapper.close();} catch (Exception e) {Logger.error(e);}
|
||||||
try {this.storage.flush();} catch (Exception e) {Logger.error(e);}
|
try {this.storage.flush();} catch (Exception e) {Logger.error(e);}
|
||||||
//Shutdown in this order to preserve as much data as possible
|
//Shutdown in this order to preserve as much data as possible
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import me.cortex.voxy.client.core.WorldImportWrapper;
|
|||||||
import me.cortex.voxy.client.saver.ContextSelectionSystem;
|
import me.cortex.voxy.client.saver.ContextSelectionSystem;
|
||||||
import me.cortex.voxy.common.Logger;
|
import me.cortex.voxy.common.Logger;
|
||||||
import me.cortex.voxy.common.config.section.SectionStorage;
|
import me.cortex.voxy.common.config.section.SectionStorage;
|
||||||
import me.cortex.voxy.common.config.storage.StorageBackend;
|
|
||||||
import me.cortex.voxy.common.thread.ServiceThreadPool;
|
import me.cortex.voxy.common.thread.ServiceThreadPool;
|
||||||
import me.cortex.voxy.common.util.MemoryBuffer;
|
import me.cortex.voxy.common.util.MemoryBuffer;
|
||||||
import me.cortex.voxy.common.world.WorldEngine;
|
import me.cortex.voxy.common.world.WorldEngine;
|
||||||
@@ -74,13 +73,22 @@ public class VoxyInstance {
|
|||||||
return world;
|
return world;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final ContextSelectionSystem SELECTOR = new ContextSelectionSystem();
|
//There are 4 possible "states" for world selection/management
|
||||||
|
// 1) dedicated server
|
||||||
|
// 2) client singleplayer
|
||||||
|
// 3) client singleplayer as lan host (so also a server)
|
||||||
|
// 4) client multiplayer (remote server)
|
||||||
|
|
||||||
|
//The thing with singleplayer is that it is more efficent to make it bound to clientworld (think)
|
||||||
|
// so if make into singleplayer as host, would need to reload the system into that mode
|
||||||
|
// so that the world renderer uses the WorldEngine of the server
|
||||||
|
|
||||||
|
private static final ContextSelectionSystem SELECTOR = new ContextSelectionSystem();
|
||||||
|
public WorldImportWrapper importWrapper;
|
||||||
public WorldEngine getOrMakeWorld(ClientWorld world) {
|
public WorldEngine getOrMakeWorld(ClientWorld world) {
|
||||||
var vworld = ((IVoxyWorldGetter)world).getWorldEngine();
|
var vworld = ((IVoxyWorldGetter)world).getWorldEngine();
|
||||||
if (vworld == null) {
|
if (vworld == null) {
|
||||||
vworld = new WorldEngine(SELECTOR.getBestSelectionOrCreate(world).createSectionStorageBackend(), 1024);
|
vworld = this.createWorld(SELECTOR.getBestSelectionOrCreate(world).createSectionStorageBackend());
|
||||||
vworld.setSaveCallback(this.savingService::enqueueSave);
|
|
||||||
((IVoxyWorldSetter)world).setWorldEngine(vworld);
|
((IVoxyWorldSetter)world).setWorldEngine(vworld);
|
||||||
this.importWrapper = new WorldImportWrapper(this.threadPool, vworld);
|
this.importWrapper = new WorldImportWrapper(this.threadPool, vworld);
|
||||||
}
|
}
|
||||||
@@ -88,13 +96,24 @@ public class VoxyInstance {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public WorldImportWrapper importWrapper;
|
|
||||||
|
|
||||||
public void stopWorld(WorldEngine world) {
|
public void stopWorld(WorldEngine world) {
|
||||||
|
if (!this.activeWorlds.contains(world)) {
|
||||||
|
if (world.isLive()) {
|
||||||
|
throw new IllegalStateException("World cannot be live and not in world set");
|
||||||
|
}
|
||||||
|
throw new IllegalStateException("Cannot close world which is not part of instance");
|
||||||
|
}
|
||||||
|
if (!world.isLive()) {
|
||||||
|
throw new IllegalStateException("World cannot be in world set and not alive");
|
||||||
|
}
|
||||||
|
|
||||||
if (this.importWrapper != null) {
|
if (this.importWrapper != null) {
|
||||||
this.importWrapper.stopImporter();
|
this.importWrapper.stopImporter();
|
||||||
}
|
}
|
||||||
this.flush();
|
this.flush();
|
||||||
|
|
||||||
world.shutdown();
|
world.shutdown();
|
||||||
|
this.activeWorlds.remove(world);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user