1

Custom dimension problem [Forge 1.5]

Strum355 4/20/13 8:27 am
2k
6/21/2013 7:27 pm
Hey guys,
im working on a mod with a few people and i have to make a dimension for it. Now, everything seems to be working fine, except, the instant i land in the dimension, im standing in a nether portal and get teleported to the nether: https://www.youtube.com/watch?v=AdSwYc7fLuY&list=HL1366459232&feature=mh_lolz

heres the source code:
RainbowPortal.java

package mods.splash.blocks;

import java.util.Random;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import mods.splash.TeleporterRainbow;
import mods.splash.splash;
import net.minecraft.block.Block;
import net.minecraft.block.BlockBreakable;
import net.minecraft.block.BlockPortal;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IconRegister;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemMonsterPlacer;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;


public class RainbowPortal extends BlockPortal {

public RainbowPortal(int id)
{
super(id);
this.setCreativeTab(CreativeTabs.tabBlock);
}

public void registerIcons(IconRegister par1IconRegister)
{
this.blockIcon = par1IconRegister.registerIcon("splash:RainbowPortal");
}

public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random)
{

}

public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
{
if (par5Entity.ridingEntity == null && par5Entity.riddenByEntity == null)
{
if (par5Entity instanceof EntityPlayerMP)
{
EntityPlayerMP thePlayer = (EntityPlayerMP) par5Entity;
if (par5Entity.dimension != splash.rainbowDimension)
{
thePlayer.mcServer.getConfigurationManager().transferPlayerToDimension(thePlayer, splash.rainbowDimension);
}
else
{
thePlayer.mcServer.getConfigurationManager().transferPlayerToDimension(thePlayer, 0, new TeleporterRainbow(thePlayer.mcServer.worldServerForDimension(0)));
}
}
}
}



public void randomDisplayTick(World par1World, int par2, int par3, int par4, Random par5Random)
{

}

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) == this.blockID || par1World.getBlockId(par2 + 1, par3, par4) == this.blockID)
{
b0 = 1;
b1 = 0;
}

int i1;

for (i1 = par3; par1World.getBlockId(par2, i1 - 1, par4) == this.blockID; --i1)
{
;
}

if (par1World.getBlockId(par2, i1 - 1, par4) != Block.sandStone.blockID)
{
par1World.setBlockToAir(par2, par3, par4);
}
else
{
int j1;

for (j1 = 1; j1 < 4 && par1World.getBlockId(par2, i1 + j1, par4) == this.blockID; ++j1)
{
;
}

if (j1 == 3 && par1World.getBlockId(par2, i1 + j1, par4) == Block.sandStone.blockID)
{
boolean flag = par1World.getBlockId(par2 - 1, par3, par4) == this.blockID || par1World.getBlockId(par2 + 1, par3, par4) == this.blockID;
boolean flag1 = par1World.getBlockId(par2, par3, par4 - 1) == this.blockID || par1World.getBlockId(par2, par3, par4 + 1) == this.blockID;

if (flag && flag1)
{
par1World.setBlockToAir(par2, par3, par4);
}
else
{
if ((par1World.getBlockId(par2 + b0, par3, par4 + b1) != Block.sandStone.blockID || par1World.getBlockId(par2 - b0, par3, par4 - b1) != this.blockID) && (par1World.getBlockId(par2 - b0, par3, par4 - b1) != Block.sandStone.blockID || par1World.getBlockId(par2 + b0, par3, par4 + b1) != this.blockID))
{
par1World.setBlockToAir(par2, par3, par4);
}
}
}
else
{
par1World.setBlockToAir(par2, par3, par4);
}
}
}

}


WorldProviderRainbow.java

package mods.splash;

import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.ChunkCoordinates;
import net.minecraft.world.EnumGameType;
import net.minecraft.world.WorldProvider;
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 WorldProviderRainbow extends WorldProvider{

public String getDimensionName()
{
return "Rainbow Land";
}

public boolean canRespawnHere()
{
return false;
}

public void registerWorldChunkManager()
{
this.worldChunkMgr = new WorldChunkManagerHell(splash.rainbowLand, 0.8F, 0.1F);
}

@Override
public IChunkProvider createChunkGenerator()
{
return new ChunkProviderRainbow(worldObj, worldObj.getSeed(), true);
}

public float getCloudHeight()
{
return 200.0F;
}

public String getWelcomeMessage()
{
return "Entering the Rainbow Land";
}

public String getDepartureMessage()
{
return "Leaving the Rainbow Land";
}

public boolean canCoordinateBeSpawn(int par1, int par2)
{
return false;
}

public ChunkCoordinates getEntrancePortalLocation()
{
return null;
}

public void setDimension(int dim)
{
this.dimensionId = dim;
}

public String getSaveFolder()
{
return (dimensionId == 0 ? null : "DIM" + dimensionId);
}

public double getMovementFactor()
{

return 1.0;
}

public ChunkCoordinates getRandomizedSpawnPoint()
{
ChunkCoordinates chunkcoordinates = new ChunkCoordinates(this.worldObj.getSpawnPoint());

boolean isAdventure = worldObj.getWorldInfo().getGameType() == EnumGameType.ADVENTURE;
int spawnFuzz = terrainType.getSpawnFuzz();
int spawnFuzzHalf = spawnFuzz / 2;

if (!hasNoSky && !isAdventure)
{
chunkcoordinates.posX += this.worldObj.rand.nextInt(spawnFuzz) - spawnFuzzHalf;
chunkcoordinates.posZ += this.worldObj.rand.nextInt(spawnFuzz) - spawnFuzzHalf;
chunkcoordinates.posY = this.worldObj.getTopSolidOrLiquidBlock(chunkcoordinates.posX, chunkcoordinates.posZ);
}

return chunkcoordinates;
}

public int getRespawnDimension(EntityPlayerMP player){
return 25;
}


}


