diff options
| author | DaysSky <88261516+DaysSky@users.noreply.github.com> | 2025-07-31 13:34:12 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-31 00:34:12 -0400 |
| commit | acd2f90553f7aa3ffeaad6430e2860ac8a35f742 (patch) | |
| tree | dce6080891d2c3e297ed2ae690e428c6eff7f585 /src/main | |
| parent | fc49d9997e1702d977cb6f227c5771a0ca13c682 (diff) | |
| download | Skyblocker-acd2f90553f7aa3ffeaad6430e2860ac8a35f742.tar.gz Skyblocker-acd2f90553f7aa3ffeaad6430e2860ac8a35f742.tar.bz2 Skyblocker-acd2f90553f7aa3ffeaad6430e2860ac8a35f742.zip | |
Add Tree Break Progress HUD (#1403)
* Added Tree Break Progress HUD
* Fixed Translations for Tree Break HUD
* change implementation
* resolved merge conflict
* Delete .java-version
* use Int2ObjectMap instead of default HashMap
* review changes
---------
Co-authored-by: Kevin <92656833+kevinthegreat1@users.noreply.github.com>
Diffstat (limited to 'src/main')
6 files changed, 164 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/ForagingCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/ForagingCategory.java index 74246e2e..cfc20e35 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/ForagingCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/ForagingCategory.java @@ -5,11 +5,16 @@ import de.hysky.skyblocker.config.ConfigUtils; import de.hysky.skyblocker.config.SkyblockerConfig; import de.hysky.skyblocker.skyblock.foraging.SweepOverlay; import de.hysky.skyblocker.skyblock.galatea.SeaLumiesHighlighter; +import de.hysky.skyblocker.skyblock.galatea.TreeBreakProgressHud; +import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsConfigurationScreen; +import de.hysky.skyblocker.utils.Location; import net.azureaaron.dandelion.systems.ConfigCategory; import net.azureaaron.dandelion.systems.Option; import net.azureaaron.dandelion.systems.OptionGroup; +import net.azureaaron.dandelion.systems.ButtonOption; import net.azureaaron.dandelion.systems.controllers.ColourController; import net.azureaaron.dandelion.systems.controllers.IntegerController; +import net.minecraft.client.MinecraftClient; import net.minecraft.text.Text; import net.minecraft.util.Identifier; @@ -60,6 +65,19 @@ public class ForagingCategory { }) .controller(ConfigUtils.createBooleanController()) .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("skyblocker.config.foraging.galatea.enableTreeBreakProgress")) + .description(Text.translatable("skyblocker.config.foraging.galatea.enableTreeBreakProgress.@Tooltip")) + .binding(defaults.foraging.galatea.enableTreeBreakProgress, + () -> config.foraging.galatea.enableTreeBreakProgress, + newValue -> config.foraging.galatea.enableTreeBreakProgress = newValue) + .controller(ConfigUtils.createBooleanController()) + .build()) + .option(ButtonOption.createBuilder() + .name(Text.translatable("skyblocker.config.foraging.galatea.enableTreeBreakHud")) + .prompt(Text.translatable("text.skyblocker.open")) + .action((screen) -> MinecraftClient.getInstance().setScreen(new WidgetsConfigurationScreen(Location.GALATEA, TreeBreakProgressHud.getInstance().getInternalID(), screen))) + .build()) .option(Option.<Integer>createBuilder() .name(Text.translatable("skyblocker.config.foraging.galatea.seaLumieMinCount")) .description(Text.translatable("skyblocker.config.foraging.galatea.seaLumieMinCount.@Tooltip")) diff --git a/src/main/java/de/hysky/skyblocker/config/configs/ForagingConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/ForagingConfig.java index f2d0be6f..494e0f02 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/ForagingConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/ForagingConfig.java @@ -17,6 +17,8 @@ public class ForagingConfig { public boolean enableSeaLumiesHighlighter = true; + public boolean enableTreeBreakProgress = true; + public int seaLumiesMinimumCount = 3; public boolean enableTunerSolver = true; diff --git a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java index 8c7f7dca..6b9790b5 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java @@ -25,6 +25,7 @@ import de.hysky.skyblocker.skyblock.fishing.FishingHelper; import de.hysky.skyblocker.skyblock.fishing.FishingHookDisplayHelper; import de.hysky.skyblocker.skyblock.fishing.SeaCreatureTracker; import de.hysky.skyblocker.skyblock.galatea.ForestNodes; +import de.hysky.skyblocker.skyblock.galatea.TreeBreakProgressHud; import de.hysky.skyblocker.skyblock.galatea.TunerSolver; import de.hysky.skyblocker.skyblock.slayers.SlayerManager; import de.hysky.skyblocker.skyblock.slayers.boss.demonlord.FirePillarAnnouncer; @@ -82,6 +83,7 @@ public abstract class ClientPlayNetworkHandlerMixin extends ClientCommonNetworkH HealthBars.healthBar(armorStandEntity); SeaCreatureTracker.onEntitySpawn(armorStandEntity); FishingHelper.checkIfFishWasCaught(armorStandEntity); + TreeBreakProgressHud.onEntityUpdate(armorStandEntity); try { //Prevent packet handling fails if something goes wrong so that entity trackers still update, just without compact damage numbers CompactDamage.compactDamage(armorStandEntity); } catch (Exception e) { diff --git a/src/main/java/de/hysky/skyblocker/skyblock/galatea/TreeBreakProgressHud.java b/src/main/java/de/hysky/skyblocker/skyblock/galatea/TreeBreakProgressHud.java new file mode 100644 index 00000000..bebea7ea --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/galatea/TreeBreakProgressHud.java @@ -0,0 +1,137 @@ +package de.hysky.skyblocker.skyblock.galatea; + +import de.hysky.skyblocker.annotations.RegisterWidget; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsConfigurationScreen; +import de.hysky.skyblocker.skyblock.tabhud.util.Ico; +import de.hysky.skyblocker.skyblock.tabhud.widget.ComponentBasedWidget; +import de.hysky.skyblocker.utils.Location; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientEntityEvents; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.entity.decoration.ArmorStandEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.math.Vec3d; + +import java.util.Comparator; +import java.util.List; +import java.util.Set; + +@RegisterWidget +public class TreeBreakProgressHud extends ComponentBasedWidget { + + private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); + private static final Set<Location> AVAILABLE_LOCATIONS = Set.of(Location.GALATEA); + private static TreeBreakProgressHud instance; + private static Int2ObjectMap<ArmorStandEntity> armorstands = new Int2ObjectOpenHashMap<ArmorStandEntity>(); + + static { + ClientEntityEvents.ENTITY_UNLOAD.register((entity, clientWorld) -> armorstands.remove(entity.getId())); + } + public TreeBreakProgressHud() { + super(Text.literal("Tree Break Progress").formatted(Formatting.GREEN, Formatting.BOLD), Formatting.GREEN.getColorValue(), "hud_treeprogress"); + instance = this; + update(); + } + + + public static void onEntityUpdate(ArmorStandEntity entity) { + if (entity.getCustomName() != null) { + armorstands.put(entity.getId(), entity); + } + } + @Override + public boolean shouldUpdateBeforeRendering() { + return true; + } + + public static TreeBreakProgressHud getInstance() { + return instance; + } + + @Override + public Set<Location> availableLocations() { + return AVAILABLE_LOCATIONS; + } + + @Override + public void setEnabledIn(Location location, boolean enabled) { + if (!availableLocations().contains(location)) + return; + SkyblockerConfigManager.get().foraging.galatea.enableTreeBreakProgress = enabled; + } + + @Override + public boolean isEnabledIn(Location location) { + return availableLocations().contains(location) && SkyblockerConfigManager.get().foraging.galatea.enableTreeBreakProgress; + } + + @Override + public boolean shouldRender(Location location) { + return super.shouldRender(location) && isOwnTree(getClosestTree()); + } + + private ArmorStandEntity getClosestTree() { + if (CLIENT.player == null) return null; + return armorstands.values().stream() + .filter(entity -> { + Text name = entity.getCustomName(); + if (name == null) return false; + return name.getString().contains("FIG TREE") || name.getString().contains("MANGROVE TREE"); + }) + .min(Comparator.comparingDouble(e -> e.squaredDistanceTo(CLIENT.player))) + .orElse(null); + } + + private boolean isOwnTree(ArmorStandEntity tree) { + if (CLIENT.player == null) return false; + if (tree == null) return false; + Vec3d treePos = tree.getPos(); + + List<ArmorStandEntity> groupedArmorStands = armorstands.values().stream() + .filter(e -> { + Vec3d pos = e.getPos(); + return Math.abs(pos.x - treePos.x) < 0.1 && + Math.abs(pos.y - treePos.y) < 2 && + Math.abs(pos.z - treePos.z) < 0.1; + }) + .toList(); + String playerName = CLIENT.player.getName().getString(); + + return groupedArmorStands.stream().anyMatch(armorStand -> { + String name = armorStand.getName().getString(); + return name.contains(playerName) || name.contains(" players"); + }); + } + + @Override + public void updateContent() { + ClientWorld world = CLIENT.world; + ArmorStandEntity closest; + + if (CLIENT.currentScreen instanceof WidgetsConfigurationScreen) { + addSimpleIcoText(Ico.STRIPPED_SPRUCE_WOOD, "Fig Tree ", Formatting.GREEN, "37%"); + return; + } + + if (CLIENT.player == null || world == null) + return; + closest = getClosestTree(); + if (closest == null || !isOwnTree(closest)) return; + + String closestName = closest.getName().getString(); + String treeName = closestName.contains("FIG") ? "Fig Tree" : "Mangrove Tree"; + ItemStack woodIcon = closestName.contains("FIG") ? Ico.STRIPPED_SPRUCE_WOOD : Ico.MANGROVE_LOG; + addSimpleIcoText(woodIcon, treeName + " ", Formatting.GREEN, closestName.replaceAll("[^0-9%]", "")); + } + + @Override + public Text getDisplayName() { + return Text.literal("Tree Break Progress HUD"); + } + +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/Ico.java b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/Ico.java index 97eb4654..4c91787e 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/Ico.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/Ico.java @@ -88,4 +88,6 @@ public class Ico { public static final ItemStack MYCELIUM = Items.MYCELIUM.getDefaultStack(); public static final ItemStack SALMON_BUCKET = Items.SALMON_BUCKET.getDefaultStack(); public static final ItemStack TROPICAL_FISH_BUCKET = Items.TROPICAL_FISH_BUCKET.getDefaultStack(); + public static final ItemStack STRIPPED_SPRUCE_WOOD = Items.STRIPPED_SPRUCE_WOOD.getDefaultStack(); + public static final ItemStack MANGROVE_LOG = Items.MANGROVE_LOG.getDefaultStack(); } diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index 782f3475..d1305921 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -304,6 +304,9 @@ "skyblocker.config.foraging.galatea.enableTunerSolver.@Tooltip": "Shows the required clicks in the Tune Frequency puzzle.", "skyblocker.config.foraging.galatea.solveForestTemplePuzzle": "Solve Forest Temple Puzzle", "skyblocker.config.foraging.galatea.solveForestTemplePuzzle.@Tooltip": "Displays the amount of times you need to rotate the terracotta blocks. For positive rotations you right click while for negative rotations you left click.", + "skyblocker.config.foraging.galatea.enableTreeBreakProgress": "Enable Tree Break Progress HUD", + "skyblocker.config.foraging.galatea.enableTreeBreakProgress.@Tooltip": "Renders tree break progress in HUD", + "skyblocker.config.foraging.galatea.enableTreeBreakHud": "Tree Break Progress HUD", "skyblocker.config.foraging.sweepOverlay": "Sweep Overlay", "skyblocker.config.foraging.sweepOverlay.enableSweepOverlay": "Enable Sweep Overlay", |
