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());
}