aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorRime <81419447+Emirlol@users.noreply.github.com>2024-05-07 22:03:03 +0300
committerRime <81419447+Emirlol@users.noreply.github.com>2024-05-10 12:21:36 +0300
commit19ed449e43815dcfb578e62c3bbea53fe45a7489 (patch)
tree9072dae5cfa5ea089c7cb908aee8148aeb08ec3a /src/main/java
parent5eb9d273d2eb56cebaf0be0f90716b362916400b (diff)
downloadSkyblocker-19ed449e43815dcfb578e62c3bbea53fe45a7489.tar.gz
Skyblocker-19ed449e43815dcfb578e62c3bbea53fe45a7489.tar.bz2
Skyblocker-19ed449e43815dcfb578e62c3bbea53fe45a7489.zip
Add compact damage
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java19
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/CompactDamage.java72
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/item/CustomArmorAnimatedDyes.java2
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);