WorldChunkManagerRainbow.java

package mods.splash;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.world.ChunkPosition;
import net.minecraft.world.World;
import net.minecraft.world.WorldType;
import net.minecraft.world.biome.BiomeCache;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.biome.WorldChunkManager;
import net.minecraft.world.gen.layer.GenLayer;
import net.minecraft.world.gen.layer.IntCache;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.terraingen.WorldTypeEvent;

public class WorldChunkManagerRainbow extends WorldChunkManager
{
public static ArrayList<BiomeGenBase> allowedBiomes = new ArrayList<BiomeGenBase>(Arrays.asList(splash.rainbowLand));
public static BiomeGenBase[] generateBiomes = new BiomeGenBase[]{splash.rainbowLand};
private GenLayer genBiomes;

/** A GenLayer containing the indices into BiomeGenBase.biomeList[] */
private GenLayer biomeIndexLayer;

/** The BiomeCache object for this world. */
private BiomeCache biomeCache;

/** A list of biomes that the player can spawn in. */
private List biomesToSpawnIn;

protected WorldChunkManagerRainbow()
{
this.biomeCache = new BiomeCache(this);
this.biomesToSpawnIn = new ArrayList();
this.biomesToSpawnIn.addAll(allowedBiomes);
}

public WorldChunkManagerRainbow(boolean cons)
{
//Nothing
}

public WorldChunkManagerRainbow(long par1, WorldType par3WorldType)
{
this();
GenLayer[] agenlayer = GenLayer.initializeAllBiomeGenerators(par1, par3WorldType);
agenlayer = getModdedBiomeGenerators(par3WorldType, par1, agenlayer);
this.genBiomes = agenlayer[0];
this.biomeIndexLayer = agenlayer[1];
}

public WorldChunkManagerRainbow(World par1World)
{
this(par1World.getSeed(), par1World.getWorldInfo().getTerrainType());
}

/**
* Gets the list of valid biomes for the player to spawn in.
*/
@Override
public List getBiomesToSpawnIn()
{
return this.biomesToSpawnIn;
}

/**
* Returns the BiomeGenBase related to the x, z position on the world.
*/
@Override
public BiomeGenBase getBiomeGenAt(int par1, int par2)
{
return this.biomeCache.getBiomeGenAt(par1, par2);
}

/**
* Returns a list of rainfall values for the specified blocks. Args: listToReuse, x, z, width, length.
*/
@Override
public float[] getRainfall(float[] par1ArrayOfFloat, int par2, int par3, int par4, int par5)
{
IntCache.resetIntCache();

if (par1ArrayOfFloat == null || par1ArrayOfFloat.length < par4 * par5)
{
par1ArrayOfFloat = new float[par4 * par5];
}

int[] aint = this.biomeIndexLayer.getInts(par2, par3, par4, par5);

for (int i1 = 0; i1 < par4 * par5; ++i1)
{
float f = (float)BiomeGenBase.biomeList[aint[i1]].getIntRainfall() / 65536.0F;

if (f > 1.0F)
{
f = 1.0F;
}

par1ArrayOfFloat[i1] = f;
}

return par1ArrayOfFloat;
}

@SideOnly(Side.CLIENT)

/**
* Return an adjusted version of a given temperature based on the y height
*/
@Override
public float getTemperatureAtHeight(float par1, int par2)
{
return par1;
}

/**
* Returns a list of temperatures to use for the specified blocks. Args: listToReuse, x, y, width, length
*/
@Override
public float[] getTemperatures(float[] par1ArrayOfFloat, int par2, int par3, int par4, int par5)
{
IntCache.resetIntCache();

if (par1ArrayOfFloat == null || par1ArrayOfFloat.length < par4 * par5)
{
par1ArrayOfFloat = new float[par4 * par5];
}

int[] aint = this.biomeIndexLayer.getInts(par2, par3, par4, par5);

for (int i1 = 0; i1 < par4 * par5; ++i1)
{
float f = (float)BiomeGenBase.biomeList[aint[i1]].getIntTemperature() / 65536.0F;

if (f > 1.0F)
{
f = 1.0F;
}

par1ArrayOfFloat[i1] = f;
}

return par1ArrayOfFloat;
}

/**
* Returns an array of biomes for the location input.
*/
@Override
public BiomeGenBase[] getBiomesForGeneration(BiomeGenBase[] par1ArrayOfBiomeGenBase, int par2, int par3, int par4, int par5)
{
IntCache.resetIntCache();

if (par1ArrayOfBiomeGenBase == null || par1ArrayOfBiomeGenBase.length < par4 * par5)
{
par1ArrayOfBiomeGenBase = new BiomeGenBase[par4 * par5];
}

int[] aint = this.genBiomes.getInts(par2, par3, par4, par5);

for (int i1 = 0; i1 < par4 * par5; ++i1)
{
par1ArrayOfBiomeGenBase[i1] = BiomeGenBase.biomeList[aint[i1]];
}

return par1ArrayOfBiomeGenBase;
}

/**
* Returns biomes to use for the blocks and loads the other data like temperature and humidity onto the
* WorldChunkManager Args: oldBiomeList, x, z, width, depth
*/
@Override
public BiomeGenBase[] loadBlockGeneratorData(BiomeGenBase[] par1ArrayOfBiomeGenBase, int par2, int par3, int par4, int par5)
{
return this.getBiomeGenAt(par1ArrayOfBiomeGenBase, par2, par3, par4, par5, true);
}

/**
* Return a list of biomes for the specified blocks. Args: listToReuse, x, y, width, length, cacheFlag (if false,
* don't check biomeCache to avoid infinite loop in BiomeCacheBlock)
*/
@Override
public BiomeGenBase[] getBiomeGenAt(BiomeGenBase[] par1ArrayOfBiomeGenBase, int par2, int par3, int par4, int par5, boolean par6)
{
IntCache.resetIntCache();

if (par1ArrayOfBiomeGenBase == null || par1ArrayOfBiomeGenBase.length < par4 * par5)
{
par1ArrayOfBiomeGenBase = new BiomeGenBase[par4 * par5];
}

if (par6 && par4 == 16 && par5 == 16 && (par2 & 15) == 0 && (par3 & 15) == 0)
{
BiomeGenBase[] abiomegenbase1 = this.biomeCache.getCachedBiomes(par2, par3);
System.arraycopy(abiomegenbase1, 0, par1ArrayOfBiomeGenBase, 0, par4 * par5);
return par1ArrayOfBiomeGenBase;
}
else
{
int[] aint = this.biomeIndexLayer.getInts(par2, par3, par4, par5);

for (int i1 = 0; i1 < par4 * par5; ++i1)
{
par1ArrayOfBiomeGenBase[i1] = BiomeGenBase.biomeList[aint[i1]];
}

return par1ArrayOfBiomeGenBase;
}
}

/**
* checks given Chunk's Biomes against List of allowed ones
*/
@Override
public boolean areBiomesViable(int par1, int par2, int par3, List par4List)
{
IntCache.resetIntCache();
int l = par1 - par3 >> 2;
int i1 = par2 - par3 >> 2;
int j1 = par1 + par3 >> 2;
int k1 = par2 + par3 >> 2;
int l1 = j1 - l + 1;
int i2 = k1 - i1 + 1;
int[] aint = this.genBiomes.getInts(l, i1, l1, i2);

for (int j2 = 0; j2 < l1 * i2; ++j2)
{
BiomeGenBase biomegenbase = BiomeGenBase.biomeList[aint[j2]];

if (!par4List.contains(biomegenbase))
{
return false;
}
}

return true;
}

/**
* Finds a valid position within a range, that is in one of the listed biomes. Searches {par1,par2} +-par3 blocks.
* Strongly favors positive y positions.
*/
@Override
public ChunkPosition findBiomePosition(int par1, int par2, int par3, List par4List, Random par5Random)
{
IntCache.resetIntCache();
int l = par1 - par3 >> 2;
int i1 = par2 - par3 >> 2;
int j1 = par1 + par3 >> 2;
int k1 = par2 + par3 >> 2;
int l1 = j1 - l + 1;
int i2 = k1 - i1 + 1;
int[] aint = this.genBiomes.getInts(l, i1, l1, i2);
ChunkPosition chunkposition = null;
int j2 = 0;

for (int k2 = 0; k2 < l1 * i2; ++k2)
{
int l2 = l + k2 % l1 << 2;
int i3 = i1 + k2 / l1 << 2;
BiomeGenBase biomegenbase = BiomeGenBase.biomeList[aint[k2]];

if (par4List.contains(biomegenbase) && (chunkposition == null || par5Random.nextInt(j2 + 1) == 0))
{
chunkposition = new ChunkPosition(l2, 0, i3);
++j2;
}
}

return chunkposition;
}

/**
* Calls the WorldChunkManager's biomeCache.cleanupCache()
*/
@Override
public void cleanupCache()
{
this.biomeCache.cleanupCache();
}
@Override
public GenLayer[] getModdedBiomeGenerators(WorldType worldType, long seed, GenLayer[] original)
{
WorldTypeEvent.InitBiomeGens event = new WorldTypeEvent.InitBiomeGens(worldType, seed, original);
MinecraftForge.TERRAIN_GEN_BUS.post(event);
return event.newBiomeGens;
}
}


