Beispiel #1
0
  private static boolean trySpawnEntity(ItemStack stack, WorldServer world, EntityPlayerMP player) {
    int damage = stack.getItemDamage();
    if (damage >= stack.getMaxDamage()) return false;

    NBTTagCompound tag = ItemUtils.getItemTag(stack);
    String structureName = tag.getString(TAG_STRUCTURE);

    if (Strings.isNullOrEmpty(structureName)) return false;

    Map<String, ChunkPosition> nearbyStructures =
        StructureRegistry.instance.getNearestStructures(
            world, (int) player.posX, (int) player.posY, (int) player.posZ);

    ChunkPosition structurePos = nearbyStructures.get(structureName);
    if (structurePos != null) {
      if (Config.eyeDebug)
        player.addChatComponentMessage(
            new ChatComponentTranslation(
                "openblocks.misc.structure_pos",
                structureName,
                structurePos.chunkPosX,
                structurePos.chunkPosY,
                structurePos.chunkPosZ));

      stack.setItemDamage(damage + 1);
      EntityGoldenEye eye = new EntityGoldenEye(world, stack, player, structurePos);
      world.spawnEntityInWorld(eye);
      world.playSoundAtEntity(
          player, "random.bow", 0.5F, 0.4F / (itemRand.nextFloat() * 0.4F + 0.8F));
      return true;
    }
    return false;
  }
  /**
   * @author blood - May 21st, 2016
   * @reason - adjusted to support {@link DisplaceEntityEvent.Teleport.Portal}
   * @param playerIn The player teleporting to another dimension
   * @param targetDimensionId The id of target dimension.
   * @param teleporter The teleporter used to transport and create the portal
   */
  public void transferPlayerToDimension(
      EntityPlayerMP playerIn, int targetDimensionId, net.minecraft.world.Teleporter teleporter) {
    DisplaceEntityEvent.Teleport.Portal event =
        SpongeCommonEventFactory.handleDisplaceEntityPortalEvent(
            playerIn, targetDimensionId, teleporter);
    if (event == null || event.isCancelled()) {
      return;
    }

    WorldServer fromWorld = (WorldServer) event.getFromTransform().getExtent();
    WorldServer toWorld = (WorldServer) event.getToTransform().getExtent();
    playerIn.dimension = toWorld.provider.getDimensionId();
    // Support vanilla clients teleporting to custom dimensions
    int dimension =
        DimensionManager.getClientDimensionToSend(
            toWorld.provider.getDimensionId(), toWorld, playerIn);
    if (((IMixinEntityPlayerMP) playerIn).usesCustomClient()) {
      DimensionManager.sendDimensionRegistration(toWorld, playerIn, dimension);
    }
    playerIn.playerNetServerHandler.sendPacket(
        new S07PacketRespawn(
            playerIn.dimension,
            fromWorld.getDifficulty(),
            fromWorld.getWorldInfo().getTerrainType(),
            playerIn.theItemInWorldManager.getGameType()));
    fromWorld.removePlayerEntityDangerously(playerIn);
    playerIn.isDead = false;
    // we do not need to call transferEntityToWorld as we already have the correct transform and
    // created the portal in handleDisplaceEntityPortalEvent
    ((IMixinEntity) playerIn).setLocationAndAngles(event.getToTransform());
    toWorld.spawnEntityInWorld(playerIn);
    toWorld.updateEntityWithOptionalForce(playerIn, false);
    playerIn.setWorld(toWorld);
    this.preparePlayer(playerIn, fromWorld);
    playerIn.playerNetServerHandler.setPlayerLocation(
        playerIn.posX, playerIn.posY, playerIn.posZ, playerIn.rotationYaw, playerIn.rotationPitch);
    playerIn.theItemInWorldManager.setWorld(toWorld);
    this.updateTimeAndWeatherForPlayer(playerIn, toWorld);
    this.syncPlayerInventory(playerIn);

    for (PotionEffect potioneffect : playerIn.getActivePotionEffects()) {
      playerIn.playerNetServerHandler.sendPacket(
          new S1DPacketEntityEffect(playerIn.getEntityId(), potioneffect));
    }
    ((IMixinEntityPlayerMP) playerIn).refreshXpHealthAndFood();
    // Forge needs to know when a player changes to new a dimension
    // This cannot be mapped to DisplaceEntityEvent.Teleport as this event must be called AFTER
    // transfer.
    net.minecraftforge.fml.common.FMLCommonHandler.instance()
        .firePlayerChangedDimensionEvent(
            playerIn, fromWorld.provider.getDimensionId(), toWorld.provider.getDimensionId());
  }
  /**
   * Called when a player successfully logs in. Reads player data from disk and inserts the player
   * into the world.
   */
  public void playerLoggedIn(EntityPlayerMP par1EntityPlayerMP) {
    this.sendPacketToAllPlayers(new Packet201PlayerInfo(par1EntityPlayerMP.username, true, 1000));
    this.playerEntityList.add(par1EntityPlayerMP);
    WorldServer var2 = this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension);
    var2.spawnEntityInWorld(par1EntityPlayerMP);
    this.func_72375_a(par1EntityPlayerMP, (WorldServer) null);

    for (int var3 = 0; var3 < this.playerEntityList.size(); ++var3) {
      EntityPlayerMP var4 = (EntityPlayerMP) this.playerEntityList.get(var3);
      par1EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(
          new Packet201PlayerInfo(var4.username, true, var4.ping));
    }
  }
  /** Teleports the entity to another dimension. Params: Dimension number to teleport to */
  public static void travelEntityToDimension(Entity entity, int dimensionId, int x, int y, int z) {
    if (!entity.worldObj.isRemote && !entity.isDead) {
      entity.worldObj.theProfiler.startSection("changeDimension");
      MinecraftServer minecraftserver = MinecraftServer.getServer();
      int j = entity.dimension;
      WorldServer worldserver = minecraftserver.worldServerForDimension(j);
      WorldServer worldserver1 = minecraftserver.worldServerForDimension(dimensionId);
      entity.dimension = dimensionId;

      if (j == 1 && dimensionId == 1) {
        worldserver1 = minecraftserver.worldServerForDimension(0);
        entity.dimension = 0;
      }

      entity.worldObj.removeEntity(entity);
      entity.isDead = false;
      entity.worldObj.theProfiler.startSection("reposition");
      minecraftserver
          .getConfigurationManager()
          .transferEntityToWorld(entity, j, worldserver, worldserver1);
      entity.worldObj.theProfiler.endStartSection("reloading");
      Entity newEntity =
          EntityList.createEntityByName(EntityList.getEntityString(entity), worldserver1);

      if (newEntity != null) {
        newEntity.copyDataFrom(entity, true);

        if (j == 1 && dimensionId == 1) {
          ChunkCoordinates chunkcoordinates = worldserver1.getSpawnPoint();
          chunkcoordinates.posY =
              entity.worldObj.getTopSolidOrLiquidBlock(
                  chunkcoordinates.posX, chunkcoordinates.posZ);
          newEntity.setLocationAndAngles(
              (double) chunkcoordinates.posX,
              (double) chunkcoordinates.posY,
              (double) chunkcoordinates.posZ,
              newEntity.rotationYaw,
              newEntity.rotationPitch);
        }

        worldserver1.spawnEntityInWorld(newEntity);
        newEntity.setPosition(x + 0.5D, y, z + 0.5D);
      }

      entity.isDead = true;
      entity.worldObj.theProfiler.endSection();
      worldserver.resetUpdateEntityTick();
      worldserver1.resetUpdateEntityTick();
      entity.worldObj.theProfiler.endSection();
    }
  }
  private void handleFireworks(WorldServer world) {
    if (random.nextFloat() < 0.05) {
      // Calculate a bounding box for all players in the world.
      double minPosX = 1000000000.0f;
      double minPosZ = 1000000000.0f;
      double maxPosX = -1000000000.0f;
      double maxPosZ = -1000000000.0f;
      for (Object playerEntity : world.playerEntities) {
        EntityPlayer player = (EntityPlayer) playerEntity;
        if (player.posX > maxPosX) {
          maxPosX = player.posX;
        }
        if (player.posX < minPosX) {
          minPosX = player.posX;
        }
        if (player.posZ > maxPosZ) {
          maxPosZ = player.posZ;
        }
        if (player.posZ < minPosZ) {
          minPosZ = player.posZ;
        }
      }
      double posX = random.nextFloat() * (maxPosX - minPosX + 60.0f) + minPosX - 30.0f;
      double posZ = random.nextFloat() * (maxPosZ - minPosZ + 60.0f) + minPosZ - 30.0f;

      ItemStack fireworkStack = new ItemStack(Items.fireworks);
      NBTTagCompound tag = new NBTTagCompound();

      NBTTagCompound fireworks = new NBTTagCompound();
      fireworks.setByte("Flight", (byte) 2);

      NBTTagList explosions = new NBTTagList();
      explosions.appendTag(makeExplosion(tag));
      fireworks.setTag("Explosions", explosions);

      tag.setTag("Fireworks", fireworks);

      fireworkStack.setTagCompound(tag);

      int y = world.getTopSolidOrLiquidBlock((int) posX, (int) posZ);
      if (y == -1) {
        y = 64;
      } else {
        y += 3;
      }
      EntityFireworkRocket entityfireworkrocket =
          new EntityFireworkRocket(world, posX, y, posZ, fireworkStack);
      world.spawnEntityInWorld(entityfireworkrocket);
    }
  }
  /**
   * Called when a player successfully logs in. Reads player data from disk and inserts the player
   * into the world.
   */
  public void playerLoggedIn(EntityPlayerMP playerIn) {
    this.playerEntityList.add(playerIn);
    this.field_177454_f.put(playerIn.getUniqueID(), playerIn);
    this.sendPacketToAllPlayers(
        new S38PacketPlayerListItem(
            S38PacketPlayerListItem.Action.ADD_PLAYER, new EntityPlayerMP[] {playerIn}));
    WorldServer var2 = this.mcServer.worldServerForDimension(playerIn.dimension);
    var2.spawnEntityInWorld(playerIn);
    this.func_72375_a(playerIn, (WorldServer) null);

    for (int var3 = 0; var3 < this.playerEntityList.size(); ++var3) {
      EntityPlayerMP var4 = (EntityPlayerMP) this.playerEntityList.get(var3);
      playerIn.playerNetServerHandler.sendPacket(
          new S38PacketPlayerListItem(
              S38PacketPlayerListItem.Action.ADD_PLAYER, new EntityPlayerMP[] {var4}));
    }
  }
  public static void teleportPlayerToCoords(EntityPlayerMP player, int coord, boolean isReturning) {
    // LogHelper.info("Teleporting player to: " + coord);
    NBTTagCompound playerNBT = player.getEntityData();

    // Grab the CompactMachines entry from the player NBT data
    NBTTagCompound cmNBT;
    if (playerNBT.hasKey(Reference.MOD_ID)) {
      cmNBT = playerNBT.getCompoundTag(Reference.MOD_ID);
    } else {
      cmNBT = new NBTTagCompound();
      playerNBT.setTag(Reference.MOD_ID, cmNBT);
    }

    if (player.dimension != ConfigurationHandler.dimensionId) {
      cmNBT.setInteger("oldDimension", player.dimension);
      cmNBT.setDouble("oldPosX", player.posX);
      cmNBT.setDouble("oldPosY", player.posY);
      cmNBT.setDouble("oldPosZ", player.posZ);

      int oldDimension = player.dimension;

      WorldServer machineWorld =
          MinecraftServer.getServer().worldServerForDimension(ConfigurationHandler.dimensionId);
      MinecraftServer.getServer()
          .getConfigurationManager()
          .transferPlayerToDimension(
              player, ConfigurationHandler.dimensionId, new TeleporterCM(machineWorld));

      // If this is not being called teleporting from The End ends up without
      // the client knowing about any blocks, i.e. blank screen, no blocks, but
      // server collisions etc.
      if (oldDimension == 1) {
        machineWorld.spawnEntityInWorld(player);
      }

      // Since the player is currently not in the machine dimension, we want to clear
      // his coord history - in case he exited the machine world not via a shrinking device
      // which automatically clears the last entry in the coord history.
      if (playerNBT.hasKey("coordHistory")) {
        playerNBT.removeTag("coordHistory");
      }
    }

    if (!isReturning) {
      NBTTagList coordHistory;
      if (playerNBT.hasKey("coordHistory")) {
        coordHistory = playerNBT.getTagList("coordHistory", 10);
      } else {
        coordHistory = new NBTTagList();
      }
      NBTTagCompound toAppend = new NBTTagCompound();
      toAppend.setInteger("coord", coord);

      coordHistory.appendTag(toAppend);
      playerNBT.setTag("coordHistory", coordHistory);
    }

    MachineSaveData mHandler = CompactMachines.instance.machineHandler;
    double[] destination = mHandler.getSpawnLocation(coord);

    // Check whether the spawn location is blocked
    WorldServer machineWorld =
        MinecraftServer.getServer().worldServerForDimension(ConfigurationHandler.dimensionId);
    int dstX = (int) Math.floor(destination[0]);
    int dstY = (int) Math.floor(destination[1]);
    int dstZ = (int) Math.floor(destination[2]);

    if (!machineWorld.isAirBlock(dstX, dstY, dstZ)
        || !machineWorld.isAirBlock(dstX, dstY + 1, dstZ)) {
      // If it is blocked, try to find a better position
      double[] bestSpot = findBestSpawnLocation(machineWorld, coord);
      if (bestSpot != null) {
        destination = bestSpot;
      }

      // otherwise teleport to the default location... player will probably die though.
    }

    player.setPositionAndUpdate(destination[0], destination[1], destination[2]);

    if (destination.length == 5) {
      MessagePlayerRotation packet =
          new MessagePlayerRotation((float) destination[3], (float) destination[4]);
      PacketHandler.INSTANCE.sendTo(packet, player);
    }
  }
  /** Transfers an entity from a world to another world. */
  public void transferEntityToWorld(
      Entity entityIn, int p_82448_2_, WorldServer p_82448_3_, WorldServer p_82448_4_) {
    double var5 = entityIn.posX;
    double var7 = entityIn.posZ;
    double var9 = 8.0D;
    float var11 = entityIn.rotationYaw;
    p_82448_3_.theProfiler.startSection("moving");

    if (entityIn.dimension == -1) {
      var5 =
          MathHelper.clamp_double(
              var5 / var9,
              p_82448_4_.getWorldBorder().minX() + 16.0D,
              p_82448_4_.getWorldBorder().maxX() - 16.0D);
      var7 =
          MathHelper.clamp_double(
              var7 / var9,
              p_82448_4_.getWorldBorder().minZ() + 16.0D,
              p_82448_4_.getWorldBorder().maxZ() - 16.0D);
      entityIn.setLocationAndAngles(
          var5, entityIn.posY, var7, entityIn.rotationYaw, entityIn.rotationPitch);

      if (entityIn.isEntityAlive()) {
        p_82448_3_.updateEntityWithOptionalForce(entityIn, false);
      }
    } else if (entityIn.dimension == 0) {
      var5 =
          MathHelper.clamp_double(
              var5 * var9,
              p_82448_4_.getWorldBorder().minX() + 16.0D,
              p_82448_4_.getWorldBorder().maxX() - 16.0D);
      var7 =
          MathHelper.clamp_double(
              var7 * var9,
              p_82448_4_.getWorldBorder().minZ() + 16.0D,
              p_82448_4_.getWorldBorder().maxZ() - 16.0D);
      entityIn.setLocationAndAngles(
          var5, entityIn.posY, var7, entityIn.rotationYaw, entityIn.rotationPitch);

      if (entityIn.isEntityAlive()) {
        p_82448_3_.updateEntityWithOptionalForce(entityIn, false);
      }
    } else {
      BlockPos var12;

      if (p_82448_2_ == 1) {
        var12 = p_82448_4_.getSpawnPoint();
      } else {
        var12 = p_82448_4_.func_180504_m();
      }

      var5 = (double) var12.getX();
      entityIn.posY = (double) var12.getY();
      var7 = (double) var12.getZ();
      entityIn.setLocationAndAngles(var5, entityIn.posY, var7, 90.0F, 0.0F);

      if (entityIn.isEntityAlive()) {
        p_82448_3_.updateEntityWithOptionalForce(entityIn, false);
      }
    }

    p_82448_3_.theProfiler.endSection();

    if (p_82448_2_ != 1) {
      p_82448_3_.theProfiler.startSection("placing");
      var5 = (double) MathHelper.clamp_int((int) var5, -29999872, 29999872);
      var7 = (double) MathHelper.clamp_int((int) var7, -29999872, 29999872);

      if (entityIn.isEntityAlive()) {
        entityIn.setLocationAndAngles(
            var5, entityIn.posY, var7, entityIn.rotationYaw, entityIn.rotationPitch);
        p_82448_4_.getDefaultTeleporter().func_180266_a(entityIn, var11);
        p_82448_4_.spawnEntityInWorld(entityIn);
        p_82448_4_.updateEntityWithOptionalForce(entityIn, false);
      }

      p_82448_3_.theProfiler.endSection();
    }

    entityIn.setWorld(p_82448_4_);
  }
  /** Called on respawn */
  public EntityPlayerMP recreatePlayerEntity(
      EntityPlayerMP playerIn, int dimension, boolean conqueredEnd) {
    playerIn.getServerForPlayer().getEntityTracker().removePlayerFromTrackers(playerIn);
    playerIn.getServerForPlayer().getEntityTracker().untrackEntity(playerIn);
    playerIn.getServerForPlayer().getPlayerManager().removePlayer(playerIn);
    this.playerEntityList.remove(playerIn);
    this.mcServer
        .worldServerForDimension(playerIn.dimension)
        .removePlayerEntityDangerously(playerIn);
    BlockPos var4 = playerIn.func_180470_cg();
    boolean var5 = playerIn.isSpawnForced();
    playerIn.dimension = dimension;
    Object var6;

    if (this.mcServer.isDemo()) {
      var6 = new DemoWorldManager(this.mcServer.worldServerForDimension(playerIn.dimension));
    } else {
      var6 = new ItemInWorldManager(this.mcServer.worldServerForDimension(playerIn.dimension));
    }

    EntityPlayerMP var7 =
        new EntityPlayerMP(
            this.mcServer,
            this.mcServer.worldServerForDimension(playerIn.dimension),
            playerIn.getGameProfile(),
            (ItemInWorldManager) var6);
    var7.playerNetServerHandler = playerIn.playerNetServerHandler;
    var7.clonePlayer(playerIn, conqueredEnd);
    var7.setEntityId(playerIn.getEntityId());
    var7.func_174817_o(playerIn);
    WorldServer var8 = this.mcServer.worldServerForDimension(playerIn.dimension);
    this.func_72381_a(var7, playerIn, var8);
    BlockPos var9;

    if (var4 != null) {
      var9 =
          EntityPlayer.func_180467_a(
              this.mcServer.worldServerForDimension(playerIn.dimension), var4, var5);

      if (var9 != null) {
        var7.setLocationAndAngles(
            (double) ((float) var9.getX() + 0.5F),
            (double) ((float) var9.getY() + 0.1F),
            (double) ((float) var9.getZ() + 0.5F),
            0.0F,
            0.0F);
        var7.func_180473_a(var4, var5);
      } else {
        var7.playerNetServerHandler.sendPacket(new S2BPacketChangeGameState(0, 0.0F));
      }
    }

    var8.theChunkProviderServer.loadChunk((int) var7.posX >> 4, (int) var7.posZ >> 4);

    while (!var8.getCollidingBoundingBoxes(var7, var7.getEntityBoundingBox()).isEmpty()
        && var7.posY < 256.0D) {
      var7.setPosition(var7.posX, var7.posY + 1.0D, var7.posZ);
    }

    var7.playerNetServerHandler.sendPacket(
        new S07PacketRespawn(
            var7.dimension,
            var7.worldObj.getDifficulty(),
            var7.worldObj.getWorldInfo().getTerrainType(),
            var7.theItemInWorldManager.getGameType()));
    var9 = var8.getSpawnPoint();
    var7.playerNetServerHandler.setPlayerLocation(
        var7.posX, var7.posY, var7.posZ, var7.rotationYaw, var7.rotationPitch);
    var7.playerNetServerHandler.sendPacket(new S05PacketSpawnPosition(var9));
    var7.playerNetServerHandler.sendPacket(
        new S1FPacketSetExperience(var7.experience, var7.experienceTotal, var7.experienceLevel));
    this.updateTimeAndWeatherForPlayer(var7, var8);
    var8.getPlayerManager().addPlayer(var7);
    var8.spawnEntityInWorld(var7);
    this.playerEntityList.add(var7);
    this.field_177454_f.put(var7.getUniqueID(), var7);
    var7.addSelfToInternalCraftingInventory();
    var7.setHealth(var7.getHealth());
    return var7;
  }
  public void initializeConnectionToPlayer(NetworkManager netManager, EntityPlayerMP playerIn) {
    GameProfile var3 = playerIn.getGameProfile();
    PlayerProfileCache var4 = this.mcServer.getPlayerProfileCache();
    GameProfile var5 = var4.func_152652_a(var3.getId());
    String var6 = var5 == null ? var3.getName() : var5.getName();
    var4.func_152649_a(var3);
    NBTTagCompound var7 = this.readPlayerDataFromFile(playerIn);
    playerIn.setWorld(this.mcServer.worldServerForDimension(playerIn.dimension));
    playerIn.theItemInWorldManager.setWorld((WorldServer) playerIn.worldObj);
    String var8 = "local";

    if (netManager.getRemoteAddress() != null) {
      var8 = netManager.getRemoteAddress().toString();
    }

    logger.info(
        playerIn.getName()
            + "["
            + var8
            + "] logged in with entity id "
            + playerIn.getEntityId()
            + " at ("
            + playerIn.posX
            + ", "
            + playerIn.posY
            + ", "
            + playerIn.posZ
            + ")");
    WorldServer var9 = this.mcServer.worldServerForDimension(playerIn.dimension);
    WorldInfo var10 = var9.getWorldInfo();
    BlockPos var11 = var9.getSpawnPoint();
    this.func_72381_a(playerIn, (EntityPlayerMP) null, var9);
    NetHandlerPlayServer var12 = new NetHandlerPlayServer(this.mcServer, netManager, playerIn);
    var12.sendPacket(
        new S01PacketJoinGame(
            playerIn.getEntityId(),
            playerIn.theItemInWorldManager.getGameType(),
            var10.isHardcoreModeEnabled(),
            var9.provider.getDimensionId(),
            var9.getDifficulty(),
            this.getMaxPlayers(),
            var10.getTerrainType(),
            var9.getGameRules().getGameRuleBooleanValue("reducedDebugInfo")));
    var12.sendPacket(
        new S3FPacketCustomPayload(
            "MC|Brand",
            (new PacketBuffer(Unpooled.buffer()))
                .writeString(this.getServerInstance().getServerModName())));
    var12.sendPacket(
        new S41PacketServerDifficulty(var10.getDifficulty(), var10.isDifficultyLocked()));
    var12.sendPacket(new S05PacketSpawnPosition(var11));
    var12.sendPacket(new S39PacketPlayerAbilities(playerIn.capabilities));
    var12.sendPacket(new S09PacketHeldItemChange(playerIn.inventory.currentItem));
    playerIn.getStatFile().func_150877_d();
    playerIn.getStatFile().func_150884_b(playerIn);
    this.func_96456_a((ServerScoreboard) var9.getScoreboard(), playerIn);
    this.mcServer.refreshStatusNextTick();
    ChatComponentTranslation var13;

    if (!playerIn.getName().equalsIgnoreCase(var6)) {
      var13 =
          new ChatComponentTranslation(
              "multiplayer.player.joined.renamed", new Object[] {playerIn.getDisplayName(), var6});
    } else {
      var13 =
          new ChatComponentTranslation(
              "multiplayer.player.joined", new Object[] {playerIn.getDisplayName()});
    }

    var13.getChatStyle().setColor(EnumChatFormatting.YELLOW);
    this.sendChatMsg(var13);
    this.playerLoggedIn(playerIn);
    var12.setPlayerLocation(
        playerIn.posX, playerIn.posY, playerIn.posZ, playerIn.rotationYaw, playerIn.rotationPitch);
    this.updateTimeAndWeatherForPlayer(playerIn, var9);

    if (this.mcServer.getResourcePackUrl().length() > 0) {
      playerIn.func_175397_a(
          this.mcServer.getResourcePackUrl(), this.mcServer.getResourcePackHash());
    }

    Iterator var14 = playerIn.getActivePotionEffects().iterator();

    while (var14.hasNext()) {
      PotionEffect var15 = (PotionEffect) var14.next();
      var12.sendPacket(new S1DPacketEntityEffect(playerIn.getEntityId(), var15));
    }

    playerIn.addSelfToInternalCraftingInventory();

    if (var7 != null && var7.hasKey("Riding", 10)) {
      Entity var16 = EntityList.createEntityFromNBT(var7.getCompoundTag("Riding"), var9);

      if (var16 != null) {
        var16.forceSpawn = true;
        var9.spawnEntityInWorld(var16);
        playerIn.mountEntity(var16);
        var16.forceSpawn = false;
      }
    }
  }
  /** Transfers an entity from a world to another world. */
  public void transferEntityToWorld(
      Entity par1Entity, int par2, WorldServer par3WorldServer, WorldServer par4WorldServer) {
    double var5 = par1Entity.posX;
    double var7 = par1Entity.posZ;
    double var9 = 8.0D;
    double var11 = par1Entity.posX;
    double var13 = par1Entity.posY;
    double var15 = par1Entity.posZ;
    float var17 = par1Entity.rotationYaw;
    par3WorldServer.theProfiler.startSection("moving");

    if (par1Entity.dimension == -1) {
      var5 /= var9;
      var7 /= var9;
      par1Entity.setLocationAndAngles(
          var5, par1Entity.posY, var7, par1Entity.rotationYaw, par1Entity.rotationPitch);

      if (par1Entity.isEntityAlive()) {
        par3WorldServer.updateEntityWithOptionalForce(par1Entity, false);
      }
    } else if (par1Entity.dimension == 0) {
      var5 *= var9;
      var7 *= var9;
      par1Entity.setLocationAndAngles(
          var5, par1Entity.posY, var7, par1Entity.rotationYaw, par1Entity.rotationPitch);

      if (par1Entity.isEntityAlive()) {
        par3WorldServer.updateEntityWithOptionalForce(par1Entity, false);
      }
    } else {
      ChunkCoordinates var18;

      if (par2 == 1) {
        var18 = par4WorldServer.getSpawnPoint();
      } else {
        var18 = par4WorldServer.getEntrancePortalLocation();
      }

      var5 = (double) var18.posX;
      par1Entity.posY = (double) var18.posY;
      var7 = (double) var18.posZ;
      par1Entity.setLocationAndAngles(var5, par1Entity.posY, var7, 90.0F, 0.0F);

      if (par1Entity.isEntityAlive()) {
        par3WorldServer.updateEntityWithOptionalForce(par1Entity, false);
      }
    }

    par3WorldServer.theProfiler.endSection();

    if (par2 != 1) {
      par3WorldServer.theProfiler.startSection("placing");
      var5 = (double) MathHelper.clamp_int((int) var5, -29999872, 29999872);
      var7 = (double) MathHelper.clamp_int((int) var7, -29999872, 29999872);

      if (par1Entity.isEntityAlive()) {
        par4WorldServer.spawnEntityInWorld(par1Entity);
        par1Entity.setLocationAndAngles(
            var5, par1Entity.posY, var7, par1Entity.rotationYaw, par1Entity.rotationPitch);
        par4WorldServer.updateEntityWithOptionalForce(par1Entity, false);
        par4WorldServer.func_85176_s().placeInPortal(par1Entity, var11, var13, var15, var17);
      }

      par3WorldServer.theProfiler.endSection();
    }

    par1Entity.setWorld(par4WorldServer);
  }
  /**
   * creates and returns a respawned player based on the provided PlayerEntity. Args are the
   * PlayerEntityMP to respawn, an INT for the dimension to respawn into (usually 0), and a boolean
   * value that is true if the player beat the game rather than dying
   */
  public EntityPlayerMP respawnPlayer(EntityPlayerMP par1EntityPlayerMP, int par2, boolean par3) {
    par1EntityPlayerMP
        .getServerForPlayer()
        .getEntityTracker()
        .removeAllTrackingPlayers(par1EntityPlayerMP);
    par1EntityPlayerMP
        .getServerForPlayer()
        .getEntityTracker()
        .removeEntityFromAllTrackingPlayers(par1EntityPlayerMP);
    par1EntityPlayerMP.getServerForPlayer().getPlayerManager().removePlayer(par1EntityPlayerMP);
    this.playerEntityList.remove(par1EntityPlayerMP);
    this.mcServer
        .worldServerForDimension(par1EntityPlayerMP.dimension)
        .removeEntity(par1EntityPlayerMP);
    ChunkCoordinates var4 = par1EntityPlayerMP.getBedLocation();
    boolean var5 = par1EntityPlayerMP.isSpawnForced();
    par1EntityPlayerMP.dimension = par2;
    Object var6;

    if (this.mcServer.isDemo()) {
      var6 =
          new DemoWorldManager(this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension));
    } else {
      var6 =
          new ItemInWorldManager(
              this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension));
    }

    EntityPlayerMP var7 =
        new EntityPlayerMP(
            this.mcServer,
            this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension),
            par1EntityPlayerMP.username,
            (ItemInWorldManager) var6);
    var7.playerNetServerHandler = par1EntityPlayerMP.playerNetServerHandler;
    var7.clonePlayer(par1EntityPlayerMP, par3);
    var7.entityId = par1EntityPlayerMP.entityId;
    WorldServer var8 = this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension);
    this.func_72381_a(var7, par1EntityPlayerMP, var8);
    ChunkCoordinates var9;

    if (var4 != null) {
      var9 =
          EntityPlayer.verifyRespawnCoordinates(
              this.mcServer.worldServerForDimension(par1EntityPlayerMP.dimension), var4, var5);

      if (var9 != null) {
        var7.setLocationAndAngles(
            (double) ((float) var9.posX + 0.5F),
            (double) ((float) var9.posY + 0.1F),
            (double) ((float) var9.posZ + 0.5F),
            0.0F,
            0.0F);
        var7.setSpawnChunk(var4, var5);
      } else {
        var7.playerNetServerHandler.sendPacketToPlayer(new Packet70GameEvent(0, 0));
      }
    }

    var8.theChunkProviderServer.loadChunk((int) var7.posX >> 4, (int) var7.posZ >> 4);

    while (!var8.getCollidingBoundingBoxes(var7, var7.boundingBox).isEmpty()) {
      var7.setPosition(var7.posX, var7.posY + 1.0D, var7.posZ);
    }

    var7.playerNetServerHandler.sendPacketToPlayer(
        new Packet9Respawn(
            var7.dimension,
            (byte) var7.worldObj.difficultySetting,
            var7.worldObj.getWorldInfo().getTerrainType(),
            var7.worldObj.getHeight(),
            var7.theItemInWorldManager.getGameType()));
    var9 = var8.getSpawnPoint();
    var7.playerNetServerHandler.setPlayerLocation(
        var7.posX, var7.posY, var7.posZ, var7.rotationYaw, var7.rotationPitch);
    var7.playerNetServerHandler.sendPacketToPlayer(
        new Packet6SpawnPosition(var9.posX, var9.posY, var9.posZ));
    var7.playerNetServerHandler.sendPacketToPlayer(
        new Packet43Experience(var7.experience, var7.experienceTotal, var7.experienceLevel));
    this.updateTimeAndWeatherForPlayer(var7, var8);
    var8.getPlayerManager().addPlayer(var7);
    var8.spawnEntityInWorld(var7);
    this.playerEntityList.add(var7);
    var7.addSelfToInternalCraftingInventory();
    return var7;
  }
  private static Entity sendEntityToWorld(
      Entity entity, int newDimension, Vector3 newPos, Facing3 newLook) {
    MinecraftServer server = MinecraftServer.getServer();
    Entity currentEntity = entity;
    if (entity.dimension != newDimension) {
      if (entity instanceof EntityPlayerMP) {
        EntityPlayerMP player = (EntityPlayerMP) entity;
        ServerConfigurationManager scm = server.getConfigurationManager();
        int oldDimension = player.dimension;
        player.dimension = newDimension;
        WorldServer oldWorld = server.worldServerForDimension(oldDimension);
        WorldServer newWorld = server.worldServerForDimension(newDimension);

        DimensionRegisterMessage packet =
            new DimensionRegisterMessage(
                newDimension, DimensionManager.getProviderType(newDimension));
        LCRuntime.runtime.network().getPreferredPipe().sendForgeMessageTo(packet, player);

        player.closeScreen();
        player.playerNetServerHandler.sendPacket(
            new S07PacketRespawn(
                player.dimension,
                player.worldObj.difficultySetting,
                newWorld.getWorldInfo().getTerrainType(),
                player.theItemInWorldManager.getGameType()));
        oldWorld.removePlayerEntityDangerously(player);
        player.isDead = false;
        player.setLocationAndAngles(
            newPos.x, newPos.y, newPos.z, (float) newLook.yaw, (float) newLook.pitch);
        newWorld.spawnEntityInWorld(player);
        player.setWorld(newWorld);
        scm.func_72375_a(player, oldWorld);
        player.playerNetServerHandler.setPlayerLocation(
            newPos.x, newPos.y, newPos.z, (float) newLook.yaw, (float) newLook.pitch);
        player.theItemInWorldManager.setWorld(newWorld);
        scm.updateTimeAndWeatherForPlayer(player, newWorld);
        scm.syncPlayerInventory(player);
        Iterator<?> var6 = player.getActivePotionEffects().iterator();
        while (var6.hasNext())
          player.playerNetServerHandler.sendPacket(
              new S1DPacketEntityEffect(player.getEntityId(), (PotionEffect) var6.next()));
        player.playerNetServerHandler.sendPacket(
            new S1FPacketSetExperience(
                player.experience, player.experienceTotal, player.experienceLevel));
      } else {
        int oldDimension = entity.dimension;
        WorldServer oldWorld = server.worldServerForDimension(oldDimension);
        WorldServer newWorld = server.worldServerForDimension(newDimension);
        entity.dimension = newDimension;

        entity.worldObj.removeEntity(entity);
        entity.isDead = false;
        server
            .getConfigurationManager()
            .transferEntityToWorld(entity, oldDimension, oldWorld, newWorld);
        currentEntity = EntityList.createEntityByName(EntityList.getEntityString(entity), newWorld);

        if (currentEntity != null) {
          currentEntity.copyDataFrom(entity, true);
          currentEntity.setLocationAndAngles(
              newPos.x, newPos.y, newPos.z, (float) newLook.yaw, (float) newLook.pitch);
          newWorld.spawnEntityInWorld(currentEntity);
        }

        entity.isDead = true;
        oldWorld.resetUpdateEntityTick();
        newWorld.resetUpdateEntityTick();
      }
    } else {
      currentEntity.setLocationAndAngles(
          newPos.x, newPos.y, newPos.z, (float) newLook.yaw, (float) newLook.pitch);
      if (currentEntity instanceof EntityPlayerMP) {
        EntityPlayerMP mpEnt = (EntityPlayerMP) currentEntity;
        mpEnt.rotationYaw = (float) newLook.yaw;
        mpEnt.setPositionAndUpdate(newPos.x, newPos.y, newPos.z);
        mpEnt.worldObj.updateEntityWithOptionalForce(entity, false);
      }
    }
    return currentEntity;
  }