From 4fbc84773650580008295a234302fc5618af5fcb Mon Sep 17 00:00:00 2001 From: mezz Date: Tue, 14 Mar 2017 19:19:47 -0700 Subject: [PATCH] Detect and log cascading chunk generation issues during terrain population (#3756) --- .../minecraft/world/chunk/Chunk.java.patch | 40 +++++++++++++++---- .../common/ForgeModContainer.java | 7 ++++ .../resources/assets/forge/lang/en_US.lang | 2 + 3 files changed, 42 insertions(+), 7 deletions(-) diff --git a/patches/minecraft/net/minecraft/world/chunk/Chunk.java.patch b/patches/minecraft/net/minecraft/world/chunk/Chunk.java.patch index 616784d12..19d6a94f2 100644 --- a/patches/minecraft/net/minecraft/world/chunk/Chunk.java.patch +++ b/patches/minecraft/net/minecraft/world/chunk/Chunk.java.patch @@ -206,15 +206,27 @@ i = MathHelper.func_76125_a(i, 0, this.field_76645_j.length - 1); j = MathHelper.func_76125_a(j, 0, this.field_76645_j.length - 1); -@@ -995,6 +998,7 @@ +@@ -984,6 +987,8 @@ + + protected void func_186034_a(IChunkGenerator p_186034_1_) + { ++ if (populating && net.minecraftforge.common.ForgeModContainer.logCascadingWorldGeneration) logCascadingWorldGeneration(); ++ populating = true; + if (this.func_177419_t()) + { + if (p_186034_1_.func_185933_a(this, this.field_76635_g, this.field_76647_h)) +@@ -995,8 +1000,10 @@ { this.func_150809_p(); p_186034_1_.func_185931_b(this.field_76635_g, this.field_76647_h); + net.minecraftforge.fml.common.registry.GameRegistry.generateWorld(this.field_76635_g, this.field_76647_h, this.field_76637_e, p_186034_1_, this.field_76637_e.func_72863_F()); this.func_76630_e(); } ++ populating = false; } -@@ -1051,7 +1055,7 @@ + + public BlockPos func_177440_h(BlockPos p_177440_1_) +@@ -1051,7 +1058,7 @@ { BlockPos blockpos = (BlockPos)this.field_177447_w.poll(); @@ -223,7 +235,7 @@ { TileEntity tileentity = this.func_177422_i(blockpos); this.field_76637_e.func_175690_a(blockpos, tileentity); -@@ -1115,6 +1119,13 @@ +@@ -1115,6 +1122,13 @@ @SideOnly(Side.CLIENT) public void func_186033_a(PacketBuffer p_186033_1_, int p_186033_2_, boolean p_186033_3_) { @@ -237,7 +249,7 @@ boolean flag = this.field_76637_e.field_73011_w.func_191066_m(); for (int i = 0; i < this.field_76652_q.length; ++i) -@@ -1163,10 +1174,16 @@ +@@ -1163,10 +1177,16 @@ this.field_76646_k = true; this.func_76590_a(); @@ -254,7 +266,7 @@ } public Biome func_177411_a(BlockPos p_177411_1_, BiomeProvider p_177411_2_) -@@ -1231,13 +1248,13 @@ +@@ -1231,13 +1251,13 @@ BlockPos blockpos1 = blockpos.func_177982_a(k, (j << 4) + i1, l); boolean flag = i1 == 0 || i1 == 15 || k == 0 || k == 15 || l == 0 || l == 15; @@ -270,7 +282,7 @@ { this.field_76637_e.func_175664_x(blockpos2); } -@@ -1368,7 +1385,7 @@ +@@ -1368,7 +1388,7 @@ { blockpos$mutableblockpos.func_181079_c(blockpos$mutableblockpos.func_177958_n(), l, blockpos$mutableblockpos.func_177952_p()); @@ -279,11 +291,12 @@ { this.field_76637_e.func_175664_x(blockpos$mutableblockpos); } -@@ -1476,4 +1493,20 @@ +@@ -1476,4 +1496,34 @@ QUEUED, CHECK; } + ++ /* ======================================== FORGE START =====================================*/ + /** + * Removes the tile entity at the specified position, only if it's + * marked as invalid. @@ -298,5 +311,18 @@ + field_150816_i.remove(pos); + } + } ++ } ++ ++ private static boolean populating = false; // keep track of cascading chunk generation during chunk population ++ ++ private void logCascadingWorldGeneration() ++ { ++ net.minecraftforge.fml.common.ModContainer activeModContainer = net.minecraftforge.fml.common.Loader.instance().activeModContainer(); ++ String format = "%s loaded a new chunk (%d, %d Dimension: %d) during chunk population, causing cascading worldgen lag. Please report this to the mod's issue tracker. This log can be disabled in the Forge config."; ++ ++ if (activeModContainer == null) // vanilla minecraft has problems too (MC-114332), log it at a quieter level. ++ net.minecraftforge.fml.common.FMLLog.fine(format, "Minecraft", this.field_76635_g, this.field_76647_h, this.field_76637_e.field_73011_w.getDimension()); ++ else ++ net.minecraftforge.fml.common.FMLLog.warning(format, activeModContainer.getName(), this.field_76635_g, this.field_76647_h, this.field_76637_e.field_73011_w.getDimension()); + } } diff --git a/src/main/java/net/minecraftforge/common/ForgeModContainer.java b/src/main/java/net/minecraftforge/common/ForgeModContainer.java index 391d1c958..36c2cfd6f 100644 --- a/src/main/java/net/minecraftforge/common/ForgeModContainer.java +++ b/src/main/java/net/minecraftforge/common/ForgeModContainer.java @@ -116,6 +116,7 @@ public class ForgeModContainer extends DummyModContainer implements WorldAccessC public static long java8Reminder = 0; public static boolean disableStairSlabCulling = false; // Also known as the "DontCullStairsBecauseIUseACrappyTexturePackThatBreaksBasicBlockShapesSoICantTrustBasicBlockCulling" flag public static boolean alwaysSetupTerrainOffThread = false; // In RenderGlobal.setupTerrain, always force the chunk render updates to be queued to the thread + public static boolean logCascadingWorldGeneration = true; // see Chunk#logCascadingWorldGeneration() private static Configuration config; private static ForgeModContainer INSTANCE; @@ -274,6 +275,12 @@ public class ForgeModContainer extends DummyModContainer implements WorldAccessC prop.setLanguageKey("forge.configgui.forgeLightPipelineEnabled"); propOrder.add(prop.getName()); + prop = config.get(Configuration.CATEGORY_GENERAL, "logCascadingWorldGeneration", true, + "Log cascading chunk generation issues during terrain population."); + logCascadingWorldGeneration = prop.getBoolean(); + prop.setLanguageKey("forge.configgui.logCascadingWorldGeneration"); + propOrder.add(prop.getName()); + config.setCategoryPropertyOrder(CATEGORY_GENERAL, propOrder); propOrder = new ArrayList(); diff --git a/src/main/resources/assets/forge/lang/en_US.lang b/src/main/resources/assets/forge/lang/en_US.lang index 6447bd729..2a13f7b79 100644 --- a/src/main/resources/assets/forge/lang/en_US.lang +++ b/src/main/resources/assets/forge/lang/en_US.lang @@ -66,6 +66,8 @@ forge.configgui.maximumTicketCount.tooltip=This is the number of chunk loading r forge.configgui.maximumTicketCount=Mod Ticket Limit forge.configgui.playerTicketCount.tooltip=The number of tickets a player can be assigned instead of a mod. This is shared across all mods and it is up to the mods to use it. forge.configgui.playerTicketCount=Player Ticket Limit +forge.configgui.logCascadingWorldGeneration=Log Cascading World Gen +forge.configgui.logCascadingWorldGeneration.tooltip=Log cascading chunk generation issues during terrain population. fml.config.sample.basicDouble.tooltip=A double property with no defined bounds. fml.config.sample.basicDouble=Unbounded Double