Skip to content

Commit 2356520

Browse files
committed
Fix a new issue, refactor a function
Fix skin not being set after first load Rename ISwitchableArmsModel check to comply with @unique name scheming Signed-off-by: roadhog360 <[email protected]>
1 parent 4df9bbb commit 2356520

File tree

7 files changed

+49
-23
lines changed

7 files changed

+49
-23
lines changed

src/main/java/roadhog360/simpleskinbackport/client/ImageBufferDownloadPlayerSkin.java

+23
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,26 @@
11
package roadhog360.simpleskinbackport.client;
22

3+
import com.mojang.authlib.minecraft.MinecraftProfileTexture;
34
import net.minecraft.client.renderer.ImageBufferDownload;
5+
import net.minecraft.client.resources.SkinManager;
6+
import roadhog360.simpleskinbackport.core.Utils;
7+
import roadhog360.simpleskinbackport.ducks.INewModelData;
48

59
import java.awt.*;
610
import java.awt.image.BufferedImage;
711
import java.awt.image.DataBufferInt;
812

913
public class ImageBufferDownloadPlayerSkin extends ImageBufferDownload {
14+
15+
private final MinecraftProfileTexture texture;
16+
private final SkinManager.SkinAvailableCallback callback;
17+
18+
public ImageBufferDownloadPlayerSkin(MinecraftProfileTexture texture, SkinManager.SkinAvailableCallback callback) {
19+
super();
20+
this.texture = texture;
21+
this.callback = callback;
22+
}
23+
1024
@Override
1125
public BufferedImage parseUserSkin(BufferedImage buffImg) {
1226
if (buffImg == null)
@@ -45,4 +59,13 @@ public BufferedImage parseUserSkin(BufferedImage buffImg) {
4559
setAreaTransparent(48, 48, 64, 64);
4660
return buffImg2;
4761
}
62+
63+
//This is temporary; Once I figure out how to inject where this is called in SkinManager.class I'll do that instead.
64+
@Override
65+
public void func_152634_a() {
66+
super.func_152634_a();
67+
if(callback instanceof INewModelData data) {
68+
Utils.setSlimFromMetadata(texture, data);
69+
}
70+
}
4871
}

src/main/java/roadhog360/simpleskinbackport/core/ClientEventHandler.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public void onRenderEntity(RenderLivingEvent.Pre event) {
3434
private void checkAndSetArmsState(Entity entity, Render render) {
3535
if(render instanceof RenderPlayer renderPlayer && renderPlayer.modelBipedMain instanceof ISwitchableArmsModel model
3636
&& entity instanceof INewModelData player) {
37-
model.setArmState(player.simpleSkinBackport$isSlim());
37+
model.simpleSkinBackport$setSlim(player.simpleSkinBackport$isSlim());
3838
}
3939
}
4040

src/main/java/roadhog360/simpleskinbackport/core/Utils.java

+13
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,17 @@
44
import com.google.gson.Gson;
55
import com.google.gson.JsonObject;
66
import com.mojang.authlib.GameProfile;
7+
import com.mojang.authlib.minecraft.MinecraftProfileTexture;
78
import com.mojang.authlib.properties.Property;
9+
import net.minecraft.client.resources.SkinManager;
10+
import net.minecraft.entity.player.EntityPlayer;
811
import net.minecraft.util.ResourceLocation;
12+
import roadhog360.simpleskinbackport.ducks.INewModelData;
913

1014
import java.nio.charset.StandardCharsets;
1115
import java.util.Base64;
1216
import java.util.Map;
17+
import java.util.Objects;
1318
import java.util.UUID;
1419

1520
public class Utils {
@@ -78,6 +83,14 @@ public static Boolean getSlimFromGameProfile(GameProfile profile) {
7883
return null;
7984
}
8085

86+
public static void setSlimFromMetadata(MinecraftProfileTexture texture, INewModelData data) {
87+
data.simpleSkinBackport$setSlim(Objects.equals(texture.getMetadata("model"), "slim"));
88+
}
89+
90+
public static boolean isPlayer(MinecraftProfileTexture.Type type, SkinManager.SkinAvailableCallback callback) {
91+
return type == MinecraftProfileTexture.Type.SKIN && callback instanceof EntityPlayer;
92+
}
93+
8194
public static String getCallerClassName() {
8295
StackTraceElement[] stElements = Thread.currentThread().getStackTrace();
8396
String callerClassName = null;
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package roadhog360.simpleskinbackport.ducks;
22

33
public interface ISwitchableArmsModel {
4-
void setArmState(boolean slim);
4+
void simpleSkinBackport$setSlim(boolean slim);
55
}

src/main/java/roadhog360/simpleskinbackport/mixins/early/MixinEntityPlayer.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
public class MixinEntityPlayer implements INewModelData {
1010

1111
@Unique
12-
private boolean simpleSkinBackport$slim;
12+
private boolean simpleSkinBackport$slim = false;
1313

1414
@Override
1515
public boolean simpleSkinBackport$isSlim() {

src/main/java/roadhog360/simpleskinbackport/mixins/early/MixinModelBiped.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ private void injectNewLimbs(float size, float p_i1149_2_, int texWidth, int texH
148148
}
149149

150150
@Override
151-
public void setArmState(boolean slim) {
151+
public void simpleSkinBackport$setSlim(boolean slim) {
152152
if(simpleSkinBackport$isPlayerModel) {
153153
if (slim) {
154154
bipedLeftArm = simpleSkinBackport$bipedLeftArmSlim;

src/main/java/roadhog360/simpleskinbackport/mixins/early/MixinSkinManager.java

+9-19
Original file line numberDiff line numberDiff line change
@@ -6,55 +6,45 @@
66
import com.mojang.authlib.minecraft.MinecraftProfileTexture;
77
import net.minecraft.client.renderer.ImageBufferDownload;
88
import net.minecraft.client.resources.SkinManager;
9-
import net.minecraft.entity.player.EntityPlayer;
109
import net.minecraft.util.ResourceLocation;
1110
import org.spongepowered.asm.mixin.Mixin;
12-
import org.spongepowered.asm.mixin.Unique;
1311
import org.spongepowered.asm.mixin.injection.At;
1412
import org.spongepowered.asm.mixin.injection.Inject;
1513
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
1614
import roadhog360.simpleskinbackport.SimpleSkinBackport;
1715
import roadhog360.simpleskinbackport.client.ImageBufferDownloadPlayerSkin;
16+
import roadhog360.simpleskinbackport.core.Utils;
1817
import roadhog360.simpleskinbackport.ducks.INewModelData;
1918

20-
import java.util.Objects;
21-
2219
@Mixin(value = SkinManager.class, priority = 1100)
2320
public class MixinSkinManager {
2421
@WrapOperation(method = "func_152789_a", at = @At(value = "NEW", target = "(Ljava/lang/String;)Lnet/minecraft/util/ResourceLocation;"))
2522
private ResourceLocation changeDownloadLocation(String p_i1293_1_, Operation<ResourceLocation> original,
2623
@Local(argsOnly = true) final MinecraftProfileTexture.Type p_152789_2_,
2724
@Local(argsOnly = true) final SkinManager.SkinAvailableCallback p_152789_3_
2825
) {
29-
if(simpleSkinBackport$isNewPlayerWithPlayerData(p_152789_2_, p_152789_3_)) {
26+
if(Utils.isPlayer(p_152789_2_, p_152789_3_)) {
3027
return new ResourceLocation(SimpleSkinBackport.MODID, p_i1293_1_);
3128
}
3229
return original.call(p_i1293_1_);
3330
}
3431

3532
@WrapOperation(method = "func_152789_a", at = @At(value = "NEW", target = "()Lnet/minecraft/client/renderer/ImageBufferDownload;"))
3633
private ImageBufferDownload changeDownloadBufferManager(Operation<ImageBufferDownload> original,
37-
@Local(argsOnly = true) final MinecraftProfileTexture.Type p_152789_2_,
34+
@Local(argsOnly = true) MinecraftProfileTexture p_152789_1_,
35+
@Local(argsOnly = true) MinecraftProfileTexture.Type p_152789_2_,
3836
@Local(argsOnly = true) SkinManager.SkinAvailableCallback p_152789_3_) {
39-
if(simpleSkinBackport$isNewPlayerWithPlayerData(p_152789_2_, p_152789_3_)) {
40-
return new ImageBufferDownloadPlayerSkin();
37+
if(Utils.isPlayer(p_152789_2_, p_152789_3_)) {
38+
return new ImageBufferDownloadPlayerSkin(p_152789_1_, p_152789_3_);
4139
}
4240
return original.call();
4341
}
4442

4543
@Inject(method = "func_152789_a",
46-
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",
47-
shift = At.Shift.AFTER))
44+
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"))
4845
private void injectCallbackSkinCheck(MinecraftProfileTexture p_152789_1_, MinecraftProfileTexture.Type p_152789_2_, SkinManager.SkinAvailableCallback p_152789_3_, CallbackInfoReturnable<ResourceLocation> cir) {
49-
if(simpleSkinBackport$isNewPlayerWithPlayerData(p_152789_2_, p_152789_3_) && p_152789_3_ instanceof INewModelData playerData) {
50-
if(Objects.equals(p_152789_1_.getMetadata("model"), "slim")) {
51-
playerData.simpleSkinBackport$setSlim(true);
52-
}
46+
if(Utils.isPlayer(p_152789_2_, p_152789_3_) && p_152789_3_ instanceof INewModelData playerData) {
47+
Utils.setSlimFromMetadata(p_152789_1_, playerData);
5348
}
5449
}
55-
56-
@Unique
57-
private boolean simpleSkinBackport$isNewPlayerWithPlayerData(final MinecraftProfileTexture.Type type, SkinManager.SkinAvailableCallback callback) {
58-
return type == MinecraftProfileTexture.Type.SKIN && callback instanceof EntityPlayer;
59-
}
6050
}

0 commit comments

Comments
 (0)