I'm working on making a client mod for Minecraft. Basically it just changes where the client looks for skins for other players - by default, it simply looked at minecraft.net for skins. My changes make it look on MY host first for a file, and in the event of that file not existing, then default to minecraft.net.
Here's an example of how it works with skins for cloaks:
public void updateCloak()
{
String s = username;
s = s.replace(' ', '_');
if(s.charAt(0) == 167){
s = s.substring(2,username.length());
}
testUrl = (new StringBuilder()).append("http://nawskins.s3.amazonaws.com/mcskins/").append(s.toLowerCase()).append("/cape.png").toString();
if(!exists(testUrl))
{
playerCloakUrl = (new StringBuilder()).append("http://nawskins.s3.amazonaws.com/mcskins/").append(s.toLowerCase()).append("/cape.png").toString();
} else
{
trieditc2 = 2;
playerCloakUrl = (new StringBuilder()).append("http://s3.amazonaws.com/MinecraftCloaks/").append(username).append(".png").toString();
}
cloakUrl = playerCloakUrl;
}
And the corresponding exists method:
public static boolean exists(String s)
{
try
{
HttpURLConnection.setFollowRedirects(false);
HttpURLConnection httpurlconnection = (HttpURLConnection)(new URL(s)).openConnection();
httpurlconnection.setRequestMethod("HEAD");
httpurlconnection.setConnectTimeout(3000);
return httpurlconnection.getResponseCode() == 404;
}
catch(Exception exception)
{
return false;
}
}
Works fine, no problems - it feeds the right URLs to the minecraft client, and the correct skin loads.
However, I have a problem - the try/catch stuff that the exists method is doing is lagging the fuck out of the client. If you enter a town of players, your client turns into a screenshot for about 10 seconds while it does all this stuff for each player in the area around you.
So, it would seem to me, the natural solution to this problem would be threading, which I only understand in the abstract sense that 'it lets me do things simultaneously'.
I basically want to have some way of doing the stuff that the exists method above does within a thread, and then somehow take that boolean value from the thread and feed it back to my updateCloak method.
I've been reading on threads, and I made a new class - CheckUrl - to try and implement Runnable, but Runnable doesn't return a value. I kind've know there's something called Future that lets me do that, but I have no idea how to do
any of that and tutorials that I've skimmed are so far over my head it's ridiculous.
I am
fucking retarded at java. It's a miracle that I've gotten as far as I have, so you need to explain things to me very slowly, as though you were a pop-up book.
Posts
Basically my question now boils down to, how do I get the value of urlExists out of there and back into my updateCloak function in a different class?
Why even use urlExists? Why not have run() return true or false?
If you want access to urlExists, don't you have to make it public or something?
edit: you could also just make a function that returns urlExists, but that seems redundant.
However, I may have just cracked this by using Callable instead of Runnable
if you make it a boolean instead of a void you can set it to return a boolean value
ie:
public boolean run()
edit: nevermind i is dum