Guest User

Untitled

a guest
Feb 10th, 2024
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.04 KB | Source Code | 0 0
  1. package de.lightplugins.economy.utils;
  2.  
  3. import com.comphenix.protocol.PacketType;
  4. import com.comphenix.protocol.ProtocolLibrary;
  5. import com.comphenix.protocol.events.PacketAdapter;
  6. import com.comphenix.protocol.events.PacketContainer;
  7. import com.comphenix.protocol.events.PacketEvent;
  8. import com.comphenix.protocol.wrappers.BlockPosition;
  9. import de.lightplugins.economy.master.Main;
  10. import org.bukkit.Bukkit;
  11. import org.bukkit.Location;
  12. import org.bukkit.Material;
  13. import org.bukkit.entity.Player;
  14.  
  15. import java.util.*;
  16. import java.util.function.BiPredicate;
  17.  
  18. public class SignPackets {
  19.  
  20.     private final Main plugin;
  21.  
  22.     private final Map<Player, Menu> inputs;
  23.  
  24.     public SignPackets(Main plugin) {
  25.         this.plugin = plugin;
  26.         this.inputs = new HashMap<>();
  27.         this.listen();
  28.     }
  29.  
  30.     public Menu newMenu(List<String> text) {
  31.         return new Menu(text);
  32.     }
  33.  
  34.     private void listen() {
  35.         ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(this.plugin, PacketType.Play.Client.UPDATE_SIGN) {
  36.             @Override
  37.             public void onPacketReceiving(PacketEvent event) {
  38.                 Player player = event.getPlayer();
  39.  
  40.                 Menu menu = inputs.remove(player);
  41.  
  42.                 if (menu == null) {
  43.                     return;
  44.                 }
  45.                 event.setCancelled(true);
  46.  
  47.                 boolean success = menu.response.test(player, event.getPacket().getStringArrays().read(0));
  48.  
  49.                 if (!success && menu.reopenIfFail && !menu.forceClose) {
  50.                     Bukkit.getScheduler().runTaskLater(plugin, () -> menu.open(player), 2L);
  51.                 }
  52.                 Bukkit.getScheduler().runTaskLater(plugin, () -> {
  53.                     if (player.isOnline()) {
  54.                         player.sendBlockChange(menu.location, menu.location.getBlock().getBlockData());
  55.                     }
  56.                 }, 2L);
  57.             }
  58.         });
  59.     }
  60.  
  61.     public final class Menu {
  62.  
  63.         private final List<String> text;
  64.  
  65.         private BiPredicate<Player, String[]> response;
  66.         private boolean reopenIfFail;
  67.  
  68.         private Location location;
  69.  
  70.         private boolean forceClose;
  71.  
  72.         Menu(List<String> text) {
  73.             this.text = text;
  74.         }
  75.  
  76.         public Menu reopenIfFail(boolean value) {
  77.             this.reopenIfFail = value;
  78.             return this;
  79.         }
  80.  
  81.         public Menu response(BiPredicate<Player, String[]> response) {
  82.             this.response = response;
  83.             return this;
  84.         }
  85.  
  86.         public void open(Player player) {
  87.             Objects.requireNonNull(player, "player");
  88.             if (!player.isOnline()) {
  89.                 return;
  90.             }
  91.             location = player.getLocation();
  92.             location.setY(location.getBlockY() - 4);
  93.  
  94.             player.sendBlockChange(location, Material.OAK_SIGN.createBlockData());
  95.  
  96.             player.sendSignChange(
  97.                     // for testing harcoded sign line inputs
  98.                     location, new String[]{" ", "B", "C", "D"}
  99.                     //text.stream().map(this::color).toList().toArray(new String[3])
  100.             );
  101.  
  102.             PacketContainer openSign = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.OPEN_SIGN_EDITOR);
  103.             BlockPosition position = new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ());
  104.             openSign.getBlockPositionModifier().write(0, position);
  105.             ProtocolLibrary.getProtocolManager().sendServerPacket(player, openSign);
  106.  
  107.             inputs.put(player, this);
  108.  
  109.  
  110.         }
  111.  
  112.         public void close(Player player, boolean force) {
  113.             this.forceClose = force;
  114.             if (player.isOnline()) {
  115.                 player.closeInventory();
  116.             }
  117.         }
  118.  
  119.         public void close(Player player) {
  120.             close(player, false);
  121.         }
  122.  
  123.         private String color(String input) {
  124.             return Main.colorTranslation.hexTranslation(input);
  125.         }
  126.     }
  127. }
Advertisement
Add Comment
Please, Sign In to add comment