From d2d59276cf5eb4486e275509c9d1aff8b835418a Mon Sep 17 00:00:00 2001 From: Richard Hendricks Date: Tue, 14 Nov 2017 11:03:13 -0600 Subject: Happy with orevein generation now. Working on small ores next. --- .../gregtech/common/GT_Worldgen_GT_Ore_Layer.java | 40 ++++++++--------- .../java/gregtech/common/GT_Worldgenerator.java | 50 +++++++++------------- 2 files changed, 40 insertions(+), 50 deletions(-) (limited to 'src/main/java/gregtech/common') diff --git a/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_Layer.java b/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_Layer.java index a2b9c7e98e..edb1fa020d 100644 --- a/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_Layer.java +++ b/src/main/java/gregtech/common/GT_Worldgen_GT_Ore_Layer.java @@ -97,9 +97,11 @@ public class GT_Worldgen_GT_Ore_Layer public int executeWorldgenChunkified(World aWorld, Random aRandom, String aBiome, int aDimensionType, int aChunkX, int aChunkZ, int aSeedX, int aSeedZ, IChunkProvider aChunkGenerator, IChunkProvider aChunkProvider) { if( mWorldGenName.equals("NoOresInVein") ) { + /* if (debugOrevein) GT_Log.out.println( " NoOresInVein, skipping" ); + */ // This is a special empty orevein return ORE_PLACED; } @@ -121,8 +123,8 @@ public class GT_Worldgen_GT_Ore_Layer int wXVein = aSeedX - aRandom.nextInt(mSize); // West side int eXVein = aSeedX + 16 + aRandom.nextInt(mSize); // Limit Orevein to only blocks present in current chunk - int wX = Math.max( wXVein, aChunkX + 1); - int eX = Math.min( eXVein, aChunkX + 15); + int wX = Math.max( wXVein, aChunkX); + int eX = Math.min( eXVein, aChunkX + 16); if (wX >= eX) { //No overlap between orevein and this chunk exists in X /* if (debugOrevein) { @@ -137,8 +139,8 @@ public class GT_Worldgen_GT_Ore_Layer int nZVein = aSeedZ - aRandom.nextInt(mSize); int sZVein = aSeedZ + 16 + aRandom.nextInt(mSize); - int nZ = Math.max(nZVein, aChunkZ + 1); - int sZ = Math.min(sZVein, aChunkZ + 15); + int nZ = Math.max(nZVein, aChunkZ); + int sZ = Math.min(sZVein, aChunkZ + 16); if (nZ >= sZ) { //No overlap between orevein and this chunk exists in Z /* if (debugOrevein) { @@ -149,19 +151,16 @@ public class GT_Worldgen_GT_Ore_Layer */ return NO_OVERLAP; } - if (debugOrevein) GT_Log.out.println( - "wX=" + wX + - " eX=" + eX + - " nZ=" + nZ + - " sZ=" + sZ - ); + // Adjust the density down the more chunks we are away from the oreseed. The 5 chunks surrounding the seed should always be max density due to truncation of Math.sqrt(). + int localDensity = Math.max(1, this.mDensity / ((int)Math.sqrt(2 + Math.pow(aChunkX/16 - aSeedX/16, 2) + Math.pow(aChunkZ/16 - aSeedZ/16, 2))) ); + // To allow for early exit due to no ore placed in the bottom layer (probably because we are in the sky), unroll 1 pass through the loop // Now we do bottom-level-first oregen, and work our way upwards. int level = tMinY - 1; //Dunno why, but the first layer is actually played one below tMinY. Go figure. for (int tX = wX; tX < eX; tX++) { - int placeX = Math.max(1, Math.max(MathHelper.abs_int(wX - tX), MathHelper.abs_int(eX - tX))/mDensity); + int placeX = Math.max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX))/localDensity); for (int tZ = nZ; tZ < sZ; tZ++) { - int placeZ = Math.max(1, Math.max(MathHelper.abs_int(sZ - tZ), MathHelper.abs_int(nZ - tZ))/mDensity); + int placeZ = Math.max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ))/localDensity); if ( ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mSecondaryMeta > 0) ) { if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mSecondaryMeta, false, false)) { placeCount[1]++; @@ -184,9 +183,9 @@ public class GT_Worldgen_GT_Ore_Layer } for (level = tMinY; level < (tMinY-1+3); level++) { for (int tX = wX; tX < eX; tX++) { - int placeX = Math.max(1, Math.max(MathHelper.abs_int(wX - tX), MathHelper.abs_int(eX - tX))/mDensity); + int placeX = Math.max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX))/localDensity); for (int tZ = nZ; tZ < sZ; tZ++) { - int placeZ = Math.max(1, Math.max(MathHelper.abs_int(sZ - tZ), MathHelper.abs_int(nZ - tZ))/mDensity); + int placeZ = Math.max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ))/localDensity); if ( ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mSecondaryMeta > 0) ) { if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mSecondaryMeta, false, false)) { placeCount[1]++; @@ -202,9 +201,9 @@ public class GT_Worldgen_GT_Ore_Layer // Low Middle layer is between + sporadic // level should be = tMinY-1+3 from end of for loop for (int tX = wX; tX < eX; tX++) { - int placeX = Math.max(1, Math.max(MathHelper.abs_int(wX - tX), MathHelper.abs_int(eX - tX))/mDensity); + int placeX = Math.max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX))/localDensity); for (int tZ = nZ; tZ < sZ; tZ++) { - int placeZ = Math.max(1, Math.max(MathHelper.abs_int(sZ - tZ), MathHelper.abs_int(nZ - tZ))/mDensity); + int placeZ = Math.max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ))/localDensity); if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mBetweenMeta > 0) ) { // Between are only 1 per vertical column, reduce by 1/2 to compensate if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, false)) { placeCount[2]++; @@ -219,9 +218,9 @@ public class GT_Worldgen_GT_Ore_Layer // High Middle layer is between + primary + sporadic level++; // Increment level to next layer for (int tX = wX; tX < eX; tX++) { - int placeX = Math.max(1, Math.max(MathHelper.abs_int(wX - tX), MathHelper.abs_int(eX - tX))/mDensity); + int placeX = Math.max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX))/localDensity); for (int tZ = nZ; tZ < sZ; tZ++) { - int placeZ = Math.max(1, Math.max(MathHelper.abs_int(sZ - tZ), MathHelper.abs_int(nZ - tZ))/mDensity); + int placeZ = Math.max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ))/localDensity); if ((aRandom.nextInt(2) == 0) && ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mBetweenMeta > 0) ) { // Between are only 1 per vertical column, reduce by 1/2 to compensate if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mBetweenMeta, false, false)) { placeCount[2]++; @@ -242,9 +241,9 @@ public class GT_Worldgen_GT_Ore_Layer level++; // Increment level to next layer for( ; level < (tMinY + 6); level++){ // should do two layers for (int tX = wX; tX < eX; tX++) { - int placeX = Math.max(1, Math.max(MathHelper.abs_int(wX - tX), MathHelper.abs_int(eX - tX))/mDensity); + int placeX = Math.max(1, Math.max(MathHelper.abs_int(wXVein - tX), MathHelper.abs_int(eXVein - tX))/localDensity); for (int tZ = nZ; tZ < sZ; tZ++) { - int placeZ = Math.max(1, Math.max(MathHelper.abs_int(sZ - tZ), MathHelper.abs_int(nZ - tZ))/mDensity); + int placeZ = Math.max(1, Math.max(MathHelper.abs_int(sZVein - tZ), MathHelper.abs_int(nZVein - tZ))/localDensity); if ( ((aRandom.nextInt(placeZ) == 0) || (aRandom.nextInt(placeX) == 0)) && (this.mPrimaryMeta > 0) ) { if (GT_TileEntity_Ores.setOreBlock(aWorld, tX, level, tZ, this.mPrimaryMeta, false, false)) { placeCount[0]++; @@ -267,6 +266,7 @@ public class GT_Worldgen_GT_Ore_Layer " oreseedX="+ aSeedX/16 + " oreseedZ="+ aSeedZ/16 + " cY="+tMinY+ + " locDen=" + localDensity + " Den=" + this.mDensity + " Sec="+placeCount[1]+ " Spo="+placeCount[3]+ diff --git a/src/main/java/gregtech/common/GT_Worldgenerator.java b/src/main/java/gregtech/common/GT_Worldgenerator.java index 6383ab44db..019917a148 100644 --- a/src/main/java/gregtech/common/GT_Worldgenerator.java +++ b/src/main/java/gregtech/common/GT_Worldgenerator.java @@ -147,13 +147,15 @@ implements IWorldGenerator { int noOrePlacedCount=0; String tDimensionName = ""; if (debugOrevein) { tDimensionName = this.mWorld.provider.getDimensionName(); } + /* if (debugOrevein) GT_Log.out.println( " Finding oreveins for oreveinSeed="+ oreveinSeed + " mX="+ this.mX + " mZ="+ this.mZ + " oreseedX="+ oreseedX + " oreseedZ="+ oreseedZ - ); + ); + */ // Search for a valid orevein for this dimension if( !validOreveins.containsKey(oreveinSeed) ) { @@ -171,22 +173,21 @@ implements IWorldGenerator { int placementResult = tWorldGen.executeWorldgenChunkified(this.mWorld, new XSTR( oreveinSeed ), this.mBiome, this.mDimensionType, this.mX*16, this.mZ*16, oreseedX*16, oreseedZ*16, this.mChunkGenerator, this.mChunkProvider); switch(placementResult) { case GT_Worldgen_GT_Ore_Layer.ORE_PLACED: - if (debugOrevein) GT_Log.out.println( - " Adding orevein to hash table. oreveinSeed=" + oreveinSeed + + if (debugWorldGen) GT_Log.out.println( + " Added oreveinSeed=" + oreveinSeed + " mX="+ this.mX + " mZ="+ this.mZ + " oreseedX="+ oreseedX + " oreseedZ="+ oreseedZ + - " Orevein took " + (i-1) + - " attempts to find" + - " and " + placementAttempts + - " tries to place " + - " in dimensionName=" + tDimensionName + " tries at oremix=" + i + + " placementAttempts=" + placementAttempts + + " dimensionName=" + tDimensionName ); validOreveins.put(oreveinSeed, tWorldGen); oreveinFound = true; break; case GT_Worldgen_GT_Ore_Layer.NO_ORE_IN_BOTTOM_LAYER: + placementAttempts++; // SHould do retry in this case until out of chances break; case GT_Worldgen_GT_Ore_Layer.NO_OVERLAP: @@ -195,7 +196,7 @@ implements IWorldGenerator { } break; // Try the next orevein } catch (Throwable e) { - if (debugOrevein) GT_Log.out.println( + if (debugWorldGen) GT_Log.out.println( "Exception occurred on oreVein" + tWorldGen + " oreveinSeed="+ oreveinSeed + " mX="+ this.mX + @@ -210,23 +211,21 @@ implements IWorldGenerator { } // Only add an empty orevein if are unable to place a vein at the oreseed chunk. if ((!oreveinFound) && (this.mX == oreseedX) && (this.mZ == oreseedZ)){ - if (debugOrevein) GT_Log.out.println( - " Adding empty orevein to hash table. Could not find/place valid orevein" + - " oreveinSeed="+ oreveinSeed + + if (debugWorldGen) GT_Log.out.println( + " Empty oreveinSeed="+ oreveinSeed + " mX="+ this.mX + " mZ="+ this.mZ + " oreseedX="+ oreseedX + " oreseedZ="+ oreseedZ + " tries at oremix=" + i + " placementAttempts=" + placementAttempts + - " in dimensionName=" + tDimensionName + " dimensionName=" + tDimensionName ); validOreveins.put(oreveinSeed, noOresInVein ); } } else if(oreveinPercentageRoll >= oreveinPercentage) { - if (debugOrevein) GT_Log.out.println( - " Skipped orevein in this 3x3 chunk!" + - " oreveinSeed="+ oreveinSeed + + if (debugWorldGen) GT_Log.out.println( + " Skipped oreveinSeed="+ oreveinSeed + " mX="+ this.mX + " mZ="+ this.mZ + " oreseedX=" + oreseedX + @@ -239,15 +238,9 @@ implements IWorldGenerator { } }else { // oreseed is located in the previously processed table - if (debugOrevein) GT_Log.out.println( - " Valid orevein found in hash table" + - " oreveinSeed="+ oreveinSeed + - " validOreveins.size()=" + validOreveins.size() + - " mX="+ this.mX + - " mZ="+ this.mZ + - " oreseedX="+ oreseedX + - " oreseedZ="+ oreseedZ + - " in dimensionName=" + tDimensionName + if (debugWorldGen) GT_Log.out.print( + " Valid oreveinSeed="+ oreveinSeed + + " validOreveins.size()=" + validOreveins.size() + " " ); GT_Worldgen tWorldGen = validOreveins.get(oreveinSeed); oreveinRNG.setSeed(oreveinSeed); // reset seed for RNG to only be based on oreseed X/Z @@ -276,15 +269,12 @@ implements IWorldGenerator { // Now process each oreseed vs this requested chunk for( ; seedList.size() != 0; ) { - worldGenFindVein( seedList.get(0).mX, seedList.get(0).mZ ); seedList.remove(0); } // Do leftover worldgen for this chunk (GT_Stones and GT_small_ores) -/////RAH Disable these for now -/* try { for (GT_Worldgen tWorldGen : GregTech_API.sWorldgenList) { tWorldGen.executeWorldgen(this.mWorld, this.mRandom, this.mBiome, this.mDimensionType, this.mX*16, this.mZ*16, this.mChunkGenerator, this.mChunkProvider); @@ -292,8 +282,8 @@ implements IWorldGenerator { } catch (Throwable e) { e.printStackTrace(GT_Log.err); } -*/ - /* +/* + // Old non-chunkified oregen if ((Math.abs(this.mX / 16) % 3 == 1) && (Math.abs(this.mZ / 16) % 3 == 1)) { int oreveinRNG = this.mRandom.nextInt(100); if (( oreveinRNG < oreveinPercentage) && (GT_Worldgen_GT_Ore_Layer.sWeight > 0) && (GT_Worldgen_GT_Ore_Layer.sList.size() > 0)) { -- cgit