1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем HogeltBellai, 5 апр 2024.

  1. Автор темы
    HogeltBellai

    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();
        }
    }
        }
     
  2. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Для начала приведи код в порядок. У тебя вот такое условие:
    PHP:
    if (distance >= 20) {
    } else if (
    distance 20) {
    } else {
    }
    Как ты себе представляешь выполнение условия в else? Дистанция либо больше или равна 20-и, либо меньше. Третьего не дано.
    Как разберёшься с этим - выясни, действительно ли код не вызывается, или проблема в чём-то другом. Если код не вызывается, то проверь дистанцию.
    Это всё очевидные вещи, до которых ты должен догадываться самостоятельно при программировании, иначе у тебя будет затык на каждом этапе
     

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