Search in sources :

Example 6 with CrashReport

use of net.minecraft.crash.CrashReport in project MinecraftForge by MinecraftForge.

the class SplashProgress method start.

public static void start() {
    File configFile = new File(Minecraft.getMinecraft().mcDataDir, "config/splash.properties");
    File parent = configFile.getParentFile();
    if (!parent.exists())
        parent.mkdirs();
    FileReader r = null;
    config = new Properties();
    try {
        r = new FileReader(configFile);
        config.load(r);
    } catch (IOException e) {
        FMLLog.info("Could not load splash.properties, will create a default one");
    } finally {
        IOUtils.closeQuietly(r);
    }
    //Some system do not support this and have weird effects so we need to detect and disable by default.
    //The user can always force enable it if they want to take the responsibility for bugs.
    //For now macs derp so disable them.
    boolean defaultEnabled = !System.getProperty("os.name").toLowerCase().contains("mac");
    // Enable if we have the flag, and there's either no optifine, or optifine has added a key to the blackboard ("optifine.ForgeSplashCompatible")
    // Optifine authors - add this key to the blackboard if you feel your modifications are now compatible with this code.
    enabled = getBool("enabled", defaultEnabled) && ((!FMLClientHandler.instance().hasOptifine()) || Launch.blackboard.containsKey("optifine.ForgeSplashCompatible"));
    rotate = getBool("rotate", false);
    showMemory = getBool("showMemory", true);
    logoOffset = getInt("logoOffset", 0);
    backgroundColor = getHex("background", 0xFFFFFF);
    fontColor = getHex("font", 0x000000);
    barBorderColor = getHex("barBorder", 0xC0C0C0);
    barColor = getHex("bar", 0xCB3D35);
    barBackgroundColor = getHex("barBackground", 0xFFFFFF);
    memoryGoodColor = getHex("memoryGood", 0x78CB34);
    memoryWarnColor = getHex("memoryWarn", 0xE6E84A);
    memoryLowColor = getHex("memoryLow", 0xE42F2F);
    final ResourceLocation fontLoc = new ResourceLocation(getString("fontTexture", "textures/font/ascii.png"));
    final ResourceLocation logoLoc = new ResourceLocation(getString("logoTexture", "textures/gui/title/mojang.png"));
    final ResourceLocation forgeLoc = new ResourceLocation(getString("forgeTexture", "fml:textures/gui/forge.png"));
    final ResourceLocation forgeFallbackLoc = new ResourceLocation("fml:textures/gui/forge.png");
    File miscPackFile = new File(Minecraft.getMinecraft().mcDataDir, getString("resourcePackPath", "resources"));
    FileWriter w = null;
    try {
        w = new FileWriter(configFile);
        config.store(w, "Splash screen properties");
    } catch (IOException e) {
        FMLLog.log(Level.ERROR, e, "Could not save the splash.properties file");
    } finally {
        IOUtils.closeQuietly(w);
    }
    miscPack = createResourcePack(miscPackFile);
    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: '" + glGetString(GL_VENDOR) + "' Version: '" + glGetString(GL_VERSION) + "' Renderer: '" + glGetString(GL_RENDERER) + "'";
        }

        public String getLabel() {
            return "GL info";
        }
    });
    CrashReport report = CrashReport.makeCrashReport(new Throwable() {

        @Override
        public String getMessage() {
            return "This is just a prompt for computer specs to be printed. THIS IS NOT A ERROR";
        }

        @Override
        public void printStackTrace(final PrintWriter s) {
            s.println(getMessage());
        }

        @Override
        public void printStackTrace(final PrintStream s) {
            s.println(getMessage());
        }
    }, "Loading screen debug info");
    System.out.println(report.getCompleteReport());
    try {
        d = new SharedDrawable(Display.getDrawable());
        Display.getDrawable().releaseContext();
        d.makeCurrent();
    } catch (LWJGLException e) {
        e.printStackTrace();
        disableSplash(e);
    }
    //Call this ASAP if splash is enabled so that threading doesn't cause issues later
    getMaxTextureSize();
    //Thread mainThread = Thread.currentThread();
    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();
            fontTexture = new Texture(fontLoc, null);
            logoTexture = new Texture(logoLoc, null, false);
            forgeTexture = new Texture(forgeLoc, forgeFallbackLoc);
            glEnable(GL_TEXTURE_2D);
            fontRenderer = new SplashFontRenderer();
            glDisable(GL_TEXTURE_2D);
            while (!done) {
                ProgressBar first = null, penult = null, last = null;
                Iterator<ProgressBar> i = ProgressManager.barIterator();
                while (i.hasNext()) {
                    if (first == null)
                        first = i.next();
                    else {
                        penult = last;
                        last = i.next();
                    }
                }
                glClear(GL_COLOR_BUFFER_BIT);
                // matrix setup
                int w = Display.getWidth();
                int h = Display.getHeight();
                glViewport(0, 0, w, h);
                glMatrixMode(GL_PROJECTION);
                glLoadIdentity();
                glOrtho(320 - w / 2, 320 + w / 2, 240 + h / 2, 240 - h / 2, -1, 1);
                glMatrixMode(GL_MODELVIEW);
                glLoadIdentity();
                // mojang logo
                setColor(backgroundColor);
                glEnable(GL_TEXTURE_2D);
                logoTexture.bind();
                glBegin(GL_QUADS);
                logoTexture.texCoord(0, 0, 0);
                glVertex2f(320 - 256, 240 - 256);
                logoTexture.texCoord(0, 0, 1);
                glVertex2f(320 - 256, 240 + 256);
                logoTexture.texCoord(0, 1, 1);
                glVertex2f(320 + 256, 240 + 256);
                logoTexture.texCoord(0, 1, 0);
                glVertex2f(320 + 256, 240 - 256);
                glEnd();
                glDisable(GL_TEXTURE_2D);
                // memory usage
                if (showMemory) {
                    glPushMatrix();
                    glTranslatef(320 - (float) barWidth / 2, 20, 0);
                    drawMemoryBar();
                    glPopMatrix();
                }
                // bars
                if (first != null) {
                    glPushMatrix();
                    glTranslatef(320 - (float) barWidth / 2, 310, 0);
                    drawBar(first);
                    if (penult != null) {
                        glTranslatef(0, barOffset, 0);
                        drawBar(penult);
                    }
                    if (last != null) {
                        glTranslatef(0, barOffset, 0);
                        drawBar(last);
                    }
                    glPopMatrix();
                }
                angle += 1;
                // forge logo
                setColor(backgroundColor);
                float fw = (float) forgeTexture.getWidth() / 2;
                float fh = (float) forgeTexture.getHeight() / 2;
                if (rotate) {
                    float sh = Math.max(fw, fh);
                    glTranslatef(320 + w / 2 - sh - logoOffset, 240 + h / 2 - sh - logoOffset, 0);
                    glRotatef(angle, 0, 0, 1);
                } else {
                    glTranslatef(320 + w / 2 - fw - logoOffset, 240 + h / 2 - fh - logoOffset, 0);
                }
                int f = (angle / 5) % forgeTexture.getFrames();
                glEnable(GL_TEXTURE_2D);
                forgeTexture.bind();
                glBegin(GL_QUADS);
                forgeTexture.texCoord(f, 0, 0);
                glVertex2f(-fw, -fh);
                forgeTexture.texCoord(f, 0, 1);
                glVertex2f(-fw, fh);
                forgeTexture.texCoord(f, 1, 1);
                glVertex2f(fw, fh);
                forgeTexture.texCoord(f, 1, 0);
                glVertex2f(fw, -fh);
                glEnd();
                glDisable(GL_TEXTURE_2D);
                // We use mutex to indicate safely to the main thread that we're taking the display global lock
                // So the main thread can skip processing messages while we're updating.
                // There are system setups where this call can pause for a while, because the GL implementation
                // is trying to impose a framerate or other thing is occurring. Without the mutex, the main
                // thread would delay waiting for the same global display lock
                mutex.acquireUninterruptibly();
                Display.update();
                // As soon as we're done, we release the mutex. The other thread can now ping the processmessages
                // call as often as it wants until we get get back here again
                mutex.release();
                if (pause) {
                    clearGL();
                    setGL();
                }
                Display.sync(100);
            }
            clearGL();
        }

        private void setColor(int color) {
            glColor3ub((byte) ((color >> 16) & 0xFF), (byte) ((color >> 8) & 0xFF), (byte) (color & 0xFF));
        }

        private void drawBox(int w, int h) {
            glBegin(GL_QUADS);
            glVertex2f(0, 0);
            glVertex2f(0, h);
            glVertex2f(w, h);
            glVertex2f(w, 0);
            glEnd();
        }

        private void drawBar(ProgressBar b) {
            glPushMatrix();
            // title - message
            setColor(fontColor);
            glScalef(2, 2, 1);
            glEnable(GL_TEXTURE_2D);
            fontRenderer.drawString(b.getTitle() + " - " + b.getMessage(), 0, 0, 0x000000);
            glDisable(GL_TEXTURE_2D);
            glPopMatrix();
            // border
            glPushMatrix();
            glTranslatef(0, textHeight2, 0);
            setColor(barBorderColor);
            drawBox(barWidth, barHeight);
            // interior
            setColor(barBackgroundColor);
            glTranslatef(1, 1, 0);
            drawBox(barWidth - 2, barHeight - 2);
            // slidy part
            setColor(barColor);
            // Step can sometimes be 0.
            drawBox((barWidth - 2) * (b.getStep() + 1) / (b.getSteps() + 1), barHeight - 2);
            // progress text
            String progress = "" + b.getStep() + "/" + b.getSteps();
            glTranslatef(((float) barWidth - 2) / 2 - fontRenderer.getStringWidth(progress), 2, 0);
            setColor(fontColor);
            glScalef(2, 2, 1);
            glEnable(GL_TEXTURE_2D);
            fontRenderer.drawString(progress, 0, 0, 0x000000);
            glPopMatrix();
        }

        private void drawMemoryBar() {
            int maxMemory = bytesToMb(Runtime.getRuntime().maxMemory());
            int totalMemory = bytesToMb(Runtime.getRuntime().totalMemory());
            int freeMemory = bytesToMb(Runtime.getRuntime().freeMemory());
            int usedMemory = totalMemory - freeMemory;
            float usedMemoryPercent = usedMemory / (float) maxMemory;
            glPushMatrix();
            // title - message
            setColor(fontColor);
            glScalef(2, 2, 1);
            glEnable(GL_TEXTURE_2D);
            fontRenderer.drawString("Memory Used / Total", 0, 0, 0x000000);
            glDisable(GL_TEXTURE_2D);
            glPopMatrix();
            // border
            glPushMatrix();
            glTranslatef(0, textHeight2, 0);
            setColor(barBorderColor);
            drawBox(barWidth, barHeight);
            // interior
            setColor(barBackgroundColor);
            glTranslatef(1, 1, 0);
            drawBox(barWidth - 2, barHeight - 2);
            // slidy part
            long time = System.currentTimeMillis();
            if (usedMemoryPercent > memoryColorPercent || (time - memoryColorChangeTime > 1000)) {
                memoryColorChangeTime = time;
                memoryColorPercent = usedMemoryPercent;
            }
            int memoryBarColor;
            if (memoryColorPercent < 0.75f) {
                memoryBarColor = memoryGoodColor;
            } else if (memoryColorPercent < 0.85f) {
                memoryBarColor = memoryWarnColor;
            } else {
                memoryBarColor = memoryLowColor;
            }
            setColor(memoryLowColor);
            glPushMatrix();
            glTranslatef((barWidth - 2) * (totalMemory) / (maxMemory) - 2, 0, 0);
            drawBox(2, barHeight - 2);
            glPopMatrix();
            setColor(memoryBarColor);
            drawBox((barWidth - 2) * (usedMemory) / (maxMemory), barHeight - 2);
            // progress text
            String progress = getMemoryString(usedMemory) + " / " + getMemoryString(maxMemory);
            glTranslatef(((float) barWidth - 2) / 2 - fontRenderer.getStringWidth(progress), 2, 0);
            setColor(fontColor);
            glScalef(2, 2, 1);
            glEnable(GL_TEXTURE_2D);
            fontRenderer.drawString(progress, 0, 0, 0x000000);
            glPopMatrix();
        }

        private String getMemoryString(int memory) {
            return StringUtils.leftPad(Integer.toString(memory), 4, ' ') + " MB";
        }

        private void setGL() {
            lock.lock();
            try {
                Display.getDrawable().makeCurrent();
            } catch (LWJGLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
            glClearColor((float) ((backgroundColor >> 16) & 0xFF) / 0xFF, (float) ((backgroundColor >> 8) & 0xFF) / 0xFF, (float) (backgroundColor & 0xFF) / 0xFF, 1);
            glDisable(GL_LIGHTING);
            glDisable(GL_DEPTH_TEST);
            glEnable(GL_BLEND);
            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
        }

        private void clearGL() {
            Minecraft mc = Minecraft.getMinecraft();
            mc.displayWidth = Display.getWidth();
            mc.displayHeight = Display.getHeight();
            mc.resize(mc.displayWidth, mc.displayHeight);
            glClearColor(1, 1, 1, 1);
            glEnable(GL_DEPTH_TEST);
            glDepthFunc(GL_LEQUAL);
            glEnable(GL_ALPHA_TEST);
            glAlphaFunc(GL_GREATER, .1f);
            try {
                Display.getDrawable().releaseContext();
            } catch (LWJGLException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                lock.unlock();
            }
        }
    });
    thread.setUncaughtExceptionHandler(new UncaughtExceptionHandler() {

        public void uncaughtException(Thread t, Throwable e) {
            FMLLog.log(Level.ERROR, e, "Splash thread Exception");
            threadError = e;
        }
    });
    thread.start();
    checkThreadState();
}
Also used : CrashReport(net.minecraft.crash.CrashReport) FileWriter(java.io.FileWriter) Properties(java.util.Properties) EnhancedRuntimeException(net.minecraftforge.fml.common.EnhancedRuntimeException) SharedDrawable(org.lwjgl.opengl.SharedDrawable) ResourceLocation(net.minecraft.util.ResourceLocation) FileReader(java.io.FileReader) ICrashCallable(net.minecraftforge.fml.common.ICrashCallable) UncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler) ProgressBar(net.minecraftforge.fml.common.ProgressManager.ProgressBar) LWJGLException(org.lwjgl.LWJGLException) PrintWriter(java.io.PrintWriter) PrintStream(java.io.PrintStream) IOException(java.io.IOException) Minecraft(net.minecraft.client.Minecraft) LWJGLException(org.lwjgl.LWJGLException) EnhancedRuntimeException(net.minecraftforge.fml.common.EnhancedRuntimeException) IOException(java.io.IOException) File(java.io.File)

