diff --git a/BauSystem_15/src/de/steamwar/bausystem/utils/NMSWrapper15.java b/BauSystem_15/src/de/steamwar/bausystem/utils/NMSWrapper15.java index 76478098..651010b7 100644 --- a/BauSystem_15/src/de/steamwar/bausystem/utils/NMSWrapper15.java +++ b/BauSystem_15/src/de/steamwar/bausystem/utils/NMSWrapper15.java @@ -24,6 +24,7 @@ import de.steamwar.bausystem.entities.DetonatorEntity15; import de.steamwar.bausystem.entities.SimulatorEntity15; import de.steamwar.bausystem.entities.TraceEntity15; import de.steamwar.bausystem.features.detonator.AbstractDetonatorEntity; +import de.steamwar.bausystem.features.other.NoClipCommand; import de.steamwar.bausystem.features.simulator.AbstractSimulatorEntity; import de.steamwar.bausystem.features.tracer.AbstractTraceEntity; import de.steamwar.bausystem.features.warp.AbstractWarpEntity; @@ -46,7 +47,7 @@ import java.util.function.LongSupplier; public class NMSWrapper15 implements NMSWrapper.INMSWrapper { - private static final Reflection.FieldAccessor playerGameMode = Reflection.getField(PlayerInteractManager.class, "gamemode", EnumGamemode.class); + private static final Reflection.FieldAccessor playerGameMode = Reflection.getField(PlayerInteractManager.class, EnumGamemode.class, 0); @Override @SuppressWarnings("deprecation") public void setInternalGameMode(Player player, GameMode gameMode) { @@ -84,6 +85,12 @@ public class NMSWrapper15 implements NMSWrapper.INMSWrapper { }); } + private static final Reflection.FieldAccessor gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, int.class, 0); + @Override + public void setGameStateChangeReason(Object packet) { + gameStateChangeReason.set(packet, 3); + } + private static final int threshold = 2048; @Override public boolean checkItemStack(ItemStack item) { diff --git a/BauSystem_18/src/de/steamwar/bausystem/utils/FlatteningWrapper18.java b/BauSystem_18/src/de/steamwar/bausystem/utils/FlatteningWrapper18.java deleted file mode 100644 index e0b261bd..00000000 --- a/BauSystem_18/src/de/steamwar/bausystem/utils/FlatteningWrapper18.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2022 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.utils; - -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.WorldEditException; -import com.sk89q.worldedit.extent.clipboard.Clipboard; -import de.steamwar.bausystem.region.Color; -import de.steamwar.bausystem.region.PasteOptions; -import de.steamwar.bausystem.region.Point; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.util.Vector; - -import java.io.File; - -public class FlatteningWrapper18 implements FlatteningWrapper.IFlatteningWrapper { - - @Override - public boolean isNoBook(ItemStack item) { - return false; - } - - @Override - public boolean isUnpusheable(Material material) { - return false; - } - - @Override - public boolean isBreakingOnPush(Material material) { - return false; - } - - @Override - public boolean isWorldEditCommand(String command) { - return false; - } - - @Override - public void setSelection(Player p, Point minPoint, Point maxPoint) { - - } - - @Override - public EditSession paste(File file, Point pastePoint, PasteOptions pasteOptions) { - return null; - } - - @Override - public EditSession paste(Clipboard clipboard, Point pastePoint, PasteOptions pasteOptions) { - return null; - } - - @Override - public void changeColor(Clipboard clipboard, Color color) throws WorldEditException { - - } - - @Override - public boolean backup(Point minPoint, Point maxPoint, File file) { - return false; - } - - @Override - public boolean inWater(World world, Vector tntPosition) { - return false; - } - - @Override - public Material getTraceShowMaterial() { - return null; - } - - @Override - public Material getTraceHideMaterial() { - return null; - } - - @Override - public Material getTraceXZMaterial() { - return null; - } -} diff --git a/BauSystem_18/src/de/steamwar/bausystem/utils/NMSWrapper18.java b/BauSystem_18/src/de/steamwar/bausystem/utils/NMSWrapper18.java index 6d08609b..7d99946a 100644 --- a/BauSystem_18/src/de/steamwar/bausystem/utils/NMSWrapper18.java +++ b/BauSystem_18/src/de/steamwar/bausystem/utils/NMSWrapper18.java @@ -19,62 +19,145 @@ package de.steamwar.bausystem.utils; +import com.comphenix.tinyprotocol.Reflection; +import com.comphenix.tinyprotocol.TinyProtocol; +import de.steamwar.bausystem.entities.DetonatorEntity18; +import de.steamwar.bausystem.entities.SimulatorEntity18; +import de.steamwar.bausystem.entities.TraceEntity18; +import de.steamwar.bausystem.entities.WarpEntity18; import de.steamwar.bausystem.features.detonator.AbstractDetonatorEntity; +import de.steamwar.bausystem.features.other.NoClipCommand; import de.steamwar.bausystem.features.simulator.AbstractSimulatorEntity; import de.steamwar.bausystem.features.tracer.AbstractTraceEntity; import de.steamwar.bausystem.features.warp.AbstractWarpEntity; +import net.minecraft.SystemUtils; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.PacketPlayOutEntityMetadata; +import net.minecraft.network.protocol.game.PacketPlayOutEntityTeleport; +import net.minecraft.network.protocol.game.PacketPlayOutEntityVelocity; +import net.minecraft.network.protocol.game.PacketPlayOutGameStateChange; +import net.minecraft.server.level.PlayerInteractManager; +import net.minecraft.world.level.EnumGamemode; +import net.minecraft.world.phys.Vec3D; +import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.World; +import org.bukkit.craftbukkit.v1_18_R1.entity.CraftEntity; +import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer; +import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack; import org.bukkit.entity.Player; +import org.bukkit.entity.TNTPrimed; import org.bukkit.inventory.ItemStack; import org.bukkit.util.Vector; +import java.util.ArrayList; +import java.util.List; import java.util.function.LongSupplier; public class NMSWrapper18 implements NMSWrapper.INMSWrapper { + private static final Reflection.FieldAccessor playerGameMode = Reflection.getField(PlayerInteractManager.class, "gamemode", EnumGamemode.class); @Override + @SuppressWarnings("deprecation") public void setInternalGameMode(Player player, GameMode gameMode) { + playerGameMode.set(((CraftPlayer) player).getHandle().d, EnumGamemode.a(gameMode.getValue())); } @Override public void init(LongSupplier longSupplier) { - + SystemUtils.a = () -> System.nanoTime() + longSupplier.getAsLong(); } + private static final List> packets = new ArrayList<>(); + private static final Vec3D noMotion = new Vec3D(0, 0, 0); @Override public void createTickCache(World world) { + packets.clear(); + world.getEntities().stream().filter(entity -> !(entity instanceof Player)).forEach(entity -> { + packets.add(new PacketPlayOutEntityVelocity(entity.getEntityId(), noMotion)); + packets.add(new PacketPlayOutEntityTeleport(((CraftEntity) entity).getHandle())); + if (entity instanceof TNTPrimed) { + net.minecraft.world.entity.Entity serverEntity = ((CraftEntity) entity).getHandle(); + packets.add(new PacketPlayOutEntityMetadata(serverEntity.ae(), serverEntity.ai(), true)); + } + }); } @Override public void sendTickPackets() { - + Bukkit.getOnlinePlayers().forEach(player -> { + for (Packet p : packets) { + TinyProtocol.instance.sendPacket(player, p); + } + }); } + private static final Reflection.FieldAccessor gameStateChangeReason = Reflection.getField(NoClipCommand.gameStateChange, PacketPlayOutGameStateChange.a.class, 0); + @Override + public void setGameStateChangeReason(Object packet) { + gameStateChangeReason.set(packet, PacketPlayOutGameStateChange.d); + } + + private static final int threshold = 2048; @Override public boolean checkItemStack(ItemStack item) { + net.minecraft.world.item.ItemStack nmsItem = CraftItemStack.asNMSCopy(item); + NBTTagCompound tag = nmsItem.s(); + if (tag != null && tag.e("BlockEntityTag")) { + NBTTagCompound blockTag = tag.p("BlockEntityTag"); + if (blockTag.e("Items")) { + return drillDown(blockTag.c("Items", 10), 0, 0) > threshold; + } + } + return false; } + private int drillDown(NBTTagList items, int layer, int start) { + if (layer > 2) return start + threshold; + int invalid = start; + for (NBTBase nbtBase : items) { + if (!(nbtBase instanceof NBTTagCompound)) + continue; + NBTTagCompound slot = (NBTTagCompound) nbtBase; + if (slot.e("tag")) { + invalid += slot.f("Count"); + NBTTagCompound iTag = slot.p("tag"); + if (iTag.e("BlockEntityTag")) { + NBTTagCompound blockTag = iTag.p("BlockEntityTag"); + if (blockTag.e("Items")) { + invalid = drillDown(blockTag.c("Items", 10), layer + 1, invalid); + } + } + } + if (invalid > threshold) + break; + } + return invalid; + } + @Override public AbstractWarpEntity createWarp(World world, Vector position, String name) { - return null; + return new WarpEntity18(world, position, name); } @Override public AbstractSimulatorEntity createSimulator(World world, Vector tntPosition, boolean highlight) { - return null; + return new SimulatorEntity18(world, tntPosition, highlight); } @Override public AbstractDetonatorEntity constructDetonator(World world, Vector position) { - return null; + return new DetonatorEntity18(world, position); } @Override public AbstractTraceEntity createTrace(World world, Vector tntPosition, boolean tnt) { - return null; + return new TraceEntity18(world, tntPosition, tnt); } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java b/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java index 60f193ce..c4329fbb 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java @@ -19,12 +19,12 @@ package de.steamwar.bausystem; +import com.comphenix.tinyprotocol.TinyProtocol; import de.steamwar.bausystem.configplayer.Config; import de.steamwar.bausystem.linkage.LinkageUtils; import de.steamwar.bausystem.region.loader.PrototypeLoader; import de.steamwar.bausystem.region.loader.RegionLoader; import de.steamwar.bausystem.region.loader.Updater; -import de.steamwar.bausystem.utils.ProtocolAPI; import de.steamwar.bausystem.worlddata.WorldData; import de.steamwar.message.Message; import de.steamwar.scoreboard.SWScoreboard; @@ -89,7 +89,7 @@ public class BauSystem extends JavaPlugin implements Listener { WorldData.write(); Config.getInstance().saveAll(); - ProtocolAPI.tinyProtocol.close(); + TinyProtocol.instance.close(); } private void fixLogging() { 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 8b6b91da..9400b2c5 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/detonator/DetonatorListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/detonator/DetonatorListener.java @@ -45,7 +45,7 @@ import java.util.Set; @Linked(LinkageType.LISTENER) public class DetonatorListener implements Listener { - public static final Class useEntity = Reflection.getClass("{nms}.PacketPlayInUseEntity"); + public static final Class useEntity = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInUseEntity"); private static final Reflection.FieldAccessor entityIdFieldAccessor = Reflection.getField(useEntity, int.class, 0); private static final Set HAS_UPDATED = new HashSet<>(); 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 549deb27..b5082dd8 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/other/NoClipCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/other/NoClipCommand.java @@ -20,6 +20,7 @@ package de.steamwar.bausystem.features.other; import com.comphenix.tinyprotocol.Reflection; +import com.comphenix.tinyprotocol.TinyProtocol; import com.mojang.authlib.GameProfile; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.tpslimit.TPSUtils; @@ -28,6 +29,7 @@ import de.steamwar.bausystem.linkage.Linked; import de.steamwar.bausystem.utils.NMSWrapper; import de.steamwar.bausystem.utils.ProtocolAPI; import de.steamwar.command.SWCommand; +import de.steamwar.core.Core; import lombok.Getter; import org.bukkit.GameMode; import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; @@ -46,28 +48,26 @@ import java.util.function.BiFunction; @Linked(LinkageType.LISTENER) public class NoClipCommand extends SWCommand implements Listener { - private static final Class playerInfoPacket = Reflection.getClass("{nms}.PacketPlayOutPlayerInfo"); - private static final Reflection.ConstructorInvoker playerInfoConstructor = Reflection.getConstructor(playerInfoPacket); - private static final Class playerInfoActionClass = Reflection.getClass("{nms}.PacketPlayOutPlayerInfo$EnumPlayerInfoAction"); + private static final Class playerInfoPacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutPlayerInfo"); + private static final Class playerInfoActionClass = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutPlayerInfo$EnumPlayerInfoAction"); private static final Reflection.FieldAccessor playerInfoAction = Reflection.getField(playerInfoPacket, playerInfoActionClass, 0); private static final Object updateGamemode = playerInfoActionClass.getEnumConstants()[1]; private static final Reflection.FieldAccessor playerInfoData = Reflection.getField(playerInfoPacket, List.class, 0); - private static final Class playerInfoDataClass = Reflection.getClass("{nms}.PacketPlayOutPlayerInfo$PlayerInfoData"); - private static final Class enumGamemode = Reflection.getClass("{nms}.EnumGamemode"); - private static final Object spectator = enumGamemode.getEnumConstants()[4]; - private static final Class iChatBaseComponent = Reflection.getClass("{nms}.IChatBaseComponent"); + private static final Class playerInfoDataClass = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutPlayerInfo$PlayerInfoData"); + private static final Class enumGamemode = Reflection.getClass("{nms.world.level}.EnumGamemode"); + private static final Object spectator = enumGamemode.getEnumConstants()[Core.getVersion() > 15 ? 3 : 4]; + private static final Class iChatBaseComponent = Reflection.getClass("{nms.network.chat}.IChatBaseComponent"); - private static final Reflection.ConstructorInvoker playerInfoDataConstructor = Reflection.getConstructor(playerInfoDataClass, playerInfoPacket, GameProfile.class, int.class, enumGamemode, iChatBaseComponent); + private static final Reflection.ConstructorInvoker playerInfoDataConstructor = Core.getVersion() > 15 ? Reflection.getConstructor(playerInfoDataClass, GameProfile.class, int.class, enumGamemode, iChatBaseComponent) : Reflection.getConstructor(playerInfoDataClass, playerInfoPacket, GameProfile.class, int.class, enumGamemode, iChatBaseComponent); - private static final Class gameStateChange = Reflection.getClass("{nms}.PacketPlayOutGameStateChange"); - private static final Reflection.FieldAccessor integerFieldAccessor = Reflection.getField(gameStateChange, int.class, 0); + public static final Class gameStateChange = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutGameStateChange"); private static final Reflection.FieldAccessor floatFieldAccessor = Reflection.getField(gameStateChange, float.class, 0); - private static final Class position = Reflection.getClass("{nms}.PacketPlayInFlying$PacketPlayInPosition"); - private static final Class positionLook = Reflection.getClass("{nms}.PacketPlayInFlying$PacketPlayInPositionLook"); - private static final Class useItem = Reflection.getClass("{nms}.PacketPlayInUseItem"); - private static final Class blockDig = Reflection.getClass("{nms}.PacketPlayInBlockDig"); - private static final Class windowClick = Reflection.getClass("{nms}.PacketPlayInWindowClick"); + private static final Class position = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInPosition"); + private static final Class positionLook = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInFlying$PacketPlayInPositionLook"); + private static final Class useItem = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInUseItem"); + private static final Class blockDig = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInBlockDig"); + private static final Class windowClick = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInWindowClick"); @Getter private static final List NOCLIPS = new ArrayList<>(); @@ -110,12 +110,12 @@ public class NoClipCommand extends SWCommand implements Listener { ((CraftPlayer) player).getHandle().abilities.canInstantlyBuild = true; Object gameStateChangeObject = Reflection.newInstance(gameStateChange); - integerFieldAccessor.set(gameStateChangeObject, 3); + NMSWrapper.impl.setGameStateChangeReason(gameStateChangeObject); floatFieldAccessor.set(gameStateChangeObject, 1F); NOCLIPS.add(player); BauSystem.MESSAGE.send("OTHER_NOCLIP_SLOT_INFO", player); - ProtocolAPI.tinyProtocol.sendPacket(player, gameStateChangeObject); + TinyProtocol.instance.sendPacket(player, gameStateChangeObject); pseudoSpectator(player); } } @@ -154,13 +154,13 @@ public class NoClipCommand extends SWCommand implements Listener { } private static void pseudoSpectator(Player player) { - ProtocolAPI.tinyProtocol.sendPacket(player, playerInfoPacket(updateGamemode, new GameProfile(player.getUniqueId(), player.getName()), spectator)); + TinyProtocol.instance.sendPacket(player, playerInfoPacket(updateGamemode, new GameProfile(player.getUniqueId(), player.getName()), spectator)); } private static Object playerInfoPacket(Object action, GameProfile profile, Object mode) { - Object packet = playerInfoConstructor.invoke(); + Object packet = Reflection.newInstance(playerInfoPacket); playerInfoAction.set(packet, action); - playerInfoData.set(packet, Collections.singletonList(playerInfoDataConstructor.invoke(packet, profile, 0, mode, null))); + playerInfoData.set(packet, Collections.singletonList(Core.getVersion() > 15 ? playerInfoDataConstructor.invoke(profile, 0, mode, null) : playerInfoDataConstructor.invoke(packet, profile, 0, mode, null))); return packet; } } \ No newline at end of file diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/world/SignEdit.java b/BauSystem_Main/src/de/steamwar/bausystem/features/world/SignEdit.java index 5d525f0c..e7431347 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/world/SignEdit.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/world/SignEdit.java @@ -20,14 +20,13 @@ package de.steamwar.bausystem.features.world; import com.comphenix.tinyprotocol.Reflection; +import com.comphenix.tinyprotocol.TinyProtocol; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.linkage.LinkageType; import de.steamwar.bausystem.linkage.Linked; import de.steamwar.bausystem.utils.ProtocolAPI; -import net.minecraft.server.v1_15_R1.BlockPosition; import org.bukkit.Bukkit; import org.bukkit.ChatColor; -import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Sign; @@ -36,16 +35,23 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.util.Vector; @Linked(LinkageType.LISTENER) public class SignEdit implements Listener { - public static final Class openSign = Reflection.getClass("{nms}.PacketPlayOutOpenSignEditor"); - private static final Reflection.FieldAccessor blockPositionFieldAccessor = Reflection.getField(openSign, net.minecraft.server.v1_15_R1.BlockPosition.class, 0); + private static final Class blockPosition = Reflection.getClass("{nms.core}.BlockPosition"); + private static final Class craftBlock = Reflection.getClass("{obc}.CraftBlock"); + private static final Class craftWorld = Reflection.getClass("{obc}.CraftWorld"); + private static final Class generatorAccess = Reflection.getClass("{nms.world.level}.GeneratorAccess"); + private static final Reflection.MethodInvoker getPosition = Reflection.getTypedMethod(craftBlock, "getPosition", blockPosition); + private static final Reflection.MethodInvoker getWorldHandle = Reflection.getTypedMethod(craftWorld, "getHandle", null); + private static final Reflection.MethodInvoker at = Reflection.getTypedMethod(craftBlock, "at", generatorAccess, blockPosition); - public static final Class updateSign = Reflection.getClass("{nms}.PacketPlayInUpdateSign"); - private static final Reflection.FieldAccessor getBlockPositionFieldAccessor = Reflection.getField(updateSign, BlockPosition.class, 0); + private static final Class openSign = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutOpenSignEditor"); + private static final Reflection.FieldAccessor blockPositionFieldAccessor = Reflection.getField(openSign, blockPosition, 0); + + private static final Class updateSign = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInUpdateSign"); + private static final Reflection.FieldAccessor getBlockPositionFieldAccessor = Reflection.getField(updateSign, blockPosition, 0); private static final Reflection.FieldAccessor stringFieldAccessor = Reflection.getField(updateSign, String[].class, 0); @EventHandler @@ -66,18 +72,16 @@ public class SignEdit implements Listener { sign.update(); Object openSignObject = Reflection.newInstance(openSign); - Vector vector = event.getClickedBlock().getLocation().toVector(); - blockPositionFieldAccessor.set(openSignObject, new BlockPosition(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ())); - ProtocolAPI.tinyProtocol.sendPacket(player, openSignObject); + blockPositionFieldAccessor.set(openSignObject, getPosition.invoke(event.getClickedBlock())); + TinyProtocol.instance.sendPacket(player, openSignObject); } { ProtocolAPI.setIncomingHandler(updateSign, (player, o) -> { Bukkit.getScheduler().runTask(BauSystem.getInstance(), () -> { - BlockPosition position = getBlockPositionFieldAccessor.get(o); String[] lines = stringFieldAccessor.get(o); - Block signLoc = new Location(player.getWorld(), position.getX(), position.getY(), position.getZ()).getBlock(); + Block signLoc = (Block) at.invoke(null, getWorldHandle.invoke(player.getWorld()), getBlockPositionFieldAccessor.get(o)); if (!signLoc.getType().name().contains("SIGN")) return; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/utils/NMSWrapper.java b/BauSystem_Main/src/de/steamwar/bausystem/utils/NMSWrapper.java index 38686fa8..fda7a934 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/utils/NMSWrapper.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/utils/NMSWrapper.java @@ -45,6 +45,8 @@ public class NMSWrapper { void createTickCache(World world); void sendTickPackets(); + void setGameStateChangeReason(Object packet); + boolean checkItemStack(ItemStack item); AbstractWarpEntity createWarp(World world, Vector position, String name); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/utils/ProtocolAPI.java b/BauSystem_Main/src/de/steamwar/bausystem/utils/ProtocolAPI.java index d286f021..8d0543ed 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/utils/ProtocolAPI.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/utils/ProtocolAPI.java @@ -34,8 +34,6 @@ public class ProtocolAPI { private static final Map, BiFunction> outgoingHandler = new HashMap<>(); private static final Map, BiFunction> incomingHandler = new HashMap<>(); - public static final TinyProtocol tinyProtocol = TinyProtocol.instance; - static { TinyProtocol.instance.setOutFilter((receiver, channel, packet) -> { BiFunction handler = outgoingHandler.get(packet.getClass()); @@ -70,6 +68,6 @@ public class ProtocolAPI { } public static void broadcastPacket(Object packet) { - Bukkit.getOnlinePlayers().stream().map(tinyProtocol::getChannel).filter(tinyProtocol::hasInjected).forEach(channel -> tinyProtocol.sendPacket(channel, packet)); + Bukkit.getOnlinePlayers().stream().map(TinyProtocol.instance::getChannel).filter(TinyProtocol.instance::hasInjected).forEach(channel -> TinyProtocol.instance.sendPacket(channel, packet)); } }