/* * This file is part of Spoutcraft. * * Copyright (c) 2011 SpoutcraftDev <http://spoutcraft.org/> * Spoutcraft is licensed under the GNU Lesser General Public License. * * Spoutcraft is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Spoutcraft is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.spoutcraft.client.spoutworth; import gnu.trove.iterator.TLongIterator; import gnu.trove.list.linked.TLongLinkedList; import net.minecraft.src.Minecraft; import org.spoutcraft.client.config.Configuration; public class SpoutWorth { private static SpoutWorth instance = null; public static SpoutWorth getInstance() { if (instance == null) { instance = new SpoutWorth(); } return instance; } private static final int MAX_FPS_TRACKED = 1000; private static final int IDEAL_FPS = 60; TLongLinkedList fpsList = new TLongLinkedList(); long avgFPS = -1; long appearanceCooldown = 0; long currentFPS = IDEAL_FPS; String debug; boolean belowIdeal = false; public void updateFPS(long fps) { fpsList.add(fps); if (fpsList.size() > MAX_FPS_TRACKED) { fpsList.removeAt(0); } avgFPS = -1; currentFPS = fps; doTick(); } public long getAverageFPS() { if (avgFPS != -1) { return avgFPS; } if (fpsList.size() == 0) { return IDEAL_FPS; } long total = 0; TLongIterator i = fpsList.iterator(); while (i.hasNext()) { total += i.next(); } avgFPS = Math.max(1, total / fpsList.size()); return avgFPS; } public long getIdealFPS() { return Math.min(getAverageFPS() + 10, IDEAL_FPS); } public void doTick() { Configuration.setSignDistance(Math.max(8, Configuration.getSignDistance())); if (!Configuration.isAutomatePerformance()) { return; } Configuration.setPerformance(0); Configuration.setFarView(false); long idealFPS = getIdealFPS(); // Calculate how close we are to acheiving ideal FPS long percent = getAverageFPS() * 100 / idealFPS; long percentCur = currentFPS * 100 / idealFPS; // Increase our ideal standards if we are looking for best performance if (Configuration.getAutomateMode() == 0) { percent -= 10; percentCur -= 10; } else if (Configuration.getAutomateMode() == 1) { // Decrease our ideal standards if we are looking for balanced performance percent += 15; percentCur += 15; } else if (Configuration.getAutomateMode() == 2) { // Decrease our ideal standards if we are looking for best appearance percent += 40; percentCur += 40; } boolean improving = percentCur > percent; belowIdeal = percent < 75; debug = "Ideal Percent: " + percent + " Current Percent: " + percentCur + " Improving: " + improving; if (percent > 200) { if (--appearanceCooldown <= 0) { appearanceCooldown = 600; increaseAppearance(); increaseAppearance(); } } else if (percent > 150 || (percent > 125 && improving)) { if (--appearanceCooldown <= 0) { appearanceCooldown = 600; increaseAppearance(); } } else if (percent < 40) { decreaseAppearance(true, improving ? 10 : 0); appearanceCooldown = 120; } else if (percent < 66) { if (--appearanceCooldown <= 0) { decreaseAppearance(improving, 0); appearanceCooldown = 240; } } else if (percent < 85) { if (--appearanceCooldown <= 0) { decreaseAppearance(); appearanceCooldown = 480; } } } public boolean isFullyLoaded() { return fpsList.size() == SpoutWorth.MAX_FPS_TRACKED; } public boolean isBelowIdeal() { return belowIdeal && Configuration.isAutomatePerformance(); } public String getDebugText() { return debug; } public void increaseAppearance() { if (!Configuration.isSky()) { Configuration.setSky(true); Configuration.write(); return; } if (!Configuration.isStars()) { Configuration.setStars(true); Configuration.write(); return; } if (!Configuration.isFancyWater()) { Configuration.setFancyWater(true); Configuration.write(); return; } if (!Configuration.isFancyParticles()) { Configuration.setFancyParticles(true); Configuration.write(); return; } if (!Configuration.isFancyFog()) { Configuration.setFancyFog(true); Configuration.write(); return; } if (!Configuration.isFancyGrass()) { Configuration.setFancyGrass(true); Configuration.write(); return; } if (!Configuration.isFancyBiomeColors()) { Configuration.setFancyBiomeColors(true); Configuration.write(); return; } if (!Configuration.isFancyLight()) { Configuration.setFancyLight(true); Configuration.write(); return; } if (!Configuration.isFancyLight()) { Configuration.setFancyLight(true); Configuration.write(); return; } if (!Configuration.isFancyClouds()) { Configuration.setFancyClouds(true); Configuration.write(); return; } if (!Configuration.isFancyTrees()) { Configuration.setFancyTrees(true); Configuration.write(); return; } if (!Configuration.isFancyWeather()) { Configuration.setFancyWeather(true); Configuration.write(); return; } if (Configuration.getBetterGrass() == 1) { Configuration.setBetterGrass(2); Configuration.write(); return; } if (Configuration.getRenderDistance() != 0) { Configuration.setRenderDistance(Configuration.getRenderDistance() - 1); Minecraft.getMinecraft().gameSettings.renderDistance = Configuration.getRenderDistance(); Configuration.write(); return; } if (Configuration.getAdvancedOpenGL() != 0) { Configuration.setAdvancedOpenGL(0); Minecraft.getMinecraft().gameSettings.advancedOpengl = false; Configuration.write(); return; } if (Configuration.getSignDistance() != Integer.MAX_VALUE) { Configuration.setSignDistance(Configuration.getSignDistance() * 2); if (Configuration.getSignDistance() >= 128) { Configuration.setSignDistance(Integer.MAX_VALUE); } Configuration.write(); return; } if (!Configuration.isAmbientOcclusion()) { Configuration.setAmbientOcclusion(true); Configuration.write(); return; } } public void decreaseAppearance() { decreaseAppearance(false, 0); } public void decreaseAppearance(boolean drastic, long haltRenderingCount) { int downgrade = drastic ? 2 : 1; if (Configuration.isSky()) { Configuration.setSky(false); if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.getChunkRenderPasses() > 1) { Configuration.setChunkRenderPasses(1); if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.getRenderDistance() < 2) { Configuration.setRenderDistance(Configuration.getRenderDistance() + 1); Minecraft.getMinecraft().gameSettings.renderDistance = Configuration.getRenderDistance(); if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.getAdvancedOpenGL() == 2 || Configuration.getAdvancedOpenGL() == 0) { Configuration.setAdvancedOpenGL(1); Minecraft.getMinecraft().gameSettings.advancedOpengl = true; if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.getSignDistance() > 8) { Configuration.setSignDistance(Configuration.getSignDistance() / 2); if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.isFancyParticles()) { Configuration.setFancyParticles(false); if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.isFancyFog()) { Configuration.setFancyFog(false); Configuration.write(); if (--downgrade == 0) { return; } } if (Configuration.isFancyGrass()) { Configuration.setFancyGrass(false); if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.isFancyBiomeColors()) { Configuration.setFancyBiomeColors(false); if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.isStars()) { Configuration.setStars(false); if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.isFancyLight()) { Configuration.setFancyLight(false); if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.isFancyLight()) { Configuration.setFancyLight(false); if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.isFancyClouds()) { Configuration.setFancyClouds(false); if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.isFancyTrees()) { Configuration.setFancyTrees(false); if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.isFancyWeather()) { Configuration.setFancyWeather(false); if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.getBetterGrass() == 2) { Configuration.setBetterGrass(1); if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.isFancyWater()) { Configuration.setFancyWater(false); if (--downgrade == 0) { Configuration.write(); return; } } if (Configuration.isAmbientOcclusion()) { Configuration.setAmbientOcclusion(false); if (--downgrade == 0) { Configuration.write(); return; } } } }