package choonster.testmod3.item;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.TextComponentTranslation;
import net.minecraft.world.World;
import net.minecraft.world.WorldServer;
/**
* An item that teleports the player to their spawn position when right clicked.
*
* @author Choonster
*/
public class ItemRespawner extends ItemTestMod3 {
public ItemRespawner() {
super("respawner");
}
@Override
public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand hand) {
final ItemStack heldItem = playerIn.getHeldItem(hand);
if (!worldIn.isRemote) {
final EntityPlayerMP playerMP = (EntityPlayerMP) playerIn;
final int dimension;
if (!worldIn.provider.canRespawnHere()) {
dimension = worldIn.provider.getRespawnDimension(playerMP);
playerMP.changeDimension(dimension);
} else {
dimension = playerMP.dimension;
}
final BlockPos bedLocation = playerMP.getBedLocation(dimension);
final WorldServer worldServer = worldIn.getMinecraftServer() != null ? worldIn.getMinecraftServer().worldServerForDimension(dimension) : null;
if (worldServer == null) {
return new ActionResult<>(EnumActionResult.FAIL, heldItem);
}
if (bedLocation == null) {
playerMP.sendMessage(new TextComponentTranslation("message.testmod3:respawner.no_spawn_location"));
return new ActionResult<>(EnumActionResult.FAIL, heldItem);
}
final boolean spawnForced = playerMP.isSpawnForced(dimension);
final BlockPos spawnLocation = EntityPlayer.getBedSpawnLocation(worldServer, bedLocation, spawnForced);
if (spawnLocation == null) {
return new ActionResult<>(EnumActionResult.FAIL, heldItem);
}
playerMP.setLocationAndAngles(spawnLocation.getX() + 0.5, spawnLocation.getY() + 0.1, spawnLocation.getZ() + 0.5, 0, 0);
playerMP.connection.setPlayerLocation(playerMP.posX, playerMP.posY, playerMP.posZ, playerMP.rotationYaw, playerMP.rotationPitch);
worldServer.getChunkProvider().loadChunk((int) playerMP.posX >> 4, (int) playerMP.posZ >> 4);
while (!worldServer.getCollisionBoxes(playerMP, playerMP.getEntityBoundingBox()).isEmpty() && playerMP.posY < 256.0D) {
playerMP.setPosition(playerMP.posX, playerMP.posY + 1.0D, playerMP.posZ);
}
playerIn.sendMessage(new TextComponentTranslation("message.testmod3:respawner.teleporting", spawnLocation.getX(), spawnLocation.getY(), spawnLocation.getZ(), dimension));
return new ActionResult<>(EnumActionResult.SUCCESS, heldItem);
}
return new ActionResult<>(EnumActionResult.SUCCESS, heldItem);
}
}