Merge remote-tracking branch 'upstream/master' into DecreeCommands

This commit is contained in:
CocoTheOwner 2021-08-17 18:17:17 +02:00
commit bfb47aba87
22 changed files with 153 additions and 31 deletions

View File

@ -95,6 +95,8 @@ public class Iris extends VolmitPlugin implements Listener {
private void preEnable() { private void preEnable() {
instance = this; instance = this;
services = new KMap<>();
initialize("com.volmit.iris.core.service").forEach((i) -> services.put((Class<? extends IrisService>) i.getClass(), (IrisService) i));
INMS.get(); INMS.get();
IO.delete(new File("iris")); IO.delete(new File("iris"));
installDataPacks(); installDataPacks();
@ -103,9 +105,6 @@ public class Iris extends VolmitPlugin implements Listener {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private void enable() { 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); audiences = BukkitAudiences.create(this);
sender = new VolmitSender(Bukkit.getConsoleSender()); sender = new VolmitSender(Bukkit.getConsoleSender());
sender.setTag(getTag()); sender.setTag(getTag());
@ -245,7 +244,7 @@ public class Iris extends VolmitPlugin implements Listener {
for (File i : packs.listFiles()) { for (File i : packs.listFiles()) {
if (i.isDirectory()) { if (i.isDirectory()) {
Iris.verbose("Checking Pack: " + i.getPath()); Iris.verbose("Checking Pack: " + i.getPath());
IrisData data = new IrisData(i); IrisData data = IrisData.get(i);
File dims = new File(i, "dimensions"); File dims = new File(i, "dimensions");
if (dims.exists()) { if (dims.exists()) {
@ -339,7 +338,7 @@ public class Iris extends VolmitPlugin implements Listener {
for (File i : packs.listFiles()) { for (File i : packs.listFiles()) {
if (i.isDirectory()) { if (i.isDirectory()) {
Iris.verbose("Checking Pack: " + i.getPath()); Iris.verbose("Checking Pack: " + i.getPath());
IrisData data = new IrisData(i); IrisData data = IrisData.get(i);
File dims = new File(i, "dimensions"); File dims = new File(i, "dimensions");
if (dims.exists()) { if (dims.exists()) {
@ -376,7 +375,7 @@ public class Iris extends VolmitPlugin implements Listener {
} }
public boolean verifyDataPackInstalled(IrisDimension dimension) { 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<>(); KSet<String> keys = new KSet<>();
boolean warn = false; boolean warn = false;

View File

@ -122,7 +122,6 @@ public class IrisSettings {
@Data @Data
public static class IrisSettingsGenerator { public static class IrisSettingsGenerator {
public String defaultWorldType = "overworld"; public String defaultWorldType = "overworld";
public boolean disableMCA = false; public boolean disableMCA = false;
public boolean systemEffects = true; public boolean systemEffects = true;

View File

@ -87,7 +87,7 @@ public class CommandIrisStudioProfile extends MortarCommand {
} }
IrisProject p = new IrisProject(f); IrisProject p = new IrisProject(f);
IrisData data = new IrisData(f); IrisData data = IrisData.get(f);
KMap<NoiseStyle, Double> styleTimings = new KMap<>(); KMap<NoiseStyle, Double> styleTimings = new KMap<>();
KMap<InterpolationMethod, Double> interpolatorTimings = new KMap<>(); KMap<InterpolationMethod, Double> interpolatorTimings = new KMap<>();
KMap<String, Double> generatorTimings = new KMap<>(); KMap<String, Double> generatorTimings = new KMap<>();

View File

@ -63,7 +63,7 @@ public class CommandIrisStudioUpdate extends MortarCommand {
for (String i : args) { for (String i : args) {
if (i.equals("--rewrite-objects")) { 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; int t = data.getObjectLoader().getPossibleKeys().length;
ChronoLatch cl = new ChronoLatch(250, false); ChronoLatch cl = new ChronoLatch(250, false);
MultiBurst bx = new MultiBurst("Object Rewriter", Thread.MIN_PRIORITY, Runtime.getRuntime().availableProcessors()); MultiBurst bx = new MultiBurst("Object Rewriter", Thread.MIN_PRIORITY, Runtime.getRuntime().availableProcessors());

View File

@ -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()) { for (String f : data.getObjectLoader().getPossibleKeys()) {
CompletableFuture<?> gg = burst.complete(() -> { CompletableFuture<?> gg = burst.complete(() -> {
File ff = data.getObjectLoader().findFile(f); File ff = data.getObjectLoader().findFile(f);
@ -437,7 +437,7 @@ public class DecStudio implements DecreeExecutor {
File pack = dimension.getLoadFile().getParentFile().getParentFile(); File pack = dimension.getLoadFile().getParentFile().getParentFile();
File report = Iris.instance.getDataFile("profile.txt"); File report = Iris.instance.getDataFile("profile.txt");
IrisProject project = new IrisProject(pack); IrisProject project = new IrisProject(pack);
IrisData data = new IrisData(pack); IrisData data = IrisData.get(pack);
KList<String> fileText = new KList<>(); KList<String> fileText = new KList<>();

View File

@ -249,7 +249,7 @@ public class IrisProject {
settings.put("[json]", jc); settings.put("[json]", jc);
settings.put("json.maxItemsComputed", 30000); settings.put("json.maxItemsComputed", 30000);
JSONArray schemas = new JSONArray(); JSONArray schemas = new JSONArray();
IrisData dm = new IrisData(getPath()); IrisData dm = IrisData.get(getPath());
for (ResourceLoader<?> r : dm.getLoaders().v()) { for (ResourceLoader<?> r : dm.getLoaders().v()) {
if (r.supportsSchemas()) { if (r.supportsSchemas()) {
@ -265,7 +265,7 @@ public class IrisProject {
public File compilePackage(VolmitSender sender, boolean obfuscate, boolean minify) { public File compilePackage(VolmitSender sender, boolean obfuscate, boolean minify) {
String dimm = getName(); String dimm = getName();
IrisData dm = new IrisData(path); IrisData dm = IrisData.get(path);
IrisDimension dimension = dm.getDimensionLoader().load(dimm); IrisDimension dimension = dm.getDimensionLoader().load(dimm);
File folder = new File(Iris.instance.getDataFolder(), "exports/" + dimension.getLoadKey()); File folder = new File(Iris.instance.getDataFolder(), "exports/" + dimension.getLoadKey());
folder.mkdirs(); folder.mkdirs();

View File

@ -47,6 +47,7 @@ import java.util.function.Function;
@Data @Data
public class IrisData { public class IrisData {
private static final KMap<File, IrisData> dataLoaders = new KMap<>();
private ResourceLoader<IrisBiome> biomeLoader; private ResourceLoader<IrisBiome> biomeLoader;
private ResourceLoader<IrisLootTable> lootLoader; private ResourceLoader<IrisLootTable> lootLoader;
private ResourceLoader<IrisRegion> regionLoader; private ResourceLoader<IrisRegion> regionLoader;
@ -68,11 +69,12 @@ public class IrisData {
private Engine engine; private Engine engine;
private final int id; private final int id;
public IrisData(File dataFolder) { public static IrisData get(File dataFolder)
this(dataFolder, false); {
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.engine = null;
this.dataFolder = dataFolder; this.dataFolder = dataFolder;
this.id = RNG.r.imax(); this.id = RNG.r.imax();
@ -80,6 +82,19 @@ public class IrisData {
hotloaded(); 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) { public void preprocessObject(IrisRegistrant t) {
try { try {
IrisContext ctx = IrisContext.get(); IrisContext ctx = IrisContext.get();
@ -125,7 +140,7 @@ public class IrisData {
} }
public IrisData copy() { public IrisData copy() {
return new IrisData(dataFolder); return IrisData.get(dataFolder);
} }
private <T extends IrisRegistrant> ResourceLoader<T> registerLoader(Class<T> registrant) { private <T extends IrisRegistrant> ResourceLoader<T> registerLoader(Class<T> registrant) {
@ -260,7 +275,7 @@ public class IrisData {
try { try {
for (File i : Objects.requireNonNull(Iris.instance.getDataFolder("packs").listFiles())) { for (File i : Objects.requireNonNull(Iris.instance.getDataFolder("packs").listFiles())) {
if (i.isDirectory()) { if (i.isDirectory()) {
IrisData dm = new IrisData(i, true); IrisData dm = get(i);
T t = v.apply(dm); T t = v.apply(dm);
if (t != null) { if (t != null) {

View File

@ -45,10 +45,10 @@ import java.util.stream.Stream;
@Data @Data
public class ResourceLoader<T extends IrisRegistrant> { public class ResourceLoader<T extends IrisRegistrant> {
public static final AtomicDouble tlt = new AtomicDouble(0); public static final AtomicDouble tlt = new AtomicDouble(0);
private static final int CACHE_SIZE = 100000;
protected File root; protected File root;
protected String folderName; protected String folderName;
protected String resourceTypeName; protected String resourceTypeName;
protected KMap<String, File> folderMapCache;
protected KMap<String, T> loadCache; protected KMap<String, T> loadCache;
protected KList<File> folderCache; protected KList<File> folderCache;
protected Class<? extends T> objectClass; protected Class<? extends T> objectClass;
@ -64,7 +64,6 @@ public class ResourceLoader<T extends IrisRegistrant> {
this.manager = manager; this.manager = manager;
sec = new ChronoLatch(5000); sec = new ChronoLatch(5000);
loads = new AtomicInteger(); loads = new AtomicInteger();
folderMapCache = new KMap<>();
this.objectClass = objectClass; this.objectClass = objectClass;
cname = objectClass.getCanonicalName(); cname = objectClass.getCanonicalName();
this.resourceTypeName = resourceTypeName; this.resourceTypeName = resourceTypeName;

View File

@ -19,6 +19,7 @@
package com.volmit.iris.core.service; package com.volmit.iris.core.service;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.core.project.loader.IrisData;
import com.volmit.iris.core.tools.IrisToolbelt; import com.volmit.iris.core.tools.IrisToolbelt;
import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.framework.Engine;
import com.volmit.iris.engine.object.feature.IrisFeaturePositional; 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 + "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 + "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 + "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) + ")"); 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) + ")");
} }

View 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)
{
}
}
}
}

View File

@ -78,6 +78,7 @@ public class StudioSVC implements IrisService {
for (World i : Bukkit.getWorlds()) { for (World i : Bukkit.getWorlds()) {
if (IrisToolbelt.isIrisWorld(i)) { if (IrisToolbelt.isIrisWorld(i)) {
IrisToolbelt.evacuate(i);
Iris.debug("Closing Platform Generator " + i.getName()); Iris.debug("Closing Platform Generator " + i.getName());
IrisToolbelt.access(i).close(); IrisToolbelt.access(i).close();
} }
@ -142,7 +143,7 @@ public class StudioSVC implements IrisService {
return null; return null;
} }
IrisData dm = new IrisData(irispack); IrisData dm = IrisData.get(irispack);
dim = dm.getDimensionLoader().load(type); dim = dm.getDimensionLoader().load(type);
if (dim == null) { if (dim == null) {

View File

@ -64,7 +64,7 @@ public class IrisToolbelt {
return null; return null;
} }
return new IrisData(pack).getDimensionLoader().load(dimension); return IrisData.get(pack).getDimensionLoader().load(dimension);
} }
/** /**

View File

@ -431,7 +431,7 @@ public class IrisEngine extends BlockPopulator implements Engine {
catch(Throwable e) catch(Throwable e)
{ {
e.printStackTrace(); Iris.reportError(e);
} }
} }

View File

@ -40,7 +40,7 @@ public class EngineProvider {
public void provideEngine(IrisWorld world, String dimension, File dataLocation, boolean studio, Consumer<Engine> post) { public void provideEngine(IrisWorld world, String dimension, File dataLocation, boolean studio, Consumer<Engine> post) {
close(); close();
engine.set(MultiBurst.burst.completeValue(() -> { engine.set(MultiBurst.burst.completeValue(() -> {
IrisData data = new IrisData(dataLocation); IrisData data = IrisData.get(dataLocation);
IrisDimension realDimension = data.getDimensionLoader().load(dimension); IrisDimension realDimension = data.getDimensionLoader().load(dimension);
if (realDimension == null) { if (realDimension == null) {

View File

@ -37,7 +37,7 @@ public class BiomeHandler implements DecreeParameterHandler<IrisBiome> {
//noinspection ConstantConditions //noinspection ConstantConditions
for (File i : Iris.instance.getDataFolder("packs").listFiles()) { for (File i : Iris.instance.getDataFolder("packs").listFiles()) {
if (i.isDirectory()) { if (i.isDirectory()) {
IrisData data = new IrisData(i, true); IrisData data = IrisData.get(i);
for (IrisBiome j : data.getBiomeLoader().loadAll(data.getBiomeLoader().getPossibleKeys())) { for (IrisBiome j : data.getBiomeLoader().loadAll(data.getBiomeLoader().getPossibleKeys())) {
p.putIfAbsent(j.getLoadKey(), j); p.putIfAbsent(j.getLoadKey(), j);
} }

View File

@ -37,7 +37,7 @@ public class DimensionHandler implements DecreeParameterHandler<IrisDimension> {
//noinspection ConstantConditions //noinspection ConstantConditions
for (File i : Iris.instance.getDataFolder("packs").listFiles()) { for (File i : Iris.instance.getDataFolder("packs").listFiles()) {
if (i.isDirectory()) { if (i.isDirectory()) {
IrisData data = new IrisData(i, true); IrisData data = IrisData.get(i);
for (IrisDimension j : data.getDimensionLoader().loadAll(data.getDimensionLoader().getPossibleKeys())) { for (IrisDimension j : data.getDimensionLoader().loadAll(data.getDimensionLoader().getPossibleKeys())) {
p.putIfAbsent(j.getLoadKey(), j); p.putIfAbsent(j.getLoadKey(), j);
} }

View File

@ -43,7 +43,7 @@ public class EntityHandler implements DecreeParameterHandler<IrisEntity> {
//noinspection ConstantConditions //noinspection ConstantConditions
for (File i : Iris.instance.getDataFolder("packs").listFiles()) { for (File i : Iris.instance.getDataFolder("packs").listFiles()) {
if (i.isDirectory()) { if (i.isDirectory()) {
IrisData data = new IrisData(i, true); IrisData data = IrisData.get(i);
for (IrisEntity j : data.getEntityLoader().loadAll(data.getEntityLoader().getPossibleKeys())) { for (IrisEntity j : data.getEntityLoader().loadAll(data.getEntityLoader().getPossibleKeys())) {
p.putIfAbsent(j.getLoadKey(), j); p.putIfAbsent(j.getLoadKey(), j);
} }

View File

@ -37,7 +37,7 @@ public class GeneratorHandler implements DecreeParameterHandler<IrisGenerator> {
//noinspection ConstantConditions //noinspection ConstantConditions
for (File i : Iris.instance.getDataFolder("packs").listFiles()) { for (File i : Iris.instance.getDataFolder("packs").listFiles()) {
if (i.isDirectory()) { if (i.isDirectory()) {
IrisData data = new IrisData(i, true); IrisData data = IrisData.get(i);
for (IrisGenerator j : data.getGeneratorLoader().loadAll(data.getGeneratorLoader().getPossibleKeys())) { for (IrisGenerator j : data.getGeneratorLoader().loadAll(data.getGeneratorLoader().getPossibleKeys())) {
p.putIfAbsent(j.getLoadKey(), j); p.putIfAbsent(j.getLoadKey(), j);
} }

View File

@ -37,7 +37,7 @@ public class RegionHandler implements DecreeParameterHandler<IrisRegion> {
//noinspection ConstantConditions //noinspection ConstantConditions
for (File i : Iris.instance.getDataFolder("packs").listFiles()) { for (File i : Iris.instance.getDataFolder("packs").listFiles()) {
if (i.isDirectory()) { if (i.isDirectory()) {
IrisData data = new IrisData(i, true); IrisData data = IrisData.get(i);
for (IrisRegion j : data.getRegionLoader().loadAll(data.getRegionLoader().getPossibleKeys())) { for (IrisRegion j : data.getRegionLoader().loadAll(data.getRegionLoader().getPossibleKeys())) {
p.putIfAbsent(j.getLoadKey(), j); p.putIfAbsent(j.getLoadKey(), j);
} }

View File

@ -37,7 +37,7 @@ public class ScriptHandler implements DecreeParameterHandler<IrisScript> {
//noinspection ConstantConditions //noinspection ConstantConditions
for (File i : Iris.instance.getDataFolder("packs").listFiles()) { for (File i : Iris.instance.getDataFolder("packs").listFiles()) {
if (i.isDirectory()) { if (i.isDirectory()) {
IrisData data = new IrisData(i, true); IrisData data = IrisData.get(i);
for (IrisScript j : data.getScriptLoader().loadAll(data.getScriptLoader().getPossibleKeys())) { for (IrisScript j : data.getScriptLoader().loadAll(data.getScriptLoader().getPossibleKeys())) {
p.putIfAbsent(j.getLoadKey(), j); p.putIfAbsent(j.getLoadKey(), j);
} }

View File

@ -20,6 +20,7 @@ package com.volmit.iris.util.parallel;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisSettings; 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.io.InstanceState;
import com.volmit.iris.util.math.M; import com.volmit.iris.util.math.M;
import com.volmit.iris.util.scheduling.J; import com.volmit.iris.util.scheduling.J;
@ -70,6 +71,7 @@ public class MultiBurst {
}; };
heartbeat.setName(name + " Monitor"); heartbeat.setName(name + " Monitor");
heartbeat.start(); heartbeat.start();
Iris.service(ExecutionSVC.class).register(this);
} }
private synchronized ExecutorService getService() { private synchronized ExecutorService getService() {
@ -88,6 +90,7 @@ public class MultiBurst {
return t; return t;
}); });
Iris.service(ExecutionSVC.class).register(service);
Iris.debug("Started MultiBurst Pool " + name + " with " + tc + " threads at " + priority + " priority."); Iris.debug("Started MultiBurst Pool " + name + " with " + tc + " threads at " + priority + " priority.");
} }

View File

@ -19,10 +19,14 @@
package com.volmit.iris.util.scheduling; package com.volmit.iris.util.scheduling;
import com.volmit.iris.Iris; import com.volmit.iris.Iris;
import com.volmit.iris.core.service.ExecutionSVC;
import java.util.concurrent.ExecutorService;
public abstract class Looper extends Thread { public abstract class Looper extends Thread {
@SuppressWarnings("BusyWait") @SuppressWarnings("BusyWait")
public void run() { public void run() {
Iris.service(ExecutionSVC.class).register(this);
while (!interrupted()) { while (!interrupted()) {
try { try {
long m = loop(); long m = loop();