Jump to content

Forge dimension teleportation


wuppy29

Recommended Posts

Before I have been working with the dimension api, but in the next update for my mod I wanted to drop the api and use just forge.

I have taken out all the dimension api code and everything works except for the teleportation code. This is the code I have right now.

 

BlockGoblinPortal

[hide]

package GoblinsGiants.common;

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

import net.minecraft.server.MinecraftServer;
import net.minecraft.src.AxisAlignedBB;
import net.minecraft.src.BlockPortal;
import net.minecraft.src.CreativeTabs;
import net.minecraft.src.Entity;
import net.minecraft.src.EntityList;
import net.minecraft.src.EntityPlayerMP;
import net.minecraft.src.EntityPlayerSP;
import net.minecraft.src.IBlockAccess;
import net.minecraft.src.Material;
import net.minecraft.src.ModLoader;
import net.minecraft.src.Teleporter;
import net.minecraft.src.World;
import net.minecraft.src.WorldProvider;
import net.minecraft.src.WorldServer;

public class BlockGoblinPortal extends BlockPortal
{
public TeleporterGoblinsGiants teleporter = new TeleporterGoblinsGiants();

    public BlockGoblinPortal(int i, int j)
    {
        super(i, j);
        this.setCreativeTab(CreativeTabs.tabBlock);
    }
    
    public String getTextureFile()
    {
            return "/GoblinGiant/BlockGoblinGiant.png";
    }
    
    public void setBlockBoundsBasedOnState(IBlockAccess par1IBlockAccess, int par2, int par3, int par4)
    {
        float var5;
        float var6;

        if (par1IBlockAccess.getBlockId(par2 - 1, par3, par4) != this.blockID && par1IBlockAccess.getBlockId(par2 + 1, par3, par4) != 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);
        }
    }
    
    public AxisAlignedBB getCollisionBoundingBoxFromPool(World par1World, int par2, int par3, int par4)
    {
        return null;
    }
    
    public void onEntityCollidedWithBlock(World par1World, int par2, int par3, int par4, Entity par5Entity)
    {
    	if (!par5Entity.worldObj.isRemote && !par5Entity.isDead)
        {
            MinecraftServer var2 = MinecraftServer.getServer();
            int var3 = par5Entity.dimension;
            WorldServer var4 = var2.worldServerForDimension(var3);
            WorldServer var5 = var2.worldServerForDimension(12);
            par5Entity.dimension = 12;
            par5Entity.worldObj.setEntityDead(par5Entity);
            par5Entity.isDead = false;
            var2.getConfigurationManager().func_82448_a(par5Entity, var3, var4, var5);
            Entity var6 = EntityList.createEntityByName(EntityList.getEntityString(par5Entity), var5);

            if (var6 != null)
            {
                var6.func_82141_a(par5Entity, true);
                var5.spawnEntityInWorld(var6);
            }

            par5Entity.isDead = true;
            var4.func_82742_i();
            var5.func_82742_i();
        }
    	/*if (par5Entity.ridingEntity == null && par5Entity.riddenByEntity == null)
        {
    		
    		if(ModLoader.getMinecraftInstance().thePlayer.timeUntilPortal == 0)
            {
            	if(ModLoader.getMinecraftInstance().thePlayer.dimension != 12)
            	{
            		ModLoader.getMinecraftInstance().thePlayer.timeUntilPortal = 10;
            		MinecraftServer.getServer().getConfigurationManager().transferPlayerToDimension((EntityPlayerMP)par5Entity, 12, new TeleporterGoblinsGiants());
            	}
            	else
            	{
            		ModLoader.getMinecraftInstance().thePlayer.timeUntilPortal = 10;
            		MinecraftServer.getServer().getConfigurationManager().transferPlayerToDimension((EntityPlayerMP)par5Entity, 1, new TeleporterGoblinsGiants());
            	}
            }
            else
            {
            	ModLoader.getMinecraftInstance().thePlayer.timeUntilPortal = 10;
            }
        }*/
    }
    
    public WorldProvider getDimension()
{
	return new WorldProviderGoblinsGiants();
}
    
    public Teleporter getTeleporter()
{
	return new TeleporterGoblinsGiants();
}
    
    public List canTeleportFromDimension()
{
	ArrayList list = new ArrayList();
	list.add(0);
	list.add(-1);
	return list;
}
    
    public boolean isOpaqueCube()
    {
        return false;
    }

    public boolean renderAsNormalBlock()
    {
        return false;
    }
    
