AnvilInventoryWrapper14_16.java

package it.fulminazzo.yagl.inventory;

import it.fulminazzo.fulmicollection.objects.Refl;
import it.fulminazzo.yagl.util.NMSUtils;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.jetbrains.annotations.NotNull;

/**
 * An implementation of {@link AnvilInventoryWrapper} with support from Minecraft 1.14 to 1.16.
 */
class AnvilInventoryWrapper14_16 extends AnvilInventoryWrapper13 {

    /**
     * Instantiates a new Anvil inventory wrapper.
     *
     * @param actualInventory the actual inventory
     */
    public AnvilInventoryWrapper14_16(final @NotNull Inventory actualInventory) {
        super(actualInventory);
    }

    @Override
    @NotNull Refl<?> getDelegateContainer(final @NotNull Player player,
                                          final @NotNull Refl<?> container) {
        final Refl<?> delegateRefl = container.getFieldRefl("delegate");

        Object world = NMSUtils.getHandle(player).getFieldObject("world");
        Object blockPosition = new Refl<>(NMSUtils.getLegacyNMSClass("BlockPosition"),
                player.getLocation().getBlockX(),
                player.getLocation().getBlockY(),
                player.getLocation().getBlockZ()
        ).getObject();

        Object containerAccess = new Refl<>(NMSUtils.getLegacyNMSClass("ContainerAccess"))
                .invokeMethod("at", world, blockPosition);

        delegateRefl.setFieldObject("containerAccess", containerAccess);
        return delegateRefl;
    }

}