Skip to content
Draft
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
@@ -0,0 +1,53 @@
package earth.terrarium.heracles.api.client.settings.base;

import earth.terrarium.heracles.Heracles;
import earth.terrarium.heracles.api.client.settings.Setting;
import earth.terrarium.heracles.client.widgets.boxes.OptionalAutocompleteEditBox;
import net.minecraft.Optionull;
import net.minecraft.client.Minecraft;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;

public record OptionalRegistryKeySetting<T>(
ResourceKey<? extends Registry<T>> key
) implements Setting<@Nullable ResourceKey<T>, OptionalAutocompleteEditBox<String>> {

public static final OptionalRegistryKeySetting<Level> DIMENSION = new OptionalRegistryKeySetting<>(Registries.DIMENSION);

@Override
public OptionalAutocompleteEditBox<String> createWidget(int width, ResourceKey<T> value) {
OptionalAutocompleteEditBox<String> box = new OptionalAutocompleteEditBox<>(Minecraft.getInstance().font, 0, 0, width, 11,
(text, item) -> item.contains(text) && !item.equals(text), Function.identity(), s -> {});
box.setMaxLength(Short.MAX_VALUE);
List<String> suggestions = new ArrayList<>();
var registry = Heracles.getRegistryAccess().registry(key).orElse(null);
if (registry == null) {
return box;
}
registry.keySet().stream().map(ResourceLocation::toString).forEach(suggestions::add);
box.setSuggestions(suggestions);

String id = Optionull.map(value, key -> key.location().toString());
box.setValue(id);
return box;
}

@Override
public ResourceKey<T> getValue(OptionalAutocompleteEditBox<String> widget) {
String value = widget.nullableValue();
if (value == null) return null;
ResourceLocation id = ResourceLocation.tryParse(value);
return Optional.ofNullable(id)
.map(ignored -> ResourceKey.create(key, id))
.orElse(null);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public record RegistryKeySetting<T>(
ResourceKey<? extends Registry<T>> key
) implements Setting<ResourceKey<T>, AutocompleteEditBox<String>> {

@Deprecated
public static final RegistryKeySetting<Level> DIMENSION = new RegistryKeySetting<>(Registries.DIMENSION);

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import earth.terrarium.heracles.api.client.settings.CustomizableQuestElementSettings;
import earth.terrarium.heracles.api.client.settings.SettingInitializer;
import earth.terrarium.heracles.api.client.settings.base.OptionalRegistryKeySetting;
import earth.terrarium.heracles.api.client.settings.base.RegistryKeySetting;
import earth.terrarium.heracles.api.tasks.defaults.ChangedDimensionTask;
import net.minecraft.Optionull;
Expand All @@ -15,8 +16,8 @@ public class DimensionTaskSettings implements SettingInitializer<ChangedDimensio
@Override
public CreationData create(@Nullable ChangedDimensionTask object) {
CreationData settings = CustomizableQuestElementSettings.super.create(object);
settings.put("from", RegistryKeySetting.DIMENSION, Optionull.mapOrDefault(object, ChangedDimensionTask::from, Level.OVERWORLD));
settings.put("to", RegistryKeySetting.DIMENSION, Optionull.mapOrDefault(object, ChangedDimensionTask::to, Level.OVERWORLD));
settings.put("from", OptionalRegistryKeySetting.DIMENSION, Optionull.mapOrDefault(object, ChangedDimensionTask::from, Level.OVERWORLD));
settings.put("to", OptionalRegistryKeySetting.DIMENSION, Optionull.mapOrDefault(object, ChangedDimensionTask::to, Level.OVERWORLD));
return settings;
}

Expand All @@ -26,8 +27,8 @@ public ChangedDimensionTask create(String id, @Nullable ChangedDimensionTask obj
id,
title,
icon,
data.get("from", RegistryKeySetting.DIMENSION).orElse(Optionull.map(object, ChangedDimensionTask::from)),
data.get("to", RegistryKeySetting.DIMENSION).orElse(Optionull.map(object, ChangedDimensionTask::to))
data.get("from", OptionalRegistryKeySetting.DIMENSION).orElse(null),
data.get("to", OptionalRegistryKeySetting.DIMENSION).orElse(null)
));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ public void setResponder(@Nullable Consumer<String> responder) {
}

@Override
public void renderWidget(GuiGraphics graphics, int i, int j, float f) {
super.renderWidget(graphics, i, j, f);
public void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) {
super.renderWidget(graphics, mouseX, mouseY, partialTick);
if (!isFocused()) return;
int x = this.getX();
int y = this.getY() + this.getHeight() + 1;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package earth.terrarium.heracles.client.widgets.boxes;

import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.Checkbox;
import net.minecraft.network.chat.CommonComponents;
import org.jetbrains.annotations.Nullable;

import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;

public class OptionalAutocompleteEditBox<T> extends AutocompleteEditBox<T> {
private static final int CHECKBOX_WIDTH = 24;
private final Checkbox checkbox;

public OptionalAutocompleteEditBox(Font font, int x, int y, int width, int height, BiPredicate<String, T> filter, Function<T, String> mapper, Consumer<String> onEnter) {
super(font, x + CHECKBOX_WIDTH, y, width - CHECKBOX_WIDTH, height, filter, mapper, onEnter);
this.checkbox = new Checkbox(x, y, CHECKBOX_WIDTH, height, CommonComponents.EMPTY, false, false);
}

public @Nullable T nullableValue() {
return checkbox.selected() ? this.value() : null;
}

public void setValue(@Nullable String value) {
if (value == null) {
if (checkbox.selected()) checkbox.onPress();
} else {
if (!checkbox.selected()) checkbox.onPress();
super.setValue(value);
}
this.updateEditBoxEditability();
}

private void updateEditBoxEditability() {
this.setEditable(checkbox.selected());
}

@Override
public void renderWidget(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) {
this.checkbox.render(graphics, mouseX, mouseY, partialTick);
super.renderWidget(graphics, mouseX, mouseY, partialTick);
}

@Override
public boolean mouseClicked(double mouseX, double mouseY, int button) {
boolean value = this.checkbox.mouseClicked(mouseX, mouseY, button) | super.mouseClicked(mouseX, mouseY, button);
this.updateEditBoxEditability();
return value;
}

@Override
public boolean isMouseOver(double mouseX, double mouseY) {
return super.isMouseOver(mouseX, mouseY) || this.checkbox.isMouseOver(mouseX, mouseY);
}

@Override
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
boolean value = this.checkbox.keyPressed(keyCode, scanCode, modifiers) | super.keyPressed(keyCode, scanCode, modifiers);
this.updateEditBoxEditability();
return value;
}

@Override
public boolean charTyped(char codePoint, int modifiers) {
return this.checkbox.charTyped(codePoint, modifiers) | super.charTyped(codePoint, modifiers);
}

@Override
public void setX(int x) {
this.checkbox.setX(x);
super.setX(x + CHECKBOX_WIDTH);
}

@Override
public void setY(int y) {
this.checkbox.setY(y);
super.setY(y);
}

@Override
public void setWidth(int width) {
super.setWidth(width - CHECKBOX_WIDTH);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@
"task.heracles.changed_dimension": "\uD83C\uDF0A Changed Dimension",
"task.heracles.changed_dimension.title.singular": "Travel between dimensions",
"task.heracles.changed_dimension.desc.singular": "From %s To %s",
"task.heracles.changed_dimension.desc.dim.any": "Any Dimension",
"setting.heracles.changed_dimension.title": "Title Override:",
"setting.heracles.changed_dimension.icon": "Icon Override:",
"setting.heracles.changed_dimension.from": "From:",
Expand Down