Fix mixin conflict with SinytraConnector (#1155)

This commit is contained in:
IzzelAliz 2024-03-02 21:50:18 +08:00
parent 08ff605a23
commit 67c4e7b8e6
4 changed files with 27 additions and 17 deletions

View File

@ -73,9 +73,10 @@ import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Shadow; 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.At;
import org.spongepowered.asm.mixin.injection.Inject; 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.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
@ -340,20 +341,29 @@ public abstract class MinecraftServerMixin extends ReentrantBlockableEventLoop<T
BukkitRegistry.registerEnvironments(this.registryAccess().registryOrThrow(Registries.LEVEL_STEM)); BukkitRegistry.registerEnvironments(this.registryAccess().registryOrThrow(Registries.LEVEL_STEM));
} }
@Redirect(method = "createLevels", at = @At(value = "INVOKE", remap = false, target = "Ljava/util/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;")) @Unique private transient ServerLevel arclight$capturedLevel;
private Object arclight$worldInit(Map<Object, Object> map, Object key, Object value) {
Object ret = map.put(key, value); @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;"))
ServerLevel serverWorld = (ServerLevel) value; private Object arclight$worldInitCapture(Object value) {
if (((CraftServer) Bukkit.getServer()).scoreboardManager == null) { arclight$capturedLevel = (ServerLevel) value;
((CraftServer) Bukkit.getServer()).scoreboardManager = new CraftScoreboardManager((MinecraftServer) (Object) this, serverWorld.getScoreboard()); 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;
} }
/** /**

View File

@ -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.moveTo(portalinfo.pos.x, portalinfo.pos.y, portalinfo.pos.z, portalinfo.yRot, entity.getXRot());
entity.setDeltaMovement(portalinfo.speed); entity.setDeltaMovement(portalinfo.speed);
world.addDuringTeleport(entity); 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); ArclightCaptures.captureEndPortalEntity((Entity) (Object) this, spawnPortal);
ServerLevel.makeObsidianPlatform(world); ServerLevel.makeObsidianPlatform(world);
} }

View File

@ -517,7 +517,7 @@ public abstract class LivingEntityMixin extends EntityMixin implements LivingEnt
return false; return false;
} else if (this.level().isClientSide) { } else if (this.level().isClientSide) {
return false; return false;
} else if (this.dead || this.isRemoved() || this.getHealth() <= 0.0F) { } else if (this.dead || this.isRemoved() || this.isDeadOrDying()) {
return false; return false;
} else if (source.is(DamageTypeTags.IS_FIRE) && this.hasEffect(MobEffects.FIRE_RESISTANCE)) { } else if (source.is(DamageTypeTags.IS_FIRE) && this.hasEffect(MobEffects.FIRE_RESISTANCE)) {
return false; return false;

View File

@ -725,7 +725,7 @@ public abstract class ServerPlayerMixin extends PlayerMixin implements ServerPla
return this.containerCounter; 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) { private void arclight$skipSwitch(ServerPlayer serverPlayer) {
} }