diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/SLSCarpetSettings.java b/src/main/java/com/github/zly2006/carpetslsaddition/SLSCarpetSettings.java index a721697..3206bb1 100644 --- a/src/main/java/com/github/zly2006/carpetslsaddition/SLSCarpetSettings.java +++ b/src/main/java/com/github/zly2006/carpetslsaddition/SLSCarpetSettings.java @@ -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 - } - } diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/player/AccessorPlayerAbilities.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/player/AccessorPlayerAbilities.java deleted file mode 100644 index 1bfd3c0..0000000 --- a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/player/AccessorPlayerAbilities.java +++ /dev/null @@ -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(); -} diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/player/MixinPlayerInventory.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/player/MixinPlayerInventory.java new file mode 100644 index 0000000..e3f4b2b --- /dev/null +++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/player/MixinPlayerInventory.java @@ -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(); + } +} diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/screen/MixinSlot.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/screen/MixinSlot.java deleted file mode 100644 index d76d21f..0000000 --- a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/screen/MixinSlot.java +++ /dev/null @@ -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); - } -} diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/shulker/MixinItemStack.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/shulker/MixinItemStack.java new file mode 100644 index 0000000..eb41b20 --- /dev/null +++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/shulker/MixinItemStack.java @@ -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 cir) { + if (SLSCarpetSettings.emptyShulkerBoxStack && ShulkerBoxItemUtil.isEmptyShulkerBoxItem((ItemStack) (Object) this)) { + cir.setReturnValue(ShulkerBoxItemUtil.SHULKERBOX_MAX_STACK_AMOUNT); + } + } +} diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/shulker/MixinScreenHandler.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/shulker/MixinScreenHandler.java new file mode 100644 index 0000000..4717748 --- /dev/null +++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/shulker/MixinScreenHandler.java @@ -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 original) { + if (ShulkerBoxItemUtil.shulkerBoxEqual(stack, otherStack)) { + return true; + } + return original.call(stack, otherStack); + } +} diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/shulker/MixinSlot.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/shulker/MixinSlot.java new file mode 100644 index 0000000..9f4e036 --- /dev/null +++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/shulker/MixinSlot.java @@ -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(); + } + } +} diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/util/ShulkerBoxItemUtil.java b/src/main/java/com/github/zly2006/carpetslsaddition/util/ShulkerBoxItemUtil.java index aff02be..56f63c8 100644 --- a/src/main/java/com/github/zly2006/carpetslsaddition/util/ShulkerBoxItemUtil.java +++ b/src/main/java/com/github/zly2006/carpetslsaddition/util/ShulkerBoxItemUtil.java @@ -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()); - } } diff --git a/src/main/resources/slsaddition.mixins.json b/src/main/resources/slsaddition.mixins.json index 0049d50..b8dd2ae 100644 --- a/src/main/resources/slsaddition.mixins.json +++ b/src/main/resources/slsaddition.mixins.json @@ -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"