TeleporterRainbow.java
package mods.splash;

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 TeleporterRainbow extends Teleporter
{
private final WorldServer worldServerInstance;
private final Random random;
private final LongHashMap field_85191_c = new LongHashMap();
private final List field_85190_d = new ArrayList();

public TeleporterRainbow(WorldServer par1WorldServer)
{
super(par1WorldServer);
this.worldServerInstance = par1WorldServer;
this.random = new Random(par1WorldServer.getSeed());
}




@Override
public void func_85189_a(long par1)
{
if (par1 % 100L == 0L)
{
Iterator var3 = this.field_85190_d.iterator();
long var4 = par1 - 600L;

while (var3.hasNext())
{
Long var6 = (Long) var3.next();
PortalPosition var7 = (PortalPosition) this.field_85191_c.getValueByKey(var6.longValue());

if (var7 == null || var7.field_85087_d < var4)
{
var3.remove();
this.field_85191_c.remove(var6.longValue());
}
}
}
}

}


ChunkProviderRainbow.java

package mods.splash;

import java.util.List;

import net.minecraft.entity.EnumCreatureType;
import net.minecraft.util.IProgressUpdate;
import net.minecraft.world.ChunkPosition;
import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.IChunkProvider;
import static net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.CAVE;
import static net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.MINESHAFT;
import static net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.RAVINE;
import static net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.SCATTERED_FEATURE;
import static net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.STRONGHOLD;
import static net.minecraftforge.event.terraingen.InitMapGenEvent.EventType.VILLAGE;
import static net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.DUNGEON;
import static net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.ICE;
import static net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.LAKE;
import static net.minecraftforge.event.terraingen.PopulateChunkEvent.Populate.EventType.LAVA;

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.util.MathHelper;
import net.minecraft.world.ChunkPosition;
import net.minecraft.world.SpawnerAnimals;
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.MapGenCaves;
import net.minecraft.world.gen.MapGenRavine;
import net.minecraft.world.gen.NoiseGeneratorOctaves;
import net.minecraft.world.gen.feature.MapGenScatteredFeature;
import net.minecraft.world.gen.feature.WorldGenDungeons;
import net.minecraft.world.gen.feature.WorldGenLakes;
import net.minecraft.world.gen.structure.MapGenMineshaft;
import net.minecraft.world.gen.structure.MapGenStronghold;
import net.minecraft.world.gen.structure.MapGenVillage;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.Event.Result;
import net.minecraftforge.event.terraingen.ChunkProviderEvent;
import net.minecraftforge.event.terraingen.PopulateChunkEvent;
import net.minecraftforge.event.terraingen.TerrainGen;

