Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Try to avoid triggering update when setting ore blocks #1

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions src/main/java/gregtech/common/GT_Worldgenerator.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
37 changes: 33 additions & 4 deletions src/main/java/gregtech/common/blocks/GT_Block_Ores_Abstract.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -26,18 +29,18 @@
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<GT_TileEntity_Ores> mTemporaryTileEntity = new ThreadLocal();
public static boolean FUCKING_LOCK = false;
public static boolean tHideOres;
private final String aTextName = ".name";
private final String aTextSmall = "Small ";
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);
Expand Down Expand Up @@ -177,7 +180,7 @@ public boolean isNormalCube(IBlockAccess aWorld, int aX, int aY, int aZ) {
}

public boolean hasTileEntity(int aMeta) {
return true;
return !avoidTileEntityCreation;
}

public boolean renderAsNormalBlock() {
Expand Down Expand Up @@ -267,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;
}
}
}
13 changes: 4 additions & 9 deletions src/main/java/gregtech/common/blocks/GT_TileEntity_Ores.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -20,9 +23,6 @@
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;

import java.util.ArrayList;
import java.util.Random;

public class GT_TileEntity_Ores extends TileEntity implements ITexturedTileEntity {
public short mMetaData = 0;
public boolean mNatural = false;
Expand Down Expand Up @@ -107,12 +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;
}
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;
}
GT_Block_Ores_Abstract.setOreBlock(aWorld, aX, aY, aZ, (GT_Block_Ores_Abstract) tOreBlock, aMetaData);
return true;
}
return false;
Expand Down