From 6687583c9624cb7c5a55b1228209f1cb858a04a3 Mon Sep 17 00:00:00 2001 From: Ap_Tx <3045929398@qq.com> Date: Sat, 3 Oct 2026 08:15:04 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=2026.1.2=20=E8=BF=90?= =?UTF-8?q?=E8=A1=8C=E6=97=B6=20mixin=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MixinServerPlayerEntity: 移除失效的 @Shadow isSpectator,packDirty 加 null 检查(修复 playerSit 崩溃) & - MixinSpawnHelper: 改用 @Inject getMobForSpawn,避免与 Carpet NaturalSpawnerMixin 的 @Redirect 冲突 & - MixinBoatEntity: 改挂 AbstractBoat.tick(Boat 无 tick) & - MixinMobEntity: 移除对接口 default 方法的无效 @Shadow & - MixinPlayerInventory: creativeNoInfinitePickup 改用 hasInfiniteMaterials(原 isInCreativeMode 已不存在) & - MixinRedstoneWireBlock: oldRedstoneConnectionLogic 改挂 getConnectingSide & - 禁用 datapack.MixinVanillaResourcePackProvider(新版资源包系统重构,待重写) & - ServerMain: registerCommands 加日志+异常捕获 --- build.gradle | 10 ++++---- .../zly2006/carpetslsaddition/ServerMain.java | 13 ++++++++--- .../mixin/block/MixinRedstoneWireBlock.java | 8 ++++++- .../mixin/entity/MixinBoatEntity.java | 4 ++-- .../mixin/entity/MixinMobEntity.java | 3 --- .../mixin/entity/MixinServerPlayerEntity.java | 6 +++-- .../mixin/player/MixinPlayerInventory.java | 11 ++++----- .../mixin/world/MixinSpawnHelper.java | 23 +++++++++---------- src/main/resources/slsaddition.mixins.json | 3 +-- 9 files changed, 46 insertions(+), 35 deletions(-) diff --git a/build.gradle b/build.gradle index 9f4ac0a..961c695 100644 --- a/build.gradle +++ b/build.gradle @@ -53,10 +53,11 @@ loom { } processResources { - inputs.property "version", project.version + def modVersion = project.version + inputs.property "version", modVersion filesMatching("fabric.mod.json") { - expand "version": project.version + expand "version": modVersion } } @@ -76,8 +77,9 @@ java { } jar { + def baseName = project.base.archivesName.get() from("LICENSE") { - rename { "${it}_${project.archivesBaseName}"} + rename { "${it}_${baseName}"} } } @@ -96,4 +98,4 @@ publishing { // The repositories here will be used for publishing your artifact, not for // retrieving dependencies. } -} \ No newline at end of file +} diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/ServerMain.java b/src/main/java/com/github/zly2006/carpetslsaddition/ServerMain.java index 91f98f8..2e289f7 100644 --- a/src/main/java/com/github/zly2006/carpetslsaddition/ServerMain.java +++ b/src/main/java/com/github/zly2006/carpetslsaddition/ServerMain.java @@ -38,6 +38,7 @@ public class ServerMain implements ModInitializer, CarpetExtension { @Override public void onInitialize() { + LOGGER.info("[SLSA] onInitialize: managing Carpet extension"); INSTANCE = this; CarpetServer.manageExtension(this); } @@ -75,8 +76,14 @@ public class ServerMain implements ModInitializer, CarpetExtension { @Override public void registerCommands(CommandDispatcher dispatcher, CommandBuildContext commandBuildContext) { - HatCommand.register(dispatcher); - SitCommand.register(dispatcher); - BotCommand.register(dispatcher); + LOGGER.info("[SLSA] registerCommands called!"); + try { + HatCommand.register(dispatcher); + SitCommand.register(dispatcher); + BotCommand.register(dispatcher); + LOGGER.info("[SLSA] commands registered: hat/sit/bot"); + } catch (Throwable t) { + LOGGER.error("[SLSA] failed to register commands", t); + } } } \ No newline at end of file diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/block/MixinRedstoneWireBlock.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/block/MixinRedstoneWireBlock.java index 05b160a..8124fd6 100644 --- a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/block/MixinRedstoneWireBlock.java +++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/block/MixinRedstoneWireBlock.java @@ -11,7 +11,13 @@ import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(value = RedStoneWireBlock.class, priority = 1) public class MixinRedstoneWireBlock { - @Redirect(method = "*", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;getBlock()Lnet/minecraft/world/level/block/Block;"), require = 0) + // oldRedstoneConnectionLogic:让红石能连到活板门上的红石线。 + // 新版在 getConnectingSide 里用 `blockState.getBlock() instanceof TrapDoorBlock` 判断。 + // 与旧版一致的做法是把这个 getBlock() 结果换成 AIR(绕过活板门特殊分支,走 canSurviveOn)。 + @Redirect( + method = "getConnectingSide(Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;Lnet/minecraft/core/Direction;Z)Lnet/minecraft/world/level/block/state/properties/RedstoneSide;", + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/block/state/BlockState;getBlock()Lnet/minecraft/world/level/block/Block;") + ) public Block redirectConnectionBlockState(BlockState instance) { if (SLSCarpetSettings.oldRedstoneConnectionLogic) { return Blocks.AIR; diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinBoatEntity.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinBoatEntity.java index 1b4966a..e589f9b 100644 --- a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinBoatEntity.java +++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinBoatEntity.java @@ -2,13 +2,13 @@ package com.github.zly2006.carpetslsaddition.mixin.entity; import com.github.zly2006.carpetslsaddition.SLSCarpetSettings; import net.minecraft.world.entity.Leashable; -import net.minecraft.world.entity.vehicle.boat.Boat; +import net.minecraft.world.entity.vehicle.boat.AbstractBoat; 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.CallbackInfo; -@Mixin(Boat.class) +@Mixin(AbstractBoat.class) public abstract class MixinBoatEntity implements Leashable { @Inject(method = "tick", at = @At("HEAD")) private void onTick(CallbackInfo ci) { diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinMobEntity.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinMobEntity.java index 048362b..35df3e6 100644 --- a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinMobEntity.java +++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinMobEntity.java @@ -4,15 +4,12 @@ import com.github.zly2006.carpetslsaddition.SLSCarpetSettings; import net.minecraft.world.entity.Leashable; import net.minecraft.world.entity.Mob; 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.callback.CallbackInfo; @Mixin(Mob.class) public abstract class MixinMobEntity implements Leashable { - @Shadow public abstract void dropLeash(); - @Inject(method = "tick", at = @At("HEAD")) private void onTick(CallbackInfo ci) { if (!SLSCarpetSettings.spectatorCannotUseLeash || diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinServerPlayerEntity.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinServerPlayerEntity.java index db56d7b..dbdcde7 100644 --- a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinServerPlayerEntity.java +++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/entity/MixinServerPlayerEntity.java @@ -17,7 +17,6 @@ public abstract class MixinServerPlayerEntity extends Player { @Shadow public ServerGamePacketListenerImpl connection; - @Shadow public abstract boolean isSpectator(); @Unique private int sneakTimes = 0; @@ -60,7 +59,10 @@ public abstract class MixinServerPlayerEntity extends Player { super.setShiftKeyDown(false); // 同步潜行状态到客户端 if (sneakTimes == 0 && this.connection != null) { - this.connection.send(new ClientboundSetEntityDataPacket(this.getId(), this.getEntityData().packDirty())); + java.util.List> dirty = this.getEntityData().packDirty(); + if (dirty != null) { + this.connection.send(new ClientboundSetEntityDataPacket(this.getId(), dirty)); + } } } } 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 index a8fe079..dfc5a07 100644 --- a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/player/MixinPlayerInventory.java +++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/player/MixinPlayerInventory.java @@ -11,18 +11,17 @@ import org.spongepowered.asm.mixin.injection.Redirect; @Mixin(Inventory.class) public abstract class MixinPlayerInventory implements Container, Nameable { + // creativeNoInfinitePickup:创造模式下满背包不能拾取。 + // 新版 Inventory.add 在满背包 + hasInfiniteMaterials 时把数量清 0 并返回 true。 + // 规则开启时改为 false,避免"假拾取"。 @Redirect( method = "add(ILnet/minecraft/world/item/ItemStack;)Z", - at = @At( - value = "INVOKE", - target = "Lnet/minecraft/world/entity/player/Player;isCreative()Z" - ), - require = 0 + at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/player/Player;hasInfiniteMaterials()Z") ) private boolean insertStack(Player instance) { if (SLSCarpetSettings.creativeNoInfinitePickup) { return false; } - return instance.isCreative(); + return instance.hasInfiniteMaterials(); } } \ No newline at end of file diff --git a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/world/MixinSpawnHelper.java b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/world/MixinSpawnHelper.java index 9c118cb..c2df27d 100644 --- a/src/main/java/com/github/zly2006/carpetslsaddition/mixin/world/MixinSpawnHelper.java +++ b/src/main/java/com/github/zly2006/carpetslsaddition/mixin/world/MixinSpawnHelper.java @@ -1,24 +1,23 @@ package com.github.zly2006.carpetslsaddition.mixin.world; import com.github.zly2006.carpetslsaddition.SLSCarpetSettings; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EntitySpawnReason; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.level.Level; +import net.minecraft.world.entity.Mob; +import net.minecraft.world.level.NaturalSpawner; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(net.minecraft.world.level.NaturalSpawner.class) +@Mixin(NaturalSpawner.class) public class MixinSpawnHelper { - @Redirect(method = "getMobForSpawn", at = @At( - value = "INVOKE", - target = "Lnet/minecraft/world/entity/EntityType;create(Lnet/minecraft/world/level/Level;Lnet/minecraft/world/entity/EntitySpawnReason;)Lnet/minecraft/world/entity/Entity;" - )) - private static Entity onCreateMob(EntityType type, Level world, EntitySpawnReason reason) { + // 注意:不能用 @Redirect EntityType.create —— 会和 Carpet 的 NaturalSpawnerMixin 冲突。 + // 改为在 getMobForSpawn 返回处拦截。 + @Inject(method = "getMobForSpawn", at = @At("HEAD"), cancellable = true) + private static void onCreateMob(ServerLevel level, EntityType type, CallbackInfoReturnable cir) { if (SLSCarpetSettings.noBatSpawning && type == EntityType.BAT) { - return null; + cir.setReturnValue(null); } - return type.create(world, reason); } } \ No newline at end of file diff --git a/src/main/resources/slsaddition.mixins.json b/src/main/resources/slsaddition.mixins.json index 7f7c350..17082f9 100644 --- a/src/main/resources/slsaddition.mixins.json +++ b/src/main/resources/slsaddition.mixins.json @@ -1,5 +1,5 @@ { - "required": true, + "required": false, "minVersion": "0.8", "package": "com.github.zly2006.carpetslsaddition.mixin", "compatibilityLevel": "JAVA_21", @@ -13,7 +13,6 @@ "block.MixinTrialSpawnerState", "carpet.MixinEntityPlayerMPFake", "carpet.MixinPlayerCommand", - "datapack.MixinVanillaResourcePackProvider", "elytra.ItemAccessor", "elytra.MixinItem", "entity.MixinArmadilloEntity",