Search in sources :

Example 21 with Redirect

use of org.spongepowered.asm.mixin.injection.Redirect in project SpongeCommon by SpongePowered.

the class MixinContainer method redirectTransferStackInSlot.

@Redirect(method = "slotClick", at = @At(value = "INVOKE", target = "Lnet/minecraft/inventory/Container;transferStackInSlot(Lnet/minecraft/entity/player/EntityPlayer;I)Lnet/minecraft/item/ItemStack;"))
private ItemStack redirectTransferStackInSlot(Container thisContainer, EntityPlayer player, int slotId) {
    Slot slot = thisContainer.getSlot(slotId);
    if (!(slot instanceof SlotCrafting)) {
        return thisContainer.transferStackInSlot(player, slotId);
    }
    this.lastCraft = null;
    this.shiftCraft = true;
    ItemStack result = thisContainer.transferStackInSlot(player, slotId);
    if (this.lastCraft != null) {
        if (this.lastCraft.isCancelled()) {
            // Return empty to stop shift-crafting
            result = ItemStack.EMPTY;
        }
    }
    this.shiftCraft = false;
    return result;
}
Also used : SPacketSetSlot(net.minecraft.network.play.server.SPacketSetSlot) Slot(net.minecraft.inventory.Slot) ItemStack(net.minecraft.item.ItemStack) SlotCrafting(net.minecraft.inventory.SlotCrafting) Redirect(org.spongepowered.asm.mixin.injection.Redirect)

Example 22 with Redirect

use of org.spongepowered.asm.mixin.injection.Redirect in project SpongeCommon by SpongePowered.

the class MixinContainer method onDragDropSplit.

