2020-04-24 03:25:58 +02:00
|
|
|
package net.minestom.server.instance;
|
2019-08-11 07:42:56 +02:00
|
|
|
|
2020-04-24 03:25:58 +02:00
|
|
|
import net.minestom.server.MinecraftServer;
|
|
|
|
import net.minestom.server.utils.thread.MinestomThread;
|
2019-09-21 20:42:27 +02:00
|
|
|
|
2019-08-23 23:55:09 +02:00
|
|
|
import java.io.File;
|
2019-08-11 07:42:56 +02:00
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.Set;
|
2019-08-11 09:33:27 +02:00
|
|
|
import java.util.UUID;
|
2019-09-21 20:42:27 +02:00
|
|
|
import java.util.concurrent.ExecutorService;
|
2019-08-11 07:42:56 +02:00
|
|
|
|
|
|
|
public class InstanceManager {
|
|
|
|
|
2020-04-13 17:17:21 +02:00
|
|
|
private ExecutorService blocksPool = new MinestomThread(MinecraftServer.THREAD_COUNT_BLOCK_UPDATE, MinecraftServer.THREAD_NAME_BLOCK_UPDATE);
|
2019-09-21 20:42:27 +02:00
|
|
|
|
2019-08-11 07:42:56 +02:00
|
|
|
private Set<Instance> instances = Collections.synchronizedSet(new HashSet<>());
|
|
|
|
|
2019-08-24 21:41:43 +02:00
|
|
|
public InstanceContainer createInstanceContainer(File folder) {
|
2020-03-29 20:58:30 +02:00
|
|
|
if (folder != null && !folder.exists())
|
|
|
|
folder.mkdir();
|
|
|
|
|
2019-08-24 21:41:43 +02:00
|
|
|
InstanceContainer instance = new InstanceContainer(UUID.randomUUID(), folder);
|
2019-08-11 07:42:56 +02:00
|
|
|
this.instances.add(instance);
|
|
|
|
return instance;
|
|
|
|
}
|
|
|
|
|
2019-08-24 21:41:43 +02:00
|
|
|
public InstanceContainer createInstanceContainer() {
|
|
|
|
return createInstanceContainer(null);
|
|
|
|
}
|
|
|
|
|
|
|
|
public SharedInstance createSharedInstance(InstanceContainer instanceContainer) {
|
|
|
|
if (instanceContainer == null)
|
|
|
|
throw new IllegalArgumentException("Instance container cannot be null when creating a Shared instance!");
|
|
|
|
|
|
|
|
SharedInstance sharedInstance = new SharedInstance(UUID.randomUUID(), instanceContainer);
|
|
|
|
instanceContainer.addSharedInstance(sharedInstance);
|
|
|
|
this.instances.add(sharedInstance);
|
|
|
|
return sharedInstance;
|
2019-08-23 23:55:09 +02:00
|
|
|
}
|
|
|
|
|
2019-09-21 20:42:27 +02:00
|
|
|
public void updateBlocks() {
|
|
|
|
if (instances.isEmpty())
|
|
|
|
return;
|
|
|
|
|
|
|
|
long time = System.currentTimeMillis();
|
2020-03-30 19:48:25 +02:00
|
|
|
for (Instance instance : instances) {
|
|
|
|
if (instance instanceof InstanceContainer) { // SharedInstance should be updated at the same time (verify?)
|
|
|
|
|
|
|
|
blocksPool.execute(() -> {
|
2019-09-21 20:42:27 +02:00
|
|
|
for (Chunk chunk : instance.getChunks()) {
|
|
|
|
chunk.updateBlocks(time, instance);
|
|
|
|
}
|
2020-03-30 19:48:25 +02:00
|
|
|
});
|
|
|
|
|
2019-09-21 20:42:27 +02:00
|
|
|
}
|
2020-03-30 19:48:25 +02:00
|
|
|
}
|
2019-09-21 20:42:27 +02:00
|
|
|
}
|
|
|
|
|
2019-08-11 07:42:56 +02:00
|
|
|
public Set<Instance> getInstances() {
|
|
|
|
return Collections.unmodifiableSet(instances);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|