package uk.co.hexeption.aeinfinitybooster.mixins;

import appeng.api.implementations.blockentities.IWirelessAccessPoint;
import appeng.api.implementations.menuobjects.ItemMenuHost;
import appeng.api.networking.IGrid;
import appeng.blockentity.networking.WirelessAccessPointBlockEntity;
import appeng.helpers.WirelessTerminalMenuHost;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.Redirect;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import uk.co.hexeption.aeinfinitybooster.setup.ModItems;

/**
 * MixinWirelessTerminalMenuHost 通过 Mixin 技术修改 WirelessTerminalMenuHost 类的行为,
 * 实现无限范围和能量的功能。
 *
 * @author Hexeption admin@hexeption.co.uk
 * @since 22/12/2021 - 08:27 am
 */
@Mixin(value = WirelessTerminalMenuHost.class, remap = false)
public class MixinWirelessTerminalMenuHost extends ItemMenuHost {

    @Shadow
    private double currentDistanceFromGrid;

    @Shadow @Final private IGrid targetGrid;

    public MixinWirelessTerminalMenuHost(Player player, int slot, ItemStack itemStack) {
        super(player, slot, itemStack);
    }

    /**
     * 修改 getWapSqDistance() 方法,实现无限范围的功能。
     * 如果检测到维度卡或无限卡,则将距离设置为最大值。
     */
    @Inject(method = 'getWapSqDistance', at = @At('HEAD'), cancellable = true)
    private void testWap(IWirelessAccessPoint wirelessAccessPoint, CallbackInfoReturnable<Double> cir) {

        wirelessAccessPoint.getGrid().getMachines(WirelessAccessPointBlockEntity.class).forEach(wirelessBlockEntity -> {

            if (wirelessBlockEntity.getInternalInventory().getStackInSlot(0).is(ModItems.DIMENSION_CARD.get())) {
                currentDistanceFromGrid = 64;
                cir.setReturnValue(Double.MAX_VALUE / 2);
            }

            if (!this.getPlayer().level().dimension().location().toString().equals(wirelessAccessPoint.getLocation().getLevel().dimension().location().toString())) {
                return;
            }

            if (wirelessBlockEntity.getInternalInventory().getStackInSlot(0).is(ModItems.INFINITY_CARD.get())) {
                currentDistanceFromGrid = 64;
                cir.setReturnValue(Double.MAX_VALUE / 2);
            }
        });
    }

    /**
     * 修改 extractAEPower() 方法,实现无限能量的功能。
     * 如果检测到维度卡或无限卡,则返回最大能量值。
     */
    @Redirect(method = 'extractAEPower', at = @At(value = 'INVOKE', target = 'Ljava/lang/Math;min(DD)D'))
    private double testPowerMultiplier(double a, double b) {
        for (var wap : this.targetGrid.getMachines(WirelessAccessPointBlockEntity.class)) {
            if (wap.getInternalInventory().getStackInSlot(0).is(ModItems.INFINITY_CARD.get())) {
                return 64;
            }
            if (wap.getInternalInventory().getStackInSlot(0).is(ModItems.DIMENSION_CARD.get())) {
                return 64;
            }
        }
        return Math.min(a, b);
    }

}
AEInfinityBooster: MixinWirelessTerminalMenuHost 类详解

原文地址: https://www.cveoy.top/t/topic/bxLp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录