diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/AdventureManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/AdventureManager.java index 82348e4..fce5c77 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/manager/AdventureManager.java +++ b/api/src/main/java/net/momirealms/customcrops/api/manager/AdventureManager.java @@ -58,4 +58,6 @@ public abstract class AdventureManager implements Initable { public abstract boolean isColorCode(char c); public abstract void sendTitle(Player player, String title, String subTitle, int fadeIn, int stay, int fadeOut); + + public abstract int rgbaToDecimal(String rgba); } diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/VersionManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/VersionManager.java index 9aa6a66..7333efc 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/manager/VersionManager.java +++ b/api/src/main/java/net/momirealms/customcrops/api/manager/VersionManager.java @@ -39,6 +39,12 @@ public abstract class VersionManager { return instance.isVersionNewerThan1_19_R2(); } + public static boolean isHigherThan1_20_R2() { + return instance.isVersionNewerThan1_20_R2(); + } + + public abstract boolean isVersionNewerThan1_20_R2(); + public abstract boolean hasRegionScheduler(); public static boolean folia() { diff --git a/build.gradle.kts b/build.gradle.kts index 1f1c98c..d334847 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { allprojects { project.group = "net.momirealms" - project.version = "3.4.0.2" + project.version = "3.4.0.3" apply() apply(plugin = "java") diff --git a/plugin/src/main/java/net/momirealms/customcrops/manager/AdventureManagerImpl.java b/plugin/src/main/java/net/momirealms/customcrops/manager/AdventureManagerImpl.java index da2f6f0..64552f9 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/manager/AdventureManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customcrops/manager/AdventureManagerImpl.java @@ -201,4 +201,14 @@ public class AdventureManagerImpl extends AdventureManager { public boolean isColorCode(char c) { return c == 'ยง' || c == '&'; } + + @Override + public int rgbaToDecimal(String rgba) { + String[] split = rgba.split(","); + int r = Integer.parseInt(split[0]); + int g = Integer.parseInt(split[1]); + int b = Integer.parseInt(split[2]); + int a = Integer.parseInt(split[3]); + return (a << 24) | (r << 16) | (g << 8) | b; + } } diff --git a/plugin/src/main/java/net/momirealms/customcrops/manager/HologramManager.java b/plugin/src/main/java/net/momirealms/customcrops/manager/HologramManager.java index f9edcc8..ba3a833 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/manager/HologramManager.java +++ b/plugin/src/main/java/net/momirealms/customcrops/manager/HologramManager.java @@ -21,6 +21,7 @@ import net.kyori.adventure.text.Component; import net.momirealms.customcrops.api.CustomCropsPlugin; import net.momirealms.customcrops.api.common.Reloadable; import net.momirealms.customcrops.api.common.Tuple; +import net.momirealms.customcrops.api.manager.VersionManager; import net.momirealms.customcrops.api.scheduler.CancellableTask; import net.momirealms.customcrops.utils.FakeEntityUtils; import org.bukkit.Bukkit; @@ -143,9 +144,31 @@ public class HologramManager implements Listener, Reloadable { int random = ThreadLocalRandom.current().nextInt(Integer.MAX_VALUE); tupleList.add(Tuple.of(location, random, System.currentTimeMillis() + millis)); this.tuples = tupleList.toArray(new Tuple[0]); - PacketManager.getInstance().send(player, FakeEntityUtils.getSpawnPacket(random, location, EntityType.ARMOR_STAND), FakeEntityUtils.getVanishArmorStandMetaPacket(random, component)); + if (VersionManager.isHigherThan1_20_R2()) { + PacketManager.getInstance().send(player, + FakeEntityUtils.getSpawnPacket(random, location.clone().add(0,1.1,0), EntityType.TEXT_DISPLAY), + FakeEntityUtils.get1_20_2TextDisplayMetaPacket(random, component) + ); + } else if (VersionManager.isHigherThan1_19_R3()) { + PacketManager.getInstance().send(player, + FakeEntityUtils.getSpawnPacket(random, location.clone().add(0,1.1,0), EntityType.TEXT_DISPLAY), + FakeEntityUtils.get1_19_4TextDisplayMetaPacket(random, component) + ); + } else { + PacketManager.getInstance().send(player, + FakeEntityUtils.getSpawnPacket(random, location, EntityType.ARMOR_STAND), + FakeEntityUtils.getVanishArmorStandMetaPacket(random, component) + ); + } } else { - PacketManager.getInstance().send(player, FakeEntityUtils.getVanishArmorStandMetaPacket(entity_id, component)); + if (VersionManager.isHigherThan1_20_R2()) { + PacketManager.getInstance().send(player, FakeEntityUtils.get1_20_2TextDisplayMetaPacket(entity_id, component)); + } else if (VersionManager.isHigherThan1_19_R3()) { + PacketManager.getInstance().send(player, FakeEntityUtils.get1_19_4TextDisplayMetaPacket(entity_id, component)); + } else { + PacketManager.getInstance().send(player, FakeEntityUtils.getVanishArmorStandMetaPacket(entity_id, component)); + } + } } diff --git a/plugin/src/main/java/net/momirealms/customcrops/manager/VersionManagerImpl.java b/plugin/src/main/java/net/momirealms/customcrops/manager/VersionManagerImpl.java index 1762e81..cfd7cd5 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/manager/VersionManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customcrops/manager/VersionManagerImpl.java @@ -38,6 +38,7 @@ public class VersionManagerImpl extends VersionManager { private final boolean isNewerThan1_19_R2; private final boolean isNewerThan1_19_R3; private final boolean isNewerThan1_20; + private final boolean isNewerThan1_20_R2; private final boolean isNewerThan1_19; private boolean isMojmap; @@ -51,6 +52,7 @@ public class VersionManagerImpl extends VersionManager { int main_ver = Integer.parseInt(split[1]); if (main_ver >= 20) { + isNewerThan1_20_R2 = Integer.parseInt(split[2].substring(1)) >= 2; isNewerThan1_19_R2 = true; isNewerThan1_19_R3 = true; isNewerThan1_20 = true; @@ -59,10 +61,12 @@ public class VersionManagerImpl extends VersionManager { isNewerThan1_19_R2 = Integer.parseInt(split[2].substring(1)) >= 2; isNewerThan1_19_R3 = Integer.parseInt(split[2].substring(1)) >= 3; isNewerThan1_20 = false; + isNewerThan1_20_R2 = false; isNewerThan1_19 = true; } else { isNewerThan1_19_R2 = false; isNewerThan1_19_R3 = false; + isNewerThan1_20_R2 = false; isNewerThan1_20 = false; isNewerThan1_19 = false; } @@ -83,6 +87,11 @@ public class VersionManagerImpl extends VersionManager { } } + @Override + public boolean isVersionNewerThan1_20_R2() { + return isNewerThan1_20_R2; + } + @Override public boolean hasRegionScheduler() { return hasRegionScheduler; diff --git a/plugin/src/main/java/net/momirealms/customcrops/utils/FakeEntityUtils.java b/plugin/src/main/java/net/momirealms/customcrops/utils/FakeEntityUtils.java index 7eb9fcf..52f97dc 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/utils/FakeEntityUtils.java +++ b/plugin/src/main/java/net/momirealms/customcrops/utils/FakeEntityUtils.java @@ -23,6 +23,7 @@ import com.comphenix.protocol.wrappers.*; import com.google.common.collect.Lists; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.momirealms.customcrops.api.manager.AdventureManager; import net.momirealms.customcrops.api.manager.VersionManager; import org.bukkit.Location; import org.bukkit.entity.EntityType; @@ -107,15 +108,6 @@ public class FakeEntityUtils { return metaPacket; } - public static PacketContainer getItemDisplayMetaPacket(int id, ItemStack itemStack) { - PacketContainer metaPacket = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); - metaPacket.getModifier().write(0, id); - WrappedDataWatcher wrappedDataWatcher = new WrappedDataWatcher(); - wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(22, WrappedDataWatcher.Registry.getItemStackSerializer(false)), itemStack); - setWrappedDataValue(metaPacket, wrappedDataWatcher); - return metaPacket; - } - private static void setWrappedDataValue(PacketContainer metaPacket, WrappedDataWatcher wrappedDataWatcher) { List wrappedDataValueList = Lists.newArrayList(); wrappedDataWatcher.getWatchableObjects().stream().filter(Objects::nonNull).forEach(entry -> { @@ -124,4 +116,32 @@ public class FakeEntityUtils { }); metaPacket.getDataValueCollectionModifier().write(0, wrappedDataValueList); } + + public static PacketContainer get1_19_4TextDisplayMetaPacket(int id, Component component) { + PacketContainer metaPacket = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); + metaPacket.getModifier().write(0, id); + WrappedDataWatcher wrappedDataWatcher = new WrappedDataWatcher(); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(22, WrappedDataWatcher.Registry.getChatComponentSerializer(false)), WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(component))); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(24, WrappedDataWatcher.Registry.get(Integer.class)), AdventureManager.getInstance().rgbaToDecimal("0,0,0,0")); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(14, WrappedDataWatcher.Registry.get(Byte.class)), (byte) 3); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(25, WrappedDataWatcher.Registry.get(Byte.class)), (byte) -1); + int mask = 0; + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(26, WrappedDataWatcher.Registry.get(Byte.class)), (byte) mask); + setWrappedDataValue(metaPacket, wrappedDataWatcher); + return metaPacket; + } + + public static PacketContainer get1_20_2TextDisplayMetaPacket(int id, Component component) { + PacketContainer metaPacket = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); + metaPacket.getModifier().write(0, id); + WrappedDataWatcher wrappedDataWatcher = new WrappedDataWatcher(); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(23, WrappedDataWatcher.Registry.getChatComponentSerializer(false)), WrappedChatComponent.fromJson(GsonComponentSerializer.gson().serialize(component))); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(25, WrappedDataWatcher.Registry.get(Integer.class)), AdventureManager.getInstance().rgbaToDecimal("0,0,0,0")); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(15, WrappedDataWatcher.Registry.get(Byte.class)), (byte) 3); + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(26, WrappedDataWatcher.Registry.get(Byte.class)), (byte) -1); + int mask = 0; + wrappedDataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(27, WrappedDataWatcher.Registry.get(Byte.class)), (byte) mask); + setWrappedDataValue(metaPacket, wrappedDataWatcher); + return metaPacket; + } }