From 7c8a981f7757a99c650dcefd9d3f479167bed7ef Mon Sep 17 00:00:00 2001 From: Antifluxfield Date: Fri, 29 Sep 2017 16:05:04 +0800 Subject: [PATCH 1/3] Logic improvement --- .../java/gregtech/common/GT_Worldgenerator.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/gregtech/common/GT_Worldgenerator.java b/src/main/java/gregtech/common/GT_Worldgenerator.java index 288540123d..0ab37ec550 100644 --- a/src/main/java/gregtech/common/GT_Worldgenerator.java +++ b/src/main/java/gregtech/common/GT_Worldgenerator.java @@ -47,14 +47,14 @@ public void generate(Random aRandom, int mX, int mZ, World aWorld, IChunkProvide Random r = new XSTR(); int xCenter = getVeinCenterCoordinate(mX), zCenter = getVeinCenterCoordinate(mZ); generateOreLayerAt(aWorld, r, mX, mZ, xCenter, zCenter); - generateOreLayerAt(aWorld, r, mX, mZ, xCenter, zCenter - 3); - generateOreLayerAt(aWorld, r, mX, mZ, xCenter, zCenter + 3); - generateOreLayerAt(aWorld, r, mX, mZ, xCenter - 3, zCenter); - generateOreLayerAt(aWorld, r, mX, mZ, xCenter + 3, zCenter); - generateOreLayerAt(aWorld, r, mX, mZ, xCenter - 3, zCenter - 3); - generateOreLayerAt(aWorld, r, mX, mZ, xCenter - 3, zCenter + 3); - generateOreLayerAt(aWorld, r, mX, mZ, xCenter + 3, zCenter - 3); - generateOreLayerAt(aWorld, r, mX, mZ, xCenter + 3, zCenter + 3); + if (mZ < zCenter) generateOreLayerAt(aWorld, r, mX, mZ, xCenter, zCenter - 3); + if (mZ > zCenter) generateOreLayerAt(aWorld, r, mX, mZ, xCenter, zCenter + 3); + if (mX < xCenter) generateOreLayerAt(aWorld, r, mX, mZ, xCenter - 3, zCenter); + if (mX > xCenter) generateOreLayerAt(aWorld, r, mX, mZ, xCenter + 3, zCenter); + if (mX < xCenter && mZ < zCenter) generateOreLayerAt(aWorld, r, mX, mZ, xCenter - 3, zCenter - 3); + if (mX < xCenter && mZ > zCenter) generateOreLayerAt(aWorld, r, mX, mZ, xCenter - 3, zCenter + 3); + if (mX > xCenter && mZ < zCenter) generateOreLayerAt(aWorld, r, mX, mZ, xCenter + 3, zCenter - 3); + if (mX > xCenter && mZ > zCenter) generateOreLayerAt(aWorld, r, mX, mZ, xCenter + 3, zCenter + 3); long seed = getRandomSeed(aWorld, mX, mZ); try { for (GT_Worldgen tWorldGen : GregTech_API.sWorldgenList) { From 97d533d309a03a9b4fab4381573e6c14144c5c5e Mon Sep 17 00:00:00 2001 From: Antifluxfield Date: Mon, 9 Oct 2017 18:12:00 +0800 Subject: [PATCH 2/3] Try to avoid triggering update when setting ore blocks --- .../common/blocks/GT_Block_Ores_Abstract.java | 3 +- .../common/blocks/GT_TileEntity_Ores.java | 34 ++++++++++++++++--- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java b/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java index 540651fd21..8915de70dc 100644 --- a/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java +++ b/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java @@ -38,6 +38,7 @@ public abstract class GT_Block_Ores_Abstract extends GT_Generic_Block implements public static boolean tHideOres; private final String aTextName = ".name"; private final String aTextSmall = "Small "; + public static Boolean avoidTileEntityCreation = false; protected GT_Block_Ores_Abstract(String aUnlocalizedName, int aOreMetaCount, boolean aHideFirstMeta, Material aMaterial) { super(GT_Item_Ores.class, aUnlocalizedName, aMaterial); @@ -177,7 +178,7 @@ public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) { } public boolean hasTileEntity(int aMeta) { - return true; + return !avoidTileEntityCreation; } public boolean renderAsNormalBlock() { diff --git a/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java b/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java index c306a566a0..70609df336 100644 --- a/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java +++ b/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java @@ -18,7 +18,12 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.Packet; import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.ChunkPosition; +import net.minecraft.world.EnumSkyBlock; import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.storage.ExtendedBlockStorage; +import net.minecraftforge.common.util.BlockSnapshot; import java.util.ArrayList; import java.util.Random; @@ -107,11 +112,30 @@ public static boolean setOreBlock(World aWorld, int aX, int aY, int aZ, int aMet } else if (!tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.stone) && !air) { return false; } - aWorld.setBlock(aX, aY, aZ, tOreBlock, getHarvestData((short) aMetaData, ((GT_Block_Ores_Abstract) tOreBlock).getBaseBlockHarvestLevel(aMetaData % 16000 / 1000)), 0); - TileEntity tTileEntity = aWorld.getTileEntity(aX, aY, aZ); - if ((tTileEntity instanceof GT_TileEntity_Ores)) { - ((GT_TileEntity_Ores) tTileEntity).mMetaData = ((short) aMetaData); - ((GT_TileEntity_Ores) tTileEntity).mNatural = true; + synchronized (((GT_Block_Ores_Abstract) tOreBlock).avoidTileEntityCreation) { + ((GT_Block_Ores_Abstract) tOreBlock).avoidTileEntityCreation = true; + int tOreBlockMeta = getHarvestData((short) aMetaData, ((GT_Block_Ores_Abstract) tOreBlock).getBaseBlockHarvestLevel(aMetaData % 16000 / 1000)); + aWorld.setBlock(aX, aY, aZ, tOreBlock, tOreBlockMeta, 0); + GT_TileEntity_Ores aTileEntity = new GT_TileEntity_Ores(); + aTileEntity.setWorldObj(aWorld); + aTileEntity.xCoord = aX; + aTileEntity.yCoord = aY; + aTileEntity.zCoord = aZ; + aTileEntity.mMetaData = ((short) aMetaData); + aTileEntity.mNatural = true; + + Chunk tChunk = aWorld.getChunkFromChunkCoords(aX >> 4, aZ >> 4); + if (tChunk != null) { + ChunkPosition tChunkPosition = new ChunkPosition(aX & 15, aY, aZ & 15); + if (tChunk.chunkTileEntityMap.containsKey(tChunkPosition)) + ((TileEntity) tChunk.chunkTileEntityMap.get(tChunkPosition)).invalidate(); + aTileEntity.validate(); + tChunk.chunkTileEntityMap.put(tChunkPosition, aTileEntity); + } + + aTileEntity.updateContainingBlockInfo(); + aTileEntity.blockMetadata = tOreBlockMeta; + ((GT_Block_Ores_Abstract) tOreBlock).avoidTileEntityCreation = false; } return true; } From 9537a0ab4232d918de3bab1c28771e90c5831d2a Mon Sep 17 00:00:00 2001 From: Antifluxfield Date: Mon, 9 Oct 2017 19:43:51 +0800 Subject: [PATCH 3/3] Improved --- .../common/blocks/GT_Block_Ores_Abstract.java | 36 ++++++++++++++++-- .../common/blocks/GT_TileEntity_Ores.java | 37 ++----------------- 2 files changed, 36 insertions(+), 37 deletions(-) diff --git a/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java b/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java index 8915de70dc..62a22e88ee 100644 --- a/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java +++ b/src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java @@ -1,5 +1,8 @@ package gregtech.common.blocks; +import java.util.ArrayList; +import java.util.List; + import cpw.mods.fml.common.Loader; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -26,11 +29,10 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; +import net.minecraft.world.ChunkPosition; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; - -import java.util.ArrayList; -import java.util.List; +import net.minecraft.world.chunk.Chunk; public abstract class GT_Block_Ores_Abstract extends GT_Generic_Block implements ITileEntityProvider { public static ThreadLocal mTemporaryTileEntity = new ThreadLocal(); @@ -38,7 +40,7 @@ public abstract class GT_Block_Ores_Abstract extends GT_Generic_Block implements public static boolean tHideOres; private final String aTextName = ".name"; private final String aTextSmall = "Small "; - public static Boolean avoidTileEntityCreation = false; + private static Boolean avoidTileEntityCreation = false; protected GT_Block_Ores_Abstract(String aUnlocalizedName, int aOreMetaCount, boolean aHideFirstMeta, Material aMaterial) { super(GT_Item_Ores.class, aUnlocalizedName, aMaterial); @@ -268,4 +270,30 @@ public void getSubBlocks(Item aItem, CreativeTabs aTab, List aList) { } } } + + public static void setOreBlock(World aWorld, int aX, int aY, int aZ, GT_Block_Ores_Abstract aOreBlock, int aOreMeta) { + synchronized (avoidTileEntityCreation) { + avoidTileEntityCreation = true; + int tOreBlockMeta = GT_TileEntity_Ores.getHarvestData((short) aOreMeta, aOreBlock.getBaseBlockHarvestLevel(aOreMeta % 16000 / 1000)); + aWorld.setBlock(aX, aY, aZ, aOreBlock, tOreBlockMeta, 0); + GT_TileEntity_Ores aTileEntity = new GT_TileEntity_Ores(); + aTileEntity.setWorldObj(aWorld); + aTileEntity.xCoord = aX; + aTileEntity.yCoord = aY; + aTileEntity.zCoord = aZ; + aTileEntity.mMetaData = ((short) aOreMeta); + aTileEntity.mNatural = true; + aTileEntity.blockType = aOreBlock; + aTileEntity.blockMetadata = tOreBlockMeta; + Chunk tChunk = aWorld.getChunkFromChunkCoords(aX >> 4, aZ >> 4); + if (tChunk != null) { + ChunkPosition tChunkPosition = new ChunkPosition(aX & 15, aY, aZ & 15); + if (tChunk.chunkTileEntityMap.containsKey(tChunkPosition)) + ((TileEntity) tChunk.chunkTileEntityMap.get(tChunkPosition)).invalidate(); + aTileEntity.validate(); + tChunk.chunkTileEntityMap.put(tChunkPosition, aTileEntity); + } + avoidTileEntityCreation = false; + } + } } \ No newline at end of file diff --git a/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java b/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java index 70609df336..cd0711aabd 100644 --- a/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java +++ b/src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java @@ -1,5 +1,8 @@ package gregtech.common.blocks; +import java.util.ArrayList; +import java.util.Random; + import gregtech.GT_Mod; import gregtech.api.GregTech_API; import gregtech.api.enums.GT_Values; @@ -18,15 +21,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.Packet; import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.ChunkPosition; -import net.minecraft.world.EnumSkyBlock; import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.chunk.storage.ExtendedBlockStorage; -import net.minecraftforge.common.util.BlockSnapshot; - -import java.util.ArrayList; -import java.util.Random; public class GT_TileEntity_Ores extends TileEntity implements ITexturedTileEntity { public short mMetaData = 0; @@ -112,31 +107,7 @@ public static boolean setOreBlock(World aWorld, int aX, int aY, int aZ, int aMet } else if (!tBlock.isReplaceableOreGen(aWorld, aX, aY, aZ, Blocks.stone) && !air) { return false; } - synchronized (((GT_Block_Ores_Abstract) tOreBlock).avoidTileEntityCreation) { - ((GT_Block_Ores_Abstract) tOreBlock).avoidTileEntityCreation = true; - int tOreBlockMeta = getHarvestData((short) aMetaData, ((GT_Block_Ores_Abstract) tOreBlock).getBaseBlockHarvestLevel(aMetaData % 16000 / 1000)); - aWorld.setBlock(aX, aY, aZ, tOreBlock, tOreBlockMeta, 0); - GT_TileEntity_Ores aTileEntity = new GT_TileEntity_Ores(); - aTileEntity.setWorldObj(aWorld); - aTileEntity.xCoord = aX; - aTileEntity.yCoord = aY; - aTileEntity.zCoord = aZ; - aTileEntity.mMetaData = ((short) aMetaData); - aTileEntity.mNatural = true; - - Chunk tChunk = aWorld.getChunkFromChunkCoords(aX >> 4, aZ >> 4); - if (tChunk != null) { - ChunkPosition tChunkPosition = new ChunkPosition(aX & 15, aY, aZ & 15); - if (tChunk.chunkTileEntityMap.containsKey(tChunkPosition)) - ((TileEntity) tChunk.chunkTileEntityMap.get(tChunkPosition)).invalidate(); - aTileEntity.validate(); - tChunk.chunkTileEntityMap.put(tChunkPosition, aTileEntity); - } - - aTileEntity.updateContainingBlockInfo(); - aTileEntity.blockMetadata = tOreBlockMeta; - ((GT_Block_Ores_Abstract) tOreBlock).avoidTileEntityCreation = false; - } + GT_Block_Ores_Abstract.setOreBlock(aWorld, aX, aY, aZ, (GT_Block_Ores_Abstract) tOreBlock, aMetaData); return true; } return false;