diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml index 443b452..b9be69c 100644 --- a/dependency-reduced-pom.xml +++ b/dependency-reduced-pom.xml @@ -133,13 +133,19 @@ org.bukkit spigot-api + 1.8.4 + provided + + + org.bukkit + spigot-183 1.8.3 provided org.bukkit - spigot - 1.8.3 + spigot-184 + 1.8.4 provided @@ -356,7 +362,7 @@ SNAPSHOT UTF-8 - 1.8.3 + 1.8.4 diff --git a/pom.xml b/pom.xml index 9f1ad25..6d8ed86 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ UTF-8 - 1.8.3 + 1.8.4 SNAPSHOT @@ -79,8 +79,16 @@ org.bukkit - spigot - ${bukkit.version} + spigot-183 + 1.8.3 + jar + provided + + + + org.bukkit + spigot-184 + 1.8.4 jar provided diff --git a/src/main/java/com/cnaude/purpleirc/Utilities/NetPacket_183.java b/src/main/java/com/cnaude/purpleirc/Utilities/NetPacket_183.java new file mode 100644 index 0000000..1bca744 --- /dev/null +++ b/src/main/java/com/cnaude/purpleirc/Utilities/NetPacket_183.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2015 cnaude + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.cnaude.purpleirc.Utilities; + +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.wrappers.WrappedGameProfile; +import com.google.common.base.Charsets; +import com.mojang.authlib.GameProfile; +import java.util.UUID; +import net.minecraft.server.v1_8_R2.EntityPlayer; +import net.minecraft.server.v1_8_R2.MinecraftServer; +import net.minecraft.server.v1_8_R2.PacketPlayOutPlayerInfo; +import net.minecraft.server.v1_8_R2.PlayerInteractManager; + +/** + * + * @author cnaude + */ +public class NetPacket_183 { + + public static PacketContainer add(String displayName) { + UUID uuid = UUID.nameUUIDFromBytes(("OfflinePlayer:" + displayName).getBytes(Charsets.UTF_8)); + EntityPlayer pl = new EntityPlayer( + MinecraftServer.getServer(), + MinecraftServer.getServer().getWorldServer(0), + (GameProfile) (new WrappedGameProfile(uuid, displayName)).getHandle(), + new PlayerInteractManager(MinecraftServer.getServer().getWorldServer(0)) + ); + PacketPlayOutPlayerInfo pi + = new PacketPlayOutPlayerInfo( + PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, pl); + return PacketContainer.fromPacket(pi); + } + + public static PacketContainer rem(String displayName) { + UUID uuid = UUID.nameUUIDFromBytes(("OfflinePlayer:" + displayName).getBytes(Charsets.UTF_8)); + EntityPlayer pl = new EntityPlayer( + MinecraftServer.getServer(), + MinecraftServer.getServer().getWorldServer(0), + (GameProfile) (new WrappedGameProfile(uuid, displayName)).getHandle(), + new PlayerInteractManager(MinecraftServer.getServer().getWorldServer(0)) + ); + PacketPlayOutPlayerInfo pi + = new PacketPlayOutPlayerInfo( + PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, pl); + return PacketContainer.fromPacket(pi); + } + +} diff --git a/src/main/java/com/cnaude/purpleirc/Utilities/NetPacket_184.java b/src/main/java/com/cnaude/purpleirc/Utilities/NetPacket_184.java new file mode 100644 index 0000000..8643b8a --- /dev/null +++ b/src/main/java/com/cnaude/purpleirc/Utilities/NetPacket_184.java @@ -0,0 +1,63 @@ +/* + * Copyright (C) 2015 cnaude + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.cnaude.purpleirc.Utilities; + +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.wrappers.WrappedGameProfile; +import com.google.common.base.Charsets; +import com.mojang.authlib.GameProfile; +import java.util.UUID; +import net.minecraft.server.v1_8_R2.EntityPlayer; +import net.minecraft.server.v1_8_R2.MinecraftServer; +import net.minecraft.server.v1_8_R2.PacketPlayOutPlayerInfo; +import net.minecraft.server.v1_8_R2.PlayerInteractManager; + +/** + * + * @author cnaude + */ +public class NetPacket_184 { + + public static PacketContainer add(String displayName) { + UUID uuid = UUID.nameUUIDFromBytes(("OfflinePlayer:" + displayName).getBytes(Charsets.UTF_8)); + EntityPlayer pl = new EntityPlayer( + MinecraftServer.getServer(), + MinecraftServer.getServer().getWorldServer(0), + (GameProfile) (new WrappedGameProfile(uuid, displayName)).getHandle(), + new PlayerInteractManager(MinecraftServer.getServer().getWorldServer(0)) + ); + PacketPlayOutPlayerInfo pi + = new PacketPlayOutPlayerInfo( + PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, pl); + return PacketContainer.fromPacket(pi); + } + + public static PacketContainer rem(String displayName) { + UUID uuid = UUID.nameUUIDFromBytes(("OfflinePlayer:" + displayName).getBytes(Charsets.UTF_8)); + EntityPlayer pl = new EntityPlayer( + MinecraftServer.getServer(), + MinecraftServer.getServer().getWorldServer(0), + (GameProfile) (new WrappedGameProfile(uuid, displayName)).getHandle(), + new PlayerInteractManager(MinecraftServer.getServer().getWorldServer(0)) + ); + PacketPlayOutPlayerInfo pi + = new PacketPlayOutPlayerInfo( + PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, pl); + return PacketContainer.fromPacket(pi); + } + +} diff --git a/src/main/java/com/cnaude/purpleirc/Utilities/NetPackets.java b/src/main/java/com/cnaude/purpleirc/Utilities/NetPackets.java index acfffab..c626ce1 100644 --- a/src/main/java/com/cnaude/purpleirc/Utilities/NetPackets.java +++ b/src/main/java/com/cnaude/purpleirc/Utilities/NetPackets.java @@ -18,19 +18,16 @@ package com.cnaude.purpleirc.Utilities; import com.cnaude.purpleirc.PurpleBot; import com.cnaude.purpleirc.PurpleIRC; +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.Packets; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.ProtocolManager; import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.injector.PacketConstructor; import com.comphenix.protocol.reflect.FieldAccessException; import com.comphenix.protocol.wrappers.WrappedGameProfile; import com.google.common.base.Charsets; -import com.mojang.authlib.GameProfile; import java.lang.reflect.InvocationTargetException; -import java.util.UUID; -import net.minecraft.server.v1_8_R2.EntityPlayer; -import net.minecraft.server.v1_8_R2.MinecraftServer; -import net.minecraft.server.v1_8_R2.PacketPlayOutPlayerInfo; -import net.minecraft.server.v1_8_R2.PlayerInteractManager; import org.bukkit.entity.Player; import org.pircbotx.Channel; import org.pircbotx.User; @@ -43,6 +40,7 @@ public class NetPackets { PurpleIRC plugin; private final ProtocolManager protocolManager; + private PacketConstructor playerListConstructor; /** * @@ -63,6 +61,9 @@ public class NetPackets { if (!plugin.customTabList) { return; } + if (isPlayerOnline(name, ircBot, channel.getName())) { + return; + } String channelName = channel.getName(); if (ircBot.tabIgnoreNicks.containsKey(channelName)) { for (String s : ircBot.tabIgnoreNicks.get(channelName)) { @@ -112,39 +113,43 @@ public class NetPackets { String displayName = truncateName(plugin.customTabPrefix + name); PacketContainer packet = null; String version = plugin.getServer().getVersion(); - if (version.contains("MC: 1.8.3")) { + if (version.contains("MC: 1.7.10")) { + try { + packet = protocolManager.createPacket(PacketType.Play.Server.PLAYER_INFO); + packet.getIntegers().write(0, (add ? 0 : 4)); + packet.getGameProfiles().write(0, new WrappedGameProfile(java.util.UUID.nameUUIDFromBytes(("OfflinePlayer:" + name).getBytes(Charsets.UTF_8)), displayName)); + packet.getIntegers().write(1, 0); + packet.getIntegers().write(2, 0); + packet.getStrings().write(0, displayName); + } catch (Exception ex) { + plugin.logError("tabPacket: " + ex.getMessage()); + } + } else if (version.contains("MC: 1.8.3")) { try { - UUID uuid = null; // = plugin.getPlayerUuid(name); - if (uuid == null) { - uuid = UUID.nameUUIDFromBytes(("OfflinePlayer:" + displayName).getBytes(Charsets.UTF_8)); - } if (add) { - EntityPlayer pl = new EntityPlayer( - MinecraftServer.getServer(), - MinecraftServer.getServer().getWorldServer(0), - (GameProfile) (new WrappedGameProfile(uuid, displayName)).getHandle(), - new PlayerInteractManager(MinecraftServer.getServer().getWorldServer(0)) - ); - PacketPlayOutPlayerInfo pi - = new PacketPlayOutPlayerInfo( - PacketPlayOutPlayerInfo.EnumPlayerInfoAction.ADD_PLAYER, pl); - return PacketContainer.fromPacket(pi); + return NetPacket_183.add(displayName); } else { plugin.logDebug("T: Removing: " + name); - EntityPlayer pl = new EntityPlayer( - MinecraftServer.getServer(), - MinecraftServer.getServer().getWorldServer(0), - (GameProfile) (new WrappedGameProfile(uuid, displayName)).getHandle(), - new PlayerInteractManager(MinecraftServer.getServer().getWorldServer(0)) - ); - PacketPlayOutPlayerInfo pi - = new PacketPlayOutPlayerInfo( - PacketPlayOutPlayerInfo.EnumPlayerInfoAction.REMOVE_PLAYER, pl); - return PacketContainer.fromPacket(pi); + return NetPacket_183.rem(displayName); } } catch (Exception ex) { plugin.logError("tabPacket: " + ex.getMessage()); } + } else if (version.contains("MC: 1.8.4")) { + try { + if (add) { + return NetPacket_184.add(displayName); + } else { + plugin.logDebug("T: Removing: " + name); + return NetPacket_184.rem(displayName); + } + } catch (Exception ex) { + plugin.logError("tabPacket: " + ex.getMessage()); + } + } else { + plugin.logDebug("tabPacket: deprecated "); + playerListConstructor = protocolManager.createPacketConstructor(Packets.Server.PLAYER_INFO, "", false, (int) 0); + packet = playerListConstructor.createPacket(displayName, add, 0); } return packet; } @@ -193,4 +198,18 @@ public class NetPackets { return name; } } + + private boolean isPlayerOnline(String name, PurpleBot ircBot, String channel) { + if (ircBot.tabIgnoreDuplicates.containsKey(channel)) { + if (ircBot.tabIgnoreDuplicates.get(channel)) { + for (Player player : plugin.getServer().getOnlinePlayers()) { + if (name.equalsIgnoreCase(player.getName())) { + plugin.logDebug("Not adidng to tab list due to player with same name."); + return true; + } + } + } + } + return false; + } }