mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2025-12-25 10:09:14 +00:00
Resolvers
This commit is contained in:
@@ -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()
|
||||
|
||||
80
engine/src/main/java/com/volmit/iris/engine/EngineData.java
Normal file
80
engine/src/main/java/com/volmit/iris/engine/EngineData.java
Normal 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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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<>();
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
package com.volmit.iris.platform;
|
||||
|
||||
public interface PlatformNamespacedMutable {
|
||||
void setKey(PlatformNamespaceKey key);
|
||||
}
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user