mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-07-18 18:23:06 +00:00
Merge remote-tracking branch 'upstream/master' into DecreeCommands
This commit is contained in:
commit
bfb47aba87
@ -95,6 +95,8 @@ public class Iris extends VolmitPlugin implements Listener {
|
||||
|
||||
private void preEnable() {
|
||||
instance = this;
|
||||
services = new KMap<>();
|
||||
initialize("com.volmit.iris.core.service").forEach((i) -> services.put((Class<? extends IrisService>) i.getClass(), (IrisService) i));
|
||||
INMS.get();
|
||||
IO.delete(new File("iris"));
|
||||
installDataPacks();
|
||||
@ -103,9 +105,6 @@ public class Iris extends VolmitPlugin implements Listener {
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private void enable() {
|
||||
services = new KMap<>();
|
||||
initialize("com.volmit.iris.core.service").forEach((i) -> services.put((Class<? extends IrisService>) i.getClass(), (IrisService) i));
|
||||
|
||||
audiences = BukkitAudiences.create(this);
|
||||
sender = new VolmitSender(Bukkit.getConsoleSender());
|
||||
sender.setTag(getTag());
|
||||
@ -245,7 +244,7 @@ public class Iris extends VolmitPlugin implements Listener {
|
||||
for (File i : packs.listFiles()) {
|
||||
if (i.isDirectory()) {
|
||||
Iris.verbose("Checking Pack: " + i.getPath());
|
||||
IrisData data = new IrisData(i);
|
||||
IrisData data = IrisData.get(i);
|
||||
File dims = new File(i, "dimensions");
|
||||
|
||||
if (dims.exists()) {
|
||||
@ -339,7 +338,7 @@ public class Iris extends VolmitPlugin implements Listener {
|
||||
for (File i : packs.listFiles()) {
|
||||
if (i.isDirectory()) {
|
||||
Iris.verbose("Checking Pack: " + i.getPath());
|
||||
IrisData data = new IrisData(i);
|
||||
IrisData data = IrisData.get(i);
|
||||
File dims = new File(i, "dimensions");
|
||||
|
||||
if (dims.exists()) {
|
||||
@ -376,7 +375,7 @@ public class Iris extends VolmitPlugin implements Listener {
|
||||
}
|
||||
|
||||
public boolean verifyDataPackInstalled(IrisDimension dimension) {
|
||||
IrisData idm = new IrisData(getDataFolder("packs", dimension.getLoadKey()));
|
||||
IrisData idm = IrisData.get(getDataFolder("packs", dimension.getLoadKey()));
|
||||
KSet<String> keys = new KSet<>();
|
||||
boolean warn = false;
|
||||
|
||||
|
@ -122,7 +122,6 @@ public class IrisSettings {
|
||||
|
||||
@Data
|
||||
public static class IrisSettingsGenerator {
|
||||
|
||||
public String defaultWorldType = "overworld";
|
||||
public boolean disableMCA = false;
|
||||
public boolean systemEffects = true;
|
||||
|
@ -87,7 +87,7 @@ public class CommandIrisStudioProfile extends MortarCommand {
|
||||
}
|
||||
|
||||
IrisProject p = new IrisProject(f);
|
||||
IrisData data = new IrisData(f);
|
||||
IrisData data = IrisData.get(f);
|
||||
KMap<NoiseStyle, Double> styleTimings = new KMap<>();
|
||||
KMap<InterpolationMethod, Double> interpolatorTimings = new KMap<>();
|
||||
KMap<String, Double> generatorTimings = new KMap<>();
|
||||
|
@ -63,7 +63,7 @@ public class CommandIrisStudioUpdate extends MortarCommand {
|
||||
|
||||
for (String i : args) {
|
||||
if (i.equals("--rewrite-objects")) {
|
||||
IrisData data = new IrisData(Iris.service(StudioSVC.class).getWorkspaceFolder(args[0]));
|
||||
IrisData data = IrisData.get(Iris.service(StudioSVC.class).getWorkspaceFolder(args[0]));
|
||||
int t = data.getObjectLoader().getPossibleKeys().length;
|
||||
ChronoLatch cl = new ChronoLatch(250, false);
|
||||
MultiBurst bx = new MultiBurst("Object Rewriter", Thread.MIN_PRIORITY, Runtime.getRuntime().availableProcessors());
|
||||
|
@ -206,7 +206,7 @@ public class DecStudio implements DecreeExecutor {
|
||||
}
|
||||
};
|
||||
|
||||
IrisData data = new IrisData(Iris.service(StudioSVC.class).getWorkspaceFolder(project.getLoadKey()));
|
||||
IrisData data = IrisData.get(Iris.service(StudioSVC.class).getWorkspaceFolder(project.getLoadKey()));
|
||||
for (String f : data.getObjectLoader().getPossibleKeys()) {
|
||||
CompletableFuture<?> gg = burst.complete(() -> {
|
||||
File ff = data.getObjectLoader().findFile(f);
|
||||
@ -437,7 +437,7 @@ public class DecStudio implements DecreeExecutor {
|
||||
File pack = dimension.getLoadFile().getParentFile().getParentFile();
|
||||
File report = Iris.instance.getDataFile("profile.txt");
|
||||
IrisProject project = new IrisProject(pack);
|
||||
IrisData data = new IrisData(pack);
|
||||
IrisData data = IrisData.get(pack);
|
||||
|
||||
KList<String> fileText = new KList<>();
|
||||
|
||||
|
@ -249,7 +249,7 @@ public class IrisProject {
|
||||
settings.put("[json]", jc);
|
||||
settings.put("json.maxItemsComputed", 30000);
|
||||
JSONArray schemas = new JSONArray();
|
||||
IrisData dm = new IrisData(getPath());
|
||||
IrisData dm = IrisData.get(getPath());
|
||||
|
||||
for (ResourceLoader<?> r : dm.getLoaders().v()) {
|
||||
if (r.supportsSchemas()) {
|
||||
@ -265,7 +265,7 @@ public class IrisProject {
|
||||
|
||||
public File compilePackage(VolmitSender sender, boolean obfuscate, boolean minify) {
|
||||
String dimm = getName();
|
||||
IrisData dm = new IrisData(path);
|
||||
IrisData dm = IrisData.get(path);
|
||||
IrisDimension dimension = dm.getDimensionLoader().load(dimm);
|
||||
File folder = new File(Iris.instance.getDataFolder(), "exports/" + dimension.getLoadKey());
|
||||
folder.mkdirs();
|
||||
|
@ -47,6 +47,7 @@ import java.util.function.Function;
|
||||
|
||||
@Data
|
||||
public class IrisData {
|
||||
private static final KMap<File, IrisData> dataLoaders = new KMap<>();
|
||||
private ResourceLoader<IrisBiome> biomeLoader;
|
||||
private ResourceLoader<IrisLootTable> lootLoader;
|
||||
private ResourceLoader<IrisRegion> regionLoader;
|
||||
@ -68,11 +69,12 @@ public class IrisData {
|
||||
private Engine engine;
|
||||
private final int id;
|
||||
|
||||
public IrisData(File dataFolder) {
|
||||
this(dataFolder, false);
|
||||
public static IrisData get(File dataFolder)
|
||||
{
|
||||
return dataLoaders.compute(dataFolder, (k,v) -> v == null ? new IrisData(dataFolder) : v);
|
||||
}
|
||||
|
||||
public IrisData(File dataFolder, boolean oneshot) {
|
||||
private IrisData(File dataFolder) {
|
||||
this.engine = null;
|
||||
this.dataFolder = dataFolder;
|
||||
this.id = RNG.r.imax();
|
||||
@ -80,6 +82,19 @@ public class IrisData {
|
||||
hotloaded();
|
||||
}
|
||||
|
||||
public static int cacheSize() {
|
||||
int m = 0;
|
||||
for(IrisData i : dataLoaders.values())
|
||||
{
|
||||
for(ResourceLoader<?> j : i.getLoaders().values())
|
||||
{
|
||||
m+=j.getLoadCache().size();
|
||||
}
|
||||
}
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
public void preprocessObject(IrisRegistrant t) {
|
||||
try {
|
||||
IrisContext ctx = IrisContext.get();
|
||||
@ -125,7 +140,7 @@ public class IrisData {
|
||||
}
|
||||
|
||||
public IrisData copy() {
|
||||
return new IrisData(dataFolder);
|
||||
return IrisData.get(dataFolder);
|
||||
}
|
||||
|
||||
private <T extends IrisRegistrant> ResourceLoader<T> registerLoader(Class<T> registrant) {
|
||||
@ -260,7 +275,7 @@ public class IrisData {
|
||||
try {
|
||||
for (File i : Objects.requireNonNull(Iris.instance.getDataFolder("packs").listFiles())) {
|
||||
if (i.isDirectory()) {
|
||||
IrisData dm = new IrisData(i, true);
|
||||
IrisData dm = get(i);
|
||||
T t = v.apply(dm);
|
||||
|
||||
if (t != null) {
|
||||
|
@ -45,10 +45,10 @@ import java.util.stream.Stream;
|
||||
@Data
|
||||
public class ResourceLoader<T extends IrisRegistrant> {
|
||||
public static final AtomicDouble tlt = new AtomicDouble(0);
|
||||
private static final int CACHE_SIZE = 100000;
|
||||
protected File root;
|
||||
protected String folderName;
|
||||
protected String resourceTypeName;
|
||||
protected KMap<String, File> folderMapCache;
|
||||
protected KMap<String, T> loadCache;
|
||||
protected KList<File> folderCache;
|
||||
protected Class<? extends T> objectClass;
|
||||
@ -64,7 +64,6 @@ public class ResourceLoader<T extends IrisRegistrant> {
|
||||
this.manager = manager;
|
||||
sec = new ChronoLatch(5000);
|
||||
loads = new AtomicInteger();
|
||||
folderMapCache = new KMap<>();
|
||||
this.objectClass = objectClass;
|
||||
cname = objectClass.getCanonicalName();
|
||||
this.resourceTypeName = resourceTypeName;
|
||||
|
@ -19,6 +19,7 @@
|
||||
package com.volmit.iris.core.service;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.core.project.loader.IrisData;
|
||||
import com.volmit.iris.core.tools.IrisToolbelt;
|
||||
import com.volmit.iris.engine.framework.Engine;
|
||||
import com.volmit.iris.engine.object.feature.IrisFeaturePositional;
|
||||
@ -142,7 +143,7 @@ public class BoardSVC implements IrisService, BoardProvider {
|
||||
v.add(C.AQUA + "Height" + C.GRAY + ": " + Math.round(engine.getHeight(x, z)));
|
||||
v.add(C.AQUA + "Slope" + C.GRAY + ": " + Form.f(engine.getComplex().getSlopeStream().get(x, z), 2));
|
||||
v.add(C.AQUA + "Features" + C.GRAY + ": " + Form.f(f.size()));
|
||||
v.add(C.AQUA + "Energy" + C.GRAY + ": " + Form.f(engine.getWorldManager().getEnergy(), 0));
|
||||
v.add(C.AQUA + "Cache" + C.GRAY + ": " + Form.f(IrisData.cacheSize()));
|
||||
v.add(C.AQUA + "Sat" + C.GRAY + ": " + Form.f(engine.getWorldManager().getEntityCount()) + "e / " + Form.f(engine.getWorldManager().getChunkCount()) + "c (" + Form.pc(engine.getWorldManager().getEntitySaturation(), 0) + ")");
|
||||
}
|
||||
|
||||
|
101
src/main/java/com/volmit/iris/core/service/ExecutionSVC.java
Normal file
101
src/main/java/com/volmit/iris/core/service/ExecutionSVC.java
Normal file
@ -0,0 +1,101 @@
|
||||
/*
|
||||
* Iris is a World Generator for Minecraft Bukkit Servers
|
||||
* Copyright (c) 2021 Arcane Arts (Volmit Software)
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package com.volmit.iris.core.service;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.util.collection.KList;
|
||||
import com.volmit.iris.util.parallel.MultiBurst;
|
||||
import com.volmit.iris.util.plugin.IrisService;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
public class ExecutionSVC implements IrisService
|
||||
{
|
||||
private KList<Thread> threads = new KList<>();
|
||||
private KList<MultiBurst> bursts = new KList<>();
|
||||
private KList<ExecutorService> services = new KList<>();
|
||||
|
||||
public void register(Thread t)
|
||||
{
|
||||
threads.add(t);
|
||||
}
|
||||
|
||||
public void register(MultiBurst burst)
|
||||
{
|
||||
bursts.add(burst);
|
||||
}
|
||||
|
||||
public void register(ExecutorService service)
|
||||
{
|
||||
services.add(service);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDisable() {
|
||||
for(Thread i : threads)
|
||||
{
|
||||
if(i.isAlive())
|
||||
{
|
||||
try
|
||||
{
|
||||
i.interrupt();
|
||||
Iris.info("Shutdown Thread " + i.getName());
|
||||
}
|
||||
|
||||
catch(Throwable e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for(MultiBurst i : bursts)
|
||||
{
|
||||
try
|
||||
{
|
||||
i.shutdownNow();
|
||||
Iris.info("Shutdown Multiburst " + i);
|
||||
}
|
||||
|
||||
catch(Throwable e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
for(ExecutorService i : services)
|
||||
{
|
||||
try
|
||||
{
|
||||
i.shutdownNow();
|
||||
Iris.info("Shutdown Executor Service " + i);
|
||||
}
|
||||
|
||||
catch(Throwable e)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -78,6 +78,7 @@ public class StudioSVC implements IrisService {
|
||||
|
||||
for (World i : Bukkit.getWorlds()) {
|
||||
if (IrisToolbelt.isIrisWorld(i)) {
|
||||
IrisToolbelt.evacuate(i);
|
||||
Iris.debug("Closing Platform Generator " + i.getName());
|
||||
IrisToolbelt.access(i).close();
|
||||
}
|
||||
@ -142,7 +143,7 @@ public class StudioSVC implements IrisService {
|
||||
return null;
|
||||
}
|
||||
|
||||
IrisData dm = new IrisData(irispack);
|
||||
IrisData dm = IrisData.get(irispack);
|
||||
dim = dm.getDimensionLoader().load(type);
|
||||
|
||||
if (dim == null) {
|
||||
|
@ -64,7 +64,7 @@ public class IrisToolbelt {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new IrisData(pack).getDimensionLoader().load(dimension);
|
||||
return IrisData.get(pack).getDimensionLoader().load(dimension);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -431,7 +431,7 @@ public class IrisEngine extends BlockPopulator implements Engine {
|
||||
|
||||
catch(Throwable e)
|
||||
{
|
||||
e.printStackTrace();
|
||||
Iris.reportError(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -40,7 +40,7 @@ public class EngineProvider {
|
||||
public void provideEngine(IrisWorld world, String dimension, File dataLocation, boolean studio, Consumer<Engine> post) {
|
||||
close();
|
||||
engine.set(MultiBurst.burst.completeValue(() -> {
|
||||
IrisData data = new IrisData(dataLocation);
|
||||
IrisData data = IrisData.get(dataLocation);
|
||||
IrisDimension realDimension = data.getDimensionLoader().load(dimension);
|
||||
|
||||
if (realDimension == null) {
|
||||
|
@ -37,7 +37,7 @@ public class BiomeHandler implements DecreeParameterHandler<IrisBiome> {
|
||||
//noinspection ConstantConditions
|
||||
for (File i : Iris.instance.getDataFolder("packs").listFiles()) {
|
||||
if (i.isDirectory()) {
|
||||
IrisData data = new IrisData(i, true);
|
||||
IrisData data = IrisData.get(i);
|
||||
for (IrisBiome j : data.getBiomeLoader().loadAll(data.getBiomeLoader().getPossibleKeys())) {
|
||||
p.putIfAbsent(j.getLoadKey(), j);
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ public class DimensionHandler implements DecreeParameterHandler<IrisDimension> {
|
||||
//noinspection ConstantConditions
|
||||
for (File i : Iris.instance.getDataFolder("packs").listFiles()) {
|
||||
if (i.isDirectory()) {
|
||||
IrisData data = new IrisData(i, true);
|
||||
IrisData data = IrisData.get(i);
|
||||
for (IrisDimension j : data.getDimensionLoader().loadAll(data.getDimensionLoader().getPossibleKeys())) {
|
||||
p.putIfAbsent(j.getLoadKey(), j);
|
||||
}
|
||||
|
@ -43,7 +43,7 @@ public class EntityHandler implements DecreeParameterHandler<IrisEntity> {
|
||||
//noinspection ConstantConditions
|
||||
for (File i : Iris.instance.getDataFolder("packs").listFiles()) {
|
||||
if (i.isDirectory()) {
|
||||
IrisData data = new IrisData(i, true);
|
||||
IrisData data = IrisData.get(i);
|
||||
for (IrisEntity j : data.getEntityLoader().loadAll(data.getEntityLoader().getPossibleKeys())) {
|
||||
p.putIfAbsent(j.getLoadKey(), j);
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ public class GeneratorHandler implements DecreeParameterHandler<IrisGenerator> {
|
||||
//noinspection ConstantConditions
|
||||
for (File i : Iris.instance.getDataFolder("packs").listFiles()) {
|
||||
if (i.isDirectory()) {
|
||||
IrisData data = new IrisData(i, true);
|
||||
IrisData data = IrisData.get(i);
|
||||
for (IrisGenerator j : data.getGeneratorLoader().loadAll(data.getGeneratorLoader().getPossibleKeys())) {
|
||||
p.putIfAbsent(j.getLoadKey(), j);
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ public class RegionHandler implements DecreeParameterHandler<IrisRegion> {
|
||||
//noinspection ConstantConditions
|
||||
for (File i : Iris.instance.getDataFolder("packs").listFiles()) {
|
||||
if (i.isDirectory()) {
|
||||
IrisData data = new IrisData(i, true);
|
||||
IrisData data = IrisData.get(i);
|
||||
for (IrisRegion j : data.getRegionLoader().loadAll(data.getRegionLoader().getPossibleKeys())) {
|
||||
p.putIfAbsent(j.getLoadKey(), j);
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ public class ScriptHandler implements DecreeParameterHandler<IrisScript> {
|
||||
//noinspection ConstantConditions
|
||||
for (File i : Iris.instance.getDataFolder("packs").listFiles()) {
|
||||
if (i.isDirectory()) {
|
||||
IrisData data = new IrisData(i, true);
|
||||
IrisData data = IrisData.get(i);
|
||||
for (IrisScript j : data.getScriptLoader().loadAll(data.getScriptLoader().getPossibleKeys())) {
|
||||
p.putIfAbsent(j.getLoadKey(), j);
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ package com.volmit.iris.util.parallel;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.core.IrisSettings;
|
||||
import com.volmit.iris.core.service.ExecutionSVC;
|
||||
import com.volmit.iris.util.io.InstanceState;
|
||||
import com.volmit.iris.util.math.M;
|
||||
import com.volmit.iris.util.scheduling.J;
|
||||
@ -70,6 +71,7 @@ public class MultiBurst {
|
||||
};
|
||||
heartbeat.setName(name + " Monitor");
|
||||
heartbeat.start();
|
||||
Iris.service(ExecutionSVC.class).register(this);
|
||||
}
|
||||
|
||||
private synchronized ExecutorService getService() {
|
||||
@ -88,6 +90,7 @@ public class MultiBurst {
|
||||
|
||||
return t;
|
||||
});
|
||||
Iris.service(ExecutionSVC.class).register(service);
|
||||
Iris.debug("Started MultiBurst Pool " + name + " with " + tc + " threads at " + priority + " priority.");
|
||||
}
|
||||
|
||||
|
@ -19,10 +19,14 @@
|
||||
package com.volmit.iris.util.scheduling;
|
||||
|
||||
import com.volmit.iris.Iris;
|
||||
import com.volmit.iris.core.service.ExecutionSVC;
|
||||
|
||||
import java.util.concurrent.ExecutorService;
|
||||
|
||||
public abstract class Looper extends Thread {
|
||||
@SuppressWarnings("BusyWait")
|
||||
public void run() {
|
||||
Iris.service(ExecutionSVC.class).register(this);
|
||||
while (!interrupted()) {
|
||||
try {
|
||||
long m = loop();
|
||||
|
Loading…
x
Reference in New Issue
Block a user