public boolean displayPortalOverlay()
    {
        return true;
    }

public int getOverlayTexture()
{
	return blockIndexInTexture;
}

public String getEnteringMessage() 
{
	return "Entering The Savannah.";
}

public String getLeavingMessage() 
{
	return "Leaving The Savannah.";
}

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

[/hide]

 

TeleporterGoblinsGiants

[hide]

package GoblinsGiants.common;

import java.util.Random;

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

public class TeleporterGoblinsGiants extends Teleporter
{
    /** A private Random() function in Teleporter */
    private Random random = new Random();

    /**
     * Place an entity in a nearby portal, creating one if necessary.
     */
    public void placeInPortal(World par1World, Entity par2Entity, double par3, double par5, double par7, float par9)
    {
        if (par1World.provider.dimensionId != 1)
        {
            if (!this.placeInExistingPortal(par1World, par2Entity, par3, par5, par7, par9))
            {
                this.createPortal(par1World, par2Entity);
                this.placeInExistingPortal(par1World, par2Entity, par3, par5, par7, par9);
            }
        }
        else
        {
            int var10 = MathHelper.floor_double(par2Entity.posX);
            int var11 = MathHelper.floor_double(par2Entity.posY) - 1;
            int var12 = MathHelper.floor_double(par2Entity.posZ);
            byte var13 = 1;
            byte var14 = 0;

            for (int var15 = -2; var15 <= 2; ++var15)
            {
                for (int var16 = -2; var16 <= 2; ++var16)
                {
                    for (int var17 = -1; var17 < 3; ++var17)
                    {
                        int var18 = var10 + var16 * var13 + var15 * var14;
                        int var19 = var11 + var17;
                        int var20 = var12 + var16 * var14 - var15 * var13;
                        boolean var21 = var17 < 0;
                        par1World.setBlockWithNotify(var18, var19, var20, var21 ? Block.obsidian.blockID : 0);
                    }
                }
            }

            par2Entity.setLocationAndAngles((double)var10, (double)var11, (double)var12, par2Entity.rotationYaw, 0.0F);
            par2Entity.motionX = par2Entity.motionY = par2Entity.motionZ = 0.0D;
        }
    }

