package de.aeromc.capes.mixin; import com.mojang.authlib.GameProfile; import com.mojang.authlib.properties.Property; import com.mojang.authlib.yggdrasil.YggdrasilMinecraftSessionService; import de.aeromc.capes.mod.Umhaenge; 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; /** * Hängt sich an die Textur-Methoden von authlib (beide Fassungen, siehe * agent/…/Umbau.java). require = 0: Es greift immer nur die Methode, die es in * der jeweiligen authlib-Fassung gibt, die andere wird still übersprungen. * remap = false: authlib ist nicht verschleiert, Namen bleiben wie sie sind. */ @Mixin(value = YggdrasilMinecraftSessionService.class, remap = false) public abstract class SessionServiceMixin { // wird in den statischen Initialisierer von authlib übernommen: zeigt im Spielprotokoll, dass der Mod greift static { Umhaenge.authlibGreift = true; Umhaenge.meldeAktiv("authlib"); } // authlib 5+ (Minecraft 1.20.2 … 26.x) @Inject(method = "unpackTextures", at = @At("RETURN"), cancellable = true, remap = false, require = 0) private void aeromc$neu(Property eigenschaft, CallbackInfoReturnable cir) { aeromc$ersetze(cir, eigenschaft); } // authlib 1–4 (Minecraft 1.14 … 1.20.1) @Inject(method = "getTextures(Lcom/mojang/authlib/GameProfile;Z)Ljava/util/Map;", at = @At("RETURN"), cancellable = true, remap = false, require = 0) private void aeromc$alt(GameProfile profil, boolean sicher, CallbackInfoReturnable cir) { aeromc$ersetze(cir, profil); } private static void aeromc$ersetze(CallbackInfoReturnable cir, Object argument) { try { Object alt = cir.getReturnValue(); Object neu = Umhaenge.mitUmhang(alt, argument); if (neu != alt) cir.setReturnValue(neu); } catch (Throwable ignoriert) { // im Zweifel bleibt alles wie ohne Mod } } }