Example 7 with CrashReport

use of net.minecraft.crash.CrashReport in project Realistic-Terrain-Generation by Team-RTG.

the class StructureOceanMonumentRTG method areBiomesViable.

public boolean areBiomesViable(int x, int z, int radius, List<Biome> allowed) {
    // Are we in an RTG world?
    if (!DimensionManagerRTG.isValidDimension(this.world.provider.getDimension())) {
        //Logger.debug("Could not generate ocean monument. This is not an RTG world.");
        return false;
    }
    // Do we have RTG's chunk manager?
    if (!(this.world.getBiomeProvider() instanceof BiomeProviderRTG)) {
        //Logger.debug("Could not generate ocean monument. Incompatible chunk manager detected.");
        return false;
    }
    IntCache.resetIntCache();
    int i = x - radius >> 2;
    int j = z - radius >> 2;
    int k = x + radius >> 2;
    int l = z + radius >> 2;
    int i1 = k - i + 1;
    int j1 = l - j + 1;
    BiomeProviderRTG cmr = (BiomeProviderRTG) this.world.getBiomeProvider();
    int[] aint = cmr.getBiomesGens(i, j, i1, j1);
    try {
        for (int k1 = 0; k1 < i1 * j1; ++k1) {
            Biome biome = Biome.getBiome(aint[k1]);
            if (!allowed.contains(biome)) {
                //Logger.debug("Could not generate ocean monument. Biome (%d) nearby.", BiomeUtils.getId(biome));
                return false;
            }
        }
        return true;
    } catch (Throwable throwable) {
        CrashReport crashreport = CrashReport.makeCrashReport(throwable, "Invalid Biome id");
        CrashReportCategory crashreportcategory = crashreport.makeCategory("Layer");
        crashreportcategory.addCrashSection("Layer", Arrays.toString(aint));
        crashreportcategory.addCrashSection("x", x);
        crashreportcategory.addCrashSection("z", z);
        crashreportcategory.addCrashSection("radius", radius);
        crashreportcategory.addCrashSection("allowed", allowed);
        throw new ReportedException(crashreport);
    }
}
Also used : Biome(net.minecraft.world.biome.Biome) CrashReport(net.minecraft.crash.CrashReport) BiomeProviderRTG(rtg.world.biome.BiomeProviderRTG) CrashReportCategory(net.minecraft.crash.CrashReportCategory) ReportedException(net.minecraft.util.ReportedException)

Aggregations

CrashReport (net.minecraft.crash.CrashReport)7 CrashReportCategory (net.minecraft.crash.CrashReportCategory)4 ReportedException (net.minecraft.util.ReportedException)3 SubscribeEvent (cpw.mods.fml.common.eventhandler.SubscribeEvent)1 File (java.io.File)1 FileReader (java.io.FileReader)1 FileWriter (java.io.FileWriter)1 IOException (java.io.IOException)1 PrintStream (java.io.PrintStream)1 PrintWriter (java.io.PrintWriter)1 UncaughtExceptionHandler (java.lang.Thread.UncaughtExceptionHandler)1 List (java.util.List)1 Properties (java.util.Properties)1 Minecraft (net.minecraft.client.Minecraft)1 MinecraftServer (net.minecraft.server.MinecraftServer)1 ResourceLocation (net.minecraft.util.ResourceLocation)1 Biome (net.minecraft.world.biome.Biome)1 EnhancedRuntimeException (net.minecraftforge.fml.common.EnhancedRuntimeException)1 ICrashCallable (net.minecraftforge.fml.common.ICrashCallable)1 ProgressBar (net.minecraftforge.fml.common.ProgressManager.ProgressBar)1