Modding: Dimension Basic Teleporter

In this tutorial I will show you how to make your own basic Teleporter. A couple tutorials ago you have made this block file.


package Tutorial.common;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import net.minecraft.src.AxisAlignedBB;
import net.minecraft.src.BlockPortalBase;
import net.minecraft.src.CreativeTabs;
import net.minecraft.src.IBlockAccess;
import net.minecraft.src.ItemStack;
import net.minecraft.src.Material;
import net.minecraft.src.Teleporter;
import net.minecraft.src.World;
import net.minecraft.src.WorldProviderBase;

public class BlockTutorialPortal extends BlockPortalBase
{
    public BlockTutorialPortal(int i, int j)
    {
        super(i, j, Material.portal);
        this.setCreativeTab(CreativeTabs.tabBlock);
    }
    
    public String getTextureFile()
    {
            return “/TutTextures.png”;
    }
    
    public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
    {
        return null;
    }
    
    public WorldProviderBase getDimension()
{
return new WorldProviderTutorial();
}
    
    public Teleporter getTeleporter()
{
return new TeleporterTutorial();
}
    
    public List canTeleportFromDimension()
{
ArrayList list = new ArrayList();
list.add(0);
list.add(-1);
return list;
}
    
public boolean displayPortalOverlay()
    {
        return true;
    }

public int getOverlayTexture()
{
return blockIndexInTexture;
}

public String getEnteringMessage() 
{
return “Entering The Dimension.”;
}

public String getLeavingMessage() 
{
return “Leaving The Dimension.”;
}

    public int quantityDropped(Random par1Random)
    {
        return 1;
    }
}


Now create the Teleporter by hovering your mouse over it and clicking Create Class.
It should look like this.


package Tutorial.common;

import net.minecraft.src.Teleporter;

public class TeleporterTutorial extends Teleporter {

}


Now you should change it into this.


package Tutorial.common;

import java.util.Random;

import net.minecraft.src.Block;
import net.minecraft.src.Entity;
import net.minecraft.src.MathHelper;
import net.minecraft.src.Teleporter;
import net.minecraft.src.World;

public class TeleporterTutorial extends Teleporter
{
private Random random;

    public TeleporterTutorial()
    {
        random = new Random();
    }

    public void placeInPortal(World world, Entity entity)
    {
        if (placeInExistingPortal(world, entity))
        {
            return;
        }
        else
        {
            createPortal(world, entity);
            placeInExistingPortal(world, entity);
            return;
        }
    }

    public boolean placeInExistingPortal(World world, Entity entity)
    {
        char c = ‘\200′;
        double d = -1D;
        int i = 0;
        int j = 0;
        int k = 0;
        int l = MathHelper.floor_double(entity.posX);
        int i1 = MathHelper.floor_double(entity.posZ);
        for (int j1 = l – c; j1 <= l + c; j1++)
        {
            double d1 = ((double)j1 + 0.5D) – entity.posX;
            for (int j2 = i1 – c; j2 <= i1 + c; j2++)
            {
                double d3 = ((double)j2 + 0.5D) – entity.posZ;
                for (int k2 = 128 – 1; k2 >= 0; k2–)
                {
                    if (world.getBlockId(j1, k2, j2) != Tutorial.teleporter.blockID)
                    {
                        continue;
                    }
                    for (; world.getBlockId(j1, k2 – 1, j2) == Tutorial.teleporter.blockID; k2–) { }
                    double d5 = ((double)k2 + 0.5D) – entity.posY;
                    double d7 = d1 * d1 + d5 * d5 + d3 * d3;
                    if (d < 0.0D || d7 < d)
                    {
                        d = d7;
                        i = j1;
                        j = k2;
                        k = j2;
                    }
                }
            }
        }

        if (d >= 0.0D)
        {
            int k1 = i;
            int l1 = j;
            int i2 = k;
            double d2 = (double)k1 + 0.5D;
            double d4 = (double)l1 + 0.5D;
            double d6 = (double)i2 + 0.5D;
            if (world.getBlockId(k1 – 1, l1, i2) == Tutorial.teleporter.blockID)
            {
                d2 -= 0.5D;
            }
            if (world.getBlockId(k1 + 1, l1, i2) == Tutorial.teleporter.blockID)
            {
                d2 += 0.5D;
            }
            if (world.getBlockId(k1, l1, i2 – 1) == Tutorial.teleporter.blockID)
            {
                d6 -= 0.5D;
            }
            if (world.getBlockId(k1, l1, i2 + 1) == Tutorial.teleporter.blockID)
            {
                d6 += 0.5D;
            }
            entity.setLocationAndAngles(d2, d4, d6, entity.rotationYaw, 0.0F);
            entity.motionX = entity.motionY = entity.motionZ = 0.0D;
            return true;
        }
        else
        {
            return false;
        }
    }

