From 6376ef7dd5e8e86089811db476f26145c51dda26 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Mon, 1 Feb 2021 13:42:19 +0100 Subject: [PATCH] Add Shift + Right Click Edit Sign --- BauSystem_Main/pom.xml | 7 ++ .../bausystem/world/RegionListener.java | 64 +++++++++++++++++++ BauSystem_Main/src/plugin.yml | 2 +- 3 files changed, 72 insertions(+), 1 deletion(-) diff --git a/BauSystem_Main/pom.xml b/BauSystem_Main/pom.xml index 3aa54e7..cb63fc7 100644 --- a/BauSystem_Main/pom.xml +++ b/BauSystem_Main/pom.xml @@ -79,5 +79,12 @@ system ${main.basedir}/lib/WorldEdit-1.15.jar + + steamwar + ProtocolLib + 4.5.0 + system + ${main.basedir}/lib/ProtocolLib.jar + diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/RegionListener.java b/BauSystem_Main/src/de/steamwar/bausystem/world/RegionListener.java index 0719a4f..a7641e7 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/RegionListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/RegionListener.java @@ -20,18 +20,33 @@ package de.steamwar.bausystem.world; +import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.events.PacketAdapter; +import com.comphenix.protocol.events.PacketContainer; +import com.comphenix.protocol.events.PacketEvent; +import com.comphenix.protocol.wrappers.BlockPosition; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; import de.steamwar.core.Core; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import com.comphenix.protocol.ProtocolLibrary; +import org.bukkit.block.Block; +import org.bukkit.block.Sign; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; +import org.bukkit.event.player.PlayerInteractEvent; + +import java.util.logging.Level; + +import java.lang.reflect.InvocationTargetException; public class RegionListener implements Listener { @@ -98,4 +113,53 @@ public class RegionListener implements Listener { event.setLine(i, line); } } + + @EventHandler + public void editSign(PlayerInteractEvent event) { + if(event.getAction() != Action.RIGHT_CLICK_BLOCK || + !event.getClickedBlock().getType().name().contains("_SIGN") || + !event.getPlayer().isSneaking()) + return; + Player player = event.getPlayer(); + Sign sign = (Sign) event.getClickedBlock().getState(); + String[] lines = sign.getLines(); + for (int i = 0; i < lines.length; i++) { + sign.setLine(i, lines[i].replace('ยง', '&')); + } + sign.update(); + PacketContainer signOpen = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.OPEN_SIGN_EDITOR); + signOpen.getBlockPositionModifier().write(0, new BlockPosition(event.getClickedBlock().getLocation().toVector())); + try { + ProtocolLibrary.getProtocolManager().sendServerPacket(player, signOpen); + } catch (InvocationTargetException e) { + Bukkit.getLogger().log(Level.SEVERE, "Invocation target exception", e); + } + + ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(BauSystem.getPlugin(), PacketType.Play.Client.UPDATE_SIGN) { + @Override + public void onPacketReceiving(PacketEvent event) { + if(!event.getPlayer().equals(player)) + return; + event.setCancelled(true); + Bukkit.getScheduler().runTask(BauSystem.getPlugin(), () -> { + PacketContainer packetContainer = event.getPacket(); + BlockPosition position = packetContainer.getBlockPositionModifier().read(0); + String[] lines = packetContainer.getStringArrays().read(0); + + Block signLoc = position.toLocation(player.getWorld()).getBlock(); + if(!signLoc.getType().name().contains("_SIGN")) + return; + + Sign sign = ((Sign) signLoc.getState()); + sign.setEditable(true); + for (int i = 0; i < lines.length; i++) { + sign.setLine(i, ChatColor.translateAlternateColorCodes('&', lines[i])); + } + sign.update(); + + ProtocolLibrary.getProtocolManager().removePacketListener(this); + }); + } + }); + } } diff --git a/BauSystem_Main/src/plugin.yml b/BauSystem_Main/src/plugin.yml index bc85fb9..5460f05 100644 --- a/BauSystem_Main/src/plugin.yml +++ b/BauSystem_Main/src/plugin.yml @@ -1,7 +1,7 @@ name: BauSystem author: Lixfel version: "1.0" -depend: [WorldEdit, SpigotCore] +depend: [WorldEdit, SpigotCore, ProtocolLib] load: POSTWORLD main: de.steamwar.bausystem.BauSystem api-version: "1.13"