package universalteam.universalcore.version;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.event.FMLInterModComms;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.ChatStyle;
import net.minecraft.util.EnumChatFormatting;
import universalteam.universalcore.libs.ReferenceCore;
import universalteam.universalcore.libs.environment.EnvironmentChecks;
import java.util.List;
public class UCVersionChecker
{
public static List<UCVersion> modVersions = Lists.newArrayList();
public static List<NewVersionInstance> newVersionInstances = Lists.newArrayList();
protected static boolean ownCheck = false;
protected static boolean checked = false;
protected static boolean reported = false;
public static void registerModVersion(UCVersion version)
{
modVersions.add(version);
}
public static void execute()
{
if (Loader.isModLoaded("VersionChecker"))
notifyVersionCheckerkMod();
else
ownCheck();
}
protected static void notifyVersionCheckerkMod()
{
for (UCVersion version : modVersions)
{
if (check(version) && version.isRead)
FMLInterModComms.sendRuntimeMessage(ReferenceCore.MODID, "VersionChecker", "addupdate", version.toNBT());
}
}
protected static void ownCheck()
{
ownCheck = true;
for (UCVersion version : modVersions)
{
if (!check(version))
continue;
List<String> changelog = Lists.newArrayList(Splitter.on('\n').split(version.changelog));
newVersionInstances.add(new NewVersionInstance(version.modName, version.newVersion, changelog));
}
checked = true;
}
protected static boolean check(UCVersion version)
{
version.fromJson();
return version.isRead && isNewVersion(version.currentVersion, version.newVersion);
}
protected static boolean isNewVersion(String oldVersion, String newVersion)
{
if (!EnvironmentChecks.isObfuscated())
return false;
String[] oldVersionTokens = oldVersion.trim().split("\\.");
String[] newVersionTokens = newVersion.trim().split("\\.");
for (int i = 0; i < oldVersionTokens.length; ++i)
{
int ver = Integer.valueOf(oldVersionTokens[i]);
int tar = Integer.valueOf(newVersionTokens[i]);
if (ver < tar)
return true;
else if (ver > tar)
return false;
}
return false;
}
@SubscribeEvent
public void onClientTick(TickEvent.ClientTickEvent event)
{
if (!checked || !ownCheck || event.phase != TickEvent.Phase.END || Minecraft.getMinecraft().thePlayer == null || reported)
return;
EntityPlayer player = Minecraft.getMinecraft().thePlayer;
int count = 0;
for (NewVersionInstance version : newVersionInstances)
{
count++;
player.addChatComponentMessage(new ChatComponentTranslation("universalcore.version.outdated", version.name, version.newVersion).setChatStyle(new ChatStyle().setColor(EnumChatFormatting.GOLD)));
for (String line : version.changelog)
player.addChatComponentMessage(new ChatComponentText("-" + line.replaceAll("\\t", "")));
if (count != newVersionInstances.size())
player.addChatComponentMessage(new ChatComponentText("")); // add empty line to split different mods
}
reported = true;
}
public static class NewVersionInstance
{
public String name;
public String newVersion;
public List<String> changelog;
public NewVersionInstance(String name, String newVersion, List<String> changelog)
{
this.name = name;
this.newVersion = newVersion;
this.changelog = changelog;
}
}
}