Jedispencer21

Dimension Teleporter

Nov 24th, 2015
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Block Code
  2. public class BlockDimPortal extends BlockPortal
  3. {
  4.     public void onNeighborBlockChange(World world, BlockPos pos, IBlockState state, Block neighborBlock)
  5.     {
  6.         EnumFacing.Axis axis = (EnumFacing.Axis) state.getValue(AXIS);
  7.         BlockDimPortal.Size size;
  8.  
  9.         if (axis == EnumFacing.Axis.X)
  10.         {
  11.             size = new BlockDimPortal.Size(world, pos, EnumFacing.Axis.X);
  12.  
  13.             if (!size.isValidPortal() || size.amountOfPortals < size.sizeXZ * size.sizeY)
  14.             {
  15.                 world.setBlockState(pos, Blocks.air.getDefaultState());
  16.             }
  17.         }
  18.         else if (axis == EnumFacing.Axis.Z)
  19.         {
  20.             size = new BlockDimPortal.Size(world, pos, EnumFacing.Axis.Z);
  21.  
  22.             if (!size.isValidPortal() || size.amountOfPortals < size.sizeXZ * size.sizeY)
  23.             {
  24.                 world.setBlockState(pos, Blocks.air.getDefaultState());
  25.             }
  26.         }
  27.     }
  28.  
  29.     @SideOnly(Side.CLIENT)
  30.     public void randomDisplayTick(World world, BlockPos pos, IBlockState state, Random rand)
  31.     {
  32.             if (rand.nextInt(100) == 0)
  33.             {
  34.                 world.playSound((double)pos.getX() + 0.5D, (double)pos.getY() + 0.5D, (double)pos.getZ() + 0.5D,
  35.             "portal.portal", 0.75F, rand.nextFloat() * 0.1F + 1.2F, false);
  36.             }
  37.  
  38.         for (int i = 0; i < 4; ++i)
  39.         {
  40.             double d0 = (double) ((float) pos.getX() + rand.nextFloat());
  41.             double d1 = (double) ((float) pos.getY() + rand.nextFloat());
  42.             double d2 = (double) ((float) pos.getZ() + rand.nextFloat());
  43.             double d3 = ((double) rand.nextFloat() - 0.5D) * 0.5D;
  44.             double d4 = ((double) rand.nextFloat() - 0.5D) * 0.5D;
  45.             double d5 = ((double) rand.nextFloat() - 0.5D) * 0.5D;
  46.             int j = rand.nextInt(2) * 2 - 1;
  47.  
  48.             if (world.getBlockState(pos.west()).getBlock() != this && world.getBlockState(pos.east()).getBlock()
  49.             != this)
  50.             {
  51.                 d0 = (double) pos.getX() + 0.5D + 0.25D * (double) j;
  52.                 d3 = (double) (rand.nextFloat() * 2.0F * (float) j);
  53.             }
  54.             else
  55.             {
  56.                 d2 = (double) pos.getZ() + 0.5D + 0.25D * (double) j;
  57.                 d5 = (double) (rand.nextFloat() * 2.0F * (float) j);
  58.             }
  59.  
  60.             EntityDimPortalFX entitydimportalfx = new EntityDimPortalFX(world, x, y, z, vx, vy, vz);
  61.             FMLClientHandler.instance().getClient().effectRenderer.addEffect(entityfx);
  62.         }
  63.     }
  64.  
  65.     public void onEntityCollidedWithBlock(World world, BlockPos pos, IBlockState state, Entity entity)
  66.     {
  67.         if (entity.ridingEntity == null && entity.riddenByEntity == null && !world.isRemote)
  68.         {
  69.             Dim.teleportEntityToDimension(entity, Dim.getDimensionId(), new
  70.             TeleporterDim(MinecraftServer.getServer().worldServerForDimension(Dim.getDimensionId())));
  71.         }
  72.     }
  73.  
  74.     public void updateTick(World world, BlockPos pos, IBlockState state, Random rand) {}
  75.  
  76.     public boolean func_176548_d(World world, BlockPos pos)
  77.     {
  78.         BlockDimPortal.Size size = new BlockDimPortal.Size(world, pos, EnumFacing.Axis.X);
  79.  
  80.         if (size.isValidPortal() && size.amountOfPortals == 0)
  81.         {
  82.             size.createPortalBlocks();
  83.             return true;
  84.         }
  85.         else
  86.         {
  87.             BlockDimPortal.Size size1 = new BlockDimPortal.Size(world, pos, EnumFacing.Axis.Z);
  88.  
  89.             if (size1.isValidPortal() && size.amountOfPortals == 0)
  90.             {
  91.                 size.createPortalBlocks();
  92.                 return true;
  93.             }
  94.             else
  95.             {
  96.                 return false;
  97.             }
  98.         }
  99.     }
  100.  
  101.     public static class Size
  102.     {
  103.         private final World world;
  104.         private final EnumFacing.Axis axis;
  105.         private final EnumFacing south_west;
  106.         private final EnumFacing north_east;
  107.         private int amountOfPortals = 0;
  108.         private BlockPos blockpos;
  109.         private int sizeY;
  110.         private int sizeXZ;
  111.  
  112.         public Size(World world, BlockPos blockpos, EnumFacing.Axis enumfacingAxis)
  113.         {
  114.             this.world = world;
  115.             this.axis = enumfacingAxis;
  116.  
  117.             if (enumfacingAxis == EnumFacing.Axis.X)
  118.             {
  119.                 this.north_east = EnumFacing.EAST;
  120.                 this.south_west = EnumFacing.WEST;
  121.             }
  122.             else
  123.             {
  124.                 this.north_east = EnumFacing.NORTH;
  125.                 this.south_west = EnumFacing.SOUTH;
  126.             }
  127.  
  128.             for (BlockPos blockpos1 = blockpos; blockpos.getY() > blockpos1.getY() - 21 && blockpos.getY() > 0 &&
  129.             this.isBlockAllowed(world.getBlockState(blockpos.down()).getBlock()); blockpos = blockpos.down())
  130.             {
  131.                 ;
  132.             }
  133.  
  134.             int i = this.getPortalXZSize(blockpos, this.north_east) - 1;
  135.  
  136.             if (i >= 0)
  137.             {
  138.                 this.blockpos = blockpos.offset(this.north_east, i);
  139.                 this.sizeXZ = this.getPortalXZSize(this.blockpos, this.south_west);
  140.  
  141.                 if (this.sizeXZ < 2 || this.sizeXZ > 21)
  142.                 {
  143.                     this.blockpos = null;
  144.                     this.sizeXZ = 0;
  145.                 }
  146.             }
  147.  
  148.             if (this.blockpos != null)
  149.             {
  150.                 this.sizeY = this.getPortalHeight();
  151.             }
  152.         }
  153.  
  154.         protected int getPortalXZSize(BlockPos blockspos, EnumFacing enumfacing)
  155.         {
  156.             int i;
  157.  
  158.             for (i = 0; i < 22; ++i)
  159.             {
  160.                 BlockPos blockpos1 = blockspos.offset(enumfacing, i);
  161.  
  162.                 if (!this.isBlockAllowed(this.world.getBlockState(blockpos1).getBlock()) ||
  163.                 this.world.getBlockState(blockpos1.down()).getBlock() != Blocks.quartz_block)
  164.                 {
  165.                     break;
  166.                 }
  167.             }
  168.  
  169.             Block block = this.world.getBlockState(blockspos.offset(enumfacing, i)).getBlock();
  170.             return block == Blocks.quartz_block ? i : 0;
  171.         }
  172.  
  173.         protected int getPortalHeight()
  174.         {
  175.             int i;
  176.             label56:
  177.  
  178.             for (this.sizeY = 0; this.sizeY < 21; ++this.sizeY)
  179.             {
  180.                 for (i = 0; i < this.sizeXZ; ++i)
  181.                 {
  182.                     BlockPos blockpos = this.blockpos.offset(this.south_west, i).up(this.sizeY);
  183.                     Block block = this.world.getBlockState(blockpos).getBlock();
  184.  
  185.                     if (!this.isBlockAllowed(block))
  186.                     {
  187.                         break label56;
  188.                     }
  189.  
  190.                     if (block == DimBlocks.dim_portal)
  191.                     {
  192.                         ++this.amountOfPortals;
  193.                     }
  194.  
  195.                     if (i == 0)
  196.                     {
  197.                         block = this.world.getBlockState(blockpos.offset(this.north_east)).getBlock();
  198.  
  199.                         if (block != Blocks.quartz_block)
  200.                         {
  201.                             break label56;
  202.                         }
  203.                     }
  204.                     else if (i == this.sizeXZ - 1)
  205.                     {
  206.                         block = this.world.getBlockState(blockpos.offset(this.south_west)).getBlock();
  207.  
  208.                         if (block != Blocks.quartz_block)
  209.                         {
  210.                             break label56;
  211.                         }
  212.                     }
  213.                 }
  214.             }
  215.  
  216.             for (i = 0; i < this.sizeXZ; ++i)
  217.             {
  218.                 if (this.world.getBlockState(this.blockpos.offset(this.south_west, i).up(this.sizeY)).getBlock()
  219.                 != Blocks.quartz_block)
  220.                 {
  221.                     this.sizeY = 0;
  222.                     break;
  223.                 }
  224.             }
  225.  
  226.             if (this.sizeY <= 21 && this.sizeY >= 3)
  227.             {
  228.                 return this.sizeY;
  229.             }
  230.             else
  231.             {
  232.                 this.blockpos = null;
  233.                 this.sizeXZ = 0;
  234.                 this.sizeY = 0;
  235.                 return 0;
  236.             }
  237.         }
  238.  
  239.         protected boolean isBlockAllowed(Block block)
  240.         {
  241.             return block.getMaterial() == Material.air || block == Blocks.water || block == Blocks.flowing_water ||
  242.             block == DimBlocks.dim_portal;
  243.         }
  244.  
  245.         public boolean isValidPortal()
  246.         {
  247.             return this.blockpos != null && this.sizeXZ >= 2 && this.sizeXZ <= 21 && this.sizeY >= 3 && this.sizeY
  248.             <= 21;
  249.         }
  250.  
  251.         public void createPortalBlocks()
  252.         {
  253.             for (int i = 0; i < this.sizeXZ; ++i)
  254.             {
  255.                 BlockPos blockpos = this.blockpos.offset(this.south_west, i);
  256.  
  257.                 for (int j = 0; j < this.sizeY; ++j)
  258.                 {
  259.                     this.world.setBlockState(blockpos.up(j),
  260.                     DimBlocks.dim_portal.getDefaultState().withProperty(BlockPortal.AXIS, this.axis), 2);
  261.                 }
  262.             }
  263.         }
  264.     }
  265. }
  266.     // Code from Main Class to teleport entity
  267.  
  268.     public static void teleportEntityToDimension(Entity entity, int dimensionId, Teleporter teleporter)
  269.     {
  270.         if (!entity.worldObj.isRemote && !entity.isDead)
  271.         {
  272.             entity.worldObj.theProfiler.startSection("changeDimension");
  273.             MinecraftServer minecraftserver = MinecraftServer.getServer();
  274.             int j = entity.dimension;
  275.             WorldServer worldserver = minecraftserver.worldServerForDimension(j);
  276.             WorldServer worldserver1 = minecraftserver.worldServerForDimension(dimensionId);
  277.             entity.dimension = dimensionId;
  278.  
  279.             if (j == dimensionId)
  280.             {
  281.                 worldserver1 = minecraftserver.worldServerForDimension(0);
  282.                 entity.dimension = 0;
  283.             }
  284.  
  285.             entity.worldObj.removeEntity(entity);
  286.             entity.isDead = false;
  287.             entity.worldObj.theProfiler.startSection("reposition");
  288.             minecraftserver.getConfigurationManager().transferEntityToWorld(entity, j, worldserver, worldserver1,
  289.             teleporter);
  290.             entity.worldObj.theProfiler.endStartSection("reloading");
  291.             Entity entity1 = EntityList.createEntityByName(EntityList.getEntityString(entity), worldserver1);
  292.  
  293.             if (entity1 != null)
  294.             {
  295.                 entity1.copyDataFromOld(entity);
  296.  
  297.                 if (j == dimensionId)
  298.                 {
  299.                     BlockPos blockpos = entity.worldObj
  300.                     .getTopSolidOrLiquidBlock(worldserver1.getSpawnPoint());
  301.                     entity1.moveToBlockPosAndAngles(blockpos, entity1.rotationYaw, entity1.rotationPitch);
  302.                 }
  303.  
  304.                 worldserver1.spawnEntityInWorld(entity1);
  305.             }
  306.  
  307.             entity.isDead = true;
  308.             entity.worldObj.theProfiler.endSection();
  309.             worldserver.resetUpdateEntityTick();
  310.             worldserver1.resetUpdateEntityTick();
  311.             entity.worldObj.theProfiler.endSection();
  312.         }
  313.     }
  314.  
  315. // Teleport Code
  316.  
  317. public class TeleporterDim extends Teleporter
  318. {
  319.     private WorldServer worldServerInstance;
  320.     private final Random random;
  321.     private final LongHashMap destinationCoordinateCache = new LongHashMap();
  322.     private final List destinationCoordinateKeys = Lists.newArrayList();
  323.  
  324.     public TeleporterDim(WorldServer world)
  325.     {
  326.         super(world);
  327.         this.worldServerInstance = world;
  328.         this.worldServerInstance.customTeleporters.add(this);
  329.         this.random = new Random(world.getSeed());
  330.     }
  331.  
  332.     public void placeInPortal(Entity entity, float rotationYaw)
  333.     {
  334.         if (this.worldServerInstance.provider.getDimensionId() != 1)
  335.         {
  336.             if (!this.placeInExistingPortal(entity, rotationYaw))
  337.             {
  338.                 this.makePortal(entity);
  339.                 this.placeInExistingPortal(entity, rotationYaw);
  340.             }
  341.         }
  342.         else
  343.         {
  344.             int i = MathHelper.floor_double(entity.posX);
  345.             int j = MathHelper.floor_double(entity.posY) - 1;
  346.             int k = MathHelper.floor_double(entity.posZ);
  347.             byte b0 = 1;
  348.             byte b1 = 0;
  349.  
  350.             for (int l = -2; l <= 2; ++l)
  351.             {
  352.                 for (int i1 = -2; i1 <= 2; ++i1)
  353.                 {
  354.                     for (int j1 = -1; j1 < 3; ++j1)
  355.                     {
  356.                         int k1 = i + i1 * b0 + l * b1;
  357.                         int l1 = j + j1;
  358.                         int i2 = k + i1 * b1 - l * b0;
  359.                         boolean flag = j1 < 0;
  360.                         this.worldServerInstance.setBlockState(new BlockPos(k1, l1, i2), flag ? Blocks.quartz_block.getDefaultState() : Blocks.air.getDefaultState());
  361.                     }
  362.                 }
  363.             }
  364.  
  365.             entity.setLocationAndAngles((double) i, (double) j, (double) k, entity.rotationYaw, 0.0F);
  366.             entity.motionX = entity.motionY = entity.motionZ = 0.0D;
  367.         }
  368.     }
  369.  
  370.     public boolean placeInExistingPortal(Entity entity, float f)
  371.     {
  372.         boolean flag = true;
  373.         double d0 = -1.0D;
  374.         int i = MathHelper.floor_double(entity.posX);
  375.         int j = MathHelper.floor_double(entity.posZ);
  376.         boolean flag1 = true;
  377.         Object object = BlockPos.ORIGIN;
  378.         long k = ChunkCoordIntPair.chunkXZ2Int(i, j);
  379.  
  380.         if (this.destinationCoordinateCache.containsItem(k))
  381.         {
  382.             TeleporterDim.PortalPosition portalposition = (TeleporterDim.PortalPosition)
  383.             this.destinationCoordinateCache.getValueByKey(k);
  384.             d0 = 0.0D;
  385.             object = portalposition;
  386.             portalposition.lastUpdateTime = this.worldServerInstance.getTotalWorldTime();
  387.             flag1 = false;
  388.         }
  389.         else
  390.         {
  391.             BlockPos blockpos4 = new BlockPos(entity);
  392.  
  393.             for (int l = -128; l <= 128; ++l)
  394.             {
  395.                 BlockPos blockpos1;
  396.  
  397.                 for (int i1 = -128; i1 <= 128; ++i1)
  398.                 {
  399.                     for (BlockPos blockpos = blockpos4.add(l, this.worldServerInstance.getActualHeight() - 1
  400.                     - blockpos4.getY(), i1); blockpos.getY() >= 0; blockpos = blockpos1)
  401.                     {
  402.                         blockpos1 = blockpos.down();
  403.  
  404.                         if (this.worldServerInstance.getBlockState(blockpos).getBlock() ==
  405.                         DimBlocks.dim_portal)
  406.                         {
  407.                             while (this.worldServerInstance.getBlockState(blockpos1
  408.                             blockpos.down()).getBlock() == DimBlocks.dim_portal)
  409.                             {
  410.                                 blockpos = blockpos1;
  411.                             }
  412.  
  413.                             double d1 = blockpos.distanceSq(blockpos4);
  414.  
  415.                             if (d0 < 0.0D || d1 < d0)
  416.                             {
  417.                                 d0 = d1;
  418.                                 object = blockpos;
  419.                             }
  420.                         }
  421.                     }
  422.                 }
  423.             }
  424.         }
  425.  
  426.         if (d0 >= 0.0D)
  427.         {
  428.             if (flag1)
  429.             {
  430.                 this.destinationCoordinateCache.add(k, new TeleporterDim.PortalPosition((BlockPos) object,
  431.                 this.worldServerInstance.getTotalWorldTime()));
  432.                 this.destinationCoordinateKeys.add(Long.valueOf(k));
  433.             }
  434.  
  435.             double d4 = (double) ((BlockPos) object).getX() + 0.5D;
  436.             double d5 = (double) ((BlockPos) object).getY() + 0.5D;
  437.             double d6 = (double) ((BlockPos) object).getZ() + 0.5D;
  438.             EnumFacing enumfacing = null;
  439.  
  440.             if (this.worldServerInstance.getBlockState(((BlockPos) object).west()).getBlock() ==
  441.             DimBlocks.dim_portal)
  442.             {
  443.                 enumfacing = EnumFacing.NORTH;
  444.             }
  445.  
  446.             if (this.worldServerInstance.getBlockState(((BlockPos) object).east()).getBlock() ==
  447.             DimBlocks.dim_portal)
  448.             {
  449.                 enumfacing = EnumFacing.SOUTH;
  450.             }
  451.  
  452.             if (this.worldServerInstance.getBlockState(((BlockPos) object).north()).getBlock() ==
  453.             DimBlocks.dim_portal)
  454.             {
  455.                 enumfacing = EnumFacing.EAST;
  456.             }
  457.  
  458.             if (this.worldServerInstance.getBlockState(((BlockPos) object).south()).getBlock() ==
  459.             DimBlocks.dim_portal)
  460.             {
  461.                 enumfacing = EnumFacing.WEST;
  462.             }
  463.  
  464.             EnumFacing enumfacing1 = EnumFacing.getHorizontal(entity.getTeleportDirection());
  465.  
  466.             if (enumfacing != null)
  467.             {
  468.                 EnumFacing enumfacing2 = enumfacing.rotateYCCW();
  469.                 BlockPos blockpos2 = ((BlockPos) object).offset(enumfacing);
  470.                 boolean flag2 = this.isAirBlock(blockpos2);
  471.                 boolean flag3 = this.isAirBlock(blockpos2.offset(enumfacing));
  472.  
  473.                 if (flag3 && flag2)
  474.                 {
  475.                     object = ((BlockPos) object).offset(enumfacing2);
  476.                     enumfacing = enumfacing.getOpposite();
  477.                     enumfacing2 = enumfacing2.getOpposite();
  478.                     BlockPos blockpos3 = ((BlockPos) object).offset(enumfacing);
  479.                     flag2 = this.isAirBlock(blockpos3);
  480.                     flag3 = this.isAirBlock(blockpos3.offset(enumfacing2));
  481.                 }
  482.  
  483.                 float f6 = 0.5F;
  484.                 float f1 = 0.5F;
  485.  
  486.                 if (!flag3 && flag2)
  487.                 {
  488.                     f6 = 1.0F;
  489.                 }
  490.                 else if (flag3 && !flag2)
  491.                 {
  492.                     f6 = 0.0F;
  493.                 }
  494.                 else if (flag3)
  495.                 {
  496.                     f1 = 0.0F;
  497.                 }
  498.  
  499.                 d4 = (double)((BlockPos)object).getX() + 0.5D;
  500.                 d5 = (double)((BlockPos)object).getY() + 0.5D;
  501.                 d6 = (double)((BlockPos)object).getZ() + 0.5D;
  502.                 d4 += (double)((float)enumfacing2.getFrontOffsetX() * f6 + (float)enumfacing.getFrontOffsetX() * f1);
  503.                 d6 += (double)((float)enumfacing2.getFrontOffsetZ() * f6 + (float)enumfacing.getFrontOffsetZ() * f1);
  504.                 float f2 = 0.0F;
  505.                 float f3 = 0.0F;
  506.                 float f4 = 0.0F;
  507.                 float f5 = 0.0F;
  508.  
  509.                 if (enumfacing == enumfacing1)
  510.                 {
  511.                     f2 = 1.0F;
  512.                     f3 = 1.0F;
  513.                 }
  514.                 else if (enumfacing == enumfacing1.getOpposite())
  515.                 {
  516.                     f2 = -1.0F;
  517.                     f3 = -1.0F;
  518.                 }
  519.                 else if (enumfacing == enumfacing1.rotateY())
  520.                 {
  521.                     f4 = 1.0F;
  522.                     f5 = -1.0F;
  523.                 }
  524.                 else
  525.                 {
  526.                     f4 = -1.0F;
  527.                     f5 = 1.0F;
  528.                 }
  529.  
  530.                 double d2 = entity.motionX;
  531.                 double d3 = entity.motionZ;
  532.                 entity.motionX = d2 * (double) f2 + d3 * (double) f5;
  533.                 entity.motionZ = d2 * (double) f4 + d3 * (double) f3;
  534.                 entity.rotationYaw = f - (float) (enumfacing1.getHorizontalIndex() * 90) + (float)
  535.                 (enumfacing.getHorizontalIndex() * 90);
  536.             }
  537.             else
  538.             {
  539.                 entity.motionX = entity.motionY = entity.motionZ = 0.0D;
  540.             }
  541.  
  542.             entity.setLocationAndAngles(d4, d5, d6, entity.rotationYaw, entity.rotationPitch);
  543.             return true;
  544.         }
  545.         else
  546.         {
  547.             return false;
  548.         }
  549.     }
  550.  
  551.     private boolean isAirBlock(BlockPos pos)
  552.     {
  553.         return !this.worldServerInstance.isAirBlock(pos) || !this.worldServerInstance.isAirBlock(pos.up());
  554.     }
  555.  
  556.     public boolean makePortal(Entity entity)
  557.     {
  558.         byte b0 = 16;
  559.         double d0 = -1.0D;
  560.         int i = MathHelper.floor_double(entity.posX);
  561.         int j = MathHelper.floor_double(entity.posY);
  562.         int k = MathHelper.floor_double(entity.posZ);
  563.         int l = i;
  564.         int i1 = j;
  565.         int j1 = k;
  566.         int k1 = 0;
  567.         int l1 = this.random.nextInt(4);
  568.         int i2;
  569.         double d1;
  570.         int k2;
  571.         double d2;
  572.         int i3;
  573.         int j3;
  574.         int k3;
  575.         int l3;
  576.         int i4;
  577.         int j4;
  578.         int k4;
  579.         int l4;
  580.         int i5;
  581.         double d3;
  582.         double d4;
  583.  
  584.         for (i2 = i - b0; i2 <= i + b0; ++i2)
  585.         {
  586.             d1 = (double) i2 + 0.5D - entity.posX;
  587.  
  588.             for (k2 = k - b0; k2 <= k + b0; ++k2)
  589.             {
  590.                 d2 = (double) k2 + 0.5D - entity.posZ;
  591.                 label271:
  592.  
  593.                 for (i3 = this.worldServerInstance.getActualHeight() - 1; i3 >= 0; --i3)
  594.                 {
  595.                     if (this.worldServerInstance.isAirBlock(new BlockPos(i2, i3, k2)))
  596.                     {
  597.                         while (i3 > 0 && this.worldServerInstance.isAirBlock(new BlockPos(i2, i3 - 1,
  598.                         k2)))
  599.                         {
  600.                             --i3;
  601.                         }
  602.  
  603.                         for (j3 = l1; j3 < l1 + 4; ++j3)
  604.                         {
  605.                             k3 = j3 % 2;
  606.                             l3 = 1 - k3;
  607.  
  608.                             if (j3 % 4 >= 2)
  609.                             {
  610.                                 k3 = -k3;
  611.                                 l3 = -l3;
  612.                             }
  613.  
  614.                             for (i4 = 0; i4 < 3; ++i4)
  615.                             {
  616.                                 for (j4 = 0; j4 < 4; ++j4)
  617.                                 {
  618.                                     for (k4 = -1; k4 < 4; ++k4)
  619.                                     {
  620.                                         l4 = i2 + (j4 - 1) * k3 + i4 * l3;
  621.                                         i5 = i3 + k4;
  622.                                         int j5 = k2 + (j4 - 1) * l3 - i4 * k3;
  623.  
  624.                                         if (k4 < 0 &&
  625.                                 !this.worldServerInstance.getBlockState(new BlockPos(l4, i5,
  626.                                 j5)).getBlock().getMaterial().isSolid() || k4 >= 0 &&
  627.                                 !this.worldServerInstance.isAirBlock(new BlockPos(l4, i5, j5)))
  628.                                         {
  629.                                             continue label271;
  630.                                         }
  631.                                     }
  632.                                 }
  633.                             }
  634.  
  635.                             d3 = (double) i3 + 0.5D - entity.posY;
  636.                             d4 = d1 * d1 + d3 * d3 + d2 * d2;
  637.  
  638.                             if (d0 < 0.0D || d4 < d0)
  639.                             {
  640.                                 d0 = d4;
  641.                                 l = i2;
  642.                                 i1 = i3;
  643.                                 j1 = k2;
  644.                                 k1 = j3 % 4;
  645.                             }
  646.                         }
  647.                     }
  648.                 }
  649.             }
  650.         }
  651.  
  652.         if (d0 < 0.0D)
  653.         {
  654.             for (i2 = i - b0; i2 <= i + b0; ++i2)
  655.             {
  656.                 d1 = (double) i2 + 0.5D - entity.posX;
  657.  
  658.                 for (k2 = k - b0; k2 <= k + b0; ++k2)
  659.                 {
  660.                     d2 = (double) k2 + 0.5D - entity.posZ;
  661.                     label219:
  662.  
  663.                     for (i3 = this.worldServerInstance.getActualHeight() - 1; i3 >= 0; --i3)
  664.                     {
  665.                         if (this.worldServerInstance.isAirBlock(new BlockPos(i2, i3, k2)))
  666.                         {
  667.                             while (i3 > 0 && this.worldServerInstance.isAirBlock(new BlockPos(i2, i3
  668.                             - 1, k2)))
  669.                             {
  670.                                 --i3;
  671.                             }
  672.  
  673.                             for (j3 = l1; j3 < l1 + 2; ++j3)
  674.                             {
  675.                                 k3 = j3 % 2;
  676.                                 l3 = 1 - k3;
  677.  
  678.                                 for (i4 = 0; i4 < 4; ++i4)
  679.                                 {
  680.                                     for (j4 = -1; j4 < 4; ++j4)
  681.                                     {
  682.                                         k4 = i2 + (i4 - 1) * k3;
  683.                                         l4 = i3 + j4;
  684.                                         i5 = k2 + (i4 - 1) * l3;
  685.  
  686.                                         if (j4 < 0 &&
  687.                                 !this.worldServerInstance.getBlockState(new BlockPos(k4, l4,
  688.                                 i5)).getBlock().getMaterial().isSolid() || j4 >= 0 &&
  689.                                 !this.worldServerInstance.isAirBlock(new BlockPos(k4, l4, i5)))
  690.                                         {
  691.                                             continue label219;
  692.                                         }
  693.                                     }
  694.                                 }
  695.  
  696.                                 d3 = (double) i3 + 0.5D - entity.posY;
  697.                                 d4 = d1 * d1 + d3 * d3 + d2 * d2;
  698.  
  699.                                 if (d0 < 0.0D || d4 < d0)
  700.                                 {
  701.                                     d0 = d4;
  702.                                     l = i2;
  703.                                     i1 = i3;
  704.                                     j1 = k2;
  705.                                     k1 = j3 % 2;
  706.                                 }
  707.                             }
  708.                         }
  709.                     }
  710.                 }
  711.             }
  712.         }
  713.  
  714.         int k5 = l;
  715.         int j2 = i1;
  716.         k2 = j1;
  717.         int l5 = k1 % 2;
  718.         int l2 = 1 - l5;
  719.  
  720.         if (k1 % 4 >= 2)
  721.         {
  722.             l5 = -l5;
  723.             l2 = -l2;
  724.         }
  725.  
  726.         if (d0 < 0.0D)
  727.         {
  728.             i1 = MathHelper.clamp_int(i1, 70, this.worldServerInstance.getActualHeight() - 10);
  729.             j2 = i1;
  730.  
  731.             for (i3 = -1; i3 <= 1; ++i3)
  732.             {
  733.                 for (j3 = 1; j3 < 3; ++j3)
  734.                 {
  735.                     for (k3 = -1; k3 < 3; ++k3)
  736.                     {
  737.                         l3 = k5 + (j3 - 1) * l5 + i3 * l2;
  738.                         i4 = j2 + k3;
  739.                         j4 = k2 + (j3 - 1) * l2 - i3 * l5;
  740.                         boolean flag = k3 < 0;
  741.                         this.worldServerInstance.setBlockState(new BlockPos(l3, i4, j4), flag ?
  742.                         Blocks.quartz_block.getDefaultState() : Blocks.air.getDefaultState());
  743.                     }
  744.                 }
  745.             }
  746.         }
  747.  
  748.         IBlockState iblockstate = DimBlocks.dim_portal.getDefaultState().withProperty(BlockPortal.AXIS, l5 != 0 ?
  749.         EnumFacing.Axis.X : EnumFacing.Axis.Z);
  750.  
  751.         for (j3 = 0; j3 < 4; ++j3)
  752.         {
  753.             for (k3 = 0; k3 < 4; ++k3)
  754.             {
  755.                 for (l3 = -1; l3 < 4; ++l3)
  756.                 {
  757.                     i4 = k5 + (k3 - 1) * l5;
  758.                     j4 = j2 + l3;
  759.                     k4 = k2 + (k3 - 1) * l2;
  760.                     boolean flag1 = k3 == 0 || k3 == 3 || l3 == -1 || l3 == 3;
  761.                     this.worldServerInstance.setBlockState(new BlockPos(i4, j4, k4), flag1 ?
  762.                     Blocks.quartz_block.getDefaultState() : iblockstate, 2);
  763.                 }
  764.             }
  765.  
  766.             for (k3 = 0; k3 < 4; ++k3)
  767.             {
  768.                 for (l3 = -1; l3 < 4; ++l3)
  769.                 {
  770.                     i4 = k5 + (k3 - 1) * l5;
  771.                     j4 = j2 + l3;
  772.                     k4 = k2 + (k3 - 1) * l2;
  773.                     this.worldServerInstance.notifyNeighborsOfStateChange(new BlockPos(i4, j4, k4),
  774.                     this.worldServerInstance.getBlockState(new BlockPos(i4, j4, k4)).getBlock());
  775.                 }
  776.             }
  777.         }
  778.  
  779.         return true;
  780.     }
  781.  
  782.     /**
  783.      * called periodically to remove out-of-date portal locations from the cache list. Argument par1 is a
  784.      * WorldServer.getTotalWorldTime() value.
  785.      */
  786.     public void removeStalePortalLocations(long totalWorldTime)
  787.     {
  788.         if (totalWorldTime % 100L == 0L)
  789.         {
  790.             Iterator iterator = this.destinationCoordinateKeys.iterator();
  791.             long j = totalWorldTime - 600L;
  792.  
  793.             while (iterator.hasNext())
  794.             {
  795.                 Long olong = (Long) iterator.next();
  796.                 TeleporterDim.PortalPosition portalposition = (TeleporterDim.PortalPosition)
  797.                 this.destinationCoordinateCache.getValueByKey(olong.longValue());
  798.  
  799.                 if (portalposition == null || portalposition.lastUpdateTime < j)
  800.                 {
  801.                     iterator.remove();
  802.                     this.destinationCoordinateCache.remove(olong.longValue());
  803.                 }
  804.             }
  805.         }
  806.     }
  807.  
  808.     public class PortalPosition extends BlockPos
  809.     {
  810.         public long lastUpdateTime;
  811.  
  812.         public PortalPosition(BlockPos pos, long worldTime)
  813.         {
  814.             super(pos.getX(), pos.getY(), pos.getZ());
  815.             this.lastUpdateTime = worldTime;
  816.         }
  817.     }
  818. }
Advertisement
Add Comment
Please, Sign In to add comment