Untitled

 avatar
unknown
java
a year ago
3.5 kB
7
Indexable
package com.trexmine.guiapi.handlers;

import com.trexmine.guiapi.gui.GuiItem;
import com.trexmine.guiapi.gui.GuiManager;
import com.trexmine.guiapi.packets.GuiPacketPlayOutSetSlot;
import com.trexmine.guiapi.packets.GuiPacketPlayOutWindowItems;
import com.trexmine.guiapi.packets.GuiPacketPlayOutWindowItemsMixed;
import com.trexmine.guiapi.wrapper.WrappedPacketPlayOutWindowItems;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;
import io.netty.util.AttributeKey;
import lombok.RequiredArgsConstructor;
import net.minecraft.server.v1_8_R3.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;

import java.io.IOException;
import java.lang.reflect.Field;
import java.util.UUID;

@RequiredArgsConstructor
public final class ItemsEncoder extends MessageToByteEncoder<Packet<?>> {

    private static final Logger LOGGER = LogManager.getLogger();

    private final GuiManager guiManager;
    private final UUID playerUniqueId;

    @Override
    protected void encode(ChannelHandlerContext ctx, Packet packet, ByteBuf buffer) throws Exception {
        try {
            Integer id;

            if (packet instanceof GuiPacketPlayOutSetSlot) {
                id = 47;
            } else if (packet instanceof GuiPacketPlayOutWindowItems) {
                id = 48;
            } else {
                id = ctx.channel()
                        .attr(NetworkManager.c)
                        .get()
                        .a(EnumProtocolDirection.CLIENTBOUND, packet);
            }

            if (packet instanceof PacketPlayOutWindowItems) {
                WrappedPacketPlayOutWindowItems wrappedWindowItems = new WrappedPacketPlayOutWindowItems((PacketPlayOutWindowItems) packet);
                int windowId = wrappedWindowItems.getWindowId();

                if (windowId == guiManager.getId(playerUniqueId)) {
                    GuiItem[] items = guiManager.getGui(playerUniqueId).getItems();
                    ItemStack[] nmsItems = wrappedWindowItems.getItems();
                    Object[] mix = new Object[nmsItems.length];

                    int itemsLength = items.length;

                    System.arraycopy(items, 0, mix, 0, itemsLength);
                    System.arraycopy(nmsItems, itemsLength, mix, itemsLength, nmsItems.length - itemsLength);

                    packet = new GuiPacketPlayOutWindowItemsMixed(windowId, mix);
                }
            }

            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("OUT: [{}:{}] {}",
                        ctx.channel()
                                .attr(NetworkManager.c)
                                .get(),
                        id,
                        packet.getClass().getName()
                );
            }

            if (id == null) {
                throw new IOException("Can't serialize unregistered packet");
            } else {
                try {
                    PacketDataSerializer serializer = new PacketDataSerializer(buffer);

                    serializer.b(id);
                    packet.b(serializer);
                } catch (Throwable throwable) {
                    LOGGER.error(throwable);
                }
            }
        } catch (Exception e) {
            System.out.println(e.getLocalizedMessage());
            e.printStackTrace();
        }
    }
}
Editor is loading...
Leave a Comment