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.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<T
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;"))
private Object arclight$worldInit(Map<Object, Object> 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;
}
/**

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.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);
}

View File

@ -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;

View File

@ -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) {
}