diff --git a/common/src/main/java/net/blay09/mods/waystones/client/WaystonesClient.java b/common/src/main/java/net/blay09/mods/waystones/client/WaystonesClient.java index 0f006f9f..82ae83d5 100644 --- a/common/src/main/java/net/blay09/mods/waystones/client/WaystonesClient.java +++ b/common/src/main/java/net/blay09/mods/waystones/client/WaystonesClient.java @@ -2,9 +2,11 @@ import net.blay09.mods.balm.client.color.block.BalmBlockColorRegistrar; import net.blay09.mods.balm.client.gui.screens.inventory.BalmMenuScreenRegistrar; +import net.blay09.mods.balm.client.platform.config.BalmConfigScreenRegistrar; import net.blay09.mods.balm.client.platform.module.BalmClientModule; import net.blay09.mods.balm.client.renderer.block.model.BalmBlockStateModelRegistrar; import net.blay09.mods.balm.client.renderer.blockentity.BalmBlockEntityRendererRegistrar; +import net.blay09.mods.waystones.client.config.WaystonesConfigScreenFactory; import net.blay09.mods.waystones.Waystones; import net.blay09.mods.waystones.client.requirement.RequirementClientRegistry; import net.blay09.mods.waystones.compat.Compat; @@ -45,6 +47,11 @@ public void registerMenuScreens(BalmMenuScreenRegistrar screens) { ModScreens.initialize(screens); } + @Override + public void registerConfigScreen(BalmConfigScreenRegistrar configScreens) { + configScreens.register(WaystonesConfigScreenFactory::create); + } + @Override public void initialize() { ModClientEventHandlers.initialize(); diff --git a/common/src/main/java/net/blay09/mods/waystones/client/config/MergedIntEditBoxes.java b/common/src/main/java/net/blay09/mods/waystones/client/config/MergedIntEditBoxes.java new file mode 100644 index 00000000..35f455db --- /dev/null +++ b/common/src/main/java/net/blay09/mods/waystones/client/config/MergedIntEditBoxes.java @@ -0,0 +1,99 @@ +package net.blay09.mods.waystones.client.config; + +import net.blay09.mods.balm.client.platform.config.screen.BalmConfigScreenContext; +import net.blay09.mods.balm.client.platform.config.screen.BalmConfigScreenEditBox; +import net.blay09.mods.balm.client.platform.config.screen.BalmConfigScreenRowState; +import net.blay09.mods.balm.platform.config.schema.ConfiguredProperty; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.components.AbstractContainerWidget; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; +import net.minecraft.client.gui.narration.NarrationElementOutput; +import net.minecraft.network.chat.Component; + +import java.util.Collection; +import java.util.List; + +final class MergedIntEditBoxes extends AbstractContainerWidget { + private static final int GAP = 8; + + private final BalmConfigScreenEditBox first; + private final BalmConfigScreenEditBox second; + private final List> children; + + public MergedIntEditBoxes(BalmConfigScreenContext screenContext, + BalmConfigScreenRowState rowState, + ConfiguredProperty firstProperty, + ConfiguredProperty secondProperty) { + super(0, 0, Button.DEFAULT_WIDTH, Button.DEFAULT_HEIGHT, Component.empty()); + + final var state = rowState.getOrCreate(State::new); + first = new BalmConfigScreenEditBox<>(screenContext.font(), firstProperty, screenContext, state.firstRowState); + second = new BalmConfigScreenEditBox<>(screenContext.font(), secondProperty, screenContext, state.secondRowState); + + children = List.of(first, second); + layoutChildren(); + } + + @Override + public void setX(int x) { + super.setX(x); + layoutChildren(); + } + + @Override + public void setY(int y) { + super.setY(y); + layoutChildren(); + } + + @Override + public void setWidth(int width) { + super.setWidth(width); + layoutChildren(); + } + + @Override + public void setHeight(int height) { + super.setHeight(height); + layoutChildren(); + } + + private void layoutChildren() { + final var editBoxWidth = Math.max(1, (width - GAP) / 2); + first.setPosition(getX(), getY()); + first.setSize(editBoxWidth, height); + second.setPosition(getX() + editBoxWidth + GAP, getY()); + second.setSize(width - editBoxWidth - GAP, height); + } + + @Override + public List children() { + return children; + } + + @Override + protected void extractWidgetRenderState(GuiGraphicsExtractor graphics, int mouseX, int mouseY, float partialTick) { + first.active = active; + second.active = active; + first.visible = visible; + second.visible = visible; + first.extractRenderState(graphics, mouseX, mouseY, partialTick); + second.extractRenderState(graphics, mouseX, mouseY, partialTick); + } + + @Override + protected int contentHeight() { + return height; + } + + @Override + protected void updateWidgetNarration(NarrationElementOutput output) { + } + + private static final class State { + private final BalmConfigScreenRowState firstRowState = new BalmConfigScreenRowState(); + private final BalmConfigScreenRowState secondRowState = new BalmConfigScreenRowState(); + } +} diff --git a/common/src/main/java/net/blay09/mods/waystones/client/config/WarpRequirementListEditorEntry.java b/common/src/main/java/net/blay09/mods/waystones/client/config/WarpRequirementListEditorEntry.java new file mode 100644 index 00000000..783d260b --- /dev/null +++ b/common/src/main/java/net/blay09/mods/waystones/client/config/WarpRequirementListEditorEntry.java @@ -0,0 +1,108 @@ +package net.blay09.mods.waystones.client.config; + +import net.blay09.mods.balm.client.platform.config.screen.list.BalmConfigListEditorContext; +import net.blay09.mods.balm.client.platform.config.screen.list.BalmConfigListEditorEntry; +import net.blay09.mods.balm.client.platform.config.screen.list.internal.BalmConfigListEditorValue; +import net.blay09.mods.shogi.common.util.ShogiExpressionHighlighter; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphicsExtractor; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import org.jspecify.annotations.Nullable; + +import java.util.Objects; + +public class WarpRequirementListEditorEntry extends BalmConfigListEditorEntry { + private static final Component EDIT_LABEL = Component.translatable("gui.balm.configuration.edit"); + private static final Component DELETE_LABEL = Component.translatable("gui.balm.configuration.delete"); + private static final Component RESET_LABEL = Component.translatable("gui.balm.configuration.reset"); + + private final Button editButton; + private final Button deleteButton; + private final Button resetButton; + + public WarpRequirementListEditorEntry(BalmConfigListEditorContext context, BalmConfigListEditorValue valueHolder) { + super(context, valueHolder); + editButton = Button.builder(EDIT_LABEL, this::onEditButton) + .size(ACTION_BUTTON_WIDTH, ACTION_BUTTON_HEIGHT) + .build(); + deleteButton = Button.builder(DELETE_LABEL, this::onDeleteButton) + .size(ACTION_BUTTON_WIDTH, ACTION_BUTTON_HEIGHT) + .build(); + resetButton = Button.builder(RESET_LABEL, this::onResetButton) + .size(ACTION_BUTTON_WIDTH, ACTION_BUTTON_HEIGHT) + .build(); + addActionWidget(editButton); + addActionWidget(deleteButton); + addActionWidget(resetButton); + } + + @Override + public void startEditing(@Nullable Object initialValue) { + final var value = initialValue != null ? String.valueOf(initialValue) : Objects.requireNonNullElse(valueHolder.value(), ""); + openRuleEditor(value); + } + + @Override + protected void extractEntryContent(GuiGraphicsExtractor graphics, int mouseX, int mouseY, boolean hovered, float partialTick) { + final var value = Objects.requireNonNullElse(valueHolder.value(), ""); + final var textWidth = Math.max(1, getContentRightBeforeActions() - getContentLeftAfterDragHandle()); + final var label = context.font().plainSubstrByWidth(value, textWidth); + graphics.text(context.font(), + ShogiExpressionHighlighter.highlightComponent(label), + getContentLeftAfterDragHandle(), + getContentY() + 5, + 0xFFFFFFFF); + } + + @Override + protected void updateActionWidgets() { + editButton.active = canEdit(); + deleteButton.active = canDelete(); + resetButton.visible = canReset(); + resetButton.active = canReset(); + } + + private boolean canEdit() { + return true; + } + + private void onEditButton(Button button) { + if (canEdit()) { + startEditing(null); + } + } + + private boolean canDelete() { + return true; + } + + private void onDeleteButton(Button button) { + if (canDelete()) { + context.delete(this); + } + } + + private boolean canReset() { + return valueHolder.originalValue() != null && !Objects.equals(valueHolder.value(), valueHolder.originalValue()); + } + + private void onResetButton(Button button) { + if (canReset()) { + valueHolder.reset(); + context.revalidate(); + } + } + + private void openRuleEditor(String value) { + final Screen parent = context instanceof Screen screen ? screen : null; + Minecraft.getInstance().gui.setScreen(new WarpRequirementRuleEditScreen(parent, + value, + newValue -> { + valueHolder.value(newValue); + context.revalidate(); + context.commit(); + })); + } +} diff --git a/common/src/main/java/net/blay09/mods/waystones/client/config/WarpRequirementRuleEditScreen.java b/common/src/main/java/net/blay09/mods/waystones/client/config/WarpRequirementRuleEditScreen.java new file mode 100644 index 00000000..fc5d837d --- /dev/null +++ b/common/src/main/java/net/blay09/mods/waystones/client/config/WarpRequirementRuleEditScreen.java @@ -0,0 +1,95 @@ +package net.blay09.mods.waystones.client.config; + +import net.blay09.mods.shogi.client.gui.RuleEditBox; +import net.blay09.mods.waystones.config.WaystonesRules; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.StringWidget; +import net.minecraft.client.gui.layouts.FrameLayout; +import net.minecraft.client.gui.layouts.HeaderAndFooterLayout; +import net.minecraft.client.gui.layouts.LinearLayout; +import net.minecraft.client.gui.screens.ConfirmLinkScreen; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.input.KeyEvent; +import net.minecraft.network.chat.CommonComponents; +import net.minecraft.network.chat.Component; +import org.jspecify.annotations.Nullable; + +import java.util.function.Consumer; + +public class WarpRequirementRuleEditScreen extends Screen { + private static final String HELP_URL = "https://mods.twelveiterations.com/minecraft/waystones/guides/warp-rules"; + private static final Component TITLE = Component.translatable("waystones.configuration.rules.warpRequirements.edit"); + private static final Component PLACEHOLDER = Component.translatable("waystones.configuration.rules.warpRequirements.placeholder"); + private static final Component HELP_LABEL = Component.translatable("waystones.configuration.rules.warpRequirements.help"); + + private final @Nullable Screen parent; + private final String initialValue; + private final Consumer valueConsumer; + private final HeaderAndFooterLayout layout = new HeaderAndFooterLayout(this, 28, 33); + + private @Nullable RuleEditBox ruleEditBox; + + public WarpRequirementRuleEditScreen(@Nullable Screen parent, String initialValue, Consumer valueConsumer) { + super(TITLE); + this.parent = parent; + this.initialValue = initialValue; + this.valueConsumer = valueConsumer; + } + + @Override + protected void init() { + final var header = layout.addToHeader(LinearLayout.vertical()); + header.defaultCellSetting().alignHorizontallyCenter(); + header.addChild(new StringWidget(title, font)); + + ruleEditBox = RuleEditBox.builder() + .setScope(WaystonesRules.scope) + .setPlaceholder(PLACEHOLDER) + .build(font, Math.max(1, width - 40), Math.max(1, height - layout.getHeaderHeight() - layout.getFooterHeight() - 20), title); + ruleEditBox.setCharacterLimit(2048); + ruleEditBox.setValue(initialValue); + + layout.addToContents(new FrameLayout()).addChild(ruleEditBox); + + final var footer = layout.addToFooter(LinearLayout.horizontal().spacing(8)); + footer.addChild(Button.builder(HELP_LABEL, ConfirmLinkScreen.confirmLink(this, HELP_URL)).build()); + footer.addChild(Button.builder(CommonComponents.GUI_DONE, _ -> saveAndClose()).build()); + footer.addChild(Button.builder(CommonComponents.GUI_CANCEL, _ -> onClose()).build()); + layout.visitWidgets(this::addRenderableWidget); + repositionElements(); + setInitialFocus(ruleEditBox); + } + + @Override + protected void repositionElements() { + layout.arrangeElements(); + if (ruleEditBox != null) { + ruleEditBox.setX(20); + ruleEditBox.setY(layout.getHeaderHeight() + 10); + ruleEditBox.setWidth(Math.max(1, width - 40)); + ruleEditBox.setHeight(Math.max(1, height - layout.getHeaderHeight() - layout.getFooterHeight() - 20)); + } + } + + @Override + public boolean keyPressed(KeyEvent event) { + if (event.isEscape()) { + onClose(); + return true; + } + + return super.keyPressed(event); + } + + @Override + public void onClose() { + minecraft.gui.setScreen(parent); + } + + private void saveAndClose() { + if (ruleEditBox != null) { + valueConsumer.accept(ruleEditBox.getValue()); + } + onClose(); + } +} diff --git a/common/src/main/java/net/blay09/mods/waystones/client/config/WarpRequirementsConfigEntry.java b/common/src/main/java/net/blay09/mods/waystones/client/config/WarpRequirementsConfigEntry.java new file mode 100644 index 00000000..9851f9eb --- /dev/null +++ b/common/src/main/java/net/blay09/mods/waystones/client/config/WarpRequirementsConfigEntry.java @@ -0,0 +1,44 @@ +package net.blay09.mods.waystones.client.config; + +import net.blay09.mods.balm.client.platform.config.screen.BalmConfigScreen; +import net.blay09.mods.balm.client.platform.config.screen.BalmConfigScreenLabeledEntry; +import net.blay09.mods.balm.client.platform.config.screen.list.BalmConfigListEditorScreen; +import net.blay09.mods.balm.platform.config.schema.ConfiguredProperty; +import net.blay09.mods.balm.platform.config.util.ConfigLocalization; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.Button; +import net.minecraft.network.chat.Component; +import org.jspecify.annotations.Nullable; + +import java.util.List; +import java.util.Locale; + +public class WarpRequirementsConfigEntry extends BalmConfigScreenLabeledEntry { + + private final ConfiguredProperty> property; + + public WarpRequirementsConfigEntry(BalmConfigScreen screen, ConfiguredProperty> property) { + super(screen, + Component.translatable(ConfigLocalization.forProperty(property)), + Component.translatable(ConfigLocalization.forPropertyTooltip(property)), + Button.builder( + Component.translatable("gui.balm.configuration.list.items", screen.bindingFor(property).get().size()), + _ -> Minecraft.getInstance().gui.setScreen(createListEditor(screen, property))) + .width(Button.DEFAULT_WIDTH) + .build()); + this.property = property; + } + + @Override + protected @Nullable Component getValidationError() { + return context.getValidationError(property); + } + + private static BalmConfigListEditorScreen createListEditor(BalmConfigScreen screen, ConfiguredProperty> property) { + final var binding = screen.bindingFor(property); + return BalmConfigListEditorScreen.builder(screen, screen, binding) + .customizeEntries(WarpRequirementListEditorEntry::new) + .searchable((value, filter) -> value.toLowerCase(Locale.ROOT).contains(filter)) + .build(); + } +} diff --git a/common/src/main/java/net/blay09/mods/waystones/client/config/WaystonesConfigScreenFactory.java b/common/src/main/java/net/blay09/mods/waystones/client/config/WaystonesConfigScreenFactory.java new file mode 100644 index 00000000..87385f4e --- /dev/null +++ b/common/src/main/java/net/blay09/mods/waystones/client/config/WaystonesConfigScreenFactory.java @@ -0,0 +1,114 @@ +package net.blay09.mods.waystones.client.config; + +import net.blay09.mods.balm.Balm; +import net.blay09.mods.balm.client.platform.config.screen.BalmConfigScreen; +import net.blay09.mods.balm.client.platform.config.screen.BalmConfigScreenSearch; +import net.blay09.mods.balm.platform.config.schema.BalmConfigSchema; +import net.blay09.mods.balm.platform.config.schema.ConfiguredProperty; +import net.blay09.mods.waystones.Waystones; +import net.blay09.mods.waystones.config.WaystonesConfig; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; + +import java.util.List; +import java.util.Objects; + +public class WaystonesConfigScreenFactory { + + public static Screen create(Screen parent) { + final var schema = Balm.config().getSchema(WaystonesConfig.class); + if (schema == null) { + return BalmConfigScreen.forMod(parent, Waystones.MOD_ID); + } + + final var journeyMapEnabled = booleanProperty(schema, "journeyMap", "enabled"); + final var blueMapEnabled = booleanProperty(schema, "blueMap", "enabled"); + + final var warpRequirements = stringListProperty(schema, "rules", "warpRequirements"); + + return BalmConfigScreen.builder(Waystones.MOD_ID) + .section(section("gameplay"), it -> it.properties(List.of( + property(schema, "rules", "defaultVisibility"), + property(schema, "rules", "allowEveryoneToManageGlobalWaystones"), + property(schema, "rules", "enableModifiers")))) + .section(section("costs"), it -> it.properties(List.of( + property(schema, "rules", "enableXpCosts"), + property(schema, "rules", "enableDurability"), + property(schema, "rules", "enableCooldowns"), + property(schema, "rules", "warpSettings"))) + .customEntry(warpRequirements, (screen, _) -> new WarpRequirementsConfigEntry(screen, warpRequirements), + filter -> BalmConfigScreenSearch.propertyMatches(warpRequirements, filter))) + .section(section("entities"), it -> it.properties(List.of( + property(schema, "rules", "transportPets"), + property(schema, "rules", "transportLeashed"), + property(schema, "rules", "entityDenyList")))) + .section(category("inventoryButton"), it -> it.properties(List.of( + property(schema, "inventoryButton", "inventoryButton"))) + .mergedProperties(positionLabel("inventoryButton"), positionTooltip("inventoryButton"), List.of( + intProperty(schema, "inventoryButton", "inventoryButtonX"), + intProperty(schema, "inventoryButton", "inventoryButtonY")), + (screen, _, rowState) -> new MergedIntEditBoxes( + screen, + rowState, + intProperty(schema, "inventoryButton", "inventoryButtonX"), + intProperty(schema, "inventoryButton", "inventoryButtonY"))) + .mergedProperties(positionLabel("creativeInventoryButton"), positionTooltip("creativeInventoryButton"), List.of( + intProperty(schema, "inventoryButton", "creativeInventoryButtonX"), + intProperty(schema, "inventoryButton", "creativeInventoryButtonY")), + (screen, _, rowState) -> new MergedIntEditBoxes( + screen, + rowState, + intProperty(schema, "inventoryButton", "creativeInventoryButtonX"), + intProperty(schema, "inventoryButton", "creativeInventoryButtonY")))) + .section(category("worldGen"), it -> it.properties(categoryProperties(schema, "worldGen"))) + .section(category("client"), it -> it.properties(categoryProperties(schema, "client"))) + .section(section("mapIntegrations"), it -> it + .property(journeyMapEnabled) + .property(property(schema, "journeyMap", "preferJourneyMapIntegrationMod"), context -> context.valueFor(journeyMapEnabled)) + .property(property(schema, "dynmap", "enabled")) + .property(blueMapEnabled) + .property(property(schema, "blueMap", "includeWaystones"), context -> context.valueFor(blueMapEnabled)) + .property(property(schema, "blueMap", "includeSharestones"), context -> context.valueFor(blueMapEnabled)) + .property(property(schema, "blueMap", "includeUndiscoveredWaystones"), context -> context.valueFor(blueMapEnabled))) + .build(parent); + } + + private static List> categoryProperties(BalmConfigSchema schema, String category) { + return Objects.requireNonNull(schema.findCategory(category)).properties(); + } + + private static ConfiguredProperty property(BalmConfigSchema schema, String category, String property) { + return schema.findProperty(category, property); + } + + @SuppressWarnings("unchecked") + private static ConfiguredProperty intProperty(BalmConfigSchema schema, String category, String property) { + return (ConfiguredProperty) schema.findProperty(category, property); + } + + @SuppressWarnings("unchecked") + private static ConfiguredProperty> stringListProperty(BalmConfigSchema schema, String category, String property) { + return (ConfiguredProperty>) schema.findProperty(category, property); + } + + @SuppressWarnings("unchecked") + private static ConfiguredProperty booleanProperty(BalmConfigSchema schema, String category, String property) { + return (ConfiguredProperty) schema.findProperty(category, property); + } + + private static Component category(String category) { + return Component.translatable("waystones.configuration." + category); + } + + private static Component positionLabel(String property) { + return Component.translatable("waystones.configuration.inventoryButton." + property + "Position"); + } + + private static Component positionTooltip(String property) { + return Component.translatable("waystones.configuration.inventoryButton." + property + "Position.tooltip"); + } + + private static Component section(String section) { + return Component.translatable("waystones.configuration.screen." + section); + } +} diff --git a/common/src/main/resources/assets/waystones/lang/en_us.json b/common/src/main/resources/assets/waystones/lang/en_us.json index 4ffc479c..454b0a76 100644 --- a/common/src/main/resources/assets/waystones/lang/en_us.json +++ b/common/src/main/resources/assets/waystones/lang/en_us.json @@ -235,10 +235,14 @@ "commands.waystones.twinbound.no_space": "%s needs a free inventory slot for a Twinbound Feather", "commands.waystones.waystone_not_found": "Waystone not found at this position", "waystones.configuration.title": "Waystones", + "waystones.configuration.screen.gameplay": "Gameplay", + "waystones.configuration.screen.costs": "Costs", + "waystones.configuration.screen.entities": "Entities", + "waystones.configuration.screen.mapIntegrations": "Map Integrations", "waystones.configuration.rules": "Rules", "waystones.configuration.rules.allowEveryoneToManageGlobalWaystones": "Allow Global Waystones for Everyone", "waystones.configuration.rules.allowEveryoneToManageGlobalWaystones.tooltip": "Set to true to allow everyone to manage global waystones.", - "waystones.configuration.rules.defaultVisibility": "Default Visibilities", + "waystones.configuration.rules.defaultVisibility": "Default Visibility", "waystones.configuration.rules.defaultVisibility.tooltip": "Set to \"GLOBAL\" to have newly placed or found waystones be global by default.", "waystones.configuration.rules.enableXpCosts": "Enable XP Costs", "waystones.configuration.rules.enableXpCosts.tooltip": "Set to false to simply disable all xp costs. See warpRequirements for more fine-grained control.", @@ -252,6 +256,9 @@ "waystones.configuration.rules.warpSettings.tooltip": "List of variables used in the warpRequirements configuration.", "waystones.configuration.rules.warpRequirements": "Warp Requirements", "waystones.configuration.rules.warpRequirements.tooltip": "List of warp requirements in Shogi format.", + "waystones.configuration.rules.warpRequirements.edit": "Edit Warp Requirement", + "waystones.configuration.rules.warpRequirements.help": "Help", + "waystones.configuration.rules.warpRequirements.placeholder": "Enter a warp requirement in Shogi format...", "waystones.configuration.rules.transportPets": "Transport Pets", "waystones.configuration.rules.transportPets.tooltip": "Set to ENABLED to have nearby pets teleport with you. Set to SAME_DIMENSION to have nearby pets teleport with you only if you're not changing dimensions. Set to DISABLED to disable.", "waystones.configuration.rules.transportLeashed": "Transport Leashed", @@ -261,10 +268,14 @@ "waystones.configuration.inventoryButton": "Inventory Button", "waystones.configuration.inventoryButton.inventoryButton": "Inventory Button Mode", "waystones.configuration.inventoryButton.inventoryButton.tooltip": "Set to 'NONE' for no inventory button. Set to 'NEAREST' for an inventory button that teleports to the nearest waystone. Set to 'ANY' for an inventory button that opens the waystone selection menu. Set to a waystone name for an inventory button that teleports to a specifically named waystone.", + "waystones.configuration.inventoryButton.inventoryButtonPosition": "Warp Button Position", + "waystones.configuration.inventoryButton.inventoryButtonPosition.tooltip": "The x and y position of the inventory button in the inventory.", "waystones.configuration.inventoryButton.inventoryButtonX": "Warp Button X Position", "waystones.configuration.inventoryButton.inventoryButtonX.tooltip": "The x position of the inventory button in the inventory.", "waystones.configuration.inventoryButton.inventoryButtonY": "Warp Button Y Position", "waystones.configuration.inventoryButton.inventoryButtonY.tooltip": "The y position of the inventory button in the inventory.", + "waystones.configuration.inventoryButton.creativeInventoryButtonPosition": "Creative Mode Warp Button Position", + "waystones.configuration.inventoryButton.creativeInventoryButtonPosition.tooltip": "The x and y position of the inventory button in the creative menu.", "waystones.configuration.inventoryButton.creativeInventoryButtonX": "Creative Mode Warp Button X Position", "waystones.configuration.inventoryButton.creativeInventoryButtonX.tooltip": "The x position of the inventory button in the creative menu.", "waystones.configuration.inventoryButton.creativeInventoryButtonY": "Creative Mode Warp Button Y Position", @@ -292,7 +303,7 @@ "waystones.configuration.journeyMap": "JourneyMap Integration", "waystones.configuration.journeyMap.enabled": "Enable JourneyMap Support", "waystones.configuration.journeyMap.enabled.tooltip": "If enabled, JourneyMap waypoints will be created for each activated waystone.", - "waystones.configuration.journeyMap.preferJourneyMapIntegrationMod": "Prefer 'JourneyMap Integration' mod", + "waystones.configuration.journeyMap.preferJourneyMapIntegrationMod": " ┗ Prefer 'JourneyMap Integration' mod", "waystones.configuration.journeyMap.preferJourneyMapIntegrationMod.tooltip": "If enabled, JourneyMap waypoints will only be created if the mod 'JourneyMap Integration' is not installed.", "waystones.configuration.dynmap": "Dynmap Integration", "waystones.configuration.dynmap.enabled": "Enable Dynmap Support", @@ -300,11 +311,11 @@ "waystones.configuration.blueMap": "BlueMap Integration", "waystones.configuration.blueMap.enabled": "Enable BlueMap Support", "waystones.configuration.blueMap.enabled.tooltip": "Controls whether Waystones' BlueMap integration should be loaded", - "waystones.configuration.blueMap.includeWaystones": "Include Waystones", + "waystones.configuration.blueMap.includeWaystones": " ┗ Include Waystones", "waystones.configuration.blueMap.includeWaystones.tooltip": "If enabled, waystones will be tracked as markers on BlueMap", - "waystones.configuration.blueMap.includeSharestones": "Include Sharestones", + "waystones.configuration.blueMap.includeSharestones": " ┗ Include Sharestones", "waystones.configuration.blueMap.includeSharestones.tooltip": "If enabled, sharestones will be tracked as markers on BlueMap", - "waystones.configuration.blueMap.includeUndiscoveredWaystones": "Include Undiscovered Waystones", + "waystones.configuration.blueMap.includeUndiscoveredWaystones": " ┗ Include Undiscovered Waystones", "waystones.configuration.blueMap.includeUndiscoveredWaystones.tooltip": "If enabled, undiscovered waystones will be tracked as markers on BlueMap", "waystones.iconCredits": "Icons by JoeCreates (CC-BY-SA 3.0)", "waystones.map.untitled_waystone": "Untitled Waystone", diff --git a/common/src/main/resources/assets/waystones/lang/ja_jp.json b/common/src/main/resources/assets/waystones/lang/ja_jp.json index 72cd3f88..19b149eb 100644 --- a/common/src/main/resources/assets/waystones/lang/ja_jp.json +++ b/common/src/main/resources/assets/waystones/lang/ja_jp.json @@ -292,7 +292,7 @@ "waystones.configuration.journeyMap": "JourneyMap 連携", "waystones.configuration.journeyMap.enabled": "JourneyMap サポートを有効化", "waystones.configuration.journeyMap.enabled.tooltip": "有効にすると、活性化した転移ポイントごとに JourneyMap のウェイポイントが作成されます。", - "waystones.configuration.journeyMap.preferJourneyMapIntegrationMod": "JourneyMap Integration Modを優先する", + "waystones.configuration.journeyMap.preferJourneyMapIntegrationMod": " ┗ JourneyMap Integration Modを優先する", "waystones.configuration.journeyMap.preferJourneyMapIntegrationMod.tooltip": "有効にすると、「JourneyMap Integration」Modが導入されていない場合のみ、この機能によるウェイポイントの自動作成を行います。", "waystones.configuration.dynmap": "Dynmap 連携", "waystones.configuration.dynmap.enabled": "Dynmap サポートを有効化", @@ -300,11 +300,11 @@ "waystones.configuration.blueMap": "BlueMap 連携", "waystones.configuration.blueMap.enabled": "BlueMap サポートを有効化", "waystones.configuration.blueMap.enabled.tooltip": "WaystonesによるBlueMap連携機能をロードするかどうかを制御します。", - "waystones.configuration.blueMap.includeWaystones": "転移ポイントを含める", + "waystones.configuration.blueMap.includeWaystones": " ┗ 転移ポイントを含める", "waystones.configuration.blueMap.includeWaystones.tooltip": "有効にすると、転移ポイントがBlueMap上でマーカーとして追跡されます。", - "waystones.configuration.blueMap.includeSharestones": "共有転移ポイントを含める", + "waystones.configuration.blueMap.includeSharestones": " ┗ 共有転移ポイントを含める", "waystones.configuration.blueMap.includeSharestones.tooltip": "有効にすると、共有転移ポイントがBlueMap上でマーカーとして追跡されます。", - "waystones.configuration.blueMap.includeUndiscoveredWaystones": "未発見の転移ポイントも含める", + "waystones.configuration.blueMap.includeUndiscoveredWaystones": " ┗ 未発見の転移ポイントも含める", "waystones.configuration.blueMap.includeUndiscoveredWaystones.tooltip": "有効にすると、まだ発見されていない転移ポイントもBlueMap上でマーカーとして追跡されます。", "waystones.iconCredits": "Icons by JoeCreates (CC-BY-SA 3.0)", "waystones.map.untitled_waystone": "転移ポイント(名称未設定)", diff --git a/common/src/main/resources/assets/waystones/lang/ru_ru.json b/common/src/main/resources/assets/waystones/lang/ru_ru.json index 3daafbb4..cf5144d3 100644 --- a/common/src/main/resources/assets/waystones/lang/ru_ru.json +++ b/common/src/main/resources/assets/waystones/lang/ru_ru.json @@ -208,7 +208,7 @@ "waystones.configuration.journeyMap": "Интеграция с JourneyMap", "waystones.configuration.journeyMap.enabled": "Включить поддержку JourneyMap", "waystones.configuration.journeyMap.enabled.tooltip": "Если включено, путевые точки JourneyMap будут создаваться для каждого активированного путеводного обелиска.", - "waystones.configuration.journeyMap.preferJourneyMapIntegrationMod": "Предпочитать мод 'JourneyMap Integration'", + "waystones.configuration.journeyMap.preferJourneyMapIntegrationMod": " ┗ Предпочитать мод 'JourneyMap Integration'", "waystones.configuration.journeyMap.preferJourneyMapIntegrationMod.tooltip": "Если включено, путевые точки JourneyMap будут создаваться только в том случае, если мод 'JourneyMap Integration' не установлен.", "waystones.configuration.dynmap": "Интеграция с Dynmap", "waystones.configuration.dynmap.enabled": "Включить поддержку Dynmap", @@ -216,11 +216,11 @@ "waystones.configuration.blueMap": "Интеграция с BlueMap", "waystones.configuration.blueMap.enabled": "Включить поддержку BlueMap", "waystones.configuration.blueMap.enabled.tooltip": "Управляет тем, должна ли загружаться интеграция Waystones с BlueMap.", - "waystones.configuration.blueMap.includeWaystones": "Включать путеводные обелиски", + "waystones.configuration.blueMap.includeWaystones": " ┗ Включать путеводные обелиски", "waystones.configuration.blueMap.includeWaystones.tooltip": "Если включено, путеводные обелиски будут отслеживаться как маркеры на BlueMap.", - "waystones.configuration.blueMap.includeSharestones": "Включать общие обелиски", + "waystones.configuration.blueMap.includeSharestones": " ┗ Включать общие обелиски", "waystones.configuration.blueMap.includeSharestones.tooltip": "Если включено, общие обелиски будут отслеживаться как маркеры на BlueMap.", - "waystones.configuration.blueMap.includeUndiscoveredWaystones": "Включать неоткрытые путеводные обелиски", + "waystones.configuration.blueMap.includeUndiscoveredWaystones": " ┗ Включать неоткрытые путеводные обелиски", "waystones.configuration.blueMap.includeUndiscoveredWaystones.tooltip": "Если включено, неоткрытые путеводные обелиски будут отслеживаться как маркеры на BlueMap.", "waystones.iconCredits": "Иконки сделаны JoeCreates (CC-BY-SA 3.0)", "waystones.map.untitled_waystone": "Безымянный путеводный обелиск", diff --git a/common/src/main/resources/assets/waystones/lang/uk_ua.json b/common/src/main/resources/assets/waystones/lang/uk_ua.json index acc14053..eab35cf6 100644 --- a/common/src/main/resources/assets/waystones/lang/uk_ua.json +++ b/common/src/main/resources/assets/waystones/lang/uk_ua.json @@ -208,7 +208,7 @@ "waystones.configuration.journeyMap": "інтеграція JourneyMap", "waystones.configuration.journeyMap.enabled": "Увімкнути підтримку JourneyMap", "waystones.configuration.journeyMap.enabled.tooltip": "Якщо ввімкнено, для кожної активованої точки на мапі будуть створені точки JourneyMap.", - "waystones.configuration.journeyMap.preferJourneyMapIntegrationMod": "Надати перевагу моду «JourneyMap Integration»", + "waystones.configuration.journeyMap.preferJourneyMapIntegrationMod": " ┗ Надати перевагу моду «JourneyMap Integration»", "waystones.configuration.journeyMap.preferJourneyMapIntegrationMod.tooltip": "Якщо ввімкнено, маршрутні JourneyMap створюватимуться лише у тому випадку, якщо не встановлено мод «JourneyMap Integration».", "waystones.configuration.dynmap": "Інтеграція Dynmap", "waystones.configuration.dynmap.enabled": "Увімкнути підтримку Dynmap", @@ -216,11 +216,11 @@ "waystones.configuration.blueMap": "BlueMap", "waystones.configuration.blueMap.enabled": "Увімкнути підтримку BlueMap", "waystones.configuration.blueMap.enabled.tooltip": "Керує тим, чи слід завантажувати інтеграцію BlueMap Waystones", - "waystones.configuration.blueMap.includeWaystones": "Уключати дороговкази", + "waystones.configuration.blueMap.includeWaystones": " ┗ Уключати дороговкази", "waystones.configuration.blueMap.includeWaystones.tooltip": "Якщо ввімкнено, дороговкази відстежуватимуться як маркери BlueMap.", - "waystones.configuration.blueMap.includeSharestones": "Уключати спільні камені", + "waystones.configuration.blueMap.includeSharestones": " ┗ Уключати спільні камені", "waystones.configuration.blueMap.includeSharestones.tooltip": "Якщо ввімкнено, спільні камені відстежуватимуться як маркери BlueMap.", - "waystones.configuration.blueMap.includeUndiscoveredWaystones": "Уключати невідкриті дороговкази", + "waystones.configuration.blueMap.includeUndiscoveredWaystones": " ┗ Уключати невідкриті дороговкази", "waystones.configuration.blueMap.includeUndiscoveredWaystones.tooltip": "Якщо ввімкнено, невідкриті дороговкази відстежуватимуться як маркери BlueMap.", "waystones.iconCredits": "Значки від JoeCreates (CC-BY-SA 3.0)", "waystones.map.untitled_waystone": "Дороговказ без назви", diff --git a/common/src/main/resources/assets/waystones/lang/zh_cn.json b/common/src/main/resources/assets/waystones/lang/zh_cn.json index 2d28ee21..afad9dfd 100644 --- a/common/src/main/resources/assets/waystones/lang/zh_cn.json +++ b/common/src/main/resources/assets/waystones/lang/zh_cn.json @@ -288,7 +288,7 @@ "waystones.configuration.journeyMap": "JourneyMap 集成", "waystones.configuration.journeyMap.enabled": "启用 JourneyMap 支持", "waystones.configuration.journeyMap.enabled.tooltip": "启用后激活传送石碑会自动创建 JourneyMap 的导航点", - "waystones.configuration.journeyMap.preferJourneyMapIntegrationMod": "倾向于 JourneyMap Integration 模组", + "waystones.configuration.journeyMap.preferJourneyMapIntegrationMod": " ┗ 倾向于 JourneyMap Integration 模组", "waystones.configuration.journeyMap.preferJourneyMapIntegrationMod.tooltip": "启用后在未安装 JourneyMap Integration 模组时才会创建 JourneyMap 的导航点", "waystones.configuration.dynmap": "Dynmap 集成", "waystones.configuration.dynmap.enabled": "启用 Dynmap 支持", @@ -296,11 +296,11 @@ "waystones.configuration.blueMap": "BlueMap 集成", "waystones.configuration.blueMap.enabled": "启用 BlueMap 支持", "waystones.configuration.blueMap.enabled.tooltip": "控制是否加载传送石碑的BlueMap适配", - "waystones.configuration.blueMap.includeWaystones": "包括传送石碑", + "waystones.configuration.blueMap.includeWaystones": " ┗ 包括传送石碑", "waystones.configuration.blueMap.includeWaystones.tooltip": "开启后在BlueMap中标记所有传送石碑位置", - "waystones.configuration.blueMap.includeSharestones": "包括共享石碑", + "waystones.configuration.blueMap.includeSharestones": " ┗ 包括共享石碑", "waystones.configuration.blueMap.includeSharestones.tooltip": "开启后在BlueMap中标记所有共享石碑位置", - "waystones.configuration.blueMap.includeUndiscoveredWaystones": "包括未发现的传送石碑", + "waystones.configuration.blueMap.includeUndiscoveredWaystones": " ┗ 包括未发现的传送石碑", "waystones.configuration.blueMap.includeUndiscoveredWaystones.tooltip": "开启后在BlueMap中标记所有未发现的传送石碑位置", "waystones.iconCredits": "图标作者:JoeCreates (CC-BY-SA 3.0)", "waystones.map.untitled_waystone": "未命名的传送石碑", diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 81437438..197195af 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -balm = "26.2.0.1" +balm = "26.2.0.5-SNAPSHOT" minecraft = "26.2" neoForm = "26.2-1" neoForge = "26.2.0.0-beta" @@ -8,7 +8,7 @@ fabricApi = "0.152.1+26.2" fabricLoader = "0.19.3" journeyMapApi = "26.2-2.0.0" unbreakables = "26.1.0.2" -shogi = "26.2.0.3-SNAPSHOT" +shogi = "26.2.0.4-SNAPSHOT" [libraries] minecraft = { module = "com.mojang:minecraft", version.ref = "minecraft" }