    /**
     * Place an entity in a nearby portal which already exists.
     */
    public boolean placeInExistingPortal(World par1World, Entity par2Entity, double par3, double par5, double par7, float par9)
    {
        short var10 = 128;
        double var11 = -1.0D;
        int var13 = 0;
        int var14 = 0;
        int var15 = 0;
        int var16 = MathHelper.floor_double(par2Entity.posX);
        int var17 = MathHelper.floor_double(par2Entity.posZ);
        int var18;
        double var25;

        for (var18 = var16 - var10; var18 <= var16 + var10; ++var18)
        {
            double var19 = (double)var18 + 0.5D - par2Entity.posX;

            for (int var21 = var17 - var10; var21 <= var17 + var10; ++var21)
            {
                double var22 = (double)var21 + 0.5D - par2Entity.posZ;

                for (int var24 = par1World.getActualHeight() - 1; var24 >= 0; --var24)
                {
                    if (par1World.getBlockId(var18, var24, var21) == Block.portal.blockID)
                    {
                        while (par1World.getBlockId(var18, var24 - 1, var21) == Block.portal.blockID)
                        {
                            --var24;
                        }

                        var25 = (double)var24 + 0.5D - par2Entity.posY;
                        double var27 = var19 * var19 + var25 * var25 + var22 * var22;

                        if (var11 < 0.0D || var27 < var11)
                        {
                            var11 = var27;
                            var13 = var18;
                            var14 = var24;
                            var15 = var21;
                        }
                    }
                }
            }
        }

        if (var11 < 0.0D)
        {
            return false;
        }
        else
        {
            double var46 = (double)var13 + 0.5D;
            double var23 = (double)var14 + 0.5D;
            var25 = (double)var15 + 0.5D;
            int var47 = -1;

            if (par1World.getBlockId(var13 - 1, var14, var15) == Block.portal.blockID)
            {
                var47 = 2;
            }

            if (par1World.getBlockId(var13 + 1, var14, var15) == Block.portal.blockID)
            {
                var47 = 0;
            }

            if (par1World.getBlockId(var13, var14, var15 - 1) == Block.portal.blockID)
            {
                var47 = 3;
            }

            if (par1World.getBlockId(var13, var14, var15 + 1) == Block.portal.blockID)
            {
                var47 = 1;
            }

            int var28 = par2Entity.func_82148_at();

            if (var47 > -1)
            {
                int var29 = Direction.field_71578_g[var47];
                int var30 = Direction.offsetX[var47];
                int var31 = Direction.offsetZ[var47];
                int var32 = Direction.offsetX[var29];
                int var33 = Direction.offsetZ[var29];
                boolean var34 = !par1World.isAirBlock(var13 + var30 + var32, var14, var15 + var31 + var33) || !par1World.isAirBlock(var13 + var30 + var32, var14 + 1, var15 + var31 + var33);
                boolean var35 = !par1World.isAirBlock(var13 + var30, var14, var15 + var31) || !par1World.isAirBlock(var13 + var30, var14 + 1, var15 + var31);

                if (var34 && var35)
                {
                    var47 = Direction.footInvisibleFaceRemap[var47];
                    var29 = Direction.footInvisibleFaceRemap[var29];
                    var30 = Direction.offsetX[var47];
                    var31 = Direction.offsetZ[var47];
                    var32 = Direction.offsetX[var29];
                    var33 = Direction.offsetZ[var29];
                    var18 = var13 - var32;
                    var46 -= (double)var32;
                    int var20 = var15 - var33;
                    var25 -= (double)var33;
                    var34 = !par1World.isAirBlock(var18 + var30 + var32, var14, var20 + var31 + var33) || !par1World.isAirBlock(var18 + var30 + var32, var14 + 1, var20 + var31 + var33);
                    var35 = !par1World.isAirBlock(var18 + var30, var14, var20 + var31) || !par1World.isAirBlock(var18 + var30, var14 + 1, var20 + var31);
                }

                float var36 = 0.5F;
                float var37 = 0.5F;

                if (!var34 && var35)
                {
                    var36 = 1.0F;
                }
                else if (var34 && !var35)
                {
                    var36 = 0.0F;
                }
                else if (var34 && var35)
                {
                    var37 = 0.0F;
                }

                var46 += (double)((float)var32 * var36 + var37 * (float)var30);
                var25 += (double)((float)var33 * var36 + var37 * (float)var31);
                float var38 = 0.0F;
                float var39 = 0.0F;
                float var40 = 0.0F;
                float var41 = 0.0F;

                if (var47 == var28)
                {
                    var38 = 1.0F;
                    var39 = 1.0F;
                }
                else if (var47 == Direction.footInvisibleFaceRemap[var28])
                {
                    var38 = -1.0F;
                    var39 = -1.0F;
                }
                else if (var47 == Direction.enderEyeMetaToDirection[var28])
                {
                    var40 = 1.0F;
                    var41 = -1.0F;
                }
                else
                {
                    var40 = -1.0F;
                    var41 = 1.0F;
                }

                double var42 = par2Entity.motionX;
                double var44 = par2Entity.motionZ;
                par2Entity.motionX = var42 * (double)var38 + var44 * (double)var41;
                par2Entity.motionZ = var42 * (double)var40 + var44 * (double)var39;
                par2Entity.rotationYaw = par9 - (float)(var28 * 90) + (float)(var47 * 90);
            }
            else
            {
                par2Entity.motionX = par2Entity.motionY = par2Entity.motionZ = 0.0D;
            }

            par2Entity.setLocationAndAngles(var46, var23, var25, par2Entity.rotationYaw, par2Entity.rotationPitch);
            return true;
        }
    }

