Hey!
I was basically trying to create a new Dimension which was working fine until the game crashed when upon colliding with the Portal i created. After this didnt' work out, watched a tutorial and copied it's code into my Mod. Then I realized it wasn't working although the recompiling didn't get any Errors. The Console said that the Errors occured in the Teleporters' super method and in
I will simply post my code below:
1. The Handler
package lucaffinity.destinies_dynasty.general.handler;
import lucaffinity.destinies_dynasty.dimension.orfestia.WorldProviderOrfestia;
import net.minecraftforge.common.DimensionManager;
public class DimensionHandler {
public static void Modfile(){
registerDimension();
}
public static final int OrfestiaId = 8;
public static void registerDimension(){
DimensionManager.registerProviderType(OrfestiaId, WorldProviderOrfestia.class, false);
DimensionManager.registerDimension(OrfestiaId, OrfestiaId);
}
}
2. The Portal-Block File
package lucaffinity.destinies_dynasty.blocks;
import java.util.Random;
import lucaffinity.destinies_dynasty.dimension.orfestia.OrfestiaTeleporter;
import lucaffinity.destinies_dynasty.general.CreativeTab;
import lucaffinity.destinies_dynasty.general.handler.DimensionHandler;
import net.minecraft.block.Block;
import net.minecraft.block.BlockPortal;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.init.Blocks;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.World;
public class BlockOrfestiaPortal extends BlockPortal {
public BlockOrfestiaPortal(){
super();
this.setCreativeTab(CreativeTab.destinies_dynasty_portal);
}
/*public void updateTick(World world, int x, int y, int z, Random rand){
}*/
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int x, int y, int z){
return null;
}
public boolean renderAsNormalBlock(){
return false;
}
public void onNeighborBlockChange(World world, int x, int y, int z, Block block){
byte b0 = 0;
byte b1 = 1;
if(world.getBlock(x - 1, y, z) == ModBlocks.orfestia_portalframe || world.getBlock(x + 1, y, z) == ModBlocks.orfestia_portalframe){
b0 = 1;
b1 = 0;
}
int i1;
for(i1 = y; world.getBlock(x, i1 - 1, z) == this; --i1){
;
}
if(world.getBlock(x, i1 - 1, z) != ModBlocks.orfestia_portalframe){
world.setBlockToAir(x, y, z);
}else{
int j1;
for(j1 = 1; j1 < 4 && world.getBlock(x, i1 + j1, z) == this; ++j1){
;
}
if(j1 == 3 && world.getBlock(x, i1 + j1, z) == ModBlocks.orfestia_portalframe){
boolean flag = world.getBlock(x - 1, y, z) == this || world.getBlock(x + 1, y, z) == this;
boolean flag1 = world.getBlock(x, y, z - 1) == this || world.getBlock(x, y, z - 1) == this;
if(flag && flag1){
world.setBlockToAir(x, y, z);
}else{
if((world.getBlock(x+b0, y, z+b1) != ModBlocks.orfestia_portalframe || world.getBlock(x-b0, y, z-b1) != this) && (world.getBlock(x-b0, y, z-b1) !=ModBlocks.orfestia_portalframe || world.getBlock(x+b0, y, z+b1) != this)){
world.setBlockToAir(x, y, z);
}
}
}else{
world.setBlockToAir(x, y, z);
}
}
}
public int quantityDropped(Random rand){
return 0;
}
public void onEntityCollidedWithBlock(World world, int x, int y, int z, Entity entity){
if(entity.ridingEntity == null && entity.riddenByEntity == null && entity instanceof EntityPlayerMP){
EntityPlayerMP thePlayer = (EntityPlayerMP) entity;
MinecraftServer server = MinecraftServer.getServer();
if(entity instanceof EntityPlayerMP){
if(thePlayer.timeUntilPortal > 0){
thePlayer.timeUntilPortal = 10;
Error }else if(thePlayer.dimension != DimensionHandler.OrfestiaId){ thePlayer.timeUntilPortal = 10; thePlayer.mcServer.getConfigurationManager().transferPlayerToDimension(thePlayer, DimensionHandler.OrfestiaId, new OrfestiaTeleporter(server.worldServerForDimension(DimensionHandler.OrfestiaId)));
}else{
thePlayer.timeUntilPortal = 10;
thePlayer.mcServer.getConfigurationManager().transferPlayerToDimension(thePlayer, 0, new OrfestiaTeleporter(server.worldServerForDimension(0)));
}
}
}
}
public boolean tryTroCreatePortal(World world, int x, int y, int z){
byte b0 = 0;
byte b1 = 0;
if(world.getBlock(x - 1 , y, z) == ModBlocks.orfestia_portalframe || world.getBlock(x + 1, y, z) == ModBlocks.orfestia_portalframe){
b0 = 1;
}
if (world.getBlock(x, y, z - 1) == ModBlocks.orfestia_portalframe || world.getBlock(x, y, z + 1) == ModBlocks.orfestia_portalframe){
b1 = 1;
}
if(b0 == b1){
return false;
}
else{
if(world.getBlock(x - b0, y, z - b1) == Blocks.air){
x -= b0;
z -= 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){
Block j1 = world.getBlock(x + b0 * l, y + i1, z + b1 * l);
if(flag){
if(j1 != ModBlocks.orfestia_portalframe){
return false;
}
}
else if(j1 != Blocks.air && j1 != Blocks.fire){
return false;
}
}
}
}
for(l = 0; l < 2; ++l){
for(i1 = 0; i1 < 3; ++i1){
world.setBlock(x + b0 * l, y + i1, z + b1 * l, ModBlocks.orfestia_portal, 0, 2);
}
}
return true;
}
}
}
3.The World provider
package lucaffinity.destinies_dynasty.dimension.orfestia;
import lucaffinity.destinies_dynasty.general.handler.DimensionHandler;
import net.minecraft.world.WorldProvider;
import net.minecraft.world.biome.WorldChunkManagerHell;
import net.minecraft.world.chunk.IChunkProvider;
public class WorldProviderOrfestia extends WorldProvider{
public void registerWorldChunkManager(){
this.worldChunkMgr = new WorldChunkManagerHell(lucaffinity.destinies_dynasty.generation.biome.BiomeRegistry.biomeMagicalForest, 1.2F);
this.dimensionId = DimensionHandler.OrfestiaId;
}
public IChunkProvider createChunkGeneration(){
return null;
}
@Override
public String getDimensionName() {
return "Orfestia";
}
}
4.The Teleporter
package lucaffinity.destinies_dynasty.dimension.orfestia;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import lucaffinity.destinies_dynasty.blocks.ModBlocks;
import net.minecraft.entity.Entity;
import net.minecraft.init.Blocks;
import net.minecraft.util.Direction;
import net.minecraft.util.LongHashMap;
import net.minecraft.util.MathHelper;
import net.minecraft.world.ChunkCoordIntPair;
import net.minecraft.world.Teleporter;
import net.minecraft.world.WorldServer;
public class OrfestiaTeleporter extends Teleporter {
private final WorldServer worldServerInstance;
private final Random random;
private final LongHashMap destinationCoordinateCache = new LongHashMap();
private final List destinationCoordinateKeys = new ArrayList();
public OrfestiaTeleporter(WorldServer worldserver) {
Error super(worldserver);
this.worldServerInstance = worldserver;
this.random = new Random(worldserver.getSeed());
}
public void placeInPortal(Entity entity, double par2, double par4, double par6, float par8){
if(this.worldServerInstance.provider.dimensionId != 1){
if(!this.placeInExistingPortal(entity, par2, par4, par6, par8)){
this.makePortal(entity);
this.placeInExistingPortal(entity, par2, par4, par6, par8);
}
}
else{
int i = MathHelper.floor_double(entity.posX);
int j = MathHelper.floor_double(entity.posY) - 1;
int k = MathHelper.floor_double(entity.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; j < 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 ?ModBlocks.orfestia_portalframe : Blocks.air);
}
}
}
entity.setLocationAndAngles((double)i, (double)j, (double)k, entity.rotationYaw, 0.0F);
entity.motionX = entity.motionY = entity.motionZ = 0.0D;
}
}
public boolean placeInExistingPortal(Entity entity, 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(entity.posX);
int i1 = MathHelper.floor_double(entity.posZ);
long j1 = ChunkCoordIntPair.chunkXZ2Int(l, i1);
boolean flag = true;
double d7;
int l3;
if(this.destinationCoordinateCache.containsItem(j1)){
OrfestiaTeleporter.PortalPosition portalposition = (Teleporter.PortalPosition)this.destinationCoordinateCache.getValueByKey(j1);
d3 = 0.0D;
i = portalposition.posX;
j = portalposition.posY;
k = portalposition.posZ;
portalposition.lastUpdateTime = this.worldServerInstance.getTotalWorldTime();
flag = false;
}
else{
for(l3 = l - short1; l3 <= 1 + 128; ++l3){
double d4 = (double)l3 + 0.5D - entity.posX;
for(int l1 = i1 - short1; l1 <= i1 + short1; ++l1){
double d5 = (double)l1 + 0.5D - entity.posZ;
for(int i2 = this.worldServerInstance.getActualHeight() -1; i2 >=0; --i2){
if(this.worldServerInstance.getBlock(l3, i2, l1) == ModBlocks.orfestia_portal){
while (this.worldServerInstance.getBlock(l3, i2 - 1, l1) == ModBlocks.orfestia_portal){
--i2;
}
d7 = (double) i2 + 0.5D - entity.posY;
double d8 = d4 * d4 + d7 * d7 + d5 * d5;
if (d3 < 0.0D || d8 < d3){
d3 = d8;
i = l3;
j = i2;
k = l1;
}
}
}
}
}
}
if (d3 >= 0.0D){
if(flag){
this.destinationCoordinateCache.add(j1, new OrfestiaTeleporter.PortalPosition(i, j, k, this.worldServerInstance.getTotalWorldTime()));
this.destinationCoordinateKeys.add(Long.valueOf(j1));
System.out.println("Location " + j1);
}
double d11 = (double)i + 0.5D;
double d6 = (double)j + 0.5D;
d7 = (double)k + 0.5D;
int i4 = -1;
if(this.worldServerInstance.getBlock(i - 1, j, k) == ModBlocks.orfestia_portal){
i4 = 2;
}
if(this.worldServerInstance.getBlock(i + 1, j, k) == ModBlocks.orfestia_portal){
i4 = 0;
}
if(this.worldServerInstance.getBlock(i, j, k - 1) == ModBlocks.orfestia_portal){
i4 = 3;
}
if(this.worldServerInstance.getBlock(i, j, k + 1) == ModBlocks.orfestia_portal){
i4 = 1;
}
int j2 = entity.getTeleportDirection();
if(i4 > -1){
int k2 = Direction.rotateLeft[i4];
int l2 = Direction.offsetX[i4];
int i3 = Direction.offsetZ[i4];
int j3 = Direction.offsetX[k2];
int k3 = Direction.offsetZ[k2];
boolean flag1 = !this.worldServerInstance.isAirBlock(i + l2 + j3, j, k + i3 + k3) || !this.worldServerInstance.isAirBlock(i + l2 + j3, j + 1, k + i3 + k3);
boolean flag2 = !this.worldServerInstance.isAirBlock(i + l2 + j3, j, k + i3) || !this.worldServerInstance.isAirBlock(i + l2 + j3, j + 1, k + i3);
if(flag1 && flag2){
i4 = Direction.rotateOpposite[i4];
k2 = Direction.rotateOpposite[k2];
l2 = Direction.offsetX[i4];
i3 = Direction.offsetZ[i4];
j3 = Direction.offsetX[k2];
k3 = Direction.offsetZ[k2];
l3 = i - j3;
d11 -= (double)j3;
int k1 = k - k3;
d7 -= (double)k3;
flag1 = !this.worldServerInstance.isAirBlock(i + l2 + j3, j, k + i3 + k3) || !this.worldServerInstance.isAirBlock(i + l2 + j3, j + 1, k + i3 + k3);
flag2 = !this.worldServerInstance.isAirBlock(i + l2 + j3, j, k + i3) || !this.worldServerInstance.isAirBlock(i + l2 + j3, j + 1, k + i3);
}
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;
}
d11 += (double)((float)j3 * f1 + f2 * (float)l2);
d7 += (double)((float)k3 * f1 + f2 * (float)i3);
float f3 = 0.0F;
float f4 = 0.0F;
float f5 = 0.0F;
float f6 = 0.0F;
if(i4 == j2){
f3 = 1.0F;
f4 = 1.0F;
}
else if(i4 == Direction.rotateOpposite[j2]){
f3 = -1.0F;
f4 = -1.0F;
}
else if(i4 == Direction.rotateRight[j2]){
f5 = 1.0F;
f6 = -1.0F;
}
else{
f5 = -1.0F;
f6 = 1.0F;
}
double d9 = entity.motionX;
double d10 = entity.motionZ;
entity.motionX = d9 * (double)f3 + d10 * (double)f6;
entity.motionZ = d9 * (double)f5 + d10 * (double)f4;
entity.rotationYaw = par8 - (float)(j2 * 90) + (float)(i4 *90);
}
else{
entity.motionX = entity.motionY = entity.motionZ = 0.0D;
}
entity.setLocationAndAngles(d11, d6, d7, entity.rotationYaw, entity.rotationPitch);
return true;
}
else{
return false;
}
}
}
I appreciate any help and if this is the wrong place to post in, Im sorry, this is my first post.