|
1 | 1 | package com.github.nearata.optifinecapes; |
2 | 2 |
|
| 3 | +import java.io.IOException; |
| 4 | +import java.net.URL; |
3 | 5 | import java.util.ArrayList; |
4 | 6 | import java.util.List; |
| 7 | +import java.util.Map; |
5 | 8 |
|
6 | | -import org.apache.logging.log4j.LogManager; |
7 | | -import org.apache.logging.log4j.Logger; |
| 9 | +import com.mojang.authlib.minecraft.MinecraftProfileTexture.Type; |
8 | 10 |
|
9 | 11 | import net.minecraft.client.Minecraft; |
10 | 12 | import net.minecraft.client.entity.player.AbstractClientPlayerEntity; |
| 13 | +import net.minecraft.client.renderer.texture.DynamicTexture; |
| 14 | +import net.minecraft.client.renderer.texture.NativeImage; |
| 15 | +import net.minecraft.util.ResourceLocation; |
| 16 | +import net.minecraft.util.Util; |
11 | 17 | import net.minecraftforge.client.event.RenderPlayerEvent; |
12 | 18 | import net.minecraftforge.common.MinecraftForge; |
13 | | -import net.minecraftforge.event.TickEvent; |
| 19 | +import net.minecraftforge.event.TickEvent.ClientTickEvent; |
14 | 20 | import net.minecraftforge.eventbus.api.SubscribeEvent; |
15 | 21 | import net.minecraftforge.fml.common.Mod; |
16 | 22 |
|
17 | 23 | @Mod("optifinecapes") |
18 | | -public class OptifineCapes |
| 24 | +public final class OptifineCapes |
19 | 25 | { |
20 | | - public static final Logger logger = LogManager.getLogger(); |
21 | 26 | private final Minecraft mc = Minecraft.getInstance(); |
22 | | - private static List<String> players = new ArrayList<String>(); |
| 27 | + private List<String> players = new ArrayList<>(); |
23 | 28 |
|
24 | 29 | public OptifineCapes() |
25 | 30 | { |
26 | 31 | MinecraftForge.EVENT_BUS.register(this); |
27 | 32 | } |
28 | 33 |
|
29 | 34 | @SubscribeEvent |
30 | | - public final void renderPlayer(RenderPlayerEvent.Pre event) |
| 35 | + public void renderPlayer(RenderPlayerEvent.Pre event) |
31 | 36 | { |
32 | 37 | final AbstractClientPlayerEntity acp = (AbstractClientPlayerEntity) event.getPlayer(); |
33 | | - final String username = acp.getDisplayName().getString(); |
| 38 | + final String username = acp.getName().getString(); |
34 | 39 |
|
35 | | - if (acp.hasPlayerInfo() && acp.getLocationCape() == null && !players.contains(username)) |
| 40 | + if (acp.isCapeLoaded() && acp.getCloakTextureLocation() == null && !players.contains(username)) |
36 | 41 | { |
37 | | - players.add(username); |
38 | | - CapeManager.loadCape(acp); |
| 42 | + this.players.add(username); |
| 43 | + Map<Type, ResourceLocation> textureLocations = acp.getPlayerInfo().textureLocations; |
| 44 | + |
| 45 | + Util.backgroundExecutor().execute(() -> { |
| 46 | + try |
| 47 | + { |
| 48 | + final URL url = new URL(String.format("http://s.optifine.net/capes/%s.png", username)); |
| 49 | + final NativeImage nativeImage = NativeImage.read(url.openStream()); |
| 50 | + final DynamicTexture dynamictexture = new DynamicTexture(this.parseCape(nativeImage)); |
| 51 | + final ResourceLocation resourcelocation = mc.getTextureManager().register("optifinecapes/", dynamictexture); |
| 52 | + |
| 53 | + textureLocations.put(Type.CAPE, resourcelocation); |
| 54 | + textureLocations.put(Type.ELYTRA, resourcelocation); |
| 55 | + } |
| 56 | + catch (IOException e) |
| 57 | + { |
| 58 | + // no cape |
| 59 | + } |
| 60 | + }); |
39 | 61 | } |
40 | 62 | } |
41 | | - |
| 63 | + |
42 | 64 | @SubscribeEvent |
43 | | - public final void clientTick(TickEvent.ClientTickEvent event) |
| 65 | + public void clientTick(ClientTickEvent event) |
44 | 66 | { |
45 | | - if (mc.world == null && !players.isEmpty()) |
| 67 | + if (mc.player == null && !this.players.isEmpty()) |
46 | 68 | { |
47 | | - players.clear(); |
| 69 | + this.players.clear(); |
48 | 70 | } |
49 | 71 | } |
| 72 | + |
| 73 | + private NativeImage parseCape(NativeImage nativeImageIn) |
| 74 | + { |
| 75 | + int imageWidth = 64; |
| 76 | + int imageHeight = 32; |
| 77 | + int imageSrcWidth = nativeImageIn.getWidth(); |
| 78 | + int imageSrcHeight = nativeImageIn.getHeight(); |
| 79 | + |
| 80 | + while (imageWidth < imageSrcWidth || imageHeight < imageSrcHeight) |
| 81 | + { |
| 82 | + imageWidth *= 2; |
| 83 | + imageHeight *= 2; |
| 84 | + } |
| 85 | + |
| 86 | + NativeImage nativeImage = new NativeImage(imageWidth, imageHeight, true); |
| 87 | + |
| 88 | + for (int x = 0; x < imageSrcWidth; x++) |
| 89 | + { |
| 90 | + for (int y = 0; y < imageSrcHeight; y++) |
| 91 | + { |
| 92 | + nativeImage.setPixelRGBA(x, y, nativeImageIn.getPixelRGBA(x, y)); |
| 93 | + } |
| 94 | + } |
| 95 | + |
| 96 | + nativeImageIn.close(); |
| 97 | + |
| 98 | + return nativeImage; |
| 99 | + } |
50 | 100 | } |
0 commit comments