/** * Copyright (c) Lambda Innovation, 2013-2016 * This file is part of the AcademyCraft mod. * https://github.com/LambdaInnovation/AcademyCraft * Licensed under GPLv3, see project root for more information. */ package cn.academy.misc.tutorial; import cn.academy.core.Resources; import cn.lambdalib.annoreg.core.Registrant; import cn.lambdalib.util.generic.RegistryUtils; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.util.ResourceLocation; import org.apache.commons.io.IOUtils; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @Registrant public class ACTutorial { public enum Tag { CRAFT, SMELT, VIEW; public final ResourceLocation icon = Resources.getTexture( "guis/icons/icon_" + this.name().toLowerCase()); } public static final boolean SHOW_ALL = false; public final String id; private Condition condition = Conditions.alwaysTrue(); private boolean defaultInstalled = true; private List<ViewGroup> previewHandlers = new ArrayList<>(); public ACTutorial(String id) { this.id=id; } public ACTutorial addCondition(Condition condition) { defaultInstalled = false; if(this.condition == Conditions.alwaysTrue()) { this.condition = condition; } else { this.condition = this.condition.or(condition); } return this; } public ACTutorial addPreview(ViewGroup...handlers) { previewHandlers.addAll(Arrays.asList(handlers)); return this; } public List<ViewGroup> getPreview() { return previewHandlers; } @SideOnly(Side.CLIENT) public String getContent() { final String unknown = "![title]\nUNKNOWN \n![brief]\n![content]\n "; try { String lang = Minecraft.getMinecraft().gameSettings.language; InputStream stream = RegistryUtils.getResourceStream(location(lang)); if (stream == null) { // Make en_US the default fallback stream = RegistryUtils.getResourceStream(location("en_US")); } if (stream == null) { return unknown; } else { return IOUtils.toString(new InputStreamReader(stream, Charset.forName("UTF-8").newDecoder())); } } catch (NullPointerException|IOException e) { return unknown; } } /** * Note that this method currently requires IO and is inefficient. Don't call it too often. */ @SideOnly(Side.CLIENT) public String getTitle() { String raw = getContent(); int i1 = raw.indexOf("![title]"), i2 = raw.indexOf("![brief]"); return raw.substring(i1+8, i2).trim(); } private ResourceLocation location(String lang) { return new ResourceLocation("academy:tutorials/" + lang + "/" + id + ".md"); } public boolean isActivated(EntityPlayer player) { if (SHOW_ALL) return true; return this.condition.test(player); } public boolean isDefaultInstalled() { return defaultInstalled; } }