From e346df682c29996f216e4c5ea6dde2147706eb82 Mon Sep 17 00:00:00 2001 From: Shredder Date: Mon, 4 May 2026 01:28:27 +0500 Subject: [PATCH] Another Huge Commit my bad - shredder Restored Java's Debug Screen using partial unused code and ported code, avaliable in options menu as a style Slight Water texture is now overlayed when in water Vignette function has been fixed and can now be toggled in options World Generation now includes Tall Grass and Ferns both Broken Frame Chart Graph found in the source has now been fixed and enabled when debug screen is turned on Pie Chart works now and will appear when debug screen is opened Most changes have not been tested on anything besides windows, will test it --- data/lang/en_US.lang | 12 ++++ src/client/Minecraft.cpp | 47 +++++++++++++--- src/client/Minecraft.h | 8 +++ src/client/Options.cpp | 12 ++++ src/client/Options.h | 3 + src/client/gui/Gui.cpp | 56 +++++++++++++++---- src/client/gui/components/OptionsItem.cpp | 12 +++- src/client/gui/screens/OptionsScreen.cpp | 7 ++- src/client/renderer/GameRenderer.cpp | 4 +- src/client/renderer/ItemInHandRenderer.cpp | 8 +-- src/client/renderer/LevelRenderer.cpp | 14 +++-- src/client/renderer/LevelRenderer.h | 1 + src/util/PerfRenderer.cpp | 11 ++-- src/util/PerfTimer.h | 12 ++-- src/world/level/Level.cpp | 14 ++--- src/world/level/Level.h | 3 + src/world/level/chunk/ChunkCache.h | 3 +- src/world/level/dimension/Dimension.cpp | 29 ++++++---- src/world/level/dimension/Dimension.h | 2 +- .../level/levelgen/RandomLevelSource.cpp | 54 ++++++++++++++---- .../level/levelgen/feature/FeatureInclude.h | 1 + src/world/level/tile/TallGrass.cpp | 10 +++- 22 files changed, 247 insertions(+), 76 deletions(-) diff --git a/data/lang/en_US.lang b/data/lang/en_US.lang index 46866c8..b7c2ca9 100755 --- a/data/lang/en_US.lang +++ b/data/lang/en_US.lang @@ -161,6 +161,18 @@ options.fogType.vanilla=Vanilla options.fogType.java=Beta Java options.fogType.unused=Unused +options.debugStyle=Debug Menu Style +options.debugStyle.javaBeta=Java Beta +options.debugStyle.custom=Custom + +options.beautifulSky=Beautiful Skies + +options.useVignette=Vignette Overlay + +options.tintedSide=Tint Grass Sides + +options.betaSky=Java Beta Sky + options.restoredAnims=Restored Animations options.normalLighting=Java Beta/Normals Shading diff --git a/src/client/Minecraft.cpp b/src/client/Minecraft.cpp index 2a05eb2..c58b957 100755 --- a/src/client/Minecraft.cpp +++ b/src/client/Minecraft.cpp @@ -8,6 +8,7 @@ #include #include + #if defined(APPLE_DEMO_PROMOTION) #define NO_NETWORK #endif @@ -475,19 +476,20 @@ void Minecraft::update() { #ifndef STANDALONE_SERVER Multitouch::resetThisUpdate(); #endif - TIMER_POP(); + #ifndef STANDALONE_SERVER + TIMER_POP(); checkGlError("Update finished"); if (options.getBooleanValue(OPTIONS_RENDER_DEBUG)) { -#ifndef PLATFORM_DESKTOP +//#ifndef PLATFORM_DESKTOP if (!PerfTimer::enabled) { PerfTimer::reset(); PerfTimer::enabled = true; } _perfRenderer->renderFpsMeter(1); checkGlError("render debug"); -#endif +//#endif } else { PerfTimer::enabled = false; } @@ -829,6 +831,12 @@ void Minecraft::tickInput() { } #endif + if (options.getBooleanValue(OPTIONS_RENDER_DEBUG)) { + if (key >= '0' && key <= '9') { + _perfRenderer->debugFpsMeterKeyPress(key - '0'); + } + } + if (key == Keyboard::KEY_ESCAPE) pauseGame(false); @@ -840,6 +848,12 @@ void Minecraft::tickInput() { //glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL); } #endif + if (key == Keyboard::KEY_P) { + static bool isWireFrame = false; + isWireFrame = !isWireFrame; + glPolygonMode(GL_FRONT, isWireFrame? GL_LINE : GL_FILL); + //glPolygonMode(GL_BACK, isWireFrame? GL_LINE : GL_FILL); + } } #ifdef WIN32 if (key == Keyboard::KEY_M) { @@ -1410,10 +1424,10 @@ void Minecraft::_levelGenerated() player->resetPos(false); } - if (level && level->dimension) { - // For example, if you want FogType or any other option - level->dimension->FogType = options.getIntValue(OPTIONS_FOG_TYPE); - } + if (level && level->dimension) { + + level->dimension->FogType = options.getIntValue(OPTIONS_FOG_TYPE); + } this->cameraTargetPlayer = player; @@ -1441,6 +1455,25 @@ void Minecraft::_levelGenerated() _hasSignaledGeneratingLevelFinished = true; } +std::string Minecraft::gatherStats1() { + return levelRenderer->gatherStats1(); +} + +std::string Minecraft::gatherStats2() { + return levelRenderer->gatherStats2(); +} + +std::string Minecraft::gatherStats3() { + return ("P: " + particleEngine->countParticles() + ". T: " + (level->gatherStats())); +} + +std::string Minecraft::gatherStats4() { + return level->gatherChunkSourceStats(); +} + + + + Player* Minecraft::respawnPlayer(int playerId) { for (unsigned int i = 0; i < level->players.size(); ++i) { if (level->players[i]->entityId == playerId) { diff --git a/src/client/Minecraft.h b/src/client/Minecraft.h index 22b7ec7..72d3be7 100755 --- a/src/client/Minecraft.h +++ b/src/client/Minecraft.h @@ -87,6 +87,14 @@ public: void update(); + std::string gatherStats1(); + + std::string gatherStats2(); + + std::string gatherStats4(); + + std::string gatherStats3(); + void tick(int nTick, int maxTick); void tickInput(); diff --git a/src/client/Options.cpp b/src/client/Options.cpp index ee9aced..5a438eb 100755 --- a/src/client/Options.cpp +++ b/src/client/Options.cpp @@ -58,6 +58,10 @@ OptionBool ambientOcclusion("ao", true); OptionBool useNormalLighting("normalLighting", true); +OptionBool beautifulSky("beautifulSky", true); + +OptionBool useVignette("useVignette", true); + OptionBool useTouchscreen("useTouchscreen", true); OptionBool serverVisible("servervisible", true); @@ -76,6 +80,8 @@ OptionBool blockOutline("blockOutline", false); OptionBool restoredAnims("restoredAnims", true); +OptionInt debugStyle("debugStyle", 0, 0, 1); + OptionInt keyForward("key.forward", Keyboard::KEY_W); OptionInt keyLeft("key.left", Keyboard::KEY_A); OptionInt keyBack("key.back", Keyboard::KEY_S); @@ -154,6 +160,10 @@ void Options::initTable() { m_options[OPTIONS_BLOCK_OUTLINE] = &blockOutline; + m_options[OPTIONS_VIGNETTE] = &useVignette; + + m_options[OPTIONS_BEAUTIFUL_SKY] = &beautifulSky; + m_options[OPTIONS_NORMAL_LIGHTING] = &useNormalLighting; m_options[OPTIONS_RESTORED_ANIMS] = &restoredAnims; @@ -187,6 +197,8 @@ void Options::initTable() { // more options yay m_options[OPTIONS_FOG_TYPE] = &fogType; + m_options[OPTIONS_DEBUG_STYLE] = &debugStyle; + m_options[OPTIONS_BETA_SKY] = &betaSky; m_options[OPTIONS_TINTED_SIDE] = &tintedSide; diff --git a/src/client/Options.h b/src/client/Options.h index 826bfb3..90aea6c 100755 --- a/src/client/Options.h +++ b/src/client/Options.h @@ -92,6 +92,9 @@ enum OptionId { OPTIONS_RESTORED_ANIMS, OPTIONS_TINTED_SIDE, OPTIONS_BETA_SKY, + OPTIONS_BEAUTIFUL_SKY, + OPTIONS_VIGNETTE, + OPTIONS_DEBUG_STYLE, // Should be last! OPTIONS_COUNT }; diff --git a/src/client/gui/Gui.cpp b/src/client/gui/Gui.cpp index c9f63ea..51058a7 100755 --- a/src/client/gui/Gui.cpp +++ b/src/client/gui/Gui.cpp @@ -7,6 +7,7 @@ #include "screens/ConsoleScreen.h" #include "../Minecraft.h" #include "../player/LocalPlayer.h" +#include "../renderer/Chunk.h" #include "../renderer/Tesselator.h" #include "../renderer/TileRenderer.h" #include "../renderer/LevelRenderer.h" @@ -103,10 +104,10 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) { } } - // @todo - Shredder: I added this here but currently viginette is broken so i cant do much about it. - // if (minecraft->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS)){ - // this->renderVignette(this->minecraft->player->getBrightness(a), screenWidth, screenHeight); - // } + // viginette has been fixed, was due to gl_blend not being enabled, my bad + if (minecraft->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS) && minecraft->options.getBooleanValue(OPTIONS_VIGNETTE)){ + renderVignette(this->minecraft->player->getBrightness(a), screenWidth, screenHeight); + } // shredder end if(minecraft->player->getSleepTimer() > 0) { @@ -121,7 +122,7 @@ void Gui::render(float a, bool mouseFree, int xMouse, int yMouse) { if (!minecraft->options.getBooleanValue(OPTIONS_HIDEGUI)) { renderToolBar(a, ySlot, screenWidth); - font->drawShadow("Minecraft - Pocket Edition ", 2, 2, 0xffffffff); + // font->drawShadow("Minecraft - Pocket Edition ", 2, 2, 0xffffffff); // font->drawShadow("This is a demo, not the finished product", 2, 10 + 2, 0xffffffff); glEnable(GL_BLEND); @@ -363,6 +364,7 @@ void Gui::renderVignette(float br, int w, int h) { glDisable(GL_DEPTH_TEST); glDepthMask(false); + glEnable(GL_BLEND); glBlendFunc2(GL_ZERO, GL_ONE_MINUS_SRC_COLOR); glColor4f2(tbr, tbr, tbr, 1); @@ -379,6 +381,7 @@ void Gui::renderVignette(float br, int w, int h) { t.draw(); glDepthMask(true); glEnable(GL_DEPTH_TEST); + glDisable(GL_BLEND); glColor4f2(1, 1, 1, 1); glBlendFunc2(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); } @@ -729,13 +732,20 @@ void Gui::onLevelGenerated() { void Gui::renderDebugInfo() { // FPS counter (updates once per second) - static float fps = 0.0f; - static float fpsLastTime = 0.0f; + static int fps = 0; + static int fpsLastTime = 0; static int fpsFrames = 0; + static int displayChunkUpdates = 0; float now = getTimeS(); fpsFrames++; - if (now - fpsLastTime >= 1.0f) { + if (now - fpsLastTime >= 1) { fps = fpsFrames / (now - fpsLastTime); + + displayChunkUpdates = Chunk::updates; + + // 3. RESET the actual game counter to 0 for the next second + Chunk::updates = 0; + fpsFrames = 0; fpsLastTime = now; } @@ -773,6 +783,31 @@ void Gui::renderDebugInfo() { long seed = lvl ? lvl->getSeed() : 0; // Build lines (NULL entry = blank gap) + Font* font = minecraft->font; + + // @todo - add our own debug screen as an option alongside the restored java one, why does renderdebug have to be so jank - shredder + + // if java beta's restored debug menu is enabled + if (minecraft->options.getIntValue(OPTIONS_DEBUG_STYLE) == 0){ + font->drawShadow("Minecraft - Pocket Edition (" + + std::to_string((int)fps) + " fps, " + + std::to_string(displayChunkUpdates) + " chunk updates)", 2, 2, 0xffffff); + font->drawShadow(minecraft->gatherStats1(), 2, 12, 0xFFFFFF); + font->drawShadow(minecraft->gatherStats2(), 2, 22, 0xFFFFFF); + font->drawShadow(minecraft->gatherStats3(), 2, 32, 0xFFFFFF); + font->drawShadow(minecraft->gatherStats4(), 2, 42, 0xFFFFFF); + + drawString(font, "x: " + std::to_string(minecraft->player->x), 2, 64, 0xE0E0E0); + drawString(font, "y: " + std::to_string(minecraft->player->y), 2, 72, 0xE0E0E0); + drawString(font, "z: " + std::to_string(minecraft->player->z), 2, 80, 0xE0E0E0); + drawString(font, "f: " + std::to_string(Mth::floor(minecraft->player->yRot * 4.0f / 360.0f + 0.5) & 0x3), 2, 88, 0xE0E0E0); + drawString(font, "Seed: " + std::to_string(lvl->getSeed()), 2, 104, 0xE0E0E0); + drawString(font, "Dimension: " + std::to_string(lvl->dimension->id) + " (" + lvl->dimension->getDimension() + ")", 2, 114, 0xE0E0E0); + drawString(font, "Biome: " + std::string(biomeName), 2, 124, 0xE0E0E0); + } + else if (minecraft->options.getIntValue(OPTIONS_DEBUG_STYLE) == 1){ + + static char ln[8][96]; sprintf(ln[0], "Minecraft PE 0.6.1 alpha (mcpe64)"); sprintf(ln[1], "%.1f fps", fps); @@ -787,8 +822,8 @@ void Gui::renderDebugInfo() { const float LH = (float)Font::DefaultLineHeight; // 10 font-pixels const float MGN = 2.0f; // left/top margin in font-pixels const float PAD = 2.0f; // horizontal padding for background - Font* font = minecraft->font; - +// Font* font = minecraft->font; + // 1) Draw semi-transparent background boxes behind each line for (int i = 0; i < N; i++) { if (ln[i][0] == '\0') continue; @@ -810,6 +845,7 @@ void Gui::renderDebugInfo() { font->draw(ln[i], MGN, y, col); } t.endOverrideAndDraw(); + } } void Gui::renderPlayerList(Font* font, int screenWidth, int screenHeight) { diff --git a/src/client/gui/components/OptionsItem.cpp b/src/client/gui/components/OptionsItem.cpp index b9d5bbb..d55b447 100755 --- a/src/client/gui/components/OptionsItem.cpp +++ b/src/client/gui/components/OptionsItem.cpp @@ -36,7 +36,7 @@ void OptionsItem::render( Minecraft* minecraft, int xm, int ym ) { } text += ": " + scaleText; } - if (m_optionId == OPTIONS_FOG_TYPE) { + if (m_optionId == OPTIONS_FOG_TYPE) { int value = minecraft->options.getIntValue(OPTIONS_FOG_TYPE); std::string scaleText; switch (value) { @@ -46,6 +46,16 @@ void OptionsItem::render( Minecraft* minecraft, int xm, int ym ) { } text += ": " + scaleText; } + if (m_optionId == OPTIONS_DEBUG_STYLE) { + int value = minecraft->options.getIntValue(OPTIONS_DEBUG_STYLE); + std::string scaleText; + switch (value) { + case 0: scaleText = I18n::get("options.debugStyle.javaBeta"); break; + case 1: scaleText = I18n::get("options.debugStyle.custom"); break; + case 2: scaleText = I18n::get("options.fogType.unused"); break; + } + text += ": " + scaleText; + } minecraft->font->draw(text, (float)x, (float)y + yOffset, 0x909090, false); super::render(minecraft, xm, ym); diff --git a/src/client/gui/screens/OptionsScreen.cpp b/src/client/gui/screens/OptionsScreen.cpp index 9e53721..77d5a5f 100755 --- a/src/client/gui/screens/OptionsScreen.cpp +++ b/src/client/gui/screens/OptionsScreen.cpp @@ -227,7 +227,9 @@ void OptionsScreen::generateOptionScreens() { .addOptionItem(OPTIONS_ANAGLYPH_3D, minecraft) .addOptionItem(OPTIONS_VIEW_BOBBING, minecraft) .addOptionItem(OPTIONS_AMBIENT_OCCLUSION, minecraft) - .addOptionItem(OPTIONS_NORMAL_LIGHTING, minecraft); + .addOptionItem(OPTIONS_NORMAL_LIGHTING, minecraft) + .addOptionItem(OPTIONS_BEAUTIFUL_SKY, minecraft) + .addOptionItem(OPTIONS_VIGNETTE, minecraft); optionPanes[4]->addOptionItem(OPTIONS_ALLOW_SPRINT, minecraft) .addOptionItem(OPTIONS_BAR_ON_TOP, minecraft) @@ -237,7 +239,8 @@ void OptionsScreen::generateOptionScreens() { .addOptionItem(OPTIONS_JAVA_HUD, minecraft) .addOptionItem(OPTIONS_FOG_TYPE, minecraft) .addOptionItem(OPTIONS_BETA_SKY, minecraft) - .addOptionItem(OPTIONS_RESTORED_ANIMS, minecraft); + .addOptionItem(OPTIONS_RESTORED_ANIMS, minecraft) + .addOptionItem(OPTIONS_DEBUG_STYLE, minecraft); } diff --git a/src/client/renderer/GameRenderer.cpp b/src/client/renderer/GameRenderer.cpp index aab253a..7973b82 100755 --- a/src/client/renderer/GameRenderer.cpp +++ b/src/client/renderer/GameRenderer.cpp @@ -285,7 +285,7 @@ void GameRenderer::renderLevel(float a) { mc->levelRenderer->cull(&frustum, a); mc->levelRenderer->updateDirtyChunks(cameraEntity, false); // this sky rendering code below was originally before the frustrum and culling stuff but sunset color breaks for some reason in that place, so i moved i after those two - shredder - if(mc->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS)) { +// if(mc->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS)) { setupFog(-1); TIMER_POP_PUSH("sky"); // @TODO - EXTREME JANK BELOW, it works but i have to do heavy cleanup here, also to test if the glfogf commands even affect fog in anyway. @@ -298,7 +298,7 @@ void GameRenderer::renderLevel(float a) { glFogf(GL_FOG_START, renderDistance * 0.6f); glFogf(GL_FOG_END, renderDistance); } - } +// } glEnable2(GL_FOG); setupFog(1); // MCPE renders clouds using this, but this method breaks 3d clouds and also breaks 2d clouds transparency viewed from above, add as a Legacy Sky or Fast Sky option. - shredder diff --git a/src/client/renderer/ItemInHandRenderer.cpp b/src/client/renderer/ItemInHandRenderer.cpp index b45d837..088d93b 100755 --- a/src/client/renderer/ItemInHandRenderer.cpp +++ b/src/client/renderer/ItemInHandRenderer.cpp @@ -443,10 +443,10 @@ void ItemInHandRenderer::renderScreenEffect( float a ) } } - // if (mc->player->isUnderLiquid(Material::water)) { - //mc->textures->loadAndBindTexture("misc/water.png"); - // renderWater(a); - // } + if (mc->player->isUnderLiquid(Material::water)) { + mc->textures->loadAndBindTexture("misc/water.png"); + renderWater(a); + } glEnable2(GL_ALPHA_TEST); } diff --git a/src/client/renderer/LevelRenderer.cpp b/src/client/renderer/LevelRenderer.cpp index 6ce0d9b..4f8c02a 100755 --- a/src/client/renderer/LevelRenderer.cpp +++ b/src/client/renderer/LevelRenderer.cpp @@ -1063,9 +1063,9 @@ std::string LevelRenderer::gatherStats1() { } // -// /*public*/ std::string gatherStats2() { -// return "E: " + renderedEntities + "/" + totalEntities + ". B: " + culledEntities + ", I: " + ((totalEntities - culledEntities) - renderedEntities); -// } + std::string LevelRenderer::gatherStats2() { + return "E: " + std::to_string(renderedEntities) + "/" + std::to_string(totalEntities) + ". B: " + std::to_string(culledEntities) + ", I: " + std::to_string(((totalEntities - culledEntities) - renderedEntities)); + } // // int[] toRender = new int[50000]; // IntBuffer resultBuffer = MemoryTracker.createIntBuffer(64); @@ -1158,6 +1158,7 @@ void LevelRenderer::renderSky(float alpha) { // thanks to the mcpe 0.1 decomp project a bit for this part, was not getting the gl states correctly, gles is painful - shredder // Sunrise + if (mc->options.getBooleanValue(OPTIONS_BEAUTIFUL_SKY)) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); @@ -1228,6 +1229,7 @@ void LevelRenderer::renderSky(float alpha) { glColor4f(a, a, a, a); drawArrayVT(starBuffer, starVertexCount); } + } glColor4f(1.0f, 1.0f, 1.0f, 1.0f); @@ -1240,7 +1242,9 @@ void LevelRenderer::renderSky(float alpha) { glColor3f(sc.x * 0.2f + 0.04f, sc.y * 0.2f + 0.04f, sc.z * 0.6f + 0.1f); glDisable(GL_TEXTURE_2D); - drawArrayVT(voidBuffer, voidVertexCount); + if(mc->options.getBooleanValue(OPTIONS_BETA_SKY)){ + drawArrayVT(voidBuffer, voidVertexCount); + } glEnable(GL_TEXTURE_2D); // @TODO shredder - should not enable or disable depth mask if using legacy sky because mcpe sky rendering is awful and will render clouds above terrain @@ -1251,7 +1255,7 @@ void LevelRenderer::renderSky(float alpha) { void LevelRenderer::renderClouds( float alpha ) { //if (!mc->level->dimension->isNaturalDimension()) return; - if (mc->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS)){ + if (mc->options.getBooleanValue(OPTIONS_FANCY_GRAPHICS) && mc->options.getBooleanValue(OPTIONS_BETA_SKY)){ renderAdvancedClouds(alpha); return; } diff --git a/src/client/renderer/LevelRenderer.h b/src/client/renderer/LevelRenderer.h index 2fa29c8..ba39bfe 100755 --- a/src/client/renderer/LevelRenderer.h +++ b/src/client/renderer/LevelRenderer.h @@ -69,6 +69,7 @@ public: void levelEvent(Player* source, int type, int x, int y, int z, int data); std::string gatherStats1(); + std::string gatherStats2(); void render(const AABB& b) const; void onGraphicsReset(); diff --git a/src/util/PerfRenderer.cpp b/src/util/PerfRenderer.cpp index 34f818a..0ae24d0 100755 --- a/src/util/PerfRenderer.cpp +++ b/src/util/PerfRenderer.cpp @@ -75,7 +75,7 @@ void PerfRenderer::renderFpsMeter( float tickTime ) glDisable2(GL_TEXTURE_2D); Tesselator& t = Tesselator::instance; - t.begin(GL_TRIANGLES); + t.begin(GL_QUADS); int hh1 = (int) (usPer60Fps / 200); float count = (float)frameTimes.size(); t.color(0x20000000); @@ -117,7 +117,8 @@ void PerfRenderer::renderFpsMeter( float tickTime ) t.color(0xff000000 + cc * 256); } - float time = 10 * 1000 * frameTimes[i] / 200; +// float time = 10 * 1000 * frameTimes[i] / 200; + float time = frameTimes[i] * 4000.0f; float time2 = 10 * 1000 * tickTimes[i] / 200; t.vertex(i + 0.5f, _mc->height - time + 0.5f, 0); @@ -210,12 +211,12 @@ void PerfRenderer::renderFpsMeter( float tickTime ) msg << result.name; float xx = (float)(x - r); float yy = (float)(y + r/2 + i * 8 + 20); - _font->drawShadow(msg.str(), xx, yy, result.getColor()); + _font->drawShadow(msg.str(), xx + 10 + 10, yy, result.getColor()); std::string msg2 = toPercentString(result.percentage); //LOGI("name: %s: perc: %f == %s @ %d, %d\n", msg.str().c_str(), result.percentage, msg2.c_str(), xx, yy); - _font->drawShadow(msg2, xx - 50 - _font->width(msg2), yy, result.getColor()); + _font->drawShadow(msg2, xx + 10 + 10 - _font->width(msg2), yy, result.getColor()); msg2 = toPercentString(result.globalPercentage); - _font->drawShadow(msg2, xx - _font->width(msg2), yy, result.getColor()); + _font->drawShadow(msg2, xx + 10 + 10 - _font->width(msg2), yy, result.getColor()); } } diff --git a/src/util/PerfTimer.h b/src/util/PerfTimer.h index 53cf3cd..f4ed974 100755 --- a/src/util/PerfTimer.h +++ b/src/util/PerfTimer.h @@ -6,7 +6,7 @@ #include "StringUtils.h" //package util; -#ifdef PROFILER +//#ifdef PROFILER #define TIMER_PUSH(x) PerfTimer::push(x) #define TIMER_POP() PerfTimer::pop() #define TIMER_POP_PUSH(x) PerfTimer::popPush(x) @@ -16,11 +16,11 @@ // #define TIMER_PUSH(x) ServerProfiler::push(x) // #define TIMER_POP() ServerProfiler::pop() // #define TIMER_POP_PUSH(x) ServerProfiler::popPush(x) -#else - #define TIMER_PUSH(x) ((void*)0) - #define TIMER_POP() ((void*)0) - #define TIMER_POP_PUSH(x) ((void*)0) -#endif +//#else +// #define TIMER_PUSH(x) ((void*)0) +// #define TIMER_POP() ((void*)0) +// #define TIMER_POP_PUSH(x) ((void*)0) +//#endif class PerfTimer { diff --git a/src/world/level/Level.cpp b/src/world/level/Level.cpp index 14aa54e..bdc6d27 100755 --- a/src/world/level/Level.cpp +++ b/src/world/level/Level.cpp @@ -1735,13 +1735,13 @@ void Level::extinguishFire(int x, int y, int z, int face) { setTile(x, y, z, 0); } } -// String gatherStats() { -// return "All: " + this.entities.size(); -// } -// -// String gatherChunkSourceStats() { -// return chunkSource.gatherStats(); -// } + std::string Level::gatherStats() { + return "All: " + std::to_string(entities.size()); + } + + std::string Level::gatherChunkSourceStats() { + return _chunkSource->gatherStats(); + } // TileEntity* Level::getTileEntity(int x, int y, int z) { LevelChunk* lc = getChunk(x >> 4, z >> 4); diff --git a/src/world/level/Level.h b/src/world/level/Level.h index fb76474..73a3296 100755 --- a/src/world/level/Level.h +++ b/src/world/level/Level.h @@ -202,6 +202,9 @@ public: bool checkAndHandleWater(const AABB& box, const Material* material, Entity* e); void extinguishFire(int x, int y, int z, int face); + std::string Level::gatherStats(); + std::string Level::gatherChunkSourceStats(); + //void addEntities(const EntityList& list); //void removeEntities(const EntityList& list); //void ensureAdded(Entity* entity); diff --git a/src/world/level/chunk/ChunkCache.h b/src/world/level/chunk/ChunkCache.h index b1b16fe..24d93f4 100755 --- a/src/world/level/chunk/ChunkCache.h +++ b/src/world/level/chunk/ChunkCache.h @@ -193,7 +193,8 @@ public: } std::string gatherStats() { - return "ChunkCache: 1024"; + // return "ChunkCache: 1024"; + return ("ChunkCache: " + std::to_string(CHUNK_CACHE_WIDTH * CHUNK_CACHE_WIDTH)); } void saveAll(bool onlyUnsaved) { diff --git a/src/world/level/dimension/Dimension.cpp b/src/world/level/dimension/Dimension.cpp index c565409..19a0eae 100755 --- a/src/world/level/dimension/Dimension.cpp +++ b/src/world/level/dimension/Dimension.cpp @@ -133,22 +133,29 @@ Dimension* Dimension::getNew( int id ) return NULL; } +std::string Dimension::getDimension(){ + int currentID = this->id; + if (currentID == Dimension::NORMAL) return "Overworld"; + if (currentID == Dimension::NORMAL_DAYCYCLE) return "Overworld"; + return "Unknown"; +} + // // DimensionFactory // #include "../storage/LevelData.h" -Dimension* DimensionFactory::createDefaultDimension(LevelData* data ) -{ - int dimensionId = Dimension::NORMAL; + Dimension* DimensionFactory::createDefaultDimension(LevelData* data ) + { + int dimensionId = Dimension::NORMAL; - switch(data->getGameType()) { - case GameType::Survival: dimensionId = Dimension::NORMAL_DAYCYCLE; - break; - case GameType::Creative: - default: - dimensionId = Dimension::NORMAL; - break; - } + switch(data->getGameType()) { + case GameType::Survival: dimensionId = Dimension::NORMAL_DAYCYCLE; + break; + case GameType::Creative: + default: + dimensionId = Dimension::NORMAL; + break; + } return Dimension::getNew(dimensionId); } diff --git a/src/world/level/dimension/Dimension.h b/src/world/level/dimension/Dimension.h index b33861c..5600426 100755 --- a/src/world/level/dimension/Dimension.h +++ b/src/world/level/dimension/Dimension.h @@ -49,7 +49,7 @@ public: bool hasCeiling; float brightnessRamp[16];//Level::MAX_BRIGHTNESS + 1]; int id; - + std::string getDimension(); // shredder added int FogType; // lets us choose between what fog we want ig protected: diff --git a/src/world/level/levelgen/RandomLevelSource.cpp b/src/world/level/levelgen/RandomLevelSource.cpp index 4e3c4b2..5d84f35 100755 --- a/src/world/level/levelgen/RandomLevelSource.cpp +++ b/src/world/level/levelgen/RandomLevelSource.cpp @@ -11,6 +11,7 @@ #include "../tile/Tile.h" #include "../tile/HeavyTile.h" #include "../../../util/Random.h" +#include "../../level/tile/TallGrass.h" const float RandomLevelSource::SNOW_CUTOFF = 0.5f; const float RandomLevelSource::SNOW_SCALE = 0.3f; @@ -225,7 +226,7 @@ void RandomLevelSource::postProcess(ChunkSource* parent, int xt, int zt) { int zo = zt * 16; Biome* biome = level->getBiomeSource()->getBiome(xo + 16, zo + 16); - // Biome* biome = Biome::forest; +// Biome* biome = Biome::forest; random.setSeed(level->getSeed()); int xScale = random.nextInt() / 2 * 2 + 1; @@ -419,17 +420,46 @@ void RandomLevelSource::postProcess(ChunkSource* parent, int xt, int zt) { FlowerFeature feature(Tile::mushroom2->id); feature.place(level, &random, x, y, z); } - int grassCount = 1; - for (int i = 0; i < grassCount; i++) { - int x = xo + random.nextInt(16) + 8; - int y = random.nextInt(Level::genDepth); - int z = zo + random.nextInt(16) + 8; - Feature* grassFeature = biome->getGrassFeature(&random); - if (grassFeature) { - grassFeature->place(level, &random, x, y, z); - delete grassFeature; - } - } + // normally unused in mcpe but how its supposed to do it + //int grassCount = 1; + //for (int i = 0; i < grassCount; i++) { + //int x = xo + random.nextInt(16) + 8; + //int y = random.nextInt(Level::genDepth); + //int z = zo + random.nextInt(16) + 8; + //Feature* grassFeature = biome->getGrassFeature(&random); + //if (grassFeature) { + //grassFeature->place(level, &random, x, y, z); + //delete grassFeature; + //} + //} + + // reworked code from above to generate ferns and shrubs to just like in beta java +int grassCount = 0; + +if (biome == Biome::forest) { grassCount = 2; } +else if (biome == Biome::rainForest) { grassCount = 10; } +else if (biome == Biome::seasonalForest) { grassCount = 2; } +else if (biome == Biome::taiga) { grassCount = 1; } +else if (biome == Biome::plains) { grassCount = 10; } + +for (int i = 0; i < grassCount; i++) { + int grassMetadata = TallGrass::TALL_GRASS; + + + if (biome == Biome::rainForest && random.nextInt(3) != 0) { + grassMetadata = TallGrass::FERN; + } + + int x = xo + random.nextInt(16) + 8; + + int z = zo + random.nextInt(16) + 8; + int y = level->getHeightmap(x, z); + + TallgrassFeature grassFeature(Tile::tallgrass->id, grassMetadata); + grassFeature.place(level, &random, x, y, z); +} + + for (int i = 0; i < 10; i++) { int x = xo + random.nextInt(16) + 8; int y = random.nextInt(128); diff --git a/src/world/level/levelgen/feature/FeatureInclude.h b/src/world/level/levelgen/feature/FeatureInclude.h index 940db75..81aa39a 100755 --- a/src/world/level/levelgen/feature/FeatureInclude.h +++ b/src/world/level/levelgen/feature/FeatureInclude.h @@ -10,5 +10,6 @@ #include "OreFeature.h" #include "ReedsFeature.h" #include "SpringFeature.h" +#include "TallgrassFeature.h" #endif /*FEATURE_INCLUDE__H__*/ diff --git a/src/world/level/tile/TallGrass.cpp b/src/world/level/tile/TallGrass.cpp index b3fc6e6..dbd3738 100755 --- a/src/world/level/tile/TallGrass.cpp +++ b/src/world/level/tile/TallGrass.cpp @@ -33,15 +33,21 @@ int TallGrass::getColor() { } int TallGrass::getColor( int auxData ) { - if(auxData == DEAD_SHRUB) return 0xffffffff; + if(auxData == DEAD_SHRUB); + if (!FoliageColor::useTint && auxData == DEAD_SHRUB){ + return 0xffffff; + } return FoliageColor::getDefaultColor(); } int TallGrass::getColor( LevelSource* level, int x, int y, int z ) { int d = level->getData(x, y, z); - if (d == DEAD_SHRUB) return 0xffffff; + if (d == DEAD_SHRUB); //return 0xffffff; // i removed this to make it accurate to beta 1.6.6 instead of early java release versions float temp = level->getBiomeSource()->temperatures[0]; // shredder added float rain = level->getBiomeSource()->downfalls[0]; // shredder added + if (!GrassColor::useTint && d == DEAD_SHRUB){ + return 0xffffff; + } if (GrassColor::useTint){ return GrassColor::get(temp, rain); }