mirror of
https://github.com/xfl03/MCCustomSkinLoader.git
synced 2026-11-14 04:59:48 +00:00
Added custom useragent
Faster mod loading Backup broken json Added a new skin site
This commit is contained in:
1 parent
4e78285bbe
commit
7654dc583d
9 files changed
+57
-20
No files matched your search
@@ -28,16 +28,17 @@ import customskinloader.utils.MinecraftUtil;
|
||||
/**
|
||||
* Custom skin loader mod for Minecraft.
|
||||
* @author (C) Jeremy Lam [JLChnToZ] 2013 & Alexander Xia [xfl03] 2014-2016
|
||||
* @version 13.10 (2016.6.25)
|
||||
* @version 13.11 (2016.7.3)
|
||||
*/
|
||||
public class CustomSkinLoader {
|
||||
public static final String CustomSkinLoader_VERSION="13.10";
|
||||
public static final String CustomSkinLoader_VERSION="13.11";
|
||||
public static final File DATA_DIR=new File(MinecraftUtil.getMinecraftDataDir0(),"CustomSkinLoader"),
|
||||
LOG_FILE=new File(DATA_DIR,"CustomSkinLoader.log"),
|
||||
CONFIG_FILE=new File(DATA_DIR,"CustomSkinLoader.json");
|
||||
public static final SkinSiteProfile[] DEFAULT_LOAD_LIST={
|
||||
new SkinSiteProfile("Mojang","MojangAPI"),
|
||||
new SkinSiteProfile("BlessingSkin","CustomSkinAPI","https://skin.prinzeugen.net/csl/"),
|
||||
new SkinSiteProfile("OneSkin","CustomSkinAPI","http://fleey.org/skin/skin_user/skin_json.php/"),
|
||||
//Minecrack could not load skin correctly
|
||||
//new SkinSiteProfile("Minecrack","Legacy","http://minecrack.fr.nf/mc/skinsminecrackd/{USERNAME}.png","http://minecrack.fr.nf/mc/cloaksminecrackd/{USERNAME}.png"),
|
||||
new SkinSiteProfile("SkinMe","UniSkinAPI","http://www.skinme.cc/uniskin/"),
|
||||
@@ -168,6 +169,10 @@ public class CustomSkinLoader {
|
||||
return config;
|
||||
}catch (Exception e) {
|
||||
logger.info("Failed to load config, use default instead.("+e.getMessage()+")");
|
||||
File brokenFile=new File(DATA_DIR,"BROKEN-CustomSkinLoader.json");
|
||||
if(brokenFile.exists())
|
||||
brokenFile.delete();
|
||||
CONFIG_FILE.renameTo(brokenFile);
|
||||
return initConfig();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,7 @@ public class SkinSiteProfile {
|
||||
public String skin;
|
||||
public String cape;
|
||||
public String model;
|
||||
public String userAgent;
|
||||
|
||||
//For MojangAPI
|
||||
public SkinSiteProfile(String name,String type){
|
||||
|
||||
@@ -19,7 +19,7 @@ public class CustomSkinAPILoader implements IProfileLoader {
|
||||
CustomSkinLoader.logger.info("Root not denined.");
|
||||
return null;
|
||||
}
|
||||
String json=HttpUtil0.readHttp(ssp.root+username+".json");
|
||||
String json=HttpUtil0.readHttp(ssp.root+username+".json",ssp.userAgent);
|
||||
if(json==null||json.equals("")){
|
||||
CustomSkinLoader.logger.info("Profile not found.");
|
||||
return null;
|
||||
|
||||
@@ -11,14 +11,14 @@ public class LegacyLoader implements IProfileLoader {
|
||||
public UserProfile loadProfile(SkinSiteProfile ssp, String username) throws Exception {
|
||||
UserProfile profile=new UserProfile();
|
||||
if(ssp.skin!=null && !ssp.skin.equals("")){
|
||||
String skin=HttpUtil0.getRealUrl(ssp.skin.replaceAll(USERNAME_REGEX, username));
|
||||
String skin=HttpUtil0.getRealUrl(ssp.skin.replaceAll(USERNAME_REGEX, username),ssp.userAgent);
|
||||
if(skin!=null&&!skin.equals("")){
|
||||
profile.skinUrl=skin;
|
||||
profile.model=(ssp.model==null?"default":ssp.model);
|
||||
}
|
||||
}
|
||||
if(ssp.cape!=null && !ssp.cape.equals("")){
|
||||
String cape=HttpUtil0.getRealUrl(ssp.cape.replaceAll(USERNAME_REGEX, username));
|
||||
String cape=HttpUtil0.getRealUrl(ssp.cape.replaceAll(USERNAME_REGEX, username),ssp.userAgent);
|
||||
if(cape!=null&&!cape.equals("")){
|
||||
profile.capeUrl=cape;
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ public class MojangAPILoader implements IProfileLoader {
|
||||
@Override
|
||||
public UserProfile loadProfile(SkinSiteProfile ssp, String username) throws Exception {
|
||||
//Get UUID Begin (http://wiki.vg/Mojang_API#Username_-.3E_UUID_at_time)
|
||||
String json0=HttpUtil0.readHttp("https://api.mojang.com/users/profiles/minecraft/"+username);
|
||||
String json0=HttpUtil0.readHttp("https://api.mojang.com/users/profiles/minecraft/"+username,ssp.userAgent);
|
||||
if(json0==null||json0.equals("")){
|
||||
CustomSkinLoader.logger.info("Profile not found.("+username+"'s UUID not found.)");
|
||||
return null;
|
||||
@@ -34,7 +34,7 @@ public class MojangAPILoader implements IProfileLoader {
|
||||
}
|
||||
//Get UUID End
|
||||
//Get Profile Begin (http://wiki.vg/Mojang_API#UUID_-.3E_Profile_.2B_Skin.2FCape)
|
||||
String json1=HttpUtil0.readHttp("https://sessionserver.mojang.com/session/minecraft/profile/"+uuidProfile.id);
|
||||
String json1=HttpUtil0.readHttp("https://sessionserver.mojang.com/session/minecraft/profile/"+uuidProfile.id,ssp.userAgent);
|
||||
if(json1==null||json1.equals("")){
|
||||
CustomSkinLoader.logger.info("Profile not found.("+username+"'s Profile is empty.)");
|
||||
return null;
|
||||
|
||||
@@ -19,7 +19,7 @@ public class UniSkinAPILoader implements IProfileLoader {
|
||||
CustomSkinLoader.logger.info("Root not denined.");
|
||||
return null;
|
||||
}
|
||||
String json=HttpUtil0.readHttp(ssp.root+username+".json");
|
||||
String json=HttpUtil0.readHttp(ssp.root+username+".json",ssp.userAgent);
|
||||
if(json==null||json.equals("")){
|
||||
CustomSkinLoader.logger.info("Profile not found.");
|
||||
return null;
|
||||
|
||||
@@ -1,7 +1,12 @@
|
||||
package customskinloader.tweaker;
|
||||
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URL;
|
||||
import java.net.URLClassLoader;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipFile;
|
||||
|
||||
@@ -12,6 +17,7 @@ import net.minecraft.launchwrapper.IClassTransformer;
|
||||
public class ClassTransformer implements IClassTransformer {
|
||||
|
||||
private ZipFile zipFile = null;
|
||||
private ArrayList<String> classes=new ArrayList<String>();
|
||||
|
||||
public ClassTransformer() {
|
||||
ForgeTweaker.logger.info("ClassTransformer Begin");
|
||||
@@ -26,7 +32,19 @@ public class ClassTransformer implements IClassTransformer {
|
||||
continue;
|
||||
}
|
||||
zipFile = tempZipFile;
|
||||
Enumeration<ZipEntry> entries=(Enumeration<ZipEntry>) zipFile.entries();
|
||||
StringBuilder sb=new StringBuilder();
|
||||
while(entries.hasMoreElements()){
|
||||
ZipEntry entry=entries.nextElement();
|
||||
String name=entry.getName();
|
||||
if(name.endsWith(".class")&&!name.contains("/")){
|
||||
classes.add(name);
|
||||
sb.append(" ");
|
||||
sb.append(name);
|
||||
}
|
||||
}
|
||||
ForgeTweaker.logger.info("Jar File URL: " + url);
|
||||
ForgeTweaker.logger.info("Classes:" + sb.toString());
|
||||
break;
|
||||
}
|
||||
} catch (Exception e) {
|
||||
@@ -53,7 +71,10 @@ public class ClassTransformer implements IClassTransformer {
|
||||
public byte[] transform(String name, String transformedName, byte bytes[]) {
|
||||
if (zipFile == null)
|
||||
return bytes;
|
||||
|
||||
String fullName = name + ".class";
|
||||
if(!classes.contains(fullName))
|
||||
return bytes;
|
||||
ZipEntry ze = zipFile.getEntry(fullName);
|
||||
if (ze == null)
|
||||
return bytes;
|
||||
@@ -67,8 +88,6 @@ public class ClassTransformer implements IClassTransformer {
|
||||
}
|
||||
|
||||
private byte[] getClass(ZipEntry ze) {
|
||||
if (ze == null)
|
||||
return null;
|
||||
try {
|
||||
InputStream is = zipFile.getInputStream(ze);
|
||||
byte[] bytes = IOUtils.toByteArray(is);
|
||||
|
||||
@@ -14,11 +14,13 @@ import customskinloader.CustomSkinLoader;
|
||||
public class HttpUtil0 {
|
||||
/**
|
||||
* Read all text from http.
|
||||
* @since 13.11
|
||||
*/
|
||||
public static String readHttp(String url){
|
||||
public static String readHttp(String url,String userAgent){
|
||||
HttpURLConnection c=null;
|
||||
try {
|
||||
CustomSkinLoader.logger.info("Try to read '"+url+"'");
|
||||
HttpURLConnection c=createConnection(url);
|
||||
CustomSkinLoader.logger.info("Try to read '"+url+"' with user agent '"+userAgent+"'.");
|
||||
c=createConnection(url,userAgent);
|
||||
int res = c.getResponseCode()/100;
|
||||
if (res==4||res==5||c.getResponseCode()==HttpURLConnection.HTTP_NO_CONTENT) {
|
||||
CustomSkinLoader.logger.info("Failed to read (Response Code: "+c.getResponseCode()+")");
|
||||
@@ -30,6 +32,9 @@ public class HttpUtil0 {
|
||||
} catch (Exception e) {
|
||||
CustomSkinLoader.logger.info("Failed to read (Exception: "+e.getMessage()+")");
|
||||
return null;
|
||||
} finally {
|
||||
if(c!=null)
|
||||
c.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,11 +43,13 @@ public class HttpUtil0 {
|
||||
* Using this method, can also check if it is exist.
|
||||
* @param url - before redirect
|
||||
* @return url - after redirect (null for not exist)
|
||||
* @since 13.11
|
||||
*/
|
||||
public static String getRealUrl(String url){
|
||||
public static String getRealUrl(String url,String userAgent){
|
||||
HttpURLConnection c=null;
|
||||
try {
|
||||
CustomSkinLoader.logger.info("Try to get real url of '"+url+"'.");
|
||||
HttpURLConnection c=createConnection(url);
|
||||
CustomSkinLoader.logger.info("Try to get real url of '"+url+"' with user agent '"+userAgent+"'.");
|
||||
c=createConnection(url,userAgent);
|
||||
int res = c.getResponseCode()/100;
|
||||
if (res==4||res==5) {
|
||||
CustomSkinLoader.logger.info("Failed to get real url (Response Code: "+c.getResponseCode()+")");
|
||||
@@ -56,13 +63,17 @@ public class HttpUtil0 {
|
||||
} catch (Exception e) {
|
||||
CustomSkinLoader.logger.info("Failed to get real url (Exception: "+e.getMessage()+")");
|
||||
return null;
|
||||
} finally{
|
||||
if(c!=null)
|
||||
c.disconnect();
|
||||
}
|
||||
}
|
||||
|
||||
private static HttpURLConnection createConnection(String url) throws MalformedURLException, IOException{
|
||||
private static HttpURLConnection createConnection(String url,String userAgent) throws MalformedURLException, IOException{
|
||||
HttpURLConnection c = (HttpURLConnection) (new URL(url)).openConnection();
|
||||
c.setReadTimeout(1000 * 10);
|
||||
c.setConnectTimeout(1000 * 10);
|
||||
if(userAgent!=null)
|
||||
c.setRequestProperty("User-Agent",userAgent);
|
||||
c.setUseCaches(false);
|
||||
c.setInstanceFollowRedirects(true);
|
||||
c.connect();
|
||||
|
||||
@@ -24,6 +24,7 @@ Fixed skull load bug.
|
||||
##Default Load List
|
||||
- [Mojang](http://www.minecraft.net/) (Mojang API)
|
||||
- [Blessing Skin](https://skin.prinzeugen.net/) (CustomSkinAPI)
|
||||
- [OneSkin] (http://fleey.org/skin/) (CustomSkinAPI)
|
||||
- SkinMe (UniSkinAPI)
|
||||
- [McSkin](https://www.mcskin.cc/) (CustomSkinAPI)
|
||||
If you want to apply to add other skin website to default list, please go to [issue](https://github.com/JLChnToZ/MCCustomSkinLoader/issues).
|
||||
|
||||
Reference in new issue
Block a user