diff options
Diffstat (limited to 'src/main/java/de')
8 files changed, 227 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java index 94f0fc0c..31bac293 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/HelperCategory.java @@ -227,6 +227,27 @@ public class HelperCategory { .build()) .build()) + .group(OptionGroup.createBuilder() + .name(Text.translatable("skyblocker.config.helpers.carnival")) + .collapsed(true) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("skyblocker.config.helpers.carnival.catchAFishHelper")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.carnival.catchAFishHelper.@Tooltip"))) + .binding(defaults.helpers.carnival.catchAFishHelper, + () -> config.helpers.carnival.catchAFishHelper, + newValue -> config.helpers.carnival.catchAFishHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.<Boolean>createBuilder() + .name(Text.translatable("skyblocker.config.helpers.carnival.zombieShootoutHelper")) + .description(OptionDescription.of(Text.translatable("skyblocker.config.helpers.carnival.zombieShootoutHelper.@Tooltip"))) + .binding(defaults.helpers.carnival.zombieShootoutHelper, + () -> config.helpers.carnival.zombieShootoutHelper, + newValue -> config.helpers.carnival.zombieShootoutHelper = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .build()) + //Bazaar .group(OptionGroup.createBuilder() .name(Text.translatable("skyblocker.config.helpers.bazaar")) diff --git a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java index 2b1944ae..6541dee9 100644 --- a/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/configs/HelperConfig.java @@ -33,6 +33,9 @@ public class HelperConfig { public ChocolateFactory chocolateFactory = new ChocolateFactory(); @SerialEntry + public Carnival carnival = new Carnival(); + + @SerialEntry public Bazaar bazaar = new Bazaar(); @SerialEntry @@ -107,6 +110,14 @@ public class HelperConfig { public boolean straySound = true; } + public static class Carnival { + @SerialEntry + public boolean catchAFishHelper = true; + + @SerialEntry + public boolean zombieShootoutHelper = true; + } + public static class Bazaar { @SerialEntry public boolean enableBazaarHelper = true; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/carnival/CatchAFish.java b/src/main/java/de/hysky/skyblocker/skyblock/carnival/CatchAFish.java new file mode 100644 index 00000000..a9df6c3d --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/carnival/CatchAFish.java @@ -0,0 +1,41 @@ +package de.hysky.skyblocker.skyblock.carnival; + +import java.awt.Color; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.entity.MobGlow; +import de.hysky.skyblocker.utils.ItemUtils; +import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.decoration.ArmorStandEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.Items; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; + +public class CatchAFish { + private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); + private static final Box AREA = Box.enclosing(new BlockPos(-69, 65, -5), new BlockPos(-87, 84, 22)); + private static final String YELLOW_FISH_TEXTURE = "ewogICJ0aW1lc3RhbXAiIDogMTcyMDA1MjU4MjAwMSwKICAicHJvZmlsZUlkIiA6ICIzM2Y4ZGExMTU1MzQ0YWQ5OWQ0Y2Q2ZjNhYjFjMjNhYSIsCiAgInByb2ZpbGVOYW1lIiA6ICJCXzFfUl9CIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzM2MGY0Zjk5Yzc4YWRkZGVhYjI3NmViZGY2YWI5YTBmY2ZmYWJkNDlmMGI1NDNlMTk4MWFjN2JkM2Q1NWIxOGEiLAogICAgICAibWV0YWRhdGEiIDogewogICAgICAgICJtb2RlbCIgOiAic2xpbSIKICAgICAgfQogICAgfQogIH0KfQ=="; + private static final int YELLOW = Color.YELLOW.getRGB(); + + public static int getFishGlowColor(ArmorStandEntity armorStand) { + ItemStack stack = armorStand.getEquippedStack(EquipmentSlot.HEAD); + + if (!stack.isEmpty() && stack.isOf(Items.PLAYER_HEAD) && ItemUtils.getHeadTexture(stack).equals(YELLOW_FISH_TEXTURE)) { + return YELLOW; + } + + return MobGlow.NO_GLOW; + } + + public static boolean isInCatchAFish() { + if (ChivalrousCarnival.isInCarnival() && SkyblockerConfigManager.get().helpers.carnival.catchAFishHelper && CLIENT.player != null) { + BlockPos pos = CLIENT.player.getBlockPos(); + + return AREA.contains(pos.getX(), pos.getY(), pos.getZ()); + } + + return false; + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/carnival/ChivalrousCarnival.java b/src/main/java/de/hysky/skyblocker/skyblock/carnival/ChivalrousCarnival.java new file mode 100644 index 00000000..5f38ed94 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/carnival/ChivalrousCarnival.java @@ -0,0 +1,12 @@ +package de.hysky.skyblocker.skyblock.carnival; + +import de.hysky.skyblocker.utils.Area; +import de.hysky.skyblocker.utils.Location; +import de.hysky.skyblocker.utils.Utils; + +public class ChivalrousCarnival { + + protected static boolean isInCarnival() { + return Utils.isOnSkyblock() && Utils.getLocation() == Location.HUB && Utils.getArea() == Area.CARNIVAL; + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/carnival/ZombieShootout.java b/src/main/java/de/hysky/skyblocker/skyblock/carnival/ZombieShootout.java new file mode 100644 index 00000000..bd047300 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/carnival/ZombieShootout.java @@ -0,0 +1,85 @@ +package de.hysky.skyblocker.skyblock.carnival; + +import de.hysky.skyblocker.annotations.Init; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.entity.MobGlow; +import de.hysky.skyblocker.utils.render.RenderHelper; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.client.MinecraftClient; +import net.minecraft.entity.EquipmentSlot; +import net.minecraft.entity.mob.ZombieEntity; +import net.minecraft.item.Item; +import net.minecraft.item.Items; +import net.minecraft.state.property.Properties; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; + +public class ZombieShootout { + private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); + private static final float[] RED = { 1, 0, 0 }; + private static final Box SHOOTING_BOX = Box.enclosing(new BlockPos(-100, 70, 15), new BlockPos(-102, 75, 13)); + private static final BlockPos[] LAMPS = { + new BlockPos(-96, 76, 31), + new BlockPos(-99, 77, 32), + new BlockPos(-102, 75, 32), + new BlockPos(-106, 77, 31), + new BlockPos(-109, 75, 30), + new BlockPos(-112, 76, 28), + new BlockPos(-115, 77, 25), + new BlockPos(-117, 76, 22), + new BlockPos(-118, 76, 19), + new BlockPos(-119, 75, 15), + new BlockPos(-119, 77, 12), + new BlockPos(-118, 76, 9) + }; + + @Init + public static void init() { + WorldRenderEvents.AFTER_TRANSLUCENT.register(ZombieShootout::render); + } + + private static void render(WorldRenderContext context) { + if (isInZombieShootout() && CLIENT.world != null) { + for (BlockPos pos : LAMPS) { + BlockState state = CLIENT.world.getBlockState(pos); + Block block = state.getBlock(); + + if (block.equals(Blocks.REDSTONE_LAMP) && state.contains(Properties.LIT) && state.get(Properties.LIT)) { + RenderHelper.renderOutline(context, pos, RED, 5f, false); + } + } + } + } + + public static int getZombieGlowColor(ZombieEntity zombie) { + if (!zombie.getEquippedStack(EquipmentSlot.CHEST).isEmpty()) { + Item item = zombie.getEquippedStack(EquipmentSlot.CHEST).getItem(); + + //Uses the same colors as the dojo stuff + return switch (item) { + case Item i when i == Items.DIAMOND_CHESTPLATE -> 0x00ffff; + case Item i when i == Items.GOLDEN_CHESTPLATE -> 0xffd700; + case Item i when i == Items.IRON_CHESTPLATE -> 0xc0c0c0; + case Item i when i == Items.LEATHER_CHESTPLATE -> 0xa52a2a; + + default -> MobGlow.NO_GLOW; + }; + } + + return MobGlow.NO_GLOW; + } + + public static boolean isInZombieShootout() { + if (ChivalrousCarnival.isInCarnival() && SkyblockerConfigManager.get().helpers.carnival.zombieShootoutHelper && CLIENT.player != null) { + BlockPos pos = CLIENT.player.getBlockPos(); + + return SHOOTING_BOX.contains(pos.getX(), pos.getY(), pos.getZ()); + } + + return false; + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java index 909eea7e..91469c38 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/entity/MobGlow.java @@ -4,6 +4,8 @@ import com.google.common.collect.Streams; import de.hysky.skyblocker.annotations.Init; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.config.configs.SlayersConfig; +import de.hysky.skyblocker.skyblock.carnival.CatchAFish; +import de.hysky.skyblocker.skyblock.carnival.ZombieShootout; import de.hysky.skyblocker.skyblock.crimson.dojo.DojoManager; import de.hysky.skyblocker.skyblock.crimson.kuudra.Kuudra; import de.hysky.skyblocker.skyblock.dungeon.DungeonScore; @@ -143,6 +145,10 @@ public class MobGlow { case WitherSkeletonEntity e when SkyblockerConfigManager.get().slayers.highlightBosses == SlayersConfig.HighlightSlayerEntities.GLOW && SlayerManager.isInSlayerType(SlayerType.DEMONLORD) && e.distanceTo(MinecraftClient.getInstance().player) <= 15 -> AttunementColors.getColor(e); case ZombifiedPiglinEntity e when SkyblockerConfigManager.get().slayers.highlightBosses == SlayersConfig.HighlightSlayerEntities.GLOW && SlayerManager.isInSlayerType(SlayerType.DEMONLORD) && e.distanceTo(MinecraftClient.getInstance().player) <= 15 -> AttunementColors.getColor(e); + //Chivalrous Carnival + case ZombieEntity zombie when ZombieShootout.isInZombieShootout() -> ZombieShootout.getZombieGlowColor(zombie); + case ArmorStandEntity armorStand when CatchAFish.isInCatchAFish() -> CatchAFish.getFishGlowColor(armorStand); + default -> NO_GLOW; }; } diff --git a/src/main/java/de/hysky/skyblocker/utils/Area.java b/src/main/java/de/hysky/skyblocker/utils/Area.java new file mode 100644 index 00000000..d15f417b --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/Area.java @@ -0,0 +1,24 @@ +package de.hysky.skyblocker.utils; + +import java.util.Arrays; + +/** + * An area of a Skyblock Island. + */ +public enum Area { + CARNIVAL("Carnival"), + UNKNOWN("Unknown"); + + private final String name; + + Area(String name) { + this.name = name; + } + + public static Area from(String name) { + return Arrays.stream(values()) + .filter(area -> name.equals(area.name)) + .findFirst() + .orElse(UNKNOWN); + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/Utils.java b/src/main/java/de/hysky/skyblocker/utils/Utils.java index 1d87fe11..972abd3c 100644 --- a/src/main/java/de/hysky/skyblocker/utils/Utils.java +++ b/src/main/java/de/hysky/skyblocker/utils/Utils.java @@ -68,6 +68,11 @@ public class Utils { @NotNull private static Location location = Location.UNKNOWN; /** + * Current Skyblock island area. + */ + @NotNull + private static Area area = Area.UNKNOWN; + /** * The profile name parsed from the player list. */ @NotNull @@ -172,6 +177,16 @@ public class Utils { } /** + * <b>Note: Under no circumstances should you skip checking the location if you also need the area.</b> + * + * @return the area parsed from the scoreboard. + */ + @NotNull + public static Area getArea() { + return area; + } + + /** * Can be used to restrict features to being active only on the Alpha network. * * @return the current environment parsed from the Mod API. @@ -348,11 +363,22 @@ public class Utils { STRING_SCOREBOARD.addAll(stringLines); Utils.updatePurse(); SlayerManager.getSlayerBossInfo(true); + updateArea(); } catch (NullPointerException e) { //Do nothing } } + //TODO add event in the future + private static void updateArea() { + if (isOnSkyblock) { + String areaName = getIslandArea().replaceAll("[⏣ф]", "").strip(); + area = Area.from(areaName); + } else { + area = Area.UNKNOWN; + } + } + public static void updatePurse() { STRING_SCOREBOARD.stream().filter(s -> s.contains("Piggy:") || s.contains("Purse:")).findFirst().ifPresent(purseString -> { Matcher matcher = PURSE.matcher(purseString); @@ -389,6 +415,7 @@ public class Utils { gameType = ""; locationRaw = ""; location = Location.UNKNOWN; + area = Area.UNKNOWN; map = ""; } |
