49 lines
2.1 KiB
Java
49 lines
2.1 KiB
Java
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<Object> 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<Object> cir) {
|
||
aeromc$ersetze(cir, profil);
|
||
}
|
||
|
||
private static void aeromc$ersetze(CallbackInfoReturnable<Object> 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
|
||
}
|
||
}
|
||
}
|