Skip to content
This repository was archived by the owner on Jan 3, 2020. It is now read-only.

Commit 2f1c692

Browse files
committed
1.9 init
1 parent 07659f2 commit 2f1c692

18 files changed

Lines changed: 1515 additions & 472 deletions

README.md

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,23 @@
11
### Universal Skin Mod
22
This is a mod for Minecraft, allowing players to select any "SkinServer" they like.
33

4-
Current version is v1.3-dev3 for Minecraft 1.8
4+
Current version is v1.4-alpha2 for Minecraft 1.9
55

66
### Features
77

88
- Unlimited number of custom URLs
9-
- HD skins supported via Optifine
10-
- Transparent pixels allowed (v1.2-dev2)
11-
- Skull support (v1.2-dev4)
12-
- UniSkinAPI support (v1.3-dev1)
13-
- SkinMe added as pre-configured server (Can be removed from cfg)
14-
- *Legacy style link NO LONGER supported* (1.3-dev2)
9+
- HD skins supported via Optifine (Unconfirmed)
10+
- Transparent pixels allowed
11+
- Skull support
12+
- UniSkinAPI support
13+
- Legacy style link supported again, skin and cape only
14+
- Dynamic skin, cape and elytra
15+
- Genuine and local skin loading
1516

1617
### Configure
1718

