fix: emptyShulkerBoxStack

This commit is contained in:
zly2006 committed 2024-07-11 12:14:02 +08:00
1 parent 4ba41aaf42
commit 68c8482eee
9 files changed
+132 -94

No files matched your search

@@ -7,9 +7,7 @@ import net.minecraft.block.RedstoneBlock;
import static com.github.zly2006.carpetslsaddition.ServerMain.CARPET_ID;
public class SLSCarpetSettings {
public static final String PCA = "pca"; // 用于描述兼容PCA的规则
public static final String NEED_CLIENT = "needClient"; // 需要客户端安装SLS-Addition或实现相关支持
public static final String PROTOCOL = "protocol";
@Rule(categories = {CARPET_ID, RuleCategory.SURVIVAL})
public static boolean obtainableReinforcedDeepSlate = false;
@@ -35,19 +33,10 @@ public class SLSCarpetSettings {
@Rule(categories = {CARPET_ID, RuleCategory.CREATIVE})
public static int maxUpdateQueueSize = -1;
@Rule(categories = {CARPET_ID, PCA, PROTOCOL})
public static boolean pcaSyncProtocol = false;
@Rule(categories = {CARPET_ID, PCA, PROTOCOL})
public static PCA_SYNC_PLAYER_ENTITY_OPTIONS pcaSyncPlayerEntity = PCA_SYNC_PLAYER_ENTITY_OPTIONS.OPS;
@Rule(categories = {CARPET_ID, PCA, RuleCategory.FEATURE, NEED_CLIENT})
@Rule(categories = {CARPET_ID, RuleCategory.FEATURE, NEED_CLIENT})
public static boolean emptyShulkerBoxStack = false;
@Rule(categories = {CARPET_ID, PCA, PROTOCOL}, strict = false, options = {"#none"})
public static String xaeroWorldName = "#none";
@Rule(categories = {CARPET_ID, PCA, RuleCategory.FEATURE})
@Rule(categories = {CARPET_ID, RuleCategory.FEATURE})
public static boolean playerSit = false;
@Rule(categories = {CARPET_ID, RuleCategory.FEATURE})
@@ -58,10 +47,4 @@ public class SLSCarpetSettings {
@Rule(categories = {CARPET_ID, RuleCategory.OPTIMIZATION})
public static boolean optimizedOnDragonRespawn = false;
public enum PCA_SYNC_PLAYER_ENTITY_OPTIONS {
NOBODY, BOT, OPS, OPS_AND_SELF, EVERYONE
}
}
@@ -1,38 +0,0 @@
package com.github.zly2006.carpetslsaddition.mixin.player;
import net.minecraft.entity.player.PlayerAbilities;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Accessor;
@Mixin(PlayerAbilities.class)
public interface AccessorPlayerAbilities {
@Accessor("flySpeed")
void setFlyingSpeed(float speed);
@Accessor("walkSpeed")
void setWalkingSpeed(float speed);
@Accessor("flying")
void setFlying(boolean flying);
@Accessor("invulnerable")
void setInvulnerable(boolean invulnerable);
@Accessor("allowFlying")
void setAllowFlying(boolean allowFlying);
@Accessor("creativeMode")
void setCreativeMode(boolean creativeMode);
@Accessor("allowModifyWorld")
void setAllowModifyWorld(boolean allowModifyWorld);
@Accessor("flySpeed")
float getFlyingSpeed();
@Accessor("walkSpeed")
float getWalkingSpeed();
@Accessor("flying")
boolean isFlying();
@Accessor("invulnerable")
boolean isInvulnerable();
@Accessor("allowFlying")
boolean isAllowFlying();
@Accessor("creativeMode")
boolean isCreativeMode();
@Accessor("allowModifyWorld")
boolean isAllowModifyWorld();
}
@@ -0,0 +1,28 @@
package com.github.zly2006.carpetslsaddition.mixin.player;
import com.github.zly2006.carpetslsaddition.SLSCarpetSettings;
import net.minecraft.entity.player.PlayerAbilities;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.inventory.Inventory;
import net.minecraft.util.Nameable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(PlayerInventory.class)
public abstract class MixinPlayerInventory implements Inventory, Nameable {
@Redirect(
method = "insertStack(ILnet/minecraft/item/ItemStack;)Z",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/entity/player/PlayerEntity;isInCreativeMode()Z"
)
)
private boolean insertStack(PlayerEntity instance) {
if (SLSCarpetSettings.creativeNoInfinitePickup) {
return false;
}
return instance.isInCreativeMode();
}
}
@@ -1,21 +0,0 @@
package com.github.zly2006.carpetslsaddition.mixin.screen;
import com.github.zly2006.carpetslsaddition.util.ShulkerBoxItemUtil;
import me.fallenbreath.conditionalmixin.api.annotation.Condition;
import me.fallenbreath.conditionalmixin.api.annotation.Restriction;
import net.minecraft.item.ItemStack;
import net.minecraft.screen.slot.Slot;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Restriction(
conflict = @Condition("pca")
)
@Mixin(Slot.class)
public class MixinSlot {
@Redirect(method = "getMaxItemCount(Lnet/minecraft/item/ItemStack;)I", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;getMaxCount()I", ordinal = 0))
private int getMaxItemCount(ItemStack itemStack) {
return ShulkerBoxItemUtil.getMaxCount(itemStack);
}
}
@@ -0,0 +1,23 @@
package com.github.zly2006.carpetslsaddition.mixin.shulker;
import com.github.zly2006.carpetslsaddition.SLSCarpetSettings;
import com.github.zly2006.carpetslsaddition.util.ShulkerBoxItemUtil;
import net.minecraft.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(ItemStack.class)
public class MixinItemStack {
@Inject(
method = "getMaxCount",
at = @At("HEAD"),
cancellable = true
)
private void getMaxCount(CallbackInfoReturnable<Integer> cir) {
if (SLSCarpetSettings.emptyShulkerBoxStack && ShulkerBoxItemUtil.isEmptyShulkerBoxItem((ItemStack) (Object) this)) {
cir.setReturnValue(ShulkerBoxItemUtil.SHULKERBOX_MAX_STACK_AMOUNT);
}
}
}
@@ -0,0 +1,26 @@
package com.github.zly2006.carpetslsaddition.mixin.shulker;
import com.github.zly2006.carpetslsaddition.util.ShulkerBoxItemUtil;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
import net.minecraft.item.ItemStack;
import net.minecraft.screen.ScreenHandler;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
@Mixin(ScreenHandler.class)
public abstract class MixinScreenHandler {
@WrapOperation(
method = "internalOnSlotClick",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/item/ItemStack;areItemsAndComponentsEqual(Lnet/minecraft/item/ItemStack;Lnet/minecraft/item/ItemStack;)Z"
)
)
private boolean checkEqual(ItemStack stack, ItemStack otherStack, Operation<Boolean> original) {
if (ShulkerBoxItemUtil.shulkerBoxEqual(stack, otherStack)) {
return true;
}
return original.call(stack, otherStack);
}
}
@@ -0,0 +1,33 @@
package com.github.zly2006.carpetslsaddition.mixin.shulker;
import com.github.zly2006.carpetslsaddition.SLSCarpetSettings;
import com.github.zly2006.carpetslsaddition.util.ShulkerBoxItemUtil;
import me.fallenbreath.conditionalmixin.api.annotation.Condition;
import me.fallenbreath.conditionalmixin.api.annotation.Restriction;
import net.minecraft.item.ItemStack;
import net.minecraft.screen.slot.Slot;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Restriction(
conflict = @Condition("pca")
)
@Mixin(Slot.class)
public class MixinSlot {
@Redirect(
method = "getMaxItemCount(Lnet/minecraft/item/ItemStack;)I",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/item/ItemStack;getMaxCount()I",
ordinal = 0
)
)
private int getMaxItemCount(ItemStack itemStack) {
if (SLSCarpetSettings.emptyShulkerBoxStack && ShulkerBoxItemUtil.isEmptyShulkerBoxItem(itemStack)) {
return ShulkerBoxItemUtil.SHULKERBOX_MAX_STACK_AMOUNT;
} else {
return itemStack.getMaxCount();
}
}
}
@@ -1,18 +1,31 @@
package com.github.zly2006.carpetslsaddition.util;
import com.github.zly2006.carpetslsaddition.SLSCarpetSettings;
import net.minecraft.block.ShulkerBoxBlock;
import net.minecraft.component.ComponentType;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.component.type.NbtComponent;
import net.minecraft.item.BlockItem;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NbtCompound;
import net.minecraft.nbt.NbtList;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import java.util.Objects;
public class ShulkerBoxItemUtil {
public static final int SHULKERBOX_MAX_STACK_AMOUNT = 64;
public static boolean shulkerBoxEqual(ItemStack stack, ItemStack otherStack) {
if (ShulkerBoxItemUtil.isEmptyShulkerBoxItem(stack) && ShulkerBoxItemUtil.isEmptyShulkerBoxItem(otherStack)) {
if (stack.isEmpty() && otherStack.isEmpty()) {
return true;
}
return Objects.equals(
stack.getComponents().filtered(s -> s != DataComponentTypes.BLOCK_ENTITY_DATA),
stack.getComponents().filtered(s -> s != DataComponentTypes.BLOCK_ENTITY_DATA)
);
}
return ItemStack.areItemsAndComponentsEqual(stack, otherStack);
}
public static boolean isEmptyShulkerBoxItem(ItemStack itemStack) {
if (itemStack.getItem() instanceof BlockItem &&
((BlockItem) itemStack.getItem()).getBlock() instanceof ShulkerBoxBlock) {
@@ -29,15 +42,4 @@ public class ShulkerBoxItemUtil {
}
}
public static int getMaxCount(ItemStack itemStack) {
if (SLSCarpetSettings.emptyShulkerBoxStack && ShulkerBoxItemUtil.isEmptyShulkerBoxItem(itemStack)) {
return ShulkerBoxItemUtil.SHULKERBOX_MAX_STACK_AMOUNT;
} else {
return itemStack.getMaxCount();
}
}
public static boolean isStackable(ItemStack itemStack) {
return getMaxCount(itemStack) > 1 && (!itemStack.isDamageable() || !itemStack.isDamaged());
}
}
+4 -2
View File
@@ -21,9 +21,11 @@
"entity.MixinPlayerEntity",
"entity.MixinServerPlayerEntity",
"entity.MixinVillagerEntity",
"player.AccessorPlayerAbilities",
"screen.MixinSlot",
"player.MixinPlayerInventory",
"server.MixinMinecraftServer",
"shulker.MixinItemStack",
"shulker.MixinScreenHandler",
"shulker.MixinSlot",
"world.MixinSleepManager",
"world.MixinSpawnHelper",
"world.MixinWorld"