package de.steamwar.fightsystem.utils; import com.comphenix.protocol.PacketType; import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.reflect.StructureModifier; import com.comphenix.protocol.wrappers.BlockPosition; import com.comphenix.protocol.wrappers.ChunkCoordIntPair; import com.comphenix.protocol.wrappers.MultiBlockChangeInfo; import com.comphenix.protocol.wrappers.WrappedBlockData; import de.steamwar.core.Core; import de.steamwar.fightsystem.Config; import de.steamwar.fightsystem.FightSystem; import de.steamwar.fightsystem.IFightSystem; import javafx.util.Pair; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.entity.Player; import java.util.ArrayList; import java.util.Collections; import java.util.List; import static de.steamwar.fightsystem.utils.ITechHider.bypass; public class TechHider { private TechHider(){} private static boolean running = false; public static void init(){ if(disabled()) return; if(Core.getVersion() > 8){ ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(FightSystem.getPlugin(), PacketType.Play.Client.USE_ITEM) { @Override public void onPacketReceiving(PacketEvent e) { Player p = e.getPlayer(); if(p.getGameMode() == GameMode.SPECTATOR) e.setCancelled(true); } }); } ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(FightSystem.getPlugin(), PacketType.Play.Client.USE_ENTITY) { @Override public void onPacketReceiving(PacketEvent e) { Player p = e.getPlayer(); if(p.getGameMode() == GameMode.SPECTATOR) e.setCancelled(true); } }); } public static void start(){ if(running) return; running = true; if(disabled()) return; blockActionHider(); blockHider(); multiBlockHider(); switch(Core.getVersion()){ case 8: break; case 14: TechHider_14.start(); break; default: TechHider_12.start(); } } private static void multiBlockHider(){ ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(IFightSystem.getPlugin(), PacketType.Play.Server.MULTI_BLOCK_CHANGE) { @Override public void onPacketSending(PacketEvent e) { PacketContainer packet = e.getPacket(); Player p = e.getPlayer(); ChunkCoordIntPair pos = packet.getChunkCoordIntPairs().read(0); if(bypass(p, pos.getChunkX(), pos.getChunkZ())) return; PacketContainer cached = ITechHider.packetCache.get(packet); if(cached != null){ e.setPacket(cached); return; } cached = packet.shallowClone(); ITechHider.packetCache.put(packet, cached); e.setPacket(cached); StructureModifier blockStructure = cached.getMultiBlockChangeInfoArrays(); MultiBlockChangeInfo[] changes = blockStructure.read(0).clone(); boolean changed = false; for(MultiBlockChangeInfo mbci : changes){ WrappedBlockData block = mbci.getData(); //noinspection deprecation if(Config.HiddenBlocks.contains(block.getType().getId())){ changed = true; block.setType(ITechHider.obfuscateMaterial); mbci.setData(block); } } if(changed){ blockStructure.write(0, changes); } } }); } private static void blockHider(){ ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(IFightSystem.getPlugin(), PacketType.Play.Server.BLOCK_CHANGE) { @Override public void onPacketSending(PacketEvent e) { PacketContainer packet = e.getPacket(); BlockPosition pos = packet.getBlockPositionModifier().read(0); Player p = e.getPlayer(); if(bypass(p, ITechHider.posToChunk(pos.getX()), ITechHider.posToChunk(pos.getZ()))) return; PacketContainer cached = ITechHider.packetCache.get(packet); if(cached != null){ e.setPacket(cached); return; } cached = packet.deepClone(); ITechHider.packetCache.put(packet, cached); e.setPacket(cached); StructureModifier blockStructure = cached.getBlockData(); WrappedBlockData block = blockStructure.read(0); //noinspection deprecation if(Config.HiddenBlocks.contains(block.getType().getId())){ block.setType(ITechHider.obfuscateMaterial); blockStructure.write(0, block); } } }); } private static void blockActionHider(){ ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(IFightSystem.getPlugin(), PacketType.Play.Server.BLOCK_ACTION) { @Override public void onPacketSending(PacketEvent e) { PacketContainer packet = e.getPacket(); BlockPosition pos = packet.getBlockPositionModifier().read(0); Player p = e.getPlayer(); if(bypass(p, ITechHider.posToChunk(pos.getX()), ITechHider.posToChunk(pos.getZ()))) return; e.setCancelled(true); } }); } public static List> prepareChunkReload(Player p){ if(disabled()) return Collections.emptyList(); List> chunksToReload = new ArrayList<>(); for(int x = ITechHider.arenaMinX; x <= ITechHider.arenaMaxX; x++) for(int z = ITechHider.arenaMinZ; z <= ITechHider.arenaMaxZ; z++) if(!bypass(p, x, z)) chunksToReload.add(new Pair<>(x, z)); return chunksToReload; } public static void reloadChunks(Player p, List> chunksToReload){ if(disabled()) return; Bukkit.getScheduler().runTaskLater(FightSystem.getPlugin(), () -> { for(Pair chunk : chunksToReload){ if(bypass(p, chunk.getKey(), chunk.getValue())) reloadChunk(p, chunk); } }, 40); } private static void reloadChunk(Player p, Pair chunk){ switch(Core.getVersion()){ case 8: TechHider_8.reloadChunk(p, chunk); break; case 14: TechHider_14.reloadChunk(p, chunk); break; default: TechHider_12.reloadChunk(p, chunk); } } private static boolean disabled(){ return Config.OnlyPublicSchematics; } }