diff --git a/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/Chunk/XChunk.java b/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/Chunk/XChunk.java deleted file mode 100644 index 857f0e850..000000000 --- a/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/Chunk/XChunk.java +++ /dev/null @@ -1,13 +0,0 @@ -package IrisBukkit.extensions.org.bukkit.Chunk; - -import com.volmit.iris.platform.bukkit.wrapper.BukkitChunk; -import manifold.ext.rt.api.Extension; -import manifold.ext.rt.api.This; -import org.bukkit.Chunk; - -@Extension -public class XChunk { - public static BukkitChunk bukkitChunk(@This Chunk self) { - return BukkitChunk.of(self); - } -} \ No newline at end of file diff --git a/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/NamespacedKey/XNamespacedKey.java b/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/NamespacedKey/XNamespacedKey.java deleted file mode 100644 index 6e2a570d8..000000000 --- a/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/NamespacedKey/XNamespacedKey.java +++ /dev/null @@ -1,13 +0,0 @@ -package IrisBukkit.extensions.org.bukkit.NamespacedKey; - -import com.volmit.iris.platform.bukkit.wrapper.BukkitKey; -import manifold.ext.rt.api.Extension; -import manifold.ext.rt.api.This; -import org.bukkit.NamespacedKey; - -@Extension -public class XNamespacedKey { - public static BukkitKey bukkitKey(@This NamespacedKey self) { - return BukkitKey.of(self); - } -} \ No newline at end of file diff --git a/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/World/XWorld.java b/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/World/XWorld.java deleted file mode 100644 index d0664e322..000000000 --- a/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/World/XWorld.java +++ /dev/null @@ -1,13 +0,0 @@ -package IrisBukkit.extensions.org.bukkit.World; - -import com.volmit.iris.platform.bukkit.wrapper.BukkitWorld; -import manifold.ext.rt.api.Extension; -import manifold.ext.rt.api.This; -import org.bukkit.World; - -@Extension -public class XWorld { - public static BukkitWorld bukkitWorld(@This World self) { - return BukkitWorld.of(self); - } -} \ No newline at end of file diff --git a/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/block/Biome/XBiome.java b/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/block/Biome/XBiome.java deleted file mode 100644 index b674f33bf..000000000 --- a/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/block/Biome/XBiome.java +++ /dev/null @@ -1,18 +0,0 @@ -package IrisBukkit.extensions.org.bukkit.block.Biome; - -import com.volmit.iris.platform.bukkit.wrapper.BukkitBiome; -import com.volmit.iris.platform.bukkit.wrapper.BukkitKey; -import manifold.ext.rt.api.Extension; -import manifold.ext.rt.api.This; -import org.bukkit.block.Biome; - -@Extension -public class XBiome { - public static BukkitKey bukkitKey(@This Biome self) { - return self.getKey().bukkitKey(); - } - - public static BukkitBiome bukkitBiome(@This Biome self) { - return BukkitBiome.of(self); - } -} \ No newline at end of file diff --git a/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/block/data/BlockData/XBlockData.java b/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/block/data/BlockData/XBlockData.java deleted file mode 100644 index 9976c2bc7..000000000 --- a/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/block/data/BlockData/XBlockData.java +++ /dev/null @@ -1,18 +0,0 @@ -package IrisBukkit.extensions.org.bukkit.block.data.BlockData; - -import com.volmit.iris.platform.bukkit.wrapper.BukkitBlock; -import com.volmit.iris.platform.bukkit.wrapper.BukkitKey; -import manifold.ext.rt.api.Extension; -import manifold.ext.rt.api.This; -import org.bukkit.block.data.BlockData; - -@Extension -public class XBlockData { - public static BukkitKey bukkitKey(@This BlockData self) { - return self.getMaterial().getKey().bukkitKey(); - } - - public static BukkitBlock bukkitBlock(@This BlockData self) { - return BukkitBlock.of(self); - } -} \ No newline at end of file diff --git a/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/entity/Player/XPlayer.java b/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/entity/Player/XPlayer.java deleted file mode 100644 index 384d55bc2..000000000 --- a/bukkit/src/main/java/IrisBukkit/extensions/org/bukkit/entity/Player/XPlayer.java +++ /dev/null @@ -1,13 +0,0 @@ -package IrisBukkit.extensions.org.bukkit.entity.Player; - -import com.volmit.iris.platform.bukkit.wrapper.BukkitPlayer; -import manifold.ext.rt.api.Extension; -import manifold.ext.rt.api.This; -import org.bukkit.entity.Player; - -@Extension -public class XPlayer { - public static BukkitPlayer bukkitPlayer(@This Player self) { - return BukkitPlayer.of(self); - } -} \ No newline at end of file diff --git a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkit.java b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkit.java index daadb9e80..5859ea10c 100644 --- a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkit.java +++ b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkit.java @@ -7,7 +7,10 @@ import com.volmit.iris.platform.PlatformBiome; import com.volmit.iris.platform.PlatformBlock; import com.volmit.iris.platform.PlatformNamespaceKey; import com.volmit.iris.platform.PlatformWorld; +import com.volmit.iris.platform.bukkit.wrapper.BukkitBiome; +import com.volmit.iris.platform.bukkit.wrapper.BukkitBlock; import com.volmit.iris.platform.bukkit.wrapper.BukkitKey; +import com.volmit.iris.platform.bukkit.wrapper.BukkitWorld; import lombok.Data; import lombok.EqualsAndHashCode; import org.bukkit.Bukkit; @@ -69,7 +72,7 @@ public class IrisBukkit extends JavaPlugin implements IrisPlatform { } } - i.bukkitWorld().unloadChunks(false, true); + BukkitWorld.of(i).unloadChunks(false, true); File folder = i.getWorldFolder(); Bukkit.unloadWorld(i, false); IO.delete(folder); @@ -93,14 +96,14 @@ public class IrisBukkit extends JavaPlugin implements IrisPlatform { return Arrays.stream(Material.values()) .filter(i -> !i.isLegacy()) .filter(Material::isBlock) - .map(Material::createBlockData).map(i -> i.bukkitBlock()); + .map(Material::createBlockData).map(i -> BukkitBlock.of(i)); } @Override public Stream getBiomes() { //This is because it's a method extension //noinspection Convert2MethodRef - return Arrays.stream(Biome.values()).parallel().filter((i) -> i != Biome.CUSTOM).map(i -> i.bukkitBiome()); + return Arrays.stream(Biome.values()).parallel().filter((i) -> i != Biome.CUSTOM).map(i -> BukkitBiome.of(i)); } @Override @@ -117,12 +120,12 @@ public class IrisBukkit extends JavaPlugin implements IrisPlatform { return null; } - return w.bukkitWorld(); + return BukkitWorld.of(w); } @Override public PlatformBlock parseBlock(String raw) { - return Bukkit.createBlockData(raw).bukkitBlock(); + return BukkitBlock.of(Bukkit.createBlockData(raw)); } @Override @@ -130,6 +133,13 @@ public class IrisBukkit extends JavaPlugin implements IrisPlatform { return BukkitKey.of(namespace, key); } + @Override + public File getStudioFolder(String dimension) { + File f = new File(getDataFolder(), "packs/" + dimension); + f.mkdirs(); + return f; + } + @Override public ChunkGenerator getDefaultWorldGenerator(String worldName, String id) { return new IrisBukkitChunkGenerator(this, EngineConfiguration.builder() diff --git a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkitChunkGenerator.java b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkitChunkGenerator.java index b30180aa2..3722ee9f6 100644 --- a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkitChunkGenerator.java +++ b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/IrisBukkitChunkGenerator.java @@ -10,6 +10,7 @@ import com.volmit.iris.engine.feature.IrisFeatureTarget; import com.volmit.iris.engine.pipeline.PipedHunkStack; import com.volmit.iris.platform.IrisPlatform; import com.volmit.iris.platform.PlatformBlock; +import com.volmit.iris.platform.bukkit.wrapper.BukkitWorld; import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.generator.ChunkGenerator; @@ -77,7 +78,11 @@ public class IrisBukkitChunkGenerator extends ChunkGenerator implements Closeabl if(engine.get() == null) { - engine.set(new Engine(platform, world.bukkitWorld(), configuration)); + try { + engine.set(new Engine(platform, BukkitWorld.of(world), configuration)); + } catch (IOException e) { + throw new RuntimeException(e); + } } engineLock.unlock(); diff --git a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/util/ChunkDataHunkView.java b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/util/ChunkDataHunkView.java index fbc39d081..b2c3e0db5 100644 --- a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/util/ChunkDataHunkView.java +++ b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/util/ChunkDataHunkView.java @@ -48,6 +48,6 @@ public class ChunkDataHunkView implements Hunk { @Override public PlatformBlock getRaw(int x, int y, int z) { - return chunk.getBlockData(x, y + chunk.getMinHeight(), z).bukkitBlock(); + return BukkitBlock.of(chunk.getBlockData(x, y + chunk.getMinHeight(), z)); } } \ No newline at end of file diff --git a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitBiome.java b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitBiome.java index c89b8bfc2..9cd8f5af6 100644 --- a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitBiome.java +++ b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitBiome.java @@ -15,7 +15,7 @@ public class BukkitBiome implements PlatformBiome { @Override public PlatformNamespaceKey getKey() { - return delegate.getKey().bukkitKey(); + return BukkitKey.of(delegate.getKey()); } public static BukkitBiome of(Biome biome) { diff --git a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitBlock.java b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitBlock.java index 8d5be3987..4f78ef6e8 100644 --- a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitBlock.java +++ b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitBlock.java @@ -52,7 +52,7 @@ public class BukkitBlock implements PlatformBlock { @Override public PlatformNamespaceKey getKey() { - return delegate.getMaterial().getKey().bukkitKey(); + return BukkitKey.of(delegate.getMaterial().getKey()); } public static BukkitBlock of(BlockData blockData) { diff --git a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitPlayer.java b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitPlayer.java index b62acb2cd..f226004cf 100644 --- a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitPlayer.java +++ b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitPlayer.java @@ -31,7 +31,7 @@ public class BukkitPlayer implements PlatformPlayer { @Override public PlatformWorld getWorld() { - return delegate.getWorld().bukkitWorld(); + return BukkitWorld.of(delegate.getWorld()); } @Override diff --git a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitWorld.java b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitWorld.java index 47278bab2..68d093483 100644 --- a/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitWorld.java +++ b/bukkit/src/main/java/com/volmit/iris/platform/bukkit/wrapper/BukkitWorld.java @@ -10,6 +10,7 @@ import lombok.Data; import org.bukkit.World; import java.io.File; +import java.util.Arrays; import java.util.stream.Collectors; @Data @@ -40,28 +41,28 @@ public class BukkitWorld implements PlatformWorld { @Override public Iterable getPlayers() { //noinspection Convert2MethodRef - return delegate.getPlayers().stream().map(i -> i.bukkitPlayer()).collect(Collectors.toList()); + return delegate.getPlayers().stream().map(i -> BukkitPlayer.of(i)).collect(Collectors.toList()); } @Override public Iterable getLoadedChunks() { //noinspection Convert2MethodRef - return delegate.getLoadedChunks().stream().map(i -> i.bukkitChunk()).collect(Collectors.toList()); + return Arrays.stream(delegate.getLoadedChunks()).map(i -> BukkitChunk.of(i)).collect(Collectors.toList()); } @Override public PlatformChunk getOrLoadChunk(int x, int z) { - return delegate.getChunkAt(x, z).bukkitChunk(); + return BukkitChunk.of(delegate.getChunkAt(x, z)); } @Override public PlatformBlock getBlock(int x, int y, int z) { - return delegate.getBlockAt(x, y, z).getBlockData().bukkitBlock(); + return BukkitBlock.of(delegate.getBlockAt(x, y, z).getBlockData()); } @Override public PlatformBiome getBiome(int x, int y, int z) { - return delegate.getBiome(x, y, z).bukkitBiome(); + return BukkitBiome.of(delegate.getBiome(x, y, z)); } @Override 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 8387f20be..7b76d4821 100644 --- a/engine/src/main/java/com/volmit/iris/engine/Engine.java +++ b/engine/src/main/java/com/volmit/iris/engine/Engine.java @@ -33,7 +33,7 @@ public class Engine implements Closeable { private final EngineSeedManager seedManager; private final EngineData data; - public Engine(IrisPlatform platform, PlatformWorld world, EngineConfiguration configuration) { + public Engine(IrisPlatform platform, PlatformWorld world, EngineConfiguration configuration) throws IOException { PrecisionStopwatch p = PrecisionStopwatch.start(); this.configuration = configuration; this.platform = platform; @@ -56,6 +56,9 @@ public class Engine implements Closeable { .build()) .build()) .build(); + data.loadData(getConfiguration().isMutable() + ? getPlatform().getStudioFolder(getConfiguration().getDimension()) + : getWorld().getIrisDataFolder()); } public PlatformBlock block(String block) diff --git a/engine/src/main/java/com/volmit/iris/engine/EngineConfiguration.java b/engine/src/main/java/com/volmit/iris/engine/EngineConfiguration.java index eeb6b0c1c..cb5bd3e9f 100644 --- a/engine/src/main/java/com/volmit/iris/engine/EngineConfiguration.java +++ b/engine/src/main/java/com/volmit/iris/engine/EngineConfiguration.java @@ -22,4 +22,7 @@ public class EngineConfiguration { @Builder.Default private int threadPriority = 3; + + @Builder.Default + private String dimension = "overworld"; } diff --git a/engine/src/main/java/com/volmit/iris/engine/EngineData.java b/engine/src/main/java/com/volmit/iris/engine/EngineData.java index 94194201d..884c8eb81 100644 --- a/engine/src/main/java/com/volmit/iris/engine/EngineData.java +++ b/engine/src/main/java/com/volmit/iris/engine/EngineData.java @@ -1,7 +1,11 @@ package com.volmit.iris.engine; import art.arcane.amulet.concurrent.J; +import art.arcane.amulet.io.IO; import art.arcane.amulet.io.JarLoader; +import art.arcane.cram.PakFile; +import art.arcane.cram.PakKey; +import art.arcane.cram.PakResource; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.TypeAdapterFactory; @@ -9,6 +13,7 @@ import com.volmit.iris.engine.resolver.*; import lombok.Data; import java.io.File; +import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -19,10 +24,9 @@ public class EngineData { private final Engine engine; private final Gson gson; private List resolvableTypes; - private final Map, Resolver> resolvers; + private final Map, Resolver> resolvers; - public EngineData(Engine engine) - { + public EngineData(Engine engine) throws IOException { this.engine = engine; this.resolvers = new HashMap<>(); this.resolvableTypes = J.attempt(() -> new JarLoader(getClass()).all().parallel() @@ -37,44 +41,77 @@ public class EngineData { 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) + public void registerResolver(Class type, Resolver resolver, String namespace) { 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 - { - - } - } + Resolver r = resolvers.get(type); + resolvers.put(type, r.and(namespace, r)); } - else - { + else { resolvers.put(type, resolver); } } - public void loadData(File folder) - { + public void loadData(File folder) throws IOException { + i("Loading Data in " + folder.getPath()); + for(File i : folder.listFiles()) { + if(i.isDirectory()) { + loadDataNamespaced(i, i.getName()); + } + } + } + public void loadDataNamespaced(File folder, String namespace) throws IOException { + i("Loading Namespace " + namespace + " in " + folder.getPath()); + for(Resolvable i : resolvableTypes) + { + new File(folder, i.entity().getId()).mkdirs(); + IO.writeAll( + new File(new File(folder, i.entity().getId()), "example.json"), gson.toJson(i)); + } + + for(File i : folder.listFiles()) + { + if(i.isDirectory()) { + loadDataFolder(i, namespace); + } + + else if(i.getName().endsWith(".dat")) { + loadPakFile(folder, i.getName().split("\\Q.\\E")[0]); + } + } + } + + public void loadDataFolder(File folder, String namespace) { + for(Resolvable i : resolvableTypes) + { + if(!folder.getName().equals(i.entity().getId())) { + continue; + } + + registerResolver(i.getClass(), Resolver.hotDirectoryJson(namespace, i.getClass(), folder, gson), namespace); + } + } + + public void loadPakFile(File folder, String name) throws IOException { + PakFile pakFile = new PakFile(folder, name); + Map resources = pakFile.getAllResources(); + + for(Resolvable i : resolvableTypes) + { + Class resolvableClass = i.getClass(); + CompositeResolver composite = Resolver.frozen(resources, (p) -> p.getClass().equals(resolvableClass)); + + for(String j : composite.getResolvers().keySet()) + { + Resolver resolver = composite.getResolvers().get(i); + this.registerResolver(i.getClass(), resolver, j); + } + } + } + + public void printResolvers() { + resolvers.forEach((k, i) -> i.print(k.simpleName(), this)); } } diff --git a/engine/src/main/java/com/volmit/iris/engine/resolver/CompositeResolver.java b/engine/src/main/java/com/volmit/iris/engine/resolver/CompositeResolver.java index 177ce01f0..a635c28af 100644 --- a/engine/src/main/java/com/volmit/iris/engine/resolver/CompositeResolver.java +++ b/engine/src/main/java/com/volmit/iris/engine/resolver/CompositeResolver.java @@ -1,8 +1,10 @@ package com.volmit.iris.engine.resolver; +import art.arcane.amulet.format.Form; import com.volmit.iris.platform.PlatformNamespaceKey; import lombok.Data; +import java.util.Arrays; import java.util.Map; @Data @@ -36,4 +38,28 @@ public class CompositeResolver implements Resolver { return null; } + + @Override + public Resolver and(String namespace, Resolver resolver) { + Map> resolvers = this.resolvers.copy(); + + if(hasNamespace(namespace)) { + resolvers.put(namespace, resolvers.get(namespace).and(namespace, resolver)); + } + + else { + resolvers.put(namespace, resolver); + } + + return new CompositeResolver<>(resolvers); + } + + @Override + public void print(String type, Object printer, int indent) { + printer.i(Form.repeat(" ", indent) + "Composite[" + Arrays.toString(getNamespaces()) + "] " + type); + + for(Resolver i : getResolvers().values()) { + i.print(type, printer, indent + 2); + } + } } diff --git a/engine/src/main/java/com/volmit/iris/engine/resolver/FrozenResolver.java b/engine/src/main/java/com/volmit/iris/engine/resolver/FrozenResolver.java index b0875bbc7..d97178f98 100644 --- a/engine/src/main/java/com/volmit/iris/engine/resolver/FrozenResolver.java +++ b/engine/src/main/java/com/volmit/iris/engine/resolver/FrozenResolver.java @@ -1,5 +1,6 @@ package com.volmit.iris.engine.resolver; +import art.arcane.amulet.format.Form; import com.volmit.iris.platform.PlatformNamespaceKey; import lombok.Data; @@ -30,4 +31,18 @@ public class FrozenResolver implements Resolver { public T resolve(String key) { return registry.get(key); } + + @Override + public void print(String type, Object printer, int indent) { + printer.i(Form.repeat(" ", indent) + "Frozen[" + namespace + "] " + type); + } + + @Override + public Resolver and(String namespace, Resolver resolver) { + if(!namespace.equals(getNamespace())) { + return new CompositeResolver<>(Map.of(namespace, resolver, getNamespace(), this)); + } + + return new MergedNamespaceResolver<>(namespace, this, resolver); + } } diff --git a/engine/src/main/java/com/volmit/iris/engine/resolver/HotResolver.java b/engine/src/main/java/com/volmit/iris/engine/resolver/HotResolver.java index 67f0d5025..b82099199 100644 --- a/engine/src/main/java/com/volmit/iris/engine/resolver/HotResolver.java +++ b/engine/src/main/java/com/volmit/iris/engine/resolver/HotResolver.java @@ -1,5 +1,6 @@ package com.volmit.iris.engine.resolver; +import art.arcane.amulet.format.Form; import com.github.benmanes.caffeine.cache.CacheLoader; import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.LoadingCache; @@ -55,4 +56,18 @@ public class HotResolver implements Resolver, CacheLoad public @Nullable T load(String key) { return loader.apply(key); } + + @Override + public Resolver and(String namespace, Resolver resolver) { + if(!namespace.equals(getNamespace())) { + return new CompositeResolver<>(Map.of(namespace, resolver, getNamespace(), this)); + } + + return new MergedNamespaceResolver<>(namespace, this, resolver); + } + + @Override + public void print(String type, Object printer, int indent) { + printer.i(Form.repeat(" ", indent) + "Hot[" + namespace + "] " + type); + } } diff --git a/engine/src/main/java/com/volmit/iris/engine/resolver/MergedNamespaceResolver.java b/engine/src/main/java/com/volmit/iris/engine/resolver/MergedNamespaceResolver.java new file mode 100644 index 000000000..51fc85f70 --- /dev/null +++ b/engine/src/main/java/com/volmit/iris/engine/resolver/MergedNamespaceResolver.java @@ -0,0 +1,80 @@ +package com.volmit.iris.engine.resolver; + +import art.arcane.amulet.format.Form; +import com.volmit.iris.platform.PlatformNamespaceKey; +import lombok.Data; + +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +@Data +public class MergedNamespaceResolver implements Resolver { + private final String namespace; + private final List> resolvers; + + public MergedNamespaceResolver(String namespace, Resolver... resolvers) + { + this(namespace, Arrays.stream(resolvers).toList()); + } + + public MergedNamespaceResolver(String namespace, List> resolvers) + { + this.namespace = namespace; + this.resolvers = resolvers; + } + + @Override + public boolean hasNamespace(String namespace) { + return this.namespace.equals(namespace); + } + + @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; + } + + @Override + public void print(String type, Object printer, int indent) { + printer.i(Form.repeat(" ", indent) + "Merged[" + namespace + "] " + type); + + for(Resolver i : getResolvers()) { + i.print(type, printer, indent + 2); + } + } + + @Override + public Resolver and(String namespace, Resolver resolver) { + if(namespace.equals(getNamespace())) + { + List> r = resolvers.copy(); + r.add(resolver); + return new MergedNamespaceResolver<>(namespace, r); + } + + return new CompositeResolver<>(Map.of(getNamespace(), this, namespace, resolver)); + } +} 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 deleted file mode 100644 index aedc89cbf..000000000 --- a/engine/src/main/java/com/volmit/iris/engine/resolver/MergedResolver.java +++ /dev/null @@ -1,60 +0,0 @@ -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/resolver/Resolvable.java b/engine/src/main/java/com/volmit/iris/engine/resolver/Resolvable.java index 6ec04ce75..0bf1949f7 100644 --- a/engine/src/main/java/com/volmit/iris/engine/resolver/Resolvable.java +++ b/engine/src/main/java/com/volmit/iris/engine/resolver/Resolvable.java @@ -24,6 +24,10 @@ public interface Resolvable extends PlatformNamespaced, PlatformNamespacedMutabl } } + default Entity.ResolverEntityData entity() { + return new Entity.ResolverEntityData(getClass().getDeclaredAnnotation(Resolvable.Entity.class)); + } + default void writeSafeJson(TypeAdapter delegate, JsonWriter out, T value) { try { delegate.write(out, value); diff --git a/engine/src/main/java/com/volmit/iris/engine/resolver/Resolver.java b/engine/src/main/java/com/volmit/iris/engine/resolver/Resolver.java index cb0fbdea5..1d09aef8d 100644 --- a/engine/src/main/java/com/volmit/iris/engine/resolver/Resolver.java +++ b/engine/src/main/java/com/volmit/iris/engine/resolver/Resolver.java @@ -17,7 +17,7 @@ import java.util.function.Predicate; public interface Resolver { @SuppressWarnings("unchecked") - static Resolver frozen(Map resources, Predicate isTypePredicate) { + static CompositeResolver frozen(Map resources, Predicate isTypePredicate) { Map> resolvables = new HashMap<>(); Map> resolvers = new HashMap<>(); @@ -85,7 +85,12 @@ public interface Resolver { return hasNamespace(key.getNamespace()) && resolve(key) != null; } - default Resolver addResolver(Resolver resolver, String namespace) { - return new MergedResolver<>(resolver, this); + Resolver and(String namespace, Resolver resolver); + + default void print(String type, Object printer) + { + print(type, printer, 0); } + + void print(String type, Object printer, int index); } diff --git a/engine/src/main/java/com/volmit/iris/platform/IrisPlatform.java b/engine/src/main/java/com/volmit/iris/platform/IrisPlatform.java index dd87bf472..2f78be3d5 100644 --- a/engine/src/main/java/com/volmit/iris/platform/IrisPlatform.java +++ b/engine/src/main/java/com/volmit/iris/platform/IrisPlatform.java @@ -1,5 +1,6 @@ package com.volmit.iris.platform; +import java.io.File; import java.util.stream.Stream; public interface IrisPlatform { @@ -21,4 +22,6 @@ public interface IrisPlatform { { return key("minecraft", nsk); } + + File getStudioFolder(String dimension); } 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 91ed25f29..c04fd0fab 100644 --- a/engine/src/main/java/com/volmit/iris/platform/PlatformWorld.java +++ b/engine/src/main/java/com/volmit/iris/platform/PlatformWorld.java @@ -42,7 +42,9 @@ public interface PlatformWorld { } default File getIrisDataFolder() { - return new File(getWorldFolder("iris"), "data"); + File f = new File(getWorldFolder("iris"), "data"); + f.mkdirs(); + return f; } default boolean isRegionLoaded(int x, int z) {