From 67c4e7b8e6b2d6145619b5b34846ea437c21b081 Mon Sep 17 00:00:00 2001 From: IzzelAliz Date: Sat, 2 Mar 2024 21:50:18 +0800 Subject: [PATCH] Fix mixin conflict with SinytraConnector (#1155) --- .../core/server/MinecraftServerMixin.java | 38 ++++++++++++------- .../mixin/core/world/entity/EntityMixin.java | 2 +- .../core/world/entity/LivingEntityMixin.java | 2 +- .../entity/player/ServerPlayerMixin.java | 2 +- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java index a022ead2..7e3362c9 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/server/MinecraftServerMixin.java @@ -73,9 +73,10 @@ import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @@ -340,20 +341,29 @@ public abstract class MinecraftServerMixin extends ReentrantBlockableEventLoop map, Object key, Object value) { - Object ret = map.put(key, value); - ServerLevel serverWorld = (ServerLevel) value; - if (((CraftServer) Bukkit.getServer()).scoreboardManager == null) { - ((CraftServer) Bukkit.getServer()).scoreboardManager = new CraftScoreboardManager((MinecraftServer) (Object) this, serverWorld.getScoreboard()); + @Unique private transient ServerLevel arclight$capturedLevel; + + @ModifyArg(method = "createLevels", index = 1, at = @At(value = "INVOKE", remap = false, target = "Ljava/util/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")) + private Object arclight$worldInitCapture(Object value) { + arclight$capturedLevel = (ServerLevel) value; + return value; + } + + @Inject(method = "createLevels", at = @At(value = "INVOKE", remap = false, target = "Ljava/util/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")) + private void arclight$worldInit(ChunkProgressListener chunkProgressListener, CallbackInfo ci) { + ServerLevel serverWorld = arclight$capturedLevel; + arclight$capturedLevel = null; + if (serverWorld != null) { + if (((CraftServer) Bukkit.getServer()).scoreboardManager == null) { + ((CraftServer) Bukkit.getServer()).scoreboardManager = new CraftScoreboardManager((MinecraftServer) (Object) this, serverWorld.getScoreboard()); + } + if (((WorldBridge) serverWorld).bridge$getGenerator() != null) { + ((WorldBridge) serverWorld).bridge$getWorld().getPopulators().addAll( + ((WorldBridge) serverWorld).bridge$getGenerator().getDefaultPopulators( + ((WorldBridge) serverWorld).bridge$getWorld())); + } + Bukkit.getPluginManager().callEvent(new WorldInitEvent(((WorldBridge) serverWorld).bridge$getWorld())); } - if (((WorldBridge) serverWorld).bridge$getGenerator() != null) { - ((WorldBridge) serverWorld).bridge$getWorld().getPopulators().addAll( - ((WorldBridge) serverWorld).bridge$getGenerator().getDefaultPopulators( - ((WorldBridge) serverWorld).bridge$getWorld())); - } - Bukkit.getPluginManager().callEvent(new WorldInitEvent(((WorldBridge) serverWorld).bridge$getWorld())); - return ret; } /** diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java index ca7b8b76..9a4521bd 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/EntityMixin.java @@ -905,7 +905,7 @@ public abstract class EntityMixin implements InternalEntityBridge, EntityBridge, entity.moveTo(portalinfo.pos.x, portalinfo.pos.y, portalinfo.pos.z, portalinfo.yRot, entity.getXRot()); entity.setDeltaMovement(portalinfo.speed); world.addDuringTeleport(entity); - if (((WorldBridge) world).bridge$getTypeKey() == LevelStem.END) { + if (((WorldBridge) world).bridge$getTypeKey() == LevelStem.END && Level.END != null /* fabric dimensions v1 */) { ArclightCaptures.captureEndPortalEntity((Entity) (Object) this, spawnPortal); ServerLevel.makeObsidianPlatform(world); } diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java index fdf2aaae..0b0874a6 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/LivingEntityMixin.java @@ -517,7 +517,7 @@ public abstract class LivingEntityMixin extends EntityMixin implements LivingEnt return false; } else if (this.level().isClientSide) { return false; - } else if (this.dead || this.isRemoved() || this.getHealth() <= 0.0F) { + } else if (this.dead || this.isRemoved() || this.isDeadOrDying()) { return false; } else if (source.is(DamageTypeTags.IS_FIRE) && this.hasEffect(MobEffects.FIRE_RESISTANCE)) { return false; diff --git a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin.java b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin.java index 620d7a22..f0ca004f 100644 --- a/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin.java +++ b/arclight-common/src/main/java/io/izzel/arclight/common/mixin/core/world/entity/player/ServerPlayerMixin.java @@ -725,7 +725,7 @@ public abstract class ServerPlayerMixin extends PlayerMixin implements ServerPla return this.containerCounter; } - @Redirect(method = "openMenu", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;closeContainer()V")) + @Redirect(method = "openMenu", require = 0, at = @At(value = "INVOKE", target = "Lnet/minecraft/server/level/ServerPlayer;closeContainer()V")) private void arclight$skipSwitch(ServerPlayer serverPlayer) { }