diff --git a/eco-api/src/main/java/com/willfp/eco/core/AbstractPacketAdapter.java b/eco-api/src/main/java/com/willfp/eco/core/AbstractPacketAdapter.java index 05ae3e18..b7816872 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/AbstractPacketAdapter.java +++ b/eco-api/src/main/java/com/willfp/eco/core/AbstractPacketAdapter.java @@ -13,27 +13,30 @@ import java.util.Collections; /** * Wrapper class for ProtocolLib packets. + * + * @deprecated ProtocolLib is no longer used by eco. Use {@link com.willfp.eco.core.packet.PacketListener} instead. */ +@Deprecated(since = "6.51.0") public abstract class AbstractPacketAdapter extends PacketAdapter { /** - * The packet type to listen for. + * The handle type to listen for. */ private final PacketType type; /** - * Whether the packet adapter should be registered after the server has loaded. + * Whether the handle adapter should be registered after the server has loaded. *

* Useful for monitor priority adapters that must be ran last. */ private final boolean postLoad; /** - * Create a new packet adapter for a specified plugin and type. + * Create a new handle adapter for a specified plugin and type. * * @param plugin The plugin that ProtocolLib should mark as the owner. * @param type The {@link PacketType} to listen for. - * @param priority The priority at which the adapter should be ran on packet send/receive. - * @param postLoad If the packet adapter should be registered after the server has loaded. + * @param priority The priority at which the adapter should be ran on handle send/receive. + * @param postLoad If the handle adapter should be registered after the server has loaded. */ protected AbstractPacketAdapter(@NotNull final EcoPlugin plugin, @NotNull final PacketType type, @@ -45,11 +48,11 @@ public abstract class AbstractPacketAdapter extends PacketAdapter { } /** - * Create a new packet adapter for a specified plugin and type. + * Create a new handle adapter for a specified plugin and type. * * @param plugin The plugin that ProtocolLib should mark as the owner. * @param type The {@link PacketType} to listen for. - * @param postLoad If the packet adapter should be registered after the server has loaded. + * @param postLoad If the handle adapter should be registered after the server has loaded. */ protected AbstractPacketAdapter(@NotNull final EcoPlugin plugin, @NotNull final PacketType type, @@ -58,9 +61,9 @@ public abstract class AbstractPacketAdapter extends PacketAdapter { } /** - * The code that should be executed once the packet has been received. + * The code that should be executed once the handle has been received. * - * @param packet The packet. + * @param packet The handle. * @param player The player. * @param event The event. */ @@ -71,9 +74,9 @@ public abstract class AbstractPacketAdapter extends PacketAdapter { } /** - * THe code that should be executed once the packet has been sent. + * THe code that should be executed once the handle has been sent. * - * @param packet The packet. + * @param packet The handle. * @param player The player. * @param event The event. */ @@ -84,7 +87,7 @@ public abstract class AbstractPacketAdapter extends PacketAdapter { } /** - * Boilerplate to assert that the packet is of the specified type. + * Boilerplate to assert that the handle is of the specified type. * * @param event The ProtocolLib event. */ @@ -102,7 +105,7 @@ public abstract class AbstractPacketAdapter extends PacketAdapter { } /** - * Boilerplate to assert that the packet is of the specified type. + * Boilerplate to assert that the handle is of the specified type. * * @param event The ProtocolLib event. */ @@ -125,7 +128,7 @@ public abstract class AbstractPacketAdapter extends PacketAdapter { } /** - * Register the packet adapter with ProtocolLib. + * Register the handle adapter with ProtocolLib. */ public final void register() { if (!ProtocolLibrary.getProtocolManager().getPacketListeners().contains(this)) { @@ -134,7 +137,7 @@ public abstract class AbstractPacketAdapter extends PacketAdapter { } /** - * Get if the packet adapter should be loaded last. + * Get if the handle adapter should be loaded last. * * @return If post load. */ diff --git a/eco-api/src/main/java/com/willfp/eco/core/EcoPlugin.java b/eco-api/src/main/java/com/willfp/eco/core/EcoPlugin.java index 17318779..fd5ce014 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/EcoPlugin.java +++ b/eco-api/src/main/java/com/willfp/eco/core/EcoPlugin.java @@ -13,6 +13,7 @@ import com.willfp.eco.core.factory.MetadataValueFactory; import com.willfp.eco.core.factory.NamespacedKeyFactory; import com.willfp.eco.core.factory.RunnableFactory; import com.willfp.eco.core.integrations.IntegrationLoader; +import com.willfp.eco.core.packet.PacketListener; import com.willfp.eco.core.proxy.ProxyFactory; import com.willfp.eco.core.scheduling.Scheduler; import com.willfp.eco.core.web.UpdateChecker; @@ -52,7 +53,7 @@ import java.util.stream.Collectors; * IMPORTANT: When reloading a plugin, all runnables / tasks will * be cancelled. */ -@SuppressWarnings("unused") +@SuppressWarnings({"unused", "DeprecatedIsStillUsed"}) public abstract class EcoPlugin extends JavaPlugin implements PluginLike { /** * The polymart resource ID of the plugin. @@ -422,13 +423,16 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike { Prerequisite.update(); - this.loadPacketAdapters().forEach(abstractPacketAdapter -> { - if (!abstractPacketAdapter.isPostLoad()) { - abstractPacketAdapter.register(); - } - }); + if (Prerequisite.HAS_PROTOCOLLIB.isMet()) { + this.loadPacketAdapters().forEach(abstractPacketAdapter -> { + if (!abstractPacketAdapter.isPostLoad()) { + abstractPacketAdapter.register(); + } + }); + } this.loadListeners().forEach(listener -> this.getEventManager().registerListener(listener)); + this.loadPacketListeners().forEach(listener -> this.getEventManager().registerPacketListener(listener)); this.loadPluginCommands().forEach(PluginCommand::register); @@ -683,16 +687,27 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike { } /** - * ProtocolLib packet adapters to be registered. + * ProtocolLib handle adapters to be registered. *

* If the plugin does not require ProtocolLib this can be left empty. * - * @return A list of packet adapters. + * @return A list of handle adapters. + * @deprecated Use {@link #loadPacketListeners()} instead. */ + @Deprecated(since = "6.51.0") protected List loadPacketAdapters() { return new ArrayList<>(); } + /** + * Packet Listeners to be registered. + * + * @return A list of handle listeners. + */ + protected List loadPacketListeners() { + return new ArrayList<>(); + } + /** * All listeners to be registered. * diff --git a/eco-api/src/main/java/com/willfp/eco/core/events/EventManager.java b/eco-api/src/main/java/com/willfp/eco/core/events/EventManager.java index db9867ef..c2cbfe75 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/events/EventManager.java +++ b/eco-api/src/main/java/com/willfp/eco/core/events/EventManager.java @@ -1,5 +1,6 @@ package com.willfp.eco.core.events; +import com.willfp.eco.core.packet.PacketListener; import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; @@ -25,4 +26,11 @@ public interface EventManager { * Unregister all listeners associated with the plugin. */ void unregisterAllListeners(); + + /** + * Register a packet listener. + * + * @param listener The listener. + */ + void registerPacketListener(@NotNull PacketListener listener); } diff --git a/eco-api/src/main/java/com/willfp/eco/core/packet/Packet.java b/eco-api/src/main/java/com/willfp/eco/core/packet/Packet.java new file mode 100644 index 00000000..a9c5ca19 --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/packet/Packet.java @@ -0,0 +1,12 @@ +package com.willfp.eco.core.packet; + +import org.jetbrains.annotations.NotNull; + +/** + * Represents a packet. + * + * @param handle The NMS handle. + */ +public record Packet(@NotNull Object handle) { + +} diff --git a/eco-api/src/main/java/com/willfp/eco/core/packet/PacketEvent.java b/eco-api/src/main/java/com/willfp/eco/core/packet/PacketEvent.java new file mode 100644 index 00000000..0beb3edc --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/packet/PacketEvent.java @@ -0,0 +1,67 @@ +package com.willfp.eco.core.packet; + +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.jetbrains.annotations.NotNull; + +/** + * Represents a handle being sent or received. + */ +public class PacketEvent implements Cancellable { + /** + * The handle. + */ + private final Packet packet; + + /** + * The player. + */ + private final Player player; + + /** + * If the event should be cancelled. + */ + private boolean cancelled = false; + + /** + * Create a new handle event. + * + * @param packet The handle. + * @param player The player. + */ + public PacketEvent(@NotNull final Packet packet, + @NotNull final Player player) { + this.packet = packet; + this.player = player; + } + + /** + * Get the NMS handle. + * + * @return The handle. + */ + @NotNull + public Packet getPacket() { + return packet; + } + + /** + * Get the player. + * + * @return The player. + */ + @NotNull + public Player getPlayer() { + return player; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(final boolean cancelled) { + this.cancelled = cancelled; + } +} diff --git a/eco-api/src/main/java/com/willfp/eco/core/packet/PacketListener.java b/eco-api/src/main/java/com/willfp/eco/core/packet/PacketListener.java new file mode 100644 index 00000000..1f2d193f --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/packet/PacketListener.java @@ -0,0 +1,35 @@ +package com.willfp.eco.core.packet; + +import org.jetbrains.annotations.NotNull; + +/** + * Listens to packets. + */ +public interface PacketListener { + /** + * Called when a handle is sent. + * + * @param event The event. + */ + default void onSend(@NotNull final PacketEvent event) { + // Override when needed. + } + + /** + * Called when a handle is received. + * + * @param event The event. + */ + default void onReceive(@NotNull final PacketEvent event) { + // Override when needed. + } + + /** + * Get the priority of the listener. + * + * @return The priority. + */ + default PacketPriority getPriority() { + return PacketPriority.NORMAL; + } +} diff --git a/eco-api/src/main/java/com/willfp/eco/core/packet/PacketPriority.java b/eco-api/src/main/java/com/willfp/eco/core/packet/PacketPriority.java new file mode 100644 index 00000000..39717364 --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/packet/PacketPriority.java @@ -0,0 +1,31 @@ +package com.willfp.eco.core.packet; + +/** + * The priority (order) of packet listeners. + */ +public enum PacketPriority { + /** + * Ran first. + */ + LOWEST, + + /** + * Ran second. + */ + LOW, + + /** + * Ran third. + */ + NORMAL, + + /** + * Ran fourth. + */ + HIGH, + + /** + * Ran last. + */ + HIGHEST +} diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/events/EcoEventManager.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/events/EcoEventManager.kt index 5a3c31f5..38404cba 100644 --- a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/events/EcoEventManager.kt +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/events/EcoEventManager.kt @@ -2,11 +2,38 @@ package com.willfp.eco.internal.events import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.events.EventManager +import com.willfp.eco.core.packet.PacketEvent +import com.willfp.eco.core.packet.PacketListener +import com.willfp.eco.core.packet.PacketPriority import org.bukkit.Bukkit import org.bukkit.event.HandlerList import org.bukkit.event.Listener -class EcoEventManager (private val plugin: EcoPlugin) : EventManager { + +private class RegisteredPacketListener( + val plugin: EcoPlugin, + val listener: PacketListener +) + +private val listeners = mutableMapOf>() + +fun PacketEvent.handleSend() { + for (priority in PacketPriority.values()) { + for (listener in listeners[priority] ?: continue) { + listener.listener.onSend(this) + } + } +} + +fun PacketEvent.handleReceive() { + for (priority in PacketPriority.values()) { + for (listener in listeners[priority] ?: continue) { + listener.listener.onReceive(this) + } + } +} + +class EcoEventManager(private val plugin: EcoPlugin) : EventManager { override fun registerListener(listener: Listener) { Bukkit.getPluginManager().registerEvents(listener, plugin) } @@ -17,5 +44,17 @@ class EcoEventManager (private val plugin: EcoPlugin) : EventManager { override fun unregisterAllListeners() { HandlerList.unregisterAll(plugin) + for (value in listeners.values) { + value.removeIf { it.plugin == plugin } + } } -} \ No newline at end of file + + override fun registerPacketListener(listener: PacketListener) { + listeners.getOrPut(listener.priority) { mutableListOf() }.add( + RegisteredPacketListener( + plugin, + listener + ) + ) + } +} diff --git a/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/EcoChannelDuplexHandler.kt b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/EcoChannelDuplexHandler.kt new file mode 100644 index 00000000..eb7d0fd3 --- /dev/null +++ b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/EcoChannelDuplexHandler.kt @@ -0,0 +1,48 @@ +package com.willfp.eco.internal.spigot.proxy.common.packet + +import com.willfp.eco.core.packet.Packet +import com.willfp.eco.core.packet.PacketEvent +import com.willfp.eco.internal.events.handleReceive +import com.willfp.eco.internal.events.handleSend +import io.netty.channel.ChannelDuplexHandler +import io.netty.channel.ChannelHandlerContext +import io.netty.channel.ChannelPromise +import org.bukkit.Bukkit +import java.util.UUID + +class EcoChannelDuplexHandler( + private val uuid: UUID +) : ChannelDuplexHandler() { + + override fun channelRead(ctx: ChannelHandlerContext, msg: Any) { + val player = Bukkit.getPlayer(uuid) + + if (player != null) { + val event = PacketEvent(Packet(msg), player) + + event.handleReceive() + + if (!event.isCancelled) { + super.channelRead(ctx, msg) + } + } else { + super.channelRead(ctx, msg) + } + } + + override fun write(ctx: ChannelHandlerContext, msg: Any, promise: ChannelPromise) { + val player = Bukkit.getPlayer(uuid) + + if (player != null) { + val event = PacketEvent(Packet(msg), player) + + event.handleSend() + + if (!event.isCancelled) { + super.channelRead(ctx, msg) + } + } else { + super.write(ctx, msg, promise) + } + } +} diff --git a/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketAutoRecipe.kt b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketAutoRecipe.kt new file mode 100644 index 00000000..bd8e3354 --- /dev/null +++ b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketAutoRecipe.kt @@ -0,0 +1,32 @@ +package com.willfp.eco.internal.spigot.proxy.common.packet.display + +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.core.packet.PacketEvent +import com.willfp.eco.core.packet.PacketListener +import net.minecraft.network.protocol.game.ClientboundPlaceGhostRecipePacket +import net.minecraft.resources.ResourceLocation + +class PacketAutoRecipe( + private val plugin: EcoPlugin +) : PacketListener { + override fun onSend(event: PacketEvent) { + val packet = event.packet.handle as? ClientboundPlaceGhostRecipePacket ?: return + + if (!plugin.configYml.getBool("displayed-recipes")) { + return + } + + if (!EcoPlugin.getPluginNames().contains(packet.recipe.namespace)) { + return + } + + if (packet.recipe.path.contains("_displayed")) { + return + } + + val fKey = packet.javaClass.getDeclaredField("b") + fKey.isAccessible = true + val key = fKey[packet] as ResourceLocation + fKey[packet] = ResourceLocation(key.namespace, key.path + "_displayed") + } +} diff --git a/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketHeldItemSlot.kt b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketHeldItemSlot.kt new file mode 100644 index 00000000..4103ce15 --- /dev/null +++ b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketHeldItemSlot.kt @@ -0,0 +1,17 @@ +package com.willfp.eco.internal.spigot.proxy.common.packet.display + +import com.willfp.eco.core.packet.PacketEvent +import com.willfp.eco.core.packet.PacketListener +import com.willfp.eco.internal.spigot.proxy.common.packet.display.frame.DisplayFrame +import com.willfp.eco.internal.spigot.proxy.common.packet.display.frame.lastDisplayFrame +import net.minecraft.network.protocol.game.ServerboundSetCarriedItemPacket + +object PacketHeldItemSlot : PacketListener { + override fun onReceive(event: PacketEvent) { + if (event.packet.handle !is ServerboundSetCarriedItemPacket) { + return + } + + event.player.lastDisplayFrame = DisplayFrame.EMPTY + } +} diff --git a/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketOpenWindowMerchant.kt b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketOpenWindowMerchant.kt new file mode 100644 index 00000000..863f7375 --- /dev/null +++ b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketOpenWindowMerchant.kt @@ -0,0 +1,35 @@ +package com.willfp.eco.internal.spigot.proxy.common.packet.display + +import com.willfp.eco.core.display.Display +import com.willfp.eco.core.packet.PacketEvent +import com.willfp.eco.core.packet.PacketListener +import com.willfp.eco.internal.spigot.proxy.common.asBukkitStack +import com.willfp.eco.internal.spigot.proxy.common.asNMSStack +import net.minecraft.nbt.CompoundTag +import net.minecraft.network.protocol.game.ClientboundMerchantOffersPacket +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.trading.MerchantOffer + +object PacketOpenWindowMerchant : PacketListener { + private val field = ClientboundMerchantOffersPacket::class.java.getDeclaredField("b").apply { isAccessible = true } + + override fun onSend(event: PacketEvent) { + val packet = event.packet.handle as? ClientboundMerchantOffersPacket ?: return + + val offers = mutableListOf() + + for (offer in packet.offers) { + val nbt = offer.createTag() + for (tag in arrayOf("buy", "buyB", "sell")) { + val nms = ItemStack.of(nbt.getCompound(tag)) + val displayed = Display.display(nms.asBukkitStack(), event.player) + val itemNBT = displayed.asNMSStack().save(CompoundTag()) + nbt.put(tag, itemNBT) + } + + offers += MerchantOffer(nbt) + } + + field.set(packet, offers) + } +} diff --git a/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketSetCreativeSlot.kt b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketSetCreativeSlot.kt new file mode 100644 index 00000000..cc73f871 --- /dev/null +++ b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketSetCreativeSlot.kt @@ -0,0 +1,19 @@ +package com.willfp.eco.internal.spigot.proxy.common.packet.display + +import com.willfp.eco.core.display.Display +import com.willfp.eco.core.packet.PacketEvent +import com.willfp.eco.core.packet.PacketListener +import com.willfp.eco.internal.spigot.proxy.common.asBukkitStack +import com.willfp.eco.internal.spigot.proxy.common.packet.display.frame.DisplayFrame +import com.willfp.eco.internal.spigot.proxy.common.packet.display.frame.lastDisplayFrame +import net.minecraft.network.protocol.game.ServerboundSetCreativeModeSlotPacket + +object PacketSetCreativeSlot : PacketListener { + override fun onReceive(event: PacketEvent) { + val packet = event.packet.handle as? ServerboundSetCreativeModeSlotPacket ?: return + + Display.revert(packet.item.asBukkitStack()) + + event.player.lastDisplayFrame = DisplayFrame.EMPTY + } +} \ No newline at end of file diff --git a/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketSetSlot.kt b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketSetSlot.kt new file mode 100644 index 00000000..1865fb5c --- /dev/null +++ b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketSetSlot.kt @@ -0,0 +1,19 @@ +package com.willfp.eco.internal.spigot.proxy.common.packet.display + +import com.willfp.eco.core.display.Display +import com.willfp.eco.core.packet.PacketEvent +import com.willfp.eco.core.packet.PacketListener +import com.willfp.eco.internal.spigot.proxy.common.asBukkitStack +import com.willfp.eco.internal.spigot.proxy.common.packet.display.frame.DisplayFrame +import com.willfp.eco.internal.spigot.proxy.common.packet.display.frame.lastDisplayFrame +import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket + +object PacketSetSlot : PacketListener { + override fun onSend(event: PacketEvent) { + val packet = event.packet.handle as? ClientboundContainerSetSlotPacket ?: return + + Display.display(packet.item.asBukkitStack(), event.player) + + event.player.lastDisplayFrame = DisplayFrame.EMPTY + } +} diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketWindowItems.kt b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketWindowItems.kt similarity index 53% rename from eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketWindowItems.kt rename to eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketWindowItems.kt index 76c91825..c8da63bf 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketWindowItems.kt +++ b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/PacketWindowItems.kt @@ -1,39 +1,37 @@ -package com.willfp.eco.internal.spigot.display +package com.willfp.eco.internal.spigot.proxy.common.packet.display -import com.comphenix.protocol.PacketType -import com.comphenix.protocol.events.PacketContainer -import com.comphenix.protocol.events.PacketEvent -import com.willfp.eco.core.AbstractPacketAdapter import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.display.Display import com.willfp.eco.core.items.HashedItem -import com.willfp.eco.internal.spigot.display.frame.DisplayFrame -import com.willfp.eco.internal.spigot.display.frame.lastDisplayFrame +import com.willfp.eco.core.packet.PacketEvent +import com.willfp.eco.core.packet.PacketListener +import com.willfp.eco.internal.spigot.proxy.common.asBukkitStack +import com.willfp.eco.internal.spigot.proxy.common.packet.display.frame.DisplayFrame +import com.willfp.eco.internal.spigot.proxy.common.packet.display.frame.lastDisplayFrame +import net.minecraft.network.protocol.game.ClientboundContainerSetContentPacket import org.bukkit.entity.Player import org.bukkit.inventory.ItemStack +import java.util.UUID import java.util.concurrent.ConcurrentHashMap -class PacketWindowItems(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, PacketType.Play.Server.WINDOW_ITEMS, false) { - private val lastKnownWindowIDs = ConcurrentHashMap() +class PacketWindowItems( + private val plugin: EcoPlugin +) : PacketListener { + private val lastKnownWindowIDs = ConcurrentHashMap() - override fun onSend( - packet: PacketContainer, - player: Player, - event: PacketEvent - ) { - packet.itemModifier.modify(0) { - Display.display( - it, player - ) - } + private val field = ClientboundContainerSetContentPacket::class.java.getDeclaredField("c") + .apply { isAccessible = true } - val windowId = packet.integers.read(0) + override fun onSend(event: PacketEvent) { + val packet = event.packet.handle as? ClientboundContainerSetContentPacket ?: return + val player = event.player - // Using name because UUID is unreliable with ProtocolLib players. - val name = player.name + Display.display(packet.carriedItem.asBukkitStack(), player) - val lastKnownID = lastKnownWindowIDs[name] - lastKnownWindowIDs[name] = windowId + val windowId = packet.containerId + + val lastKnownID = lastKnownWindowIDs[player.uniqueId] + lastKnownWindowIDs[player.uniqueId] = windowId // If there is any change in window ID at any point, // Remove the last display frame to prevent any potential conflicts. @@ -43,17 +41,20 @@ class PacketWindowItems(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, Packe player.lastDisplayFrame = DisplayFrame.EMPTY } - val itemStacks = packet.itemListModifier.read(0) ?: return + val itemStacks = packet.items.map { it.asBukkitStack() } - packet.itemListModifier.write(0, modifyWindowItems(itemStacks, windowId, player)) + val newItems = modifyWindowItems(itemStacks.toMutableList(), windowId, player) + + field.set(packet, newItems) } + private fun modifyWindowItems( itemStacks: MutableList, windowId: Int, player: Player ): MutableList { - if (this.getPlugin().configYml.getBool("use-display-frame") && windowId == 0) { + if (plugin.configYml.getBool("use-display-frame") && windowId == 0) { val frameMap = mutableMapOf() for (index in itemStacks.indices) { diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/frame/DisplayFrame.kt b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/frame/DisplayFrame.kt similarity index 74% rename from eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/frame/DisplayFrame.kt rename to eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/frame/DisplayFrame.kt index 113eb805..8de62432 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/frame/DisplayFrame.kt +++ b/eco-core/core-nms/nms-common/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/common/packet/display/frame/DisplayFrame.kt @@ -1,6 +1,5 @@ -package com.willfp.eco.internal.spigot.display.frame +package com.willfp.eco.internal.spigot.proxy.common.packet.display.frame -import com.comphenix.protocol.injector.temporary.TemporaryPlayer import com.willfp.eco.core.items.HashedItem import org.bukkit.entity.Player import org.bukkit.inventory.ItemStack @@ -33,22 +32,12 @@ private val frames = ConcurrentHashMap() var Player.lastDisplayFrame: DisplayFrame get() { - // ProtocolLib fix - if (this is TemporaryPlayer) { - return DisplayFrame.EMPTY - } - return frames[this.uniqueId] ?: DisplayFrame.EMPTY } set(value) { - // ProtocolLib fix - if (this is TemporaryPlayer) { - return - } - frames[this.uniqueId] = value } fun clearFrames() { frames.clear() -} \ No newline at end of file +} diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/AutoCraft.kt b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/AutoCraft.kt deleted file mode 100644 index 60c86da6..00000000 --- a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/AutoCraft.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_17_R1 - -import com.willfp.eco.internal.spigot.proxy.AutoCraftProxy -import net.minecraft.network.protocol.game.ClientboundPlaceGhostRecipePacket -import net.minecraft.resources.ResourceLocation - -class AutoCraft : AutoCraftProxy { - override fun modifyPacket(packet: Any) { - val recipePacket = packet as ClientboundPlaceGhostRecipePacket - val fKey = recipePacket.javaClass.getDeclaredField("b") - fKey.isAccessible = true - val key = fKey[recipePacket] as ResourceLocation - fKey[recipePacket] = ResourceLocation(key.namespace, key.path + "_displayed") - } -} \ No newline at end of file diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/CommonsInitializer.kt b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/CommonsInitializer.kt index a6f43af9..c5e51e12 100644 --- a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/CommonsInitializer.kt +++ b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/CommonsInitializer.kt @@ -1,5 +1,6 @@ package com.willfp.eco.internal.spigot.proxy.v1_17_R1 +import com.willfp.eco.core.EcoPlugin import com.willfp.eco.internal.spigot.proxy.CommonsInitializerProxy import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation @@ -27,7 +28,7 @@ import org.bukkit.persistence.PersistentDataContainer import java.lang.reflect.Field class CommonsInitializer : CommonsInitializerProxy { - override fun init() { + override fun init(plugin: EcoPlugin) { CommonsProvider.setIfNeeded(CommonsProviderImpl) } @@ -60,7 +61,7 @@ class CommonsInitializer : CommonsInitializerProxy { } override fun asBukkitStack(itemStack: net.minecraft.world.item.ItemStack): ItemStack { - return CraftItemStack.asBukkitCopy(itemStack) + return CraftItemStack.asCraftMirror(itemStack) } override fun mergeIfNeeded(itemStack: ItemStack, nmsStack: net.minecraft.world.item.ItemStack) { diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/PacketHandler.kt b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/PacketHandler.kt new file mode 100644 index 00000000..90d90e64 --- /dev/null +++ b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/PacketHandler.kt @@ -0,0 +1,68 @@ +package com.willfp.eco.internal.spigot.proxy.v1_17_R1 + +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.core.packet.PacketListener +import com.willfp.eco.internal.spigot.proxy.PacketHandlerProxy +import com.willfp.eco.internal.spigot.proxy.common.packet.EcoChannelDuplexHandler +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketAutoRecipe +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketHeldItemSlot +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketOpenWindowMerchant +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketSetCreativeSlot +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketSetSlot +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketWindowItems +import com.willfp.eco.internal.spigot.proxy.common.packet.display.frame.clearFrames +import com.willfp.eco.internal.spigot.proxy.v1_17_R1.display.PacketChat +import net.minecraft.network.protocol.Packet +import org.bukkit.craftbukkit.v1_17_R1.entity.CraftPlayer +import org.bukkit.entity.Player + +class PacketHandler : PacketHandlerProxy { + override fun addPlayer(player: Player) { + if (player !is CraftPlayer) { + return + } + + player.handle.connection.connection.channel.pipeline() + .addBefore("eco_packet_handler", player.name, EcoChannelDuplexHandler(player.uniqueId)) + } + + override fun removePlayer(player: Player) { + if (player !is CraftPlayer) { + return + } + + val channel = player.handle.connection.connection.channel + + channel.eventLoop().submit { + channel.pipeline().remove(player.name) + } + } + + override fun sendPacket(player: Player, packet: Any) { + if (player !is CraftPlayer) { + return + } + + if (packet !is Packet<*>) { + return + } + + player.handle.connection.send(packet) + } + + override fun clearDisplayFrames() { + clearFrames() + } + + override fun getPacketListeners(plugin: EcoPlugin): List { + return listOf( + PacketAutoRecipe(plugin), + PacketHeldItemSlot, + PacketOpenWindowMerchant, + PacketSetCreativeSlot, + PacketSetSlot, + PacketWindowItems(plugin), + PacketChat + ) + } +} diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/VillagerTrade.kt b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/VillagerTrade.kt deleted file mode 100644 index bf89b5dc..00000000 --- a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/VillagerTrade.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_17_R1 - -import com.willfp.eco.core.display.Display -import com.willfp.eco.internal.spigot.proxy.VillagerTradeProxy -import net.minecraft.nbt.CompoundTag -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.trading.MerchantOffer -import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack -import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftMerchantRecipe -import org.bukkit.entity.Player -import org.bukkit.inventory.MerchantRecipe -import java.lang.reflect.Field - -class VillagerTrade : VillagerTradeProxy { - private val handle: Field = CraftMerchantRecipe::class.java.getDeclaredField("handle") - - override fun displayTrade( - recipe: MerchantRecipe, - player: Player - ): MerchantRecipe { - recipe as CraftMerchantRecipe - - val nbt = getHandle(recipe).createTag() - for (tag in arrayOf("buy", "buyB", "sell")) { - val nms = ItemStack.of(nbt.getCompound(tag)) - val displayed = Display.display(CraftItemStack.asBukkitCopy(nms), player) - val itemNBT = CraftItemStack.asNMSCopy(displayed).save(CompoundTag()) - nbt.put(tag, itemNBT) - } - - return CraftMerchantRecipe(MerchantOffer(nbt)) - } - - private fun getHandle(recipe: CraftMerchantRecipe): MerchantOffer { - return handle[recipe] as MerchantOffer - } - - init { - handle.isAccessible = true - } -} \ No newline at end of file diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ChatComponent.kt b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/display/PacketChat.kt similarity index 79% rename from eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ChatComponent.kt rename to eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/display/PacketChat.kt index 7ffc3af9..611c0d42 100644 --- a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/ChatComponent.kt +++ b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/display/PacketChat.kt @@ -1,7 +1,8 @@ -package com.willfp.eco.internal.spigot.proxy.v1_17_R1 +package com.willfp.eco.internal.spigot.proxy.v1_17_R1.display import com.willfp.eco.core.display.Display -import com.willfp.eco.internal.spigot.proxy.ChatComponentProxy +import com.willfp.eco.core.packet.PacketEvent +import com.willfp.eco.core.packet.PacketListener import net.kyori.adventure.nbt.api.BinaryTagHolder import net.kyori.adventure.text.BuildableComponent import net.kyori.adventure.text.Component @@ -9,20 +10,28 @@ import net.kyori.adventure.text.TranslatableComponent import net.kyori.adventure.text.event.HoverEvent import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer import net.minecraft.nbt.TagParser +import net.minecraft.network.protocol.game.ClientboundChatPacket import org.bukkit.Material import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack import org.bukkit.entity.Player import org.bukkit.inventory.ItemStack -@Suppress("UNCHECKED_CAST") -class ChatComponent : ChatComponentProxy { +object PacketChat : PacketListener { private val gsonComponentSerializer = GsonComponentSerializer.gson() - override fun modifyComponent(obj: Any, player: Player): Any { - if (obj !is net.minecraft.network.chat.Component) { - return obj - } + private val field = ClientboundChatPacket::class.java.declaredFields + .first { it.type == net.minecraft.network.chat.Component::class.java } + .apply { isAccessible = true } + override fun onSend(event: PacketEvent) { + val packet = event.packet.handle as? ClientboundChatPacket ?: return + + val newMessage = modifyComponent(packet.message, event.player) + + field.set(packet, newMessage) + } + + private fun modifyComponent(obj: net.minecraft.network.chat.Component, player: Player): Any { val component = gsonComponentSerializer.deserialize( net.minecraft.network.chat.Component.Serializer.toJson( obj @@ -53,6 +62,7 @@ class ChatComponent : ChatComponentProxy { } component = component.children(children) + @Suppress("UNCHECKED_CAST") val hoverEvent: HoverEvent = component.style().hoverEvent() as HoverEvent? ?: return component val showItem = hoverEvent.value() @@ -91,4 +101,4 @@ class ChatComponent : ChatComponentProxy { val style = component.style().hoverEvent(newHover) return component.style(style) } -} \ No newline at end of file +} diff --git a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/AutoCraft.kt b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/AutoCraft.kt deleted file mode 100644 index 20394a47..00000000 --- a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/AutoCraft.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_18_R1 - -import com.willfp.eco.internal.spigot.proxy.AutoCraftProxy -import net.minecraft.network.protocol.game.ClientboundPlaceGhostRecipePacket -import net.minecraft.resources.ResourceLocation - -class AutoCraft : AutoCraftProxy { - override fun modifyPacket(packet: Any) { - val recipePacket = packet as ClientboundPlaceGhostRecipePacket - val fKey = recipePacket.javaClass.getDeclaredField("b") - fKey.isAccessible = true - val key = fKey[recipePacket] as ResourceLocation - fKey[recipePacket] = ResourceLocation(key.namespace, key.path + "_displayed") - } -} \ No newline at end of file diff --git a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/CommonsInitializer.kt b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/CommonsInitializer.kt index 142d0a78..ed175a03 100644 --- a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/CommonsInitializer.kt +++ b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/CommonsInitializer.kt @@ -1,5 +1,6 @@ package com.willfp.eco.internal.spigot.proxy.v1_18_R1 +import com.willfp.eco.core.EcoPlugin import com.willfp.eco.internal.spigot.proxy.CommonsInitializerProxy import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation @@ -27,7 +28,7 @@ import org.bukkit.persistence.PersistentDataContainer import java.lang.reflect.Field class CommonsInitializer : CommonsInitializerProxy { - override fun init() { + override fun init(plugin: EcoPlugin) { CommonsProvider.setIfNeeded(CommonsProviderImpl) } @@ -60,7 +61,7 @@ class CommonsInitializer : CommonsInitializerProxy { } override fun asBukkitStack(itemStack: net.minecraft.world.item.ItemStack): ItemStack { - return CraftItemStack.asBukkitCopy(itemStack) + return CraftItemStack.asCraftMirror(itemStack) } override fun mergeIfNeeded(itemStack: ItemStack, nmsStack: net.minecraft.world.item.ItemStack) { diff --git a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/PacketHandler.kt b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/PacketHandler.kt new file mode 100644 index 00000000..13e359ae --- /dev/null +++ b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/PacketHandler.kt @@ -0,0 +1,68 @@ +package com.willfp.eco.internal.spigot.proxy.v1_18_R1 + +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.core.packet.PacketListener +import com.willfp.eco.internal.spigot.proxy.PacketHandlerProxy +import com.willfp.eco.internal.spigot.proxy.common.packet.EcoChannelDuplexHandler +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketAutoRecipe +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketHeldItemSlot +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketOpenWindowMerchant +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketSetCreativeSlot +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketSetSlot +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketWindowItems +import com.willfp.eco.internal.spigot.proxy.common.packet.display.frame.clearFrames +import com.willfp.eco.internal.spigot.proxy.v1_18_R1.display.PacketChat +import net.minecraft.network.protocol.Packet +import org.bukkit.craftbukkit.v1_18_R1.entity.CraftPlayer +import org.bukkit.entity.Player + +class PacketHandler: PacketHandlerProxy { + override fun addPlayer(player: Player) { + if (player !is CraftPlayer) { + return + } + + player.handle.connection.connection.channel.pipeline() + .addBefore("eco_packet_handler", player.name, EcoChannelDuplexHandler(player.uniqueId)) + } + + override fun removePlayer(player: Player) { + if (player !is CraftPlayer) { + return + } + + val channel = player.handle.connection.connection.channel + + channel.eventLoop().submit { + channel.pipeline().remove(player.name) + } + } + + override fun sendPacket(player: Player, packet: Any) { + if (player !is CraftPlayer) { + return + } + + if (packet !is Packet<*>) { + return + } + + player.handle.connection.send(packet) + } + + override fun clearDisplayFrames() { + clearFrames() + } + + override fun getPacketListeners(plugin: EcoPlugin): List { + return listOf( + PacketAutoRecipe(plugin), + PacketHeldItemSlot, + PacketOpenWindowMerchant, + PacketSetCreativeSlot, + PacketSetSlot, + PacketWindowItems(plugin), + PacketChat + ) + } +} diff --git a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/VillagerTrade.kt b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/VillagerTrade.kt deleted file mode 100644 index 319c54ba..00000000 --- a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/VillagerTrade.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_18_R1 - -import com.willfp.eco.core.display.Display -import com.willfp.eco.internal.spigot.proxy.VillagerTradeProxy -import net.minecraft.nbt.CompoundTag -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.trading.MerchantOffer -import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack -import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftMerchantRecipe -import org.bukkit.entity.Player -import org.bukkit.inventory.MerchantRecipe -import java.lang.reflect.Field - -class VillagerTrade : VillagerTradeProxy { - private val handle: Field = CraftMerchantRecipe::class.java.getDeclaredField("handle") - - override fun displayTrade( - recipe: MerchantRecipe, - player: Player - ): MerchantRecipe { - recipe as CraftMerchantRecipe - - val nbt = getHandle(recipe).createTag() - for (tag in arrayOf("buy", "buyB", "sell")) { - val nms = ItemStack.of(nbt.getCompound(tag)) - val displayed = Display.display(CraftItemStack.asBukkitCopy(nms), player) - val itemNBT = CraftItemStack.asNMSCopy(displayed).save(CompoundTag()) - nbt.put(tag, itemNBT) - } - - return CraftMerchantRecipe(MerchantOffer(nbt)) - } - - private fun getHandle(recipe: CraftMerchantRecipe): MerchantOffer { - return handle[recipe] as MerchantOffer - } - - init { - handle.isAccessible = true - } -} \ No newline at end of file diff --git a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/ChatComponent.kt b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/display/PacketChat.kt similarity index 79% rename from eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/ChatComponent.kt rename to eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/display/PacketChat.kt index 4e6b2633..67e3fbb6 100644 --- a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/ChatComponent.kt +++ b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/display/PacketChat.kt @@ -1,7 +1,8 @@ -package com.willfp.eco.internal.spigot.proxy.v1_18_R1 +package com.willfp.eco.internal.spigot.proxy.v1_18_R1.display import com.willfp.eco.core.display.Display -import com.willfp.eco.internal.spigot.proxy.ChatComponentProxy +import com.willfp.eco.core.packet.PacketEvent +import com.willfp.eco.core.packet.PacketListener import net.kyori.adventure.nbt.api.BinaryTagHolder import net.kyori.adventure.text.BuildableComponent import net.kyori.adventure.text.Component @@ -9,20 +10,28 @@ import net.kyori.adventure.text.TranslatableComponent import net.kyori.adventure.text.event.HoverEvent import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer import net.minecraft.nbt.TagParser +import net.minecraft.network.protocol.game.ClientboundChatPacket import org.bukkit.Material import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack import org.bukkit.entity.Player import org.bukkit.inventory.ItemStack -@Suppress("UNCHECKED_CAST") -class ChatComponent : ChatComponentProxy { +object PacketChat : PacketListener { private val gsonComponentSerializer = GsonComponentSerializer.gson() - override fun modifyComponent(obj: Any, player: Player): Any { - if (obj !is net.minecraft.network.chat.Component) { - return obj - } + private val field = ClientboundChatPacket::class.java.declaredFields + .first { it.type == net.minecraft.network.chat.Component::class.java } + .apply { isAccessible = true } + override fun onSend(event: PacketEvent) { + val packet = event.packet.handle as? ClientboundChatPacket ?: return + + val newMessage = modifyComponent(packet.message, event.player) + + field.set(packet, newMessage) + } + + private fun modifyComponent(obj: net.minecraft.network.chat.Component, player: Player): Any { val component = gsonComponentSerializer.deserialize( net.minecraft.network.chat.Component.Serializer.toJson( obj @@ -53,6 +62,7 @@ class ChatComponent : ChatComponentProxy { } component = component.children(children) + @Suppress("UNCHECKED_CAST") val hoverEvent: HoverEvent = component.style().hoverEvent() as HoverEvent? ?: return component val showItem = hoverEvent.value() @@ -91,4 +101,4 @@ class ChatComponent : ChatComponentProxy { val style = component.style().hoverEvent(newHover) return component.style(style) } -} \ No newline at end of file +} diff --git a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/AutoCraft.kt b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/AutoCraft.kt deleted file mode 100644 index b81f8ca3..00000000 --- a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/AutoCraft.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_18_R2 - -import com.willfp.eco.internal.spigot.proxy.AutoCraftProxy -import net.minecraft.network.protocol.game.ClientboundPlaceGhostRecipePacket -import net.minecraft.resources.ResourceLocation - -class AutoCraft : AutoCraftProxy { - override fun modifyPacket(packet: Any) { - val recipePacket = packet as ClientboundPlaceGhostRecipePacket - val fKey = recipePacket.javaClass.getDeclaredField("b") - fKey.isAccessible = true - val key = fKey[recipePacket] as ResourceLocation - fKey[recipePacket] = ResourceLocation(key.namespace, key.path + "_displayed") - } -} \ No newline at end of file diff --git a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/CommonsInitializer.kt b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/CommonsInitializer.kt index fc026f4b..1559078c 100644 --- a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/CommonsInitializer.kt +++ b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/CommonsInitializer.kt @@ -1,5 +1,6 @@ package com.willfp.eco.internal.spigot.proxy.v1_18_R2 +import com.willfp.eco.core.EcoPlugin import com.willfp.eco.internal.spigot.proxy.CommonsInitializerProxy import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation @@ -27,7 +28,7 @@ import org.bukkit.persistence.PersistentDataContainer import java.lang.reflect.Field class CommonsInitializer : CommonsInitializerProxy { - override fun init() { + override fun init(plugin: EcoPlugin) { CommonsProvider.setIfNeeded(CommonsProviderImpl) } @@ -60,7 +61,7 @@ class CommonsInitializer : CommonsInitializerProxy { } override fun asBukkitStack(itemStack: net.minecraft.world.item.ItemStack): ItemStack { - return CraftItemStack.asBukkitCopy(itemStack) + return CraftItemStack.asCraftMirror(itemStack) } override fun mergeIfNeeded(itemStack: ItemStack, nmsStack: net.minecraft.world.item.ItemStack) { diff --git a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/PacketHandler.kt b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/PacketHandler.kt new file mode 100644 index 00000000..4ed5f121 --- /dev/null +++ b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/PacketHandler.kt @@ -0,0 +1,68 @@ +package com.willfp.eco.internal.spigot.proxy.v1_18_R2 + +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.core.packet.PacketListener +import com.willfp.eco.internal.spigot.proxy.PacketHandlerProxy +import com.willfp.eco.internal.spigot.proxy.common.packet.EcoChannelDuplexHandler +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketAutoRecipe +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketHeldItemSlot +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketOpenWindowMerchant +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketSetCreativeSlot +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketSetSlot +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketWindowItems +import com.willfp.eco.internal.spigot.proxy.common.packet.display.frame.clearFrames +import com.willfp.eco.internal.spigot.proxy.v1_18_R2.display.PacketChat +import net.minecraft.network.protocol.Packet +import org.bukkit.craftbukkit.v1_18_R2.entity.CraftPlayer +import org.bukkit.entity.Player + +class PacketHandler: PacketHandlerProxy { + override fun addPlayer(player: Player) { + if (player !is CraftPlayer) { + return + } + + player.handle.connection.connection.channel.pipeline() + .addBefore("eco_packet_handler", player.name, EcoChannelDuplexHandler(player.uniqueId)) + } + + override fun removePlayer(player: Player) { + if (player !is CraftPlayer) { + return + } + + val channel = player.handle.connection.connection.channel + + channel.eventLoop().submit { + channel.pipeline().remove(player.name) + } + } + + override fun sendPacket(player: Player, packet: Any) { + if (player !is CraftPlayer) { + return + } + + if (packet !is Packet<*>) { + return + } + + player.handle.connection.send(packet) + } + + override fun clearDisplayFrames() { + clearFrames() + } + + override fun getPacketListeners(plugin: EcoPlugin): List { + return listOf( + PacketAutoRecipe(plugin), + PacketHeldItemSlot, + PacketOpenWindowMerchant, + PacketSetCreativeSlot, + PacketSetSlot, + PacketWindowItems(plugin), + PacketChat + ) + } +} diff --git a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/VillagerTrade.kt b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/VillagerTrade.kt deleted file mode 100644 index 4f6f1407..00000000 --- a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/VillagerTrade.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_18_R2 - -import com.willfp.eco.core.display.Display -import com.willfp.eco.internal.spigot.proxy.VillagerTradeProxy -import net.minecraft.nbt.CompoundTag -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.trading.MerchantOffer -import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack -import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftMerchantRecipe -import org.bukkit.entity.Player -import org.bukkit.inventory.MerchantRecipe -import java.lang.reflect.Field - -class VillagerTrade : VillagerTradeProxy { - private val handle: Field = CraftMerchantRecipe::class.java.getDeclaredField("handle") - - override fun displayTrade( - recipe: MerchantRecipe, - player: Player - ): MerchantRecipe { - recipe as CraftMerchantRecipe - - val nbt = getHandle(recipe).createTag() - for (tag in arrayOf("buy", "buyB", "sell")) { - val nms = ItemStack.of(nbt.getCompound(tag)) - val displayed = Display.display(CraftItemStack.asBukkitCopy(nms), player) - val itemNBT = CraftItemStack.asNMSCopy(displayed).save(CompoundTag()) - nbt.put(tag, itemNBT) - } - - return CraftMerchantRecipe(MerchantOffer(nbt)) - } - - private fun getHandle(recipe: CraftMerchantRecipe): MerchantOffer { - return handle[recipe] as MerchantOffer - } - - init { - handle.isAccessible = true - } -} \ No newline at end of file diff --git a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/ChatComponent.kt b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/display/PacketChat.kt similarity index 77% rename from eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/ChatComponent.kt rename to eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/display/PacketChat.kt index c469a076..36bc6afa 100644 --- a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/ChatComponent.kt +++ b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/display/PacketChat.kt @@ -1,7 +1,8 @@ -package com.willfp.eco.internal.spigot.proxy.v1_18_R2 +package com.willfp.eco.internal.spigot.proxy.v1_18_R2.display import com.willfp.eco.core.display.Display -import com.willfp.eco.internal.spigot.proxy.ChatComponentProxy +import com.willfp.eco.core.packet.PacketEvent +import com.willfp.eco.core.packet.PacketListener import net.kyori.adventure.nbt.api.BinaryTagHolder import net.kyori.adventure.text.BuildableComponent import net.kyori.adventure.text.Component @@ -9,20 +10,28 @@ import net.kyori.adventure.text.TranslatableComponent import net.kyori.adventure.text.event.HoverEvent import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer import net.minecraft.nbt.TagParser +import net.minecraft.network.protocol.game.ClientboundChatPacket import org.bukkit.Material import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack import org.bukkit.entity.Player import org.bukkit.inventory.ItemStack -@Suppress("UNCHECKED_CAST") -class ChatComponent : ChatComponentProxy { +object PacketChat : PacketListener { private val gsonComponentSerializer = GsonComponentSerializer.gson() - override fun modifyComponent(obj: Any, player: Player): Any { - if (obj !is net.minecraft.network.chat.Component) { - return obj - } + private val field = ClientboundChatPacket::class.java.declaredFields + .first { it.type == net.minecraft.network.chat.Component::class.java } + .apply { isAccessible = true } + override fun onSend(event: PacketEvent) { + val packet = event.packet.handle as? ClientboundChatPacket ?: return + + val newMessage = modifyComponent(packet.message, event.player) + + field.set(packet, newMessage) + } + + private fun modifyComponent(obj: net.minecraft.network.chat.Component, player: Player): Any { val component = gsonComponentSerializer.deserialize( net.minecraft.network.chat.Component.Serializer.toJson( obj @@ -53,6 +62,7 @@ class ChatComponent : ChatComponentProxy { } component = component.children(children) + @Suppress("UNCHECKED_CAST") val hoverEvent: HoverEvent = component.style().hoverEvent() as HoverEvent? ?: return component val showItem = hoverEvent.value() @@ -62,7 +72,8 @@ class ChatComponent : ChatComponentProxy { } val newShowItem = showItem.nbt( - BinaryTagHolder.binaryTagHolder( + @Suppress("UnstableApiUsage", "DEPRECATION") + BinaryTagHolder.of( CraftItemStack.asNMSCopy( Display.display( CraftItemStack.asBukkitCopy( @@ -90,4 +101,4 @@ class ChatComponent : ChatComponentProxy { val style = component.style().hoverEvent(newHover) return component.style(style) } -} \ No newline at end of file +} diff --git a/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/AutoCraft.kt b/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/AutoCraft.kt deleted file mode 100644 index 93702aa6..00000000 --- a/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/AutoCraft.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_19_R1 - -import com.willfp.eco.internal.spigot.proxy.AutoCraftProxy -import net.minecraft.network.protocol.game.ClientboundPlaceGhostRecipePacket -import net.minecraft.resources.ResourceLocation - -class AutoCraft : AutoCraftProxy { - override fun modifyPacket(packet: Any) { - val recipePacket = packet as ClientboundPlaceGhostRecipePacket - val fKey = recipePacket.javaClass.getDeclaredField("b") - fKey.isAccessible = true - val key = fKey[recipePacket] as ResourceLocation - fKey[recipePacket] = ResourceLocation(key.namespace, key.path + "_displayed") - } -} \ No newline at end of file diff --git a/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/ChatComponent.kt b/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/ChatComponent.kt deleted file mode 100644 index 38db1cd0..00000000 --- a/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/ChatComponent.kt +++ /dev/null @@ -1,93 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_19_R1 - -import com.willfp.eco.core.display.Display -import com.willfp.eco.internal.spigot.proxy.ChatComponentProxy -import net.kyori.adventure.nbt.api.BinaryTagHolder -import net.kyori.adventure.text.BuildableComponent -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.TranslatableComponent -import net.kyori.adventure.text.event.HoverEvent -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer -import net.minecraft.nbt.TagParser -import org.bukkit.Material -import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack -import org.bukkit.entity.Player -import org.bukkit.inventory.ItemStack - -@Suppress("UNCHECKED_CAST") -class ChatComponent : ChatComponentProxy { - private val gsonComponentSerializer = GsonComponentSerializer.gson() - - override fun modifyComponent(obj: Any, player: Player): Any { - if (obj !is net.minecraft.network.chat.Component) { - return obj - } - - val component = gsonComponentSerializer.deserialize( - net.minecraft.network.chat.Component.Serializer.toJson( - obj - ) - ).asComponent() as BuildableComponent<*, *> - - val newComponent = modifyBaseComponent(component, player) - - return net.minecraft.network.chat.Component.Serializer.fromJson( - gsonComponentSerializer.serialize(newComponent.asComponent()) - ) ?: obj - } - - private fun modifyBaseComponent(baseComponent: Component, player: Player): Component { - var component = baseComponent - - if (component is TranslatableComponent) { - val args = mutableListOf() - for (arg in component.args()) { - args.add(modifyBaseComponent(arg, player)) - } - component = component.args(args) - } - - val children = mutableListOf() - for (child in component.children()) { - children.add(modifyBaseComponent(child, player)) - } - component = component.children(children) - - val hoverEvent: HoverEvent = component.style().hoverEvent() as HoverEvent? ?: return component - - val showItem = hoverEvent.value() - - if (showItem !is HoverEvent.ShowItem) { - return component - } - - val newShowItem = showItem.nbt( - BinaryTagHolder.binaryTagHolder( - CraftItemStack.asNMSCopy( - Display.display( - CraftItemStack.asBukkitCopy( - CraftItemStack.asNMSCopy( - ItemStack( - Material.matchMaterial( - showItem.item() - .toString() - ) ?: return component, - showItem.count() - ) - ).apply { - this.tag = TagParser.parseTag( - showItem.nbt()?.string() ?: return component - ) ?: return component - } - ), - player - ) - ).orCreateTag.toString() - ) - ) - - val newHover = hoverEvent.value(newShowItem) - val style = component.style().hoverEvent(newHover) - return component.style(style) - } -} \ No newline at end of file diff --git a/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/CommonsInitializer.kt b/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/CommonsInitializer.kt index c3f1222d..4547173a 100644 --- a/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/CommonsInitializer.kt +++ b/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/CommonsInitializer.kt @@ -1,5 +1,6 @@ package com.willfp.eco.internal.spigot.proxy.v1_19_R1 +import com.willfp.eco.core.EcoPlugin import com.willfp.eco.internal.spigot.proxy.CommonsInitializerProxy import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation @@ -27,7 +28,7 @@ import org.bukkit.persistence.PersistentDataContainer import java.lang.reflect.Field class CommonsInitializer : CommonsInitializerProxy { - override fun init() { + override fun init(plugin: EcoPlugin) { CommonsProvider.setIfNeeded(CommonsProviderImpl) } @@ -60,7 +61,7 @@ class CommonsInitializer : CommonsInitializerProxy { } override fun asBukkitStack(itemStack: net.minecraft.world.item.ItemStack): ItemStack { - return CraftItemStack.asBukkitCopy(itemStack) + return CraftItemStack.asCraftMirror(itemStack) } override fun mergeIfNeeded(itemStack: ItemStack, nmsStack: net.minecraft.world.item.ItemStack) { diff --git a/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/PacketHandler.kt b/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/PacketHandler.kt new file mode 100644 index 00000000..8b7dd1be --- /dev/null +++ b/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/PacketHandler.kt @@ -0,0 +1,66 @@ +package com.willfp.eco.internal.spigot.proxy.v1_19_R1 + +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.core.packet.PacketListener +import com.willfp.eco.internal.spigot.proxy.PacketHandlerProxy +import com.willfp.eco.internal.spigot.proxy.common.packet.EcoChannelDuplexHandler +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketAutoRecipe +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketHeldItemSlot +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketOpenWindowMerchant +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketSetCreativeSlot +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketSetSlot +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketWindowItems +import com.willfp.eco.internal.spigot.proxy.common.packet.display.frame.clearFrames +import net.minecraft.network.protocol.Packet +import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer +import org.bukkit.entity.Player + +class PacketHandler: PacketHandlerProxy { + override fun addPlayer(player: Player) { + if (player !is CraftPlayer) { + return + } + + player.handle.connection.connection.channel.pipeline() + .addBefore("eco_packet_handler", player.name, EcoChannelDuplexHandler(player.uniqueId)) + } + + override fun removePlayer(player: Player) { + if (player !is CraftPlayer) { + return + } + + val channel = player.handle.connection.connection.channel + + channel.eventLoop().submit { + channel.pipeline().remove(player.name) + } + } + + override fun sendPacket(player: Player, packet: Any) { + if (player !is CraftPlayer) { + return + } + + if (packet !is Packet<*>) { + return + } + + player.handle.connection.send(packet) + } + + override fun clearDisplayFrames() { + clearFrames() + } + + override fun getPacketListeners(plugin: EcoPlugin): List { + return listOf( + PacketAutoRecipe(plugin), + PacketHeldItemSlot, + PacketOpenWindowMerchant, + PacketSetCreativeSlot, + PacketSetSlot, + PacketWindowItems(plugin) + ) + } +} diff --git a/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/VillagerTrade.kt b/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/VillagerTrade.kt deleted file mode 100644 index 36d7a592..00000000 --- a/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/VillagerTrade.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_19_R1 - -import com.willfp.eco.core.display.Display -import com.willfp.eco.internal.spigot.proxy.VillagerTradeProxy -import net.minecraft.nbt.CompoundTag -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.trading.MerchantOffer -import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack -import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftMerchantRecipe -import org.bukkit.entity.Player -import org.bukkit.inventory.MerchantRecipe -import java.lang.reflect.Field - -class VillagerTrade : VillagerTradeProxy { - private val handle: Field = CraftMerchantRecipe::class.java.getDeclaredField("handle") - - override fun displayTrade( - recipe: MerchantRecipe, - player: Player - ): MerchantRecipe { - recipe as CraftMerchantRecipe - - val nbt = getHandle(recipe).createTag() - for (tag in arrayOf("buy", "buyB", "sell")) { - val nms = ItemStack.of(nbt.getCompound(tag)) - val displayed = Display.display(CraftItemStack.asBukkitCopy(nms), player) - val itemNBT = CraftItemStack.asNMSCopy(displayed).save(CompoundTag()) - nbt.put(tag, itemNBT) - } - - return CraftMerchantRecipe(MerchantOffer(nbt)) - } - - private fun getHandle(recipe: CraftMerchantRecipe): MerchantOffer { - return handle[recipe] as MerchantOffer - } - - init { - handle.isAccessible = true - } -} \ No newline at end of file diff --git a/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/AutoCraft.kt b/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/AutoCraft.kt deleted file mode 100644 index 46e08cbc..00000000 --- a/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/AutoCraft.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_19_R2 - -import com.willfp.eco.internal.spigot.proxy.AutoCraftProxy -import net.minecraft.network.protocol.game.ClientboundPlaceGhostRecipePacket -import net.minecraft.resources.ResourceLocation - -class AutoCraft : AutoCraftProxy { - override fun modifyPacket(packet: Any) { - val recipePacket = packet as ClientboundPlaceGhostRecipePacket - val fKey = recipePacket.javaClass.getDeclaredField("b") - fKey.isAccessible = true - val key = fKey[recipePacket] as ResourceLocation - fKey[recipePacket] = ResourceLocation(key.namespace, key.path + "_displayed") - } -} \ No newline at end of file diff --git a/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/ChatComponent.kt b/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/ChatComponent.kt deleted file mode 100644 index 7871866e..00000000 --- a/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/ChatComponent.kt +++ /dev/null @@ -1,93 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_19_R2 - -import com.willfp.eco.core.display.Display -import com.willfp.eco.internal.spigot.proxy.ChatComponentProxy -import net.kyori.adventure.nbt.api.BinaryTagHolder -import net.kyori.adventure.text.BuildableComponent -import net.kyori.adventure.text.Component -import net.kyori.adventure.text.TranslatableComponent -import net.kyori.adventure.text.event.HoverEvent -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer -import net.minecraft.nbt.TagParser -import org.bukkit.Material -import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack -import org.bukkit.entity.Player -import org.bukkit.inventory.ItemStack - -@Suppress("UNCHECKED_CAST") -class ChatComponent : ChatComponentProxy { - private val gsonComponentSerializer = GsonComponentSerializer.gson() - - override fun modifyComponent(obj: Any, player: Player): Any { - if (obj !is net.minecraft.network.chat.Component) { - return obj - } - - val component = gsonComponentSerializer.deserialize( - net.minecraft.network.chat.Component.Serializer.toJson( - obj - ) - ).asComponent() as BuildableComponent<*, *> - - val newComponent = modifyBaseComponent(component, player) - - return net.minecraft.network.chat.Component.Serializer.fromJson( - gsonComponentSerializer.serialize(newComponent.asComponent()) - ) ?: obj - } - - private fun modifyBaseComponent(baseComponent: Component, player: Player): Component { - var component = baseComponent - - if (component is TranslatableComponent) { - val args = mutableListOf() - for (arg in component.args()) { - args.add(modifyBaseComponent(arg, player)) - } - component = component.args(args) - } - - val children = mutableListOf() - for (child in component.children()) { - children.add(modifyBaseComponent(child, player)) - } - component = component.children(children) - - val hoverEvent: HoverEvent = component.style().hoverEvent() as HoverEvent? ?: return component - - val showItem = hoverEvent.value() - - if (showItem !is HoverEvent.ShowItem) { - return component - } - - val newShowItem = showItem.nbt( - BinaryTagHolder.binaryTagHolder( - CraftItemStack.asNMSCopy( - Display.display( - CraftItemStack.asBukkitCopy( - CraftItemStack.asNMSCopy( - ItemStack( - Material.matchMaterial( - showItem.item() - .toString() - ) ?: return component, - showItem.count() - ) - ).apply { - this.tag = TagParser.parseTag( - showItem.nbt()?.string() ?: return component - ) ?: return component - } - ), - player - ) - ).orCreateTag.toString() - ) - ) - - val newHover = hoverEvent.value(newShowItem) - val style = component.style().hoverEvent(newHover) - return component.style(style) - } -} \ No newline at end of file diff --git a/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/CommonsInitializer.kt b/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/CommonsInitializer.kt index e3588859..1f669bcb 100644 --- a/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/CommonsInitializer.kt +++ b/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/CommonsInitializer.kt @@ -1,5 +1,6 @@ package com.willfp.eco.internal.spigot.proxy.v1_19_R2 +import com.willfp.eco.core.EcoPlugin import com.willfp.eco.internal.spigot.proxy.CommonsInitializerProxy import com.willfp.eco.internal.spigot.proxy.common.CommonsProvider import com.willfp.eco.internal.spigot.proxy.common.toResourceLocation @@ -27,7 +28,7 @@ import org.bukkit.persistence.PersistentDataContainer import java.lang.reflect.Field class CommonsInitializer : CommonsInitializerProxy { - override fun init() { + override fun init(plugin: EcoPlugin) { CommonsProvider.setIfNeeded(CommonsProviderImpl) } @@ -60,7 +61,7 @@ class CommonsInitializer : CommonsInitializerProxy { } override fun asBukkitStack(itemStack: net.minecraft.world.item.ItemStack): ItemStack { - return CraftItemStack.asBukkitCopy(itemStack) + return CraftItemStack.asCraftMirror(itemStack) } override fun mergeIfNeeded(itemStack: ItemStack, nmsStack: net.minecraft.world.item.ItemStack) { diff --git a/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/PacketHandler.kt b/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/PacketHandler.kt new file mode 100644 index 00000000..a8245952 --- /dev/null +++ b/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/PacketHandler.kt @@ -0,0 +1,66 @@ +package com.willfp.eco.internal.spigot.proxy.v1_19_R2 + +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.core.packet.PacketListener +import com.willfp.eco.internal.spigot.proxy.PacketHandlerProxy +import com.willfp.eco.internal.spigot.proxy.common.packet.EcoChannelDuplexHandler +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketAutoRecipe +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketHeldItemSlot +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketOpenWindowMerchant +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketSetCreativeSlot +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketSetSlot +import com.willfp.eco.internal.spigot.proxy.common.packet.display.PacketWindowItems +import com.willfp.eco.internal.spigot.proxy.common.packet.display.frame.clearFrames +import net.minecraft.network.protocol.Packet +import org.bukkit.craftbukkit.v1_19_R2.entity.CraftPlayer +import org.bukkit.entity.Player + +class PacketHandler : PacketHandlerProxy { + override fun addPlayer(player: Player) { + if (player !is CraftPlayer) { + return + } + + player.handle.connection.connection.channel.pipeline() + .addBefore("eco_packet_handler", player.name, EcoChannelDuplexHandler(player.uniqueId)) + } + + override fun removePlayer(player: Player) { + if (player !is CraftPlayer) { + return + } + + val channel = player.handle.connection.connection.channel + + channel.eventLoop().submit { + channel.pipeline().remove(player.name) + } + } + + override fun sendPacket(player: Player, packet: Any) { + if (player !is CraftPlayer) { + return + } + + if (packet !is Packet<*>) { + return + } + + player.handle.connection.send(packet) + } + + override fun clearDisplayFrames() { + clearFrames() + } + + override fun getPacketListeners(plugin: EcoPlugin): List { + return listOf( + PacketAutoRecipe(plugin), + PacketHeldItemSlot, + PacketOpenWindowMerchant, + PacketSetCreativeSlot, + PacketSetSlot, + PacketWindowItems(plugin) + ) + } +} diff --git a/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/VillagerTrade.kt b/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/VillagerTrade.kt deleted file mode 100644 index 7532943f..00000000 --- a/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/VillagerTrade.kt +++ /dev/null @@ -1,41 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy.v1_19_R2 - -import com.willfp.eco.core.display.Display -import com.willfp.eco.internal.spigot.proxy.VillagerTradeProxy -import net.minecraft.nbt.CompoundTag -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.trading.MerchantOffer -import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack -import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftMerchantRecipe -import org.bukkit.entity.Player -import org.bukkit.inventory.MerchantRecipe -import java.lang.reflect.Field - -class VillagerTrade : VillagerTradeProxy { - private val handle: Field = CraftMerchantRecipe::class.java.getDeclaredField("handle") - - override fun displayTrade( - recipe: MerchantRecipe, - player: Player - ): MerchantRecipe { - recipe as CraftMerchantRecipe - - val nbt = getHandle(recipe).createTag() - for (tag in arrayOf("buy", "buyB", "sell")) { - val nms = ItemStack.of(nbt.getCompound(tag)) - val displayed = Display.display(CraftItemStack.asBukkitCopy(nms), player) - val itemNBT = CraftItemStack.asNMSCopy(displayed).save(CompoundTag()) - nbt.put(tag, itemNBT) - } - - return CraftMerchantRecipe(MerchantOffer(nbt)) - } - - private fun getHandle(recipe: CraftMerchantRecipe): MerchantOffer { - return handle[recipe] as MerchantOffer - } - - init { - handle.isAccessible = true - } -} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoImpl.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoImpl.kt index cedc3818..0281472a 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoImpl.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoImpl.kt @@ -6,7 +6,6 @@ import com.willfp.eco.core.PluginLike import com.willfp.eco.core.PluginProps import com.willfp.eco.core.command.CommandBase import com.willfp.eco.core.command.PluginCommandBase -import com.willfp.eco.core.command.impl.PluginCommand import com.willfp.eco.core.config.ConfigType import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.data.keys.PersistentDataKey @@ -55,7 +54,6 @@ import com.willfp.eco.internal.spigot.proxy.SkullProxy import com.willfp.eco.internal.spigot.proxy.TPSProxy import org.bukkit.Location import org.bukkit.NamespacedKey -import org.bukkit.command.CommandMap import org.bukkit.configuration.ConfigurationSection import org.bukkit.entity.Entity import org.bukkit.entity.Mob @@ -78,7 +76,7 @@ class EcoImpl : EcoSpigotPlugin(), Eco { ) init { - getProxy(CommonsInitializerProxy::class.java).init() + getProxy(CommonsInitializerProxy::class.java).init(this) } @Suppress("RedundantNullableReturnType") diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt index e1f393c1..f9fadae4 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt @@ -1,6 +1,5 @@ package com.willfp.eco.internal.spigot -import com.willfp.eco.core.AbstractPacketAdapter import com.willfp.eco.core.Eco import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.Prerequisite @@ -17,6 +16,7 @@ import com.willfp.eco.core.integrations.mcmmo.McmmoManager import com.willfp.eco.core.integrations.placeholder.PlaceholderManager import com.willfp.eco.core.integrations.shop.ShopManager import com.willfp.eco.core.items.Items +import com.willfp.eco.core.packet.PacketListener import com.willfp.eco.core.particle.Particles import com.willfp.eco.core.price.Prices import com.willfp.eco.internal.entities.EntityArgParserAdult @@ -57,14 +57,6 @@ import com.willfp.eco.internal.spigot.data.DataYml import com.willfp.eco.internal.spigot.data.PlayerBlockListener import com.willfp.eco.internal.spigot.data.ProfileHandler import com.willfp.eco.internal.spigot.data.storage.ProfileSaver -import com.willfp.eco.internal.spigot.display.PacketAutoRecipe -import com.willfp.eco.internal.spigot.display.PacketChat -import com.willfp.eco.internal.spigot.display.PacketHeldItemSlot -import com.willfp.eco.internal.spigot.display.PacketOpenWindowMerchant -import com.willfp.eco.internal.spigot.display.PacketSetCreativeSlot -import com.willfp.eco.internal.spigot.display.PacketSetSlot -import com.willfp.eco.internal.spigot.display.PacketWindowItems -import com.willfp.eco.internal.spigot.display.frame.clearFrames import com.willfp.eco.internal.spigot.drops.CollatedRunnable import com.willfp.eco.internal.spigot.eventlisteners.EntityDeathByEntityListeners import com.willfp.eco.internal.spigot.eventlisteners.NaturalExpGainListenersPaper @@ -120,7 +112,9 @@ import com.willfp.eco.internal.spigot.integrations.shop.ShopDeluxeSellwands import com.willfp.eco.internal.spigot.integrations.shop.ShopEconomyShopGUI import com.willfp.eco.internal.spigot.integrations.shop.ShopShopGuiPlus import com.willfp.eco.internal.spigot.integrations.shop.ShopZShop +import com.willfp.eco.internal.spigot.packet.PacketInjectorListener import com.willfp.eco.internal.spigot.proxy.FastItemStackFactoryProxy +import com.willfp.eco.internal.spigot.proxy.PacketHandlerProxy import com.willfp.eco.internal.spigot.recipes.CraftingRecipeListener import com.willfp.eco.internal.spigot.recipes.StackedRecipeListener import com.willfp.eco.internal.spigot.recipes.listeners.ComplexInComplex @@ -247,7 +241,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() { ProfileSaver(this, profileHandler) this.scheduler.runTimer( - { clearFrames() }, + { getProxy(PacketHandlerProxy::class.java).clearDisplayFrames() }, this.configYml.getInt("display-frame-ttl").toLong(), this.configYml.getInt("display-frame-ttl").toLong() ) @@ -357,18 +351,6 @@ abstract class EcoSpigotPlugin : EcoPlugin() { ) } - override fun loadPacketAdapters(): List { - return listOf( - PacketAutoRecipe(this), - PacketChat(this), - PacketSetCreativeSlot(this), - PacketSetSlot(this), - PacketWindowItems(this), - PacketHeldItemSlot(this), - PacketOpenWindowMerchant(this) - ) - } - override fun loadListeners(): List { val listeners = mutableListOf( ArmorListener(), @@ -380,6 +362,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() { ArmorChangeEventListeners(this), DataListener(this), PlayerBlockListener(this), + PacketInjectorListener(this), ServerLocking ) @@ -393,4 +376,8 @@ abstract class EcoSpigotPlugin : EcoPlugin() { return listeners } + + override fun loadPacketListeners(): List { + return this.getProxy(PacketHandlerProxy::class.java).getPacketListeners(this) + } } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketAutoRecipe.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketAutoRecipe.kt deleted file mode 100644 index 16ed606a..00000000 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketAutoRecipe.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.willfp.eco.internal.spigot.display - -import com.comphenix.protocol.PacketType -import com.comphenix.protocol.ProtocolLibrary -import com.comphenix.protocol.events.PacketContainer -import com.comphenix.protocol.events.PacketEvent -import com.willfp.eco.core.AbstractPacketAdapter -import com.willfp.eco.core.EcoPlugin -import com.willfp.eco.internal.spigot.proxy.AutoCraftProxy -import org.bukkit.entity.Player - -class PacketAutoRecipe(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, PacketType.Play.Server.AUTO_RECIPE, false) { - override fun onSend( - packet: PacketContainer, - player: Player, - event: PacketEvent - ) { - if (!this.getPlugin().configYml.getBool("displayed-recipes")) { - return - } - - if (!EcoPlugin.getPluginNames() - .contains(packet.minecraftKeys.values[0].fullKey.split(":".toRegex()).toTypedArray()[0]) - ) { - return - } - if (packet.minecraftKeys.values[0].fullKey.split(":".toRegex()).toTypedArray()[1].contains("displayed")) { - return - } - getPlugin().getProxy(AutoCraftProxy::class.java).modifyPacket(packet.handle) - val newAutoRecipe = PacketContainer(PacketType.Play.Server.AUTO_RECIPE) - newAutoRecipe.minecraftKeys.write(0, packet.minecraftKeys.read(0)) - ProtocolLibrary.getProtocolManager().sendServerPacket(player, newAutoRecipe) - } -} diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketChat.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketChat.kt deleted file mode 100644 index 6df2f562..00000000 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketChat.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.willfp.eco.internal.spigot.display - -import com.comphenix.protocol.PacketType -import com.comphenix.protocol.events.ListenerPriority -import com.comphenix.protocol.events.PacketContainer -import com.comphenix.protocol.events.PacketEvent -import com.comphenix.protocol.wrappers.WrappedChatComponent -import com.willfp.eco.core.AbstractPacketAdapter -import com.willfp.eco.core.EcoPlugin -import com.willfp.eco.internal.spigot.proxy.ChatComponentProxy -import org.bukkit.entity.Player - -class PacketChat(plugin: EcoPlugin) : - AbstractPacketAdapter(plugin, - PacketType.Play.Server.CHAT, - if (plugin.configYml.getBool("use-lower-protocollib-priority")) ListenerPriority.NORMAL else ListenerPriority.HIGHEST, - true) { - override fun onSend( - packet: PacketContainer, - player: Player, - event: PacketEvent - ) { - for (i in 0 until packet.chatComponents.size()) { - val component = packet.chatComponents.read(i) ?: continue - if (component.handle == null) { - return - } - val newComponent = WrappedChatComponent.fromHandle( - getPlugin().getProxy( - ChatComponentProxy::class.java - ).modifyComponent(component.handle, player) - ) - packet.chatComponents.write(i, newComponent) - } - } -} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketHeldItemSlot.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketHeldItemSlot.kt deleted file mode 100644 index bff27415..00000000 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketHeldItemSlot.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.willfp.eco.internal.spigot.display - -import com.comphenix.protocol.PacketType -import com.comphenix.protocol.events.PacketContainer -import com.comphenix.protocol.events.PacketEvent -import com.willfp.eco.core.AbstractPacketAdapter -import com.willfp.eco.core.EcoPlugin -import com.willfp.eco.internal.spigot.display.frame.DisplayFrame -import com.willfp.eco.internal.spigot.display.frame.lastDisplayFrame -import org.bukkit.entity.Player - -class PacketHeldItemSlot(plugin: EcoPlugin) : - AbstractPacketAdapter(plugin, PacketType.Play.Server.HELD_ITEM_SLOT, false) { - override fun onSend( - packet: PacketContainer, - player: Player, - event: PacketEvent - ) { - player.lastDisplayFrame = DisplayFrame.EMPTY - } - - override fun onReceive( - packet: PacketContainer, - player: Player, - event: PacketEvent - ) { - player.lastDisplayFrame = DisplayFrame.EMPTY - } -} diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketOpenWindowMerchant.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketOpenWindowMerchant.kt deleted file mode 100644 index 1a1ad61e..00000000 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketOpenWindowMerchant.kt +++ /dev/null @@ -1,33 +0,0 @@ -package com.willfp.eco.internal.spigot.display - -import com.comphenix.protocol.PacketType -import com.comphenix.protocol.events.ListenerPriority -import com.comphenix.protocol.events.PacketContainer -import com.comphenix.protocol.events.PacketEvent -import com.willfp.eco.core.AbstractPacketAdapter -import com.willfp.eco.core.EcoPlugin -import com.willfp.eco.internal.spigot.proxy.VillagerTradeProxy -import org.bukkit.entity.Player -import org.bukkit.inventory.MerchantRecipe - -class PacketOpenWindowMerchant(plugin: EcoPlugin) : - AbstractPacketAdapter(plugin, - PacketType.Play.Server.OPEN_WINDOW_MERCHANT, - if (plugin.configYml.getBool("use-lower-protocollib-priority")) ListenerPriority.NORMAL else ListenerPriority.MONITOR, - true) { - override fun onSend( - packet: PacketContainer, - player: Player, - event: PacketEvent - ) { - val recipes = mutableListOf() - - for (recipe in packet.merchantRecipeLists.read(0)) { - val newRecipe = getPlugin().getProxy(VillagerTradeProxy::class.java).displayTrade( - recipe!!, player - ) - recipes.add(newRecipe) - } - packet.merchantRecipeLists.write(0, recipes) - } -} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketSetCreativeSlot.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketSetCreativeSlot.kt deleted file mode 100644 index ec406ff6..00000000 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketSetCreativeSlot.kt +++ /dev/null @@ -1,29 +0,0 @@ -package com.willfp.eco.internal.spigot.display - -import com.comphenix.protocol.PacketType -import com.comphenix.protocol.events.PacketContainer -import com.comphenix.protocol.events.PacketEvent -import com.willfp.eco.core.AbstractPacketAdapter -import com.willfp.eco.core.EcoPlugin -import com.willfp.eco.core.display.Display -import com.willfp.eco.internal.spigot.display.frame.DisplayFrame -import com.willfp.eco.internal.spigot.display.frame.lastDisplayFrame -import org.bukkit.entity.Player -import org.bukkit.inventory.ItemStack - -class PacketSetCreativeSlot(plugin: EcoPlugin) : - AbstractPacketAdapter(plugin, PacketType.Play.Client.SET_CREATIVE_SLOT, false) { - override fun onReceive( - packet: PacketContainer, - player: Player, - event: PacketEvent - ) { - packet.itemModifier.modify(0) { itemStack: ItemStack? -> - Display.revert( - itemStack!! - ) - } - - player.lastDisplayFrame = DisplayFrame.EMPTY - } -} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketSetSlot.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketSetSlot.kt deleted file mode 100644 index 064292dc..00000000 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/display/PacketSetSlot.kt +++ /dev/null @@ -1,28 +0,0 @@ -package com.willfp.eco.internal.spigot.display - -import com.comphenix.protocol.PacketType -import com.comphenix.protocol.events.PacketContainer -import com.comphenix.protocol.events.PacketEvent -import com.willfp.eco.core.AbstractPacketAdapter -import com.willfp.eco.core.EcoPlugin -import com.willfp.eco.core.display.Display -import com.willfp.eco.internal.spigot.display.frame.DisplayFrame -import com.willfp.eco.internal.spigot.display.frame.lastDisplayFrame -import org.bukkit.entity.Player - -class PacketSetSlot(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, PacketType.Play.Server.SET_SLOT, false) { - override fun onSend( - packet: PacketContainer, - player: Player, - event: PacketEvent - ) { - packet.itemModifier.modify(0) { - Display.display( - it, - player - ) - } - - player.lastDisplayFrame = DisplayFrame.EMPTY - } -} diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/packet/PacketInjectorListener.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/packet/PacketInjectorListener.kt new file mode 100644 index 00000000..62c16a5c --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/packet/PacketInjectorListener.kt @@ -0,0 +1,22 @@ +package com.willfp.eco.internal.spigot.packet + +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.internal.spigot.proxy.PacketHandlerProxy +import org.bukkit.event.EventHandler +import org.bukkit.event.Listener +import org.bukkit.event.player.PlayerJoinEvent +import org.bukkit.event.player.PlayerQuitEvent + +class PacketInjectorListener( + private val plugin: EcoPlugin +) : Listener { + @EventHandler + fun onJoin(event: PlayerJoinEvent) { + plugin.getProxy(PacketHandlerProxy::class.java).addPlayer(event.player) + } + + @EventHandler + fun onLeave(event: PlayerQuitEvent) { + plugin.getProxy(PacketHandlerProxy::class.java).addPlayer(event.player) + } +} diff --git a/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/AutoCraftProxy.kt b/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/AutoCraftProxy.kt deleted file mode 100644 index 5228c3d7..00000000 --- a/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/AutoCraftProxy.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy - -interface AutoCraftProxy { - fun modifyPacket(packet: Any) -} \ No newline at end of file diff --git a/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/ChatComponentProxy.kt b/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/ChatComponentProxy.kt deleted file mode 100644 index 45c37ee3..00000000 --- a/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/ChatComponentProxy.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy - -import org.bukkit.entity.Player - -interface ChatComponentProxy { - fun modifyComponent( - obj: Any, - player: Player - ): Any -} \ No newline at end of file diff --git a/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/CommonsInitializerProxy.kt b/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/CommonsInitializerProxy.kt index db779bd4..3a718517 100644 --- a/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/CommonsInitializerProxy.kt +++ b/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/CommonsInitializerProxy.kt @@ -1,5 +1,7 @@ package com.willfp.eco.internal.spigot.proxy +import com.willfp.eco.core.EcoPlugin + interface CommonsInitializerProxy { - fun init() + fun init(plugin: EcoPlugin) } diff --git a/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/PacketHandlerProxy.kt b/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/PacketHandlerProxy.kt new file mode 100644 index 00000000..ea6c3d1e --- /dev/null +++ b/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/PacketHandlerProxy.kt @@ -0,0 +1,17 @@ +package com.willfp.eco.internal.spigot.proxy + +import com.willfp.eco.core.EcoPlugin +import com.willfp.eco.core.packet.PacketListener +import org.bukkit.entity.Player + +interface PacketHandlerProxy { + fun addPlayer(player: Player) + + fun removePlayer(player: Player) + + fun sendPacket(player: Player, packet: Any) + + fun clearDisplayFrames() + + fun getPacketListeners(plugin: EcoPlugin): List +} diff --git a/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/VillagerTradeProxy.kt b/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/VillagerTradeProxy.kt deleted file mode 100644 index 8b23c2ec..00000000 --- a/eco-core/core-proxy/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/VillagerTradeProxy.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.willfp.eco.internal.spigot.proxy - -import org.bukkit.entity.Player -import org.bukkit.inventory.MerchantRecipe - -interface VillagerTradeProxy { - fun displayTrade( - recipe: MerchantRecipe, - player: Player - ): MerchantRecipe -} \ No newline at end of file