Hi everybody, I'm Likroford and today I'll show you how to make dimension mods with my DimAPI. For those who don't know, this API using templates - special classes that can be customized with constructor or config methods. You need to decompile this API using fernflower. Here is a list of tutorials:
EASY:
Vertical Portal Block
Biome and World Provider
Basic Dimension
MEDIUM:
Advanced Dimension
Horyzontal Portal
HARD:
Chunk Provider
1. Vertical Portal
Vertical Portal block is the easiest thing in this API. You only need to register portal block and starter block through your mod_Name file. Here is the example code:
package net.minecraft.src;
public class mod_Name extends BaseMod
{
public static final BlockVerticalPortal portal = (BlockVerticalPortal)new BlockVerticalPortal(blockID, blockIndexInTexture).setParameters(yourDimNumber).setBlockName("portal");
public static final Block starter = new BlockPortalStarter(blockID, blockIndexInTexture).setBlockName("starter");
public void load()
{
ModLoader.registerBlock(portal);
ModLoader.registerBlock(starter);
ModLoader.addName(portal, "Example Portal");
ModLoader.addName(starter, "Starter Block");
}
public String getVersion()
{
return "1.2.4";
}
}
2. Biome and World Provider
Creating biome isn't hard, you just need to copy example biomes code below.
BiomeGenSea.java:
package net.minecraft.src;
public class BiomeGenSea extends BiomeGenBase
{
public BiomeGenSea(int var1)
{
super(var1);
this.temperature = 0.5F;//Don't make it <= 0.15F because of freezing water
this.rainfall = 0.0F;//0.0F - no rain, 2.0F - constant rain
this.minHeight = -1.0F;//Minimal height of biome
this.maxHeight = 0.0F;//Maximal height of biome
this.spawnableCreatureList.clear();
this.spawnableMonsterList.clear();
this.spawnableWaterCreatureList.clear();
this.topBlock = (byte)Block.blockClay.blockID;//Block that covers terrain like grass
this.fillerBlock = (byte)Block.blockClay.blockID;//Under-grass block like dirt
this.biomeDecorator.flowersPerChunk = -999;
this.biomeDecorator.grassPerChunk = -999;
this.biomeDecorator.sandPerChunk2 = -999;
this.biomeDecorator.clayPerChunk = -999;
this.biomeDecorator.mushroomsPerChunk = -999;
}
}
BiomeGenTerrain.java:
package net.minecraft.src;
public class BiomeGenTerrain extends BiomeGenBase
{
public BiomeGenTerrain(int var1)
{
super(var1);
this.temperature = 0.5F;//Don't make it <= 0.15F because of freezing water
this.rainfall = 0.0F;//0.0F - no rain, 2.0F - constant rain
this.minHeight = 0.0F;//Minimal height of biome
this.maxHeight = 1.0F;//Maximal height of biome
this.spawnableCreatureList.clear();
this.spawnableMonsterList.clear();
this.spawnableWaterCreatureList.clear();
this.topBlock = (byte)Block.grass.blockID;//Block that covers terrain like grass
this.fillerBlock = (byte)Block.dirt.blockID;//Under-grass block like dirt
this.biomeDecorator.flowersPerChunk = -999;
this.biomeDecorator.grassPerChunk = -999;
this.biomeDecorator.sandPerChunk2 = -999;
this.biomeDecorator.clayPerChunk = -999;
this.biomeDecorator.mushroomsPerChunk = -999;
}
}
mod_Name.java:
package net.minecraft.src;
public class mod_Name extends BaseMod
{
public static final BiomeGenBase sea = new BiomeGenSea(biomeID).setBiomeName("Sea");
public static final BiomeGenBase terrain = new BiomeGenTerrain(biomeID).setBiomeName("Terrain");
public void load()
{
}
public String getVersion()
{
return "1.2.4";
}
}
In World provider you only need to create a file. Here is an example code:
WorldProviderDim:
package net.minecraft.src;
import java.util.*;
public class WorldProviderDim extends WorldProvider
{
public void registerWorldChunkManager()
{
BiomeGenBase[] b = new BiomeGenBase[]{mod_Name.sea, mod_Name.terrain};//Array of biomes that you can meet in this dimension
this.worldChunkMgr = new WorldChunkManagerDimAPI(this.worldObj, B);
this.hasNoSky = true;
this.worldType = yourDimID;
}
public IChunkProvider getChunkProvider()
{
return new ChunkProviderDim(this.worldObj, this.worldObj.getSeed());
}
public Vec3D getFogColor(float var1, float var2)
{
return Vec3D.createVector(0.2D, 0.0D, 0.2D);//Sky color (red, green, blue)
}
public boolean canCoordinateBeSpawn(int var1, int var2)
{
int var3 = this.worldObj.getFirstUncoveredBlock(var1, var2);
return var3 == 0 ? false : Block.blocksList[var3].blockMaterial.isSolid();
}
public boolean func_48217_e()
{
return false;
}
public boolean canRespawnHere()
{
return true;
}
public boolean func_48218_b(int par1, int par2)
{
return true;
}
}
3. Basic dimension
Well, here it goes - DIMENSION. Actually, the creation of dimension is easier than world provider. Like with portal, you only need to register your dimension through your mod_Name file. Here is a complete code that includes all lines from previous tutorials:
package net.minecraft.src;
public class mod_Name extends BaseMod
{
public static final BiomeGenBase sea = new BiomeGenSea(biomeID).setBiomeName("Sea");
public static final BiomeGenBase terrain = new BiomeGenTerrain(biomeID).setBiomeName("Terrain");
public static final BlockVerticalPortal portal = (BlockVerticalPortal)new BlockVerticalPortal(blockID, blockIndexInTexture).setParameters(yourDimNumber).setBlockName("portal");
public static final Block starter = new BlockPortalStarter(blockID, blockIndexInTexture).setBlockName("starter");
public static final DimAPIBase dim = new DimAPIBase(yourDimID, "Example", new WorldProviderDim()).setBlocks(frameBlockID, portalBlockID, starterBlockID);
public void load()
{
ModLoader.setInGameHook(this, true, false);
ModLoader.registerBlock(portal);
ModLoader.registerBlock(starter);
ModLoader.addName(portal, "Example Portal");
ModLoader.addName(starter, "Starter Block");
}
public String getVersion()
{
return "1.2.4";
}
public boolean onTickInGame(float f, Minecraft minecraft)
{
dim.mainPortalLoop();
}
}
PLEASE PLEASE PLEASE PLEASE PLEASE update this post and help us to use your API Because Shockah is EXTREMELY lazy when it comes to updating his mods... DONT FLAKE ON ME AND STOP UPDATING PLEASE PLEASE PLEASE PLEASE PLEASE PLEASE...
As you can tell I have not been very patient with shockah either.... lol
Im getting errors so I made a little video to show you what is wrong... Thanks
Well I can't get youtube to work right now... Wont let me sign in... Wont bring up the webpage to sign in so I used mediafire and its a quicktime .mov file... Tell me if you cant watch it and i will upload it to youtube later...
Im getting errors so I made a little video to show you what is wrong... Thanks
Well I can't get youtube to work right now... Wont let me sign in... Wont bring up the webpage to sign in so I used mediafire and its a quicktime .mov file... Tell me if you cant watch it and i will upload it to youtube later...
hi when ever i try to enter the new dimension it does nothing and i dont no why if you can help it would be great here are my mod_#### and BlockPortal
package net.minecraft.src;
public class mod_dinocraft extends BaseMod
{
public static final BlockVerticalPortal portal = (BlockVerticalPortal)new BlockVerticalPortal(200, 0).setParameters(99).setBlockName("portal");
public static final Block starter = new BlockPortalStarter(201, 0).setBlockName("starter");
public static final BiomeGenBase swamplands = new BiomeGenSwampLands(66).setBiomeName("SwampLands");
public static final BiomeGenBase hillforest = new BiomeGenHillForest(67).setBiomeName("HillForest");
public static final DimAPIBase dim = new DimAPIBase(99, "DinoCraft", new WorldProviderDinoCraft()).setBlocks(121, 200, 201);
public void load()
{
ModLoader.registerBlock(portal);
ModLoader.registerBlock(starter);
ModLoader.addName(portal, "Example Portal");
ModLoader.addName(starter, "Starter Block");
ModLoader.addRecipe(new ItemStack(mod_dinocraft.portal, 1), new Object[] {
"#", Character.valueOf('#'), Item.stick
});
ModLoader.addRecipe(new ItemStack(mod_dinocraft.starter, 1), new Object[] {
"#", "#", Character.valueOf('#'), Item.stick
});
portal.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/mod_dinocraft/portal.png");
starter.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/mod_dinocraft/starter.png");
}
public String getVersion()
{
return "1.2.4";
}
}
thats my mod file
now for my portal file
package net.minecraft.src;
import java.util.Random;
public class BlockVerticalPortal extends BlockBreakable
{
protected int frameBlockID;
protected int startBlockID;
private int dimToTravel;
public BlockVerticalPortal(int i, int j)
{
super(i, j, Material.portal, false);
setBlockUnbreakable().setStepSound(Block.soundGlassFootstep).setLightValue(0.75F);
}
public BlockVerticalPortal setParameters(int i)
{
dimToTravel = i;
return this;
}
/**
* Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
* cleared to be reused)
*/
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int i, int j, int k)
{
return null;
}
/**
* Updates the blocks bounds based on its current state. Args: world, x, y, z
*/
public void setBlockBoundsBasedOnState(IBlockAccess iblockaccess, int i, int j, int k)
{
if (iblockaccess.getBlockId(i - 1, j, k) != blockID && iblockaccess.getBlockId(i + 1, j, k) != blockID)
{
float f = 0.125F;
float f2 = 0.5F;
setBlockBounds(0.5F - f, 0.0F, 0.5F - f2, 0.5F + f, 1.0F, 0.5F + f2);
}
else
{
float f1 = 0.5F;
float f3 = 0.125F;
setBlockBounds(0.5F - f1, 0.0F, 0.5F - f3, 0.5F + f1, 1.0F, 0.5F + f3);
}
}
/**
* Is this block (a) opaque and (B) a full 1m cube? This determines whether or not to render the shared face of two
* adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
*/
public boolean isOpaqueCube()
{
return false;
}
/**
* If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
*/
public boolean renderAsNormalBlock()
{
return false;
}
public boolean tryToCreatePortal(World world, int i, int j, int k)
{
int l = 0;
int i1 = 0;
if (world.getBlockId(i - 1, j, k) == frameBlockID || world.getBlockId(i + 1, j, k) == frameBlockID)
{
l = 1;
}
if (world.getBlockId(i, j, k - 1) == frameBlockID || world.getBlockId(i, j, k + 1) == frameBlockID)
{
i1 = 1;
}
if (l == i1)
{
return false;
}
if (world.getBlockId(i - l, j, k - i1) == 0)
{
i -= l;
k -= i1;
}
for (int j1 = -1; j1 <= 2; j1++)
{
for (int l1 = -1; l1 <= 3; l1++)
{
boolean flag = j1 == -1 || j1 == 2 || l1 == -1 || l1 == 3;
if ((j1 == -1 || j1 == 2) && (l1 == -1 || l1 == 3))
{
continue;
}
int j2 = world.getBlockId(i + l * j1, j + l1, k + i1 * j1);
if (flag)
{
if (j2 != frameBlockID)
{
return false;
}
continue;
}
if (j2 != 0 && j2 != mod_dinocraft.starter.blockID)
{
return false;
}
}
}
world.editingBlocks = true;
for (int k1 = 0; k1 < 2; k1++)
{
for (int i2 = 0; i2 < 3; i2++)
{
world.setBlockWithNotify(i + l * k1, j + i2, k + i1 * k1, blockID);
}
}
world.editingBlocks = false;
return true;
}
/**
* 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 world, int i, int j, int k, int l)
{
int i1 = 0;
int j1 = 1;
if (world.getBlockId(i - 1, j, k) == blockID || world.getBlockId(i + 1, j, k) == blockID)
{
i1 = 1;
j1 = 0;
}
int k1;
for (k1 = j; world.getBlockId(i, k1 - 1, k) == blockID; k1--) { }
if (world.getBlockId(i, k1 - 1, k) != frameBlockID)
{
world.setBlockWithNotify(i, j, k, 0);
}
else
{
int l1;
for (l1 = 1; l1 < 4 && world.getBlockId(i, k1 + l1, k) == blockID; l1++) { }
if (l1 == 3 && world.getBlockId(i, k1 + l1, k) == frameBlockID)
{
boolean flag = world.getBlockId(i - 1, j, k) == blockID || world.getBlockId(i + 1, j, k) == blockID;
boolean flag1 = world.getBlockId(i, j, k - 1) == blockID || world.getBlockId(i, j, k + 1) == blockID;
if (flag && flag1)
{
world.setBlockWithNotify(i, j, k, 0);
}
else if ((world.getBlockId(i + i1, j, k + j1) != frameBlockID || world.getBlockId(i - i1, j, k - j1) != blockID) && (world.getBlockId(i - i1, j, k - j1) != frameBlockID || world.getBlockId(i + i1, j, k + j1) != blockID))
{
world.setBlockWithNotify(i, j, k, 0);
}
}
else
{
world.setBlockWithNotify(i, j, k, 0);
}
}
}
/**
* Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
* coordinates. Args: blockAccess, x, y, z, side
*/
public boolean shouldSideBeRendered(IBlockAccess iblockaccess, int i, int j, int k, int l)
{
if (iblockaccess.getBlockId(i, j, k) == blockID)
{
return false;
}
else
{
boolean flag = iblockaccess.getBlockId(i - 1, j, k) == blockID && iblockaccess.getBlockId(i - 2, j, k) != blockID;
boolean flag1 = iblockaccess.getBlockId(i + 1, j, k) == blockID && iblockaccess.getBlockId(i + 2, j, k) != blockID;
boolean flag2 = iblockaccess.getBlockId(i, j, k - 1) == blockID && iblockaccess.getBlockId(i, j, k - 2) != blockID;
boolean flag3 = iblockaccess.getBlockId(i, j, k + 1) == blockID && iblockaccess.getBlockId(i, j, k + 2) != blockID;
boolean flag4 = flag || flag1;
boolean flag5 = flag2 || flag3;
return !flag4 || l != 4 ? !flag4 || l != 5 ? !flag5 || l != 2 ? flag5 && l == 3 : true : true : true;
}
}
/**
* Returns the quantity of items to drop on block destruction.
*/
public int quantityDropped(Random random)
{
return 0;
}
/**
* Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
*/
public int getRenderBlockPass()
{
return 1;
}
/**
* Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity
*/
public void onEntityCollidedWithBlock(World world, int i, int j, int k, Entity entity)
{
if ((entity instanceof EntityPlayer) && entity.ridingEntity == null && entity.riddenByEntity == null)
{
if (DimAPIBase.dimList[dimToTravel] != null)
{
DimAPIBase.dimList[dimToTravel].setInPortal(dimToTravel);
}
else
{
throw new RuntimeException(new NullPointerException((new StringBuilder()).append("Cannot find dimension with ID ").append(dimToTravel).toString()));
}
}
}
/**
* A randomly called display update to be able to add particles or other items for display
*/
public void randomDisplayTick(World world, int i, int j, int k, Random random)
{
if (random.nextInt(100) == 0)
{
world.playSoundEffect((double)i + 0.5D, (double)j + 0.5D, (double)k + 0.5D, "portal.portal", 0.5F, random.nextFloat() * 0.4F + 0.8F);
}
for (int l = 0; l < 4; l++)
{
double d = (float)i + random.nextFloat();
double d1 = (float)j + random.nextFloat();
double d2 = (float)k + random.nextFloat();
double d3 = 0.0D;
double d4 = 0.0D;
double d5 = 0.0D;
int i1 = random.nextInt(2) * 2 - 1;
d3 = ((double)random.nextFloat() - 0.5D) * 0.5D;
d4 = ((double)random.nextFloat() - 0.5D) * 0.5D;
d5 = ((double)random.nextFloat() - 0.5D) * 0.5D;
if (world.getBlockId(i - 1, j, k) != blockID && world.getBlockId(i + 1, j, k) != blockID)
{
d = (double)i + 0.5D + 0.25D * (double)i1;
d3 = random.nextFloat() * 2.0F * (float)i1;
}
else
{
d2 = (double)k + 0.5D + 0.25D * (double)i1;
d5 = random.nextFloat() * 2.0F * (float)i1;
}
world.spawnParticle("portal", d, d1, d2, d3, d4, d5);
}
}
}
hi when ever i try to enter the new dimension it does nothing and i dont no why if you can help it would be great here are my mod_#### and BlockPortal
package net.minecraft.src;
public class mod_dinocraft extends BaseMod
{
public static final BlockVerticalPortal portal = (BlockVerticalPortal)new BlockVerticalPortal(200, 0).setParameters(99).setBlockName("portal");
public static final Block starter = new BlockPortalStarter(201, 0).setBlockName("starter");
public static final BiomeGenBase swamplands = new BiomeGenSwampLands(66).setBiomeName("SwampLands");
public static final BiomeGenBase hillforest = new BiomeGenHillForest(67).setBiomeName("HillForest");
public static final DimAPIBase dim = new DimAPIBase(99, "DinoCraft", new WorldProviderDinoCraft()).setBlocks(121, 200, 201);
public void load()
{
ModLoader.registerBlock(portal);
ModLoader.registerBlock(starter);
ModLoader.addName(portal, "Example Portal");
ModLoader.addName(starter, "Starter Block");
ModLoader.addRecipe(new ItemStack(mod_dinocraft.portal, 1), new Object[] {
"#", Character.valueOf('#'), Item.stick
});
ModLoader.addRecipe(new ItemStack(mod_dinocraft.starter, 1), new Object[] {
"#", "#", Character.valueOf('#'), Item.stick
});
portal.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/mod_dinocraft/portal.png");
starter.blockIndexInTexture = ModLoader.addOverride("/terrain.png", "/mod_dinocraft/starter.png");
}
public String getVersion()
{
return "1.2.4";
}
}
thats my mod file
now for my portal file
package net.minecraft.src;
import java.util.Random;
public class BlockVerticalPortal extends BlockBreakable
{
protected int frameBlockID;
protected int startBlockID;
private int dimToTravel;
public BlockVerticalPortal(int i, int j)
{
super(i, j, Material.portal, false);
setBlockUnbreakable().setStepSound(Block.soundGlassFootstep).setLightValue(0.75F);
}
public BlockVerticalPortal setParameters(int i)
{
dimToTravel = i;
return this;
}
/**
* Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
* cleared to be reused)
*/
public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int i, int j, int k)
{
return null;
}
/**
* Updates the blocks bounds based on its current state. Args: world, x, y, z
*/
public void setBlockBoundsBasedOnState(IBlockAccess iblockaccess, int i, int j, int k)
{
if (iblockaccess.getBlockId(i - 1, j, k) != blockID && iblockaccess.getBlockId(i + 1, j, k) != blockID)
{
float f = 0.125F;
float f2 = 0.5F;
setBlockBounds(0.5F - f, 0.0F, 0.5F - f2, 0.5F + f, 1.0F, 0.5F + f2);
}
else
{
float f1 = 0.5F;
float f3 = 0.125F;
setBlockBounds(0.5F - f1, 0.0F, 0.5F - f3, 0.5F + f1, 1.0F, 0.5F + f3);
}
}
/**
* Is this block (a) opaque and (B) a full 1m cube? This determines whether or not to render the shared face of two
* adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
*/
public boolean isOpaqueCube()
{
return false;
}
/**
* If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
*/
public boolean renderAsNormalBlock()
{
return false;
}
public boolean tryToCreatePortal(World world, int i, int j, int k)
{
int l = 0;
int i1 = 0;
if (world.getBlockId(i - 1, j, k) == frameBlockID || world.getBlockId(i + 1, j, k) == frameBlockID)
{
l = 1;
}
if (world.getBlockId(i, j, k - 1) == frameBlockID || world.getBlockId(i, j, k + 1) == frameBlockID)
{
i1 = 1;
}
if (l == i1)
{
return false;
}
if (world.getBlockId(i - l, j, k - i1) == 0)
{
i -= l;
k -= i1;
}
for (int j1 = -1; j1 <= 2; j1++)
{
for (int l1 = -1; l1 <= 3; l1++)
{
boolean flag = j1 == -1 || j1 == 2 || l1 == -1 || l1 == 3;
if ((j1 == -1 || j1 == 2) && (l1 == -1 || l1 == 3))
{
continue;
}
int j2 = world.getBlockId(i + l * j1, j + l1, k + i1 * j1);
if (flag)
{
if (j2 != frameBlockID)
{
return false;
}
continue;
}
if (j2 != 0 && j2 != mod_dinocraft.starter.blockID)
{
return false;
}
}
}
world.editingBlocks = true;
for (int k1 = 0; k1 < 2; k1++)
{
for (int i2 = 0; i2 < 3; i2++)
{
world.setBlockWithNotify(i + l * k1, j + i2, k + i1 * k1, blockID);
}
}
world.editingBlocks = false;
return true;
}
/**
* 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 world, int i, int j, int k, int l)
{
int i1 = 0;
int j1 = 1;
if (world.getBlockId(i - 1, j, k) == blockID || world.getBlockId(i + 1, j, k) == blockID)
{
i1 = 1;
j1 = 0;
}
int k1;
for (k1 = j; world.getBlockId(i, k1 - 1, k) == blockID; k1--) { }
if (world.getBlockId(i, k1 - 1, k) != frameBlockID)
{
world.setBlockWithNotify(i, j, k, 0);
}
else
{
int l1;
for (l1 = 1; l1 < 4 && world.getBlockId(i, k1 + l1, k) == blockID; l1++) { }
if (l1 == 3 && world.getBlockId(i, k1 + l1, k) == frameBlockID)
{
boolean flag = world.getBlockId(i - 1, j, k) == blockID || world.getBlockId(i + 1, j, k) == blockID;
boolean flag1 = world.getBlockId(i, j, k - 1) == blockID || world.getBlockId(i, j, k + 1) == blockID;
if (flag && flag1)
{
world.setBlockWithNotify(i, j, k, 0);
}
else if ((world.getBlockId(i + i1, j, k + j1) != frameBlockID || world.getBlockId(i - i1, j, k - j1) != blockID) && (world.getBlockId(i - i1, j, k - j1) != frameBlockID || world.getBlockId(i + i1, j, k + j1) != blockID))
{
world.setBlockWithNotify(i, j, k, 0);
}
}
else
{
world.setBlockWithNotify(i, j, k, 0);
}
}
}
/**
* Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
* coordinates. Args: blockAccess, x, y, z, side
*/
public boolean shouldSideBeRendered(IBlockAccess iblockaccess, int i, int j, int k, int l)
{
if (iblockaccess.getBlockId(i, j, k) == blockID)
{
return false;
}
else
{
boolean flag = iblockaccess.getBlockId(i - 1, j, k) == blockID && iblockaccess.getBlockId(i - 2, j, k) != blockID;
boolean flag1 = iblockaccess.getBlockId(i + 1, j, k) == blockID && iblockaccess.getBlockId(i + 2, j, k) != blockID;
boolean flag2 = iblockaccess.getBlockId(i, j, k - 1) == blockID && iblockaccess.getBlockId(i, j, k - 2) != blockID;
boolean flag3 = iblockaccess.getBlockId(i, j, k + 1) == blockID && iblockaccess.getBlockId(i, j, k + 2) != blockID;
boolean flag4 = flag || flag1;
boolean flag5 = flag2 || flag3;
return !flag4 || l != 4 ? !flag4 || l != 5 ? !flag5 || l != 2 ? flag5 && l == 3 : true : true : true;
}
}
/**
* Returns the quantity of items to drop on block destruction.
*/
public int quantityDropped(Random random)
{
return 0;
}
/**
* Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
*/
public int getRenderBlockPass()
{
return 1;
}
/**
* Triggered whenever an entity collides with this block (enters into the block). Args: world, x, y, z, entity
*/
public void onEntityCollidedWithBlock(World world, int i, int j, int k, Entity entity)
{
if ((entity instanceof EntityPlayer) && entity.ridingEntity == null && entity.riddenByEntity == null)
{
if (DimAPIBase.dimList[dimToTravel] != null)
{
DimAPIBase.dimList[dimToTravel].setInPortal(dimToTravel);
}
else
{
throw new RuntimeException(new NullPointerException((new StringBuilder()).append("Cannot find dimension with ID ").append(dimToTravel).toString()));
}
}
}
/**
* A randomly called display update to be able to add particles or other items for display
*/
public void randomDisplayTick(World world, int i, int j, int k, Random random)
{
if (random.nextInt(100) == 0)
{
world.playSoundEffect((double)i + 0.5D, (double)j + 0.5D, (double)k + 0.5D, "portal.portal", 0.5F, random.nextFloat() * 0.4F + 0.8F);
}
for (int l = 0; l < 4; l++)
{
double d = (float)i + random.nextFloat();
double d1 = (float)j + random.nextFloat();
double d2 = (float)k + random.nextFloat();
double d3 = 0.0D;
double d4 = 0.0D;
double d5 = 0.0D;
int i1 = random.nextInt(2) * 2 - 1;
d3 = ((double)random.nextFloat() - 0.5D) * 0.5D;
d4 = ((double)random.nextFloat() - 0.5D) * 0.5D;
d5 = ((double)random.nextFloat() - 0.5D) * 0.5D;
if (world.getBlockId(i - 1, j, k) != blockID && world.getBlockId(i + 1, j, k) != blockID)
{
d = (double)i + 0.5D + 0.25D * (double)i1;
d3 = random.nextFloat() * 2.0F * (float)i1;
}
else
{
d2 = (double)k + 0.5D + 0.25D * (double)i1;
d5 = random.nextFloat() * 2.0F * (float)i1;
}
world.spawnParticle("portal", d, d1, d2, d3, d4, d5);
}
}
}
I am sorry, I forgot portal loop. View last tutorial again, now it should work.
i am having trouble with my portal when i right click the frame with the starter it does nothing and if i place the portal itself down and stand in it it doesnt take me to my dimension
here is my mod_#### file
package net.minecraft.src;
import java.util.Random;
import net.minecraft.client.Minecraft;
public class mod_Crystrum extends BaseMod
{
public static final BlockVerticalPortal portal = (BlockVerticalPortal)new BlockVerticalPortal(241, ModLoader.addOverride("/terrain.png", "/mods/portal.png")).setParameters(10).setBlockName("portal");
public static final BiomeGenBase sea = new BiomeGenSea(40).setBiomeName("Sea");
public static final BiomeGenBase terrain = new BiomeGenTerrain(41).setBiomeName("Terrain");
public static final DimAPIBase dim = new DimAPIBase(10, "Example", new WorldProviderDim()).setBlocks(22, 241, 240);
public static final Block starter = new BlockPortalStarter(240, 1).setBlockName("starter");
public mod_Crystrum()
{
ModLoader.addRecipe(new ItemStack(mod_Crystrum.portal, 1), new Object[]{
"X", Character.valueOf('X'), Block.dirt
});
ModLoader.setInGameHook(this, true, false);
ModLoader.registerBlock(portal);
ModLoader.addName(portal, "Example Portal");
ModLoader.registerBlock(starter);
ModLoader.addName(starter, "Starter Block");
ModLoader.addRecipe(new ItemStack(mod_Crystrum.starter, 1), new Object[]{
"XX", Character.valueOf('X'), Block.dirt
});
}
@Override
public String getVersion() {
// TODO Auto-generated method stub
return null;
}
@Override
public void load() {
// TODO Auto-generated method stub
}
public boolean onTickInGame(float f, Minecraft minecraft)
{
dim.mainPortalLoop();
return false;
}
}
here is my blockvertical file
package net.minecraft.src;
import java.util.Random;
public class BlockVerticalPortal extends BlockBreakable
{
protected int frameBlockID;
protected int startBlockID;
private int dimToTravel;
public BlockVerticalPortal(int var1, int var2)
{
super(var1, var2, Material.portal, false);
this.setBlockUnbreakable().setStepSound(Block.soundGlassFootstep).setLightValue(0.75F);
}
public BlockVerticalPortal setParameters(int var1)
{
this.dimToTravel = var1;
return this;
}
/**
* Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
* cleared to be reused)
*/
public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4)
{
return null;
}
/**
* Updates the blocks bounds based on its current state. Args: world, x, y, z
*/
public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4)
{
float var5;
float var6;
if (var1.getBlockId(var2 - 1, var3, var4) != this.blockID && var1.getBlockId(var2 + 1, var3, var4) != this.blockID)
{
var5 = 0.125F;
var6 = 0.5F;
this.setBlockBounds(0.5F - var5, 0.0F, 0.5F - var6, 0.5F + var5, 1.0F, 0.5F + var6);
}
else
{
var5 = 0.5F;
var6 = 0.125F;
this.setBlockBounds(0.5F - var5, 0.0F, 0.5F - var6, 0.5F + var5, 1.0F, 0.5F + var6);
}
}
/**
* Is this block (a) opaque and (B) a full 1m cube? This determines whether or not to render the shared face of two
* adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
*/
public boolean isOpaqueCube()
{
return false;
}
/**
* If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
*/
public boolean renderAsNormalBlock()
{
return false;
}
public boolean tryToCreatePortal(World var1, int var2, int var3, int var4)
{
byte var5 = 0;
byte var6 = 0;
if (var1.getBlockId(var2 - 1, var3, var4) == this.frameBlockID || var1.getBlockId(var2 + 1, var3, var4) == this.frameBlockID)
{
var5 = 1;
}
if (var1.getBlockId(var2, var3, var4 - 1) == this.frameBlockID || var1.getBlockId(var2, var3, var4 + 1) == this.frameBlockID)
{
var6 = 1;
}
if (var5 == var6)
{
return false;
}
else
{
if (var1.getBlockId(var2 - var5, var3, var4 - var6) == 0)
{
var2 -= var5;
var4 -= var6;
}
int var7;
int var8;
for (var7 = -1; var7 <= 2; ++var7)
{
for (var8 = -1; var8 <= 3; ++var8)
{
boolean var9 = var7 == -1 || var7 == 2 || var8 == -1 || var8 == 3;
if (var7 != -1 && var7 != 2 || var8 != -1 && var8 != 3)
{
int var10 = var1.getBlockId(var2 + var5 * var7, var3 + var8, var4 + var6 * var7);
if (var9)
{
if (var10 != this.frameBlockID)
{
return false;
}
}
else if (var10 != 0 && var10 != mod_Crystrum.starter.blockID)
{
return false;
}
}
}
}
var1.editingBlocks = true;
for (var7 = 0; var7 < 2; ++var7)
{
for (var8 = 0; var8 < 3; ++var8)
{
var1.setBlockWithNotify(var2 + var5 * var7, var3 + var8, var4 + var6 * var7, this.blockID);
}
}
var1.editingBlocks = false;
return true;
}
}
/**
* 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 var1, int var2, int var3, int var4, int var5)
{
byte var6 = 0;
byte var7 = 1;
if (var1.getBlockId(var2 - 1, var3, var4) == this.blockID || var1.getBlockId(var2 + 1, var3, var4) == this.blockID)
{
var6 = 1;
var7 = 0;
}
int var8;
for (var8 = var3; var1.getBlockId(var2, var8 - 1, var4) == this.blockID; --var8)
{
;
}
if (var1.getBlockId(var2, var8 - 1, var4) != this.frameBlockID)
{
var1.setBlockWithNotify(var2, var3, var4, 0);
}
else
{
int var9;
for (var9 = 1; var9 < 4 && var1.getBlockId(var2, var8 + var9, var4) == this.blockID; ++var9)
{
;
}
if (var9 == 3 && var1.getBlockId(var2, var8 + var9, var4) == this.frameBlockID)
{
boolean var10 = var1.getBlockId(var2 - 1, var3, var4) == this.blockID || var1.getBlockId(var2 + 1, var3, var4) == this.blockID;
boolean var11 = var1.getBlockId(var2, var3, var4 - 1) == this.blockID || var1.getBlockId(var2, var3, var4 + 1) == this.blockID;
if (var10 && var11)
{
var1.setBlockWithNotify(var2, var3, var4, 0);
}
else if ((var1.getBlockId(var2 + var6, var3, var4 + var7) != this.frameBlockID || var1.getBlockId(var2 - var6, var3, var4 - var7) != this.blockID) && (var1.getBlockId(var2 - var6, var3, var4 - var7) != this.frameBlockID || var1.getBlockId(var2 + var6, var3, var4 + var7) != this.blockID))
{
var1.setBlockWithNotify(var2, var3, var4, 0);
}
}
else
{
var1.setBlockWithNotify(var2, var3, var4, 0);
}
}
}
/**
* Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
* coordinates. Args: blockAccess, x, y, z, side
*/
public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5)
{
if (var1.getBlockId(var2, var3, var4) == this.blockID)
{
return false;
}
else
{
boolean var6 = var1.getBlockId(var2 - 1, var3, var4) == this.blockID && var1.getBlockId(var2 - 2, var3, var4) != this.blockID;
boolean var7 = var1.getBlockId(var2 + 1, var3, var4) == this.blockID && var1.getBlockId(var2 + 2, var3, var4) != this.blockID;
boolean var8 = var1.getBlockId(var2, var3, var4 - 1) == this.blockID && var1.getBlockId(var2, var3, var4 - 2) != this.blockID;
boolean var9 = var1.getBlockId(var2, var3, var4 + 1) == this.blockID && var1.getBlockId(var2, var3, var4 + 2) != this.blockID;
boolean var10 = var6 || var7;
boolean var11 = var8 || var9;
return var10 && var5 == 4 ? true : (var10 && var5 == 5 ? true : (var11 && var5 == 2 ? true : var11 && var5 == 3));
}
}
/**
* Returns the quantity of items to drop on block destruction.
*/
public int quantityDropped(Random var1)
{
return 0;
}
/**
* Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
*/
public int getRenderBlockPass()
{
return 1;
}
/**
* 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 instanceof EntityPlayer && var5.ridingEntity == null && var5.riddenByEntity == null)
{
if (DimAPIBase.dimList[this.dimToTravel] == null)
{
throw new RuntimeException(new NullPointerException("Cannot find dimension with ID " + this.dimToTravel));
}
DimAPIBase.dimList[this.dimToTravel].setInPortal(this.dimToTravel);
}
}
/**
* A randomly called display update to be able to add particles or other items for display
*/
public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5)
{
if (var5.nextInt(100) == 0)
{
var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "portal.portal", 0.5F, var5.nextFloat() * 0.4F + 0.8F);
}
for (int var6 = 0; var6 < 4; ++var6)
{
double var7 = (double)((float)var2 + var5.nextFloat());
double var9 = (double)((float)var3 + var5.nextFloat());
double var11 = (double)((float)var4 + var5.nextFloat());
double var13 = 0.0D;
double var15 = 0.0D;
double var17 = 0.0D;
int var19 = var5.nextInt(2) * 2 - 1;
var13 = ((double)var5.nextFloat() - 0.5D) * 0.5D;
var15 = ((double)var5.nextFloat() - 0.5D) * 0.5D;
var17 = ((double)var5.nextFloat() - 0.5D) * 0.5D;
if (var1.getBlockId(var2 - 1, var3, var4) != this.blockID && var1.getBlockId(var2 + 1, var3, var4) != this.blockID)
{
var7 = (double)var2 + 0.5D + 0.25D * (double)var19;
var13 = (double)(var5.nextFloat() * 2.0F * (float)var19);
}
else
{
var11 = (double)var4 + 0.5D + 0.25D * (double)var19;
var17 = (double)(var5.nextFloat() * 2.0F * (float)var19);
}
var1.spawnParticle("portal", var7, var9, var11, var13, var15, var17);
}
}
}
package net.minecraft.src;
import java.util.Random;
import net.minecraft.client.Minecraft;
public class mod_Crystrum extends BaseMod
{
public static final BlockVerticalPortal portal = (BlockVerticalPortal)new BlockVerticalPortal(241, ModLoader.addOverride("/terrain.png", "/mods/portal.png")).setParameters(10).setBlockName("portal");
public static final BiomeGenBase sea = new BiomeGenSea(40).setBiomeName("Sea");
public static final BiomeGenBase terrain = new BiomeGenTerrain(41).setBiomeName("Terrain");
public static final DimAPIBase dim = new DimAPIBase(10, "Example", new WorldProviderDim()).setBlocks(22, 241, 240);
public static final Block starter = new BlockPortalStarter(240, 1).setBlockName("starter");
public mod_Crystrum()
{
ModLoader.addRecipe(new ItemStack(mod_Crystrum.portal, 1), new Object[]{
"X", Character.valueOf('X'), Block.dirt
});
ModLoader.setInGameHook(this, true, false);
ModLoader.registerBlock(portal);
ModLoader.addName(portal, "Example Portal");
ModLoader.registerBlock(starter);
ModLoader.addName(starter, "Starter Block");
ModLoader.addRecipe(new ItemStack(mod_Crystrum.starter, 1), new Object[]{
"XX", Character.valueOf('X'), Block.dirt
});
}
@Override
public String getVersion() {
// TODO Auto-generated method stub
return null;
}
@Override
public void load() {
// TODO Auto-generated method stub
}
public boolean onTickInGame(float f, Minecraft minecraft)
{
dim.mainPortalLoop();
return false;
}
}
here is my blockverticalportal file
package net.minecraft.src;
import java.util.Random;
public class BlockVerticalPortal extends BlockBreakable
{
protected int frameBlockID;
protected int startBlockID;
private int dimToTravel;
public BlockVerticalPortal(int var1, int var2)
{
super(var1, var2, Material.portal, false);
this.setBlockUnbreakable().setStepSound(Block.soundGlassFootstep).setLightValue(0.75F);
}
public BlockVerticalPortal setParameters(int var1)
{
this.dimToTravel = var1;
return this;
}
/**
* Returns a bounding box from the pool of bounding boxes (this means this box can change after the pool has been
* cleared to be reused)
*/
public AxisAlignedBB getCollisionBoundingBoxFromPool(World var1, int var2, int var3, int var4)
{
return null;
}
/**
* Updates the blocks bounds based on its current state. Args: world, x, y, z
*/
public void setBlockBoundsBasedOnState(IBlockAccess var1, int var2, int var3, int var4)
{
float var5;
float var6;
if (var1.getBlockId(var2 - 1, var3, var4) != this.blockID && var1.getBlockId(var2 + 1, var3, var4) != this.blockID)
{
var5 = 0.125F;
var6 = 0.5F;
this.setBlockBounds(0.5F - var5, 0.0F, 0.5F - var6, 0.5F + var5, 1.0F, 0.5F + var6);
}
else
{
var5 = 0.5F;
var6 = 0.125F;
this.setBlockBounds(0.5F - var5, 0.0F, 0.5F - var6, 0.5F + var5, 1.0F, 0.5F + var6);
}
}
/**
* Is this block (a) opaque and (B) a full 1m cube? This determines whether or not to render the shared face of two
* adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
*/
public boolean isOpaqueCube()
{
return false;
}
/**
* If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
*/
public boolean renderAsNormalBlock()
{
return false;
}
public boolean tryToCreatePortal(World var1, int var2, int var3, int var4)
{
byte var5 = 0;
byte var6 = 0;
if (var1.getBlockId(var2 - 1, var3, var4) == this.frameBlockID || var1.getBlockId(var2 + 1, var3, var4) == this.frameBlockID)
{
var5 = 1;
}
if (var1.getBlockId(var2, var3, var4 - 1) == this.frameBlockID || var1.getBlockId(var2, var3, var4 + 1) == this.frameBlockID)
{
var6 = 1;
}
if (var5 == var6)
{
return false;
}
else
{
if (var1.getBlockId(var2 - var5, var3, var4 - var6) == 0)
{
var2 -= var5;
var4 -= var6;
}
int var7;
int var8;
for (var7 = -1; var7 <= 2; ++var7)
{
for (var8 = -1; var8 <= 3; ++var8)
{
boolean var9 = var7 == -1 || var7 == 2 || var8 == -1 || var8 == 3;
if (var7 != -1 && var7 != 2 || var8 != -1 && var8 != 3)
{
int var10 = var1.getBlockId(var2 + var5 * var7, var3 + var8, var4 + var6 * var7);
if (var9)
{
if (var10 != this.frameBlockID)
{
return false;
}
}
else if (var10 != 0 && var10 != mod_Crystrum.starter.blockID)
{
return false;
}
}
}
}
var1.editingBlocks = true;
for (var7 = 0; var7 < 2; ++var7)
{
for (var8 = 0; var8 < 3; ++var8)
{
var1.setBlockWithNotify(var2 + var5 * var7, var3 + var8, var4 + var6 * var7, this.blockID);
}
}
var1.editingBlocks = false;
return true;
}
}
/**
* 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 var1, int var2, int var3, int var4, int var5)
{
byte var6 = 0;
byte var7 = 1;
if (var1.getBlockId(var2 - 1, var3, var4) == this.blockID || var1.getBlockId(var2 + 1, var3, var4) == this.blockID)
{
var6 = 1;
var7 = 0;
}
int var8;
for (var8 = var3; var1.getBlockId(var2, var8 - 1, var4) == this.blockID; --var8)
{
;
}
if (var1.getBlockId(var2, var8 - 1, var4) != this.frameBlockID)
{
var1.setBlockWithNotify(var2, var3, var4, 0);
}
else
{
int var9;
for (var9 = 1; var9 < 4 && var1.getBlockId(var2, var8 + var9, var4) == this.blockID; ++var9)
{
;
}
if (var9 == 3 && var1.getBlockId(var2, var8 + var9, var4) == this.frameBlockID)
{
boolean var10 = var1.getBlockId(var2 - 1, var3, var4) == this.blockID || var1.getBlockId(var2 + 1, var3, var4) == this.blockID;
boolean var11 = var1.getBlockId(var2, var3, var4 - 1) == this.blockID || var1.getBlockId(var2, var3, var4 + 1) == this.blockID;
if (var10 && var11)
{
var1.setBlockWithNotify(var2, var3, var4, 0);
}
else if ((var1.getBlockId(var2 + var6, var3, var4 + var7) != this.frameBlockID || var1.getBlockId(var2 - var6, var3, var4 - var7) != this.blockID) && (var1.getBlockId(var2 - var6, var3, var4 - var7) != this.frameBlockID || var1.getBlockId(var2 + var6, var3, var4 + var7) != this.blockID))
{
var1.setBlockWithNotify(var2, var3, var4, 0);
}
}
else
{
var1.setBlockWithNotify(var2, var3, var4, 0);
}
}
}
/**
* Returns true if the given side of this block type should be rendered, if the adjacent block is at the given
* coordinates. Args: blockAccess, x, y, z, side
*/
public boolean shouldSideBeRendered(IBlockAccess var1, int var2, int var3, int var4, int var5)
{
if (var1.getBlockId(var2, var3, var4) == this.blockID)
{
return false;
}
else
{
boolean var6 = var1.getBlockId(var2 - 1, var3, var4) == this.blockID && var1.getBlockId(var2 - 2, var3, var4) != this.blockID;
boolean var7 = var1.getBlockId(var2 + 1, var3, var4) == this.blockID && var1.getBlockId(var2 + 2, var3, var4) != this.blockID;
boolean var8 = var1.getBlockId(var2, var3, var4 - 1) == this.blockID && var1.getBlockId(var2, var3, var4 - 2) != this.blockID;
boolean var9 = var1.getBlockId(var2, var3, var4 + 1) == this.blockID && var1.getBlockId(var2, var3, var4 + 2) != this.blockID;
boolean var10 = var6 || var7;
boolean var11 = var8 || var9;
return var10 && var5 == 4 ? true : (var10 && var5 == 5 ? true : (var11 && var5 == 2 ? true : var11 && var5 == 3));
}
}
/**
* Returns the quantity of items to drop on block destruction.
*/
public int quantityDropped(Random var1)
{
return 0;
}
/**
* Returns which pass should this block be rendered on. 0 for solids and 1 for alpha
*/
public int getRenderBlockPass()
{
return 1;
}
/**
* 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 instanceof EntityPlayer && var5.ridingEntity == null && var5.riddenByEntity == null)
{
if (DimAPIBase.dimList[this.dimToTravel] == null)
{
throw new RuntimeException(new NullPointerException("Cannot find dimension with ID " + this.dimToTravel));
}
DimAPIBase.dimList[this.dimToTravel].setInPortal(this.dimToTravel);
}
}
/**
* A randomly called display update to be able to add particles or other items for display
*/
public void randomDisplayTick(World var1, int var2, int var3, int var4, Random var5)
{
if (var5.nextInt(100) == 0)
{
var1.playSoundEffect((double)var2 + 0.5D, (double)var3 + 0.5D, (double)var4 + 0.5D, "portal.portal", 0.5F, var5.nextFloat() * 0.4F + 0.8F);
}
for (int var6 = 0; var6 < 4; ++var6)
{
double var7 = (double)((float)var2 + var5.nextFloat());
double var9 = (double)((float)var3 + var5.nextFloat());
double var11 = (double)((float)var4 + var5.nextFloat());
double var13 = 0.0D;
double var15 = 0.0D;
double var17 = 0.0D;
int var19 = var5.nextInt(2) * 2 - 1;
var13 = ((double)var5.nextFloat() - 0.5D) * 0.5D;
var15 = ((double)var5.nextFloat() - 0.5D) * 0.5D;
var17 = ((double)var5.nextFloat() - 0.5D) * 0.5D;
if (var1.getBlockId(var2 - 1, var3, var4) != this.blockID && var1.getBlockId(var2 + 1, var3, var4) != this.blockID)
{
var7 = (double)var2 + 0.5D + 0.25D * (double)var19;
var13 = (double)(var5.nextFloat() * 2.0F * (float)var19);
}
else
{
var11 = (double)var4 + 0.5D + 0.25D * (double)var19;
var17 = (double)(var5.nextFloat() * 2.0F * (float)var19);
}
var1.spawnParticle("portal", var7, var9, var11, var13, var15, var17);
}
}
}
1. Vertical Portal
Vertical Portal block is the easiest thing in this API. You only need to register portal block and starter block through your mod_Name file. Here is the example code:
2. Biome and World Provider
BiomeGenSea.java:
WorldProviderDim:
3. Basic dimension
Well, here it goes - DIMENSION. Actually, the creation of dimension is easier than world provider. Like with portal, you only need to register your dimension through your mod_Name file. Here is a complete code that includes all lines from previous tutorials:
Other tutorials coming soon!!!
As you can tell I have not been very patient with shockah either.... lol
Well I can't get youtube to work right now... Wont let me sign in... Wont bring up the webpage to sign in so I used mediafire and its a quicktime .mov file... Tell me if you cant watch it and i will upload it to youtube later...
http://www.mediafire...nzlpx6vjq6vhrdv
It is Pudelhund's Dimension API. I think he made it with old deobfuscation tables. Tutorial on his API is on the first page of Tutorials forum.
It is here.
thats my mod file
now for my portal file
I am sorry, I forgot portal loop. View last tutorial again, now it should work.
Try to decompile using fernflower. Put it in your MCP/runtime/bin folder.
thanks! trying it now
EDIT: works thanks
And uhh well here are my mod files....
http://www.mediafire.com/?vr4a4aj7hs06bvf
Can I see your code?
here is my mod_#### file
here is my blockvertical file
here is my mod_#### file
here is my blockverticalportal file