9
0
mirror of https://github.com/VolmitSoftware/Iris.git synced 2025-12-25 10:09:14 +00:00

Resolvers

This commit is contained in:
DanMB
2022-07-07 13:08:14 -07:00
parent d31a9605d5
commit 1634454700
33 changed files with 241 additions and 399 deletions

View File

@@ -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()

View File

@@ -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<Resolvable> resolvableTypes;
private final Map<Class<? extends Resolvable>, Resolver<? extends Resolvable>> 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 <T extends Resolvable> void registerResolver(Class<T> type, Resolver<T> resolver, String... namespaces)
{
if(resolvers.containsKey(type)) {
Resolver<T> existing = (Resolver<T>) resolvers.get(type);
if(existing instanceof CompositeResolver<T> c) {
Map<String, Resolver<T>> oresolvers = c.getResolvers();
if(namespaces.length > 1) {
CompositeResolver<T> n = (CompositeResolver<T>) 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)
{
}
}

View File

@@ -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<Resolvable> 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");
}
}

View File

@@ -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<String, String> social;

View File

@@ -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

View File

@@ -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;

View File

@@ -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");

View File

@@ -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();

View File

@@ -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;

View File

@@ -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();

View File

@@ -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)

View File

@@ -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;

View File

@@ -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;
}
}

View File

@@ -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;

View File

@@ -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<IrisSurfaceLayer> layers = new ArrayList<>();

View File

@@ -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");

View File

@@ -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();
}
}
}

View File

@@ -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<PakResourceMetadata> resources;
private long pakSize;
}

View File

@@ -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<File> 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();
}
}

View File

@@ -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<? extends Resolvable> type;
private PlatformNamespaceKey key;
private Supplier<InputStream> 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<? extends Resolvable> 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();
}
}

View File

@@ -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;
}

View File

@@ -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<PakResourceInput> 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;
}
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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<T extends Resolvable> implements Resolver<T> {
private final List<Resolver<T>> resolvers;
public MergedResolver(Resolver<T>... resolvers)
{
this(Arrays.stream(resolvers).toList());
}
public MergedResolver(List<Resolver<T>> resolvers)
{
this.resolvers = resolvers;
}
@Override
public boolean hasNamespace(String namespace) {
for(Resolver<T> i : resolvers) {
if(i.hasNamespace(namespace)) {
return true;
}
}
return false;
}
@Override
public T resolve(PlatformNamespaceKey key) {
for(Resolver<T> i : resolvers) {
T t = i.resolve(key);
if(t != null)
{
return t;
}
}
return null;
}
@Override
public T resolve(String key) {
for(Resolver<T> i : resolvers) {
T t = i.resolve(key);
if(t != null)
{
return t;
}
}
return null;
}
}

View File

@@ -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);

View File

@@ -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<T extends Resolvable> {
@SuppressWarnings("unchecked")
static <F extends Resolvable> Resolver<F> frozen(Map<PakKey, PakResource> resources, Predicate<PakResource> isTypePredicate) {
Map<String, Map<String, F>> resolvables = new HashMap<>();
Map<String, Resolver<F>> resolvers = new HashMap<>();
for(PakKey i : resources.keySet()) {
PakResource r = resources.get(i);
if(isTypePredicate.test(r)) {
Map<String, F> 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 <F extends Resolvable> Resolver<F> frozen(String namespace, Map<String, F> map) {
return new FrozenResolver<>(namespace, map);
}
@@ -61,4 +84,8 @@ public interface Resolver<T extends Resolvable> {
default boolean contains(PlatformNamespaceKey key){
return hasNamespace(key.getNamespace()) && resolve(key) != null;
}
default Resolver<T> addResolver(Resolver<T> resolver, String namespace) {
return new MergedResolver<>(resolver, this);
}
}

View File

@@ -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());
}
}

View File

@@ -0,0 +1,5 @@
package com.volmit.iris.platform;
public interface PlatformNamespacedMutable {
void setKey(PlatformNamespaceKey key);
}

View File

@@ -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) {