diff --git a/src/main/java/us/myles/ViaVersion/metadata/MetaIndex.java b/src/main/java/us/myles/ViaVersion/metadata/MetaIndex.java index 5ca5c2d27..6d8c90a91 100644 --- a/src/main/java/us/myles/ViaVersion/metadata/MetaIndex.java +++ b/src/main/java/us/myles/ViaVersion/metadata/MetaIndex.java @@ -91,6 +91,7 @@ public enum MetaIndex { WITHER_TARGET2(Wither.class, 18, Type.Int, 12, NewType.VarInt), WITHER_TARGET3(Wither.class, 19, Type.Int, 13, NewType.VarInt), WITHER_INVULN_TIME(Wither.class, 20, Type.Int, 14, NewType.VarInt), + WITHER_PROPERTIES(Wither.class, 10, Type.Byte, NewType.Byte), // wither skull WITHERSKULL_INVULN(WitherSkull.class, 10, Type.Byte, 5, NewType.Boolean), // guardian @@ -123,7 +124,10 @@ public enum MetaIndex { ITEMFRAME_ITEM(ItemFrame.class, 8, Type.Slot, 5, NewType.Slot), ITEMFRAME_ROTATION(ItemFrame.class, 9, Type.Byte, 6, NewType.VarInt), // ender crystal - ENDERCRYSTAL_HEALTH(EnderCrystal.class, 8, Type.Int, NewType.Discontinued),; + ENDERCRYSTAL_HEALTH(EnderCrystal.class, 8, Type.Int, NewType.Discontinued), + // Ender dragon + ENDERDRAGON_FLAG(EnderDragon.class, 15, Type.Byte, NewType.Discontinued), + ENDERDRAGON_PHASE(EnderDragon.class, 11, Type.Int, NewType.VarInt); private Class clazz; private int newIndex; diff --git a/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java b/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java index a626dcc36..4d456af73 100644 --- a/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java +++ b/src/main/java/us/myles/ViaVersion/metadata/MetadataRewriter.java @@ -207,7 +207,7 @@ public class MetadataRewriter { private MetaIndex index; private Object value; - private Entry(MetaIndex index, Object value, int id) { + public Entry(MetaIndex index, Object value, int id) { this.index = index; this.value = value; this.oldID = id; diff --git a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java index 179d2b455..73835ea44 100644 --- a/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java +++ b/src/main/java/us/myles/ViaVersion/transformers/OutgoingTransformer.java @@ -15,7 +15,12 @@ import us.myles.ViaVersion.CancelException; import us.myles.ViaVersion.ConnectionInfo; import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.ViaVersion; +import us.myles.ViaVersion.api.boss.BossBar; +import us.myles.ViaVersion.api.boss.BossColor; +import us.myles.ViaVersion.api.boss.BossStyle; +import us.myles.ViaVersion.metadata.MetaIndex; import us.myles.ViaVersion.metadata.MetadataRewriter; +import us.myles.ViaVersion.metadata.MetadataRewriter.Entry; import us.myles.ViaVersion.packets.PacketType; import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.slot.ItemSlotRewriter; @@ -40,6 +45,7 @@ public class OutgoingTransformer { private final Map vehicleMap = new HashMap<>(); private final Set validBlocking = new HashSet<>(); private final Set knownHolograms = new HashSet<>(); + private final Map bossBarMap = new HashMap<>(); private boolean autoTeam = false; public OutgoingTransformer(ConnectionInfo info) { @@ -384,6 +390,12 @@ public class OutgoingTransformer { clientEntityTypes.remove(entityID); knownHolograms.remove(entityID); PacketUtil.writeVarInt(entityID, output); + + // Remvoe boss bar + BossBar bar = bossBarMap.remove(entityID); + if(bar != null) { + bar.hide(); + } } return; } @@ -832,6 +844,14 @@ public class OutgoingTransformer { for (MetadataRewriter.Entry entry : list) { handleMetadata(entityID, entry, type); } + // Fix: wither (crash fix) + if(type == EntityType.WITHER) { + list.add(new Entry(MetaIndex.WITHER_PROPERTIES, (byte) 0, 10)); + } + // Fix: Dragon (crash fix) + if(type == EntityType.ENDER_DRAGON) { + list.add(new Entry(MetaIndex.ENDERDRAGON_PHASE, 0, 11)); + } MetadataRewriter.writeMetadata1_9(type, list, output); } @@ -875,6 +895,39 @@ public class OutgoingTransformer { } } } + + // TODO: Add config option + // Boss bar + if(type == EntityType.ENDER_DRAGON || type == EntityType.WITHER) { + if(entry.getOldID() == 2) { + BossBar bar = bossBarMap.get(entityID); + String title = (String) entry.getValue(); + title = title.isEmpty() ? (type == EntityType.ENDER_DRAGON ? "Ender Dragon" : "Wither") : title; + if(bar == null) { + bar = ViaVersion.getInstance().createBossBar(title, BossColor.PURPLE, BossStyle.SOLID); + bossBarMap.put(entityID, bar); + bar.addPlayer(info.getPlayer()); + bar.show(); + } else { + bar.setTitle((String) entry.getValue()); + } + } else if(entry.getOldID() == 6) { + BossBar bar = bossBarMap.get(entityID); + // Make health range between 0 and 1 + float maxHealth = type == EntityType.ENDER_DRAGON ? 200.0f : 300.0f; + float health = Math.max(0.0f, Math.min(((float) entry.getValue()) / maxHealth, 1.0f)); + System.out.println(health + " " + entry.getValue()); + if(bar == null) { + String title = type == EntityType.ENDER_DRAGON ? "Ender Dragon" : "Wither"; + bar = ViaVersion.getInstance().createBossBar(title, health, BossColor.PURPLE, BossStyle.SOLID); + bossBarMap.put(entityID, bar); + bar.addPlayer(info.getPlayer()); + bar.show(); + } else { + bar.setHealth(health); + } + } + } }