    /**
     * Create a new portal near an entity.
     */
    public boolean createPortal(World par1World, Entity par2Entity)
    {
        byte var3 = 16;
        double var4 = -1.0D;
        int var6 = MathHelper.floor_double(par2Entity.posX);
        int var7 = MathHelper.floor_double(par2Entity.posY);
        int var8 = MathHelper.floor_double(par2Entity.posZ);
        int var9 = var6;
        int var10 = var7;
        int var11 = var8;
        int var12 = 0;
        int var13 = this.random.nextInt(4);
        int var14;
        double var15;
        int var17;
        double var18;
        int var21;
        int var20;
        int var23;
        int var22;
        int var25;
        int var24;
        int var27;
        int var26;
        int var28;
        double var34;
        double var32;

        for (var14 = var6 - var3; var14 <= var6 + var3; ++var14)
        {
            var15 = (double)var14 + 0.5D - par2Entity.posX;

            for (var17 = var8 - var3; var17 <= var8 + var3; ++var17)
            {
                var18 = (double)var17 + 0.5D - par2Entity.posZ;
                label274:

                for (var20 = par1World.getActualHeight() - 1; var20 >= 0; --var20)
                {
                    if (par1World.isAirBlock(var14, var20, var17))
                    {
                        while (var20 > 0 && par1World.isAirBlock(var14, var20 - 1, var17))
                        {
                            --var20;
                        }

                        for (var21 = var13; var21 < var13 + 4; ++var21)
                        {
                            var22 = var21 % 2;
                            var23 = 1 - var22;

                            if (var21 % 4 >= 2)
                            {
                                var22 = -var22;
                                var23 = -var23;
                            }

                            for (var24 = 0; var24 < 3; ++var24)
                            {
                                for (var25 = 0; var25 < 4; ++var25)
                                {
                                    for (var26 = -1; var26 < 4; ++var26)
                                    {
                                        var27 = var14 + (var25 - 1) * var22 + var24 * var23;
                                        var28 = var20 + var26;
                                        int var29 = var17 + (var25 - 1) * var23 - var24 * var22;

                                        if (var26 < 0 && !par1World.getBlockMaterial(var27, var28, var29).isSolid() || var26 >= 0 && !par1World.isAirBlock(var27, var28, var29))
                                        {
                                            continue label274;
                                        }
                                    }
                                }
                            }

                            var32 = (double)var20 + 0.5D - par2Entity.posY;
                            var34 = var15 * var15 + var32 * var32 + var18 * var18;

                            if (var4 < 0.0D || var34 < var4)
                            {
                                var4 = var34;
                                var9 = var14;
                                var10 = var20;
                                var11 = var17;
                                var12 = var21 % 4;
                            }
                        }
                    }
                }
            }
        }

        if (var4 < 0.0D)
        {
            for (var14 = var6 - var3; var14 <= var6 + var3; ++var14)
            {
                var15 = (double)var14 + 0.5D - par2Entity.posX;

                for (var17 = var8 - var3; var17 <= var8 + var3; ++var17)
                {
                    var18 = (double)var17 + 0.5D - par2Entity.posZ;
                    label222:

                    for (var20 = par1World.getActualHeight() - 1; var20 >= 0; --var20)
                    {
                        if (par1World.isAirBlock(var14, var20, var17))
                        {
                            while (var20 > 0 && par1World.isAirBlock(var14, var20 - 1, var17))
                            {
                                --var20;
                            }

                            for (var21 = var13; var21 < var13 + 2; ++var21)
                            {
                                var22 = var21 % 2;
                                var23 = 1 - var22;

                                for (var24 = 0; var24 < 4; ++var24)
                                {
                                    for (var25 = -1; var25 < 4; ++var25)
                                    {
                                        var26 = var14 + (var24 - 1) * var22;
                                        var27 = var20 + var25;
                                        var28 = var17 + (var24 - 1) * var23;

                                        if (var25 < 0 && !par1World.getBlockMaterial(var26, var27, var28).isSolid() || var25 >= 0 && !par1World.isAirBlock(var26, var27, var28))
                                        {
                                            continue label222;
                                        }
                                    }
                                }

                                var32 = (double)var20 + 0.5D - par2Entity.posY;
                                var34 = var15 * var15 + var32 * var32 + var18 * var18;

                                if (var4 < 0.0D || var34 < var4)
                                {
                                    var4 = var34;
                                    var9 = var14;
                                    var10 = var20;
                                    var11 = var17;
                                    var12 = var21 % 2;
                                }
                            }
                        }
                    }
                }
            }
        }

        int var30 = var9;
        int var16 = var10;
        var17 = var11;
        int var31 = var12 % 2;
        int var19 = 1 - var31;

        if (var12 % 4 >= 2)
        {
            var31 = -var31;
            var19 = -var19;
        }

        boolean var33;

        if (var4 < 0.0D)
        {
            if (var10 < 70)
            {
                var10 = 70;
            }

            if (var10 > par1World.getActualHeight() - 10)
            {
                var10 = par1World.getActualHeight() - 10;
            }

            var16 = var10;

            for (var20 = -1; var20 <= 1; ++var20)
            {
                for (var21 = 1; var21 < 3; ++var21)
                {
                    for (var22 = -1; var22 < 3; ++var22)
                    {
                        var23 = var30 + (var21 - 1) * var31 + var20 * var19;
                        var24 = var16 + var22;
                        var25 = var17 + (var21 - 1) * var19 - var20 * var31;
                        var33 = var22 < 0;
                        par1World.setBlockWithNotify(var23, var24, var25, var33 ? Block.obsidian.blockID : 0);
                    }
                }
            }
        }

        for (var20 = 0; var20 < 4; ++var20)
        {
            par1World.editingBlocks = true;

            for (var21 = 0; var21 < 4; ++var21)
            {
                for (var22 = -1; var22 < 4; ++var22)
                {
                    var23 = var30 + (var21 - 1) * var31;
                    var24 = var16 + var22;
                    var25 = var17 + (var21 - 1) * var19;
                    var33 = var21 == 0 || var21 == 3 || var22 == -1 || var22 == 3;
                    par1World.setBlockWithNotify(var23, var24, var25, var33 ? Block.obsidian.blockID : Block.portal.blockID);
                }
            }

            par1World.editingBlocks = false;

            for (var21 = 0; var21 < 4; ++var21)
            {
                for (var22 = -1; var22 < 4; ++var22)
                {
                    var23 = var30 + (var21 - 1) * var31;
                    var24 = var16 + var22;
                    var25 = var17 + (var21 - 1) * var19;
                    par1World.notifyBlocksOfNeighborChange(var23, var24, var25, par1World.getBlockId(var23, var24, var25));
                }
            }
        }

        return true;
    }
}