@Redirect(method = "slotClick", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/EntityPlayer;dropItem(Lnet/minecraft/item/ItemStack;Z)Lnet/minecraft/entity/item/EntityItem;", ordinal = 1))
public EntityItem onDragDropSplit(EntityPlayer player, ItemStack itemStackIn, boolean unused) {
    final EntityItem entityItem = player.dropItem(itemStackIn, unused);
    if (!((IMixinEntityPlayer) player).shouldRestoreInventory()) {
        return entityItem;
    }
    if (entityItem == null) {
        ItemStack original = null;
        if (player.inventory.getItemStack().isEmpty()) {
            original = itemStackIn;
        } else {
            player.inventory.getItemStack().grow(1);
            original = player.inventory.getItemStack();
        }
        player.inventory.setItemStack(original);
        ((EntityPlayerMP) player).connection.sendPacket(new SPacketSetSlot(-1, -1, original));
    }
    ((IMixinEntityPlayer) player).shouldRestoreInventory(false);
    return entityItem;
}
Also used : SPacketSetSlot(net.minecraft.network.play.server.SPacketSetSlot) ItemStack(net.minecraft.item.ItemStack) IMixinEntityPlayer(org.spongepowered.common.interfaces.entity.player.IMixinEntityPlayer) EntityItem(net.minecraft.entity.item.EntityItem) Redirect(org.spongepowered.asm.mixin.injection.Redirect)

Example 23 with Redirect

use of org.spongepowered.asm.mixin.injection.Redirect in project SpongeCommon by SpongePowered.

the class MixinContainer method beforeSlotChangedCraftingGrid.

@Redirect(method = "slotChangedCraftingGrid", at = @At(value = "INVOKE", target = "Lnet/minecraft/inventory/InventoryCraftResult;setInventorySlotContents(ILnet/minecraft/item/ItemStack;)V"))
private void beforeSlotChangedCraftingGrid(InventoryCraftResult output, int index, ItemStack itemstack) {
    if (!this.captureInventory) {
        // Capture Inventory is true when caused by a vanilla inventory packet
        // This is to prevent infinite loops when a client mod re-requests the recipe result after we modified/cancelled it
        output.setInventorySlotContents(index, itemstack);
        return;
    }
    this.spongeInit();
    this.capturedCraftPreviewTransactions.clear();
    ItemStackSnapshot orig = ItemStackUtil.snapshotOf(output.getStackInSlot(index));
    output.setInventorySlotContents(index, itemstack);
    ItemStackSnapshot repl = ItemStackUtil.snapshotOf(output.getStackInSlot(index));
    SlotAdapter slot = this.adapters.get(index);
    this.capturedCraftPreviewTransactions.add(new SlotTransaction(slot, orig, repl));
}
Also used : ItemStackSnapshot(org.spongepowered.api.item.inventory.ItemStackSnapshot) SlotAdapter(org.spongepowered.common.item.inventory.adapter.impl.slots.SlotAdapter) SlotTransaction(org.spongepowered.api.item.inventory.transaction.SlotTransaction) Redirect(org.spongepowered.asm.mixin.injection.Redirect)

Example 24 with Redirect

use of org.spongepowered.asm.mixin.injection.Redirect in project SpongeForge by SpongePowered.

the class MixinGameRegistry method onGenerateWorld.

@Redirect(method = "generateWorld", at = @At(value = "INVOKE", target = WORLD_GENERATOR_GENERATE, remap = false))
private static void onGenerateWorld(IWorldGenerator worldGenerator, Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) {
    Timing timing = null;
    if (Timings.isTimingsEnabled()) {
        timing = worldGeneratorTimings.get(worldGenerator.getClass());
        if (timing == null) {
            String modId = StaticMixinForgeHelper.getModIdFromClass(worldGenerator.getClass());
            timing = SpongeTimingsFactory.ofSafe("worldGenerator (" + modId + ":" + worldGenerator.getClass().getName() + ")");
            worldGeneratorTimings.put(worldGenerator.getClass(), timing);
        }
        timing.startTimingIfSync();
    }
    worldGenerator.generate(random, chunkX, chunkZ, world, chunkGenerator, chunkProvider);
    if (Timings.isTimingsEnabled()) {
        timing.stopTimingIfSync();
    }
}
Also used : Timing(co.aikar.timings.Timing) Redirect(org.spongepowered.asm.mixin.injection.Redirect)

Example 25 with Redirect

use of org.spongepowered.asm.mixin.injection.Redirect in project SpongeForge by SpongePowered.

the class MixinVanillaInventoryCodeHooks method onPullItemOut.

@Redirect(remap = false, method = "extractHook", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/items/IItemHandler;extractItem(IIZ)Lnet/minecraft/item/ItemStack;", ordinal = 1))
private static ItemStack onPullItemOut(IItemHandler handler, int slot, int amount, boolean simulate, IHopper dest) {
    if (ShouldFire.CHANGE_INVENTORY_EVENT_TRANSFER_POST) {
        Object inv = getItemHandler(dest, EnumFacing.UP).getValue();
        // Capture Origin
        ItemStack origin = handler.getStackInSlot(slot).copy();
        ItemStack result = handler.extractItem(slot, amount, simulate);
        SpongeCommonEventFactory.captureTransaction(InventoryUtil.forCapture(dest), InventoryUtil.toInventory(inv, handler), slot, origin);
        return result;
    }
    return handler.extractItem(slot, amount, simulate);
}
Also used : ItemStack(net.minecraft.item.ItemStack) Redirect(org.spongepowered.asm.mixin.injection.Redirect)

Aggregations

Redirect (org.spongepowered.asm.mixin.injection.Redirect)165 CauseStackManager (org.spongepowered.api.event.CauseStackManager)25 ItemStackSnapshot (org.spongepowered.api.item.inventory.ItemStackSnapshot)15 ItemStack (net.minecraft.item.ItemStack)13 EffectTransactor (org.spongepowered.common.event.tracking.context.transaction.EffectTransactor)13 PhaseTracker (org.spongepowered.common.event.tracking.PhaseTracker)12 TransactionalCaptureSupplier (org.spongepowered.common.event.tracking.context.transaction.TransactionalCaptureSupplier)11 ArrayList (java.util.ArrayList)9 ItemStack (net.minecraft.world.item.ItemStack)9 Nullable (javax.annotation.Nullable)8 Vector3d (com.flowpowered.math.vector.Vector3d)7 World (net.minecraft.world.World)7 ServerLocation (org.spongepowered.api.world.server.ServerLocation)7 DamageSourceBridge (org.spongepowered.common.bridge.world.damagesource.DamageSourceBridge)7 IPhaseState (org.spongepowered.common.event.tracking.IPhaseState)7 IBlockState (net.minecraft.block.state.IBlockState)6 Entity (net.minecraft.entity.Entity)6 EntityPlayer (net.minecraft.entity.player.EntityPlayer)6 ServerLevel (net.minecraft.server.level.ServerLevel)6 EntityItem (net.minecraft.entity.item.EntityItem)5