Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import com.github.mkram17.bazaarutils.BazaarUtils;
import com.github.mkram17.bazaarutils.config.BUConfig;
import com.github.mkram17.bazaarutils.config.patcher.ConfigPatches;
import com.github.mkram17.bazaarutils.config.util.client.ItemRendererProvider;
import com.github.mkram17.bazaarutils.config.util.client.SlotRendererProvider;
import com.github.mkram17.bazaarutils.utils.Util;
import com.google.gson.JsonObject;
import com.teamresourceful.resourcefulconfig.api.client.ResourcefulConfigScreen;
Expand Down Expand Up @@ -62,6 +64,9 @@ public static ResourcefulConfig register(Configurator configurator) {
"— expected VERSION = " + (PATCHES.size() + 1)
);
}

ItemRendererProvider.register();
SlotRendererProvider.register();

configurator.register(BUConfig.class, event ->
PATCHES.forEach((version, patch) ->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
package com.github.mkram17.bazaarutils.config.util.api;

import com.github.mkram17.bazaarutils.config.util.api.annotations.ItemTag;
import com.teamresourceful.resourcefulconfig.api.annotations.Comment;
import com.teamresourceful.resourcefulconfig.api.annotations.ConfigEntry;
import com.teamresourceful.resourcefulconfig.api.types.ResourcefulConfigElement;
import com.teamresourceful.resourcefulconfig.api.types.elements.ResourcefulConfigEntryElement;
import com.teamresourceful.resourcefulconfig.api.types.entries.ResourcefulConfigEntry;
import com.teamresourceful.resourcefulconfig.api.types.entries.ResourcefulConfigValueEntry;
import com.teamresourceful.resourcefulconfig.api.types.options.EntryType;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.function.Predicate;

public final class ItemElement implements ResourcefulConfigEntryElement {
private final ResourcefulConfigEntryElement delegate;

private final String tag;

private ItemElement(ResourcefulConfigEntryElement delegate, String tag) {
this.delegate = delegate;
this.tag = tag;
}

public static ItemElement wrap(ResourcefulConfigElement element) {
if (!(element instanceof ResourcefulConfigEntryElement entry)) return null;
if (!(entry.entry() instanceof ResourcefulConfigValueEntry value)) return null;
if (!(value.type() == EntryType.STRING)) return null;

Field field = entryField(entry);

if (field == null) return null;

String tag = field.isAnnotationPresent(ItemTag.class) ? field.getAnnotation(ItemTag.class).value() : "";

return new ItemElement(entry, tag);
}

private static Field entryField(ResourcefulConfigEntryElement delegate) {
try {
Method field = delegate.entry().getClass().getDeclaredMethod("field");

field.setAccessible(true);

return (Field) field.invoke(delegate.entry());
} catch (Exception ignored) {
return null;
}
}

public String tag() {
return tag;
}

public ResourcefulConfigValueEntry valueEntry() {
return (ResourcefulConfigValueEntry) delegate.entry();
}

public Text title() {
Field field = entryField();

if (field != null) {
ConfigEntry options = field.getAnnotation(ConfigEntry.class);

if (options != null && !options.translation().isEmpty()) {
return Text.translatable(options.translation());
}
}

return Text.literal(delegate.id());
}

public Text description() {
Field field = entryField();

if (field != null) {
Comment comment = field.getAnnotation(Comment.class);

if (comment != null) {
return !comment.translation().isEmpty()
? Text.translatable(comment.translation())
: Text.literal(comment.value());
}
}

return Text.empty();
}

@Override public ResourcefulConfigEntry entry() {
return delegate.entry();
}

@Override public String id() {
return delegate.id();
}

@Override public Identifier renderer() {
return delegate.renderer();
}

@Override public boolean isHidden() {
return delegate.isHidden();
}

@Override public boolean search(Predicate<String> predicate) {
return delegate.search(predicate);
}

private Field entryField() {
try {
Method field = delegate.entry().getClass().getDeclaredMethod("field");

field.setAccessible(true);

return (Field) field.invoke(delegate.entry());
} catch (Exception ignored) {
return null;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.github.mkram17.bazaarutils.config.util.api;

import net.minecraft.item.Item;
import net.minecraft.registry.Registries;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.registry.tag.TagKey;
import net.minecraft.util.Identifier;
import org.jetbrains.annotations.Nullable;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Predicate;
import java.util.function.Supplier;

public final class ResourcefulConfigItems {
private static final Map<String, Item> RESOLVED_CACHE = new HashMap<>();

public static @Nullable Item resolve(String rawId) {
if (rawId == null || rawId.isEmpty()) return null;

return RESOLVED_CACHE.computeIfAbsent(rawId, id -> {
Identifier identifier = Identifier.tryParse(id);

if (identifier == null) return null;

return source.get().stream()
.filter(item -> Registries.ITEM.getId(item).equals(identifier))
.findFirst()
.orElse(null);
});
}


private static Supplier<List<Item>> source = () -> Registries.ITEM.stream().toList();

public static void setSource(Supplier<List<Item>> source) {
ResourcefulConfigItems.source = source;
}

private static Predicate<Item> globalFilter = item -> true;

public static void addGlobalFilter(Predicate<Item> filter) {
Predicate<Item> existing = ResourcefulConfigItems.globalFilter;
ResourcefulConfigItems.globalFilter = item -> existing.test(item) && filter.test(item);
}


private ResourcefulConfigItems() {}

public static List<Item> getItems(String tag) {
List<Item> base = source.get().stream().filter(globalFilter).toList();
if (tag == null || tag.isEmpty()) return base;
Identifier tagId = Identifier.tryParse(tag);
if (tagId == null) return base;
TagKey<Item> tagKey = TagKey.of(RegistryKeys.ITEM, tagId);
return base.stream().filter(item -> item.getRegistryEntry().isIn(tagKey)).toList();
}

public static List<Item> getItems() {
return getItems("");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
package com.github.mkram17.bazaarutils.config.util.api;

import com.github.mkram17.bazaarutils.config.util.api.annotations.ContainerSlot;
import com.teamresourceful.resourcefulconfig.api.annotations.Comment;
import com.teamresourceful.resourcefulconfig.api.annotations.ConfigEntry;
import com.teamresourceful.resourcefulconfig.api.types.ResourcefulConfigElement;
import com.teamresourceful.resourcefulconfig.api.types.elements.ResourcefulConfigEntryElement;
import com.teamresourceful.resourcefulconfig.api.types.entries.ResourcefulConfigEntry;
import com.teamresourceful.resourcefulconfig.api.types.entries.ResourcefulConfigValueEntry;
import com.teamresourceful.resourcefulconfig.api.types.options.EntryType;
import net.minecraft.text.Text;
import net.minecraft.util.Identifier;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.function.Predicate;

public final class SlotElement implements ResourcefulConfigEntryElement {
private final ResourcefulConfigEntryElement delegate;

private final int rows;
private final int cols;

private final SlotProvider provider;

private SlotElement(ResourcefulConfigEntryElement delegate, int rows, int cols, SlotProvider provider) {
this.delegate = delegate;
this.rows = rows;
this.cols = cols;
this.provider = provider;
}

public static SlotElement wrap(ResourcefulConfigElement element) {
if (!(element instanceof ResourcefulConfigEntryElement entry)) return null;
if (!(entry.entry() instanceof ResourcefulConfigValueEntry value)) return null;
if (value.type() != EntryType.INTEGER) return null;

Field field = entryField(entry);

if (field == null || !field.isAnnotationPresent(ContainerSlot.class)) return null;

ContainerSlot options = field.getAnnotation(ContainerSlot.class);
SlotProvider provider = SlotProviders.get(options.provider());

return new SlotElement(entry, options.rows(), options.cols(), provider);
}

public int rows() {
return rows;
}

public int cols() {
return cols;
}

public int totalSlots() {
return rows * cols;
}

public SlotProvider provider() {
return provider;
}

public ResourcefulConfigValueEntry valueEntry() {
return (ResourcefulConfigValueEntry) delegate.entry();
}

public Text title() {
Field field = entryField(delegate);

if (field != null) {
ConfigEntry options = field.getAnnotation(ConfigEntry.class);

if (options != null && !options.translation().isEmpty()) return Text.translatable(options.translation());
}

return Text.literal(delegate.id());
}

public Text description() {
Field field = entryField(delegate);

if (field != null) {
Comment comment = field.getAnnotation(Comment.class);

if (comment != null) {
return !comment.translation().isEmpty()
? Text.translatable(comment.translation())
: Text.literal(comment.value());
}
}

return Text.empty();
}

@Override public ResourcefulConfigEntry entry() {
return delegate.entry();
}

@Override public String id() {
return delegate.id();
}

@Override public Identifier renderer() {
return delegate.renderer();
}

@Override public boolean isHidden() {
return delegate.isHidden();
}

@Override public boolean search(Predicate<String> predicate) {
return delegate.search(predicate);
}

private static Field entryField(ResourcefulConfigEntryElement delegate) {
try {
Method field = delegate.entry().getClass().getDeclaredMethod("field");

field.setAccessible(true);

return (Field) field.invoke(delegate.entry());
} catch (Exception ignored) {
return null;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.github.mkram17.bazaarutils.config.util.api;

import net.minecraft.item.ItemStack;

@FunctionalInterface
public interface SlotProvider {
ItemStack getStack(int slotIndex);
}
Loading
Loading