public class ChunkProviderRainbow implements IChunkProvider {

/** RNG. */
private Random rand;

/** A NoiseGeneratorOctaves used in generating terrain */
private NoiseGeneratorOctaves noiseGen1;

/** A NoiseGeneratorOctaves used in generating terrain */
private NoiseGeneratorOctaves noiseGen2;

/** A NoiseGeneratorOctaves used in generating terrain */
private NoiseGeneratorOctaves noiseGen3;

/** A NoiseGeneratorOctaves used in generating terrain */
private NoiseGeneratorOctaves noiseGen4;

/** A NoiseGeneratorOctaves used in generating terrain */
public NoiseGeneratorOctaves noiseGen5;

/** A NoiseGeneratorOctaves used in generating terrain */
public NoiseGeneratorOctaves noiseGen6;
public NoiseGeneratorOctaves mobSpawnerNoise;

/** Reference to the World object. */
private World worldObj;

/** are map structures going to be generated (e.g. strongholds) */
private final boolean mapFeaturesEnabled;

/** Holds the overall noise array used in chunk generation */
private double[] noiseArray;
private double[] stoneNoise = new double[256];
private MapGenBase caveGenerator = new MapGenCaves();

/** Holds Stronghold Generator */
private MapGenStronghold strongholdGenerator = new MapGenStronghold();

/** Holds Village Generator */
private MapGenVillage villageGenerator = new MapGenVillage();

/** Holds Mineshaft Generator */
private MapGenMineshaft mineshaftGenerator = new MapGenMineshaft();
private MapGenScatteredFeature scatteredFeatureGenerator = new MapGenScatteredFeature();

/** Holds ravine generator */
private MapGenBase ravineGenerator = new MapGenRavine();

/** The biomes that are used to generate the chunk */
private BiomeGenBase[] biomesForGeneration;

/** A double array that hold terrain noise from noiseGen3 */
double[] noise3;

/** A double array that hold terrain noise */
double[] noise1;

/** A double array that hold terrain noise from noiseGen2 */
double[] noise2;

/** A double array that hold terrain noise from noiseGen5 */
double[] noise5;

/** A double array that holds terrain noise from noiseGen6 */
double[] noise6;

/**
* Used to store the 5x5 parabolic field that is used during terrain generation.
*/
float[] parabolicField;
int[][] field_73219_j = new int[32][32];

{
caveGenerator = TerrainGen.getModdedMapGen(caveGenerator, CAVE);
strongholdGenerator = (MapGenStronghold) TerrainGen.getModdedMapGen(strongholdGenerator, STRONGHOLD);
villageGenerator = (MapGenVillage) TerrainGen.getModdedMapGen(villageGenerator, VILLAGE);
mineshaftGenerator = (MapGenMineshaft) TerrainGen.getModdedMapGen(mineshaftGenerator, MINESHAFT);
scatteredFeatureGenerator = (MapGenScatteredFeature) TerrainGen.getModdedMapGen(scatteredFeatureGenerator, SCATTERED_FEATURE);
ravineGenerator = TerrainGen.getModdedMapGen(ravineGenerator, RAVINE);
}

public ChunkProviderRainbow(World par1World, long par2, boolean par4)
{
this.worldObj = par1World;
this.mapFeaturesEnabled = par4;
this.rand = new Random(par2);
this.noiseGen1 = new NoiseGeneratorOctaves(this.rand, 16);
this.noiseGen2 = new NoiseGeneratorOctaves(this.rand, 16);
this.noiseGen3 = new NoiseGeneratorOctaves(this.rand, 8);
this.noiseGen4 = new NoiseGeneratorOctaves(this.rand, 4);
this.noiseGen5 = new NoiseGeneratorOctaves(this.rand, 10);
this.noiseGen6 = new NoiseGeneratorOctaves(this.rand, 16);
this.mobSpawnerNoise = new NoiseGeneratorOctaves(this.rand, 8);

NoiseGeneratorOctaves[] noiseGens = {noiseGen1, noiseGen2, noiseGen3, noiseGen4, noiseGen5, noiseGen6, mobSpawnerNoise};
noiseGens = TerrainGen.getModdedNoiseGenerators(par1World, this.rand, noiseGens);
this.noiseGen1 = noiseGens[0];
this.noiseGen2 = noiseGens[1];
this.noiseGen3 = noiseGens[2];
this.noiseGen4 = noiseGens[3];
this.noiseGen5 = noiseGens[4];
this.noiseGen6 = noiseGens[5];
this.mobSpawnerNoise = noiseGens[6];
}

/**
* Generates the shape of the terrain for the chunk though its all stone though the water is frozen if the
* temperature is low enough
*/
public void generateTerrain(int par1, int par2, byte[] par3ArrayOfByte)
{
byte var4 = 4;
byte var5 = 16;
byte var6 = 63;
int var7 = var4 + 1;
byte var8 = 17;
int var9 = var4 + 1;
this.biomesForGeneration = this.worldObj.getWorldChunkManager().getBiomesForGeneration(this.biomesForGeneration, par1 * 4 - 2, par2 * 4 - 2, var7 + 5, var9 + 5);
this.noiseArray = this.initializeNoiseField(this.noiseArray, par1 * var4, 0, par2 * var4, var7, var8, var9);

for (int var10 = 0; var10 < var4; ++var10)
{
for (int var11 = 0; var11 < var4; ++var11)
{
for (int var12 = 0; var12 < var5; ++var12)
{
double var13 = 0.125D;
double var15 = this.noiseArray[((var10 + 0) * var9 + var11 + 0) * var8 + var12 + 0];
double var17 = this.noiseArray[((var10 + 0) * var9 + var11 + 1) * var8 + var12 + 0];
double var19 = this.noiseArray[((var10 + 1) * var9 + var11 + 0) * var8 + var12 + 0];
double var21 = this.noiseArray[((var10 + 1) * var9 + var11 + 1) * var8 + var12 + 0];
double var23 = (this.noiseArray[((var10 + 0) * var9 + var11 + 0) * var8 + var12 + 1] - var15) * var13;
double var25 = (this.noiseArray[((var10 + 0) * var9 + var11 + 1) * var8 + var12 + 1] - var17) * var13;
double var27 = (this.noiseArray[((var10 + 1) * var9 + var11 + 0) * var8 + var12 + 1] - var19) * var13;
double var29 = (this.noiseArray[((var10 + 1) * var9 + var11 + 1) * var8 + var12 + 1] - var21) * var13;

for (int var31 = 0; var31 < 8; ++var31)
{
double var32 = 0.25D;
double var34 = var15;
double var36 = var17;
double var38 = (var19 - var15) * var32;
double var40 = (var21 - var17) * var32;

for (int var42 = 0; var42 < 4; ++var42)
{
int var43 = var42 + var10 * 4 << 11 | 0 + var11 * 4 << 7 | var12 * 8 + var31;
short var44 = 128;
var43 -= var44;
double var45 = 0.25D;
double var49 = (var36 - var34) * var45;
double var47 = var34 - var49;

for (int var51 = 0; var51 < 4; ++var51)
{
if ((var47 += var49) > 0.0D)
{
par3ArrayOfByte[var43 += var44] = (byte)Block.stone.blockID;
}
else if (var12 * 8 + var31 < var6)
{
par3ArrayOfByte[var43 += var44] = (byte)Block.waterStill.blockID;
}
else
{
par3ArrayOfByte[var43 += var44] = 0;
}
}

var34 += var38;
var36 += var40;
}

var15 += var23;
var17 += var25;
var19 += var27;
var21 += var29;
}
}
}
}
}

/**
* Replaces the stone that was placed in with blocks that match the biome
*/
public void replaceBlocksForBiome(int par1, int par2, byte[] par3ArrayOfByte, BiomeGenBase[] par4ArrayOfBiomeGenBase)
{
ChunkProviderEvent.ReplaceBiomeBlocks event = new ChunkProviderEvent.ReplaceBiomeBlocks(this, par1, par2, par3ArrayOfByte, par4ArrayOfBiomeGenBase);
MinecraftForge.EVENT_BUS.post(event);
if (event.getResult() == Result.DENY) return;

byte var5 = 63;
double var6 = 0.03125D;
this.stoneNoise = this.noiseGen4.generateNoiseOctaves(this.stoneNoise, par1 * 16, par2 * 16, 0, 16, 16, 1, var6 * 2.0D, var6 * 2.0D, var6 * 2.0D);

for (int var8 = 0; var8 < 16; ++var8)
{
for (int var9 = 0; var9 < 16; ++var9)
{
BiomeGenBase var10 = par4ArrayOfBiomeGenBase[var9 + var8 * 16];
float var11 = var10.getFloatTemperature();
int var12 = (int)(this.stoneNoise[var8 + var9 * 16] / 3.0D + 3.0D + this.rand.nextDouble() * 0.25D);
int var13 = -1;
byte var14 = var10.topBlock;
byte var15 = var10.fillerBlock;

for (int var16 = 127; var16 >= 0; --var16)
{
int var17 = (var9 * 16 + var8) * 128 + var16;

if (var16 <= 0 + this.rand.nextInt(5))
{
par3ArrayOfByte[var17] = (byte)Block.bedrock.blockID;
}
else
{
byte var18 = par3ArrayOfByte[var17];

if (var18 == 0)
{
var13 = -1;
}
else if (var18 == Block.stone.blockID)
{
if (var13 == -1)
{
if (var12 <= 0)
{
var14 = 0;
var15 = (byte)Block.stone.blockID;
}
else if (var16 >= var5 - 4 && var16 <= var5 + 1)
{
var14 = var10.topBlock;
var15 = var10.fillerBlock;
}

if (var16 < var5 && var14 == 0)
{
if (var11 < 0.15F)
{
var14 = (byte)Block.ice.blockID;
}
else
{
var14 = (byte)Block.waterStill.blockID;
}
}

var13 = var12;

if (var16 >= var5 - 1)
{
par3ArrayOfByte[var17] = var14;
}
else
{
par3ArrayOfByte[var17] = var15;
}
}
else if (var13 > 0)
{
--var13;
par3ArrayOfByte[var17] = var15;

if (var13 == 0 && var15 == Block.sand.blockID)
{
var13 = this.rand.nextInt(4);
var15 = (byte)Block.sandStone.blockID;
}
}
}
}
}
}
}
}

/**
* loads or generates the chunk at the chunk location specified
*/
@Override
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.rand.setSeed((long)par1 * 341873128712L + (long)par2 * 132897987541L);
byte[] var3 = new byte[32768];
this.generateTerrain(par1, par2, var3);
this.biomesForGeneration = this.worldObj.getWorldChunkManager().loadBlockGeneratorData(this.biomesForGeneration, par1 * 16, par2 * 16, 16, 16);
this.replaceBlocksForBiome(par1, par2, var3, this.biomesForGeneration);
this.caveGenerator.generate(this, this.worldObj, par1, par2, var3);
this.ravineGenerator.generate(this, this.worldObj, par1, par2, var3);

if (this.mapFeaturesEnabled)
{
this.mineshaftGenerator.generate(this, this.worldObj, par1, par2, var3);
this.villageGenerator.generate(this, this.worldObj, par1, par2, var3);
this.strongholdGenerator.generate(this, this.worldObj, par1, par2, var3);
this.scatteredFeatureGenerator.generate(this, this.worldObj, par1, par2, var3);
}

Chunk var4 = new Chunk(this.worldObj, var3, par1, par2);
byte[] var5 = var4.getBiomeArray();

for (int var6 = 0; var6 < var5.length; ++var6)
{
var5[var6] = (byte)this.biomesForGeneration[var6].biomeID;
}

var4.generateSkylightMap();
return var4;
}

