diff --git a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java index 796ca5dd4d..a649a0539b 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/modules/render/ESP.java @@ -123,18 +123,26 @@ public class ESP extends Module { // Colors - public final Setting distance = sgColors.add(new BoolSetting.Builder() - .name("distance-colors") - .description("Changes the color of tracers depending on distance.") - .defaultValue(false) + public final Setting colorMode = sgColors.add(new EnumSetting.Builder() + .name("color-mode") + .description("Determines the colors used for entities.") + .defaultValue(ESPColorMode.EntityType) .build() ); public final Setting friendOverride = sgColors.add(new BoolSetting.Builder() .name("show-friend-colors") - .description("Whether or not to override the distance color of friends with the friend color.") + .description("Whether or not to override the distance/health color of friends with the friend color.") .defaultValue(true) - .visible(distance::get) + .visible(() -> colorMode.get() == ESPColorMode.Distance || colorMode.get() == ESPColorMode.Health) + .build() + ); + + private final Setting nonLivingEntityColor = sgColors.add(new ColorSetting.Builder() + .name("non-living-entity-color") + .description("The color used for non living entities such as dropped items.") + .defaultValue(new SettingColor(25, 25, 25)) + .visible(() -> colorMode.get() == ESPColorMode.Health) .build() ); @@ -142,7 +150,7 @@ public class ESP extends Module { .name("players-color") .description("The other player's color.") .defaultValue(new SettingColor(255, 255, 255)) - .visible(() -> !distance.get()) + .visible(() -> colorMode.get() == ESPColorMode.EntityType) .build() ); @@ -150,7 +158,7 @@ public class ESP extends Module { .name("animals-color") .description("The animal's color.") .defaultValue(new SettingColor(25, 255, 25, 255)) - .visible(() -> !distance.get()) + .visible(() -> colorMode.get() == ESPColorMode.EntityType) .build() ); @@ -158,7 +166,7 @@ public class ESP extends Module { .name("water-animals-color") .description("The water animal's color.") .defaultValue(new SettingColor(25, 25, 255, 255)) - .visible(() -> !distance.get()) + .visible(() -> colorMode.get() == ESPColorMode.EntityType) .build() ); @@ -166,7 +174,7 @@ public class ESP extends Module { .name("monsters-color") .description("The monster's color.") .defaultValue(new SettingColor(255, 25, 25, 255)) - .visible(() -> !distance.get()) + .visible(() -> colorMode.get() == ESPColorMode.EntityType) .build() ); @@ -174,7 +182,7 @@ public class ESP extends Module { .name("ambient-color") .description("The ambient's color.") .defaultValue(new SettingColor(25, 25, 25, 255)) - .visible(() -> !distance.get()) + .visible(() -> colorMode.get() == ESPColorMode.EntityType) .build() ); @@ -182,7 +190,7 @@ public class ESP extends Module { .name("misc-color") .description("The misc color.") .defaultValue(new SettingColor(175, 175, 175, 255)) - .visible(() -> !distance.get()) + .visible(() -> colorMode.get() == ESPColorMode.EntityType) .build() ); @@ -387,21 +395,27 @@ private double getFadeAlpha(Entity entity) { } public Color getEntityTypeColor(Entity entity) { - if (distance.get()) { - if (friendOverride.get() && entity instanceof PlayerEntity && Friends.get().isFriend((PlayerEntity) entity)) { - return Config.get().friendColor.get(); - } else return EntityUtils.getColorFromDistance(entity); - } else if (entity instanceof PlayerEntity) { - return PlayerUtils.getPlayerColor(((PlayerEntity) entity), playersColor.get()); - } else { - return switch (entity.getType().getSpawnGroup()) { - case CREATURE -> animalsColor.get(); - case WATER_AMBIENT, WATER_CREATURE, UNDERGROUND_WATER_CREATURE, AXOLOTLS -> waterAnimalsColor.get(); - case MONSTER -> monstersColor.get(); - case AMBIENT -> ambientColor.get(); - default -> miscColor.get(); - }; + if (colorMode.get() == ESPColorMode.EntityType) { + if (entity instanceof PlayerEntity player) { + return PlayerUtils.getPlayerColor(player, playersColor.get()); + } else { + return switch (entity.getType().getSpawnGroup()) { + case CREATURE -> animalsColor.get(); + case WATER_AMBIENT, WATER_CREATURE, UNDERGROUND_WATER_CREATURE, AXOLOTLS -> waterAnimalsColor.get(); + case MONSTER -> monstersColor.get(); + case AMBIENT -> ambientColor.get(); + default -> miscColor.get(); + }; + } + } + + if (friendOverride.get() && entity instanceof PlayerEntity player + && Friends.get().isFriend(player)) { + return Config.get().friendColor.get(); } + + if (colorMode.get() == ESPColorMode.Health) return EntityUtils.getColorFromHealth(entity, nonLivingEntityColor.get()); + else return EntityUtils.getColorFromDistance(entity); } @Override @@ -417,6 +431,17 @@ public boolean isGlow() { return isActive() && mode.get() == Mode.Glow; } + public enum ESPColorMode { + EntityType, + Distance, + Health; + + @Override + public String toString() { + return this == EntityType ? "Entity Type" : super.toString(); + } + } + public enum Mode { Box, Wireframe, diff --git a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java index bba31172f3..ed36f776bb 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/entity/EntityUtils.java @@ -208,6 +208,38 @@ public static Color getColorFromDistance(Entity entity) { return distanceColor; } + public static Color getColorFromHealth(Entity entity, Color nonLivingEntityColor) { + // For entities without health (items, pearls, etc.) + if (!(entity instanceof LivingEntity living)) { + return new Color(nonLivingEntityColor); + } + + float health = living.getHealth(); + float maxHealth = living.getMaxHealth(); + + if (maxHealth <= 0) { + return new Color(nonLivingEntityColor); + } + + double percent = health / maxHealth; + + percent = Math.max(0.0, Math.min(1.0, percent)); + + int r, g; + + if (percent < 0.5) { + // Red to Yellow + r = 255; + g = (int) (255 * (percent / 0.5)); + } else { + // Yellow to Green + g = 255; + r = 255 - (int) (255 * ((percent - 0.5) / 0.5)); + } + + return new Color(r, g, 0, 255); + } + public static boolean intersectsWithEntity(Box box, Predicate predicate) { EntityLookup entityLookup = ((WorldAccessor) mc.world).meteor$getEntityLookup();