[/hide]

 

When I use the par5Entity.usePortal() the portal block works and teleports me to the nether, but if I use the code in the onEntityCollide that is not commented out nothing happens and if I use the commented out code it will crash.

 

What is the teleportation code for 1.4.2?

Link to comment
Share on other sites

What's wrong with onEntityCollide?

 

Just put this in:

 

ModLoader.getMinecraftServerInstance().getConfigurationManager().transferPlayerToDimension(playerMP, dimensionToTeleport, new TheTeleporter());

 

EDIT:

 

Here's what I use. Maybe this will help you:

 

 

 

FG77f.png

 

 

Thanks so much!

Link to comment
Share on other sites

In masters4902s pic, you should check if the entity is REALLY the EntityPlayerMP, because it could happen that a pig or something stands on the block, which causes a "java.lang.ClassCastException: Cannot cast EntityPig into EntityPlayerMP" or similar.

 

like this:

if(!par1World.isRemote && par5Entity != null && par5Entity instanceof EntityPlayerMP)

Don't ask for support per PM! They'll get ignored! | If a post helped you, click the "Thank You" button at the top right corner of said post! |

mah twitter

This thread makes me sad because people just post copy-paste-ready code when it's obvious that the OP has little to no programming experience. This is not how learning works.

Link to comment
Share on other sites

Thanks so much!

 

No problem :)

 

In masters4902s pic, you should check if the entity is REALLY the EntityPlayerMP, because it could happen that a pig or something stands on the block, which causes a "java.lang.ClassCastException: Cannot cast EntityPig into EntityPlayerMP" or similar.

 

like this:

if(!par1World.isRemote && par5Entity != null && par5Entity instanceof EntityPlayerMP)

 

Woops, forgot about that..

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.