Upload via GUI (138 Dateien)
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package de.aeromc.capes.mixin;
|
||||
|
||||
import com.mojang.authlib.GameProfile;
|
||||
import com.mojang.authlib.minecraft.MinecraftSessionService;
|
||||
import de.aeromc.capes.mod.Umhaenge;
|
||||
import net.minecraft.class_1071;
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Zweiter Weg für alte Fabric Loader (vor 0.12): Die lassen Mixins nur in
|
||||
* Minecraft selbst zu, nicht in authlib – SessionServiceMixin greift dort also
|
||||
* nie. Deshalb wird hier der Aufruf von getTextures im Skin-Lader von Minecraft
|
||||
* (PlayerSkinProvider = class_1071, Intermediary-Name, gleich in 1.14 … 1.20.1)
|
||||
* umgeleitet. Bei neuen Loadern erledigt das bereits SessionServiceMixin, dann
|
||||
* reicht diese Umleitung das Ergebnis nur unverändert durch.
|
||||
*/
|
||||
@Mixin(value = class_1071.class, targets = "net.minecraft.class_1071$1", remap = false)
|
||||
public abstract class SkinLaderMixin {
|
||||
|
||||
@Redirect(method = "*", at = @At(value = "INVOKE", remap = false,
|
||||
target = "Lcom/mojang/authlib/minecraft/MinecraftSessionService;getTextures(Lcom/mojang/authlib/GameProfile;Z)Ljava/util/Map;"),
|
||||
remap = false, require = 0)
|
||||
private Map aeromc$texturen(MinecraftSessionService dienst, GameProfile profil, boolean sicher) {
|
||||
Map texturen = dienst.getTextures(profil, sicher);
|
||||
if (Umhaenge.authlibGreift) return texturen;
|
||||
Umhaenge.meldeAktiv("Skin-Lader");
|
||||
try {
|
||||
Object neu = Umhaenge.mitUmhang(texturen, profil);
|
||||
return neu instanceof Map ? (Map) neu : texturen;
|
||||
} catch (Throwable ignoriert) {
|
||||
return texturen;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
package de.aeromc.capes.mod;
|
||||
|
||||
import de.aeromc.capes.Nachschlagen;
|
||||
|
||||
/**
|
||||
* AeroMC Umhänge – Fabric/Quilt-Mod für Spieler, die NICHT den AeroMC Launcher
|
||||
* nutzen. Er macht dasselbe wie der Umhang-Agent des Launchers: In Mojangs
|
||||
* authlib wird der AeroMC-Umhang eines Spielers eingesetzt, sobald Minecraft
|
||||
* dessen Skin lädt. Da nur authlib angepasst wird (nicht Minecraft selbst),
|
||||
* passt ein und derselbe Mod zu jeder Minecraft-Version, die Fabric kennt.
|
||||
* Alte Fabric Loader (vor 0.12) erlauben keine Mixins in authlib, dort greift
|
||||
* stattdessen SkinLaderMixin im Skin-Lader von Minecraft.
|
||||
*/
|
||||
public final class Umhaenge {
|
||||
private static final Nachschlagen DIENST = new Nachschlagen(Nachschlagen.STANDARD_BASIS);
|
||||
|
||||
/** true, sobald SessionServiceMixin in authlib eingebaut wurde (dann ist SkinLaderMixin überflüssig). */
|
||||
public static volatile boolean authlibGreift;
|
||||
private static volatile boolean gemeldet;
|
||||
|
||||
private Umhaenge() {}
|
||||
|
||||
/** Schreibt einmalig ins Spielprotokoll, dass (und über welchen Weg) der Mod greift. */
|
||||
public static void meldeAktiv(String weg) {
|
||||
if (gemeldet || agentAktiv()) return;
|
||||
gemeldet = true;
|
||||
System.out.println("[AeroMC] Umhang-Mod aktiv (" + weg + ")");
|
||||
}
|
||||
|
||||
/** Läuft das Spiel über den AeroMC Launcher, setzt schon dessen Agent die Umhänge ein. */
|
||||
public static boolean agentAktiv() {
|
||||
return System.getProperties().containsKey("aeromc.capes.hook");
|
||||
}
|
||||
|
||||
public static Object mitUmhang(Object ergebnis, Object argument) {
|
||||
if (agentAktiv()) return ergebnis;
|
||||
return DIENST.apply(ergebnis, argument);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user