diff --git a/BauSystem_Main/build.gradle b/BauSystem_Main/build.gradle index 9629d086..32d7760b 100644 --- a/BauSystem_Main/build.gradle +++ b/BauSystem_Main/build.gradle @@ -61,6 +61,5 @@ dependencies { compileOnly files("${projectDir}/../lib/Spigot-1.15.jar") compileOnly files("${projectDir}/../lib/WorldEdit-1.15.jar") - compileOnly files("${projectDir}/../lib/ProtocolLib.jar") compileOnly files("${projectDir}/../lib/SpigotCore.jar") } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/detonator/DetonatorListener.java b/BauSystem_Main/src/de/steamwar/bausystem/features/detonator/DetonatorListener.java index c699211e..4a7ae09b 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/detonator/DetonatorListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/detonator/DetonatorListener.java @@ -19,17 +19,14 @@ package de.steamwar.bausystem.features.detonator; -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.tinyprotocol.Reflection; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.SWUtils; import de.steamwar.bausystem.features.detonator.storage.DetonatorStorage; import de.steamwar.bausystem.features.detonator.storage.ItemStorage; import de.steamwar.bausystem.linkage.LinkageType; import de.steamwar.bausystem.linkage.Linked; +import de.steamwar.bausystem.utils.ProtocolAPI; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -49,30 +46,29 @@ import java.util.Set; @Linked(LinkageType.LISTENER) public class DetonatorListener implements Listener { + public static final Class useEntity = Reflection.getClass("{nms}.PacketPlayInUseEntity"); + private static final Reflection.FieldAccessor entityIdFieldAccessor = Reflection.getField(useEntity, int.class, 0); + private static final Set HAS_UPDATED = new HashSet<>(); public DetonatorListener() { - ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(BauSystem.getInstance(), PacketType.Play.Client.USE_ENTITY) { - @Override - public void onPacketReceiving(PacketEvent event) { - List entities = new ArrayList<>(Detonator.getDetoEntities(event.getPlayer())); - if (entities.isEmpty()) { - return; - } - - PacketContainer container = event.getPacket(); - int entityId = container.getIntegers().read(0); - entities.removeIf(abstractDetonatorEntity -> abstractDetonatorEntity.getId() != entityId); - - if (entities.isEmpty()) { - return; - } - AbstractDetonatorEntity entity = entities.get(0); - Location location = entity.getBukkitEntity().getLocation().getBlock().getLocation(); - addLocationToDetonator(location, event.getPlayer()); - HAS_UPDATED.add(event.getPlayer()); - event.setCancelled(true); + ProtocolAPI.setIncomingHandler(useEntity, (player, o) -> { + List entities = new ArrayList<>(Detonator.getDetoEntities(player)); + if (entities.isEmpty()) { + return o; } + + int entityId = entityIdFieldAccessor.get(o); + entities.removeIf(abstractDetonatorEntity -> abstractDetonatorEntity.getId() != entityId); + + if (entities.isEmpty()) { + return o; + } + AbstractDetonatorEntity entity = entities.get(0); + Location location = entity.getBukkitEntity().getLocation().getBlock().getLocation(); + addLocationToDetonator(location, player); + HAS_UPDATED.add(player); + return null; }); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/other/NoClipCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/other/NoClipCommand.java index 5ae234d5..ef0bbad8 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/other/NoClipCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/other/NoClipCommand.java @@ -19,11 +19,8 @@ package de.steamwar.bausystem.features.other; -import com.comphenix.protocol.wrappers.EnumWrappers; -import com.comphenix.protocol.wrappers.PlayerInfoData; -import com.comphenix.protocol.wrappers.WrappedChatComponent; -import com.comphenix.protocol.wrappers.WrappedGameProfile; import com.comphenix.tinyprotocol.Reflection; +import com.mojang.authlib.GameProfile; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.tpslimit.TPSUtils; import de.steamwar.bausystem.linkage.LinkageType; @@ -32,6 +29,8 @@ import de.steamwar.bausystem.utils.ProtocolAPI; import de.steamwar.command.SWCommand; import de.steamwar.core.VersionedRunnable; import lombok.Getter; +import net.minecraft.server.v1_15_R1.EnumGamemode; +import net.minecraft.server.v1_15_R1.IChatBaseComponent; import net.minecraft.server.v1_15_R1.PacketPlayOutPlayerInfo; import org.bukkit.GameMode; import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; @@ -109,9 +108,11 @@ public class NoClipCommand extends SWCommand implements Listener { Object playerInfoObject = Reflection.newInstance(playerInfo); playerInfoAction.set(playerInfoObject, PacketPlayOutPlayerInfo.EnumPlayerInfoAction.UPDATE_GAME_MODE); - List playerInfoActions = new ArrayList<>(); - playerInfoActions.add(new PlayerInfoData(WrappedGameProfile.fromPlayer(player), 1, EnumWrappers.NativeGameMode.SPECTATOR, WrappedChatComponent.fromText(player.getDisplayName()))); - playerInfoDataList.set(playerInfoObject, playerInfoActions); + PacketPlayOutPlayerInfo packetPlayOutPlayerInfo = (PacketPlayOutPlayerInfo) playerInfoObject; + + List playerInfoData = new ArrayList<>(); + playerInfoData.add(packetPlayOutPlayerInfo.new PlayerInfoData(new GameProfile(player.getUniqueId(), player.getName()), 1, EnumGamemode.SPECTATOR, IChatBaseComponent.ChatSerializer.b(player.getDisplayName()))); + playerInfoDataList.set(playerInfoObject, playerInfoData); Object gameStateChangeObject = Reflection.newInstance(gameStateChange); integerFieldAccessor.set(gameStateChangeObject, 3); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/utils/ProtocolAPI.java b/BauSystem_Main/src/de/steamwar/bausystem/utils/ProtocolAPI.java index eab08b08..e88e7c94 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/utils/ProtocolAPI.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/utils/ProtocolAPI.java @@ -81,33 +81,6 @@ public class ProtocolAPI { Bukkit.getOnlinePlayers().stream().map(tinyProtocol::getChannel).filter(tinyProtocol::hasInjected).forEach(channel -> tinyProtocol.sendPacket(channel, packet)); } - public static BiFunction, Object> arrayCloneGenerator(Class elementClass) { - return (array, worker) -> { - int length = Array.getLength(array); - Object result = Array.newInstance(elementClass, length); - - for (int i = 0; i < length; i++) - Array.set(result, i, worker.apply(Array.get(array, i))); - - return result; - }; - } - - public static UnaryOperator shallowCloneGenerator(Class clazz) { - BiConsumer filler = shallowFill(clazz); - - return source -> { - Object clone; - try { - clone = clazz.newInstance(); - } catch (InstantiationException | IllegalAccessException e) { - throw new IllegalStateException("Could not clone " + clazz.getName(), e); - } - filler.accept(source, clone); - return clone; - }; - } - private static BiConsumer shallowFill(Class clazz) { if (clazz == null) return (source, clone) -> {