aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorviciscat <51047087+viciscat@users.noreply.github.com>2024-11-23 01:56:23 +0100
committerGitHub <noreply@github.com>2024-11-22 19:56:23 -0500
commita09b3fb16d7d963cd1570e0a6d6ad7e790950381 (patch)
tree892fb44bfe513860edef2de077f634b64a787f6f /src/main/java
parent7e98ed55b6ef7921ceaf5094c60f188cc08fb541 (diff)
downloadSkyblocker-a09b3fb16d7d963cd1570e0a6d6ad7e790950381.tar.gz
Skyblocker-a09b3fb16d7d963cd1570e0a6d6ad7e790950381.tar.bz2
Skyblocker-a09b3fb16d7d963cd1570e0a6d6ad7e790950381.zip
the fixes (#1055)
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsChestHighlighter.java319
1 files changed, 166 insertions, 153 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsChestHighlighter.java b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsChestHighlighter.java
index 6af23a65..b682a896 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsChestHighlighter.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dwarven/CrystalsChestHighlighter.java
@@ -12,6 +12,7 @@ import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.network.packet.s2c.play.ParticleS2CPacket;
import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket;
import net.minecraft.particle.ParticleTypes;
@@ -21,160 +22,172 @@ import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Box;
import net.minecraft.util.math.Vec3d;
+import net.minecraft.world.BlockStateRaycastContext;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
public class CrystalsChestHighlighter {
- private static final MinecraftClient CLIENT = MinecraftClient.getInstance();
- private static final String CHEST_SPAWN_MESSAGE = "You uncovered a treasure chest!";
- private static final long MAX_PARTICLE_LIFE_TIME = 250;
- private static final Vec3d LOCK_HIGHLIGHT_SIZE = new Vec3d(0.1, 0.1, 0.1);
-
- private static int waitingForChest = 0;
- private static final List<BlockPos> activeChests = new ArrayList<>();
- private static final Object2LongOpenHashMap<Vec3d> activeParticles = new Object2LongOpenHashMap<>();
- private static int currentLockCount = 0;
- private static int neededLockCount = 0;
-
- @Init
- public static void init() {
- ClientReceiveMessageEvents.GAME.register(CrystalsChestHighlighter::extractLocationFromMessage);
- WorldRenderEvents.AFTER_TRANSLUCENT.register(CrystalsChestHighlighter::render);
- ClientPlayConnectionEvents.JOIN.register((_handler, _sender, _client) -> reset());
- }
-
- private static void reset() {
- waitingForChest = 0;
- activeChests.clear();
- activeParticles.clear();
- currentLockCount = 0;
- }
-
- private static void extractLocationFromMessage(Text text, boolean b) {
- if (!Utils.isInCrystalHollows() || !SkyblockerConfigManager.get().mining.crystalHollows.chestHighlighter) {
- return;
- }
- //if a chest is spawned add chest to look for
- if (text.getString().matches(CHEST_SPAWN_MESSAGE)) {
- waitingForChest += 1;
- }
- }
-
- /**
- * When a block is updated in the crystal hollows if looking for a chest see if it's a chest and if so add to active. or remove active chests from where air is placed
- *
- * @param pos location of block update
- * @param state the new state of the block
- */
- public static void onBlockUpdate(BlockPos pos, BlockState state) {
- if (!SkyblockerConfigManager.get().mining.crystalHollows.chestHighlighter || CLIENT.player == null) {
- return;
- }
- if (waitingForChest > 0 && state.isOf(Blocks.CHEST)) {
- //make sure it is not too far from the player (more than 10 blocks away)
- if (pos.getSquaredDistance(CLIENT.player.getPos()) > 100) {
- return;
- }
- activeChests.add(pos);
- currentLockCount = 0;
- waitingForChest -= 1;
- } else if (state.isAir() && activeChests.contains(pos)) {
- currentLockCount = 0;
- activeChests.remove(pos);
- }
- }
-
- /**
- * When a particle is spawned add that particle to active particles if correct for lock picking
- *
- * @param packet particle spawn packet
- */
- public static void onParticle(ParticleS2CPacket packet) {
- if (!Utils.isInCrystalHollows() || !SkyblockerConfigManager.get().mining.crystalHollows.chestHighlighter) {
- return;
- }
- if (ParticleTypes.CRIT.equals(packet.getParameters().getType())) {
- activeParticles.put(new Vec3d(packet.getX(), packet.getY(), packet.getZ()), System.currentTimeMillis());
- }
- }
-
- /**
- * Updates {@link CrystalsChestHighlighter#currentLockCount} and clears {@link CrystalsChestHighlighter#activeParticles} based on lock pick related sound events.
- *
- * @param packet sound packet
- */
- public static void onSound(PlaySoundS2CPacket packet) {
- if (!Utils.isInCrystalHollows() || !SkyblockerConfigManager.get().mining.crystalHollows.chestHighlighter) {
- return;
- }
- String path = packet.getSound().value().id().getPath();
- //lock picked sound
- if (path.equals("entity.experience_orb.pickup") && packet.getPitch() == 1) {
- currentLockCount += 1;
- activeParticles.clear();
- //lock pick fail sound
- } else if (path.equals("entity.villager.no")) {
- currentLockCount = 0;
- activeParticles.clear();
- //lock pick finish sound
- } else if (path.equals("block.chest.open")) {
- //set the needed lock count to the current, so we know how many locks a chest has
- neededLockCount = currentLockCount;
- activeParticles.clear();
- }
- }
-
- /**
- * If enabled, renders a box around active treasure chests, taking the color from the config.
- * Additionally, calculates and displaces the highlight to indicate lock-picking spots on chests.
- * Finally, renders text showing how many lock picks the player has done
- *
- * @param context context
- */
- private static void render(WorldRenderContext context) {
- if (!Utils.isInCrystalHollows() || !SkyblockerConfigManager.get().mining.crystalHollows.chestHighlighter) {
- return;
- }
- //render chest outline
- float[] color = SkyblockerConfigManager.get().mining.crystalHollows.chestHighlightColor.getComponents(new float[]{0, 0, 0, 0});
- for (BlockPos chest : activeChests) {
- RenderHelper.renderOutline(context, Box.of(chest.toCenterPos().subtract(0, 0.0625, 0), 0.885, 0.885, 0.885), color, color[3], 3, false);
- }
-
- //render lock picking if player is looking at chest that is in the active chests list
- if (CLIENT.player == null) {
- return;
- }
- HitResult target = CLIENT.crosshairTarget;
- if (target instanceof BlockHitResult blockHitResult && activeChests.contains(blockHitResult.getBlockPos())) {
- Vec3d chestPos = blockHitResult.getBlockPos().toCenterPos();
-
- if (!activeParticles.isEmpty()) {
- //the player is looking at a chest use active particle to highlight correct spot
- Vec3d highlightSpot = Vec3d.ZERO;
-
- //if to old remove particle
- activeParticles.object2LongEntrySet().removeIf(e -> System.currentTimeMillis() - e.getLongValue() > MAX_PARTICLE_LIFE_TIME);
-
- //add up all particle within range of active block
- for (Vec3d particlePos : activeParticles.keySet()) {
- if (particlePos.squaredDistanceTo(chestPos) <= 0.75) {
- highlightSpot = highlightSpot.add(particlePos);
- }
- }
-
- //render the spot
- highlightSpot = highlightSpot.multiply((double) 1 / activeParticles.size()).subtract(LOCK_HIGHLIGHT_SIZE.multiply(0.5));
- RenderHelper.renderFilled(context, highlightSpot, LOCK_HIGHLIGHT_SIZE, color, color[3], true);
- }
-
- //render total text if needed is more than 0
- if (neededLockCount <= 0) {
- return;
- }
- RenderHelper.renderText(context, Text.literal(Math.min(currentLockCount, neededLockCount) + "/" + neededLockCount).withColor(SkyblockerConfigManager.get().mining.crystalHollows.chestHighlightColor.getRGB()), chestPos, true);
- }
- }
-} \ No newline at end of file
+ private static final MinecraftClient CLIENT = MinecraftClient.getInstance();
+ private static final String CHEST_SPAWN_MESSAGE = "You uncovered a treasure chest!";
+ private static final long MAX_PARTICLE_LIFE_TIME = 250;
+ private static final Vec3d LOCK_HIGHLIGHT_SIZE = new Vec3d(0.1, 0.1, 0.1);
+
+ private static int waitingForChest = 0;
+ private static final Set<BlockPos> activeChests = new HashSet<>();
+ private static final Object2LongOpenHashMap<Vec3d> activeParticles = new Object2LongOpenHashMap<>();
+ private static int currentLockCount = 0;
+ private static int neededLockCount = 0;
+
+ @Init
+ public static void init() {
+ ClientReceiveMessageEvents.GAME.register(CrystalsChestHighlighter::extractLocationFromMessage);
+ WorldRenderEvents.AFTER_TRANSLUCENT.register(CrystalsChestHighlighter::render);
+ ClientPlayConnectionEvents.JOIN.register((_handler, _sender, _client) -> reset());
+ }
+
+ private static void reset() {
+ waitingForChest = 0;
+ activeChests.clear();
+ activeParticles.clear();
+ currentLockCount = 0;
+ }
+
+ private static void extractLocationFromMessage(Text text, boolean b) {
+ if (!Utils.isInCrystalHollows() || !SkyblockerConfigManager.get().mining.crystalHollows.chestHighlighter) {
+ return;
+ }
+ //if a chest is spawned add chest to look for
+ if (text.getString().matches(CHEST_SPAWN_MESSAGE)) {
+ waitingForChest += 1;
+ }
+ }
+
+ /**
+ * When a block is updated in the crystal hollows if looking for a chest see if it's a chest and if so add to active. or remove active chests from where air is placed
+ *
+ * @param pos location of block update
+ * @param state the new state of the block
+ */
+ public static void onBlockUpdate(BlockPos pos, BlockState state) {
+ if (!SkyblockerConfigManager.get().mining.crystalHollows.chestHighlighter || CLIENT.player == null) {
+ return;
+ }
+ if (waitingForChest > 0 && state.isOf(Blocks.CHEST)) {
+ //make sure it is not too far from the player (more than 10 blocks away)
+ if (pos.getSquaredDistance(CLIENT.player.getPos()) > 100) {
+ return;
+ }
+ activeChests.add(pos);
+ currentLockCount = 0;
+ waitingForChest -= 1;
+ } else if (state.isAir() && activeChests.contains(pos)) {
+ currentLockCount = 0;
+ activeChests.remove(pos);
+ }
+ }
+
+ /**
+ * When a particle is spawned add that particle to active particles if correct for lock picking
+ *
+ * @param packet particle spawn packet
+ */
+ public static void onParticle(ParticleS2CPacket packet) {
+ if (!Utils.isInCrystalHollows() || !SkyblockerConfigManager.get().mining.crystalHollows.chestHighlighter) {
+ return;
+ }
+ if (ParticleTypes.CRIT.equals(packet.getParameters().getType())) {
+ activeParticles.put(new Vec3d(packet.getX(), packet.getY(), packet.getZ()), System.currentTimeMillis());
+ }
+ }
+
+ /**
+ * Updates {@link CrystalsChestHighlighter#currentLockCount} and clears {@link CrystalsChestHighlighter#activeParticles} based on lock pick related sound events.
+ *
+ * @param packet sound packet
+ */
+ public static void onSound(PlaySoundS2CPacket packet) {
+ ClientPlayerEntity player = MinecraftClient.getInstance().player;
+ if (player == null || !Utils.isInCrystalHollows() || !SkyblockerConfigManager.get().mining.crystalHollows.chestHighlighter) {
+ return;
+ }
+ String path = packet.getSound().value().id().getPath();
+ //lock picked sound
+ if (path.equals("entity.experience_orb.pickup") && packet.getPitch() == 1 && !activeChests.isEmpty()) {
+ Vec3d eyePos = player.getCameraPosVec(0);
+ Vec3d rotationVec = player.getRotationVec(0);
+ double range = player.getBlockInteractionRange();
+ Vec3d vec3d3 = eyePos.add(rotationVec.x * range, rotationVec.y * range, rotationVec.z * range);
+ BlockHitResult raycast = player.getWorld().raycast(new BlockStateRaycastContext(eyePos, vec3d3, blockState -> blockState.isOf(Blocks.CHEST)));
+ if (!raycast.getType().equals(HitResult.Type.MISS)) {
+ currentLockCount += 1;
+ activeParticles.clear();
+ }
+ //lock pick fail sound
+ } else if (path.equals("entity.villager.no")) {
+ currentLockCount = 0;
+ activeParticles.clear();
+ //lock pick finish sound
+ } else if (path.equals("block.chest.open")) {
+ //set the needed lock count to the current, so we know how many locks a chest has
+ neededLockCount = Math.min(currentLockCount, 5);
+ currentLockCount = 0;
+ activeParticles.clear();
+ }
+ }
+
+ /**
+ * If enabled, renders a box around active treasure chests, taking the color from the config.
+ * Additionally, calculates and displaces the highlight to indicate lock-picking spots on chests.
+ * Finally, renders text showing how many lock picks the player has done
+ *
+ * @param context context
+ */
+ private static void render(WorldRenderContext context) {
+ if (!Utils.isInCrystalHollows() || !SkyblockerConfigManager.get().mining.crystalHollows.chestHighlighter) {
+ return;
+ }
+ //render chest outline
+ float[] color = SkyblockerConfigManager.get().mining.crystalHollows.chestHighlightColor.getComponents(new float[]{0, 0, 0, 0});
+ for (BlockPos chest : activeChests) {
+ RenderHelper.renderOutline(context, Box.of(chest.toCenterPos().subtract(0, 0.0625, 0), 0.885, 0.885, 0.885), color, color[3], 3, false);
+ }
+
+ //render lock picking if player is looking at chest that is in the active chests list
+ if (CLIENT.player == null) {
+ return;
+ }
+ HitResult target = CLIENT.crosshairTarget;
+ if (target instanceof BlockHitResult blockHitResult && activeChests.contains(blockHitResult.getBlockPos())) {
+ Vec3d chestPos = blockHitResult.getBlockPos().toCenterPos();
+
+ if (!activeParticles.isEmpty()) {
+ //the player is looking at a chest use active particle to highlight correct spot
+ Vec3d highlightSpot = Vec3d.ZERO;
+
+ //if to old remove particle
+ activeParticles.object2LongEntrySet().removeIf(e -> System.currentTimeMillis() - e.getLongValue() > MAX_PARTICLE_LIFE_TIME);
+
+ //add up all particle within range of active block
+ int addedParticles = 0;
+ for (Vec3d particlePos : activeParticles.keySet()) {
+ if (particlePos.squaredDistanceTo(chestPos) <= 0.8) {
+ highlightSpot = highlightSpot.add(particlePos);
+ addedParticles++;
+ }
+ }
+
+ //render the spot
+ highlightSpot = highlightSpot.multiply((double) 1 / addedParticles).subtract(LOCK_HIGHLIGHT_SIZE.multiply(0.5));
+ RenderHelper.renderFilled(context, highlightSpot, LOCK_HIGHLIGHT_SIZE, color, color[3], true);
+ }
+
+ //render total text if needed is more than 0
+ if (neededLockCount <= 0) {
+ return;
+ }
+ RenderHelper.renderText(context, Text.literal(Math.min(currentLockCount, neededLockCount) + "/" + neededLockCount).withColor(SkyblockerConfigManager.get().mining.crystalHollows.chestHighlightColor.getRGB()), chestPos, true);
+ }
+ }
+}