[1.12.2]changeDimenson() из энда

Версия Minecraft
1.12.2
Сделал предмет который по клику ПКМ должен перемещать в измерение в зависимости от выбранного режима. Всё работает прекрасно, кроме перемещения ИЗ энда(телепорт в сам энд работает прекрасно). Всё просто практически зависает, как будто меня нет как игрока, мобы телепортируются, блоки не ломаются, при попытке выдать предмет через @p, пишет что такого игрока нет, иногда в логи выдаёт надпись о перегрузке сервера и пинге 2000-2500 мс. Перерыл весь интернет в поиске решения, и видимо на форуме форджа такая проблема была только у одного человека, но его решение не помогло мне. В общем уже не знаю что делать, надеюсь вы мне поможете. Приложил кусок кода отвечающего за перемещение.
Java:
public ActionResult<ItemStack> onItemRightClick(World worldIn, EntityPlayer playerIn, EnumHand handIn) {
        ItemStack itemstack = playerIn.getHeldItem(handIn);
        if (!worldIn.isRemote) {
            if (itemstack.hasTagCompound() && itemstack.getTagCompound().hasKey("Mode")) {
                if (itemstack.getTagCompound().getFloat("Mode") == 0.3F && playerIn.world.provider.getDimension() != -1) {
                    playerIn.setPortal(playerIn.getPosition());
                    playerIn.changeDimension(-1);
                } else if (itemstack.getTagCompound().getFloat("Mode") == 0.6F && playerIn.world.provider.getDimension() != 0) {
                    playerIn.setPortal(playerIn.getPosition());
                    playerIn.changeDimension(0);
                } else if (itemstack.getTagCompound().getFloat("Mode") == 1 && playerIn.world.provider.getDimension() != 1) {
                    playerIn.setPortal(playerIn.getPosition());
                    playerIn.changeDimension(1);
                }
            }
        }
        return new ActionResult<ItemStack>(EnumActionResult.SUCCESS, itemstack);
    }
 
Решение
Лучше используй кастомный ITeleporter и через него перемещай игрока.
Это будет лучше, чем использовать "ванильный" метод changeDimension.

(Просто реализуй ITeleporter и перемещай с помощью него игрока)
3,005
192
592
Лучше используй кастомный ITeleporter и через него перемещай игрока.
Это будет лучше, чем использовать "ванильный" метод changeDimension.

(Просто реализуй ITeleporter и перемещай с помощью него игрока)
 
3,005
192
592
Там всего 1 метод, в котором ты ставишь игрока на нужные координаты.
Вроде все.
 
3,005
192
592
Код:
public class Teleporter implements ITeleporter {
    private BlockPos pos;

    public Teleporter(BlockPos pos) {
        this.pos = pos;
    }

    @Override
    public void placeEntity(World world, Entity entity, float yaw) {
        entity.setLocationAndAngles(pos.getX() + .4, pos.getY() + .5, pos.getZ() + .4, entity.rotationYaw, entity.rotationPitch);
        entity.motionX = entity.motionY = entity.motionZ = 0;
        entity.fallDistance = 0;
    }
}
 
7,099
324
1,510
Все гораздо проще. Копипастим отсюда эту утилку EndersMagic/EnderMagic
Юзаем так:
Java:
TeleportUtils.teleportToBlockLocation(entity, new Location(x,y,z,dim));
Эта штука тп-ет любую сущность, при этом она может сидеть на ком-то и на ней могут сидеть и это нормально отработает
 
3,005
192
592
Все гораздо проще. Копипастим отсюда эту утилку EndersMagic/EnderMagic
Юзаем так:
Java:
TeleportUtils.teleportToBlockLocation(entity, new Location(x,y,z,dim));
Эта штука тп-ет любую сущность, при этом она может сидеть на ком-то и на ней могут сидеть и это нормально отработает
А как мне в данном случае предотвратить телепорт игрока в блоки? Тот же changeDimension телепортирует прямо на портал(в случае с незером) или на спаунпоинт(в случае с эндом и обычным миром). Хорошо, я знаю как получить координаты кровати, а где мне взять координаты портала в незере к примеру? Тем более если игрок там ни разу не был
 
player.changeDimension(dimId, new Teleporter(player.getPosition());
Сейчас попробую,я кстати перед этим делал с кастомным телепортером через transferPlayerToDimension вот так, не помогло
Java:
WorldServer worldServer = entityPlayerMP.getEntityWorld().getMinecraftServer().getWorld(home_dim);
entityPlayerMP.getServer().getPlayerList().transferPlayerToDimension(entityPlayerMP, home_dim, new YJTeleporter(worldServer));
entityPlayerMP.setPositionAndUpdate(home_x, home_y, home_z);
worldServer.spawnEntity(entityPlayerMP);
worldServer.updateEntityWithOptionalForce(entityPlayerMP, false);
 
3,005
192
592
3,005
192
592
Типо если юзать метод без телепортера - берется дефолтный телепортер из мира, а после уже идет код из него.
В овере - хз, не смотрел.
В аду - дефолт телепорт создает портал.
В енде - дефолт телепорт тепает именно на платформу.
А если указать свое - значит свое и будет нормально работать, как ты напишешь.

P.S. Инфа о дефолт телепортах не точная, хотя.. Такая же как и любой мой ответ.

~~~

Кстати, на форуме есть еще лайки, ими можно "поблагодарить" сообщение, которое не вошло в "лучший ответ".
 
7,099
324
1,510
А как мне в данном случае предотвратить телепорт игрока в блоки?
Искать подходящие координаты.
Для овера - кровать или спавн, для края - платформа, как и сказал Док. А для остальных по какому-нить алгоритму ищешь свободное место. Например, подниматься вверх пока не будет свободно
 
Сверху