From 1634454700a0cbfeba4df24e2f9fe5acecfecc9d Mon Sep 17 00:00:00 2001 From: DanMB Date: Thu, 7 Jul 2022 13:08:14 -0700 Subject: [PATCH] Resolvers --- build.gradle | 1 + .../java/com/volmit/iris/engine/Engine.java | 4 +- .../com/volmit/iris/engine/EngineData.java | 80 +++++++++++++++++++ .../com/volmit/iris/engine/EngineEditor.java | 49 ------------ .../iris/engine/dimension/IrisAuthor.java | 5 +- .../iris/engine/dimension/IrisBiome.java | 9 +-- .../iris/engine/dimension/IrisChance.java | 5 +- .../iris/engine/dimension/IrisDecorator.java | 9 +-- .../iris/engine/dimension/IrisDimension.java | 5 +- .../engine/dimension/IrisDimensionMeta.java | 5 +- .../iris/engine/dimension/IrisGenerator.java | 5 +- .../iris/engine/dimension/IrisPalette.java | 6 +- .../iris/engine/dimension/IrisRange.java | 5 +- .../iris/engine/dimension/IrisResolvable.java | 15 ---- .../iris/engine/dimension/IrisSeed.java | 5 +- .../iris/engine/dimension/IrisSurface.java | 14 +--- .../engine/dimension/IrisSurfaceLayer.java | 8 +- .../engine/editor/pak/PakInputStream.java | 62 -------------- .../iris/engine/editor/pak/PakMetadata.java | 22 ----- .../engine/editor/pak/PakOutputStream.java | 57 ------------- .../engine/editor/pak/PakResourceInput.java | 51 ------------ .../editor/pak/PakResourceMetadata.java | 22 ----- .../iris/engine/editor/pak/PakWriter.java | 63 --------------- .../resolver/CompositeResolver.java | 3 +- .../engine/resolver/EngineResolvable.java | 9 +++ .../{editor => }/resolver/FrozenResolver.java | 3 +- .../{editor => }/resolver/HotResolver.java | 3 +- .../iris/engine/resolver/MergedResolver.java | 60 ++++++++++++++ .../{editor => resolver}/Resolvable.java | 6 +- .../{editor => }/resolver/Resolver.java | 33 +++++++- .../iris/platform/PlatformNamespaceKey.java | 7 ++ .../platform/PlatformNamespacedMutable.java | 5 ++ .../volmit/iris/platform/PlatformWorld.java | 4 + 33 files changed, 241 insertions(+), 399 deletions(-) create mode 100644 engine/src/main/java/com/volmit/iris/engine/EngineData.java delete mode 100644 engine/src/main/java/com/volmit/iris/engine/EngineEditor.java delete mode 100644 engine/src/main/java/com/volmit/iris/engine/dimension/IrisResolvable.java delete mode 100644 engine/src/main/java/com/volmit/iris/engine/editor/pak/PakInputStream.java delete mode 100644 engine/src/main/java/com/volmit/iris/engine/editor/pak/PakMetadata.java delete mode 100644 engine/src/main/java/com/volmit/iris/engine/editor/pak/PakOutputStream.java delete mode 100644 engine/src/main/java/com/volmit/iris/engine/editor/pak/PakResourceInput.java delete mode 100644 engine/src/main/java/com/volmit/iris/engine/editor/pak/PakResourceMetadata.java delete mode 100644 engine/src/main/java/com/volmit/iris/engine/editor/pak/PakWriter.java rename engine/src/main/java/com/volmit/iris/engine/{editor => }/resolver/CompositeResolver.java (90%) create mode 100644 engine/src/main/java/com/volmit/iris/engine/resolver/EngineResolvable.java rename engine/src/main/java/com/volmit/iris/engine/{editor => }/resolver/FrozenResolver.java (88%) rename engine/src/main/java/com/volmit/iris/engine/{editor => }/resolver/HotResolver.java (94%) create mode 100644 engine/src/main/java/com/volmit/iris/engine/resolver/MergedResolver.java rename engine/src/main/java/com/volmit/iris/engine/{editor => resolver}/Resolvable.java (91%) rename engine/src/main/java/com/volmit/iris/engine/{editor => }/resolver/Resolver.java (65%) create mode 100644 engine/src/main/java/com/volmit/iris/platform/PlatformNamespacedMutable.java diff --git a/build.gradle b/build.gradle index e62c113c7..81126ff2a 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,7 @@ allprojects { annotationProcessor 'org.projectlombok:lombok:1.18.24' annotationProcessor 'systems.manifold:manifold-ext:2022.1.18' implementation 'art.arcane:Source:22.7.2' + implementation 'art.arcane:Cram:22.7.3' implementation 'art.arcane:Amulet:22.7.13' implementation 'com.google.code.gson:gson:2.9.0' implementation 'com.github.ben-manes.caffeine:caffeine:3.1.1' diff --git a/engine/src/main/java/com/volmit/iris/engine/Engine.java b/engine/src/main/java/com/volmit/iris/engine/Engine.java index 0c8f737fd..8387f20be 100644 --- a/engine/src/main/java/com/volmit/iris/engine/Engine.java +++ b/engine/src/main/java/com/volmit/iris/engine/Engine.java @@ -31,7 +31,7 @@ public class Engine implements Closeable { private final EngineExecutor executor; private final EnginePlumbing plumbing; private final EngineSeedManager seedManager; - private final EngineEditor editor; + private final EngineData data; public Engine(IrisPlatform platform, PlatformWorld world, EngineConfiguration configuration) { PrecisionStopwatch p = PrecisionStopwatch.start(); @@ -41,7 +41,7 @@ public class Engine implements Closeable { i("Initializing Iris Engine for " + platform.getPlatformName() + " in " + world.getName() + " with " + configuration.getThreads() + " priority " + configuration.getThreadPriority() + " threads in " + (configuration.isMutable() ? "edit mode" : "production mode")); - this.editor = configuration.isMutable() ? new EngineEditor(this) : null; + this.data = new EngineData(this); this.seedManager = getSeedManager(); this.blockCache = new EngineBlockCache(this); this.registry = EngineRegistry.builder() diff --git a/engine/src/main/java/com/volmit/iris/engine/EngineData.java b/engine/src/main/java/com/volmit/iris/engine/EngineData.java new file mode 100644 index 000000000..94194201d --- /dev/null +++ b/engine/src/main/java/com/volmit/iris/engine/EngineData.java @@ -0,0 +1,80 @@ +package com.volmit.iris.engine; + +import art.arcane.amulet.concurrent.J; +import art.arcane.amulet.io.JarLoader; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.TypeAdapterFactory; +import com.volmit.iris.engine.resolver.*; +import lombok.Data; + +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@Data +public class EngineData { + private final Engine engine; + private final Gson gson; + private List resolvableTypes; + private final Map, Resolver> resolvers; + + public EngineData(Engine engine) + { + this.engine = engine; + this.resolvers = new HashMap<>(); + this.resolvableTypes = J.attempt(() -> new JarLoader(getClass()).all().parallel() + .filter(Objects::nonNull) + .filter(i -> !i.isInterface() && !i.isEnum()) + .filter(i -> i.isAssignableFrom(Resolvable.class) || Resolvable.class.isAssignableFrom(i)) + .filter(i -> !i.equals(EngineResolvable.class)) + .map(i -> J.attempt(() -> (Resolvable) i.getDeclaredConstructor().newInstance(), null)).toList(), List.of()); + GsonBuilder gsonBuilder = new GsonBuilder(); + resolvableTypes.forEach(i -> i.apply(gsonBuilder)); + this.gson = gsonBuilder.setPrettyPrinting().create(); + i("Registered " + resolvableTypes.size() + " Mutators with " + resolvableTypes.stream().filter(i -> i instanceof TypeAdapterFactory).count() + " Type Adapter Factories"); + } + + public void registerResolver(Class type, Resolver resolver, String... namespaces) + { + if(resolvers.containsKey(type)) { + Resolver existing = (Resolver) resolvers.get(type); + + if(existing instanceof CompositeResolver c) { + Map> oresolvers = c.getResolvers(); + + if(namespaces.length > 1) { + CompositeResolver n = (CompositeResolver) resolver; + + for(String i : n.getResolvers().keySet()) { + if(oresolvers.containsKey(i)) { + oresolvers.put(i, new MergedResolver<>(oresolvers.get(i), n.getResolvers().get(i))); + } + + else + { + oresolvers.put(i, n.getResolvers().get(i)); + } + } + } + + else + { + + } + } + } + + else + { + resolvers.put(type, resolver); + } + } + + public void loadData(File folder) + { + + } +} diff --git a/engine/src/main/java/com/volmit/iris/engine/EngineEditor.java b/engine/src/main/java/com/volmit/iris/engine/EngineEditor.java deleted file mode 100644 index 8cb118ef8..000000000 --- a/engine/src/main/java/com/volmit/iris/engine/EngineEditor.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.volmit.iris.engine; - -import art.arcane.amulet.concurrent.J; -import art.arcane.amulet.io.JarLoader; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; -import com.google.gson.TypeAdapterFactory; -import com.volmit.iris.engine.dimension.IrisAuthor; -import com.volmit.iris.engine.dimension.IrisBiome; -import com.volmit.iris.engine.dimension.IrisChance; -import com.volmit.iris.engine.dimension.IrisDecorator; -import com.volmit.iris.engine.dimension.IrisDimension; -import com.volmit.iris.engine.dimension.IrisDimensionMeta; -import com.volmit.iris.engine.dimension.IrisGenerator; -import com.volmit.iris.engine.dimension.IrisPalette; -import com.volmit.iris.engine.dimension.IrisRange; -import com.volmit.iris.engine.dimension.IrisResolvable; -import com.volmit.iris.engine.dimension.IrisSeed; -import com.volmit.iris.engine.dimension.IrisSeedSetMode; -import com.volmit.iris.engine.dimension.IrisSurface; -import com.volmit.iris.engine.dimension.IrisSurfaceLayer; -import com.volmit.iris.engine.editor.Resolvable; -import lombok.Data; - -import java.util.List; -import java.util.Map; -import java.util.Objects; - -@Data -public class EngineEditor { - private final Engine engine; - private final Gson gson; - private List resolvableTypes; - - public EngineEditor(Engine engine) - { - this.engine = engine; - this.resolvableTypes = J.attempt(() -> new JarLoader(getClass()).all().parallel() - .filter(Objects::nonNull) - .filter(i -> !i.isInterface() && !i.isEnum()) - .filter(i -> i.isAssignableFrom(Resolvable.class) || Resolvable.class.isAssignableFrom(i)) - .filter(i -> !i.equals(IrisResolvable.class)) - .map(i -> J.attempt(() -> (Resolvable) i.getDeclaredConstructor().newInstance(), null)).toList(), List.of()); - GsonBuilder gsonBuilder = new GsonBuilder(); - resolvableTypes.forEach(i -> i.apply(gsonBuilder)); - this.gson = gsonBuilder.setPrettyPrinting().create(); - i("Registered " + resolvableTypes.size() + " Mutators with " + resolvableTypes.stream().filter(i -> i instanceof TypeAdapterFactory).count() + " Type Adapter Factories"); - } -} diff --git a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisAuthor.java b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisAuthor.java index 219f13081..5877c9c48 100644 --- a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisAuthor.java +++ b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisAuthor.java @@ -1,6 +1,7 @@ package com.volmit.iris.engine.dimension; -import com.volmit.iris.engine.editor.Resolvable; +import com.volmit.iris.engine.resolver.EngineResolvable; +import com.volmit.iris.engine.resolver.Resolvable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -17,7 +18,7 @@ import java.util.Map; @EqualsAndHashCode(callSuper=false) @Accessors(fluent = true, chain = true) @Resolvable.Entity(id = "author") -public class IrisAuthor extends IrisResolvable +public class IrisAuthor extends EngineResolvable { private String name; private Map social; diff --git a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisBiome.java b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisBiome.java index 72980f83a..2303b3479 100644 --- a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisBiome.java +++ b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisBiome.java @@ -1,7 +1,7 @@ package com.volmit.iris.engine.dimension; -import com.google.gson.stream.JsonToken; -import com.volmit.iris.engine.editor.Resolvable; +import com.volmit.iris.engine.resolver.EngineResolvable; +import com.volmit.iris.engine.resolver.Resolvable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -9,9 +9,6 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; -import java.util.ArrayList; -import java.util.List; - @Builder @Data @AllArgsConstructor @@ -19,7 +16,7 @@ import java.util.List; @EqualsAndHashCode(callSuper=false) @Accessors(fluent = true, chain = true) @Resolvable.Entity(id = "biome") -public class IrisBiome extends IrisResolvable { +public class IrisBiome extends EngineResolvable { private String name; @Builder.Default diff --git a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisChance.java b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisChance.java index 0724d7e46..f1db4cd7e 100644 --- a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisChance.java +++ b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisChance.java @@ -7,7 +7,8 @@ import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; -import com.volmit.iris.engine.editor.Resolvable; +import com.volmit.iris.engine.resolver.EngineResolvable; +import com.volmit.iris.engine.resolver.Resolvable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -24,7 +25,7 @@ import java.io.IOException; @EqualsAndHashCode(callSuper=false) @Accessors(fluent = true, chain = true) @Resolvable.Entity(id = "chance", jsonTypes = {JsonToken.STRING, JsonToken.BEGIN_OBJECT}) -public class IrisChance extends IrisResolvable implements TypeAdapterFactory { +public class IrisChance extends EngineResolvable implements TypeAdapterFactory { @Builder.Default @TokenConstructor(JsonToken.NUMBER) private double threshold = 0.5; diff --git a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisDecorator.java b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisDecorator.java index d9924e9d5..ef37c8153 100644 --- a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisDecorator.java +++ b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisDecorator.java @@ -1,17 +1,14 @@ package com.volmit.iris.engine.dimension; -import com.volmit.iris.engine.editor.Resolvable; +import com.volmit.iris.engine.resolver.EngineResolvable; +import com.volmit.iris.engine.resolver.Resolvable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; -import lombok.Singular; import lombok.experimental.Accessors; -import java.util.ArrayList; -import java.util.List; - @Builder @Data @AllArgsConstructor @@ -19,7 +16,7 @@ import java.util.List; @EqualsAndHashCode(callSuper=false) @Accessors(fluent = true, chain = true) @Resolvable.Entity(id = "decorator") -public class IrisDecorator extends IrisResolvable { +public class IrisDecorator extends EngineResolvable { @Builder.Default private IrisPalette palette = IrisPalette.flat("minecraft:grass"); diff --git a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisDimension.java b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisDimension.java index b948501d3..210dc81c7 100644 --- a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisDimension.java +++ b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisDimension.java @@ -1,6 +1,7 @@ package com.volmit.iris.engine.dimension; -import com.volmit.iris.engine.editor.Resolvable; +import com.volmit.iris.engine.resolver.EngineResolvable; +import com.volmit.iris.engine.resolver.Resolvable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -19,7 +20,7 @@ import java.util.List; @EqualsAndHashCode(callSuper=false) @Accessors(fluent = true, chain = true) @Resolvable.Entity(id = "dimension") -public class IrisDimension extends IrisResolvable { +public class IrisDimension extends EngineResolvable { @Builder.Default private IrisDimensionMeta meta = new IrisDimensionMeta(); diff --git a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisDimensionMeta.java b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisDimensionMeta.java index 9848dce98..6ebe6bf2d 100644 --- a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisDimensionMeta.java +++ b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisDimensionMeta.java @@ -1,6 +1,7 @@ package com.volmit.iris.engine.dimension; -import com.volmit.iris.engine.editor.Resolvable; +import com.volmit.iris.engine.resolver.EngineResolvable; +import com.volmit.iris.engine.resolver.Resolvable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -19,7 +20,7 @@ import java.util.List; @EqualsAndHashCode(callSuper=false) @Accessors(fluent = true, chain = true) @Resolvable.Entity(id = "dimension-meta") -public class IrisDimensionMeta extends IrisResolvable +public class IrisDimensionMeta extends EngineResolvable { private String name; private String description; diff --git a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisGenerator.java b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisGenerator.java index ae9e187e7..2b33895e0 100644 --- a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisGenerator.java +++ b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisGenerator.java @@ -10,7 +10,8 @@ import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; -import com.volmit.iris.engine.editor.Resolvable; +import com.volmit.iris.engine.resolver.EngineResolvable; +import com.volmit.iris.engine.resolver.Resolvable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -28,7 +29,7 @@ import java.io.IOException; @EqualsAndHashCode(callSuper=false) @Accessors(fluent = true, chain = true) @Resolvable.Entity(id = "generator", jsonTypes = {JsonToken.STRING, JsonToken.BEGIN_OBJECT}) -public class IrisGenerator extends IrisResolvable implements TypeAdapterFactory { +public class IrisGenerator extends EngineResolvable implements TypeAdapterFactory { public static final IrisGenerator NATURAL = IrisGenerator.builder().java("art.arcane.source.api.util.NoisePreset.NATURAL.create(seed)").build(); public static final IrisGenerator WHITE = IrisGenerator.builder().java("Noise.white(seed)").build(); public static final IrisGenerator FLAT = IrisGenerator.builder().java("Noise.flat(seed)").build(); diff --git a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisPalette.java b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisPalette.java index 21905cfe7..ca540c5e3 100644 --- a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisPalette.java +++ b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisPalette.java @@ -7,7 +7,8 @@ import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; -import com.volmit.iris.engine.editor.Resolvable; +import com.volmit.iris.engine.resolver.EngineResolvable; +import com.volmit.iris.engine.resolver.Resolvable; import com.volmit.iris.platform.PlatformBlock; import lombok.AllArgsConstructor; import lombok.Builder; @@ -15,7 +16,6 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.Singular; -import lombok.ToString; import lombok.experimental.Accessors; import java.io.IOException; @@ -29,7 +29,7 @@ import java.util.List; @EqualsAndHashCode(callSuper=false) @Accessors(fluent = true, chain = true) @Resolvable.Entity(id = "palette") -public class IrisPalette extends IrisResolvable implements TypeAdapterFactory { +public class IrisPalette extends EngineResolvable implements TypeAdapterFactory { @Singular @PlatformType(PlatformBlock.class) @TokenConstructor(JsonToken.STRING) diff --git a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisRange.java b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisRange.java index bc7b5c313..d197d2e4c 100644 --- a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisRange.java +++ b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisRange.java @@ -7,7 +7,8 @@ import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; -import com.volmit.iris.engine.editor.Resolvable; +import com.volmit.iris.engine.resolver.EngineResolvable; +import com.volmit.iris.engine.resolver.Resolvable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -24,7 +25,7 @@ import java.io.IOException; @EqualsAndHashCode(callSuper=false) @Accessors(fluent = true, chain = true) @Resolvable.Entity(id = "range", jsonTypes = {JsonToken.NUMBER, JsonToken.BEGIN_OBJECT}) -public class IrisRange extends IrisResolvable implements TypeAdapterFactory { +public class IrisRange extends EngineResolvable implements TypeAdapterFactory { @Builder.Default @TokenConstructor(JsonToken.NUMBER) private double max = 1; diff --git a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisResolvable.java b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisResolvable.java deleted file mode 100644 index 8806c4fb7..000000000 --- a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisResolvable.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.volmit.iris.engine.dimension; - -import com.volmit.iris.engine.editor.Resolvable; -import com.volmit.iris.platform.PlatformNamespaceKey; -import lombok.Data; - -@Data -public class IrisResolvable implements Resolvable { - private PlatformNamespaceKey key; - - @Override - public PlatformNamespaceKey getKey() { - return null; - } -} diff --git a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisSeed.java b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisSeed.java index 00c179122..3c8c88bb2 100644 --- a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisSeed.java +++ b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisSeed.java @@ -8,7 +8,8 @@ import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; import com.volmit.iris.engine.Engine; -import com.volmit.iris.engine.editor.Resolvable; +import com.volmit.iris.engine.resolver.EngineResolvable; +import com.volmit.iris.engine.resolver.Resolvable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -25,7 +26,7 @@ import java.io.IOException; @EqualsAndHashCode(callSuper=false) @Accessors(fluent = true, chain = true) @Resolvable.Entity(id = "seed", jsonTypes = {JsonToken.NUMBER, JsonToken.STRING, JsonToken.BEGIN_OBJECT}) -public class IrisSeed extends IrisResolvable implements TypeAdapterFactory { +public class IrisSeed extends EngineResolvable implements TypeAdapterFactory { @Builder.Default private IrisSeedSetMode mode = IrisSeedSetMode.LOCAL_OFFSET; diff --git a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisSurface.java b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisSurface.java index 2e6646f7f..9045f0fa1 100644 --- a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisSurface.java +++ b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisSurface.java @@ -1,14 +1,7 @@ package com.volmit.iris.engine.dimension; -import com.google.gson.Gson; -import com.google.gson.TypeAdapter; -import com.google.gson.TypeAdapterFactory; -import com.google.gson.reflect.TypeToken; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonToken; -import com.google.gson.stream.JsonWriter; -import com.volmit.iris.engine.editor.Resolvable; -import com.volmit.iris.platform.PlatformBlock; +import com.volmit.iris.engine.resolver.EngineResolvable; +import com.volmit.iris.engine.resolver.Resolvable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -17,7 +10,6 @@ import lombok.NoArgsConstructor; import lombok.Singular; import lombok.experimental.Accessors; -import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -28,7 +20,7 @@ import java.util.List; @EqualsAndHashCode(callSuper=false) @Accessors(fluent = true, chain = true) @Resolvable.Entity(id = "surface-layer") -public class IrisSurface extends IrisResolvable { +public class IrisSurface extends EngineResolvable { @Singular @Type(IrisSurfaceLayer.class) private List layers = new ArrayList<>(); diff --git a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisSurfaceLayer.java b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisSurfaceLayer.java index 59df1938e..1cfc7dc91 100644 --- a/engine/src/main/java/com/volmit/iris/engine/dimension/IrisSurfaceLayer.java +++ b/engine/src/main/java/com/volmit/iris/engine/dimension/IrisSurfaceLayer.java @@ -1,7 +1,7 @@ package com.volmit.iris.engine.dimension; -import com.google.gson.stream.JsonToken; -import com.volmit.iris.engine.editor.Resolvable; +import com.volmit.iris.engine.resolver.EngineResolvable; +import com.volmit.iris.engine.resolver.Resolvable; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -9,8 +9,6 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; -import java.util.List; - @Builder @Data @AllArgsConstructor @@ -18,7 +16,7 @@ import java.util.List; @EqualsAndHashCode(callSuper=false) @Accessors(fluent = true, chain = true) @Resolvable.Entity(id = "surface-layer") -public class IrisSurfaceLayer extends IrisResolvable { +public class IrisSurfaceLayer extends EngineResolvable { @Builder.Default private IrisPalette palette = IrisPalette.flat("minecraft:stone"); diff --git a/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakInputStream.java b/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakInputStream.java deleted file mode 100644 index 8575b478f..000000000 --- a/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakInputStream.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.volmit.iris.engine.editor.pak; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; - -public class PakInputStream extends InputStream { - private final File folder; - private final String name; - private final int pakSize; - private int read; - private int currentPakNumber; - private InputStream currentPakStream; - - public PakInputStream(File folder, String name, int pakSize) throws IOException { - this.pakSize = pakSize; - this.folder = folder; - this.name = name; - this.read = 0; - this.currentPakNumber = 0; - this.currentPakStream = readPakFile(currentPakNumber); - } - - private InputStream readPakFile(int number) throws IOException { - File f = new File(folder, name + number + ".pak"); - - if(!f.exists()) { - return null; - } - - return new FileInputStream(f); - } - - @Override - public int read() throws IOException { - if(currentPakStream == null) { - return -1; - } - - if(read++ == pakSize) { - currentPakStream.close(); - currentPakStream = readPakFile(++currentPakNumber); - - if(currentPakStream == null) - { - return -1; - } - - read = 1; - } - - return currentPakStream.read(); - } - - public void close() throws IOException { - if(currentPakStream != null) { - currentPakStream.close(); - } - } -} diff --git a/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakMetadata.java b/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakMetadata.java deleted file mode 100644 index 25dd8fbc6..000000000 --- a/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakMetadata.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.volmit.iris.engine.editor.pak; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.Singular; -import lombok.experimental.Accessors; - -import java.util.List; - -@NoArgsConstructor -@Data -@AllArgsConstructor -@Builder -@Accessors(chain = true, fluent = true) -public class PakMetadata { - private String namespace; - @Singular - private List resources; - private long pakSize; -} diff --git a/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakOutputStream.java b/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakOutputStream.java deleted file mode 100644 index b42560278..000000000 --- a/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakOutputStream.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.volmit.iris.engine.editor.pak; - -import lombok.Getter; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; - -public class PakOutputStream extends OutputStream { - @Getter - private final File folder; - @Getter - private final String name; - private OutputStream currentPakOutput; - private int currentPakNumber; - @Getter - private final long pakSize; - @Getter - private int written; - @Getter - private final List writtenFiles; - - public PakOutputStream(File folder, String name, long pakSize) throws IOException { - folder.mkdirs(); - this.writtenFiles = new ArrayList<>(); - this.written = 0; - this.name = name; - this.currentPakNumber = 0; - this.currentPakOutput = writePakFile(0); - this.pakSize = pakSize; - this.folder = folder; - } - - private OutputStream writePakFile(int number) throws IOException { - File f = new File(folder, name + number + ".pak"); - writtenFiles.add(f); - return new FileOutputStream(f); - } - - @Override - public void write(int b) throws IOException { - if(written++ == pakSize) { - currentPakOutput.close(); - currentPakOutput = writePakFile(++currentPakNumber); - written = 1; - } - - currentPakOutput.write(b); - } - - public void close() throws IOException { - currentPakOutput.close(); - } -} diff --git a/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakResourceInput.java b/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakResourceInput.java deleted file mode 100644 index 34a5b5e09..000000000 --- a/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakResourceInput.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.volmit.iris.engine.editor.pak; - -import com.volmit.iris.engine.editor.Resolvable; -import com.volmit.iris.platform.PlatformNamespaceKey; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.function.Consumer; -import java.util.function.Supplier; - -@NoArgsConstructor -@Builder -@Data -@AllArgsConstructor -public class PakResourceInput { - private Class type; - private PlatformNamespaceKey key; - private Supplier reader; - private long size; - - public long write(OutputStream out) throws IOException { - InputStream in = reader.get(); - long w = in.transferTo(out); - in.close(); - return w; - } - - public static PakResourceInput file(PlatformNamespaceKey key, Class type, File f) { - return PakResourceInput.builder() - .size(f.length()) - .key(key) - .type(type) - .reader(() -> { - try { - return new FileInputStream(f); - } catch(FileNotFoundException e) { - throw new RuntimeException(e); - } - }) - .build(); - } -} diff --git a/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakResourceMetadata.java b/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakResourceMetadata.java deleted file mode 100644 index 271affa7f..000000000 --- a/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakResourceMetadata.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.volmit.iris.engine.editor.pak; - -import com.volmit.iris.engine.editor.Resolvable; -import com.volmit.iris.platform.PlatformNamespaceKey; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; -import lombok.experimental.Accessors; - -@NoArgsConstructor -@Data -@AllArgsConstructor -@Builder -@Accessors(chain = true, fluent = true) -public class PakResourceMetadata -{ - private String type; - private String key; - private long start; - private long length; -} diff --git a/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakWriter.java b/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakWriter.java deleted file mode 100644 index a3a155f41..000000000 --- a/engine/src/main/java/com/volmit/iris/engine/editor/pak/PakWriter.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.volmit.iris.engine.editor.pak; - -import art.arcane.nbtson.NBTSon; -import art.arcane.nbtson.io.NBTOutputStream; -import art.arcane.nbtson.io.NBTUtil; -import art.arcane.nbtson.io.NamedTag; -import art.arcane.nbtson.io.UnserializableClassException; - -import java.io.DataOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.List; -import static art.arcane.amulet.MagicalSugar.*; - -public class PakWriter { - private final List resources; - private final File folder; - private final PakOutputStream output; - private final String name; - private final long pakSize; - - public PakWriter(File folder, String name, long pakSize) throws IOException { - folder.mkdirs(); - this.name = name; - this.folder = folder; - this.pakSize = pakSize; - output = new PakOutputStream(folder, name, pakSize); - resources = new ArrayList<>(); - } - - public PakWriter(File folder, String name) throws IOException { - this(folder, name, 1LMB); - } - - public void write() throws IOException { - PakMetadata.PakMetadataBuilder meta = PakMetadata.builder().namespace(name).pakSize(pakSize); - long totalWritten = 0; - - for(PakResourceInput i : resources) { - long written = i.write(output); - meta.resource(PakResourceMetadata.builder() - .key(i.getKey().toString()) - .type(i.getType().getCanonicalName()) - .start(totalWritten) - .length(written) - .build()); - totalWritten += written; - } - - NBTUtil.write(new NamedTag("Package " + name, NBTSon.toNBT(meta.build())), new File(folder, name + ".dat"), true); - output.close(); - } - - public PakWriter resource(PakResourceInput input) - { - resources.add(input); - return this; - } -} diff --git a/engine/src/main/java/com/volmit/iris/engine/editor/resolver/CompositeResolver.java b/engine/src/main/java/com/volmit/iris/engine/resolver/CompositeResolver.java similarity index 90% rename from engine/src/main/java/com/volmit/iris/engine/editor/resolver/CompositeResolver.java rename to engine/src/main/java/com/volmit/iris/engine/resolver/CompositeResolver.java index 25a832016..177ce01f0 100644 --- a/engine/src/main/java/com/volmit/iris/engine/editor/resolver/CompositeResolver.java +++ b/engine/src/main/java/com/volmit/iris/engine/resolver/CompositeResolver.java @@ -1,6 +1,5 @@ -package com.volmit.iris.engine.editor.resolver; +package com.volmit.iris.engine.resolver; -import com.volmit.iris.engine.editor.Resolvable; import com.volmit.iris.platform.PlatformNamespaceKey; import lombok.Data; diff --git a/engine/src/main/java/com/volmit/iris/engine/resolver/EngineResolvable.java b/engine/src/main/java/com/volmit/iris/engine/resolver/EngineResolvable.java new file mode 100644 index 000000000..056f7c822 --- /dev/null +++ b/engine/src/main/java/com/volmit/iris/engine/resolver/EngineResolvable.java @@ -0,0 +1,9 @@ +package com.volmit.iris.engine.resolver; + +import com.volmit.iris.platform.PlatformNamespaceKey; +import lombok.Data; + +@Data +public class EngineResolvable implements Resolvable { + private PlatformNamespaceKey key; +} diff --git a/engine/src/main/java/com/volmit/iris/engine/editor/resolver/FrozenResolver.java b/engine/src/main/java/com/volmit/iris/engine/resolver/FrozenResolver.java similarity index 88% rename from engine/src/main/java/com/volmit/iris/engine/editor/resolver/FrozenResolver.java rename to engine/src/main/java/com/volmit/iris/engine/resolver/FrozenResolver.java index cf7a228ea..b0875bbc7 100644 --- a/engine/src/main/java/com/volmit/iris/engine/editor/resolver/FrozenResolver.java +++ b/engine/src/main/java/com/volmit/iris/engine/resolver/FrozenResolver.java @@ -1,6 +1,5 @@ -package com.volmit.iris.engine.editor.resolver; +package com.volmit.iris.engine.resolver; -import com.volmit.iris.engine.editor.Resolvable; import com.volmit.iris.platform.PlatformNamespaceKey; import lombok.Data; diff --git a/engine/src/main/java/com/volmit/iris/engine/editor/resolver/HotResolver.java b/engine/src/main/java/com/volmit/iris/engine/resolver/HotResolver.java similarity index 94% rename from engine/src/main/java/com/volmit/iris/engine/editor/resolver/HotResolver.java rename to engine/src/main/java/com/volmit/iris/engine/resolver/HotResolver.java index 3a7ba5a03..67f0d5025 100644 --- a/engine/src/main/java/com/volmit/iris/engine/editor/resolver/HotResolver.java +++ b/engine/src/main/java/com/volmit/iris/engine/resolver/HotResolver.java @@ -1,9 +1,8 @@ -package com.volmit.iris.engine.editor.resolver; +package com.volmit.iris.engine.resolver; import com.github.benmanes.caffeine.cache.CacheLoader; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; -import com.volmit.iris.engine.editor.Resolvable; import com.volmit.iris.platform.PlatformNamespaceKey; import lombok.Data; import org.checkerframework.checker.nullness.qual.Nullable; diff --git a/engine/src/main/java/com/volmit/iris/engine/resolver/MergedResolver.java b/engine/src/main/java/com/volmit/iris/engine/resolver/MergedResolver.java new file mode 100644 index 000000000..aedc89cbf --- /dev/null +++ b/engine/src/main/java/com/volmit/iris/engine/resolver/MergedResolver.java @@ -0,0 +1,60 @@ +package com.volmit.iris.engine.resolver; + +import com.volmit.iris.platform.PlatformNamespaceKey; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class MergedResolver implements Resolver { + private final List> resolvers; + + public MergedResolver(Resolver... resolvers) + { + this(Arrays.stream(resolvers).toList()); + } + + public MergedResolver(List> resolvers) + { + this.resolvers = resolvers; + } + + @Override + public boolean hasNamespace(String namespace) { + for(Resolver i : resolvers) { + if(i.hasNamespace(namespace)) { + return true; + } + } + + return false; + } + + @Override + public T resolve(PlatformNamespaceKey key) { + for(Resolver i : resolvers) { + T t = i.resolve(key); + + if(t != null) + { + return t; + } + } + + return null; + } + + @Override + public T resolve(String key) { + for(Resolver i : resolvers) { + T t = i.resolve(key); + + if(t != null) + { + return t; + } + } + + return null; + } +} diff --git a/engine/src/main/java/com/volmit/iris/engine/editor/Resolvable.java b/engine/src/main/java/com/volmit/iris/engine/resolver/Resolvable.java similarity index 91% rename from engine/src/main/java/com/volmit/iris/engine/editor/Resolvable.java rename to engine/src/main/java/com/volmit/iris/engine/resolver/Resolvable.java index d038ce717..6ec04ce75 100644 --- a/engine/src/main/java/com/volmit/iris/engine/editor/Resolvable.java +++ b/engine/src/main/java/com/volmit/iris/engine/resolver/Resolvable.java @@ -1,12 +1,14 @@ -package com.volmit.iris.engine.editor; +package com.volmit.iris.engine.resolver; import art.arcane.amulet.format.Form; +import art.arcane.cram.PakResource; import com.google.gson.GsonBuilder; import com.google.gson.TypeAdapter; import com.google.gson.TypeAdapterFactory; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; import com.volmit.iris.platform.PlatformNamespaced; +import com.volmit.iris.platform.PlatformNamespacedMutable; import lombok.AllArgsConstructor; import java.io.IOException; @@ -15,7 +17,7 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -public interface Resolvable extends PlatformNamespaced { +public interface Resolvable extends PlatformNamespaced, PlatformNamespacedMutable, PakResource { default void apply(GsonBuilder builder) { if(this instanceof TypeAdapterFactory f) { builder.registerTypeAdapterFactory(f); diff --git a/engine/src/main/java/com/volmit/iris/engine/editor/resolver/Resolver.java b/engine/src/main/java/com/volmit/iris/engine/resolver/Resolver.java similarity index 65% rename from engine/src/main/java/com/volmit/iris/engine/editor/resolver/Resolver.java rename to engine/src/main/java/com/volmit/iris/engine/resolver/Resolver.java index 2d1e567e0..cb0fbdea5 100644 --- a/engine/src/main/java/com/volmit/iris/engine/editor/resolver/Resolver.java +++ b/engine/src/main/java/com/volmit/iris/engine/resolver/Resolver.java @@ -1,8 +1,8 @@ -package com.volmit.iris.engine.editor.resolver; +package com.volmit.iris.engine.resolver; +import art.arcane.cram.PakKey; +import art.arcane.cram.PakResource; import com.google.gson.Gson; -import com.volmit.iris.engine.Engine; -import com.volmit.iris.engine.editor.Resolvable; import com.volmit.iris.platform.PlatformNamespaceKey; import java.io.File; @@ -10,10 +10,33 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.util.HashMap; import java.util.Map; import java.util.function.Function; +import java.util.function.Predicate; public interface Resolver { + @SuppressWarnings("unchecked") + static Resolver frozen(Map resources, Predicate isTypePredicate) { + Map> resolvables = new HashMap<>(); + Map> resolvers = new HashMap<>(); + + for(PakKey i : resources.keySet()) { + PakResource r = resources.get(i); + + if(isTypePredicate.test(r)) { + Map rs = resolvables.computeIfAbsent(i.getNamespace(), (k) -> new HashMap<>()); + rs.put(i.getKey(), (F) i); + } + } + + for(String i : resolvables.keySet()) { + resolvers.put(i, frozen(i, resolvables.get(i))); + } + + return new CompositeResolver<>(resolvers); + } + static Resolver frozen(String namespace, Map map) { return new FrozenResolver<>(namespace, map); } @@ -61,4 +84,8 @@ public interface Resolver { default boolean contains(PlatformNamespaceKey key){ return hasNamespace(key.getNamespace()) && resolve(key) != null; } + + default Resolver addResolver(Resolver resolver, String namespace) { + return new MergedResolver<>(resolver, this); + } } diff --git a/engine/src/main/java/com/volmit/iris/platform/PlatformNamespaceKey.java b/engine/src/main/java/com/volmit/iris/platform/PlatformNamespaceKey.java index 1db6e1ee8..b30eb49ff 100644 --- a/engine/src/main/java/com/volmit/iris/platform/PlatformNamespaceKey.java +++ b/engine/src/main/java/com/volmit/iris/platform/PlatformNamespaceKey.java @@ -1,9 +1,16 @@ package com.volmit.iris.platform; +import art.arcane.cram.PakKey; +import com.volmit.iris.util.NSK; + public interface PlatformNamespaceKey { String getNamespace(); String getKey(); String toString(); + + static PlatformNamespaceKey of(PakKey key) { + return new NSK(key.getNamespace(), key.getKey()); + } } diff --git a/engine/src/main/java/com/volmit/iris/platform/PlatformNamespacedMutable.java b/engine/src/main/java/com/volmit/iris/platform/PlatformNamespacedMutable.java new file mode 100644 index 000000000..6d376c124 --- /dev/null +++ b/engine/src/main/java/com/volmit/iris/platform/PlatformNamespacedMutable.java @@ -0,0 +1,5 @@ +package com.volmit.iris.platform; + +public interface PlatformNamespacedMutable { + void setKey(PlatformNamespaceKey key); +} diff --git a/engine/src/main/java/com/volmit/iris/platform/PlatformWorld.java b/engine/src/main/java/com/volmit/iris/platform/PlatformWorld.java index dd8b978e6..91ed25f29 100644 --- a/engine/src/main/java/com/volmit/iris/platform/PlatformWorld.java +++ b/engine/src/main/java/com/volmit/iris/platform/PlatformWorld.java @@ -41,6 +41,10 @@ public interface PlatformWorld { return getWorldFolder("iris"); } + default File getIrisDataFolder() { + return new File(getWorldFolder("iris"), "data"); + } + default boolean isRegionLoaded(int x, int z) { for(PlatformChunk i : getLoadedChunks()) { if(i.getX() >> 5 == x && i.getZ() >> 5 == z) {