Skip to content

Instantly share code, notes, and snippets.

@windopper
Last active March 9, 2022 07:54
Show Gist options
  • Save windopper/d8abcdbc69310392711c0e6e622bffd9 to your computer and use it in GitHub Desktop.
Save windopper/d8abcdbc69310392711c0e6e622bffd9 to your computer and use it in GitHub Desktop.

Revisions

  1. windopper revised this gist Mar 9, 2022. 1 changed file with 35 additions and 16 deletions.
    51 changes: 35 additions & 16 deletions KeyDisplay.java
    Original file line number Diff line number Diff line change
    @@ -1,7 +1,7 @@
    package KeyBinds;

    import Data.Constants;
    import Data.CoreData;
    import Data.PlayerCoreData;
    import Main.main;
    import net.minecraft.network.protocol.game.PacketPlayOutSetSlot;
    import net.minecraft.server.network.PlayerConnection;
    @@ -18,27 +18,27 @@

    public class KeyDisplay {

    final private static HashMap<CoreData, KeyDisplay> instances = new HashMap<>();
    private final CoreData coreData;
    final private static HashMap<PlayerCoreData, KeyDisplay> instances = new HashMap<>();
    private final PlayerCoreData playerCoreData;
    private final Player player;
    private ItemStack original;
    private int COUNT = 0;

    private KeyDisplay(CoreData coreData) {
    this.coreData = coreData;
    this.player = (Player) coreData.master;
    private KeyDisplay(PlayerCoreData playerCoreData) {
    this.playerCoreData = playerCoreData;
    this.player = playerCoreData.master;
    init();
    }

    public static KeyDisplay getInstance(CoreData coreData) {
    if(instances.containsKey(coreData)) return instances.get(coreData);
    KeyDisplay instance = new KeyDisplay(coreData);
    instances.put(coreData, instance);
    public static KeyDisplay getInstance(PlayerCoreData playerCoreData) {
    if(instances.containsKey(playerCoreData)) return instances.get(playerCoreData);
    KeyDisplay instance = new KeyDisplay(playerCoreData);
    instances.put(playerCoreData, instance);
    return instance;
    }

    public void removeInstance() {
    instances.remove(this.coreData);
    instances.remove(this.playerCoreData);
    }

    private void init() {
    @@ -90,10 +90,12 @@ private void sendFakeItemToClientBound(int slot, String displayName) {

    public void updateItemKeyBindsDisplay() {

    if(!isHeldItemHasItemMeta()) return;

    COUNT = 0;
    restorationItemInServerBound();

    List<Keys> keysList = coreData.keys;
    List<Keys> keysList = playerCoreData.keys;
    Keys first = keysList.size() >= 1 ? keysList.get(0) : null;
    Keys second = keysList.size() >= 2 ? keysList.get(1) : null;
    Keys third = keysList.size() >= 3 ? keysList.get(2) : null;
    @@ -102,15 +104,32 @@ public void updateItemKeyBindsDisplay() {
    original = player.getInventory().getItemInMainHand();

    String display = "";
    if(first != null) display += "§a§n"+first+"§r§l-";
    else display += "§n §r§l-";
    if(first != null) display += "§a§n"+first+"§r§7-";
    else display += "§n §7§r-";

    if(second != null) display += "§a§n"+second+"§r§l-";
    else display += "§n §r§l-";
    if(second != null) display += "§a§n"+second+"§r§7-";
    else display += "§n §7§r-";

    if(third != null) display += "§a§n"+third;
    else display += "§n ";

    sendFakeItemToClientBound(slot, display);
    }

    public void updateItemDisplayToClientBound(String displayName) {

    if(!isHeldItemHasItemMeta()) return;

    COUNT = 0;
    restorationItemInServerBound();

    int slot = player.getInventory().getHeldItemSlot();
    original = player.getInventory().getItemInMainHand();

    sendFakeItemToClientBound(slot, displayName);
    }

    private boolean isHeldItemHasItemMeta() {
    return player.getInventory().getItemInMainHand().getItemMeta() != null;
    }
    }
  2. windopper created this gist Mar 6, 2022.
    116 changes: 116 additions & 0 deletions KeyDisplay.java
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,116 @@
    package KeyBinds;

    import Data.Constants;
    import Data.CoreData;
    import Main.main;
    import net.minecraft.network.protocol.game.PacketPlayOutSetSlot;
    import net.minecraft.server.network.PlayerConnection;
    import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer;
    import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack;
    import org.bukkit.entity.Player;
    import org.bukkit.inventory.ItemStack;
    import org.bukkit.inventory.meta.ItemMeta;
    import org.bukkit.scheduler.BukkitRunnable;

    import java.util.HashMap;
    import java.util.List;
    import java.util.ListIterator;

    public class KeyDisplay {

    final private static HashMap<CoreData, KeyDisplay> instances = new HashMap<>();
    private final CoreData coreData;
    private final Player player;
    private ItemStack original;
    private int COUNT = 0;

    private KeyDisplay(CoreData coreData) {
    this.coreData = coreData;
    this.player = (Player) coreData.master;
    init();
    }

    public static KeyDisplay getInstance(CoreData coreData) {
    if(instances.containsKey(coreData)) return instances.get(coreData);
    KeyDisplay instance = new KeyDisplay(coreData);
    instances.put(coreData, instance);
    return instance;
    }

    public void removeInstance() {
    instances.remove(this.coreData);
    }

    private void init() {

    original = player.getInventory().getItemInMainHand();

    new BukkitRunnable() {
    @Override
    public void run() {

    if(COUNT >= Constants.KEY_WAIT.getValue()) {
    restorationItemInServerBound();
    removeInstance();
    cancel();
    return;
    }
    COUNT++;
    }
    }.runTaskTimer(main.getPlugin(main.class), 0, 1);
    }

    private void restorationItemInServerBound() {
    ListIterator<ItemStack> iterator = player.getInventory().iterator();

    while(iterator.hasNext()) {
    ItemStack targetStack = iterator.next();
    if(targetStack == null) continue;
    if(targetStack.hashCode() != original.hashCode()) continue;

    int targetSlot = iterator.nextIndex() - 1;
    if(targetSlot <= 8) targetSlot += 36;

    PacketPlayOutSetSlot _packet = new PacketPlayOutSetSlot(0, 0, targetSlot, CraftItemStack.asNMSCopy(original));
    final PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().b;
    playerConnection.sendPacket(_packet);
    break;
    }
    }

    private void sendFakeItemToClientBound(int slot, String displayName) {
    ItemStack itemStack = original.clone();
    ItemMeta itemMeta = itemStack.getItemMeta();
    itemMeta.setDisplayName(displayName);
    itemStack.setItemMeta(itemMeta);
    final PlayerConnection playerConnection = ((CraftPlayer) player).getHandle().b;
    PacketPlayOutSetSlot packet = new PacketPlayOutSetSlot(0, 0, slot + 36, CraftItemStack.asNMSCopy(itemStack));
    playerConnection.sendPacket(packet);
    }

    public void updateItemKeyBindsDisplay() {

    COUNT = 0;
    restorationItemInServerBound();

    List<Keys> keysList = coreData.keys;
    Keys first = keysList.size() >= 1 ? keysList.get(0) : null;
    Keys second = keysList.size() >= 2 ? keysList.get(1) : null;
    Keys third = keysList.size() >= 3 ? keysList.get(2) : null;

    int slot = player.getInventory().getHeldItemSlot();
    original = player.getInventory().getItemInMainHand();

    String display = "";
    if(first != null) display += "§a§n"+first+"§r§l-";
    else display += "§n §r§l-";

    if(second != null) display += "§a§n"+second+"§r§l-";
    else display += "§n §r§l-";

    if(third != null) display += "§a§n"+third;
    else display += "§n ";

    sendFakeItemToClientBound(slot, display);
    }
    }