diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java index 00c3208be..238ecf582 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/Protocol1_9TO1_8.java @@ -10,6 +10,7 @@ import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.ViaVersion; import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.remapper.ValueTransformer; @@ -62,23 +63,27 @@ public class Protocol1_9TO1_8 extends Protocol { return line; } - public static ItemStack getHandItem(final UserConnection info) { - try { - return Bukkit.getScheduler().callSyncMethod(Bukkit.getPluginManager().getPlugin("ViaVersion"), new Callable() { - @Override - public ItemStack call() throws Exception { - UUID playerUUID = info.get(ProtocolInfo.class).getUuid(); - if (Bukkit.getPlayer(playerUUID) != null) { - return Bukkit.getPlayer(playerUUID).getItemInHand(); + public static Item getHandItem(final UserConnection info) { + if(HandItemCache.CACHE){ + return HandItemCache.getHandItem(info.get(ProtocolInfo.class).getUuid()); + }else { + try { + return Bukkit.getScheduler().callSyncMethod(Bukkit.getPluginManager().getPlugin("ViaVersion"), new Callable() { + @Override + public Item call() throws Exception { + UUID playerUUID = info.get(ProtocolInfo.class).getUuid(); + if (Bukkit.getPlayer(playerUUID) != null) { + return Item.getItem(Bukkit.getPlayer(playerUUID).getItemInHand()); + } + return null; } - return null; - } - }).get(10, TimeUnit.SECONDS); - } catch (Exception e) { - System.out.println("Error fetching hand item: " + e.getClass().getName()); - if (ViaVersion.getInstance().isDebug()) - e.printStackTrace(); - return null; + }).get(10, TimeUnit.SECONDS); + } catch (Exception e) { + System.out.println("Error fetching hand item: " + e.getClass().getName()); + if (ViaVersion.getInstance().isDebug()) + e.printStackTrace(); + return null; + } } } @@ -104,6 +109,10 @@ public class Protocol1_9TO1_8 extends Protocol { } if (plugin.getConfig().getBoolean("simulate-pt", true)) new ViaIdleThread(plugin.getPortedPlayers()).runTaskTimerAsynchronously(plugin, 1L, 1L); // Updates player's idle status + if (plugin.getConfig().getBoolean("item-cache", true)) { + new HandItemCache().runTaskTimerAsynchronously(plugin, 2L, 2L); // Updates player's items :) + HandItemCache.CACHE = true; + } } @Override diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/HandItemCache.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/HandItemCache.java new file mode 100644 index 000000000..ed1791ca7 --- /dev/null +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/listeners/HandItemCache.java @@ -0,0 +1,36 @@ +package us.myles.ViaVersion.protocols.protocol1_9to1_8.listeners; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import us.myles.ViaVersion.api.minecraft.item.Item; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public class HandItemCache extends BukkitRunnable { + public static boolean CACHE = false; + private static ConcurrentHashMap handCache = new ConcurrentHashMap<>(); + + public static Item getHandItem(UUID player) { + if (!handCache.containsKey(player)) + return null; + return handCache.get(player); + } + + @Override + public void run() { + List players = new ArrayList<>(handCache.keySet()); + + for (Player p : Bukkit.getOnlinePlayers()) { + handCache.put(p.getUniqueId(), Item.getItem(p.getItemInHand())); + players.remove(p.getUniqueId()); + } + // Remove offline players + for (UUID uuid : players) { + handCache.remove(uuid); + } + } +} diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java index 6701e4f31..fdc1f1ccf 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/WorldPackets.java @@ -288,7 +288,7 @@ public class WorldPackets { wrapper.write(Type.LONG, -1L); wrapper.write(Type.BYTE, (byte) 255); // Write item in hand - Item item = Item.getItem(Protocol1_9TO1_8.getHandItem(wrapper.user())); + Item item = Protocol1_9TO1_8.getHandItem(wrapper.user()); // Blocking patch if (ViaVersion.getConfig().isShieldBlocking()) { if (item != null) { @@ -368,7 +368,7 @@ public class WorldPackets { create(new ValueCreator() { @Override public void write(PacketWrapper wrapper) throws Exception { - Item item = Item.getItem(Protocol1_9TO1_8.getHandItem(wrapper.user())); + Item item = Protocol1_9TO1_8.getHandItem(wrapper.user()); wrapper.write(Type.ITEM, item); // 3 - Item } }); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index cf13d3e19..e17bdb175 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -28,4 +28,6 @@ use-new-deathmessages: false # This error message means one of you plugins is sending bad packets! suppress-entityid-errors: false # Our patch for block breaking issue, if you have issues with block updates then disable this. -block-break-patch: true \ No newline at end of file +block-break-patch: true +# Should we cache our items, this will prevent server from being lagged out, however the cost is a constant task caching items +item-cache: true \ No newline at end of file