Create MixinYggdrasilUserApiService to remove restrictions

This mixin modifies the YggdrasilUserApiService to remove chat and multiplayer restrictions by injecting custom user properties. It ensures that all instances of the service return permissive properties regardless of how they are created.
This commit is contained in:
Sw3ys
2026-06-30 12:53:52 +01:00
committed by GitHub
parent 20d24ab375
commit b9c00e334b
@@ -0,0 +1,51 @@
package com.aizistral.nochatrestrictions.mixins;
import java.util.Map;
import java.util.concurrent.Executor;
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;
import com.google.common.collect.ImmutableSet;
import com.mojang.authlib.minecraft.TelemetrySession;
import com.mojang.authlib.minecraft.UserApiService.UserFlag;
import com.mojang.authlib.minecraft.UserApiService.UserProperties;
import com.mojang.authlib.yggdrasil.YggdrasilUserApiService;
/**
* Applies the chat/multiplayer restriction removal directly on the concrete
* service class instead of wrapping it once at {@code Minecraft.createUserApiService}.
*
* In-game account switchers (e.g. IAS) build a brand new {@link YggdrasilUserApiService}
* and swap it onto the Minecraft instance without going through the original wrapping
* path, which is why restrictions used to come back after switching accounts. By hooking
* the service class itself, every instance the game ever uses returns permissive
* properties, regardless of who created it or when.
*/
@Mixin(value = YggdrasilUserApiService.class, remap = false)
public class MixinYggdrasilUserApiService {
private static final UserProperties FORCED_PROPERTIES;
static {
ImmutableSet.Builder<UserFlag> flags = ImmutableSet.builder();
flags.add(UserFlag.CHAT_ALLOWED); // always let the player access chat
flags.add(UserFlag.SERVERS_ALLOWED); // always let the player open multiplayer menu
flags.add(UserFlag.REALMS_ALLOWED); // always let the player open Realms menu
FORCED_PROPERTIES = new UserProperties(flags.build(), Map.of());
}
@Inject(method = "fetchProperties", at = @At("RETURN"), cancellable = true)
private void onFetchProperties(CallbackInfoReturnable<UserProperties> info) {
info.setReturnValue(FORCED_PROPERTIES);
}
@Inject(method = "newTelemetrySession", at = @At("HEAD"), cancellable = true)
private void onNewTelemetrySession(Executor executor, CallbackInfoReturnable<TelemetrySession> info) {
info.setReturnValue(TelemetrySession.DISABLED);
}
}