From af0d282a1f25f6fa5c5829fa8b25b3c4813ebe69 Mon Sep 17 00:00:00 2001 From: DanMB Date: Tue, 19 Apr 2022 17:05:16 -0400 Subject: [PATCH] Matter loaders --- .../com/volmit/iris/core/loader/IrisData.java | 29 ++-- .../loader/MatterObjectResourceLoader.java | 147 ++++++++++++++++++ .../iris/engine/object/IrisMatterObject.java | 57 +++++++ .../engine/object/IrisMatterPlacement.java | 13 +- 4 files changed, 222 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/volmit/iris/core/loader/MatterObjectResourceLoader.java create mode 100644 src/main/java/com/volmit/iris/engine/object/IrisMatterObject.java diff --git a/src/main/java/com/volmit/iris/core/loader/IrisData.java b/src/main/java/com/volmit/iris/core/loader/IrisData.java index 415289444..f610033f7 100644 --- a/src/main/java/com/volmit/iris/core/loader/IrisData.java +++ b/src/main/java/com/volmit/iris/core/loader/IrisData.java @@ -31,25 +31,7 @@ import com.google.gson.stream.JsonWriter; import com.volmit.iris.Iris; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.Engine; -import com.volmit.iris.engine.object.IrisBiome; -import com.volmit.iris.engine.object.IrisBlockData; -import com.volmit.iris.engine.object.IrisCave; -import com.volmit.iris.engine.object.IrisDimension; -import com.volmit.iris.engine.object.IrisEntity; -import com.volmit.iris.engine.object.IrisExpression; -import com.volmit.iris.engine.object.IrisGenerator; -import com.volmit.iris.engine.object.IrisImage; -import com.volmit.iris.engine.object.IrisJigsawPiece; -import com.volmit.iris.engine.object.IrisJigsawPool; -import com.volmit.iris.engine.object.IrisJigsawStructure; -import com.volmit.iris.engine.object.IrisLootTable; -import com.volmit.iris.engine.object.IrisMarker; -import com.volmit.iris.engine.object.IrisMod; -import com.volmit.iris.engine.object.IrisObject; -import com.volmit.iris.engine.object.IrisRavine; -import com.volmit.iris.engine.object.IrisRegion; -import com.volmit.iris.engine.object.IrisScript; -import com.volmit.iris.engine.object.IrisSpawner; +import com.volmit.iris.engine.object.*; import com.volmit.iris.engine.object.annotations.Snippet; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; @@ -87,6 +69,7 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { private ResourceLoader blockLoader; private ResourceLoader expressionLoader; private ResourceLoader objectLoader; + private ResourceLoader matterLoader; private ResourceLoader imageLoader; private ResourceLoader scriptLoader; private ResourceLoader caveLoader; @@ -131,6 +114,9 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { public static IrisObject loadAnyObject(String key) { return loadAny(key, (dm) -> dm.getObjectLoader().load(key, false)); } + public static IrisMatterObject loadAnyMatter(String key) { + return loadAny(key, (dm) -> dm.getMatterLoader().load(key, false)); + } public static IrisBiome loadAnyBiome(String key) { return loadAny(key, (dm) -> dm.getBiomeLoader().load(key, false)); @@ -295,9 +281,12 @@ public class IrisData implements ExclusionStrategy, TypeAdapterFactory { if(registrant.equals(IrisObject.class)) { r = (ResourceLoader) new ObjectResourceLoader(dataFolder, this, rr.getFolderName(), rr.getTypeName()); + } else if(registrant.equals(IrisMatterObject.class)) { + r = (ResourceLoader) new MatterObjectResourceLoader(dataFolder, this, rr.getFolderName(), + rr.getTypeName()); } else if(registrant.equals(IrisScript.class)) { r = (ResourceLoader) new ScriptResourceLoader(dataFolder, this, rr.getFolderName(), - rr.getTypeName()); + rr.getTypeName()); } else if(registrant.equals(IrisImage.class)) { r = (ResourceLoader) new ImageResourceLoader(dataFolder, this, rr.getFolderName(), rr.getTypeName()); diff --git a/src/main/java/com/volmit/iris/core/loader/MatterObjectResourceLoader.java b/src/main/java/com/volmit/iris/core/loader/MatterObjectResourceLoader.java new file mode 100644 index 000000000..d828f723e --- /dev/null +++ b/src/main/java/com/volmit/iris/core/loader/MatterObjectResourceLoader.java @@ -0,0 +1,147 @@ +/* + * Iris is a World Generator for Minecraft Bukkit Servers + * Copyright (c) 2022 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 . + */ + +package com.volmit.iris.core.loader; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.IrisSettings; +import com.volmit.iris.engine.object.IrisMatterObject; +import com.volmit.iris.engine.object.IrisObject; +import com.volmit.iris.util.collection.KList; +import com.volmit.iris.util.collection.KSet; +import com.volmit.iris.util.data.KCache; +import com.volmit.iris.util.scheduling.PrecisionStopwatch; + +import java.io.File; + +public class MatterObjectResourceLoader extends ResourceLoader { + public MatterObjectResourceLoader(File root, IrisData idm, String folderName, String resourceTypeName) { + super(root, idm, folderName, resourceTypeName, IrisMatterObject.class); + loadCache = new KCache<>(this::loadRaw, IrisSettings.get().getPerformance().getObjectLoaderCacheSize()); + } + + public boolean supportsSchemas() { + return false; + } + + public long getSize() { + return loadCache.getSize(); + } + + public long getTotalStorage() { + return getSize(); + } + + protected IrisMatterObject loadFile(File j, String name) { + try { + PrecisionStopwatch p = PrecisionStopwatch.start(); + IrisMatterObject t = IrisMatterObject.from(j); + t.setLoadKey(name); + t.setLoader(manager); + t.setLoadFile(j); + logLoad(j, t); + tlt.addAndGet(p.getMilliseconds()); + return t; + } catch(Throwable e) { + Iris.reportError(e); + Iris.warn("Couldn't read " + resourceTypeName + " file: " + j.getPath() + ": " + e.getMessage()); + return null; + } + } + + public String[] getPossibleKeys() { + if(possibleKeys != null) { + return possibleKeys; + } + + Iris.debug("Building " + resourceTypeName + " Possibility Lists"); + KSet m = new KSet<>(); + + for(File i : getFolders()) { + for(File j : i.listFiles()) { + if(j.isFile() && j.getName().endsWith(".mat")) { + m.add(j.getName().replaceAll("\\Q.mat\\E", "")); + } else if(j.isDirectory()) { + for(File k : j.listFiles()) { + if(k.isFile() && k.getName().endsWith(".mat")) { + m.add(j.getName() + "/" + k.getName().replaceAll("\\Q.mat\\E", "")); + } else if(k.isDirectory()) { + for(File l : k.listFiles()) { + if(l.isFile() && l.getName().endsWith(".mat")) { + m.add(j.getName() + "/" + k.getName() + "/" + l.getName().replaceAll("\\Q.mat\\E", "")); + } + } + } + } + } + } + } + + KList v = new KList<>(m); + possibleKeys = v.toArray(new String[0]); + return possibleKeys; + } + + public File findFile(String name) { + for(File i : getFolders(name)) { + for(File j : i.listFiles()) { + if(j.isFile() && j.getName().endsWith(".mat") && j.getName().split("\\Q.\\E")[0].equals(name)) { + return j; + } + } + + File file = new File(i, name + ".mat"); + + if(file.exists()) { + return file; + } + } + + Iris.warn("Couldn't find " + resourceTypeName + ": " + name); + + return null; + } + + public IrisMatterObject load(String name) { + return load(name, true); + } + + private IrisMatterObject loadRaw(String name) { + for(File i : getFolders(name)) { + for(File j : i.listFiles()) { + if(j.isFile() && j.getName().endsWith(".mat") && j.getName().split("\\Q.\\E")[0].equals(name)) { + return loadFile(j, name); + } + } + + File file = new File(i, name + ".mat"); + + if(file.exists()) { + return loadFile(file, name); + } + } + + Iris.warn("Couldn't find " + resourceTypeName + ": " + name); + + return null; + } + + public IrisMatterObject load(String name, boolean warn) { + return loadCache.get(name); + } +} diff --git a/src/main/java/com/volmit/iris/engine/object/IrisMatterObject.java b/src/main/java/com/volmit/iris/engine/object/IrisMatterObject.java new file mode 100644 index 000000000..3d5186ff2 --- /dev/null +++ b/src/main/java/com/volmit/iris/engine/object/IrisMatterObject.java @@ -0,0 +1,57 @@ +package com.volmit.iris.engine.object; + +import com.volmit.iris.core.loader.IrisData; +import com.volmit.iris.core.loader.IrisRegistrant; +import com.volmit.iris.util.json.JSONObject; +import com.volmit.iris.util.matter.IrisMatter; +import com.volmit.iris.util.matter.Matter; +import com.volmit.iris.util.plugin.VolmitSender; +import jdk.jfr.DataAmount; +import lombok.Data; + +import java.io.File; +import java.io.IOException; + +@Data +public class IrisMatterObject extends IrisRegistrant { + private final Matter matter; + + public IrisMatterObject() + { + this(1,1,1); + } + + public IrisMatterObject(int w, int h, int d) + { + this(new IrisMatter(w,h,d)); + } + + public IrisMatterObject(Matter matter) + { + this.matter = matter; + } + + public static IrisMatterObject from(IrisObject object) + { + return new IrisMatterObject(Matter.from(object)); + } + + public static IrisMatterObject from(File j) throws IOException, ClassNotFoundException { + return new IrisMatterObject(Matter.read(j)); + } + + @Override + public String getFolderName() { + return "matter"; + } + + @Override + public String getTypeName() { + return "Matter"; + } + + @Override + public void scanForErrors(JSONObject p, VolmitSender sender) { + + } +} diff --git a/src/main/java/com/volmit/iris/engine/object/IrisMatterPlacement.java b/src/main/java/com/volmit/iris/engine/object/IrisMatterPlacement.java index e78826da3..4641b2efc 100644 --- a/src/main/java/com/volmit/iris/engine/object/IrisMatterPlacement.java +++ b/src/main/java/com/volmit/iris/engine/object/IrisMatterPlacement.java @@ -18,8 +18,9 @@ package com.volmit.iris.engine.object; -import com.volmit.iris.engine.object.annotations.Desc; -import com.volmit.iris.engine.object.annotations.Snippet; +import com.volmit.iris.core.loader.ObjectResourceLoader; +import com.volmit.iris.engine.object.annotations.*; +import com.volmit.iris.util.collection.KList; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; @@ -29,8 +30,12 @@ import lombok.experimental.Accessors; @EqualsAndHashCode() @Accessors(chain = true) @NoArgsConstructor -@Desc("Represents an iris object placer. It places objects.") +@Desc("Represents an iris object placer. It places matter objects.") @Data public class IrisMatterPlacement { - + @RegistryListResource(IrisMatterObject.class) + @Required + @ArrayType(min = 1, type = String.class) + @Desc("List of objects to place") + private KList place = new KList<>(); }