import com.comphenix.protocol.PacketType; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.wrappers.BlockPosition; import com.comphenix.protocol.wrappers.WrappedBlockData; import lombok.Data; import lombok.RequiredArgsConstructor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import java.lang.reflect.InvocationTargetException; import java.util.HashMap; import java.util.Map; import java.util.UUID; @Data @RequiredArgsConstructor public class FakeBlock { private final Location location; private final Map displayedData = new HashMap<>(); public int hashCode() { return location.hashCode(); } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; FakeBlock fakeBlock = (FakeBlock) o; return location.equals(fakeBlock.location); } public void setType(Player player, Material type) { displayedData.put(player.getUniqueId(), type.createBlockData()); } public void setData(Player player, BlockData data) { displayedData.put(player.getUniqueId(), data); } public void setType(UUID uuid, Material type) { displayedData.put(uuid, type.createBlockData()); } public void setData(UUID uuid, BlockData data) { displayedData.put(uuid, data); } public boolean isViewedBy(Player player) { return displayedData.containsKey(player.getUniqueId()); } public void revert(Player player) { revert(player, true); } public void revert(Player player, boolean sendData) { if (sendData) { setData(player, location.getBlock().getBlockData()); updateIndividually(player); } displayedData.remove(player.getUniqueId()); } public BlockData getData(Player player) { return displayedData.getOrDefault(player.getUniqueId(), null); } public BlockData getData(UUID uuid) { return displayedData.getOrDefault(uuid, null); } public void updateIndividually(Player player) { PacketContainer packet = new PacketContainer(PacketType.Play.Server.BLOCK_CHANGE); packet.getBlockPositionModifier().writeSafely(0, new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ())); packet.getBlockData().writeSafely(0, WrappedBlockData.createData(getData(player))); packet.setMeta("no-process", true); try { ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet); } catch (InvocationTargetException e) { e.printStackTrace(); } } }