Skip to content

Commit

Permalink
Fix a new issue, refactor a function
Browse files Browse the repository at this point in the history
Fix skin not being set after first load
Rename ISwitchableArmsModel check to comply with @unique name scheming

Signed-off-by: roadhog360 <[email protected]>
  • Loading branch information
Roadhog360 committed Sep 3, 2024
1 parent 4df9bbb commit 2356520
Show file tree
Hide file tree
Showing 7 changed files with 49 additions and 23 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,26 @@
package roadhog360.simpleskinbackport.client;

import com.mojang.authlib.minecraft.MinecraftProfileTexture;
import net.minecraft.client.renderer.ImageBufferDownload;
import net.minecraft.client.resources.SkinManager;
import roadhog360.simpleskinbackport.core.Utils;
import roadhog360.simpleskinbackport.ducks.INewModelData;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;

public class ImageBufferDownloadPlayerSkin extends ImageBufferDownload {

private final MinecraftProfileTexture texture;
private final SkinManager.SkinAvailableCallback callback;

public ImageBufferDownloadPlayerSkin(MinecraftProfileTexture texture, SkinManager.SkinAvailableCallback callback) {
super();
this.texture = texture;
this.callback = callback;
}

@Override
public BufferedImage parseUserSkin(BufferedImage buffImg) {
if (buffImg == null)
Expand Down Expand Up @@ -45,4 +59,13 @@ public BufferedImage parseUserSkin(BufferedImage buffImg) {
setAreaTransparent(48, 48, 64, 64);
return buffImg2;
}

//This is temporary; Once I figure out how to inject where this is called in SkinManager.class I'll do that instead.
@Override
public void func_152634_a() {
super.func_152634_a();
if(callback instanceof INewModelData data) {
Utils.setSlimFromMetadata(texture, data);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public void onRenderEntity(RenderLivingEvent.Pre event) {
private void checkAndSetArmsState(Entity entity, Render render) {
if(render instanceof RenderPlayer renderPlayer && renderPlayer.modelBipedMain instanceof ISwitchableArmsModel model
&& entity instanceof INewModelData player) {
model.setArmState(player.simpleSkinBackport$isSlim());
model.simpleSkinBackport$setSlim(player.simpleSkinBackport$isSlim());
}
}

Expand Down
13 changes: 13 additions & 0 deletions src/main/java/roadhog360/simpleskinbackport/core/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,17 @@
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.minecraft.MinecraftProfileTexture;
import com.mojang.authlib.properties.Property;
import net.minecraft.client.resources.SkinManager;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ResourceLocation;
import roadhog360.simpleskinbackport.ducks.INewModelData;

import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;

public class Utils {
Expand Down Expand Up @@ -78,6 +83,14 @@ public static Boolean getSlimFromGameProfile(GameProfile profile) {
return null;
}

public static void setSlimFromMetadata(MinecraftProfileTexture texture, INewModelData data) {
data.simpleSkinBackport$setSlim(Objects.equals(texture.getMetadata("model"), "slim"));
}

public static boolean isPlayer(MinecraftProfileTexture.Type type, SkinManager.SkinAvailableCallback callback) {
return type == MinecraftProfileTexture.Type.SKIN && callback instanceof EntityPlayer;
}

public static String getCallerClassName() {
StackTraceElement[] stElements = Thread.currentThread().getStackTrace();
String callerClassName = null;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package roadhog360.simpleskinbackport.ducks;

public interface ISwitchableArmsModel {
void setArmState(boolean slim);
void simpleSkinBackport$setSlim(boolean slim);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
public class MixinEntityPlayer implements INewModelData {

@Unique
private boolean simpleSkinBackport$slim;
private boolean simpleSkinBackport$slim = false;

@Override
public boolean simpleSkinBackport$isSlim() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ private void injectNewLimbs(float size, float p_i1149_2_, int texWidth, int texH
}

@Override
public void setArmState(boolean slim) {
public void simpleSkinBackport$setSlim(boolean slim) {
if(simpleSkinBackport$isPlayerModel) {
if (slim) {
bipedLeftArm = simpleSkinBackport$bipedLeftArmSlim;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,55 +6,45 @@
import com.mojang.authlib.minecraft.MinecraftProfileTexture;
import net.minecraft.client.renderer.ImageBufferDownload;
import net.minecraft.client.resources.SkinManager;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ResourceLocation;
import org.spongepowered.asm.mixin.Mixin;
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.callback.CallbackInfoReturnable;
import roadhog360.simpleskinbackport.SimpleSkinBackport;
import roadhog360.simpleskinbackport.client.ImageBufferDownloadPlayerSkin;
import roadhog360.simpleskinbackport.core.Utils;
import roadhog360.simpleskinbackport.ducks.INewModelData;

import java.util.Objects;

@Mixin(value = SkinManager.class, priority = 1100)
public class MixinSkinManager {
@WrapOperation(method = "func_152789_a", at = @At(value = "NEW", target = "(Ljava/lang/String;)Lnet/minecraft/util/ResourceLocation;"))
private ResourceLocation changeDownloadLocation(String p_i1293_1_, Operation<ResourceLocation> original,
@Local(argsOnly = true) final MinecraftProfileTexture.Type p_152789_2_,
@Local(argsOnly = true) final SkinManager.SkinAvailableCallback p_152789_3_
) {
if(simpleSkinBackport$isNewPlayerWithPlayerData(p_152789_2_, p_152789_3_)) {
if(Utils.isPlayer(p_152789_2_, p_152789_3_)) {
return new ResourceLocation(SimpleSkinBackport.MODID, p_i1293_1_);
}
return original.call(p_i1293_1_);
}

@WrapOperation(method = "func_152789_a", at = @At(value = "NEW", target = "()Lnet/minecraft/client/renderer/ImageBufferDownload;"))
private ImageBufferDownload changeDownloadBufferManager(Operation<ImageBufferDownload> original,
@Local(argsOnly = true) final MinecraftProfileTexture.Type p_152789_2_,
@Local(argsOnly = true) MinecraftProfileTexture p_152789_1_,
@Local(argsOnly = true) MinecraftProfileTexture.Type p_152789_2_,
@Local(argsOnly = true) SkinManager.SkinAvailableCallback p_152789_3_) {
if(simpleSkinBackport$isNewPlayerWithPlayerData(p_152789_2_, p_152789_3_)) {
return new ImageBufferDownloadPlayerSkin();
if(Utils.isPlayer(p_152789_2_, p_152789_3_)) {
return new ImageBufferDownloadPlayerSkin(p_152789_1_, p_152789_3_);
}
return original.call();
}

@Inject(method = "func_152789_a",
at = @At(value = "INVOKE", target = "Lnet/minecraft/client/resources/SkinManager$SkinAvailableCallback;func_152121_a(Lcom/mojang/authlib/minecraft/MinecraftProfileTexture$Type;Lnet/minecraft/util/ResourceLocation;)V",
shift = At.Shift.AFTER))
at = @At(value = "TAIL", target = "Lnet/minecraft/client/resources/SkinManager$SkinAvailableCallback;func_152121_a(Lcom/mojang/authlib/minecraft/MinecraftProfileTexture$Type;Lnet/minecraft/util/ResourceLocation;)V"))
private void injectCallbackSkinCheck(MinecraftProfileTexture p_152789_1_, MinecraftProfileTexture.Type p_152789_2_, SkinManager.SkinAvailableCallback p_152789_3_, CallbackInfoReturnable<ResourceLocation> cir) {
if(simpleSkinBackport$isNewPlayerWithPlayerData(p_152789_2_, p_152789_3_) && p_152789_3_ instanceof INewModelData playerData) {
if(Objects.equals(p_152789_1_.getMetadata("model"), "slim")) {
playerData.simpleSkinBackport$setSlim(true);
}
if(Utils.isPlayer(p_152789_2_, p_152789_3_) && p_152789_3_ instanceof INewModelData playerData) {
Utils.setSlimFromMetadata(p_152789_1_, playerData);
}
}

@Unique
private boolean simpleSkinBackport$isNewPlayerWithPlayerData(final MinecraftProfileTexture.Type type, SkinManager.SkinAvailableCallback callback) {
return type == MinecraftProfileTexture.Type.SKIN && callback instanceof EntityPlayer;
}
}

0 comments on commit 2356520

Please sign in to comment.