Skip to content

Commit

Permalink
Fix support for action messages in 1.8 (Fixes #16)
Browse files Browse the repository at this point in the history
  • Loading branch information
games647 committed Sep 20, 2017
1 parent d48a722 commit 7a60da2
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 54 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
<packaging>jar</packaging>

<name>mcMMOAction</name>
<version>2.0</version>
<version>2.0.1</version>
<inceptionYear>2016</inceptionYear>
<url>https://dev.bukkit.org/bukkit-plugins/mcmmoaction/</url>
<description>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.utility.MinecraftVersion;
import com.comphenix.protocol.wrappers.EnumWrappers.ChatType;
import com.comphenix.protocol.wrappers.WrappedChatComponent;
import com.github.games647.mcmmoaction.mcMMOAction;
Expand All @@ -25,18 +24,12 @@

public class MessageListener extends PacketAdapter {

private static final byte NORMAL_CHAT_POSITION = 1;
private static final byte ACTION_BAR_POSITION = 2;
private static final String PLUGIN_TAG = "[mcMMO] ";

private final mcMMOAction plugin;

private final Pattern pluginTagPattern = Pattern.compile(PLUGIN_TAG);

private final MinecraftVersion currentVersion = MinecraftVersion.getCurrentVersion();
//in comparison to the ProtocolLib variant this includes the build number
private final MinecraftVersion explorationUpdate = new MinecraftVersion(1, 11, 2);

//compile the pattern just once - remove the comma so it also detect numbers like (10,000)
private final Pattern numberRemover = Pattern.compile("[,0-9]");

Expand All @@ -55,59 +48,61 @@ public MessageListener(mcMMOAction plugin, Set<String> messages) {

@Override
public void onPacketSending(PacketEvent packetEvent) {
if (packetEvent.isCancelled()) {
PacketContainer packet = packetEvent.getPacket();
if (packetEvent.isCancelled() || packet.hasMetadata(plugin.getName())) {
return;
}

PacketContainer packet = packetEvent.getPacket();

byte chatType = readChatPosition(packet);
ChatType chatType = readChatPosition(packet);
Player player = packetEvent.getPlayer();
if (chatType == NORMAL_CHAT_POSITION
&& !plugin.getDisabledActionBar().contains(player.getUniqueId())
&& player.hasPermission(plugin.getName().toLowerCase() + ".display")) {
WrappedChatComponent message = packet.getChatComponents().read(0);
if (message == null) {
return;
}

String json = message.getJson();
String cleanedJson = JSONValue.toJSONString(cleanJsonFromHover(json));
if (cleanedJson == null) {
return;
}

BaseComponent chatComponent = ComponentSerializer.parse(cleanedJson)[0];
if (chatComponent != null && isMcmmoMessage(chatComponent.toPlainText())) {
writeChatPosition(packet, ACTION_BAR_POSITION);

//action bar doesn't support the new chat features
String legacyText = pluginTagPattern.matcher(chatComponent.toLegacyText()).replaceFirst("");
packet.getChatComponents().write(0, WrappedChatComponent.fromText(legacyText));
plugin.playNotificationSound(player);
}
if (chatType != ChatType.SYSTEM
|| plugin.getDisabledActionBar().contains(player.getUniqueId())
|| !player.hasPermission(plugin.getName().toLowerCase() + ".display")) {
return;
}

WrappedChatComponent message = packet.getChatComponents().read(0);
if (message == null) {
return;
}

String json = message.getJson();
String cleanedJson = JSONValue.toJSONString(cleanJsonFromHover(json));
if (cleanedJson == null) {
return;
}

BaseComponent chatComponent = ComponentSerializer.parse(cleanedJson)[0];
if (chatComponent != null && isMcMMOMessage(chatComponent.toPlainText())) {
writeChatPosition(packet, ChatType.GAME_INFO);

//action bar doesn't support the new chat features
String legacyText = pluginTagPattern.matcher(chatComponent.toLegacyText()).replaceFirst("");
packet.getChatComponents().write(0, WrappedChatComponent.fromText(legacyText));
plugin.playNotificationSound(player);
}
}

private boolean isMcmmoMessage(String plainText) {
private boolean isMcMMOMessage(String plainText) {
//remove the numbers to match the string easier
String cleanedMessage = numberRemover.matcher(plainText).replaceAll("");
return localizedMessages.contains(cleanedMessage);
}

private byte readChatPosition(PacketContainer packet) {
if (supportsChatTypeEnum()) {
return packet.getChatTypes().read(0).getId();
private ChatType readChatPosition(PacketContainer packet) {
if (plugin.supportsChatTypeEnum()) {
return packet.getChatTypes().read(0);
}

return packet.getBytes().read(0);
byte positionId = packet.getBytes().read(0);
return ChatType.values()[positionId];
}

private void writeChatPosition(PacketContainer packet, byte positionId) {
if (supportsChatTypeEnum()) {
packet.getChatTypes().writeSafely(0, ChatType.values()[positionId]);
private void writeChatPosition(PacketContainer packet, ChatType position) {
if (plugin.supportsChatTypeEnum()) {
packet.getChatTypes().writeSafely(0, position);
} else {
packet.getBytes().writeSafely(0, positionId);
packet.getBytes().writeSafely(0, position.getId());
}
}

Expand Down Expand Up @@ -150,8 +145,4 @@ private static void removeHoverEvent(JSONArray components) {
cleanJsonFromHover(jsonComponent);
});
}

private boolean supportsChatTypeEnum() {
return currentVersion.compareTo(explorationUpdate) > 0;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,12 @@
import com.gmail.nossr50.datatypes.skills.SkillType;
import com.gmail.nossr50.events.experience.McMMOPlayerXpGainEvent;

import net.md_5.bungee.api.chat.TextComponent;

import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerQuitEvent;

import static net.md_5.bungee.api.ChatMessageType.ACTION_BAR;

public class PlayerListener implements Listener {

private final mcMMOAction plugin;
Expand All @@ -38,7 +34,7 @@ public void onExperienceGain(McMMOPlayerXpGainEvent experienceEvent) {
Player player = experienceEvent.getPlayer();
coloredMessage = replaceVariables(experienceEvent, coloredMessage, player);

player.spigot().sendMessage(ACTION_BAR, TextComponent.fromLegacyText(coloredMessage));
plugin.sendActionMessage(player, coloredMessage);
}
}

Expand Down
50 changes: 49 additions & 1 deletion src/main/java/com/github/games647/mcmmoaction/mcMMOAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,38 @@

import com.comphenix.protocol.ProtocolLibrary;
import com.comphenix.protocol.ProtocolManager;
import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.utility.MinecraftVersion;
import com.comphenix.protocol.wrappers.EnumWrappers.ChatType;
import com.comphenix.protocol.wrappers.WrappedChatComponent;
import com.github.games647.mcmmoaction.listener.MessageListener;
import com.github.games647.mcmmoaction.listener.PlayerListener;
import com.google.common.collect.Sets;

import java.lang.reflect.InvocationTargetException;
import java.util.Set;
import java.util.UUID;
import java.util.logging.Level;

import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;

import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;

import static com.comphenix.protocol.PacketType.Play.Server.CHAT;

public class mcMMOAction extends JavaPlugin {

private final Set<UUID> disabledActionBar = Sets.newHashSet();
private final Set<UUID> disabledActionBar = Sets.newConcurrentHashSet();

private Configuration configuration;

private final MinecraftVersion currentVersion = MinecraftVersion.getCurrentVersion();
//in comparison to the ProtocolLib variant this includes the build number
private final MinecraftVersion explorationUpdate = new MinecraftVersion(1, 11, 2);

@Override
public void onEnable() {
configuration = new Configuration(this);
Expand Down Expand Up @@ -50,4 +65,37 @@ public void playNotificationSound(Player player) {
player.playSound(player.getLocation(), sound, volume, pitch);
}
}

/**
* Sends the action bar message using packets in order to be compatible with 1.8
*
* @param receiver the receiver of this message
* @param message the message content
*/
public void sendActionMessage(Player receiver, String message) {
if (supportsChatTypeEnum()) {
//the API for this action bar message is available and we could use it
receiver.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(message));
return;
}

ProtocolManager protocolManager = ProtocolLibrary.getProtocolManager();
PacketContainer chatPacket = protocolManager.createPacket(CHAT);

chatPacket.getChatComponents().write(0, WrappedChatComponent.fromText(message));
chatPacket.getBytes().write(0, ChatType.GAME_INFO.getId());

//ignore our own packets
chatPacket.addMetadata(getName(), true);

try {
protocolManager.sendServerPacket(receiver, chatPacket);
} catch (InvocationTargetException invokeEx) {
getLogger().log(Level.WARNING, "Failed to send action bar message", invokeEx);
}
}

public boolean supportsChatTypeEnum() {
return currentVersion.compareTo(explorationUpdate) > 0;
}
}

0 comments on commit 7a60da2

Please sign in to comment.