From 8af0909110cd241e5c9acaba0a97695007a45e3f Mon Sep 17 00:00:00 2001 From: Torrie Fischer Date: Fri, 9 Jul 2021 10:04:53 -0700 Subject: [PATCH] playernotifier: fix 1.17 protocol support --- pom.xml | 2 +- .../java/us/camin/regions/PlayerNotifier.java | 111 ++++++++++++------ 2 files changed, 73 insertions(+), 40 deletions(-) diff --git a/pom.xml b/pom.xml index 442735a..5d90d24 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.comphenix.protocol ProtocolLib - 4.6.0 + 4.7.0-SNAPSHOT provided diff --git a/src/main/java/us/camin/regions/PlayerNotifier.java b/src/main/java/us/camin/regions/PlayerNotifier.java index 38ac0e4..d3b60b3 100644 --- a/src/main/java/us/camin/regions/PlayerNotifier.java +++ b/src/main/java/us/camin/regions/PlayerNotifier.java @@ -34,6 +34,7 @@ import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.PacketType; import com.comphenix.protocol.wrappers.EnumWrappers.TitleAction; import com.comphenix.protocol.wrappers.WrappedChatComponent; +import com.comphenix.protocol.utility.MinecraftProtocolVersion; import java.util.logging.Logger; @@ -49,9 +50,64 @@ public class PlayerNotifier implements Listener { Logger log = Logger.getLogger("Regions.PlayerNotifier"); RegionManager m_manager; Plugin m_plugin; + ProtocolManager m_protocolManager; + int m_protoVersion = 0; + public PlayerNotifier(Plugin plugin, RegionManager manager) { m_manager = manager; m_plugin = plugin; + m_protocolManager = ProtocolLibrary.getProtocolManager(); + + if (m_protocolManager != null) { + m_protoVersion = MinecraftProtocolVersion.getCurrentVersion(); + } + } + + private void sendTitle(Player player, WrappedChatComponent title, WrappedChatComponent subtitle) { + // Title packet format changed in 1.17 + if (m_protoVersion < 755) { + PacketContainer setTitle = m_protocolManager.createPacket(PacketType.Play.Server.TITLE); + setTitle.getChatComponents().write(0, title); + PacketContainer setSubtitle = m_protocolManager.createPacket(PacketType.Play.Server.TITLE); + setSubtitle.getChatComponents().write(0, subtitle); + setSubtitle.getTitleActions().write(0, TitleAction.SUBTITLE); + try { + m_protocolManager.sendServerPacket(player, setTitle); + m_protocolManager.sendServerPacket(player, setSubtitle); + } catch (Exception e) { + } + } else { + PacketContainer setTitle = m_protocolManager.createPacket(PacketType.Play.Server.SET_TITLE_TEXT); + setTitle.getChatComponents().write(0, title); + PacketContainer setSubtitle = m_protocolManager.createPacket(PacketType.Play.Server.SET_SUBTITLE_TEXT); + setSubtitle.getChatComponents().write(0, subtitle); + + try { + m_protocolManager.sendServerPacket(player, setTitle); + m_protocolManager.sendServerPacket(player, setSubtitle); + } catch (Exception e) { + } + } + } + + private void sendActionBar(Player player, WrappedChatComponent text) { + // Title packet format changed in 1.17 + if (m_protoVersion < 755) { + PacketContainer setActionBar = m_protocolManager.createPacket(PacketType.Play.Server.TITLE); + setActionBar.getChatComponents().write(0, text); + setActionBar.getTitleActions().write(0, TitleAction.ACTIONBAR); + try { + m_protocolManager.sendServerPacket(player, setActionBar); + } catch (Exception e) { + } + } else { + PacketContainer setActionBar = m_protocolManager.createPacket(PacketType.Play.Server.SET_ACTION_BAR_TEXT); + setActionBar.getChatComponents().write(0, text); + try { + m_protocolManager.sendServerPacket(player, setActionBar); + } catch (Exception e) { + } + } } @EventHandler @@ -71,30 +127,16 @@ public class PlayerNotifier implements Listener { int pop = m_plugin.playerWatcher().playersInRegion(event.newRegion).size(); Location center = event.newRegion.location(); int altitude = center.getBlockY(); - ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); - if (protocolManager != null) { - PacketContainer chatMessage = protocolManager.createPacket(PacketType.Play.Server.TITLE); + if (m_protocolManager != null) { String colorHex = "#" + String.format("%06X", event.newRegion.color().getColor().asRGB()); - chatMessage.getChatComponents().write(0, WrappedChatComponent.fromJson("{text:\"" + event.newRegion.name() + "\", color: \""+colorHex+"\"}")); - try { - protocolManager.sendServerPacket(event.player, chatMessage); - } catch (Exception e) { - } - chatMessage = protocolManager.createPacket(PacketType.Play.Server.TITLE); - chatMessage.getChatComponents().write(0, WrappedChatComponent.fromJson("{text:\"Population: " + pop + " Altitude: "+ altitude + "\", color: \"#ffffff\"}")); - chatMessage.getTitleActions().write(0, TitleAction.SUBTITLE); - try { - protocolManager.sendServerPacket(event.player, chatMessage); - } catch (Exception e) { - } - chatMessage = protocolManager.createPacket(PacketType.Play.Server.TITLE); - chatMessage.getChatComponents().write(0, WrappedChatComponent.fromJson("{text:\"Now entering " + event.newRegion.name() + "\", color: \""+colorHex+"\"}")); - chatMessage.getTitleActions().write(0, TitleAction.ACTIONBAR); - try { - protocolManager.sendServerPacket(event.player, chatMessage); - } catch (Exception e) { - } + WrappedChatComponent titleComponent = WrappedChatComponent.fromJson("{text:\"" + event.newRegion.name() + "\", color: \""+colorHex+"\"}"); + WrappedChatComponent subtitleComponent = WrappedChatComponent.fromJson("{text:\"Population: " + pop + " Altitude: "+ altitude + "\", color: \"#ffffff\"}"); + WrappedChatComponent actionBarComponent = WrappedChatComponent.fromJson("{text:\"Now entering " + event.newRegion.name() + "\", color: \""+colorHex+"\"}"); + sendTitle(event.player, titleComponent, subtitleComponent); + sendActionBar(event.player, actionBarComponent); + } else { + // Fallback to approximated colors event.player.sendTitle(event.newRegion.coloredName(), "Population: " + pop + " Altitude: " + altitude); } } @@ -106,25 +148,16 @@ public class PlayerNotifier implements Listener { if (event.region.markSeenByPlayer(event.player)) { event.player.playSound(event.region.location(), Sound.UI_TOAST_CHALLENGE_COMPLETE, (float)1, (float)1); - ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager(); - - if (protocolManager != null) { - PacketContainer chatMessage = protocolManager.createPacket(PacketType.Play.Server.TITLE); + if (m_protocolManager != null) { String colorHex = "#" + String.format("%06X", event.region.color().getColor().asRGB()); - chatMessage.getChatComponents().write(0, WrappedChatComponent.fromJson("{text:\"Region discovered\", color: \""+colorHex+"\"}")); - try { - protocolManager.sendServerPacket(event.player, chatMessage); - } catch (Exception e) { - } - chatMessage = protocolManager.createPacket(PacketType.Play.Server.TITLE); - chatMessage.getChatComponents().write(0, WrappedChatComponent.fromJson("{text:\"You discovered the region " + event.region.name() + "\", color: \""+colorHex+"\"}")); - chatMessage.getTitleActions().write(0, TitleAction.SUBTITLE); - try { - protocolManager.sendServerPacket(event.player, chatMessage); - } catch (Exception e) { - } + WrappedChatComponent discoverTitle = WrappedChatComponent.fromJson("{text:\"Region discovered\", color: \""+colorHex+"\"}"); + WrappedChatComponent discoverSubtitle = WrappedChatComponent.fromJson("{text:\"You discovered the region " + event.region.name() + "\", color: \""+colorHex+"\"}"); + sendTitle(event.player, discoverTitle, discoverSubtitle); + } else { - //FIXME: also show pop/alt subtitle + // Fallback to approximated colors + // TODO: Apply region color to the rest of the title and subtitle + // text event.player.sendTitle("Region Discovered", "You discovered the region " + event.region.coloredName()); }