diff options
author | Rime <81419447+Emirlol@users.noreply.github.com> | 2024-05-07 22:03:03 +0300 |
---|---|---|
committer | Rime <81419447+Emirlol@users.noreply.github.com> | 2024-05-10 12:21:36 +0300 |
commit | 19ed449e43815dcfb578e62c3bbea53fe45a7489 (patch) | |
tree | 9072dae5cfa5ea089c7cb908aee8148aeb08ec3a /src/main/java | |
parent | 5eb9d273d2eb56cebaf0be0f90716b362916400b (diff) | |
download | Skyblocker-19ed449e43815dcfb578e62c3bbea53fe45a7489.tar.gz Skyblocker-19ed449e43815dcfb578e62c3bbea53fe45a7489.tar.bz2 Skyblocker-19ed449e43815dcfb578e62c3bbea53fe45a7489.zip |
Add compact damage
Diffstat (limited to 'src/main/java')
3 files changed, 88 insertions, 5 deletions
diff --git a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java index 0a5ebc64..05fbdb23 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java @@ -3,6 +3,8 @@ package de.hysky.skyblocker.mixins; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import com.llamalad7.mixinextras.sugar.Local; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.CompactDamage; import de.hysky.skyblocker.skyblock.FishingHelper; import de.hysky.skyblocker.skyblock.dungeon.DungeonScore; import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager; @@ -17,11 +19,10 @@ import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.world.ClientWorld; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityStatuses; +import net.minecraft.entity.EntityType; import net.minecraft.entity.ItemEntity; -import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket; -import net.minecraft.network.packet.s2c.play.EntityStatusS2CPacket; -import net.minecraft.network.packet.s2c.play.ParticleS2CPacket; -import net.minecraft.network.packet.s2c.play.PlaySoundS2CPacket; +import net.minecraft.entity.decoration.ArmorStandEntity; +import net.minecraft.network.packet.s2c.play.*; import net.minecraft.util.Identifier; import org.slf4j.Logger; import org.spongepowered.asm.mixin.Mixin; @@ -103,4 +104,14 @@ public abstract class ClientPlayNetworkHandlerMixin { } return entity; } + + @Inject(method = "onEntityTrackerUpdate", at = @At("TAIL")) + private void skyblocker$onEntityTrackerUpdate(EntityTrackerUpdateS2CPacket packet, CallbackInfo ci, @Local Entity entity) { + if (!SkyblockerConfigManager.get().general.compactDamage.enabled || entity == null || entity.getType() != EntityType.ARMOR_STAND) return; + try { //Prevent packet handling fails if something goes wrong so that entity trackers still update, just without compact damage numbers + CompactDamage.compactDamage((ArmorStandEntity) entity); + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/CompactDamage.java b/src/main/java/de/hysky/skyblocker/skyblock/CompactDamage.java new file mode 100644 index 00000000..82e3d7be --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/CompactDamage.java @@ -0,0 +1,72 @@ +package de.hysky.skyblocker.skyblock; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import de.hysky.skyblocker.config.SkyblockerConfig; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.CustomArmorAnimatedDyes; +import net.minecraft.entity.decoration.ArmorStandEntity; +import net.minecraft.nbt.NbtHelper; +import net.minecraft.text.Text; + +import java.text.DecimalFormat; + + +public class CompactDamage { + + private CompactDamage() { + } + + private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat(SkyblockerConfigManager.get().general.compactDamage.format); + + public static void compactDamage(ArmorStandEntity entity) { + if (!entity.isInvisible() || !entity.hasCustomName() || !entity.isCustomNameVisible() || entity.getFireTicks() != -1 || !entity.shouldHideBasePlate()) return; + //Dmg armor stands have no base plate and have a fire time of -1 (just one of these isn't enough to determine if it's a dmg armor stand) + //In fact, even this much checking might not be accurate. Needs testing, or just waiting until someone reports it as an issue + JsonObject json = JsonParser.parseString(Text.Serialization.toJsonString(entity.getCustomName(), entity.getRegistryManager())).getAsJsonObject(); + JsonElement extra = json.get("extra"); + if (extra == null || !extra.isJsonArray()) return; + JsonArray extraArray = extra.getAsJsonArray(); + if (extra.getAsJsonArray().isEmpty()) return; + + if (extraArray.size() == 1) { //Non-crit damage, just formatting with no color changes + JsonElement first = extraArray.get(0); + if (!first.isJsonObject()) return; + JsonElement text = first.getAsJsonObject().get("text"); + if (text == null || !text.isJsonPrimitive()) return; + long damage = Long.parseLong(text.getAsString().replace(",", "")); + first.getAsJsonObject().addProperty("text", prettifyDamageNumber(damage)); + first.getAsJsonObject().addProperty("color", "#" + Integer.toHexString(SkyblockerConfigManager.get().general.compactDamage.normalDamageColor.getRGB() & 0x00FFFFFF)); + } else { //Crit damage + //Already checked that the entity has a custom name above, ignore NPE warnings + String text = entity.getCustomName().getString().replace(",", "").replace("✧", ""); + String prettyText = "✧" + prettifyDamageNumber(Long.parseLong(text)) + "✧"; + extra.getAsJsonArray().asList().clear(); + int length = prettyText.length(); + for (int i = 0; i < length; i++) { + JsonObject obj = new JsonObject(); + obj.addProperty("text", prettyText.charAt(i)); + obj.addProperty("color", "#" + Integer.toHexString( + CustomArmorAnimatedDyes.interpolate( + SkyblockerConfigManager.get().general.compactDamage.critDamageGradientStart.getRGB() & 0x00FFFFFF, + SkyblockerConfigManager.get().general.compactDamage.critDamageGradientEnd.getRGB() & 0x00FFFFFF, + i / (length - 1.0) + ) + )); + extraArray.add(obj); + } + } + + entity.setCustomName(Text.Serialization.fromJsonTree(json, entity.getRegistryManager())); + } + + private static String prettifyDamageNumber(long damage) { + if (damage < 1_000) return String.valueOf(damage); + if (damage < 1_000_000) return DECIMAL_FORMAT.format(damage / 1_000.0) + "k"; + if (damage < 1_000_000_000) return DECIMAL_FORMAT.format(damage / 1_000_000.0) + "m"; + if (damage < 1_000_000_000_000L) return DECIMAL_FORMAT.format(damage / 1_000_000_000.0) + "b"; + return DECIMAL_FORMAT.format(damage / 1_000_000_000_000.0) + "t"; //This will probably never be reached + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorAnimatedDyes.java b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorAnimatedDyes.java index 4440cd84..76e7f02c 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorAnimatedDyes.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorAnimatedDyes.java @@ -109,7 +109,7 @@ public class CustomArmorAnimatedDyes { } //Credit to https://codepen.io/OliverBalfour/post/programmatically-making-gradients - private static int interpolate(int firstColor, int secondColor, double percentage) { + public static int interpolate(int firstColor, int secondColor, double percentage) { int r1 = MathHelper.square((firstColor >> 16) & 0xFF); int g1 = MathHelper.square((firstColor >> 8) & 0xFF); int b1 = MathHelper.square(firstColor & 0xFF); |