From 59d2a3934c8c0fd7418cdc5ef49eea945d4beb38 Mon Sep 17 00:00:00 2001 From: Markil3 <75867393+Markil3@users.noreply.github.com> Date: Mon, 30 Aug 2021 22:23:13 -0600 Subject: [PATCH] Allows some items to not trigger a hand/crosshair update. This is helpful if one is using Firework rockets to fly around the landscape. --- .../markil3/immersive_hud/ConfigManager.java | 53 ++++++++++++++++++- .../java/markil3/immersive_hud/ModMenu.java | 33 ++++++++++++ .../markil3/immersive_hud/TimerUtils.java | 10 ++++ .../assets/immersive_hud/lang/en_us.json | 6 ++- 4 files changed, 99 insertions(+), 3 deletions(-) diff --git a/src/main/java/markil3/immersive_hud/ConfigManager.java b/src/main/java/markil3/immersive_hud/ConfigManager.java index cbc4e62..f2f1c9f 100755 --- a/src/main/java/markil3/immersive_hud/ConfigManager.java +++ b/src/main/java/markil3/immersive_hud/ConfigManager.java @@ -1,11 +1,19 @@ package markil3.immersive_hud; +import static markil3.immersive_hud.Main.TICKS_PER_SECOND; + +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.util.Identifier; import net.minecraft.util.math.MathHelper; +import net.minecraft.util.registry.Registry; + +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; import me.shedaniel.autoconfig.AutoConfig; -import static markil3.immersive_hud.Main.TICKS_PER_SECOND; - /** * Configuration manager of this mod, which reads from and writes to this mod's * configuration file. @@ -88,6 +96,7 @@ public class ConfigManager private boolean showArmor = true; private double minHealth = 0.5; private int minHunger = 17; + private Identifier[] ignoredItems = new Identifier[]{Registry.ITEM.getId(Items.FIREWORK_ROCKET)}; /** * Returns the instance of this class. @@ -247,6 +256,26 @@ public class ConfigManager return this.minHunger; } + /** + * Obtains a collection of items that won't cause hands and crosshairs to show when used. + * + * @return A set of ignored items. + */ + public Set getIgnoredItems() + { + return Arrays.stream(ignoredItems).map(Registry.ITEM::get).collect(Collectors.toSet()); + } + + /** + * Obtains a collection of items that won't cause hands and crosshairs to show when used. + * + * @return An array of identifiers. + */ + public Identifier[] getIgnoredIdentifiers() + { + return this.ignoredItems; + } + /** * Sets the time that the hands are allowed to display. * @@ -318,6 +347,26 @@ public class ConfigManager { this.minHunger = MathHelper.clamp(boundary, 0, 20); } + + /** + * Sets which items won't cause the hands and crosshairs to show when used. + * + * @param items - A set of ignored items. + */ + public void setIgnoredItems(Item... items) + { + this.ignoredItems = Arrays.stream(items).map(Registry.ITEM::getId).toArray(Identifier[]::new); + } + + /** + * Sets which items won't cause the hands and crosshairs to show when used. + * + * @param items - A set of ignored items. + */ + public void setIgnoredItems(String... items) + { + this.ignoredItems = Arrays.stream(items).map(Identifier::new).filter(i -> Registry.ITEM.getOrEmpty(i).isPresent()).toArray(Identifier[]::new); + } /** * Saves changes to this mod's configuration. */ diff --git a/src/main/java/markil3/immersive_hud/ModMenu.java b/src/main/java/markil3/immersive_hud/ModMenu.java index 7ec4c34..fcc5f57 100755 --- a/src/main/java/markil3/immersive_hud/ModMenu.java +++ b/src/main/java/markil3/immersive_hud/ModMenu.java @@ -3,7 +3,11 @@ package markil3.immersive_hud; import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; +import net.minecraft.item.Items; import net.minecraft.text.TranslatableText; +import net.minecraft.util.Identifier; +import net.minecraft.util.InvalidIdentifierException; +import net.minecraft.util.registry.Registry; import me.shedaniel.autoconfig.AutoConfig; import me.shedaniel.clothconfig2.api.ConfigBuilder; @@ -13,6 +17,10 @@ import me.shedaniel.clothconfig2.gui.entries.DoubleListEntry; import static markil3.immersive_hud.Main.TICKS_PER_SECOND; +import java.util.Arrays; +import java.util.Optional; +import java.util.stream.Collectors; + public class ModMenu implements ModMenuApi { @@ -185,6 +193,31 @@ public class ModMenu implements ModMenuApi .setSaveConsumer(val -> instance.shouldShowArmor(val)) .build()); + general.addEntry(entryBuilder + .startStrList(new TranslatableText("option.immersive_hud.ignoreList"), Arrays + .asList(instance + .getIgnoredIdentifiers()).stream().map(Identifier::toString) + .collect(Collectors.toList())) + .setDefaultValue(Arrays + .asList(Registry.ITEM.getId(Items.FIREWORK_ROCKET).toString())) + .setTooltip(new TranslatableText("tooltip.immersive_hud.ignoreList")) + .setSaveConsumer(val -> instance.setIgnoredItems(val.toArray(new String[0]))).setErrorSupplier(val -> { + try + { + Optional item = val.stream().filter(i -> !Registry.ITEM.getOrEmpty(new Identifier(i)).isPresent()).findFirst(); + if (item.isPresent()) + { + return Optional.of(new TranslatableText("error.immersive_hud.ignoreList.unknownItem")); + } + } + catch (InvalidIdentifierException e) + { + return Optional.of(new TranslatableText("error.immersive_hud.ignoreList.illegalId")); + } + return Optional.empty(); + }) + .build()); + return builder.build(); }; } diff --git a/src/main/java/markil3/immersive_hud/TimerUtils.java b/src/main/java/markil3/immersive_hud/TimerUtils.java index ea858a3..794b16a 100755 --- a/src/main/java/markil3/immersive_hud/TimerUtils.java +++ b/src/main/java/markil3/immersive_hud/TimerUtils.java @@ -49,6 +49,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Optional; +import java.util.Set; /** * Contains the logic for changing the HUD. @@ -304,6 +305,7 @@ public class TimerUtils LivingEntity entity; Item item; Iterator hands; + Set ignored; if (mc.getCameraEntity() instanceof LivingEntity) { entity = (LivingEntity) mc.getCameraEntity(); @@ -329,6 +331,14 @@ public class TimerUtils .map(ItemStack::getItem) .orElse(null); } + if (item != null) + { + ignored = ConfigManager.getInstance().getIgnoredItems(); + if (ignored.contains(item)) + { + return; + } + } crosshairTime = ConfigManager.getInstance().getCrosshairTime(); if (hand == Hand.MAIN_HAND) { diff --git a/src/main/resources/assets/immersive_hud/lang/en_us.json b/src/main/resources/assets/immersive_hud/lang/en_us.json index 238c055..775863a 100755 --- a/src/main/resources/assets/immersive_hud/lang/en_us.json +++ b/src/main/resources/assets/immersive_hud/lang/en_us.json @@ -25,6 +25,7 @@ "option.immersive_hud.minHealth": "Minimum Health Fade", "option.immersive_hud.minHunger": "Minimum Hunger Fade", "option.immersive_hud.showArmor": "Show Armor", + "option.immersive_hud.ignoreList": "Ignored Items", "tooltip.immersive_hud.hotbarMaxTime": "How long the hotbar can be displayed on screen in seconds", "tooltip.immersive_hud.hotbarFadeIn": "How many seconds it takes for the hotbar to fade in", "tooltip.immersive_hud.hotbarFadeOut": "How many seconds it takes for the hotbar to move out", @@ -49,5 +50,8 @@ "tooltip.immersive_hud.hideHands": "Whether or not hands should be hidden after a period of time", "tooltip.immersive_hud.minHealth": "When the percentage of health goes below this level, the health bar won't fade away", "tooltip.immersive_hud.minHunger": "When the hunger level goes below this level, the hunger bar won't fade away", - "tooltip.immersive_hud.showArmor": "Whether or not the armor bar should display on the HUD" + "tooltip.immersive_hud.showArmor": "Whether or not the armor bar should display on the HUD", + "tooltip.immersive_hud.ignoreList": "Which items will not trigger the arm and crosshairs when used", + "error.immersive_hud.ignoreList.unknownItem": "Unknown item %s", + "error.immersive_hud.ignoreList.illegalId": "%s is not a legal item identifier" } \ No newline at end of file