aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorDaysSky <88261516+DaysSky@users.noreply.github.com>2025-07-31 13:34:12 +0900
committerGitHub <noreply@github.com>2025-07-31 00:34:12 -0400
commitacd2f90553f7aa3ffeaad6430e2860ac8a35f742 (patch)
treedce6080891d2c3e297ed2ae690e428c6eff7f585 /src/main
parentfc49d9997e1702d977cb6f227c5771a0ca13c682 (diff)
downloadSkyblocker-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')
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/ForagingCategory.java18
-rw-r--r--src/main/java/de/hysky/skyblocker/config/configs/ForagingConfig.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/galatea/TreeBreakProgressHud.java137
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/tabhud/util/Ico.java2
-rw-r--r--src/main/resources/assets/skyblocker/lang/en_us.json3
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",