    public boolean createPortal(World world, Entity entity)
    {
        byte byte0 = 16;
        double d = -1D;
        int i = MathHelper.floor_double(entity.posX);
        int j = MathHelper.floor_double(entity.posY);
        int k = MathHelper.floor_double(entity.posZ);
        int l = i;
        int i1 = j;
        int j1 = k;
        int k1 = 0;
        int l1 = random.nextInt(4);
        for (int i2 = i – byte0; i2 <= i + byte0; i2++)
        {
            double d1 = ((double)i2 + 0.5D) – entity.posX;
            for (int j3 = k – byte0; j3 <= k + byte0; j3++)
            {
                double d3 = ((double)j3 + 0.5D) – entity.posZ;
                for (int k4 = 128 – 1; k4 >= 0; k4–)
                {
                    if (!world.isAirBlock(i2, k4, j3))
                    {
                        continue;
                    }
                    for (; k4 > 0 && world.isAirBlock(i2, k4 – 1, j3); k4–) { }
                    label0:
                    for (int k5 = l1; k5 < l1 + 4; k5++)
                    {
                        int l6 = k5 % 2;
                        int i8 = 1 – l6;
                        if (k5 % 4 >= 2)
                        {
                            l6 = -l6;
                            i8 = -i8;
                        }
                        for (int j9 = 0; j9 < 3; j9++)
                        {
                            for (int k10 = 0; k10 < 4; k10++)
                            {
                                for (int l11 = -1; l11 < 4; l11++)
                                {
                                    int j12 = i2 + (k10 – 1) * l6 + j9 * i8;
                                    int l12 = k4 + l11;
                                    int j13 = (j3 + (k10 – 1) * i8) – j9 * l6;
                                    if (l11 < 0 && !world.getBlockMaterial(j12, l12, j13).isSolid() || l11 >= 0 && !world.isAirBlock(j12, l12, j13))
                                    {
                                        break label0;
                                    }
                                }
                            }
                        }

                        double d5 = ((double)k4 + 0.5D) – entity.posY;
                        double d7 = d1 * d1 + d5 * d5 + d3 * d3;
                        if (d < 0.0D || d7 < d)
                        {
                            d = d7;
                            l = i2;
                            i1 = k4;
                            j1 = j3;
                            k1 = k5 % 4;
                        }
                    }
                }
            }
        }

        if (d < 0.0D)
        {
            for (int j2 = i – byte0; j2 <= i + byte0; j2++)
            {
                double d2 = ((double)j2 + 0.5D) – entity.posX;
                for (int k3 = k – byte0; k3 <= k + byte0; k3++)
                {
                    double d4 = ((double)k3 + 0.5D) – entity.posZ;
                    for (int l4 = 128 – 1; l4 >= 0; l4–)
                    {
                        if (!world.isAirBlock(j2, l4, k3))
                        {
                            continue;
                        }
                        for (; l4 > 0 && world.isAirBlock(j2, l4 – 1, k3); l4–) { }
                        label1:
                        for (int l5 = l1; l5 < l1 + 2; l5++)
                        {
                            int i7 = l5 % 2;
                            int j8 = 1 – i7;
                            for (int k9 = 0; k9 < 4; k9++)
                            {
                                for (int l10 = -1; l10 < 4; l10++)
                                {
                                    int i12 = j2 + (k9 – 1) * i7;
                                    int k12 = l4 + l10;
                                    int i13 = k3 + (k9 – 1) * j8;
                                    if (l10 < 0 && !world.getBlockMaterial(i12, k12, i13).isSolid() || l10 >= 0 && !world.isAirBlock(i12, k12, i13))
                                    {
                                        break label1;
                                    }
                                }
                            }

                            double d6 = ((double)l4 + 0.5D) – entity.posY;
                            double d8 = d2 * d2 + d6 * d6 + d4 * d4;
                            if (d < 0.0D || d8 < d)
                            {
                                d = d8;
                                l = j2;
                                i1 = l4;
                                j1 = k3;
                                k1 = l5 % 2;
                            }
                        }
                    }
                }
            }
        }
        int k2 = k1;
        int l2 = l;
        int i3 = i1;
        int l3 = j1;
        int i4 = k2 % 2;
        int j4 = 1 – i4;
        if (k2 % 4 >= 2)
        {
            i4 = -i4;
            j4 = -j4;
        }
        if (d < 0.0D)
        {
            if (i1 < 70)
            {
                i1 = 70;
            }
            if (i1 > 128 – 10)
            {
                i1 = 128 – 10;
            }
            i3 = i1;
            for (int i5 = -1; i5 <= 1; i5++)
            {
                for (int i6 = 1; i6 < 3; i6++)
                {
                    for (int j7 = -1; j7 < 3; j7++)
                    {
                        int k8 = l2 + (i6 – 1) * i4 + i5 * j4;
                        int l9 = i3 + j7;
                        int i11 = (l3 + (i6 – 1) * j4) – i5 * i4;
                        boolean flag = j7 < 0;
                        world.setBlockWithNotify(k8, l9, i11, flag ? Block.stoneBrick.blockID : 0);
                    }
                }
            }
        }
        for (int j5 = 0; j5 < 4; j5++)
        {
            world.editingBlocks = true;
            
            for (int j6 = 0; j6 < 4; j6++)
            {
                for (int k7 = -1; k7 < 4; k7++)
                {
                    int l8 = l2 + (j6 – 1) * i4;
                    int i10 = i3 + k7;
                    int j11 = l3 + (j6 – 1) * j4;
                    boolean flag1 = j6 == 0 || j6 == 3 || k7 == -1 || k7 == 3;
                    world.setBlockWithNotify(l8, i10, j11, flag1 ? Block.stoneBrick.blockID : Tutorial.teleporter.blockID);
                }
            }

            world.editingBlocks = false;
            for (int k6 = 0; k6 < 4; k6++)
            {
                for (int l7 = -1; l7 < 4; l7++)
                {
                    int i9 = l2 + (k6 – 1) * i4;
                    int j10 = i3 + l7;
                    int k11 = l3 + (k6 – 1) * j4;
                    world.notifyBlocksOfNeighborChange(i9, j10, k11, world.getBlockId(i9, j10, k11));
                }
            }
        }

        return true;
    }
}


This file has some really complicated code in it, but it simply creates the portal for you or finds an existing one nearby. The shape of the portals is the same as with nether portals. All of the method names should be self explanatory.
If you want this to work with your own teleportation block change Tutorial.teleporter into YourModFile.YourTeleporter. The blocks around the portal are done by the 2 Block.stoneBrick lines. You could of course change those into anything you want.

In the next tutorial I will show you how to finish of your dimension.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">