() {
+ @SuppressWarnings("all")
@Override
protected void initChannel(Channel channel) throws Exception {
channel.pipeline().addLast(endInitProtocol);
@@ -141,6 +132,7 @@ public abstract class LegacyTinyProtocol {
serverChannelHandler = new ChannelInboundHandlerAdapter() {
+ @SuppressWarnings("all")
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
Channel channel = (Channel) msg;
@@ -152,12 +144,10 @@ public abstract class LegacyTinyProtocol {
};
}
- /**
- * Register bukkit events.
- */
private void registerBukkitEvents() {
listener = new Listener() {
+ @SuppressWarnings("unused")
@EventHandler(priority = EventPriority.LOWEST)
public final void onPlayerLogin(PlayerJoinEvent e) {
if (closed)
@@ -171,6 +161,7 @@ public abstract class LegacyTinyProtocol {
}
}
+ @SuppressWarnings("unused")
@EventHandler
public final void onPluginDisable(PluginDisableEvent e) {
if (e.getPlugin().equals(plugin)) {
@@ -205,9 +196,9 @@ public abstract class LegacyTinyProtocol {
Channel serverChannel = ((ChannelFuture) item).channel();
serverChannels.add(serverChannel);
- ;
+
serverChannel.pipeline().addFirst(serverChannelHandler);
- System.out.println("Server channel handler injected (" + serverChannel + ")");
+ System.out.println("[NPCLib] Server channel handler injected (" + serverChannel + ")");
looking = false;
}
}
@@ -237,118 +228,14 @@ public abstract class LegacyTinyProtocol {
}
}
- /**
- * Invoked when the server is starting to send a packet to a player.
- *
- * Note that this is not executed on the main thread.
- *
- * @param receiver - the receiving player, NULL for early login/status packets.
- * @param packet - the packet being sent.
- * @return The packet to send instead, or NULL to cancel the transmission.
- */
- public Object onPacketOutAsync(Player receiver, Object packet) {
- return packet;
- }
-
- /**
- * Invoked when the server has received a packet from a given player.
- *
- * Use {@link Channel#remoteAddress()} to get the remote address of the client.
- *
- * @param sender - the player that sent the packet, NULL for early login/status packets.
- * @param packet - the packet being received.
- * @return The packet to recieve instead, or NULL to cancel.
- */
public Object onPacketInAsync(Player sender, Object packet) {
return packet;
}
- /**
- * Send a packet to a particular player.
- *
- * Note that {@link #onPacketOutAsync(Player, Object)} will be invoked with this packet.
- *
- * @param player - the destination player.
- * @param packet - the packet to send.
- */
- public void sendPacket(Player player, Object packet) {
- sendPacket(getChannel(player), packet);
- }
-
- /**
- * Send a packet to a particular client.
- *
- * Note that {@link #onPacketOutAsync(Player, Object)} will be invoked with this packet.
- *
- * @param channel - client identified by a channel.
- * @param packet - the packet to send.
- */
- public void sendPacket(Channel channel, Object packet) {
- channel.pipeline().writeAndFlush(packet);
- }
-
- /**
- * Pretend that a given packet has been received from a player.
- *
- * Note that {@link #onPacketInAsync(Player, Object)} will be invoked with this packet.
- *
- * @param player - the player that sent the packet.
- * @param packet - the packet that will be received by the server.
- */
- public void receivePacket(Player player, Object packet) {
- receivePacket(getChannel(player), packet);
- }
-
- /**
- * Pretend that a given packet has been received from a given client.
- *
- * Note that {@link #onPacketInAsync(Player, Object)} will be invoked with this packet.
- *
- * @param channel - client identified by a channel.
- * @param packet - the packet that will be received by the server.
- */
- public void receivePacket(Channel channel, Object packet) {
- channel.pipeline().context("encoder").fireChannelRead(packet);
- }
-
- /**
- * Retrieve the name of the channel injector, default implementation is "tiny-" + plugin name + "-" + a unique ID.
- *
- * Note that this method will only be invoked once. It is no longer necessary to override this to support multiple instances.
- *
- * @return A unique channel handler name.
- */
- protected String getHandlerName() {
- return "tiny-" + plugin.getName() + "-" + ID.incrementAndGet();
- }
-
- /**
- * Add a custom channel handler to the given player's channel pipeline, allowing us to intercept sent and received packets.
- *
- * This will automatically be called when a player has logged in.
- *
- * @param player - the player to inject.
- */
- public void injectPlayer(Player player) {
+ private void injectPlayer(Player player) {
injectChannelInternal(getChannel(player)).player = player;
}
- /**
- * Add a custom channel handler to the given channel.
- *
- * @param channel - the channel to inject.
- * @return The intercepted channel, or NULL if it has already been injected.
- */
- public void injectChannel(Channel channel) {
- injectChannelInternal(channel);
- }
-
- /**
- * Add a custom channel handler to the given channel.
- *
- * @param channel - the channel to inject.
- * @return The packet interceptor.
- */
private PacketInterceptor injectChannelInternal(Channel channel) {
try {
PacketInterceptor interceptor = (PacketInterceptor) channel.pipeline().get(handlerName);
@@ -367,13 +254,7 @@ public abstract class LegacyTinyProtocol {
}
}
- /**
- * Retrieve the Netty channel associated with a player. This is cached.
- *
- * @param player - the player.
- * @return The Netty channel.
- */
- public Channel getChannel(Player player) {
+ private Channel getChannel(Player player) {
Channel channel = channelLookup.get(player.getName());
// Lookup channel again
@@ -387,37 +268,7 @@ public abstract class LegacyTinyProtocol {
return channel;
}
- public int getProtocolVersion(Player player) {
- Channel channel = channelLookup.get(player.getName());
-
- // Lookup channel again
- if (channel == null) {
- Object connection = getConnection.get(getPlayerHandle.invoke(player));
- Object manager = getManager.get(connection);
-
- channelLookup.put(player.getName(), channel = getChannel.get(manager));
- }
-
- return protocolLookup.get(channel);
- }
-
- /**
- * Uninject a specific player.
- *
- * @param player - the injected player.
- */
- public void uninjectPlayer(Player player) {
- uninjectChannel(getChannel(player));
- }
-
- /**
- * Uninject a specific channel.
- *
- * This will also disable the automatic channel injection that occurs when a player has properly logged in.
- *
- * @param channel - the injected channel.
- */
- public void uninjectChannel(final Channel channel) {
+ private void uninjectChannel(final Channel channel) {
// No need to guard against this if we're closing
if (!closed) {
uninjectedChannels.add(channel);
@@ -427,36 +278,13 @@ public abstract class LegacyTinyProtocol {
channel.eventLoop().execute(() -> channel.pipeline().remove(handlerName));
}
- /**
- * Determine if the given player has been injected by TinyProtocol.
- *
- * @param player - the player.
- * @return TRUE if it is, FALSE otherwise.
- */
- public boolean hasInjected(Player player) {
- return hasInjected(getChannel(player));
- }
-
- /**
- * Determine if the given channel has been injected by TinyProtocol.
- *
- * @param channel - the channel.
- * @return TRUE if it is, FALSE otherwise.
- */
- public boolean hasInjected(Channel channel) {
- return channel.pipeline().get(handlerName) != null;
- }
-
- /**
- * Cease listening for packets. This is called automatically when your plugin is disabled.
- */
- public final void close() {
+ private void close() {
if (!closed) {
closed = true;
// Remove our handlers
for (Player player : plugin.getServer().getOnlinePlayers()) {
- uninjectPlayer(player);
+ uninjectChannel(getChannel(player));
}
// Clean up Bukkit
@@ -465,11 +293,6 @@ public abstract class LegacyTinyProtocol {
}
}
- /**
- * Channel handler that is inserted into the player's channel pipeline, allowing us to intercept sent and received packets.
- *
- * @author Kristian
- */
private final class PacketInterceptor extends ChannelDuplexHandler {
// Updated by the login event
public volatile Player player;
@@ -491,25 +314,12 @@ public abstract class LegacyTinyProtocol {
try {
msg = onPacketInAsync(player, msg);
} catch (Exception e) {
- plugin.getLogger().log(Level.SEVERE, "Error in onPacketInAsync().", e);
+ plugin.getLogger().log(Level.SEVERE, "[NPCLib] Error in onPacketInAsync().", e);
}
if (msg != null) {
super.channelRead(ctx, msg);
}
}
-
- @Override
- public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
- try {
- msg = onPacketOutAsync(player, msg);
- } catch (Exception e) {
- plugin.getLogger().log(Level.SEVERE, "Error in onPacketOutAsync().", e);
- }
-
- if (msg != null) {
- super.write(ctx, msg, promise);
- }
- }
}
}
\ No newline at end of file
diff --git a/commons/src/main/java/com/comphenix/tinyprotocol/TinyProtocol.java b/commons/src/main/java/com/comphenix/tinyprotocol/TinyProtocol.java
index 2198573..f2a936b 100755
--- a/commons/src/main/java/com/comphenix/tinyprotocol/TinyProtocol.java
+++ b/commons/src/main/java/com/comphenix/tinyprotocol/TinyProtocol.java
@@ -21,11 +21,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.logging.Level;
/**
- * Represents a very tiny alternative to ProtocolLib.
- *
- * It now supports intercepting packets during login and status ping (such as OUT_SERVER_PING)!
- *
- * @author Kristian
+ * Minimized version of TinyProtocol by Kristian suited for NPCLib.
*/
public abstract class TinyProtocol {
private static final AtomicInteger ID = new AtomicInteger(0);
@@ -53,7 +49,7 @@ public abstract class TinyProtocol {
private Listener listener;
// Channels that have already been removed
- private Set uninjectedChannels = Collections.newSetFromMap(new MapMaker().weakKeys().makeMap());
+ private Set uninjectedChannels = Collections.newSetFromMap(new MapMaker().weakKeys().makeMap());
// List of network markers
private List networkManagers;
@@ -67,38 +63,32 @@ public abstract class TinyProtocol {
// Current handler name
private String handlerName;
- protected volatile boolean closed;
+ private volatile boolean closed;
protected Plugin plugin;
- /**
- * Construct a new instance of TinyProtocol, and start intercepting packets for all connected clients and future clients.
- *
- * You can construct multiple instances per plugin.
- *
- * @param plugin - the plugin.
- */
- public TinyProtocol(final Plugin plugin) {
+ protected TinyProtocol(final Plugin plugin) {
this.plugin = plugin;
// Compute handler name
- this.handlerName = getHandlerName();
+ this.handlerName = "tiny-" + plugin.getName() + "-" + ID.incrementAndGet();
// Prepare existing players
registerBukkitEvents();
try {
+ System.out.println("[NPCLib] Attempting to inject into netty.");
registerChannelHandler();
registerPlayers(plugin);
} catch (IllegalArgumentException ex) {
// Damn you, late bind
- plugin.getLogger().info("[TinyProtocol] Delaying server channel injection due to late bind.");
+ plugin.getLogger().info("[NPCLib] Attempting to delay injection.");
new BukkitRunnable() {
@Override
public void run() {
registerChannelHandler();
registerPlayers(plugin);
- plugin.getLogger().info("[TinyProtocol] Late bind injection successful.");
+ plugin.getLogger().info("[NPCLib] Injection complete.");
}
}.runTask(plugin);
}
@@ -108,6 +98,7 @@ public abstract class TinyProtocol {
// Handle connected channels
endInitProtocol = new ChannelInitializer() {
+ @SuppressWarnings("all")
@Override
protected void initChannel(Channel channel) throws Exception {
try {
@@ -119,7 +110,7 @@ public abstract class TinyProtocol {
}
}
} catch (Exception e) {
- plugin.getLogger().log(Level.SEVERE, "Cannot inject incomming channel " + channel, e);
+ plugin.getLogger().log(Level.SEVERE, "[NPCLib] Cannot inject incomming channel " + channel, e);
}
}
@@ -128,6 +119,7 @@ public abstract class TinyProtocol {
// This is executed before Minecraft's channel handler
beginInitProtocol = new ChannelInitializer() {
+ @SuppressWarnings("all")
@Override
protected void initChannel(Channel channel) throws Exception {
channel.pipeline().addLast(endInitProtocol);
@@ -137,6 +129,7 @@ public abstract class TinyProtocol {
serverChannelHandler = new ChannelInboundHandlerAdapter() {
+ @SuppressWarnings("all")
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
Channel channel = (Channel) msg;
@@ -149,12 +142,10 @@ public abstract class TinyProtocol {
};
}
- /**
- * Register bukkit events.
- */
private void registerBukkitEvents() {
listener = new Listener() {
+ @SuppressWarnings("unused")
@EventHandler(priority = EventPriority.LOWEST)
public final void onPlayerLogin(PlayerLoginEvent e) {
if (closed)
@@ -168,6 +159,7 @@ public abstract class TinyProtocol {
}
}
+ @SuppressWarnings("unused")
@EventHandler
public final void onPluginDisable(PluginDisableEvent e) {
if (e.getPlugin().equals(plugin)) {
@@ -195,7 +187,7 @@ public abstract class TinyProtocol {
List list = Reflection.getField(serverConnection.getClass(), List.class, i).get(serverConnection);
for (Object item : list) {
- if (!ChannelFuture.class.isInstance(item))
+ if (!(item instanceof ChannelFuture))
break;
// Channel future that contains the server connection
@@ -216,17 +208,12 @@ public abstract class TinyProtocol {
final ChannelPipeline pipeline = serverChannel.pipeline();
// Remove channel handler
- serverChannel.eventLoop().execute(new Runnable() {
-
- @Override
- public void run() {
- try {
- pipeline.remove(serverChannelHandler);
- } catch (NoSuchElementException e) {
- // That's fine
- }
+ serverChannel.eventLoop().execute(() -> {
+ try {
+ pipeline.remove(serverChannelHandler);
+ } catch (NoSuchElementException e) {
+ // That's fine
}
-
});
}
}
@@ -237,120 +224,14 @@ public abstract class TinyProtocol {
}
}
- /**
- * Invoked when the server is starting to send a packet to a player.
- *
- * Note that this is not executed on the main thread.
- *
- * @param receiver - the receiving player, NULL for early login/status packets.
- * @param channel - the channel that received the packet. Never NULL.
- * @param packet - the packet being sent.
- * @return The packet to send instead, or NULL to cancel the transmission.
- */
- public Object onPacketOutAsync(Player receiver, Channel channel, Object packet) {
+ public Object onPacketInAsync(Player sender, Object packet) {
return packet;
}
- /**
- * Invoked when the server has received a packet from a given player.
- *
- * Use {@link Channel#remoteAddress()} to get the remote address of the client.
- *
- * @param sender - the player that sent the packet, NULL for early login/status packets.
- * @param channel - channel that received the packet. Never NULL.
- * @param packet - the packet being received.
- * @return The packet to recieve instead, or NULL to cancel.
- */
- public Object onPacketInAsync(Player sender, Channel channel, Object packet) {
- return packet;
- }
-
- /**
- * Send a packet to a particular player.
- *
- * Note that {@link #onPacketOutAsync(Player, Channel, Object)} will be invoked with this packet.
- *
- * @param player - the destination player.
- * @param packet - the packet to send.
- */
- public void sendPacket(Player player, Object packet) {
- sendPacket(getChannel(player), packet);
- }
-
- /**
- * Send a packet to a particular client.
- *
- * Note that {@link #onPacketOutAsync(Player, Channel, Object)} will be invoked with this packet.
- *
- * @param channel - client identified by a channel.
- * @param packet - the packet to send.
- */
- public void sendPacket(Channel channel, Object packet) {
- channel.pipeline().writeAndFlush(packet);
- }
-
- /**
- * Pretend that a given packet has been received from a player.
- *
- * Note that {@link #onPacketInAsync(Player, Channel, Object)} will be invoked with this packet.
- *
- * @param player - the player that sent the packet.
- * @param packet - the packet that will be received by the server.
- */
- public void receivePacket(Player player, Object packet) {
- receivePacket(getChannel(player), packet);
- }
-
- /**
- * Pretend that a given packet has been received from a given client.
- *
- * Note that {@link #onPacketInAsync(Player, Channel, Object)} will be invoked with this packet.
- *
- * @param channel - client identified by a channel.
- * @param packet - the packet that will be received by the server.
- */
- public void receivePacket(Channel channel, Object packet) {
- channel.pipeline().context("encoder").fireChannelRead(packet);
- }
-
- /**
- * Retrieve the name of the channel injector, default implementation is "tiny-" + plugin name + "-" + a unique ID.
- *
- * Note that this method will only be invoked once. It is no longer necessary to override this to support multiple instances.
- *
- * @return A unique channel handler name.
- */
- protected String getHandlerName() {
- return "tiny-" + plugin.getName() + "-" + ID.incrementAndGet();
- }
-
- /**
- * Add a custom channel handler to the given player's channel pipeline, allowing us to intercept sent and received packets.
- *
- * This will automatically be called when a player has logged in.
- *
- * @param player - the player to inject.
- */
- public void injectPlayer(Player player) {
+ private void injectPlayer(Player player) {
injectChannelInternal(getChannel(player)).player = player;
}
- /**
- * Add a custom channel handler to the given channel.
- *
- * @param channel - the channel to inject.
- * @return The intercepted channel, or NULL if it has already been injected.
- */
- public void injectChannel(Channel channel) {
- injectChannelInternal(channel);
- }
-
- /**
- * Add a custom channel handler to the given channel.
- *
- * @param channel - the channel to inject.
- * @return The packet interceptor.
- */
private PacketInterceptor injectChannelInternal(Channel channel) {
try {
PacketInterceptor interceptor = (PacketInterceptor) channel.pipeline().get(handlerName);
@@ -369,13 +250,7 @@ public abstract class TinyProtocol {
}
}
- /**
- * Retrieve the Netty channel associated with a player. This is cached.
- *
- * @param player - the player.
- * @return The Netty channel.
- */
- public Channel getChannel(Player player) {
+ private Channel getChannel(Player player) {
Channel channel = channelLookup.get(player.getName());
// Lookup channel again
@@ -389,69 +264,20 @@ public abstract class TinyProtocol {
return channel;
}
- /**
- * Uninject a specific player.
- *
- * @param player - the injected player.
- */
- public void uninjectPlayer(Player player) {
- uninjectChannel(getChannel(player));
- }
-
- /**
- * Uninject a specific channel.
- *
- * This will also disable the automatic channel injection that occurs when a player has properly logged in.
- *
- * @param channel - the injected channel.
- */
- public void uninjectChannel(final Channel channel) {
- // No need to guard against this if we're closing
- if (!closed) {
- uninjectedChannels.add(channel);
- }
-
- // See ChannelInjector in ProtocolLib, line 590
- channel.eventLoop().execute(new Runnable() {
-
- @Override
- public void run() {
- channel.pipeline().remove(handlerName);
- }
-
- });
- }
-
- /**
- * Determine if the given player has been injected by TinyProtocol.
- *
- * @param player - the player.
- * @return TRUE if it is, FALSE otherwise.
- */
- public boolean hasInjected(Player player) {
- return hasInjected(getChannel(player));
- }
-
- /**
- * Determine if the given channel has been injected by TinyProtocol.
- *
- * @param channel - the channel.
- * @return TRUE if it is, FALSE otherwise.
- */
- public boolean hasInjected(Channel channel) {
- return channel.pipeline().get(handlerName) != null;
- }
-
- /**
- * Cease listening for packets. This is called automatically when your plugin is disabled.
- */
- public final void close() {
+ private void close() {
if (!closed) {
closed = true;
// Remove our handlers
for (Player player : plugin.getServer().getOnlinePlayers()) {
- uninjectPlayer(player);
+ // No need to guard against this if we're closing
+ Channel channel = getChannel(player);
+ if (!closed) {
+ uninjectedChannels.add(channel);
+ }
+
+ // See ChannelInjector in ProtocolLib, line 590
+ channel.eventLoop().execute(() -> channel.pipeline().remove(handlerName));
}
// Clean up Bukkit
@@ -460,11 +286,6 @@ public abstract class TinyProtocol {
}
}
- /**
- * Channel handler that is inserted into the player's channel pipeline, allowing us to intercept sent and received packets.
- *
- * @author Kristian
- */
private final class PacketInterceptor extends ChannelDuplexHandler {
// Updated by the login event
public volatile Player player;
@@ -476,9 +297,9 @@ public abstract class TinyProtocol {
handleLoginStart(channel, msg);
try {
- msg = onPacketInAsync(player, channel, msg);
+ msg = onPacketInAsync(player, msg);
} catch (Exception e) {
- plugin.getLogger().log(Level.SEVERE, "Error in onPacketInAsync().", e);
+ plugin.getLogger().log(Level.SEVERE, "[NPCLib] Error in onPacketInAsync().", e);
}
if (msg != null) {
@@ -486,19 +307,6 @@ public abstract class TinyProtocol {
}
}
- @Override
- public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
- try {
- msg = onPacketOutAsync(player, ctx.channel(), msg);
- } catch (Exception e) {
- plugin.getLogger().log(Level.SEVERE, "Error in onPacketOutAsync().", e);
- }
-
- if (msg != null) {
- super.write(ctx, msg, promise);
- }
- }
-
private void handleLoginStart(Channel channel, Object packet) {
if (PACKET_LOGIN_IN_START.isInstance(packet)) {
Object profile = getGameProfile.get(packet);
diff --git a/commons/src/main/java/net/jitse/npclib/NPCLib.java b/commons/src/main/java/net/jitse/npclib/NPCLib.java
index 43b541a..d304d0c 100755
--- a/commons/src/main/java/net/jitse/npclib/NPCLib.java
+++ b/commons/src/main/java/net/jitse/npclib/NPCLib.java
@@ -6,7 +6,6 @@ package net.jitse.npclib;
import net.jitse.npclib.api.NPC;
import net.jitse.npclib.listeners.ChunkListener;
-import net.jitse.npclib.listeners.LegacyPacketListener;
import net.jitse.npclib.listeners.PacketListener;
import net.jitse.npclib.listeners.PlayerListener;
import net.jitse.npclib.skin.Skin;
@@ -67,11 +66,7 @@ public class NPCLib {
pluginManager.registerEvents(new ChunkListener(), plugin);
// Boot the according packet listener.
- if (Bukkit.getBukkitVersion().contains("1.7")) {
- new LegacyPacketListener().start(plugin);
- } else {
- new PacketListener().start(plugin);
- }
+ new PacketListener().start(plugin, Bukkit.getBukkitVersion().contains("1.7"));
}
/**
diff --git a/commons/src/main/java/net/jitse/npclib/listeners/LegacyPacketListener.java b/commons/src/main/java/net/jitse/npclib/listeners/LegacyPacketListener.java
deleted file mode 100755
index fcbdc81..0000000
--- a/commons/src/main/java/net/jitse/npclib/listeners/LegacyPacketListener.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 2018 Jitse Boonstra
- */
-
-package net.jitse.npclib.listeners;
-
-import com.comphenix.tinyprotocol.LegacyTinyProtocol;
-import com.comphenix.tinyprotocol.Reflection;
-import net.jitse.npclib.NPCManager;
-import net.jitse.npclib.api.NPC;
-import net.jitse.npclib.events.NPCInteractEvent;
-import net.jitse.npclib.events.click.ClickType;
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Player;
-import org.bukkit.plugin.java.JavaPlugin;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
-
-/**
- * @author Jitse Boonstra
- */
-public class LegacyPacketListener {
-
- // Classes:
- private final Class> packetPlayInUseEntityClazz = Reflection.getMinecraftClass("PacketPlayInUseEntity");
-
- // Fields:
- private final Reflection.FieldAccessor entityIdField = Reflection.getField(packetPlayInUseEntityClazz, "a", int.class);
- private final Reflection.FieldAccessor actionField = Reflection.getField(packetPlayInUseEntityClazz, "action", Object.class);
-
- // Prevent players from clicking at very high speeds.
- private final Set delay = new HashSet<>();
-
- public void start(JavaPlugin plugin) {
- new LegacyTinyProtocol(plugin) {
-
- @Override
- public Object onPacketInAsync(Player player, Object packet) {
-
- if (packetPlayInUseEntityClazz.isInstance(packet)) {
- NPC npc = NPCManager.getAllNPCs().stream().filter(
- check -> check.isActuallyShown(player) && check.getEntityId() == (int) entityIdField.get(packet))
- .findFirst().orElse(null);
-
- if (npc == null) {
- // Default player, not doing magic with the packet.
- return super.onPacketInAsync(player, packet);
- }
-
- if (delay.contains(player.getUniqueId())) {
- return null;
- }
-
- ClickType clickType = actionField.get(packet).toString()
- .equals("ATTACK") ? ClickType.LEFT_CLICK : ClickType.RIGHT_CLICK;
-
- Bukkit.getPluginManager().callEvent(new NPCInteractEvent(player, clickType, npc));
-
- UUID uuid = player.getUniqueId();
- delay.add(uuid);
- Bukkit.getScheduler().runTask(plugin, () -> delay.remove(uuid));
- return null;
- }
-
- return super.onPacketInAsync(player, packet);
- }
- };
- }
-}
diff --git a/commons/src/main/java/net/jitse/npclib/listeners/PacketListener.java b/commons/src/main/java/net/jitse/npclib/listeners/PacketListener.java
index cb07d28..5e700d0 100755
--- a/commons/src/main/java/net/jitse/npclib/listeners/PacketListener.java
+++ b/commons/src/main/java/net/jitse/npclib/listeners/PacketListener.java
@@ -4,9 +4,9 @@
package net.jitse.npclib.listeners;
+import com.comphenix.tinyprotocol.LegacyTinyProtocol;
import com.comphenix.tinyprotocol.Reflection;
import com.comphenix.tinyprotocol.TinyProtocol;
-import io.netty.channel.Channel;
import net.jitse.npclib.NPCManager;
import net.jitse.npclib.api.NPC;
import net.jitse.npclib.events.NPCInteractEvent;
@@ -34,39 +34,77 @@ public class PacketListener {
// Prevent players from clicking at very high speeds.
private final Set delay = new HashSet<>();
- public void start(JavaPlugin plugin) {
- new TinyProtocol(plugin) {
+ public void start(JavaPlugin plugin, boolean is1_7) {
+ if (is1_7) {
+ // 1.7 R4 packet interaction.
+ new LegacyTinyProtocol(plugin) {
- @Override
- public Object onPacketInAsync(Player player, Channel channel, Object packet) {
+ @Override
+ public Object onPacketInAsync(Player player, Object packet) {
- if (packetPlayInUseEntityClazz.isInstance(packet)) {
- NPC npc = NPCManager.getAllNPCs().stream().filter(
- check -> check.isActuallyShown(player) && check.getEntityId() == (int) entityIdField.get(packet))
- .findFirst().orElse(null);
+ if (packetPlayInUseEntityClazz.isInstance(packet)) {
+ NPC npc = NPCManager.getAllNPCs().stream().filter(
+ check -> check.isActuallyShown(player) && check.getEntityId() == (int) entityIdField.get(packet))
+ .findFirst().orElse(null);
- if (npc == null) {
- // Default player, not doing magic with the packet.
- return super.onPacketInAsync(player, channel, packet);
- }
+ if (npc == null) {
+ // Default player, not doing magic with the packet.
+ return super.onPacketInAsync(player, packet);
+ }
- if (delay.contains(player.getUniqueId())) {
+ if (delay.contains(player.getUniqueId())) {
+ return null;
+ }
+
+ ClickType clickType = actionField.get(packet).toString()
+ .equals("ATTACK") ? ClickType.LEFT_CLICK : ClickType.RIGHT_CLICK;
+
+ Bukkit.getPluginManager().callEvent(new NPCInteractEvent(player, clickType, npc));
+
+ UUID uuid = player.getUniqueId();
+ delay.add(uuid);
+ Bukkit.getScheduler().runTask(plugin, () -> delay.remove(uuid));
return null;
}
- ClickType clickType = actionField.get(packet).toString()
- .equals("ATTACK") ? ClickType.LEFT_CLICK : ClickType.RIGHT_CLICK;
-
- Bukkit.getPluginManager().callEvent(new NPCInteractEvent(player, clickType, npc));
-
- UUID uuid = player.getUniqueId();
- delay.add(uuid);
- Bukkit.getScheduler().runTask(plugin, () -> delay.remove(uuid));
- return null;
+ return super.onPacketInAsync(player, packet);
}
+ };
+ } else {
+ // 1.8 (and above) packet interaction.
+ new TinyProtocol(plugin) {
- return super.onPacketInAsync(player, channel, packet);
- }
- };
+ @Override
+ public Object onPacketInAsync(Player player, Object packet) {
+
+ if (packetPlayInUseEntityClazz.isInstance(packet)) {
+ NPC npc = NPCManager.getAllNPCs().stream().filter(
+ check -> check.isActuallyShown(player) && check.getEntityId() == (int) entityIdField.get(packet))
+ .findFirst().orElse(null);
+
+ if (npc == null) {
+ // Default player, not doing magic with the packet.
+ return super.onPacketInAsync(player, packet);
+ }
+
+ if (delay.contains(player.getUniqueId())) {
+ return null;
+ }
+
+ ClickType clickType = actionField.get(packet).toString()
+ .equals("ATTACK") ? ClickType.LEFT_CLICK : ClickType.RIGHT_CLICK;
+
+ Bukkit.getPluginManager().callEvent(new NPCInteractEvent(player, clickType, npc));
+
+ UUID uuid = player.getUniqueId();
+ delay.add(uuid);
+ Bukkit.getScheduler().runTask(plugin, () -> delay.remove(uuid));
+ return null;
+ }
+
+ return super.onPacketInAsync(player, packet);
+ }
+ };
+ }
}
}