From 5b06b71d04250301e4a778f182014ec6df3466f6 Mon Sep 17 00:00:00 2001 From: RainWarrior Date: Tue, 21 Apr 2015 04:42:59 +0300 Subject: [PATCH] Splash screen implementation --- .../net/minecraft/client/Minecraft.java.patch | 17 +- .../client/gui/FontRenderer.java.patch | 124 +++++ .../cpw/mods/fml/client/FMLClientHandler.java | 14 + .../cpw/mods/fml/client/SplashProgress.java | 478 ++++++++++++++++++ .../cpw/mods/fml/common/FMLCommonHandler.java | 4 + .../cpw/mods/fml/common/IFMLSidedHandler.java | 2 + .../cpw/mods/fml/common/ProgressManager.java | 91 ++++ .../cpw/mods/fml/server/FMLServerHandler.java | 6 + .../resources/assets/fml/splash.properties | 7 + .../assets/fml/textures/gui/forge.png | Bin 0 -> 3547 bytes fml/src/main/resources/fml_at.cfg | 15 +- 11 files changed, 755 insertions(+), 3 deletions(-) create mode 100644 fml/patches/minecraft/net/minecraft/client/gui/FontRenderer.java.patch create mode 100644 fml/src/main/java/cpw/mods/fml/client/SplashProgress.java create mode 100644 fml/src/main/java/cpw/mods/fml/common/ProgressManager.java create mode 100644 fml/src/main/resources/assets/fml/splash.properties create mode 100644 fml/src/main/resources/assets/fml/textures/gui/forge.png diff --git a/fml/patches/minecraft/net/minecraft/client/Minecraft.java.patch b/fml/patches/minecraft/net/minecraft/client/Minecraft.java.patch index 9ffa53c54..93cc41dac 100644 --- a/fml/patches/minecraft/net/minecraft/client/Minecraft.java.patch +++ b/fml/patches/minecraft/net/minecraft/client/Minecraft.java.patch @@ -46,7 +46,7 @@ } public void func_71367_a(String p_71367_1_, int p_71367_2_) -@@ -471,7 +478,7 @@ +@@ -471,11 +478,11 @@ this.field_110451_am = new SimpleReloadableResourceManager(this.field_110452_an); this.field_135017_as = new LanguageManager(this.field_110452_an, this.field_71474_y.field_74363_ab); this.field_110451_am.func_110542_a(this.field_135017_as); @@ -55,7 +55,12 @@ this.field_71446_o = new TextureManager(this.field_110451_am); this.field_110451_am.func_110542_a(this.field_71446_o); this.field_152350_aA = new SkinManager(this.field_71446_o, new File(this.field_110446_Y, "skins"), this.field_152355_az); -@@ -532,12 +539,13 @@ +- this.func_71357_I(); ++ cpw.mods.fml.client.SplashProgress.drawVanillaScreen(); + this.field_147127_av = new SoundHandler(this.field_110451_am, this.field_71474_y); + this.field_110451_am.func_110542_a(this.field_147127_av); + this.field_147126_aw = new MusicTicker(this); +@@ -532,19 +539,20 @@ this.field_71446_o.func_130088_a(TextureMap.field_110576_c, new TextureMap(1, "textures/items")); GL11.glViewport(0, 0, this.field_71443_c, this.field_71440_d); this.field_71452_i = new EffectRenderer(this.field_71441_e, this.field_71446_o); @@ -70,6 +75,14 @@ } else { + this.func_147108_a(new GuiMainMenu()); + } + +- this.field_71446_o.func_147645_c(this.field_152354_ay); ++ cpw.mods.fml.client.SplashProgress.clearVanillaResources(field_71446_o, field_152354_ay); + this.field_152354_ay = null; + this.field_71461_s = new LoadingScreenRenderer(this); + @@ -553,6 +561,7 @@ this.func_71352_k(); } diff --git a/fml/patches/minecraft/net/minecraft/client/gui/FontRenderer.java.patch b/fml/patches/minecraft/net/minecraft/client/gui/FontRenderer.java.patch new file mode 100644 index 000000000..4aa0d6f12 --- /dev/null +++ b/fml/patches/minecraft/net/minecraft/client/gui/FontRenderer.java.patch @@ -0,0 +1,124 @@ +--- ../src-base/minecraft/net/minecraft/client/gui/FontRenderer.java ++++ ../src-work/minecraft/net/minecraft/client/gui/FontRenderer.java +@@ -54,7 +54,7 @@ + this.field_111273_g = p_i1035_2_; + this.field_78298_i = p_i1035_3_; + this.field_78293_l = p_i1035_4_; +- p_i1035_3_.func_110577_a(this.field_111273_g); ++ bindTexture(this.field_111273_g); + + for (int i = 0; i < 32; ++i) + { +@@ -102,7 +102,7 @@ + + try + { +- bufferedimage = ImageIO.read(Minecraft.func_71410_x().func_110442_L().func_110536_a(this.field_111273_g).func_110527_b()); ++ bufferedimage = ImageIO.read(getResourceInputStream(this.field_111273_g)); + } + catch (IOException ioexception) + { +@@ -167,7 +167,7 @@ + { + try + { +- InputStream inputstream = Minecraft.func_71410_x().func_110442_L().func_110536_a(new ResourceLocation("font/glyph_sizes.bin")).func_110527_b(); ++ InputStream inputstream = getResourceInputStream(new ResourceLocation("font/glyph_sizes.bin")); + inputstream.read(this.field_78287_e); + } + catch (IOException ioexception) +@@ -186,7 +186,7 @@ + float f = (float)(p_78266_1_ % 16 * 8); + float f1 = (float)(p_78266_1_ / 16 * 8); + float f2 = p_78266_2_ ? 1.0F : 0.0F; +- this.field_78298_i.func_110577_a(this.field_111273_g); ++ bindTexture(this.field_111273_g); + float f3 = (float)this.field_78286_d[p_78266_1_] - 0.01F; + GL11.glBegin(GL11.GL_TRIANGLE_STRIP); + GL11.glTexCoord2f(f / 128.0F, f1 / 128.0F); +@@ -213,7 +213,7 @@ + + private void func_78257_a(int p_78257_1_) + { +- this.field_78298_i.func_110577_a(this.func_111271_a(p_78257_1_)); ++ bindTexture(this.func_111271_a(p_78257_1_)); + } + + protected float func_78277_a(char p_78277_1_, boolean p_78277_2_) +@@ -260,7 +260,7 @@ + + public int func_85187_a(String p_85187_1_, int p_85187_2_, int p_85187_3_, int p_85187_4_, boolean p_85187_5_) + { +- GL11.glEnable(GL11.GL_ALPHA_TEST); ++ enableAlpha(); + this.func_78265_b(); + int l; + +@@ -332,7 +332,7 @@ + + k = this.field_78285_g[j]; + this.field_78304_r = k; +- GL11.glColor4f((float)(k >> 16) / 255.0F, (float)(k >> 8 & 255) / 255.0F, (float)(k & 255) / 255.0F, this.field_78305_q); ++ setColor((float)(k >> 16) / 255.0F, (float)(k >> 8 & 255) / 255.0F, (float)(k & 255) / 255.0F, this.field_78305_q); + } + else if (j == 16) + { +@@ -361,7 +361,7 @@ + this.field_78299_w = false; + this.field_78300_v = false; + this.field_78301_u = false; +- GL11.glColor4f(this.field_78291_n, this.field_78292_o, this.field_78306_p, this.field_78305_q); ++ setColor(this.field_78291_n, this.field_78292_o, this.field_78306_p, this.field_78305_q); + } + + ++i; +@@ -420,6 +420,15 @@ + ++f; + } + ++ doDraw(f); ++ } ++ } ++ } ++ ++ protected void doDraw(float f) ++ { ++ { ++ { + Tessellator tessellator; + + if (this.field_78299_w) +@@ -492,7 +501,7 @@ + this.field_78292_o = (float)(p_78258_4_ >> 8 & 255) / 255.0F; + this.field_78306_p = (float)(p_78258_4_ & 255) / 255.0F; + this.field_78305_q = (float)(p_78258_4_ >> 24 & 255) / 255.0F; +- GL11.glColor4f(this.field_78291_n, this.field_78292_o, this.field_78306_p, this.field_78305_q); ++ setColor(this.field_78291_n, this.field_78292_o, this.field_78306_p, this.field_78305_q); + this.field_78295_j = (float)p_78258_2_; + this.field_78296_k = (float)p_78258_3_; + this.func_78255_a(p_78258_1_, p_78258_5_); +@@ -829,4 +838,24 @@ + { + return this.field_78294_m; + } ++ ++ protected void setColor(float r, float g, float b, float a) ++ { ++ GL11.glColor4f(r, g, b, a); ++ } ++ ++ protected void enableAlpha() ++ { ++ GL11.glEnable(GL11.GL_ALPHA_TEST); ++ } ++ ++ protected void bindTexture(ResourceLocation location) ++ { ++ field_78298_i.func_110577_a(location); ++ } ++ ++ protected InputStream getResourceInputStream(ResourceLocation location) throws IOException ++ { ++ return Minecraft.func_71410_x().func_110442_L().func_110536_a(location).func_110527_b(); ++ } + } diff --git a/fml/src/main/java/cpw/mods/fml/client/FMLClientHandler.java b/fml/src/main/java/cpw/mods/fml/client/FMLClientHandler.java index 13d887a8a..f849332f7 100644 --- a/fml/src/main/java/cpw/mods/fml/client/FMLClientHandler.java +++ b/fml/src/main/java/cpw/mods/fml/client/FMLClientHandler.java @@ -64,7 +64,9 @@ import net.minecraft.world.storage.SaveFormatOld; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.lwjgl.LWJGLUtil; import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.Display; import com.google.common.base.Strings; import com.google.common.base.Throwables; @@ -185,6 +187,7 @@ public class FMLClientHandler implements IFMLSidedHandler @SuppressWarnings("unchecked") public void beginMinecraftLoading(Minecraft minecraft, @SuppressWarnings("rawtypes") List resourcePackList, IReloadableResourceManager resourceManager) { + SplashProgress.start(); client = minecraft; this.resourcePackList = resourcePackList; this.resourceManager = resourceManager; @@ -335,6 +338,7 @@ public class FMLClientHandler implements IFMLSidedHandler } loading = false; client.gameSettings.loadOptions(); //Reload options to load any mod added keybindings. + SplashProgress.finish(); } @SuppressWarnings("unused") @@ -898,6 +902,7 @@ public class FMLClientHandler implements IFMLSidedHandler badTextureDomains.add(resourceLocation.getResourceDomain()); missingTextures.put(resourceLocation.getResourceDomain(),resourceLocation); } + public void trackBrokenTexture(ResourceLocation resourceLocation, String error) { badTextureDomains.add(resourceLocation.getResourceDomain()); @@ -981,4 +986,13 @@ public class FMLClientHandler implements IFMLSidedHandler logger.error(Strings.repeat("+=", 25)); } + @Override + public void processWindowMessages() + { + // workaround for windows requiring messages being processed on the main thread + if(LWJGLUtil.getPlatform() == LWJGLUtil.PLATFORM_WINDOWS) + { + Display.processMessages(); + } + } } diff --git a/fml/src/main/java/cpw/mods/fml/client/SplashProgress.java b/fml/src/main/java/cpw/mods/fml/client/SplashProgress.java new file mode 100644 index 000000000..5966c807f --- /dev/null +++ b/fml/src/main/java/cpw/mods/fml/client/SplashProgress.java @@ -0,0 +1,478 @@ +package cpw.mods.fml.client; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Iterator; +import java.util.Properties; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +import javax.imageio.ImageIO; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.renderer.texture.TextureUtil; +import net.minecraft.client.resources.FileResourcePack; +import net.minecraft.client.resources.FolderResourcePack; +import net.minecraft.client.resources.IResourcePack; +import net.minecraft.crash.CrashReport; +import net.minecraft.util.ResourceLocation; + +import org.apache.commons.io.IOUtils; +import org.lwjgl.LWJGLException; +import org.lwjgl.opengl.Display; +import org.lwjgl.opengl.Drawable; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.SharedDrawable; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.ICrashCallable; +import cpw.mods.fml.common.ProgressManager; +import cpw.mods.fml.common.ProgressManager.ProgressBar; +import cpw.mods.fml.common.asm.FMLSanityChecker; + +/** + * @deprecated not a stable API, will break, don't use this yet + */ +@Deprecated +public class SplashProgress +{ + private static Drawable d; + private static volatile boolean pause = false; + private static volatile boolean done = false; + private static Thread thread; + private static int angle = 0; + private static final Lock lock = new ReentrantLock(true); + private static SplashFontRenderer fontRenderer; + + private static final IResourcePack mcPack = Minecraft.getMinecraft().mcDefaultResourcePack; + private static final IResourcePack fmlPack = createFmlResourcePack(); + + private static int fontTexture; + private static ResourceLocation fontLocation = new ResourceLocation("textures/font/ascii.png"); + private static int logoTexture; + private static ResourceLocation logoLocation = new ResourceLocation("textures/gui/title/mojang.png"); + private static int forgeTexture; + private static ResourceLocation forgeLocation = new ResourceLocation("fml", "textures/gui/forge.png"); + + private static ResourceLocation configLocation = new ResourceLocation("fml", "splash.properties"); + private static final Properties config = loadConfig(); + + private static final boolean enabled = Boolean.parseBoolean(config.getProperty("enabled")); + private static final int backgroundColor = getInt("background"); + private static final int fontColor = getInt("font"); + private static final int barBorderColor = getInt("barBorder"); + private static final int barColor = getInt("bar"); + private static final int barBackgroundColor = getInt("barBackground"); + + public static void start() + { + if(!enabled) return; + // getting debug info out of the way, while we still can + FMLCommonHandler.instance().registerCrashCallable(new ICrashCallable() + { + public String call() throws Exception + { + return "' Vendor: '" + GL11.glGetString(GL11.GL_VENDOR) + + "' Version: '" + GL11.glGetString(GL11.GL_VERSION) + + "' Renderer: '" + GL11.glGetString(GL11.GL_RENDERER) + + "'"; + } + + public String getLabel() + { + return "GL info"; + } + }); + CrashReport report = CrashReport.makeCrashReport(new Throwable(), "Loading screen debug info"); + System.out.println(report.getCompleteReport()); + fontTexture = GL11.glGenTextures(); + loadTexture(mcPack, fontTexture, fontLocation); + logoTexture = GL11.glGenTextures(); + loadTexture(mcPack, logoTexture, logoLocation); + forgeTexture = GL11.glGenTextures(); + loadTexture(fmlPack, forgeTexture, forgeLocation); + + try + { + d = new SharedDrawable(Display.getDrawable()); + Display.getDrawable().releaseContext(); + d.makeCurrent(); + } + catch (LWJGLException e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + thread = new Thread(new Runnable() + { + private final int barWidth = 400; + private final int barHeight = 20; + private final int textHeight2 = 20; + private final int barOffset = 55; + + public void run() + { + setGL(); + while(!done) + { + ProgressBar first = null, penult = null, last = null; + Iterator i = ProgressManager.barIterator(); + while(i.hasNext()) + { + if(first == null) first = i.next(); + else + { + penult = last; + last = i.next(); + } + } + + GL11.glClear(GL11.GL_COLOR_BUFFER_BIT); + + // matrix setup + int w = Display.getWidth(); + int h = Display.getHeight(); + GL11.glViewport(0, 0, w, h); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(320 - w/2, 320 + w/2, 240 + h/2, 240 - h/2, -1, 1); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + + // mojang logo + setColor(backgroundColor); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, logoTexture); + GL11.glBegin(GL11.GL_QUADS); + GL11.glTexCoord2f(0, 0); + GL11.glVertex2f(320 - 256, 240 - 256); + GL11.glTexCoord2f(0, 1); + GL11.glVertex2f(320 - 256, 240 + 256); + GL11.glTexCoord2f(1, 1); + GL11.glVertex2f(320 + 256, 240 + 256); + GL11.glTexCoord2f(1, 0); + GL11.glVertex2f(320 + 256, 240 - 256); + GL11.glEnd(); + GL11.glDisable(GL11.GL_TEXTURE_2D); + + // bars + if(first != null) + { + GL11.glPushMatrix(); + GL11.glTranslatef(320 - (float)barWidth / 2, 310, 0); + drawBar(first); + if(penult != null) + { + GL11.glTranslatef(0, barOffset, 0); + drawBar(penult); + } + if(last != null) + { + GL11.glTranslatef(0, barOffset, 0); + drawBar(last); + } + GL11.glPopMatrix(); + } + + angle += 1; + + // forge logo + setColor(backgroundColor); + GL11.glTranslatef(680, 420, 0); + GL11.glRotatef(angle, 0, 0, 1); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, forgeTexture); + GL11.glBegin(GL11.GL_QUADS); + GL11.glTexCoord2f(0, 0); + GL11.glVertex2f(-50, -50); + GL11.glTexCoord2f(0, 1); + GL11.glVertex2f(-50, 50); + GL11.glTexCoord2f(1, 1); + GL11.glVertex2f(50, 50); + GL11.glTexCoord2f(1, 0); + GL11.glVertex2f(50, -50); + GL11.glEnd(); + GL11.glDisable(GL11.GL_TEXTURE_2D); + + Display.update(); + if(pause) + { + clearGL(); + setGL(); + } + try + { + Thread.sleep(10); + } + catch (InterruptedException e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + clearGL(); + } + + private void setColor(int color) + { + GL11.glColor3ub((byte)((color >> 16) & 0xFF), (byte)((color >> 8) & 0xFF), (byte)(color & 0xFF)); + } + + private void drawBox(int w, int h) + { + GL11.glBegin(GL11.GL_QUADS); + GL11.glVertex2f(0, 0); + GL11.glVertex2f(0, h); + GL11.glVertex2f(w, h); + GL11.glVertex2f(w, 0); + GL11.glEnd(); + } + + private void drawBar(ProgressBar b) + { + GL11.glPushMatrix(); + // title - message + setColor(fontColor); + GL11.glScalef(2, 2, 1); + GL11.glEnable(GL11.GL_TEXTURE_2D); + fontRenderer.drawString(b.getTitle() + " - " + b.getMessage(), 0, 0, 0x000000); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glPopMatrix(); + // border + GL11.glPushMatrix(); + GL11.glTranslatef(0, textHeight2, 0); + setColor(barBorderColor); + drawBox(barWidth, barHeight); + // interior + setColor(barBackgroundColor); + GL11.glTranslatef(1, 1, 0); + drawBox(barWidth - 2, barHeight - 2); + // slidy part + setColor(barColor); + drawBox((barWidth - 2) * b.getStep() / b.getSteps(), barHeight - 2); + // progress text + String progress = "" + b.getStep() + "/" + b.getSteps(); + GL11.glTranslatef(((float)barWidth - 2 - fontRenderer.getStringWidth(progress))/ 2, 2, 0); + setColor(fontColor); + GL11.glScalef(2, 2, 1); + GL11.glEnable(GL11.GL_TEXTURE_2D); + fontRenderer.drawString(progress, 0, 0, 0x000000); + GL11.glPopMatrix(); + } + + private void setGL() + { + lock.lock(); + try + { + Display.getDrawable().makeCurrent(); + } + catch (LWJGLException e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + GL11.glClearColor((float)((backgroundColor >> 16) & 0xFF) / 0xFF, (float)((backgroundColor >> 8) & 0xFF) / 0xFF, (float)(backgroundColor & 0xFF) / 0xFF, 1); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glEnable(GL11.GL_TEXTURE_2D); + if(fontRenderer == null) + { + fontRenderer = new SplashFontRenderer(); + } + GL11.glDisable(GL11.GL_TEXTURE_2D); + } + + private void clearGL() + { + Minecraft mc = Minecraft.getMinecraft(); + mc.displayWidth = Display.getWidth(); + mc.displayHeight = Display.getHeight(); + mc.resize(mc.displayWidth, mc.displayHeight); + GL11.glClearColor(1, 1, 1, 1); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glDepthFunc(GL11.GL_LEQUAL); + GL11.glEnable(GL11.GL_ALPHA_TEST); + GL11.glAlphaFunc(GL11.GL_GREATER, .1f); + try + { + Display.getDrawable().releaseContext(); + } + catch (LWJGLException e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + finally + { + lock.unlock(); + } + } + }); + thread.start(); + } + + /** + * Call before you need to explicitly modify GL context state during loading. + * Resource loading doesn't usually require this call. + * Call {@link #resume()} when you're done. + * @deprecated not a stable API, will break, don't use this yet + */ + @Deprecated + public static void pause() + { + if(!enabled) return; + pause = true; + lock.lock(); + try + { + d.releaseContext(); + Display.getDrawable().makeCurrent(); + } + catch (LWJGLException e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + /** + * @deprecated not a stable API, will break, don't use this yet + */ + @Deprecated + public static void resume() + { + if(!enabled) return; + pause = false; + try + { + Display.getDrawable().releaseContext(); + d.makeCurrent(); + } + catch (LWJGLException e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + lock.unlock(); + } + + public static void finish() + { + if(!enabled) return; + try + { + done = true; + thread.join(); + d.releaseContext(); + Display.getDrawable().makeCurrent(); + GL11.glDeleteTextures(fontTexture); + GL11.glDeleteTextures(logoTexture); + GL11.glDeleteTextures(forgeTexture); + } + catch (Exception e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + + private static IResourcePack createFmlResourcePack() + { + if(FMLSanityChecker.fmlLocation.isDirectory()) + { + return new FolderResourcePack(FMLSanityChecker.fmlLocation); + } + else + { + return new FileResourcePack(FMLSanityChecker.fmlLocation); + } + } + + private static Properties loadConfig() + { + InputStream s = null; + try + { + s = fmlPack.getInputStream(configLocation); + Properties config = new Properties(); + config.load(s); + return config; + } + catch(IOException e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + finally + { + IOUtils.closeQuietly(s); + } + } + + private static int getInt(String name) + { + return Integer.decode(config.getProperty(name)); + } + + private static void loadTexture(IResourcePack pack, int name, ResourceLocation location) + { + InputStream s = null; + try + { + s = pack.getInputStream(location); + TextureUtil.uploadTextureImageAllocate(name, ImageIO.read(pack.getInputStream(location)), false, false); + } + catch(IOException e) + { + e.printStackTrace(); + throw new RuntimeException(e); + } + finally + { + IOUtils.closeQuietly(s); + } + } + + private static class SplashFontRenderer extends FontRenderer + { + public SplashFontRenderer() + { + super(Minecraft.getMinecraft().gameSettings, fontLocation, null, false); + super.onResourceManagerReload(null); + } + + @Override + protected void bindTexture(ResourceLocation location) + { + if(location != locationFontTexture) throw new IllegalArgumentException(); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, fontTexture); + } + + @Override + protected InputStream getResourceInputStream(ResourceLocation location) throws IOException + { + return Minecraft.getMinecraft().mcDefaultResourcePack.getInputStream(location); + } + } + + public static void drawVanillaScreen() throws LWJGLException + { + if(!enabled) + { + Minecraft.getMinecraft().loadScreen(); + } + } + + public static void clearVanillaResources(TextureManager renderEngine, ResourceLocation mojangLogo) + { + if(!enabled) + { + renderEngine.deleteTexture(mojangLogo); + } + } +} diff --git a/fml/src/main/java/cpw/mods/fml/common/FMLCommonHandler.java b/fml/src/main/java/cpw/mods/fml/common/FMLCommonHandler.java index 9c5e065d3..6e2258ff9 100644 --- a/fml/src/main/java/cpw/mods/fml/common/FMLCommonHandler.java +++ b/fml/src/main/java/cpw/mods/fml/common/FMLCommonHandler.java @@ -595,6 +595,10 @@ public class FMLCommonHandler return sidedDelegate.shouldAllowPlayerLogins(); } + public void processWindowMessages() + { + sidedDelegate.processWindowMessages(); + } /** * Used to exit from java, with system exit preventions in place. Will be tidy about it and just log a message, diff --git a/fml/src/main/java/cpw/mods/fml/common/IFMLSidedHandler.java b/fml/src/main/java/cpw/mods/fml/common/IFMLSidedHandler.java index ec230f32b..abc08bc42 100644 --- a/fml/src/main/java/cpw/mods/fml/common/IFMLSidedHandler.java +++ b/fml/src/main/java/cpw/mods/fml/common/IFMLSidedHandler.java @@ -61,4 +61,6 @@ public interface IFMLSidedHandler boolean shouldAllowPlayerLogins(); void allowLogins(); + + void processWindowMessages(); } diff --git a/fml/src/main/java/cpw/mods/fml/common/ProgressManager.java b/fml/src/main/java/cpw/mods/fml/common/ProgressManager.java new file mode 100644 index 000000000..3dab5d89c --- /dev/null +++ b/fml/src/main/java/cpw/mods/fml/common/ProgressManager.java @@ -0,0 +1,91 @@ +package cpw.mods.fml.common; + +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * @deprecated not a stable API, will break, don't use this yet + */ +@Deprecated +public class ProgressManager +{ + private static final List bars = new CopyOnWriteArrayList(); + + /** + * @deprecated not a stable API, will break, don't use this yet + */ + @Deprecated + public static ProgressBar push(String title, int steps) + { + ProgressBar bar = new ProgressBar(title, steps); + bars.add(bar); + FMLCommonHandler.instance().processWindowMessages(); + return bar; + } + + /** + * @deprecated not a stable API, will break, don't use this yet + */ + @Deprecated + public static void pop(ProgressBar bar) + { + if(bar.getSteps() != bar.getStep()) throw new IllegalStateException("can't pop unfinished ProgressBar " + bar.getTitle()); + bars.remove(bar); + FMLCommonHandler.instance().processWindowMessages(); + } + + /* + * Internal use only. + */ + public static Iterator barIterator() + { + return bars.iterator(); + } + + /** + * @deprecated not a stable API, will break, don't use this yet + */ + @Deprecated + public static class ProgressBar + { + private final String title; + private final int steps; + private volatile int step = 0; + private volatile String message = ""; + + private ProgressBar(String title, int steps) + { + this.title = title; + this.steps = steps; + } + + public void step(String message) + { + if(step >= steps) throw new IllegalStateException("too much steps for ProgressBar " + title); + step++; + this.message = message; + FMLCommonHandler.instance().processWindowMessages(); + } + + public String getTitle() + { + return title; + } + + public int getSteps() + { + return steps; + } + + public int getStep() + { + return step; + } + + public String getMessage() + { + return message; + } + } +} diff --git a/fml/src/main/java/cpw/mods/fml/server/FMLServerHandler.java b/fml/src/main/java/cpw/mods/fml/server/FMLServerHandler.java index 91eb2c775..0a362de43 100644 --- a/fml/src/main/java/cpw/mods/fml/server/FMLServerHandler.java +++ b/fml/src/main/java/cpw/mods/fml/server/FMLServerHandler.java @@ -264,4 +264,10 @@ public class FMLServerHandler implements IFMLSidedHandler public void allowLogins() { DedicatedServer.allowPlayerLogins = true; } + + @Override + public void processWindowMessages() + { + // NOOP + } } diff --git a/fml/src/main/resources/assets/fml/splash.properties b/fml/src/main/resources/assets/fml/splash.properties new file mode 100644 index 000000000..84ec35672 --- /dev/null +++ b/fml/src/main/resources/assets/fml/splash.properties @@ -0,0 +1,7 @@ +enabled = true + +background = 0xFFFFFF +font = 0x000000 +barBorder = 0xC0C0C0 +bar = 0xCB3D35 +barBackground = 0xFFFFFF diff --git a/fml/src/main/resources/assets/fml/textures/gui/forge.png b/fml/src/main/resources/assets/fml/textures/gui/forge.png new file mode 100644 index 0000000000000000000000000000000000000000..1be137a39001f5194b0f91a018bfe8e63eca795e GIT binary patch literal 3547 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 literal 0 HcmV?d00001 diff --git a/fml/src/main/resources/fml_at.cfg b/fml/src/main/resources/fml_at.cfg index 3b2642b21..58fda4c55 100644 --- a/fml/src/main/resources/fml_at.cfg +++ b/fml/src/main/resources/fml_at.cfg @@ -74,6 +74,9 @@ public net.minecraft.client.gui.GuiScreen field_146297_k # minecraft instance - # Minecraft #public atv.D #FD:Minecraft/field_71425_J #running public net.minecraft.client.Minecraft field_71446_o # textureManager +public net.minecraft.client.Minecraft field_110450_ap # mcDefaultResourcePack +public net.minecraft.client.Minecraft func_71370_a(II)V # resize +public net.minecraft.client.Minecraft func_71357_I()V # loadScreen ## ItemBlock public net.minecraft.item.ItemBlock field_150939_a ## DedicatedServer @@ -102,4 +105,14 @@ public net.minecraft.client.gui.GuiSlot field_148153_b # top - needed for config public net.minecraft.client.gui.GuiSlot field_148154_c # bottom - needed for config GUI stuff public net.minecraft.client.gui.GuiSlot field_148155_a # width - needed for config GUI stuff public net.minecraft.client.gui.GuiSlot field_148158_l # height - needed for config GUI stuff -public net.minecraft.client.gui.GuiSlot field_148160_j # headerPadding - needed for config GUI stuff \ No newline at end of file +public net.minecraft.client.gui.GuiSlot field_148160_j # headerPadding - needed for config GUI stuff + +# Font renderer +protected net.minecraft.client.gui.FontRenderer field_78288_b # FONT_HEIGHT +protected net.minecraft.client.gui.FontRenderer field_78286_d # charWidth +protected net.minecraft.client.gui.FontRenderer field_78287_e # glyphWidth +protected net.minecraft.client.gui.FontRenderer field_111273_g # locationFontTexture +protected net.minecraft.client.gui.FontRenderer field_78295_j # posX +protected net.minecraft.client.gui.FontRenderer field_78296_k # posY +protected net.minecraft.client.gui.FontRenderer func_78266_a(IZ)F # renderDefaultChar +protected net.minecraft.client.gui.FontRenderer func_78277_a(CZ)F # renderUnicodeChar