Skip to content

Commit

Permalink
Add template factory to help with template provisioning
Browse files Browse the repository at this point in the history
Signed-off-by: TheSilkMiner <thesilkminer@outlook.com>
  • Loading branch information
TheSilkMiner committed May 23, 2022
1 parent 7224841 commit 0a26253
Show file tree
Hide file tree
Showing 8 changed files with 129 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ static ResourceManager get() {
}

ResourceFragment fragment(final ResourceFragment.Key key);
ResourceTemplateHelper templateHelper();

default ResourceFragment fragment(final PackType type, final String id) {
return this.fragment(new ResourceFragment.Key(type, id));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.blamejared.contenttweaker.core.api.resource;

import java.nio.file.Path;
import java.util.Objects;

public interface ResourceTemplateHelper {
@FunctionalInterface
interface Provider {
void provide(final String path, final byte[] data, final ResourceSerializer<byte[]> serializer);
}

void provideFrom(final String templatePath, final String fragmentPath, final Provider provider);
void provideFrom(final Path templatePath, final String fragmentPath, final Provider provider);

default void provideFrom(final String templatePath, final String fragmentPath, final ResourceFragment fragment) {
this.provideFrom(templatePath, fragmentPath, Objects.requireNonNull(fragment)::provideFixed);
}

default void provideFrom(final Path templatePath, final String fragmentPath, final ResourceFragment fragment) {
this.provideFrom(templatePath, fragmentPath, Objects.requireNonNull(fragment)::provideFixed);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.blamejared.contenttweaker.core.ContentTweakerCore;
import com.blamejared.contenttweaker.core.api.resource.ResourceFragment;
import com.blamejared.contenttweaker.core.api.resource.ResourceManager;
import com.blamejared.contenttweaker.core.api.resource.ResourceTemplateHelper;
import net.minecraft.server.packs.PackType;

import java.util.Collection;
Expand All @@ -29,9 +30,11 @@ private <T extends AutoCloseable> void tryClose(final T t) {
}
}

private final TemplateHelper templateHelper;
private final Map<ResourceFragment.Key, RuntimeFragment> fragments;

private RuntimeResourceManager() {
this.templateHelper = TemplateHelper.of();
this.fragments = new HashMap<>();
Runtime.getRuntime().addShutdownHook(new Thread(new Cleaner(this.fragments::values)));
}
Expand All @@ -46,6 +49,11 @@ public ResourceFragment fragment(final ResourceFragment.Key key) {
return this.fragments.computeIfAbsent(key, RuntimeFragment::of);
}

@Override
public ResourceTemplateHelper templateHelper() {
return this.templateHelper;
}

Map<String, RuntimeFragment> fragments(final PackType type) {
return this.fragments.values()
.stream()
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.blamejared.contenttweaker.core.resource;

import com.blamejared.contenttweaker.core.api.resource.ResourceTemplateHelper;
import com.blamejared.contenttweaker.core.api.resource.StandardResourceSerializers;
import com.blamejared.contenttweaker.core.service.ServiceManager;

import java.io.IOException;
import java.io.UncheckedIOException;
import java.lang.annotation.Target;
import java.nio.file.FileSystem;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Objects;

final class TemplateHelper implements ResourceTemplateHelper {
private TemplateHelper() {}

static TemplateHelper of() {
return new TemplateHelper();
}

@Override
public void provideFrom(final String templatePath, final String fragmentPath, final Provider provider) {
Objects.requireNonNull(templatePath);
Objects.requireNonNull(fragmentPath);
Objects.requireNonNull(provider);
try {
final Path base = ServiceManager.platform().locateResource("meta", "template");
final Path target = base.resolve(templatePath);
this.provideFromChecked(target, fragmentPath, provider);
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
}

@Override
public void provideFrom(final Path templatePath, final String fragmentPath, final Provider provider) {
Objects.requireNonNull(templatePath);
Objects.requireNonNull(fragmentPath);
Objects.requireNonNull(provider);
try {
this.provideFromChecked(templatePath, fragmentPath, provider);
} catch (final IOException e) {
throw new UncheckedIOException(e);
}
}

private void provideFromChecked(final Path templatePath, final String fragmentPath, final Provider provider) throws IOException {
if (!Files.exists(templatePath)) {
throw new IOException("Unable to read template " + templatePath + " as it does not exist");
}
final byte[] bytes = Files.readAllBytes(templatePath);
provider.provide(fragmentPath, bytes, StandardResourceSerializers.BYTE_ARRAY);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@

public interface PlatformService {
Path gameDirectory();
Path locateResource(final String... components);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import com.blamejared.contenttweaker.core.api.object.ObjectHolder;
import com.blamejared.contenttweaker.core.api.resource.ResourceFragment;
import com.blamejared.contenttweaker.core.api.resource.ResourceManager;
import com.blamejared.contenttweaker.core.api.resource.ResourceTemplateHelper;
import com.blamejared.contenttweaker.core.api.resource.StandardResourceFragmentKeys;
import com.blamejared.contenttweaker.vanilla.api.resource.ItemModel;
import com.blamejared.contenttweaker.vanilla.api.resource.Language;
Expand Down Expand Up @@ -56,11 +57,11 @@ public ObjectHolder<? extends Item> create(final ResourceLocation name, final Su

@Override
public void provideResources(final ResourceLocation name, final ResourceManager manager) {
final ResourceTemplateHelper templateHelper = manager.templateHelper();
final ResourceFragment cotAssets = manager.fragment(StandardResourceFragmentKeys.CONTENT_TWEAKER_ASSETS);
cotAssets.provideFixed("textures/item/test.png", test, com.blamejared.contenttweaker.core.api.resource.StandardResourceSerializers.BYTE_ARRAY);
cotAssets.provideFixed(PathHelper.itemModel(name), ItemModel.ofGenerated().layer(0, new ResourceLocation("contenttweaker:item/test")), ItemModel.SERIALIZER);
templateHelper.provideFrom("basic_item_texture.png", "textures/item/test.png", cotAssets); // TODO("")
cotAssets.provideFixed(PathHelper.itemModel(name), ItemModel.ofGenerated().layer(0, new ResourceLocation("contenttweaker:item/test")), ItemModel.SERIALIZER); // TODO("")
cotAssets.provideOrAlter(PathHelper.usLang(), Language::of, it -> it.item(name, "Example Item"), Language.SERIALIZER);
// TODO("")
}

private Item build(final Item.Properties properties) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,36 @@
package com.blamejared.contenttweaker.fabric.service;

import com.blamejared.contenttweaker.core.api.ContentTweakerConstants;
import com.blamejared.contenttweaker.core.service.PlatformService;
import net.fabricmc.loader.api.FabricLoader;

import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Objects;

public final class FabricPlatformService implements PlatformService {
@Override
public Path gameDirectory() {
return FabricLoader.getInstance().getGameDir();
}

@Override
public Path locateResource(final String... components) {
Objects.requireNonNull(components);
if (components.length < 1) {
throw new IllegalArgumentException("At least one component required");
}
final List<Path> possiblePaths = FabricLoader.getInstance()
.getModContainer(ContentTweakerConstants.MOD_ID)
.orElseThrow(IllegalStateException::new)
.getRootPaths()
.stream()
.map(it -> it.resolve(String.join("/", components)))
.toList();
return possiblePaths.size() == 1? possiblePaths.get(0) : possiblePaths.stream()
.filter(Files::exists)
.findFirst()
.orElse(possiblePaths.get(0)); // Guaranteed at least one possible root path
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,28 @@
package com.blamejared.contenttweaker.forge.service;

import com.blamejared.contenttweaker.core.api.ContentTweakerConstants;
import com.blamejared.contenttweaker.core.service.PlatformService;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.loading.FMLPaths;

import java.nio.file.Path;
import java.util.Objects;

public final class ForgePlatformService implements PlatformService {
@Override
public Path gameDirectory() {
return FMLPaths.GAMEDIR.get();
}

@Override
public Path locateResource(final String... components) {
Objects.requireNonNull(components);
if (components.length < 1) {
throw new IllegalArgumentException("At least one component required");
}
return ModList.get()
.getModFileById(ContentTweakerConstants.MOD_ID)
.getFile()
.findResource(components);
}
}

0 comments on commit 0a26253

Please sign in to comment.