18-
- The config file is located in `config/UniSkinMod.cfg`
19-
- Comment lines start with `#`
20-
- Line starts with `Root: ` indicates a "Root" URL
21-
- All servers will be queried in that order.
22-
- Server in front has higher priority
23-
- Official server has the lowest priority
24-
- For more info about the "Root" URL, visit [UniSkinAPI Document](https://github.com/RecursiveG/UniSkinServer/blob/master/doc/UniSkinAPI_zh-CN.md) please!
25-
- **No more legacy style link support!**
19+
- The config file is located in `config/UniSkinMod/UniSkinMod.json`
20+
- For more info about the "Root" URL, visit [UniSkinAPI Document](https://github.com/RecursiveG/UniSkinServer/blob/master/doc/UniSkinAPI_en.md) please!
2621

2722
### License
2823
Licensed under GPLv2

build.gradle

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,32 @@
11
buildscript {
22
repositories {
3-
mavenCentral()
3+
jcenter()
44
maven {
55
name = "forge"
66
url = "http://files.minecraftforge.net/maven"
77
}
8-
maven {
9-
name = "sonatype"
10-
url = "https://oss.sonatype.org/content/repositories/snapshots/"
11-
}
128
}
139
dependencies {
14-
classpath 'net.minecraftforge.gradle:ForgeGradle:1.2-SNAPSHOT'
10+
classpath 'net.minecraftforge.gradle:ForgeGradle:2.1-SNAPSHOT'
1511
}
1612
}
13+
apply plugin: 'net.minecraftforge.gradle.forge'
1714

18-
apply plugin: 'forge'
19-
20-
version = "1.3-dev3"
21-
group= "org.devinprogress.uniskinmod"
22-
archivesBaseName = "UniSkinMod-1.8"
15+
version = "1.4-alpha2"
16+
group = "org.devinprogress.uniskinmod"
17+
archivesBaseName = "UniSkinMod-1.9"
2318

2419
minecraft {
25-
version = "1.8-11.14.1.1397"
26-
runDir = "eclipse"
27-
mappings = "stable_16"
20+
version = "1.9-12.16.0.1770-1.9"
21+
runDir = "run"
22+
mappings = "snapshot_20160312"
23+
// makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable.
2824
}
2925

3026
jar {
3127
manifest {
32-
attributes 'FMLCorePlugin': 'org.devinprogress.uniskinmod.Loader'
28+
attributes 'FMLCorePlugin': 'org.devinprogress.uniskinmod.coremod.UniSkinAsmLoader'
29+
attributes 'FMLCorePluginContainsFMLMod': true
3330
}
3431
}
3532

src/main/java/org/devinprogress/uniskinmod/AsmTransformer.java

Lines changed: 0 additions & 65 deletions
This file was deleted.

src/main/java/org/devinprogress/uniskinmod/BaseAsmTransformer.java

Lines changed: 0 additions & 107 deletions
This file was deleted.
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package org.devinprogress.uniskinmod;
2+
3+
import com.google.common.cache.CacheBuilder;
4+
import com.google.common.cache.CacheLoader;
5+
import com.google.common.cache.LoadingCache;
6+
import com.mojang.authlib.minecraft.MinecraftProfileTexture;
7+
import net.minecraft.client.Minecraft;
8+
import net.minecraft.client.resources.SkinManager;
9+
import net.minecraft.util.ResourceLocation;
10+
11+
import java.io.File;
12+
import java.util.ArrayList;
13+
import java.util.HashMap;
14+
import java.util.List;
15+
import java.util.concurrent.TimeUnit;
16+
17+
public class DynamicSkinManager {
18+
private final List<String> rootURIs;
19+
private final File localSkinDir;
20+
21+
public class CachedDynamicSkin {
22+
ResourceLocation[] skin = null;
23+
ResourceLocation[] cape = null;
24+
ResourceLocation[] elytra = null;
25+
String[] skinURL = null;
26+
String[] capeURL = null;
27+
String[] elytraURL = null;
28+
String model = null;
29+
int skinInterval, capeInterval, elytraInterval;
30+
31+
public boolean complete() {
32+
return skin != null && cape != null && elytra != null;
33+
}
34+
}
35+
36+
public DynamicSkinManager(List<String> r, File localSkin) {
37+
rootURIs = r;
38+
localSkinDir = localSkin;
39+
}
40+
41+
public final LoadingCache<String, CachedDynamicSkin> cache = CacheBuilder.newBuilder()
42+
.expireAfterWrite(60, TimeUnit.SECONDS).build(new CacheLoader<String, CachedDynamicSkin>() {
43+
44+
@Override
45+
public CachedDynamicSkin load(String playerName) throws Exception {
46+
CachedDynamicSkin cache = new CachedDynamicSkin();
47+
UniSkinProfile.DynamicTexture tmp;
48+
49+
List<String> roots = new ArrayList<String>();
50+
roots.add("#local#");
51+
roots.addAll(rootURIs);
52+
// load piracy dynamic skins.
53+
for (String root : roots) {
54+
if (cache.complete()) break;
55+
UniSkinProfile api = null;
56+
if (root.equals("#local#")) {
57+
File[] fileList = localSkinDir.listFiles();
58+
if (fileList == null) continue;
59+
for (File f : fileList) {
60+
if (f.getName().equalsIgnoreCase(playerName + ".json")) {
61+
api = UniSkinProfile.getLocalProfile(f, new File(localSkinDir, "textures"));
62+
break;
63+
}
64+
}
65+
} else {
66+
api = UniSkinProfile.getProfile(playerName, root);
67+
}
68+
if (api == null) continue;
69+
70+
tmp = api.getDynamicSkin();
71+
if (cache.skin == null && tmp != null) {
72+
cache.model = tmp.skinModel;
73+
cache.skinInterval = tmp.playTime;
74+
ResourceLocation[] arr = new ResourceLocation[tmp.textures.length];
75+
for (int i = 0; i < arr.length; i++) {
76+
arr[i] = new ResourceLocation("skins/" + tmp.textures[i]);
77+
}
78+
cache.skin = arr;
79+
cache.skinURL = tmp.url;
80+
}
81+
82+
tmp = api.getDynamicCape();
83+
if (cache.cape == null && tmp != null) {
84+
cache.capeInterval = tmp.playTime;
85+
ResourceLocation[] arr = new ResourceLocation[tmp.textures.length];
86+
for (int i = 0; i < arr.length; i++) {
87+
arr[i] = new ResourceLocation("skins/" + tmp.textures[i]);
88+
}
89+
cache.cape = arr;
90+
cache.capeURL = tmp.url;
91+
}
92+
93+
tmp = api.getDynamicElytra();
94+
if (cache.elytra == null && tmp != null) {
95+
cache.elytraInterval = tmp.playTime;
96+
ResourceLocation[] arr = new ResourceLocation[tmp.textures.length];
97+
for (int i = 0; i < arr.length; i++) {
98+
arr[i] = new ResourceLocation("skins/" + tmp.textures[i]);
99+
}
100+
cache.elytra = arr;
101+
cache.elytraURL = tmp.url;
102+
}
103+
}
104+
forceLoadTextures(cache);
105+
return cache;
106+
}
107+
});
108+
109+
private void forceLoadTextures(CachedDynamicSkin cache) {
110+
SkinManager skinManager = Minecraft.getMinecraft().getSkinManager();
111+
if (cache.skinURL != null) {
112+
boolean slimModel = cache.model.equalsIgnoreCase("slim");
113+
for (int i = 0; i < cache.skinURL.length; i++) {
114+
skinManager.loadSkin(new MinecraftProfileTexture(cache.skinURL[i], slimModel ?
115+
new HashMap<String, String>() {{
116+
put("model", "slim");
117+
}} : null), MinecraftProfileTexture.Type.SKIN);
118+
}
119+
}
120+
121+
if (cache.capeURL != null) {
122+
for (int i = 0; i < cache.capeURL.length; i++) {
123+
skinManager.loadSkin(new MinecraftProfileTexture(cache.capeURL[i], null), MinecraftProfileTexture.Type.CAPE);
124+
}
125+
}
126+
127+
if (cache.elytraURL != null) {
128+
for (int i = 0; i < cache.elytraURL.length; i++) {
129+
skinManager.loadSkin(new MinecraftProfileTexture(cache.elytraURL[i], null), MinecraftProfileTexture.Type.ELYTRA);
130+
}
131+
}
132+
}
133+
}

0 commit comments

Comments
 (0)