AEInfinityBooster: MixinWirelessTerminalMenuHost 类详解
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);
}
}
原文地址: https://www.cveoy.top/t/topic/bxLp 著作权归作者所有。请勿转载和采集!