/**
* 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];
}

if (this.parabolicField == null)
{
this.parabolicField = new float[25];

for (int var8 = -2; var8 <= 2; ++var8)
{
for (int var9 = -2; var9 <= 2; ++var9)
{
float var10 = 10.0F / MathHelper.sqrt_float((float)(var8 * var8 + var9 * var9) + 0.2F);
this.parabolicField[var8 + 2 + (var9 + 2) * 5] = var10;
}
}
}

double var44 = 684.412D;
double var45 = 684.412D;
this.noise5 = this.noiseGen5.generateNoiseOctaves(this.noise5, par2, par4, par5, par7, 1.121D, 1.121D, 0.5D);
this.noise6 = this.noiseGen6.generateNoiseOctaves(this.noise6, par2, par4, par5, par7, 200.0D, 200.0D, 0.5D);
this.noise3 = this.noiseGen3.generateNoiseOctaves(this.noise3, par2, par3, par4, par5, par6, par7, var44 / 80.0D, var45 / 160.0D, var44 / 80.0D);
this.noise1 = this.noiseGen1.generateNoiseOctaves(this.noise1, par2, par3, par4, par5, par6, par7, var44, var45, var44);
this.noise2 = this.noiseGen2.generateNoiseOctaves(this.noise2, par2, par3, par4, par5, par6, par7, var44, var45, var44);
boolean var43 = false;
boolean var42 = false;
int var12 = 0;
int var13 = 0;

for (int var14 = 0; var14 < par5; ++var14)
{
for (int var15 = 0; var15 < par7; ++var15)
{
float var16 = 0.0F;
float var17 = 0.0F;
float var18 = 0.0F;
byte var19 = 2;
BiomeGenBase var20 = this.biomesForGeneration[var14 + 2 + (var15 + 2) * (par5 + 5)];

for (int var21 = -var19; var21 <= var19; ++var21)
{
for (int var22 = -var19; var22 <= var19; ++var22)
{
BiomeGenBase var23 = this.biomesForGeneration[var14 + var21 + 2 + (var15 + var22 + 2) * (par5 + 5)];
float var24 = this.parabolicField[var21 + 2 + (var22 + 2) * 5] / (var23.minHeight + 2.0F);

if (var23.minHeight > var20.minHeight)
{
var24 /= 2.0F;
}

var16 += var23.maxHeight * var24;
var17 += var23.minHeight * var24;
var18 += var24;
}
}

var16 /= var18;
var17 /= var18;
var16 = var16 * 0.9F + 0.1F;
var17 = (var17 * 4.0F - 1.0F) / 8.0F;
double var47 = this.noise6[var13] / 8000.0D;

if (var47 < 0.0D)
{
var47 = -var47 * 0.3D;
}

var47 = var47 * 3.0D - 2.0D;

if (var47 < 0.0D)
{
var47 /= 2.0D;

if (var47 < -1.0D)
{
var47 = -1.0D;
}

var47 /= 1.4D;
var47 /= 2.0D;
}
else
{
if (var47 > 1.0D)
{
var47 = 1.0D;
}

var47 /= 8.0D;
}

++var13;

for (int var46 = 0; var46 < par6; ++var46)
{
double var48 = (double)var17;
double var26 = (double)var16;
var48 += var47 * 0.2D;
var48 = var48 * (double)par6 / 16.0D;
double var28 = (double)par6 / 2.0D + var48 * 4.0D;
double var30 = 0.0D;
double var32 = ((double)var46 - var28) * 12.0D * 128.0D / 128.0D / var26;

if (var32 < 0.0D)
{
var32 *= 4.0D;
}

double var34 = this.noise1[var12] / 512.0D;
double var36 = this.noise2[var12] / 512.0D;
double var38 = (this.noise3[var12] / 10.0D + 1.0D) / 2.0D;

if (var38 < 0.0D)
{
var30 = var34;
}
else if (var38 > 1.0D)
{
var30 = var36;
}
else
{
var30 = var34 + (var36 - var34) * var38;
}

var30 -= var32;

if (var46 > par6 - 4)
{
double var40 = (double)((float)(var46 - (par6 - 4)) / 3.0F);
var30 = var30 * (1.0D - var40) + -10.0D * var40;
}

par1ArrayOfDouble[var12] = var30;
++var12;
}
}
}

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;
int var4 = par2 * 16;
int var5 = par3 * 16;
BiomeGenBase var6 = this.worldObj.getBiomeGenForCoords(var4 + 16, var5 + 16);
this.rand.setSeed(this.worldObj.getSeed());
long var7 = this.rand.nextLong() / 2L * 2L + 1L;
long var9 = this.rand.nextLong() / 2L * 2L + 1L;
this.rand.setSeed((long)par2 * var7 + (long)par3 * var9 ^ this.worldObj.getSeed());
boolean var11 = false;

MinecraftForge.EVENT_BUS.post(new PopulateChunkEvent.Pre(par1IChunkProvider, worldObj, rand, par2, par3, var11));

if (this.mapFeaturesEnabled)
{
this.mineshaftGenerator.generateStructuresInChunk(this.worldObj, this.rand, par2, par3);
var11 = this.villageGenerator.generateStructuresInChunk(this.worldObj, this.rand, par2, par3);
this.strongholdGenerator.generateStructuresInChunk(this.worldObj, this.rand, par2, par3);
this.scatteredFeatureGenerator.generateStructuresInChunk(this.worldObj, this.rand, par2, par3);
}

int var12;
int var13;
int var14;

if (TerrainGen.populate(par1IChunkProvider, worldObj, rand, par2, par3, var11, LAKE) &&
!var11 && this.rand.nextInt(4) == 0)
{
var12 = var4 + this.rand.nextInt(16) + 8;
var13 = this.rand.nextInt(128);
var14 = var5 + this.rand.nextInt(16) + 8;
(new WorldGenLakes(Block.waterStill.blockID)).generate(this.worldObj, this.rand, var12, var13, var14);
}

if (TerrainGen.populate(par1IChunkProvider, worldObj, rand, par2, par3, var11, LAVA) &&
!var11 && this.rand.nextInt(8) == 0)
{
var12 = var4 + this.rand.nextInt(16) + 8;
var13 = this.rand.nextInt(this.rand.nextInt(120) + 8);
var14 = var5 + this.rand.nextInt(16) + 8;

if (var13 < 63 || this.rand.nextInt(10) == 0)
{
(new WorldGenLakes(Block.lavaStill.blockID)).generate(this.worldObj, this.rand, var12, var13, var14);
}
}

boolean doGen = TerrainGen.populate(par1IChunkProvider, worldObj, rand, par2, par3, var11, DUNGEON);
for (var12 = 0; doGen && var12 < 8; ++var12)
{
var13 = var4 + this.rand.nextInt(16) + 8;
var14 = this.rand.nextInt(128);
int var15 = var5 + this.rand.nextInt(16) + 8;

if ((new WorldGenDungeons()).generate(this.worldObj, this.rand, var13, var14, var15))
{
;
}
}

var6.decorate(this.worldObj, this.rand, var4, var5);
SpawnerAnimals.performWorldGenSpawning(this.worldObj, var6, var4 + 8, var5 + 8, 16, 16, this.rand);
var4 += 8;
var5 += 8;

doGen = TerrainGen.populate(par1IChunkProvider, worldObj, rand, par2, par3, var11, ICE);
for (var12 = 0; doGen && var12 < 16; ++var12)
{
for (var13 = 0; var13 < 16; ++var13)
{
var14 = this.worldObj.getPrecipitationHeight(var4 + var12, var5 + var13);

if (this.worldObj.isBlockFreezable(var12 + var4, var14 - 1, var13 + var5))
{
this.worldObj.setBlock(var12 + var4, var14 - 1, var13 + var5, Block.ice.blockID);
}

if (this.worldObj.canSnowAt(var12 + var4, var14, var13 + var5))
{
this.worldObj.setBlock(var12 + var4, var14, var13 + var5, Block.snow.blockID);
}
}
}

MinecraftForge.EVENT_BUS.post(new PopulateChunkEvent.Post(par1IChunkProvider, worldObj, rand, par2, par3, var11));

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 the 100 oldest chunks from memory, due to a bug with chunkSet.add() never being called it thinks the list
* is always empty and will not remove any chunks.
*/
public boolean unload100OldestChunks()
{
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 "RandomLevelSource";
}

