Fix mod containers slot crash (#342 #360 #498)

This commit is contained in:
IzzelAliz 2022-03-25 13:44:24 +08:00
parent c09ef37020
commit d75383dc17
No known key found for this signature in database
GPG Key ID: EE50E123A11D8338
4 changed files with 37 additions and 2 deletions

View File

@ -0,0 +1,30 @@
package io.izzel.arclight.common.mixin.bukkit;
import io.izzel.arclight.common.mod.server.ArclightContainer;
import net.minecraft.world.inventory.AbstractContainerMenu;
import org.bukkit.craftbukkit.v.entity.CraftHumanEntity;
import org.bukkit.craftbukkit.v.inventory.CraftInventory;
import org.bukkit.craftbukkit.v.inventory.CraftInventoryView;
import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
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.callback.CallbackInfo;
@Mixin(value = CraftInventoryView.class, remap = false)
public abstract class CraftInventoryViewMixin extends InventoryView {
@Shadow @Final @Mutable private CraftInventory viewing;
@Inject(method = "<init>", at = @At("RETURN"))
private void arclight$validate(HumanEntity player, Inventory viewing, AbstractContainerMenu container, CallbackInfo ci) {
if (container.slots.size() > this.countSlots()) {
this.viewing = ArclightContainer.createInv(((CraftHumanEntity) player).getHandle(), container);
}
}
}

View File

@ -32,7 +32,7 @@ public abstract class InventoryMixin implements Container, IInventoryBridge, Pla
@Shadow protected abstract boolean hasRemainingSpaceForItem(ItemStack stack1, ItemStack stack2);
// @formatter:on
private List<HumanEntity> transaction = new ArrayList<>();
public List<HumanEntity> transaction = new ArrayList<>();
private int maxStack = MAX_STACK;
public int canHold(ItemStack stack) {

View File

@ -30,10 +30,14 @@ public class ArclightContainer {
*/
public static InventoryView createInvView(AbstractContainerMenu container) {
var containerOwner = ArclightCaptures.getContainerOwner();
Inventory viewing = new CraftInventory(new ContainerInvWrapper(container, containerOwner));
Inventory viewing = createInv(containerOwner, container);
return new CraftInventoryView(((PlayerEntityBridge) containerOwner).bridge$getBukkitEntity(), viewing, container);
}
public static CraftInventory createInv(Player containerOwner, AbstractContainerMenu container) {
return new CraftInventory(new ContainerInvWrapper(container, containerOwner));
}
private static class ContainerInvWrapper implements Container, IInventoryBridge {
private final AbstractContainerMenu container;

View File

@ -21,6 +21,7 @@
"CraftEventFactoryMixin",
"CraftHumanEntityMixin",
"CraftInventoryMixin",
"CraftInventoryViewMixin",
"CraftItemFactoryMixin",
"CraftItemStackMixin",
"CraftLegacyLegacyMixin",