Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Ломается перемещение Entity через телепорты ProtocolLib

HogeltBellai

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
HogeltBellai
Добрый день форумчане!
3 дней шёл моей битвы с исправлением энтити и их отгрузкой в прострацию.
Суть проблемы в том что пока есть проверка
Код:
if (distance >= 20) {
, из за него не работает 2 часть кода
Код:
} else if (distance < 20) {
.
Изначальной идеей было пересоздавать пета если овенр далеко тепается от питомца, то питомец удаляется путём пакетов и пересоздаётся, но видимо из за этого не работает 2-ая часть кода, а она отвечает за подгрузку питомцев у всех кто подходит близко к любому владельцу питомца, без неё у других просто будет пропадать питомец после телепортаций (Не для овнера).

Мне нужно что бы обе части работали и у овнера нормально пересоздавался питомец(иначе он не будет виден ему) и соответственно у других ребят в близи он прогружался.

Код:
private void movePet(Location location) {
    try {
        double distance = previousLocation.distance(location);
        if (distance >= 20) {
            //тут ещё должен быть ремов

            //Важная тема, тут питомец для владельца пересоздаётся когда он далеко тепается
            PetAPI petAPI = Prison.getInstance().getPet().loadPetData(new PlayerAPI().getPet(owner));
            Prison.getInstance().getPet().spawnPet(owner, petAPI);
        } else if (distance < 20) {
            //Тут у других людей прогружается энтити
            for (Player player : Bukkit.getOnlinePlayers()) {
                CustomPet pet = playerPets.get(owner);
                if (location.distance(player.getLocation()) <= 20) {
                    if (!this.playerNear.contains(player)) {
                        this.playerNear.add(player);
                        removePetForPlayer(player, pet);
                        loadPetsForOnlinePlayer(player, pet);
                    }
                } else {
                    if (this.playerNear.contains(player)) {
                        this.playerNear.remove(player);
                        removePetForPlayer(player, pet);
                    }
                }
            }
        } else {
            PacketContainer teleportPacket = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.ENTITY_TELEPORT);
            move(teleportPacket, owner.getLocation());
            for(Player player : Bukkit.getOnlinePlayers()) {
                ProtocolLibrary.getProtocolManager().sendServerPacket(player, teleportPacket);
            }
        }
        previousLocation = location;
    } catch (Exception ex) {
        Bukkit.broadcastMessage("" + ex.getMessage());
        ex.printStackTrace();
    }
}

Код подгрузки питомцев
Код:
    public static void loadPetsForOnlinePlayer(Player player, CustomPet pet) {
        ProtocolLibrary.getProtocolManager().sendServerPacket(player, pet.spawnPacket);
        ProtocolLibrary.getProtocolManager().sendServerPacket(player, pet.equipmentPacket);
        ProtocolLibrary.getProtocolManager().sendServerPacket(player, pet.metadataPacket);
    }

Код крафта питомца
Код:
    public static void loadPetsForOnlinePlayer(Player player, CustomPet pet) {
private final Player owner;
private Location previousLocation;
private final PetAPI petAPI;
private int entityId;
private BukkitTask task;
private PacketContainer spawnPacket;
private PacketContainer equipmentPacket;
private PacketContainer metadataPacket;
private PacketContainer destroyPacket;
private UUID uuid;
public static final Map<Player, CustomPet> playerPets = new HashMap<>();
private List<Player> playerNear = null;

public CustomPet(Player owner, Location location, PetAPI petAPI) {
    previousLocation = location;
    this.owner = owner;
    this.petAPI = petAPI;
    this.playerNear = new ArrayList<>();

    this.uuid = UUID.randomUUID();

    this.spawnPacket = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.SPAWN_ENTITY);
    this.equipmentPacket = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.ENTITY_EQUIPMENT);
    this.metadataPacket = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA);
    this.destroyPacket = ProtocolLibrary.getProtocolManager().createPacket(PacketType.Play.Server.ENTITY_DESTROY);

    createPet(location);
    startPetUpdate();
    playerPets.put(owner, this);
}

public void createPet(Location location) {
    try {
        entityId = (int) (Math.random() * Integer.MAX_VALUE);
        spawnPacket.getIntegers().write(0, entityId);
        spawnPacket.getEntityTypeModifier().write(0, EntityType.ARMOR_STAND);
        spawnPacket.getUUIDs().write(0, uuid);
        Bukkit.broadcastMessage(owner + " " +  uuid + "");
        spawnPacket.getDoubles().write(0, location.getX());
        spawnPacket.getDoubles().write(1, location.getY());
        spawnPacket.getDoubles().write(2, location.getZ());


        equipmentPacket.getIntegers().write(0, entityId);
        List<Pair<EnumWrappers.ItemSlot, ItemStack>> list = new ArrayList<>();
        list.add(new Pair<>(EnumWrappers.ItemSlot.HEAD, petAPI.getHeadItem()));
        equipmentPacket.getSlotStackPairLists().write(0, list);

        metadataPacket.getModifier().writeDefaults();
        metadataPacket.getIntegers().write(0, entityId);

        WrappedDataWatcher dataWatcher = new WrappedDataWatcher();

        WrappedChatComponent displayName = WrappedChatComponent.fromText(ChatColor.translateAlternateColorCodes('&', petAPI.getName().replace("%player%", owner.getName())));
        dataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(2, WrappedDataWatcher.Registry.getChatComponentSerializer(true)), Optional.of(displayName));

        dataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(3, WrappedDataWatcher.Registry.get(Boolean.class)), true);

        dataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(14, WrappedDataWatcher.Registry.get(Byte.class)), (byte) 0x01);

        dataWatcher.setObject(new WrappedDataWatcher.WrappedDataWatcherObject(0, WrappedDataWatcher.Registry.get(Byte.class)), (byte) 0x20);

        metadataPacket.getWatchableCollectionModifier().write(0, dataWatcher.getWatchableObjects());

        for(Player player : Bukkit.getOnlinePlayers()) {
            ProtocolLibrary.getProtocolManager().sendServerPacket(player, spawnPacket);
            ProtocolLibrary.getProtocolManager().sendServerPacket(player, equipmentPacket);
            ProtocolLibrary.getProtocolManager().sendServerPacket(player, metadataPacket);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
    }
 
Для начала приведи код в порядок. У тебя вот такое условие:
PHP:
if (distance >= 20) {
} else if (distance < 20) {
} else {
}
Как ты себе представляешь выполнение условия в else? Дистанция либо больше или равна 20-и, либо меньше. Третьего не дано.
Как разберёшься с этим - выясни, действительно ли код не вызывается, или проблема в чём-то другом. Если код не вызывается, то проверь дистанцию.
Это всё очевидные вещи, до которых ты должен догадываться самостоятельно при программировании, иначе у тебя будет затык на каждом этапе
 

Поделиться этой страницей

Назад
Верх