/**
* 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)
{
BiomeGenBase var5 = this.worldObj.getBiomeGenForCoords(par2, par4);
return var5 == null ? null : (var5 == BiomeGenBase.swampland && par1EnumCreatureType == EnumCreatureType.monster && this.scatteredFeatureGenerator.hasStructureAt(par2, par3, par4) ? this.scatteredFeatureGenerator.getScatteredFeatureSpawnList() : var5.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 "Stronghold".equals(par2Str) && this.strongholdGenerator != null ? this.strongholdGenerator.getNearestInstance(par1World, par3, par4, par5) : null;
}

public int getLoadedChunkCount()
{
return 0;
}

public void recreateStructures(int par1, int par2)
{
if (this.mapFeaturesEnabled)
{
this.mineshaftGenerator.generate(this, this.worldObj, par1, par2, (byte[])null);
this.villageGenerator.generate(this, this.worldObj, par1, par2, (byte[])null);
this.strongholdGenerator.generate(this, this.worldObj, par1, par2, (byte[])null);
this.scatteredFeatureGenerator.generate(this, this.worldObj, par1, par2, (byte[])null);
}
}

@Override
public boolean unloadQueuedChunks() {
// TODO Auto-generated method stub
return false;
}

}


occasionally, this error comes up, but the game continues:
Click to reveal
2013-04-20 12:56:28 [INFO] [ForgeModLoader] Unloading dimension 25
2013-04-20 12:56:28 [SEVERE] [ForgeModLoader] Detected leaking worlds in memory. There are 2 worlds that appear to be persisting. A mod is likely caching the world incorrectly

2013-04-20 12:56:28 [SEVERE] [ForgeModLoader] The world 1051694a (New World) has leaked.


If anything else is needed, please tell me, thanks
Posted by
Strum355
Level 6 : Apprentice Miner
10

  Have something to say?

JoinSign in

11

duke_Frans
06/21/2013 7:27 pm
Level 66 : High Grandmaster Modder
Very easy mistake you made here.
The normal teleporter class which you extended is by default set to have a nether portal in it, just copy over the whole teleporter class and change the nether portal block to urs.
1
eliteGhost910234
06/15/2013 10:14 pm
Level 1 : New Miner
Do you mind if I use this code as a learning device and Implament it into my mod but change as much up as I need to? I am in need for either example code or a tut. for a dimension but can't find one. If its okay with you, I would like to copy and paste this code and change everything I need to?
1
Strum355
06/17/2013 10:31 am
Level 6 : Apprentice Miner
Sure, go ahead. It may or may not work haha
1
quitefrank_ly
04/20/2013 6:35 pm
Level 34 : Artisan Chef
Moved to Modding

-VoV
1
Strum355
04/20/2013 4:31 pm
Level 6 : Apprentice Miner
Nvm my friend solved it my portal cool down code didnt work but his did
1
Magnet_man16
04/20/2013 9:47 am
Level 52 : Grandmaster Modder
As your problem is with being in contact with the world i doubt that its anything but your TeleporterRainbow.java. However it could be a crash which returns the player or the world mis loading. However if your teleporter class generates a portal maybe its generating it in the wrong place. Or exactly on the player.

By watching your video i would suggest spawning the player out of the portal to see if thats the problem.

Please send me a copy of the compiled class files so i can test the mod my self to see if i can avoid the return.
1
Strum355
04/20/2013 3:05 pm
Level 6 : Apprentice Miner
I just have the portal block itself. Also, i spawn in a nether portal, strangely enough, and other nether portal frames have been seen spawning too.

Ill send it to you tomorrow when im on my pc next
1
deadrecon98
04/20/2013 8:43 am
Level 38 : Artisan Programmer
Dude. You just gave away your code -_-
1
Strum355
04/20/2013 9:32 am
Level 6 : Apprentice Miner
1. The answer might lie in the code itself, so people willing to help can point things out
2. Have you never heard of open source?
1
Magnet_man16
04/20/2013 9:37 am
Level 52 : Grandmaster Modder
Thats right! Tell that bitch. Open source and many people can help. Like me however i have no experience with forge but i have made mods... so..
1
Strum355
04/20/2013 9:39 am
Level 6 : Apprentice Miner
Haha considering i have a linux mint banner in my signature youd think people would realise i support open source but still, if you know anyone who has dimension knowledge send 'em my way. Its really fustrating to know i got it before but not anymor
1

Welcome