Posted April 19, 201312 yr Sooo, jeah i am making my own "nether" dimension, it basically generates like the nether but then with grass on top and stone underneath. I have the portal to it working and the chunk + worldproviders also working, no errors. And i have it so that it doesnt keep teleporting back and forth aswell, altough i have only my stone and some ores spawning in my biome. How can i make it so that it actually generates my custom grass on top of the blocks in this nether structure? i also debugged a lot of times to get to understand the whole code a lot more, but i haven't come to the solution yet. Also i would like to know how to make it so that you can create a portal when you lit some blocks on fire. This is my code so far: (if you want me to include more files or other information plz tell) ChunkProviderMarona: package Mod_Ores; import java.util.List; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockSand; import net.minecraft.entity.EnumCreatureType; import net.minecraft.util.IProgressUpdate; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.MapGenBase; import net.minecraft.world.gen.MapGenCavesHell; import net.minecraft.world.gen.NoiseGeneratorOctaves; import net.minecraft.world.gen.feature.WorldGenFire; import net.minecraft.world.gen.feature.WorldGenFlowers; import net.minecraft.world.gen.feature.WorldGenGlowStone1; import net.minecraft.world.gen.feature.WorldGenGlowStone2; import net.minecraft.world.gen.feature.WorldGenHellLava; import net.minecraft.world.gen.feature.WorldGenMinable; import net.minecraft.world.gen.structure.MapGenNetherBridge; import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.*; import static net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.*; import static net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.*; import net.minecraftforge.common.*; import net.minecraftforge.event.Event.*; import net.minecraftforge.event.terraingen.*; public class ChunkProviderMarona implements IChunkProvider { private Random soulRNG; /** A NoiseGeneratorOctaves used in generating nether terrain */ private NoiseGeneratorOctaves netherNoiseGen1; private NoiseGeneratorOctaves netherNoiseGen2; private NoiseGeneratorOctaves netherNoiseGen3; /** Determines whether lateriteGrass or porphyry can be generated at a location */ private NoiseGeneratorOctaves lateriteGrassPorphyryNoise; /** * Determines whether something other than porphyry can be generated at a location */ private NoiseGeneratorOctaves porphyryExclusivityNoiseGen; public NoiseGeneratorOctaves netherNoiseGen6; public NoiseGeneratorOctaves netherNoiseGen7; /** The biomes that are used to generate the chunk */ private BiomeGenBase[] biomesForGeneration; /** Is the world that the nether is getting generated. */ private World worldObj; private double[] noiseField; public MapGenNetherBridge genNetherBridge = new MapGenNetherBridge(); /** * Holds the noise used to determine whether lateriteGrass can be generated at a location */ private double[] lateriteGrassNoise = new double[256]; private double[] porphyryNoise = new double[256]; /** * Holds the noise used to determine whether something other than porphyry can be generated at a location */ private double[] porphyryExclusivityNoise = new double[256]; private MapGenBase netherCaveGenerator = new MapGenCavesHell(); double[] noiseData1; double[] noiseData2; double[] noiseData3; double[] noiseData4; double[] noiseData5; private Object theBiomeDecorator; public ChunkProviderMarona(World par1World, long par2) { this.worldObj = par1World; this.soulRNG = new Random(par2); this.netherNoiseGen1 = new NoiseGeneratorOctaves(this.soulRNG, 16); this.netherNoiseGen2 = new NoiseGeneratorOctaves(this.soulRNG, 16); this.netherNoiseGen3 = new NoiseGeneratorOctaves(this.soulRNG, ; this.lateriteGrassPorphyryNoise = new NoiseGeneratorOctaves(this.soulRNG, 4); this.porphyryExclusivityNoiseGen = new NoiseGeneratorOctaves(this.soulRNG, 4); this.netherNoiseGen6 = new NoiseGeneratorOctaves(this.soulRNG, 10); this.netherNoiseGen7 = new NoiseGeneratorOctaves(this.soulRNG, 16); NoiseGeneratorOctaves[] noiseGens = {netherNoiseGen1, netherNoiseGen2, netherNoiseGen3, lateriteGrassPorphyryNoise, porphyryExclusivityNoiseGen, netherNoiseGen6, netherNoiseGen7}; noiseGens = TerrainGen.getModdedNoiseGenerators(par1World, this.soulRNG, noiseGens); this.netherNoiseGen1 = noiseGens[0]; this.netherNoiseGen2 = noiseGens[1]; this.netherNoiseGen3 = noiseGens[2]; this.lateriteGrassPorphyryNoise = noiseGens[3]; this.porphyryExclusivityNoiseGen = noiseGens[4]; this.netherNoiseGen6 = noiseGens[5]; this.netherNoiseGen7 = noiseGens[6]; } /** * Generates the shape of the terrain in the nether. */ public void generateNetherTerrain(int par1, int par2, byte[] par3ArrayOfByte) { byte b0 = 4; byte b1 = 32; int k = b0 + 1; byte b2 = 17; int l = b0 + 1; this.noiseField = this.initializeNoiseField(this.noiseField, par1 * b0, 0, par2 * b0, k, b2, l); for (int i1 = 0; i1 < b0; ++i1) { for (int j1 = 0; j1 < b0; ++j1) { for (int k1 = 0; k1 < 16; ++k1) { double d0 = 0.125D; double d1 = this.noiseField[((i1 + 0) * l + j1 + 0) * b2 + k1 + 0]; double d2 = this.noiseField[((i1 + 0) * l + j1 + 1) * b2 + k1 + 0]; double d3 = this.noiseField[((i1 + 1) * l + j1 + 0) * b2 + k1 + 0]; double d4 = this.noiseField[((i1 + 1) * l + j1 + 1) * b2 + k1 + 0]; double d5 = (this.noiseField[((i1 + 0) * l + j1 + 0) * b2 + k1 + 1] - d1) * d0; double d6 = (this.noiseField[((i1 + 0) * l + j1 + 1) * b2 + k1 + 1] - d2) * d0; double d7 = (this.noiseField[((i1 + 1) * l + j1 + 0) * b2 + k1 + 1] - d3) * d0; double d8 = (this.noiseField[((i1 + 1) * l + j1 + 1) * b2 + k1 + 1] - d4) * d0; for (int l1 = 0; l1 < 8; ++l1) { double d9 = 0.25D; double d10 = d1; double d11 = d2; double d12 = (d3 - d1) * d9; double d13 = (d4 - d2) * d9; for (int i2 = 0; i2 < 4; ++i2) { int j2 = i2 + i1 * 4 << 11 | 0 + j1 * 4 << 7 | k1 * 8 + l1; short short1 = 128; double d14 = 0.25D; double d15 = d10; double d16 = (d11 - d10) * d14; for (int k2 = 0; k2 < 4; ++k2) { int l2 = 0; if (k1 * 8 + l1 < b1) { l2 = Block.waterStill.blockID; } if (d15 > 0.0D) { l2 = mod_Ores.Porphyry.blockID; } par3ArrayOfByte[j2] = (byte)l2; j2 += short1; d15 += d16; } d10 += d12; d11 += d13; } d1 += d5; d2 += d6; d3 += d7; d4 += d8; } } } } } /** * name based on ChunkProviderGenerate */ public void replaceBlocksForBiome(int par1, int par2, byte[] par3ArrayOfByte, BiomeGenBase[] par4ArrayOfBiomeGenBase) { ChunkProviderEvent.ReplaceBiomeBlocks event = new ChunkProviderEvent.ReplaceBiomeBlocks(this, par1, par2, par3ArrayOfByte, null); MinecraftForge.EVENT_BUS.post(event); if (event.getResult() == Result.DENY) return; byte b0 = 64; double d0 = 0.03125D; this.lateriteGrassNoise = this.lateriteGrassPorphyryNoise.generateNoiseOctaves(this.lateriteGrassNoise, par1 * 16, par2 * 16, 0, 16, 16, 1, d0, d0, 1.0D); this.porphyryNoise = this.lateriteGrassPorphyryNoise.generateNoiseOctaves(this.porphyryNoise, par1 * 16, 109, par2 * 16, 16, 1, 16, d0, 1.0D, d0); this.porphyryExclusivityNoise = this.porphyryExclusivityNoiseGen.generateNoiseOctaves(this.porphyryExclusivityNoise, par1 * 16, par2 * 16, 0, 16, 16, 1, d0 * 2.0D, d0 * 2.0D, d0 * 2.0D); for (int k = 0; k < 16; ++k) { for (int l = 0; l < 16; ++l) { BiomeGenBase biomegenbase = par4ArrayOfBiomeGenBase[l + k * 16]; boolean flag = this.lateriteGrassNoise[k + l * 16] + this.soulRNG.nextDouble() * 0.2D > 0.0D; boolean flag1 = this.porphyryNoise[k + l * 16] + this.soulRNG.nextDouble() * 0.2D > 0.0D; int i1 = (int)(this.porphyryExclusivityNoise[k + l * 16] / 3.0D + 3.0D + this.soulRNG.nextDouble() * 0.25D); int j1 = -1; byte b1 = biomegenbase.topBlock; byte b2 = biomegenbase.fillerBlock; for (int k1 = 127; k1 >= 0; --k1) { int l1 = (l * 16 + k) * 128 + k1; if (k1 < 127 - this.soulRNG.nextInt(5) && k1 > 0 + this.soulRNG.nextInt(5)) { byte b3 = par3ArrayOfByte[l1]; if (b3 == 0) { j1 = -1; } else if (b3 == mod_Ores.LateriteGrass.blockID) { if (j1 == -1) { if (i1 <= 0) { b1 = 0; b2 = (byte)mod_Ores.LateriteDirt.blockID; } else if (k1 >= b0 - 4 && k1 <= b0 + 1) { b1 = biomegenbase.topBlock; b2 = biomegenbase.fillerBlock; if (flag1) { b1 = (byte)mod_Ores.Slate.blockID; } if (flag1) { b2 = (byte)mod_Ores.Porphyry.blockID; } if (flag) { b1 = (byte)mod_Ores.LateriteGrass.blockID; } if (flag) { b2 = (byte)mod_Ores.LateriteDirt.blockID; } } if (k1 < b0 && b1 == 0) { b1 = (byte)Block.waterStill.blockID; } j1 = i1; if (k1 >= b0 - 1) { par3ArrayOfByte[l1] = b1; } else { par3ArrayOfByte[l1] = b2; } } else if (j1 > 0) { --j1; par3ArrayOfByte[l1] = b2; } } } else { par3ArrayOfByte[l1] = (byte)Block.bedrock.blockID; } } } } } /** * loads or generates the chunk at the chunk location specified */ public Chunk loadChunk(int par1, int par2) { return this.provideChunk(par1, par2); } /** * Will return back a chunk, if it doesn't exist and its not a MP client it will generates all the blocks for the * specified chunk from the map seed and chunk seed */ @Override public Chunk provideChunk(int par1, int par2) { this.soulRNG.setSeed((long)par1 * 341873128712L + (long)par2 * 132897987541L); byte[] abyte = new byte[32768]; this.generateNetherTerrain(par1, par2, abyte); this.biomesForGeneration = this.worldObj.getWorldChunkManager().loadBlockGeneratorData(this.biomesForGeneration, par1 * 16, par2 * 16, 16, 16); this.replaceBlocksForBiome(par1, par2, abyte, this.biomesForGeneration); this.netherCaveGenerator.generate(this, this.worldObj, par1, par2, abyte); this.genNetherBridge.generate(this, this.worldObj, par1, par2, abyte); Chunk chunk = new Chunk(this.worldObj, abyte, par1, par2); BiomeGenBase[] abiomegenbase = this.worldObj.getWorldChunkManager().loadBlockGeneratorData((BiomeGenBase[])null, par1 * 16, par2 * 16, 16, 16); byte[] abyte1 = chunk.getBiomeArray(); for (int k = 0; k < abyte1.length; ++k) { abyte1[k] = (byte)abiomegenbase[k].biomeID; } chunk.resetRelightChecks(); return chunk; } public void decorate(World par1World, Random par2Random, int par3, int par4) { ((BiomeGenBase) this.theBiomeDecorator).decorate(par1World, par2Random, par3, par4); } /** * generates a subset of the level's terrain data. Takes 7 arguments: the [empty] noise array, the position, and the * size. */ private double[] initializeNoiseField(double[] par1ArrayOfDouble, int par2, int par3, int par4, int par5, int par6, int par7) { ChunkProviderEvent.InitNoiseField event = new ChunkProviderEvent.InitNoiseField(this, par1ArrayOfDouble, par2, par3, par4, par5, par6, par7); MinecraftForge.EVENT_BUS.post(event); if (event.getResult() == Result.DENY) return event.noisefield; if (par1ArrayOfDouble == null) { par1ArrayOfDouble = new double[par5 * par6 * par7]; } double d0 = 684.412D; double d1 = 2053.236D; this.noiseData4 = this.netherNoiseGen6.generateNoiseOctaves(this.noiseData4, par2, par3, par4, par5, 1, par7, 1.0D, 0.0D, 1.0D); this.noiseData5 = this.netherNoiseGen7.generateNoiseOctaves(this.noiseData5, par2, par3, par4, par5, 1, par7, 100.0D, 0.0D, 100.0D); this.noiseData1 = this.netherNoiseGen3.generateNoiseOctaves(this.noiseData1, par2, par3, par4, par5, par6, par7, d0 / 80.0D, d1 / 60.0D, d0 / 80.0D); this.noiseData2 = this.netherNoiseGen1.generateNoiseOctaves(this.noiseData2, par2, par3, par4, par5, par6, par7, d0, d1, d0); this.noiseData3 = this.netherNoiseGen2.generateNoiseOctaves(this.noiseData3, par2, par3, par4, par5, par6, par7, d0, d1, d0); int k1 = 0; int l1 = 0; double[] adouble1 = new double[par6]; int i2; for (i2 = 0; i2 < par6; ++i2) { adouble1[i2] = Math.cos((double)i2 * Math.PI * 6.0D / (double)par6) * 2.0D; double d2 = (double)i2; if (i2 > par6 / 2) { d2 = (double)(par6 - 1 - i2); } if (d2 < 4.0D) { d2 = 4.0D - d2; adouble1[i2] -= d2 * d2 * d2 * 10.0D; } } for (i2 = 0; i2 < par5; ++i2) { for (int j2 = 0; j2 < par7; ++j2) { double d3 = (this.noiseData4[l1] + 256.0D) / 512.0D; if (d3 > 1.0D) { d3 = 1.0D; } double d4 = 0.0D; double d5 = this.noiseData5[l1] / 8000.0D; if (d5 < 0.0D) { d5 = -d5; } d5 = d5 * 3.0D - 3.0D; if (d5 < 0.0D) { d5 /= 2.0D; if (d5 < -1.0D) { d5 = -1.0D; } d5 /= 1.4D; d5 /= 2.0D; d3 = 0.0D; } else { if (d5 > 1.0D) { d5 = 1.0D; } d5 /= 6.0D; } d3 += 0.5D; d5 = d5 * (double)par6 / 16.0D; ++l1; for (int k2 = 0; k2 < par6; ++k2) { double d6 = 0.0D; double d7 = adouble1[k2]; double d8 = this.noiseData2[k1] / 512.0D; double d9 = this.noiseData3[k1] / 512.0D; double d10 = (this.noiseData1[k1] / 10.0D + 1.0D) / 2.0D; if (d10 < 0.0D) { d6 = d8; } else if (d10 > 1.0D) { d6 = d9; } else { d6 = d8 + (d9 - d8) * d10; } d6 -= d7; double d11; if (k2 > par6 - 4) { d11 = (double)((float)(k2 - (par6 - 4)) / 3.0F); d6 = d6 * (1.0D - d11) + -10.0D * d11; } if ((double)k2 < d4) { d11 = (d4 - (double)k2) / 4.0D; if (d11 < 0.0D) { d11 = 0.0D; } if (d11 > 1.0D) { d11 = 1.0D; } d6 = d6 * (1.0D - d11) + -10.0D * d11; } par1ArrayOfDouble[k1] = d6; ++k1; } } } return par1ArrayOfDouble; } /** * Checks to see if a chunk exists at x, y */ public boolean chunkExists(int par1, int par2) { return true; } /** * Populates chunk with ores etc etc */ public void populate(IChunkProvider par1IChunkProvider, int par2, int par3) { BlockSand.fallInstantly = true; MinecraftForge.EVENT_BUS.post(new PopulateChunkEvent.Pre(par1IChunkProvider, worldObj, soulRNG, par2, par3, false)); int k = par2 * 16; int l = par3 * 16; this.genNetherBridge.generateStructuresInChunk(this.worldObj, this.soulRNG, par2, par3); int i1; int j1; int k1; int l1; boolean doGen = TerrainGen.populate(par1IChunkProvider, worldObj, soulRNG, par2, par3, false, NETHER_LAVA); for (i1 = 0; doGen && i1 < 8; ++i1) { j1 = k + this.soulRNG.nextInt(16) + 8; k1 = this.soulRNG.nextInt(120) + 4; l1 = l + this.soulRNG.nextInt(16) + 8; (new WorldGenHellLava(Block.waterMoving.blockID, false)).generate(this.worldObj, this.soulRNG, j1, k1, l1); } i1 = this.soulRNG.nextInt(this.soulRNG.nextInt(10) + 1) + 1; int i2; doGen = TerrainGen.populate(par1IChunkProvider, worldObj, soulRNG, par2, par3, false, FIRE); for (j1 = 0; doGen && j1 < i1; ++j1) { k1 = k + this.soulRNG.nextInt(16) + 8; l1 = this.soulRNG.nextInt(120) + 4; i2 = l + this.soulRNG.nextInt(16) + 8; (new WorldGenFire()).generate(this.worldObj, this.soulRNG, k1, l1, i2); } i1 = this.soulRNG.nextInt(this.soulRNG.nextInt(10) + 1); doGen = TerrainGen.populate(par1IChunkProvider, worldObj, soulRNG, par2, par3, false, GLOWSTONE); for (j1 = 0; doGen && j1 < i1; ++j1) { k1 = k + this.soulRNG.nextInt(16) + 8; l1 = this.soulRNG.nextInt(120) + 4; i2 = l + this.soulRNG.nextInt(16) + 8; (new WorldGenGlowStone1()).generate(this.worldObj, this.soulRNG, k1, l1, i2); } for (j1 = 0; doGen && j1 < 10; ++j1) { k1 = k + this.soulRNG.nextInt(16) + 8; l1 = this.soulRNG.nextInt(128); i2 = l + this.soulRNG.nextInt(16) + 8; (new WorldGenGlowStone2()).generate(this.worldObj, this.soulRNG, k1, l1, i2); } MinecraftForge.EVENT_BUS.post(new DecorateBiomeEvent.Pre(worldObj, soulRNG, k, l)); doGen = TerrainGen.decorate(worldObj, soulRNG, k, l, SHROOM); if (doGen && this.soulRNG.nextInt(1) == 0) { j1 = k + this.soulRNG.nextInt(16) + 8; k1 = this.soulRNG.nextInt(128); l1 = l + this.soulRNG.nextInt(16) + 8; (new WorldGenFlowers(Block.mushroomBrown.blockID)).generate(this.worldObj, this.soulRNG, j1, k1, l1); } if (doGen && this.soulRNG.nextInt(1) == 0) { j1 = k + this.soulRNG.nextInt(16) + 8; k1 = this.soulRNG.nextInt(128); l1 = l + this.soulRNG.nextInt(16) + 8; (new WorldGenFlowers(Block.mushroomRed.blockID)).generate(this.worldObj, this.soulRNG, j1, k1, l1); } WorldGenMinable worldgenminable = new WorldGenMinable(mod_Ores.Amazoniteore.blockID, 13, mod_Ores.Porphyry.blockID); int j2; for (k1 = 0; k1 < 16; ++k1) { l1 = k + this.soulRNG.nextInt(16); i2 = this.soulRNG.nextInt(108) + 10; j2 = l + this.soulRNG.nextInt(16); worldgenminable.generate(this.worldObj, this.soulRNG, l1, i2, j2); } for (k1 = 0; k1 < 16; ++k1) { l1 = k + this.soulRNG.nextInt(16); i2 = this.soulRNG.nextInt(108) + 10; j2 = l + this.soulRNG.nextInt(16); (new WorldGenHellLava(Block.waterMoving.blockID, true)).generate(this.worldObj, this.soulRNG, l1, i2, j2); } MinecraftForge.EVENT_BUS.post(new DecorateBiomeEvent.Post(worldObj, soulRNG, k, l)); MinecraftForge.EVENT_BUS.post(new PopulateChunkEvent.Post(par1IChunkProvider, worldObj, soulRNG, par2, par3, false)); BlockSand.fallInstantly = false; } /** * Two modes of operation: if passed true, save all Chunks in one go. If passed false, save up to two chunks. * Return true if all chunks have been saved. */ public boolean saveChunks(boolean par1, IProgressUpdate par2IProgressUpdate) { return true; } /** * Unloads chunks that are marked to be unloaded. This is not guaranteed to unload every such chunk. */ public boolean unloadQueuedChunks() { return false; } /** * Returns if the IChunkProvider supports saving. */ public boolean canSave() { return true; } /** * Converts the instance data to a readable string. */ public String makeString() { return "SoulForestLevelSource"; } /** * Returns a list of creatures of the specified type that can spawn at the given location. */ public List getPossibleCreatures(EnumCreatureType par1EnumCreatureType, int par2, int par3, int par4) { if (par1EnumCreatureType == EnumCreatureType.monster && this.genNetherBridge.hasStructureAt(par2, par3, par4)) { return this.genNetherBridge.getSpawnList(); } else { BiomeGenBase biomegenbase = this.worldObj.getBiomeGenForCoords(par2, par4); return biomegenbase == null ? null : biomegenbase.getSpawnableList(par1EnumCreatureType); } } /** * Returns the location of the closest structure of the specified type. If not found returns null. */ public ChunkPosition findClosestStructure(World par1World, String par2Str, int par3, int par4, int par5) { return null; } public int getLoadedChunkCount() { return 0; } public void recreateStructures(int par1, int par2) { this.genNetherBridge.generate(this, this.worldObj, par1, par2, (byte[])null); } } WorldProviderMarona: package Mod_Ores; import java.util.Random; import net.minecraft.world.WorldProviderHell; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.biome.WorldChunkManagerHell; import net.minecraft.world.chunk.IChunkProvider; public class WorldProviderMarona extends WorldProviderHell { //The WorldProvider covers all the basics of the dimension. Look in WorldProviderBase.java and //WorldProvider.java for all the potential qualities you can assign to your dimension. public WorldProviderMarona() { } //The save file will be called DIM65 (DIM + id number). public int getDimensionID() { return 65; } public String getDimensionName() { return "Soul Forest"; } public String getRespawnMessage() { return "Leaving Soul Forest"; } //You can use an existing WorldChunkManager, or create your own. You must create your own to //add multiple unique biomes to a dimension. public void registerWorldChunkManager() { worldChunkMgr = new WorldChunkManagerHell(BiomeGenBase.SoulForest, 1.0F, 0.0F); //Your Biome goes here this.dimensionId = mod_Ores.DimensionSoulForest; } //This is where you define your terrain generator. @Override public IChunkProvider createChunkGenerator() { return new ChunkProviderMarona(worldObj, worldObj.getSeed()); } //Note that, if you respawn in the dimension, you will end up at the coordinates of your //overworld spawn point, not at the location of your first entrance to the dimension or //something like that. Note also that beds don't work if yo u cannot respawn in the dimension. public boolean canRespawnHere() { return true; } } TeleporterSoulForest: package Mod_Ores; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.util.Direction; import net.minecraft.util.LongHashMap; import net.minecraft.util.MathHelper; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.PortalPosition; import net.minecraft.world.Teleporter; import net.minecraft.world.WorldServer; public class TeleporterSoulForest extends Teleporter { private final WorldServer worldServerInstance; /** A private Random() function in Teleporter */ private final Random random; private final LongHashMap field_85191_c = new LongHashMap(); private final List field_85190_d = new ArrayList(); public TeleporterSoulForest(WorldServer par1WorldServer) { super(par1WorldServer); this.worldServerInstance = par1WorldServer; this.random = new Random(par1WorldServer.getSeed()); } /** * Place an entity in a nearby portal, creating one if necessary. */ public void placeInPortal(Entity par1Entity, double par2, double par4, double par6, float par8) { if (this.worldServerInstance.provider.dimensionId != 1) { if (!this.placeInExistingPortal(par1Entity, par2, par4, par6, par8)) { this.makePortal(par1Entity); this.placeInExistingPortal(par1Entity, par2, par4, par6, par8); } } else { int i = MathHelper.floor_double(par1Entity.posX); int j = MathHelper.floor_double(par1Entity.posY) - 1; int k = MathHelper.floor_double(par1Entity.posZ); byte b0 = 1; byte b1 = 0; for (int l = -2; l <= 2; ++l) { for (int i1 = -2; i1 <= 2; ++i1) { for (int j1 = -1; j1 < 3; ++j1) { int k1 = i + i1 * b0 + l * b1; int l1 = j + j1; int i2 = k + i1 * b1 - l * b0; boolean flag = j1 < 0; this.worldServerInstance.setBlock(k1, l1, i2, flag ? mod_Ores.Porphyry.blockID : 0); } } } par1Entity.setLocationAndAngles((double)i, (double)j, (double)k, par1Entity.rotationYaw, 0.0F); par1Entity.motionX = par1Entity.motionY = par1Entity.motionZ = 0.0D; } } /** * Place an entity in a nearby portal which already exists. */ public boolean placeInExistingPortal(Entity par1Entity, double par2, double par4, double par6, float par8) { short short1 = 128; double d3 = -1.0D; int i = 0; int j = 0; int k = 0; int l = MathHelper.floor_double(par1Entity.posX); int i1 = MathHelper.floor_double(par1Entity.posZ); long j1 = ChunkCoordIntPair.chunkXZ2Int(l, i1); boolean flag = true; double d4; int k1; if (this.field_85191_c.containsItem(j1)) { PortalPosition portalposition = (PortalPosition)this.field_85191_c.getValueByKey(j1); d3 = 0.0D; i = portalposition.posX; j = portalposition.posY; k = portalposition.posZ; portalposition.field_85087_d = this.worldServerInstance.getTotalWorldTime(); flag = false; } else { for (k1 = l - short1; k1 <= l + short1; ++k1) { double d5 = (double)k1 + 0.5D - par1Entity.posX; for (int l1 = i1 - short1; l1 <= i1 + short1; ++l1) { double d6 = (double)l1 + 0.5D - par1Entity.posZ; for (int i2 = this.worldServerInstance.getActualHeight() - 1; i2 >= 0; --i2) { if (this.worldServerInstance.getBlockId(k1, i2, l1) == mod_Ores.Teleporter.blockID) { while (this.worldServerInstance.getBlockId(k1, i2 - 1, l1) == mod_Ores.Teleporter.blockID) { --i2; } d4 = (double)i2 + 0.5D - par1Entity.posY; double d7 = d5 * d5 + d4 * d4 + d6 * d6; if (d3 < 0.0D || d7 < d3) { d3 = d7; i = k1; j = i2; k = l1; } } } } } } if (d3 >= 0.0D) { if (flag) { this.field_85191_c.add(j1, new PortalPosition(this, i, j, k, this.worldServerInstance.getTotalWorldTime())); this.field_85190_d.add(Long.valueOf(j1)); } double d8 = (double)i + 0.5D; double d9 = (double)j + 0.5D; d4 = (double)k + 0.5D; int j2 = -1; if (this.worldServerInstance.getBlockId(i - 1, j, k) == mod_Ores.Teleporter.blockID) { j2 = 2; } if (this.worldServerInstance.getBlockId(i + 1, j, k) == mod_Ores.Teleporter.blockID) { j2 = 0; } if (this.worldServerInstance.getBlockId(i, j, k - 1) == mod_Ores.Teleporter.blockID) { j2 = 3; } if (this.worldServerInstance.getBlockId(i, j, k + 1) == mod_Ores.Teleporter.blockID) { j2 = 1; } int k2 = par1Entity.func_82148_at(); if (j2 > -1) { int l2 = Direction.field_71578_g[j2]; int i3 = Direction.offsetX[j2]; int j3 = Direction.offsetZ[j2]; int k3 = Direction.offsetX[l2]; int l3 = Direction.offsetZ[l2]; boolean flag1 = !this.worldServerInstance.isAirBlock(i + i3 + k3, j, k + j3 + l3) || !this.worldServerInstance.isAirBlock(i + i3 + k3, j + 1, k + j3 + l3); boolean flag2 = !this.worldServerInstance.isAirBlock(i + i3, j, k + j3) || !this.worldServerInstance.isAirBlock(i + i3, j + 1, k + j3); if (flag1 && flag2) { j2 = Direction.footInvisibleFaceRemap[j2]; l2 = Direction.footInvisibleFaceRemap[l2]; i3 = Direction.offsetX[j2]; j3 = Direction.offsetZ[j2]; k3 = Direction.offsetX[l2]; l3 = Direction.offsetZ[l2]; k1 = i - k3; d8 -= (double)k3; int i4 = k - l3; d4 -= (double)l3; flag1 = !this.worldServerInstance.isAirBlock(k1 + i3 + k3, j, i4 + j3 + l3) || !this.worldServerInstance.isAirBlock(k1 + i3 + k3, j + 1, i4 + j3 + l3); flag2 = !this.worldServerInstance.isAirBlock(k1 + i3, j, i4 + j3) || !this.worldServerInstance.isAirBlock(k1 + i3, j + 1, i4 + j3); } float f1 = 0.5F; float f2 = 0.5F; if (!flag1 && flag2) { f1 = 1.0F; } else if (flag1 && !flag2) { f1 = 0.0F; } else if (flag1 && flag2) { f2 = 0.0F; } d8 += (double)((float)k3 * f1 + f2 * (float)i3); d4 += (double)((float)l3 * f1 + f2 * (float)j3); float f3 = 0.0F; float f4 = 0.0F; float f5 = 0.0F; float f6 = 0.0F; if (j2 == k2) { f3 = 1.0F; f4 = 1.0F; } else if (j2 == Direction.footInvisibleFaceRemap[k2]) { f3 = -1.0F; f4 = -1.0F; } else if (j2 == Direction.enderEyeMetaToDirection[k2]) { f5 = 1.0F; f6 = -1.0F; } else { f5 = -1.0F; f6 = 1.0F; } double d10 = par1Entity.motionX; double d11 = par1Entity.motionZ; par1Entity.motionX = d10 * (double)f3 + d11 * (double)f6; par1Entity.motionZ = d10 * (double)f5 + d11 * (double)f4; par1Entity.rotationYaw = par8 - (float)(k2 * 90) + (float)(j2 * 90); } else { par1Entity.motionX = par1Entity.motionY = par1Entity.motionZ = 0.0D; } par1Entity.setLocationAndAngles(d8, d9, d4, par1Entity.rotationYaw, par1Entity.rotationPitch); return true; } else { return false; } } public boolean makePortal(Entity par1Entity) { byte b0 = 16; double d0 = -1.0D; int i = MathHelper.floor_double(par1Entity.posX); int j = MathHelper.floor_double(par1Entity.posY); int k = MathHelper.floor_double(par1Entity.posZ); int l = i; int i1 = j; int j1 = k; int k1 = 0; int l1 = this.random.nextInt(4); int i2; double d1; double d2; int j2; int k2; int l2; int i3; int j3; int k3; int l3; int i4; int j4; int k4; double d3; double d4; for (i2 = i - b0; i2 <= i + b0; ++i2) { d1 = (double)i2 + 0.5D - par1Entity.posX; for (j2 = k - b0; j2 <= k + b0; ++j2) { d2 = (double)j2 + 0.5D - par1Entity.posZ; label274: for (k2 = this.worldServerInstance.getActualHeight() - 1; k2 >= 0; --k2) { if (this.worldServerInstance.isAirBlock(i2, k2, j2)) { while (k2 > 0 && this.worldServerInstance.isAirBlock(i2, k2 - 1, j2)) { --k2; } for (i3 = l1; i3 < l1 + 4; ++i3) { l2 = i3 % 2; k3 = 1 - l2; if (i3 % 4 >= 2) { l2 = -l2; k3 = -k3; } for (j3 = 0; j3 < 3; ++j3) { for (i4 = 0; i4 < 4; ++i4) { for (l3 = -1; l3 < 4; ++l3) { k4 = i2 + (i4 - 1) * l2 + j3 * k3; j4 = k2 + l3; int l4 = j2 + (i4 - 1) * k3 - j3 * l2; if (l3 < 0 && !this.worldServerInstance.getBlockMaterial(k4, j4, l4).isSolid() || l3 >= 0 && !this.worldServerInstance.isAirBlock(k4, j4, l4)) { continue label274; } } } } d4 = (double)k2 + 0.5D - par1Entity.posY; d3 = d1 * d1 + d4 * d4 + d2 * d2; if (d0 < 0.0D || d3 < d0) { d0 = d3; l = i2; i1 = k2; j1 = j2; k1 = i3 % 4; } } } } } } if (d0 < 0.0D) { for (i2 = i - b0; i2 <= i + b0; ++i2) { d1 = (double)i2 + 0.5D - par1Entity.posX; for (j2 = k - b0; j2 <= k + b0; ++j2) { d2 = (double)j2 + 0.5D - par1Entity.posZ; label222: for (k2 = this.worldServerInstance.getActualHeight() - 1; k2 >= 0; --k2) { if (this.worldServerInstance.isAirBlock(i2, k2, j2)) { while (k2 > 0 && this.worldServerInstance.isAirBlock(i2, k2 - 1, j2)) { --k2; } for (i3 = l1; i3 < l1 + 2; ++i3) { l2 = i3 % 2; k3 = 1 - l2; for (j3 = 0; j3 < 4; ++j3) { for (i4 = -1; i4 < 4; ++i4) { l3 = i2 + (j3 - 1) * l2; k4 = k2 + i4; j4 = j2 + (j3 - 1) * k3; if (i4 < 0 && !this.worldServerInstance.getBlockMaterial(l3, k4, j4).isSolid() || i4 >= 0 && !this.worldServerInstance.isAirBlock(l3, k4, j4)) { continue label222; } } } d4 = (double)k2 + 0.5D - par1Entity.posY; d3 = d1 * d1 + d4 * d4 + d2 * d2; if (d0 < 0.0D || d3 < d0) { d0 = d3; l = i2; i1 = k2; j1 = j2; k1 = i3 % 2; } } } } } } } int i5 = l; int j5 = i1; j2 = j1; int k5 = k1 % 2; int l5 = 1 - k5; if (k1 % 4 >= 2) { k5 = -k5; l5 = -l5; } boolean flag; if (d0 < 0.0D) { if (i1 < 70) { i1 = 70; } if (i1 > this.worldServerInstance.getActualHeight() - 10) { i1 = this.worldServerInstance.getActualHeight() - 10; } j5 = i1; for (k2 = -1; k2 <= 1; ++k2) { for (i3 = 1; i3 < 3; ++i3) { for (l2 = -1; l2 < 3; ++l2) { k3 = i5 + (i3 - 1) * k5 + k2 * l5; j3 = j5 + l2; i4 = j2 + (i3 - 1) * l5 - k2 * k5; flag = l2 < 0; this.worldServerInstance.setBlock(k3, j3, i4, flag ? mod_Ores.Porphyry.blockID : 0); } } } } for (k2 = 0; k2 < 4; ++k2) { for (i3 = 0; i3 < 4; ++i3) { for (l2 = -1; l2 < 4; ++l2) { k3 = i5 + (i3 - 1) * k5; j3 = j5 + l2; i4 = j2 + (i3 - 1) * l5; flag = i3 == 0 || i3 == 3 || l2 == -1 || l2 == 3; this.worldServerInstance.setBlock(k3, j3, i4, flag ? mod_Ores.Porphyry.blockID : mod_Ores.Teleporter.blockID, 0, 2); } } for (i3 = 0; i3 < 4; ++i3) { for (l2 = -1; l2 < 4; ++l2) { k3 = i5 + (i3 - 1) * k5; j3 = j5 + l2; i4 = j2 + (i3 - 1) * l5; this.worldServerInstance.notifyBlocksOfNeighborChange(k3, j3, i4, this.worldServerInstance.getBlockId(k3, j3, i4)); } } } return true; } public void func_85189_a(long par1) { if (par1 % 100L == 0L) { Iterator iterator = this.field_85190_d.iterator(); long j = par1 - 600L; while (iterator.hasNext()) { Long olong = (Long)iterator.next(); PortalPosition portalposition = (PortalPosition)this.field_85191_c.getValueByKey(olong.longValue()); if (portalposition == null || portalposition.field_85087_d < j) { iterator.remove(); this.field_85191_c.remove(olong.longValue()); } } } } } TeleportBlockSoulForest: package Mod_Ores; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockPortal; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemMonsterPlacer; import net.minecraft.server.MinecraftServer; import net.minecraft.src.ModLoader; import net.minecraft.world.World; public class TeleportBlockSoulForest extends BlockPortal { public TeleportBlockSoulForest(int par1) { super(par1); this.setCreativeTab(CreativeTabs.tabBlock); } /** * Returns the ID of the items to drop on destruction. */ public int idDropped(int par1, Random par2Random, int par3) { return mod_Ores.Porphyry.blockID; } public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) { super.updateTick(par1World, par2, par3, par4, par5Random); } /** * Checks to see if this location is valid to create a portal and will return True if it does. Args: world, x, y, z */ @Override public boolean tryToCreatePortal(World par1World, int par2, int par3, int par4) { byte b0 = 0; byte b1 = 0; if (par1World.getBlockId(par2 - 1, par3, par4) == mod_Ores.Porphyry.blockID || par1World.getBlockId(par2 + 1, par3, par4) == mod_Ores.Porphyry.blockID) { b0 = 1; } if (par1World.getBlockId(par2, par3, par4 - 1) == mod_Ores.Porphyry.blockID || par1World.getBlockId(par2, par3, par4 + 1) == mod_Ores.Porphyry.blockID) { b1 = 1; } if (b0 == b1) { return false; } else { if (par1World.getBlockId(par2 - b0, par3, par4 - b1) == 0) { par2 -= b0; par4 -= b1; } int l; int i1; for (l = -1; l <= 2; ++l) { for (i1 = -1; i1 <= 3; ++i1) { boolean flag = l == -1 || l == 2 || i1 == -1 || i1 == 3; if (l != -1 && l != 2 || i1 != -1 && i1 != 3) { int j1 = par1World.getBlockId(par2 + b0 * l, par3 + i1, par4 + b1 * l); if (flag) { if (j1 != mod_Ores.Porphyry.blockID) { return false; } } else if (j1 != 0 && j1 != Block.fire.blockID) { return false; } } } } for (l = 0; l < 2; ++l) { for (i1 = 0; i1 < 3; ++i1) { par1World.setBlock(par2 + b0 * l, par3 + i1, par4 + b1 * l, mod_Ores.Teleporter.blockID, 0, 2); } } return true; } } /** * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity */ public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) { if ((var5.ridingEntity == null) && (var5.riddenByEntity == null) && ((var5 instanceof EntityPlayerMP))) { EntityPlayerMP var6 = (EntityPlayerMP)var5; ModLoader.getMinecraftServerInstance(); MinecraftServer mServer = MinecraftServer.getServer(); if (var6.timeUntilPortal > 0) { var6.timeUntilPortal = 10; } else if (var6.dimension != 20) { var6.timeUntilPortal = 10; var6.mcServer.getConfigurationManager().transferPlayerToDimension(var6, 20, new TeleporterSoulForest(mServer.worldServerForDimension(20))); } else { var6.timeUntilPortal = 10; var6.mcServer.getConfigurationManager().transferPlayerToDimension(var6, 0, new TeleporterSoulForest(mServer.worldServerForDimension(1))); } } } /** * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are * their own) Args: x, y, z, neighbor blockID */ public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) { byte b0 = 0; byte b1 = 1; if (par1World.getBlockId(par2 - 1, par3, par4) == mod_Ores.Teleporter.blockID || par1World.getBlockId(par2 + 1, par3, par4) == mod_Ores.Teleporter.blockID) { b0 = 1; b1 = 0; } int i1; for (i1 = par3; par1World.getBlockId(par2, i1 - 1, par4) == mod_Ores.Teleporter.blockID; --i1) { ; } if (par1World.getBlockId(par2, i1 - 1, par4) != mod_Ores.Porphyry.blockID) { par1World.setBlockToAir(par2, par3, par4); } else { int j1; for (j1 = 1; j1 < 4 && par1World.getBlockId(par2, i1 + j1, par4) == mod_Ores.Teleporter.blockID; ++j1) { ; } if (j1 == 3 && par1World.getBlockId(par2, i1 + j1, par4) == mod_Ores.Porphyry.blockID) { boolean flag = par1World.getBlockId(par2 - 1, par3, par4) == mod_Ores.Teleporter.blockID || par1World.getBlockId(par2 + 1, par3, par4) == mod_Ores.Teleporter.blockID; boolean flag1 = par1World.getBlockId(par2, par3, par4 - 1) == mod_Ores.Teleporter.blockID || par1World.getBlockId(par2, par3, par4 + 1) == mod_Ores.Teleporter.blockID; if (flag && flag1) { par1World.setBlockToAir(par2, par3, par4); } else { if ((par1World.getBlockId(par2 + b0, par3, par4 + b1) != mod_Ores.Porphyry.blockID || par1World.getBlockId(par2 - b0, par3, par4 - b1) != mod_Ores.Teleporter.blockID) && (par1World.getBlockId(par2 - b0, par3, par4 - b1) != mod_Ores.Porphyry.blockID || par1World.getBlockId(par2 + b0, par3, par4 + b1) != mod_Ores.Teleporter.blockID)) { par1World.setBlockToAir(par2, par3, par4); } } } else { par1World.setBlockToAir(par2, par3, par4); } } } public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random) { for (int l = 0; l < 4; ++l) { double d0 = (double)((float)par2 + par5Random.nextFloat()); double d1 = (double)((float)par3 + par5Random.nextFloat()); double d2 = (double)((float)par4 + par5Random.nextFloat()); double d3 = 0.0D; double d4 = 0.0D; double d5 = 0.0D; int i1 = par5Random.nextInt(2) * 2 - 1; d3 = ((double)par5Random.nextFloat() - 0.5D) * 0.5D; d4 = ((double)par5Random.nextFloat() - 0.5D) * 0.5D; d5 = ((double)par5Random.nextFloat() - 0.5D) * 0.5D; if (par1World.getBlockId(par2 - 1, par3, par4) != mod_Ores.Teleporter.blockID && par1World.getBlockId(par2 + 1, par3, par4) != mod_Ores.Teleporter.blockID) { d0 = (double)par2 + 0.5D + 0.25D * (double)i1; d3 = (double)(par5Random.nextFloat() * 2.0F * (float)i1); } else { d2 = (double)par4 + 0.5D + 0.25D * (double)i1; d5 = (double)(par5Random.nextFloat() * 2.0F * (float)i1); } par1World.spawnParticle("portal", d0, d1, d2, d3, d4, d5); } } } Thanks for taking the time to read/help! I am the creator of the Soul Forest Mod : http://www.planetminecraft.com/mod/151-soul-forest-10-ores-vines-dimension-mobs-and-more/
April 19, 201312 yr Author Sooo, jeah i am making my own "nether" dimension, it basically generates like the nether but then with grass on top and stone underneath. I have the portal to it working and the chunk + worldproviders also working, no errors. And i have it so that it doesnt keep teleporting back and forth aswell, altough i have only my stone and some ores spawning in my biome. How can i make it so that it actually generates my custom grass on top of the blocks in this nether structure? i also debugged a lot of times to get to understand the whole code a lot more, but i haven't come to the solution yet. Also i would like to know how to make it so that you can create a portal when you lit some blocks on fire. This is my code so far: (if you want me to include more files or other information plz tell) ChunkProviderMarona: package Mod_Ores; import java.util.List; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockSand; import net.minecraft.entity.EnumCreatureType; import net.minecraft.util.IProgressUpdate; import net.minecraft.world.ChunkPosition; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.MapGenBase; import net.minecraft.world.gen.MapGenCavesHell; import net.minecraft.world.gen.NoiseGeneratorOctaves; import net.minecraft.world.gen.feature.WorldGenFire; import net.minecraft.world.gen.feature.WorldGenFlowers; import net.minecraft.world.gen.feature.WorldGenGlowStone1; import net.minecraft.world.gen.feature.WorldGenGlowStone2; import net.minecraft.world.gen.feature.WorldGenHellLava; import net.minecraft.world.gen.feature.WorldGenMinable; import net.minecraft.world.gen.structure.MapGenNetherBridge; import static net.minecraftforge.event.terraingen.DecorateBiomeEvent.Decorate.EventType.*; import static net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.*; import static net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.*; import net.minecraftforge.common.*; import net.minecraftforge.event.Event.*; import net.minecraftforge.event.terraingen.*; public class ChunkProviderMarona implements IChunkProvider { private Random soulRNG; /** A NoiseGeneratorOctaves used in generating nether terrain */ private NoiseGeneratorOctaves netherNoiseGen1; private NoiseGeneratorOctaves netherNoiseGen2; private NoiseGeneratorOctaves netherNoiseGen3; /** Determines whether lateriteGrass or porphyry can be generated at a location */ private NoiseGeneratorOctaves lateriteGrassPorphyryNoise; /** * Determines whether something other than porphyry can be generated at a location */ private NoiseGeneratorOctaves porphyryExclusivityNoiseGen; public NoiseGeneratorOctaves netherNoiseGen6; public NoiseGeneratorOctaves netherNoiseGen7; /** The biomes that are used to generate the chunk */ private BiomeGenBase[] biomesForGeneration; /** Is the world that the nether is getting generated. */ private World worldObj; private double[] noiseField; public MapGenNetherBridge genNetherBridge = new MapGenNetherBridge(); /** * Holds the noise used to determine whether lateriteGrass can be generated at a location */ private double[] lateriteGrassNoise = new double[256]; private double[] porphyryNoise = new double[256]; /** * Holds the noise used to determine whether something other than porphyry can be generated at a location */ private double[] porphyryExclusivityNoise = new double[256]; private MapGenBase netherCaveGenerator = new MapGenCavesHell(); double[] noiseData1; double[] noiseData2; double[] noiseData3; double[] noiseData4; double[] noiseData5; private Object theBiomeDecorator; public ChunkProviderMarona(World par1World, long par2) { this.worldObj = par1World; this.soulRNG = new Random(par2); this.netherNoiseGen1 = new NoiseGeneratorOctaves(this.soulRNG, 16); this.netherNoiseGen2 = new NoiseGeneratorOctaves(this.soulRNG, 16); this.netherNoiseGen3 = new NoiseGeneratorOctaves(this.soulRNG, ; this.lateriteGrassPorphyryNoise = new NoiseGeneratorOctaves(this.soulRNG, 4); this.porphyryExclusivityNoiseGen = new NoiseGeneratorOctaves(this.soulRNG, 4); this.netherNoiseGen6 = new NoiseGeneratorOctaves(this.soulRNG, 10); this.netherNoiseGen7 = new NoiseGeneratorOctaves(this.soulRNG, 16); NoiseGeneratorOctaves[] noiseGens = {netherNoiseGen1, netherNoiseGen2, netherNoiseGen3, lateriteGrassPorphyryNoise, porphyryExclusivityNoiseGen, netherNoiseGen6, netherNoiseGen7}; noiseGens = TerrainGen.getModdedNoiseGenerators(par1World, this.soulRNG, noiseGens); this.netherNoiseGen1 = noiseGens[0]; this.netherNoiseGen2 = noiseGens[1]; this.netherNoiseGen3 = noiseGens[2]; this.lateriteGrassPorphyryNoise = noiseGens[3]; this.porphyryExclusivityNoiseGen = noiseGens[4]; this.netherNoiseGen6 = noiseGens[5]; this.netherNoiseGen7 = noiseGens[6]; } /** * Generates the shape of the terrain in the nether. */ public void generateNetherTerrain(int par1, int par2, byte[] par3ArrayOfByte) { byte b0 = 4; byte b1 = 32; int k = b0 + 1; byte b2 = 17; int l = b0 + 1; this.noiseField = this.initializeNoiseField(this.noiseField, par1 * b0, 0, par2 * b0, k, b2, l); for (int i1 = 0; i1 < b0; ++i1) { for (int j1 = 0; j1 < b0; ++j1) { for (int k1 = 0; k1 < 16; ++k1) { double d0 = 0.125D; double d1 = this.noiseField[((i1 + 0) * l + j1 + 0) * b2 + k1 + 0]; double d2 = this.noiseField[((i1 + 0) * l + j1 + 1) * b2 + k1 + 0]; double d3 = this.noiseField[((i1 + 1) * l + j1 + 0) * b2 + k1 + 0]; double d4 = this.noiseField[((i1 + 1) * l + j1 + 1) * b2 + k1 + 0]; double d5 = (this.noiseField[((i1 + 0) * l + j1 + 0) * b2 + k1 + 1] - d1) * d0; double d6 = (this.noiseField[((i1 + 0) * l + j1 + 1) * b2 + k1 + 1] - d2) * d0; double d7 = (this.noiseField[((i1 + 1) * l + j1 + 0) * b2 + k1 + 1] - d3) * d0; double d8 = (this.noiseField[((i1 + 1) * l + j1 + 1) * b2 + k1 + 1] - d4) * d0; for (int l1 = 0; l1 < 8; ++l1) { double d9 = 0.25D; double d10 = d1; double d11 = d2; double d12 = (d3 - d1) * d9; double d13 = (d4 - d2) * d9; for (int i2 = 0; i2 < 4; ++i2) { int j2 = i2 + i1 * 4 << 11 | 0 + j1 * 4 << 7 | k1 * 8 + l1; short short1 = 128; double d14 = 0.25D; double d15 = d10; double d16 = (d11 - d10) * d14; for (int k2 = 0; k2 < 4; ++k2) { int l2 = 0; if (k1 * 8 + l1 < b1) { l2 = Block.waterStill.blockID; } if (d15 > 0.0D) { l2 = mod_Ores.Porphyry.blockID; } par3ArrayOfByte[j2] = (byte)l2; j2 += short1; d15 += d16; } d10 += d12; d11 += d13; } d1 += d5; d2 += d6; d3 += d7; d4 += d8; } } } } } /** * name based on ChunkProviderGenerate */ public void replaceBlocksForBiome(int par1, int par2, byte[] par3ArrayOfByte, BiomeGenBase[] par4ArrayOfBiomeGenBase) { ChunkProviderEvent.ReplaceBiomeBlocks event = new ChunkProviderEvent.ReplaceBiomeBlocks(this, par1, par2, par3ArrayOfByte, null); MinecraftForge.EVENT_BUS.post(event); if (event.getResult() == Result.DENY) return; byte b0 = 64; double d0 = 0.03125D; this.lateriteGrassNoise = this.lateriteGrassPorphyryNoise.generateNoiseOctaves(this.lateriteGrassNoise, par1 * 16, par2 * 16, 0, 16, 16, 1, d0, d0, 1.0D); this.porphyryNoise = this.lateriteGrassPorphyryNoise.generateNoiseOctaves(this.porphyryNoise, par1 * 16, 109, par2 * 16, 16, 1, 16, d0, 1.0D, d0); this.porphyryExclusivityNoise = this.porphyryExclusivityNoiseGen.generateNoiseOctaves(this.porphyryExclusivityNoise, par1 * 16, par2 * 16, 0, 16, 16, 1, d0 * 2.0D, d0 * 2.0D, d0 * 2.0D); for (int k = 0; k < 16; ++k) { for (int l = 0; l < 16; ++l) { BiomeGenBase biomegenbase = par4ArrayOfBiomeGenBase[l + k * 16]; boolean flag = this.lateriteGrassNoise[k + l * 16] + this.soulRNG.nextDouble() * 0.2D > 0.0D; boolean flag1 = this.porphyryNoise[k + l * 16] + this.soulRNG.nextDouble() * 0.2D > 0.0D; int i1 = (int)(this.porphyryExclusivityNoise[k + l * 16] / 3.0D + 3.0D + this.soulRNG.nextDouble() * 0.25D); int j1 = -1; byte b1 = biomegenbase.topBlock; byte b2 = biomegenbase.fillerBlock; for (int k1 = 127; k1 >= 0; --k1) { int l1 = (l * 16 + k) * 128 + k1; if (k1 < 127 - this.soulRNG.nextInt(5) && k1 > 0 + this.soulRNG.nextInt(5)) { byte b3 = par3ArrayOfByte[l1]; if (b3 == 0) { j1 = -1; } else if (b3 == mod_Ores.LateriteGrass.blockID) { if (j1 == -1) { if (i1 <= 0) { b1 = 0; b2 = (byte)mod_Ores.LateriteDirt.blockID; } else if (k1 >= b0 - 4 && k1 <= b0 + 1) { b1 = biomegenbase.topBlock; b2 = biomegenbase.fillerBlock; if (flag1) { b1 = (byte)mod_Ores.Slate.blockID; } if (flag1) { b2 = (byte)mod_Ores.Porphyry.blockID; } if (flag) { b1 = (byte)mod_Ores.LateriteGrass.blockID; } if (flag) { b2 = (byte)mod_Ores.LateriteDirt.blockID; } } if (k1 < b0 && b1 == 0) { b1 = (byte)Block.waterStill.blockID; } j1 = i1; if (k1 >= b0 - 1) { par3ArrayOfByte[l1] = b1; } else { par3ArrayOfByte[l1] = b2; } } else if (j1 > 0) { --j1; par3ArrayOfByte[l1] = b2; } } } else { par3ArrayOfByte[l1] = (byte)Block.bedrock.blockID; } } } } } /** * loads or generates the chunk at the chunk location specified */ public Chunk loadChunk(int par1, int par2) { return this.provideChunk(par1, par2); } /** * Will return back a chunk, if it doesn't exist and its not a MP client it will generates all the blocks for the * specified chunk from the map seed and chunk seed */ @Override public Chunk provideChunk(int par1, int par2) { this.soulRNG.setSeed((long)par1 * 341873128712L + (long)par2 * 132897987541L); byte[] abyte = new byte[32768]; this.generateNetherTerrain(par1, par2, abyte); this.biomesForGeneration = this.worldObj.getWorldChunkManager().loadBlockGeneratorData(this.biomesForGeneration, par1 * 16, par2 * 16, 16, 16); this.replaceBlocksForBiome(par1, par2, abyte, this.biomesForGeneration); this.netherCaveGenerator.generate(this, this.worldObj, par1, par2, abyte); this.genNetherBridge.generate(this, this.worldObj, par1, par2, abyte); Chunk chunk = new Chunk(this.worldObj, abyte, par1, par2); BiomeGenBase[] abiomegenbase = this.worldObj.getWorldChunkManager().loadBlockGeneratorData((BiomeGenBase[])null, par1 * 16, par2 * 16, 16, 16); byte[] abyte1 = chunk.getBiomeArray(); for (int k = 0; k < abyte1.length; ++k) { abyte1[k] = (byte)abiomegenbase[k].biomeID; } chunk.resetRelightChecks(); return chunk; } public void decorate(World par1World, Random par2Random, int par3, int par4) { ((BiomeGenBase) this.theBiomeDecorator).decorate(par1World, par2Random, par3, par4); } /** * generates a subset of the level's terrain data. Takes 7 arguments: the [empty] noise array, the position, and the * size. */ private double[] initializeNoiseField(double[] par1ArrayOfDouble, int par2, int par3, int par4, int par5, int par6, int par7) { ChunkProviderEvent.InitNoiseField event = new ChunkProviderEvent.InitNoiseField(this, par1ArrayOfDouble, par2, par3, par4, par5, par6, par7); MinecraftForge.EVENT_BUS.post(event); if (event.getResult() == Result.DENY) return event.noisefield; if (par1ArrayOfDouble == null) { par1ArrayOfDouble = new double[par5 * par6 * par7]; } double d0 = 684.412D; double d1 = 2053.236D; this.noiseData4 = this.netherNoiseGen6.generateNoiseOctaves(this.noiseData4, par2, par3, par4, par5, 1, par7, 1.0D, 0.0D, 1.0D); this.noiseData5 = this.netherNoiseGen7.generateNoiseOctaves(this.noiseData5, par2, par3, par4, par5, 1, par7, 100.0D, 0.0D, 100.0D); this.noiseData1 = this.netherNoiseGen3.generateNoiseOctaves(this.noiseData1, par2, par3, par4, par5, par6, par7, d0 / 80.0D, d1 / 60.0D, d0 / 80.0D); this.noiseData2 = this.netherNoiseGen1.generateNoiseOctaves(this.noiseData2, par2, par3, par4, par5, par6, par7, d0, d1, d0); this.noiseData3 = this.netherNoiseGen2.generateNoiseOctaves(this.noiseData3, par2, par3, par4, par5, par6, par7, d0, d1, d0); int k1 = 0; int l1 = 0; double[] adouble1 = new double[par6]; int i2; for (i2 = 0; i2 < par6; ++i2) { adouble1[i2] = Math.cos((double)i2 * Math.PI * 6.0D / (double)par6) * 2.0D; double d2 = (double)i2; if (i2 > par6 / 2) { d2 = (double)(par6 - 1 - i2); } if (d2 < 4.0D) { d2 = 4.0D - d2; adouble1[i2] -= d2 * d2 * d2 * 10.0D; } } for (i2 = 0; i2 < par5; ++i2) { for (int j2 = 0; j2 < par7; ++j2) { double d3 = (this.noiseData4[l1] + 256.0D) / 512.0D; if (d3 > 1.0D) { d3 = 1.0D; } double d4 = 0.0D; double d5 = this.noiseData5[l1] / 8000.0D; if (d5 < 0.0D) { d5 = -d5; } d5 = d5 * 3.0D - 3.0D; if (d5 < 0.0D) { d5 /= 2.0D; if (d5 < -1.0D) { d5 = -1.0D; } d5 /= 1.4D; d5 /= 2.0D; d3 = 0.0D; } else { if (d5 > 1.0D) { d5 = 1.0D; } d5 /= 6.0D; } d3 += 0.5D; d5 = d5 * (double)par6 / 16.0D; ++l1; for (int k2 = 0; k2 < par6; ++k2) { double d6 = 0.0D; double d7 = adouble1[k2]; double d8 = this.noiseData2[k1] / 512.0D; double d9 = this.noiseData3[k1] / 512.0D; double d10 = (this.noiseData1[k1] / 10.0D + 1.0D) / 2.0D; if (d10 < 0.0D) { d6 = d8; } else if (d10 > 1.0D) { d6 = d9; } else { d6 = d8 + (d9 - d8) * d10; } d6 -= d7; double d11; if (k2 > par6 - 4) { d11 = (double)((float)(k2 - (par6 - 4)) / 3.0F); d6 = d6 * (1.0D - d11) + -10.0D * d11; } if ((double)k2 < d4) { d11 = (d4 - (double)k2) / 4.0D; if (d11 < 0.0D) { d11 = 0.0D; } if (d11 > 1.0D) { d11 = 1.0D; } d6 = d6 * (1.0D - d11) + -10.0D * d11; } par1ArrayOfDouble[k1] = d6; ++k1; } } } return par1ArrayOfDouble; } /** * Checks to see if a chunk exists at x, y */ public boolean chunkExists(int par1, int par2) { return true; } /** * Populates chunk with ores etc etc */ public void populate(IChunkProvider par1IChunkProvider, int par2, int par3) { BlockSand.fallInstantly = true; MinecraftForge.EVENT_BUS.post(new PopulateChunkEvent.Pre(par1IChunkProvider, worldObj, soulRNG, par2, par3, false)); int k = par2 * 16; int l = par3 * 16; this.genNetherBridge.generateStructuresInChunk(this.worldObj, this.soulRNG, par2, par3); int i1; int j1; int k1; int l1; boolean doGen = TerrainGen.populate(par1IChunkProvider, worldObj, soulRNG, par2, par3, false, NETHER_LAVA); for (i1 = 0; doGen && i1 < 8; ++i1) { j1 = k + this.soulRNG.nextInt(16) + 8; k1 = this.soulRNG.nextInt(120) + 4; l1 = l + this.soulRNG.nextInt(16) + 8; (new WorldGenHellLava(Block.waterMoving.blockID, false)).generate(this.worldObj, this.soulRNG, j1, k1, l1); } i1 = this.soulRNG.nextInt(this.soulRNG.nextInt(10) + 1) + 1; int i2; doGen = TerrainGen.populate(par1IChunkProvider, worldObj, soulRNG, par2, par3, false, FIRE); for (j1 = 0; doGen && j1 < i1; ++j1) { k1 = k + this.soulRNG.nextInt(16) + 8; l1 = this.soulRNG.nextInt(120) + 4; i2 = l + this.soulRNG.nextInt(16) + 8; (new WorldGenFire()).generate(this.worldObj, this.soulRNG, k1, l1, i2); } i1 = this.soulRNG.nextInt(this.soulRNG.nextInt(10) + 1); doGen = TerrainGen.populate(par1IChunkProvider, worldObj, soulRNG, par2, par3, false, GLOWSTONE); for (j1 = 0; doGen && j1 < i1; ++j1) { k1 = k + this.soulRNG.nextInt(16) + 8; l1 = this.soulRNG.nextInt(120) + 4; i2 = l + this.soulRNG.nextInt(16) + 8; (new WorldGenGlowStone1()).generate(this.worldObj, this.soulRNG, k1, l1, i2); } for (j1 = 0; doGen && j1 < 10; ++j1) { k1 = k + this.soulRNG.nextInt(16) + 8; l1 = this.soulRNG.nextInt(128); i2 = l + this.soulRNG.nextInt(16) + 8; (new WorldGenGlowStone2()).generate(this.worldObj, this.soulRNG, k1, l1, i2); } MinecraftForge.EVENT_BUS.post(new DecorateBiomeEvent.Pre(worldObj, soulRNG, k, l)); doGen = TerrainGen.decorate(worldObj, soulRNG, k, l, SHROOM); if (doGen && this.soulRNG.nextInt(1) == 0) { j1 = k + this.soulRNG.nextInt(16) + 8; k1 = this.soulRNG.nextInt(128); l1 = l + this.soulRNG.nextInt(16) + 8; (new WorldGenFlowers(Block.mushroomBrown.blockID)).generate(this.worldObj, this.soulRNG, j1, k1, l1); } if (doGen && this.soulRNG.nextInt(1) == 0) { j1 = k + this.soulRNG.nextInt(16) + 8; k1 = this.soulRNG.nextInt(128); l1 = l + this.soulRNG.nextInt(16) + 8; (new WorldGenFlowers(Block.mushroomRed.blockID)).generate(this.worldObj, this.soulRNG, j1, k1, l1); } WorldGenMinable worldgenminable = new WorldGenMinable(mod_Ores.Amazoniteore.blockID, 13, mod_Ores.Porphyry.blockID); int j2; for (k1 = 0; k1 < 16; ++k1) { l1 = k + this.soulRNG.nextInt(16); i2 = this.soulRNG.nextInt(108) + 10; j2 = l + this.soulRNG.nextInt(16); worldgenminable.generate(this.worldObj, this.soulRNG, l1, i2, j2); } for (k1 = 0; k1 < 16; ++k1) { l1 = k + this.soulRNG.nextInt(16); i2 = this.soulRNG.nextInt(108) + 10; j2 = l + this.soulRNG.nextInt(16); (new WorldGenHellLava(Block.waterMoving.blockID, true)).generate(this.worldObj, this.soulRNG, l1, i2, j2); } MinecraftForge.EVENT_BUS.post(new DecorateBiomeEvent.Post(worldObj, soulRNG, k, l)); MinecraftForge.EVENT_BUS.post(new PopulateChunkEvent.Post(par1IChunkProvider, worldObj, soulRNG, par2, par3, false)); BlockSand.fallInstantly = false; } /** * Two modes of operation: if passed true, save all Chunks in one go. If passed false, save up to two chunks. * Return true if all chunks have been saved. */ public boolean saveChunks(boolean par1, IProgressUpdate par2IProgressUpdate) { return true; } /** * Unloads chunks that are marked to be unloaded. This is not guaranteed to unload every such chunk. */ public boolean unloadQueuedChunks() { return false; } /** * Returns if the IChunkProvider supports saving. */ public boolean canSave() { return true; } /** * Converts the instance data to a readable string. */ public String makeString() { return "SoulForestLevelSource"; } /** * Returns a list of creatures of the specified type that can spawn at the given location. */ public List getPossibleCreatures(EnumCreatureType par1EnumCreatureType, int par2, int par3, int par4) { if (par1EnumCreatureType == EnumCreatureType.monster && this.genNetherBridge.hasStructureAt(par2, par3, par4)) { return this.genNetherBridge.getSpawnList(); } else { BiomeGenBase biomegenbase = this.worldObj.getBiomeGenForCoords(par2, par4); return biomegenbase == null ? null : biomegenbase.getSpawnableList(par1EnumCreatureType); } } /** * Returns the location of the closest structure of the specified type. If not found returns null. */ public ChunkPosition findClosestStructure(World par1World, String par2Str, int par3, int par4, int par5) { return null; } public int getLoadedChunkCount() { return 0; } public void recreateStructures(int par1, int par2) { this.genNetherBridge.generate(this, this.worldObj, par1, par2, (byte[])null); } } WorldProviderMarona: package Mod_Ores; import java.util.Random; import net.minecraft.world.WorldProviderHell; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.biome.WorldChunkManagerHell; import net.minecraft.world.chunk.IChunkProvider; public class WorldProviderMarona extends WorldProviderHell { //The WorldProvider covers all the basics of the dimension. Look in WorldProviderBase.java and //WorldProvider.java for all the potential qualities you can assign to your dimension. public WorldProviderMarona() { } //The save file will be called DIM65 (DIM + id number). public int getDimensionID() { return 65; } public String getDimensionName() { return "Soul Forest"; } public String getRespawnMessage() { return "Leaving Soul Forest"; } //You can use an existing WorldChunkManager, or create your own. You must create your own to //add multiple unique biomes to a dimension. public void registerWorldChunkManager() { worldChunkMgr = new WorldChunkManagerHell(BiomeGenBase.SoulForest, 1.0F, 0.0F); //Your Biome goes here this.dimensionId = mod_Ores.DimensionSoulForest; } //This is where you define your terrain generator. @Override public IChunkProvider createChunkGenerator() { return new ChunkProviderMarona(worldObj, worldObj.getSeed()); } //Note that, if you respawn in the dimension, you will end up at the coordinates of your //overworld spawn point, not at the location of your first entrance to the dimension or //something like that. Note also that beds don't work if yo u cannot respawn in the dimension. public boolean canRespawnHere() { return true; } } TeleporterSoulForest: package Mod_Ores; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.entity.Entity; import net.minecraft.util.Direction; import net.minecraft.util.LongHashMap; import net.minecraft.util.MathHelper; import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.PortalPosition; import net.minecraft.world.Teleporter; import net.minecraft.world.WorldServer; public class TeleporterSoulForest extends Teleporter { private final WorldServer worldServerInstance; /** A private Random() function in Teleporter */ private final Random random; private final LongHashMap field_85191_c = new LongHashMap(); private final List field_85190_d = new ArrayList(); public TeleporterSoulForest(WorldServer par1WorldServer) { super(par1WorldServer); this.worldServerInstance = par1WorldServer; this.random = new Random(par1WorldServer.getSeed()); } /** * Place an entity in a nearby portal, creating one if necessary. */ public void placeInPortal(Entity par1Entity, double par2, double par4, double par6, float par8) { if (this.worldServerInstance.provider.dimensionId != 1) { if (!this.placeInExistingPortal(par1Entity, par2, par4, par6, par8)) { this.makePortal(par1Entity); this.placeInExistingPortal(par1Entity, par2, par4, par6, par8); } } else { int i = MathHelper.floor_double(par1Entity.posX); int j = MathHelper.floor_double(par1Entity.posY) - 1; int k = MathHelper.floor_double(par1Entity.posZ); byte b0 = 1; byte b1 = 0; for (int l = -2; l <= 2; ++l) { for (int i1 = -2; i1 <= 2; ++i1) { for (int j1 = -1; j1 < 3; ++j1) { int k1 = i + i1 * b0 + l * b1; int l1 = j + j1; int i2 = k + i1 * b1 - l * b0; boolean flag = j1 < 0; this.worldServerInstance.setBlock(k1, l1, i2, flag ? mod_Ores.Porphyry.blockID : 0); } } } par1Entity.setLocationAndAngles((double)i, (double)j, (double)k, par1Entity.rotationYaw, 0.0F); par1Entity.motionX = par1Entity.motionY = par1Entity.motionZ = 0.0D; } } /** * Place an entity in a nearby portal which already exists. */ public boolean placeInExistingPortal(Entity par1Entity, double par2, double par4, double par6, float par8) { short short1 = 128; double d3 = -1.0D; int i = 0; int j = 0; int k = 0; int l = MathHelper.floor_double(par1Entity.posX); int i1 = MathHelper.floor_double(par1Entity.posZ); long j1 = ChunkCoordIntPair.chunkXZ2Int(l, i1); boolean flag = true; double d4; int k1; if (this.field_85191_c.containsItem(j1)) { PortalPosition portalposition = (PortalPosition)this.field_85191_c.getValueByKey(j1); d3 = 0.0D; i = portalposition.posX; j = portalposition.posY; k = portalposition.posZ; portalposition.field_85087_d = this.worldServerInstance.getTotalWorldTime(); flag = false; } else { for (k1 = l - short1; k1 <= l + short1; ++k1) { double d5 = (double)k1 + 0.5D - par1Entity.posX; for (int l1 = i1 - short1; l1 <= i1 + short1; ++l1) { double d6 = (double)l1 + 0.5D - par1Entity.posZ; for (int i2 = this.worldServerInstance.getActualHeight() - 1; i2 >= 0; --i2) { if (this.worldServerInstance.getBlockId(k1, i2, l1) == mod_Ores.Teleporter.blockID) { while (this.worldServerInstance.getBlockId(k1, i2 - 1, l1) == mod_Ores.Teleporter.blockID) { --i2; } d4 = (double)i2 + 0.5D - par1Entity.posY; double d7 = d5 * d5 + d4 * d4 + d6 * d6; if (d3 < 0.0D || d7 < d3) { d3 = d7; i = k1; j = i2; k = l1; } } } } } } if (d3 >= 0.0D) { if (flag) { this.field_85191_c.add(j1, new PortalPosition(this, i, j, k, this.worldServerInstance.getTotalWorldTime())); this.field_85190_d.add(Long.valueOf(j1)); } double d8 = (double)i + 0.5D; double d9 = (double)j + 0.5D; d4 = (double)k + 0.5D; int j2 = -1; if (this.worldServerInstance.getBlockId(i - 1, j, k) == mod_Ores.Teleporter.blockID) { j2 = 2; } if (this.worldServerInstance.getBlockId(i + 1, j, k) == mod_Ores.Teleporter.blockID) { j2 = 0; } if (this.worldServerInstance.getBlockId(i, j, k - 1) == mod_Ores.Teleporter.blockID) { j2 = 3; } if (this.worldServerInstance.getBlockId(i, j, k + 1) == mod_Ores.Teleporter.blockID) { j2 = 1; } int k2 = par1Entity.func_82148_at(); if (j2 > -1) { int l2 = Direction.field_71578_g[j2]; int i3 = Direction.offsetX[j2]; int j3 = Direction.offsetZ[j2]; int k3 = Direction.offsetX[l2]; int l3 = Direction.offsetZ[l2]; boolean flag1 = !this.worldServerInstance.isAirBlock(i + i3 + k3, j, k + j3 + l3) || !this.worldServerInstance.isAirBlock(i + i3 + k3, j + 1, k + j3 + l3); boolean flag2 = !this.worldServerInstance.isAirBlock(i + i3, j, k + j3) || !this.worldServerInstance.isAirBlock(i + i3, j + 1, k + j3); if (flag1 && flag2) { j2 = Direction.footInvisibleFaceRemap[j2]; l2 = Direction.footInvisibleFaceRemap[l2]; i3 = Direction.offsetX[j2]; j3 = Direction.offsetZ[j2]; k3 = Direction.offsetX[l2]; l3 = Direction.offsetZ[l2]; k1 = i - k3; d8 -= (double)k3; int i4 = k - l3; d4 -= (double)l3; flag1 = !this.worldServerInstance.isAirBlock(k1 + i3 + k3, j, i4 + j3 + l3) || !this.worldServerInstance.isAirBlock(k1 + i3 + k3, j + 1, i4 + j3 + l3); flag2 = !this.worldServerInstance.isAirBlock(k1 + i3, j, i4 + j3) || !this.worldServerInstance.isAirBlock(k1 + i3, j + 1, i4 + j3); } float f1 = 0.5F; float f2 = 0.5F; if (!flag1 && flag2) { f1 = 1.0F; } else if (flag1 && !flag2) { f1 = 0.0F; } else if (flag1 && flag2) { f2 = 0.0F; } d8 += (double)((float)k3 * f1 + f2 * (float)i3); d4 += (double)((float)l3 * f1 + f2 * (float)j3); float f3 = 0.0F; float f4 = 0.0F; float f5 = 0.0F; float f6 = 0.0F; if (j2 == k2) { f3 = 1.0F; f4 = 1.0F; } else if (j2 == Direction.footInvisibleFaceRemap[k2]) { f3 = -1.0F; f4 = -1.0F; } else if (j2 == Direction.enderEyeMetaToDirection[k2]) { f5 = 1.0F; f6 = -1.0F; } else { f5 = -1.0F; f6 = 1.0F; } double d10 = par1Entity.motionX; double d11 = par1Entity.motionZ; par1Entity.motionX = d10 * (double)f3 + d11 * (double)f6; par1Entity.motionZ = d10 * (double)f5 + d11 * (double)f4; par1Entity.rotationYaw = par8 - (float)(k2 * 90) + (float)(j2 * 90); } else { par1Entity.motionX = par1Entity.motionY = par1Entity.motionZ = 0.0D; } par1Entity.setLocationAndAngles(d8, d9, d4, par1Entity.rotationYaw, par1Entity.rotationPitch); return true; } else { return false; } } public boolean makePortal(Entity par1Entity) { byte b0 = 16; double d0 = -1.0D; int i = MathHelper.floor_double(par1Entity.posX); int j = MathHelper.floor_double(par1Entity.posY); int k = MathHelper.floor_double(par1Entity.posZ); int l = i; int i1 = j; int j1 = k; int k1 = 0; int l1 = this.random.nextInt(4); int i2; double d1; double d2; int j2; int k2; int l2; int i3; int j3; int k3; int l3; int i4; int j4; int k4; double d3; double d4; for (i2 = i - b0; i2 <= i + b0; ++i2) { d1 = (double)i2 + 0.5D - par1Entity.posX; for (j2 = k - b0; j2 <= k + b0; ++j2) { d2 = (double)j2 + 0.5D - par1Entity.posZ; label274: for (k2 = this.worldServerInstance.getActualHeight() - 1; k2 >= 0; --k2) { if (this.worldServerInstance.isAirBlock(i2, k2, j2)) { while (k2 > 0 && this.worldServerInstance.isAirBlock(i2, k2 - 1, j2)) { --k2; } for (i3 = l1; i3 < l1 + 4; ++i3) { l2 = i3 % 2; k3 = 1 - l2; if (i3 % 4 >= 2) { l2 = -l2; k3 = -k3; } for (j3 = 0; j3 < 3; ++j3) { for (i4 = 0; i4 < 4; ++i4) { for (l3 = -1; l3 < 4; ++l3) { k4 = i2 + (i4 - 1) * l2 + j3 * k3; j4 = k2 + l3; int l4 = j2 + (i4 - 1) * k3 - j3 * l2; if (l3 < 0 && !this.worldServerInstance.getBlockMaterial(k4, j4, l4).isSolid() || l3 >= 0 && !this.worldServerInstance.isAirBlock(k4, j4, l4)) { continue label274; } } } } d4 = (double)k2 + 0.5D - par1Entity.posY; d3 = d1 * d1 + d4 * d4 + d2 * d2; if (d0 < 0.0D || d3 < d0) { d0 = d3; l = i2; i1 = k2; j1 = j2; k1 = i3 % 4; } } } } } } if (d0 < 0.0D) { for (i2 = i - b0; i2 <= i + b0; ++i2) { d1 = (double)i2 + 0.5D - par1Entity.posX; for (j2 = k - b0; j2 <= k + b0; ++j2) { d2 = (double)j2 + 0.5D - par1Entity.posZ; label222: for (k2 = this.worldServerInstance.getActualHeight() - 1; k2 >= 0; --k2) { if (this.worldServerInstance.isAirBlock(i2, k2, j2)) { while (k2 > 0 && this.worldServerInstance.isAirBlock(i2, k2 - 1, j2)) { --k2; } for (i3 = l1; i3 < l1 + 2; ++i3) { l2 = i3 % 2; k3 = 1 - l2; for (j3 = 0; j3 < 4; ++j3) { for (i4 = -1; i4 < 4; ++i4) { l3 = i2 + (j3 - 1) * l2; k4 = k2 + i4; j4 = j2 + (j3 - 1) * k3; if (i4 < 0 && !this.worldServerInstance.getBlockMaterial(l3, k4, j4).isSolid() || i4 >= 0 && !this.worldServerInstance.isAirBlock(l3, k4, j4)) { continue label222; } } } d4 = (double)k2 + 0.5D - par1Entity.posY; d3 = d1 * d1 + d4 * d4 + d2 * d2; if (d0 < 0.0D || d3 < d0) { d0 = d3; l = i2; i1 = k2; j1 = j2; k1 = i3 % 2; } } } } } } } int i5 = l; int j5 = i1; j2 = j1; int k5 = k1 % 2; int l5 = 1 - k5; if (k1 % 4 >= 2) { k5 = -k5; l5 = -l5; } boolean flag; if (d0 < 0.0D) { if (i1 < 70) { i1 = 70; } if (i1 > this.worldServerInstance.getActualHeight() - 10) { i1 = this.worldServerInstance.getActualHeight() - 10; } j5 = i1; for (k2 = -1; k2 <= 1; ++k2) { for (i3 = 1; i3 < 3; ++i3) { for (l2 = -1; l2 < 3; ++l2) { k3 = i5 + (i3 - 1) * k5 + k2 * l5; j3 = j5 + l2; i4 = j2 + (i3 - 1) * l5 - k2 * k5; flag = l2 < 0; this.worldServerInstance.setBlock(k3, j3, i4, flag ? mod_Ores.Porphyry.blockID : 0); } } } } for (k2 = 0; k2 < 4; ++k2) { for (i3 = 0; i3 < 4; ++i3) { for (l2 = -1; l2 < 4; ++l2) { k3 = i5 + (i3 - 1) * k5; j3 = j5 + l2; i4 = j2 + (i3 - 1) * l5; flag = i3 == 0 || i3 == 3 || l2 == -1 || l2 == 3; this.worldServerInstance.setBlock(k3, j3, i4, flag ? mod_Ores.Porphyry.blockID : mod_Ores.Teleporter.blockID, 0, 2); } } for (i3 = 0; i3 < 4; ++i3) { for (l2 = -1; l2 < 4; ++l2) { k3 = i5 + (i3 - 1) * k5; j3 = j5 + l2; i4 = j2 + (i3 - 1) * l5; this.worldServerInstance.notifyBlocksOfNeighborChange(k3, j3, i4, this.worldServerInstance.getBlockId(k3, j3, i4)); } } } return true; } public void func_85189_a(long par1) { if (par1 % 100L == 0L) { Iterator iterator = this.field_85190_d.iterator(); long j = par1 - 600L; while (iterator.hasNext()) { Long olong = (Long)iterator.next(); PortalPosition portalposition = (PortalPosition)this.field_85191_c.getValueByKey(olong.longValue()); if (portalposition == null || portalposition.field_85087_d < j) { iterator.remove(); this.field_85191_c.remove(olong.longValue()); } } } } } TeleportBlockSoulForest: package Mod_Ores; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockPortal; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemMonsterPlacer; import net.minecraft.server.MinecraftServer; import net.minecraft.src.ModLoader; import net.minecraft.world.World; public class TeleportBlockSoulForest extends BlockPortal { public TeleportBlockSoulForest(int par1) { super(par1); this.setCreativeTab(CreativeTabs.tabBlock); } /** * Returns the ID of the items to drop on destruction. */ public int idDropped(int par1, Random par2Random, int par3) { return mod_Ores.Porphyry.blockID; } public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) { super.updateTick(par1World, par2, par3, par4, par5Random); } /** * Checks to see if this location is valid to create a portal and will return True if it does. Args: world, x, y, z */ @Override public boolean tryToCreatePortal(World par1World, int par2, int par3, int par4) { byte b0 = 0; byte b1 = 0; if (par1World.getBlockId(par2 - 1, par3, par4) == mod_Ores.Porphyry.blockID || par1World.getBlockId(par2 + 1, par3, par4) == mod_Ores.Porphyry.blockID) { b0 = 1; } if (par1World.getBlockId(par2, par3, par4 - 1) == mod_Ores.Porphyry.blockID || par1World.getBlockId(par2, par3, par4 + 1) == mod_Ores.Porphyry.blockID) { b1 = 1; } if (b0 == b1) { return false; } else { if (par1World.getBlockId(par2 - b0, par3, par4 - b1) == 0) { par2 -= b0; par4 -= b1; } int l; int i1; for (l = -1; l <= 2; ++l) { for (i1 = -1; i1 <= 3; ++i1) { boolean flag = l == -1 || l == 2 || i1 == -1 || i1 == 3; if (l != -1 && l != 2 || i1 != -1 && i1 != 3) { int j1 = par1World.getBlockId(par2 + b0 * l, par3 + i1, par4 + b1 * l); if (flag) { if (j1 != mod_Ores.Porphyry.blockID) { return false; } } else if (j1 != 0 && j1 != Block.fire.blockID) { return false; } } } } for (l = 0; l < 2; ++l) { for (i1 = 0; i1 < 3; ++i1) { par1World.setBlock(par2 + b0 * l, par3 + i1, par4 + b1 * l, mod_Ores.Teleporter.blockID, 0, 2); } } return true; } } /** * Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity */ public void onEntityCollidedWithBlock(World var1, int var2, int var3, int var4, Entity var5) { if ((var5.ridingEntity == null) && (var5.riddenByEntity == null) && ((var5 instanceof EntityPlayerMP))) { EntityPlayerMP var6 = (EntityPlayerMP)var5; ModLoader.getMinecraftServerInstance(); MinecraftServer mServer = MinecraftServer.getServer(); if (var6.timeUntilPortal > 0) { var6.timeUntilPortal = 10; } else if (var6.dimension != 20) { var6.timeUntilPortal = 10; var6.mcServer.getConfigurationManager().transferPlayerToDimension(var6, 20, new TeleporterSoulForest(mServer.worldServerForDimension(20))); } else { var6.timeUntilPortal = 10; var6.mcServer.getConfigurationManager().transferPlayerToDimension(var6, 0, new TeleporterSoulForest(mServer.worldServerForDimension(1))); } } } /** * Lets the block know when one of its neighbor changes. Doesn't know which neighbor changed (coordinates passed are * their own) Args: x, y, z, neighbor blockID */ public void onNeighborBlockChange(World par1World, int par2, int par3, int par4, int par5) { byte b0 = 0; byte b1 = 1; if (par1World.getBlockId(par2 - 1, par3, par4) == mod_Ores.Teleporter.blockID || par1World.getBlockId(par2 + 1, par3, par4) == mod_Ores.Teleporter.blockID) { b0 = 1; b1 = 0; } int i1; for (i1 = par3; par1World.getBlockId(par2, i1 - 1, par4) == mod_Ores.Teleporter.blockID; --i1) { ; } if (par1World.getBlockId(par2, i1 - 1, par4) != mod_Ores.Porphyry.blockID) { par1World.setBlockToAir(par2, par3, par4); } else { int j1; for (j1 = 1; j1 < 4 && par1World.getBlockId(par2, i1 + j1, par4) == mod_Ores.Teleporter.blockID; ++j1) { ; } if (j1 == 3 && par1World.getBlockId(par2, i1 + j1, par4) == mod_Ores.Porphyry.blockID) { boolean flag = par1World.getBlockId(par2 - 1, par3, par4) == mod_Ores.Teleporter.blockID || par1World.getBlockId(par2 + 1, par3, par4) == mod_Ores.Teleporter.blockID; boolean flag1 = par1World.getBlockId(par2, par3, par4 - 1) == mod_Ores.Teleporter.blockID || par1World.getBlockId(par2, par3, par4 + 1) == mod_Ores.Teleporter.blockID; if (flag && flag1) { par1World.setBlockToAir(par2, par3, par4); } else { if ((par1World.getBlockId(par2 + b0, par3, par4 + b1) != mod_Ores.Porphyry.blockID || par1World.getBlockId(par2 - b0, par3, par4 - b1) != mod_Ores.Teleporter.blockID) && (par1World.getBlockId(par2 - b0, par3, par4 - b1) != mod_Ores.Porphyry.blockID || par1World.getBlockId(par2 + b0, par3, par4 + b1) != mod_Ores.Teleporter.blockID)) { par1World.setBlockToAir(par2, par3, par4); } } } else { par1World.setBlockToAir(par2, par3, par4); } } } public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random) { for (int l = 0; l < 4; ++l) { double d0 = (double)((float)par2 + par5Random.nextFloat()); double d1 = (double)((float)par3 + par5Random.nextFloat()); double d2 = (double)((float)par4 + par5Random.nextFloat()); double d3 = 0.0D; double d4 = 0.0D; double d5 = 0.0D; int i1 = par5Random.nextInt(2) * 2 - 1; d3 = ((double)par5Random.nextFloat() - 0.5D) * 0.5D; d4 = ((double)par5Random.nextFloat() - 0.5D) * 0.5D; d5 = ((double)par5Random.nextFloat() - 0.5D) * 0.5D; if (par1World.getBlockId(par2 - 1, par3, par4) != mod_Ores.Teleporter.blockID && par1World.getBlockId(par2 + 1, par3, par4) != mod_Ores.Teleporter.blockID) { d0 = (double)par2 + 0.5D + 0.25D * (double)i1; d3 = (double)(par5Random.nextFloat() * 2.0F * (float)i1); } else { d2 = (double)par4 + 0.5D + 0.25D * (double)i1; d5 = (double)(par5Random.nextFloat() * 2.0F * (float)i1); } par1World.spawnParticle("portal", d0, d1, d2, d3, d4, d5); } } } Thanks for taking the time to read/help! I am the creator of the Soul Forest Mod : http://www.planetminecraft.com/mod/151-soul-forest-10-ores-vines-dimension-mobs-and-more/
April 19, 201312 yr Author Yay, i fixed one bit, i got grass and dirt now spawning in the "nether-like" generated dimension. Which is really cool, for those having the same issue heres what i did: I added (byte) to every mod.****.blockID , which worked. I am the creator of the Soul Forest Mod : http://www.planetminecraft.com/mod/151-soul-forest-10-ores-vines-dimension-mobs-and-more/
April 19, 201312 yr Author Yay, i fixed one bit, i got grass and dirt now spawning in the "nether-like" generated dimension. Which is really cool, for those having the same issue heres what i did: I added (byte) to every mod.****.blockID , which worked. I am the creator of the Soul Forest Mod : http://www.planetminecraft.com/mod/151-soul-forest-10-ores-vines-dimension-mobs-and-more/
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.