diff --git a/src/main/java/com/chaosthedude/explorerscompass/ExplorersCompass.java b/src/main/java/com/chaosthedude/explorerscompass/ExplorersCompass.java index ecd81eb..a64c0cc 100644 --- a/src/main/java/com/chaosthedude/explorerscompass/ExplorersCompass.java +++ b/src/main/java/com/chaosthedude/explorerscompass/ExplorersCompass.java @@ -49,6 +49,7 @@ public class ExplorersCompass { public static final DataComponentType SEARCH_RADIUS_COMPONENT = DataComponentType.builder().persistent(Codec.INT).networkSynchronized(ByteBufCodecs.VAR_INT).build(); public static final DataComponentType SAMPLES_COMPONENT = DataComponentType.builder().persistent(Codec.INT).networkSynchronized(ByteBufCodecs.VAR_INT).build(); public static final DataComponentType DISPLAY_COORDS_COMPONENT = DataComponentType.builder().persistent(Codec.BOOL).networkSynchronized(ByteBufCodecs.BOOL).build(); + public static final DataComponentType LOCKED_COMPONENT = DataComponentType.builder().persistent(Codec.BOOL).networkSynchronized(ByteBufCodecs.BOOL).build(); public static boolean canTeleport; public static List allowedStructureKeys; diff --git a/src/main/java/com/chaosthedude/explorerscompass/config/ConfigHandler.java b/src/main/java/com/chaosthedude/explorerscompass/config/ConfigHandler.java index 95d6adb..f197aaa 100644 --- a/src/main/java/com/chaosthedude/explorerscompass/config/ConfigHandler.java +++ b/src/main/java/com/chaosthedude/explorerscompass/config/ConfigHandler.java @@ -25,6 +25,7 @@ public static class General { public final ForgeConfigSpec.IntValue maxRadius; public final ForgeConfigSpec.ConfigValue> structureBlacklist; public final ForgeConfigSpec.IntValue maxSamples; + public final ForgeConfigSpec.BooleanValue singleUse; General(ForgeConfigSpec.Builder builder) { String desc; @@ -45,6 +46,9 @@ public static class General { desc = "The maximum number of samples to be taken when searching for a structure."; maxSamples = builder.comment(desc).defineInRange("maxSamples", 100000, 0, 100000000); + desc = "Limit the compass to single use per item"; + singleUse = builder.comment(desc).define("singleUse", false); + builder.pop(); } } diff --git a/src/main/java/com/chaosthedude/explorerscompass/items/ExplorersCompassItem.java b/src/main/java/com/chaosthedude/explorerscompass/items/ExplorersCompassItem.java index 7687b28..bfacdad 100644 --- a/src/main/java/com/chaosthedude/explorerscompass/items/ExplorersCompassItem.java +++ b/src/main/java/com/chaosthedude/explorerscompass/items/ExplorersCompassItem.java @@ -15,6 +15,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; @@ -43,17 +44,28 @@ public ExplorersCompassItem() { @Override public InteractionResult use(Level level, Player player, InteractionHand hand) { + final boolean singleUse = ConfigHandler.GENERAL.singleUse.get(); + if (!player.isCrouching()) { - if (level.isClientSide()) { - final ItemStack stack = ItemUtils.getHeldItem(player, ExplorersCompass.explorersCompass); - GuiWrapper.openGUI(level, player, stack); + final ItemStack stack = ItemUtils.getHeldItem(player, ExplorersCompass.explorersCompass); + + if (!singleUse || !stack.getOrDefault(ExplorersCompass.LOCKED_COMPONENT, false)) { + if (level.isClientSide()) { + GuiWrapper.openGUI(level, player, stack); + } else { + final ServerLevel serverLevel = (ServerLevel) level; + final ServerPlayer serverPlayer = (ServerPlayer) player; + final boolean canTeleport = ConfigHandler.GENERAL.allowTeleport.get() && PlayerUtils.canTeleport(player.getServer(), player); + ExplorersCompass.network.send(new SyncPacket(canTeleport, StructureUtils.getAllowedStructureKeys(serverLevel), StructureUtils.getGeneratingDimensionsForAllowedStructures(serverLevel), StructureUtils.getStructureKeysToTypeKeys(serverLevel), StructureUtils.getTypeKeysToStructureKeys(serverLevel)), PacketDistributor.PLAYER.with(serverPlayer)); + } + + if (singleUse) { + stack.set(ExplorersCompass.LOCKED_COMPONENT, true); + } } else { - final ServerLevel serverLevel = (ServerLevel) level; - final ServerPlayer serverPlayer = (ServerPlayer) player; - final boolean canTeleport = ConfigHandler.GENERAL.allowTeleport.get() && PlayerUtils.canTeleport(player.getServer(), player); - ExplorersCompass.network.send(new SyncPacket(canTeleport, StructureUtils.getAllowedStructureKeys(serverLevel), StructureUtils.getGeneratingDimensionsForAllowedStructures(serverLevel), StructureUtils.getStructureKeysToTypeKeys(serverLevel), StructureUtils.getTypeKeysToStructureKeys(serverLevel)), PacketDistributor.PLAYER.with(serverPlayer)); + player.displayClientMessage(Component.translatable("string.explorerscompass.locked"), true); } - } else { + } else if (!singleUse) { workerManager.stop(); workerManager.clear(); setState(player.getItemInHand(hand), null, CompassState.INACTIVE, player); @@ -242,4 +254,12 @@ public boolean shouldDisplayCoordinates(ItemStack stack) { return true; } + @Override + public boolean isFoil(ItemStack stack) { + if (ConfigHandler.GENERAL.singleUse.get()) { + return stack.getOrDefault(ExplorersCompass.LOCKED_COMPONENT, false); + } + + return super.isFoil(stack); + } } diff --git a/src/main/java/com/chaosthedude/explorerscompass/registry/ExplorersCompassRegistry.java b/src/main/java/com/chaosthedude/explorerscompass/registry/ExplorersCompassRegistry.java index 5947092..dde4ab7 100644 --- a/src/main/java/com/chaosthedude/explorerscompass/registry/ExplorersCompassRegistry.java +++ b/src/main/java/com/chaosthedude/explorerscompass/registry/ExplorersCompassRegistry.java @@ -28,6 +28,7 @@ public static void registerItems(RegisterEvent e) { registry.register(ResourceLocation.fromNamespaceAndPath(ExplorersCompass.MODID, "search_radius"), ExplorersCompass.SEARCH_RADIUS_COMPONENT); registry.register(ResourceLocation.fromNamespaceAndPath(ExplorersCompass.MODID, "samples"), ExplorersCompass.SAMPLES_COMPONENT); registry.register(ResourceLocation.fromNamespaceAndPath(ExplorersCompass.MODID, "display_coords"), ExplorersCompass.DISPLAY_COORDS_COMPONENT); + registry.register(ResourceLocation.fromNamespaceAndPath(ExplorersCompass.MODID, "locked"), ExplorersCompass.LOCKED_COMPONENT); }); } diff --git a/src/main/resources/assets/explorerscompass/lang/en_us.json b/src/main/resources/assets/explorerscompass/lang/en_us.json index ab5e4fa..6ca00a5 100644 --- a/src/main/resources/assets/explorerscompass/lang/en_us.json +++ b/src/main/resources/assets/explorerscompass/lang/en_us.json @@ -75,5 +75,8 @@ "structure.minecraft.village_plains": "Village Plains", "structure.minecraft.village_savanna": "Village Savanna", "structure.minecraft.village_snowy": "Village Snowy", - "structure.minecraft.village_taiga": "Village Taiga" + "structure.minecraft.village_taiga": "Village Taiga", + + "_comment": "STRINGS - MESSAGES", + "string.explorerscompass.locked": "Compass is locked, disable single use mode to enable multiple searches per item." } \ No newline at end of file