diff --git a/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/ResourcePool.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/ResourcePool.java index dce39e966..b426642c9 100644 --- a/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/ResourcePool.java +++ b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/ResourcePool.java @@ -39,6 +39,18 @@ public class ResourcePool { private final Map pool = new HashMap<>(); private final Map> paths = new HashMap<>(); + private final ResourcePoolMapper mapper; + private final Class type; + + public ResourcePool() { + this.type = null; + this.mapper = null; + } + + public ResourcePool(Class type, ResourcePoolMapper mapper) { + this.type = type; + this.mapper = mapper; + } public void put(Key path, T value) { put(new ResourcePath<>(path), value); @@ -70,6 +82,9 @@ public Collection values() { } public boolean contains(Key path) { + if (mapper != null) { + path = mapper.remapResource(type, path); + } return paths.containsKey(path); } @@ -78,7 +93,7 @@ public boolean contains(Key path) { } public @Nullable T get(Key path) { - ResourcePath rp = paths.get(path); + ResourcePath rp = getPath(path); return rp == null ? null : rp.getResource(this::get); } @@ -88,6 +103,9 @@ public synchronized void remove(Key path) { } public @Nullable ResourcePath getPath(Key path) { + if (mapper != null) { + path = mapper.remapResource(type, path); + } return paths.get(path); } diff --git a/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/ResourcePoolMapper.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/ResourcePoolMapper.java new file mode 100644 index 000000000..8438441e0 --- /dev/null +++ b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/ResourcePoolMapper.java @@ -0,0 +1,9 @@ +package de.bluecolored.bluemap.core.resources.pack; + +import de.bluecolored.bluemap.core.util.Key; + +import java.lang.reflect.Type; + +public interface ResourcePoolMapper { + Key remapResource(Type type, Key src); +} diff --git a/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/ResourcePack.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/ResourcePack.java index 8a3cad5b6..1dbad8792 100644 --- a/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/ResourcePack.java +++ b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/ResourcePack.java @@ -35,6 +35,7 @@ import de.bluecolored.bluemap.core.resources.pack.Pack; import de.bluecolored.bluemap.core.resources.pack.PackVersion; import de.bluecolored.bluemap.core.resources.pack.ResourcePool; +import de.bluecolored.bluemap.core.resources.pack.ResourcePoolMapper; import de.bluecolored.bluemap.core.resources.pack.resourcepack.atlas.Atlas; import de.bluecolored.bluemap.core.resources.pack.resourcepack.blockstate.BlockState; import de.bluecolored.bluemap.core.resources.pack.resourcepack.entitystate.EntityState; @@ -53,6 +54,7 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.Type; import java.nio.file.Files; import java.nio.file.Path; import java.util.HashMap; @@ -63,7 +65,7 @@ import java.util.concurrent.TimeUnit; import java.util.function.Predicate; -public class ResourcePack extends Pack { +public class ResourcePack extends Pack implements ResourcePoolMapper { public interface Extension extends Keyed { Registry> REGISTRY = new Registry<>(); @@ -94,12 +96,12 @@ public interface Extension extends Keyed { public ResourcePack(PackVersion packVersion) { super(packVersion); - this.atlases = new ResourcePool<>(); - this.blockStates = new ResourcePool<>(); - this.entityStates = new ResourcePool<>(); - this.models = new ResourcePool<>(); - this.textures = new ResourcePool<>(); - this.colormaps = new ResourcePool<>(); + this.atlases = new ResourcePool<>(Atlas.class, this); + this.blockStates = new ResourcePool<>(BlockState.class, this); + this.entityStates = new ResourcePool<>(EntityState.class, this); + this.models = new ResourcePool<>(Model.class, this); + this.textures = new ResourcePool<>(Texture.class, this); + this.colormaps = new ResourcePool<>(BufferedImage.class, this); this.colorCalculatorFactory = new BlockColorCalculatorFactory(); this.blockPropertiesConfig = new BlockPropertiesConfig(); @@ -115,6 +117,14 @@ public ResourcePack(PackVersion packVersion) { extensions.put(extensionType, extensionType.create(this)); } + @Override + public Key remapResource(Type type, Key src) { + for (ResourcePackExtension extension : extensions.values()) { + src = extension.remapResource(type, src); + } + return src; + } + @Override public synchronized void loadResources(Iterable roots) throws IOException, InterruptedException { Logger.global.logInfo("Loading resources..."); diff --git a/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/ResourcePackExtension.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/ResourcePackExtension.java index c5af86333..194d265da 100644 --- a/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/ResourcePackExtension.java +++ b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/ResourcePackExtension.java @@ -27,6 +27,7 @@ import de.bluecolored.bluemap.core.resources.pack.PackExtension; import de.bluecolored.bluemap.core.util.Key; +import java.lang.reflect.Type; import java.util.Set; public interface ResourcePackExtension extends PackExtension { @@ -35,4 +36,7 @@ default Set collectUsedTextureKeys() { return Set.of(); } + default Key remapResource(Type type, Key src) { + return src; + } }