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

Помогите Частицы возле головы игрока

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

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

    MrKom3ta Ньюби

    Баллы:
    1
    Имя в Minecraft:
    _TwX_
    Здравствуйте тому кто это читает! Я делаю свой плагин на электронные сигареты и мне нужно
    чтобы частицы дыма спавнились там , куда смотрит игрок. Точнее возле его рта . Но
    в коде я прописал .getAyeLocation() и в понимании Bukkit AyeLocation это только высота
    так вот , можно ли сделать так чтобы частицы спавнились возле рта куда бы не смотрел игрок.
    (буду очень рад любой помощи ведь я новичек и все советы для меня важны).
     
  2. Автор темы
    MrKom3ta

    MrKom3ta Ньюби

    Баллы:
    1
    Имя в Minecraft:
    _TwX_
    package me.twx.twx_vape;

    import org.bukkit.*;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerInteractEvent;
    import org.*********ventory.ItemStack;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.scheduler.BukkitRunnable;



    public class TwX_Vape extends JavaPlugin implements Listener {

    @Override
    public void onEnable() {


    Bukkit.getPluginManager().registerEvents(this, this);
    }


    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
    Player player = event.getPlayer();


    if (player.getItemInHand().getType() == Material.SPYGLASS && player.getItemInHand().getItemMeta().getDisplayName().equalsIgnoreCase("Вейп")) {

    new BukkitRunnable() {
    int ticks = 0;

    @Override
    public void run() {
    // Создание белого дыма возле головы игрока
    Location smokeLocation = player.getEyeLocation();
    Particle.DustTransition dustTransition = new Particle.DustTransition(Color.WHITE, Color.fromRGB(255, 255, 255), 4);


    player.playSound(player.getLocation(), Sound.BLOCK_BUBBLE_COLUMN_BUBBLE_POP, 5, 1);
    ticks++;
    if (ticks >= 100) { // 60 тиков = 3 секунды (20 тиков в секунде)
    this.cancel();

    } else if (ticks >= 40) {
    player.getWorld().spawnParticle(Particle.REDSTONE, smokeLocation, 1, 0, 0, 0, 0, dustTransition);

    }
    }


    }.runTaskTimer(this, 0, 1); // Запускаем таймер с интервалом 1 тик (1/20 секунды)
    } else if (player.getItemInHand().getType() == Material.SPYGLASS && player.getItemInHand().getItemMeta().getDisplayName().equalsIgnoreCase("Сигарета")) {

    new BukkitRunnable() {
    int ticks = 0;

    @Override
    public void run() {

    Location smokeLocation = player.getEyeLocation().add(0, 0, 0);
    Particle.DustTransition dustTransition1 = new Particle.DustTransition(Color.GRAY, Color.fromRGB(33, 33, 33), 3);


    player.playSound(player.getLocation(), Sound.BLOCK_BUBBLE_COLUMN_BUBBLE_POP, 5, 1);
    ticks++;
    if (ticks >= 100) {
    this.cancel();

    } else if (ticks >= 40) {
    player.getWorld().spawnParticle(Particle.REDSTONE, smokeLocation, 1, 0, 0, 0, 0, dustTransition1);

    }
    }
    }.runTaskTimer(this, 0, 1);
    } else if (player.getItemInHand().getType() == Material.SPYGLASS && player.getItemInHand().getItemMeta().getDisplayName().equalsIgnoreCase("Вейп Виноград" )) {
    new BukkitRunnable() {
    int ticks = 0;

    @Override
    public void run() {

    Location smokeLocation = player.getEyeLocation().add(0, 0, 0);
    Particle.DustTransition dustTransition2 = new Particle.DustTransition(Color.PURPLE, Color.fromRGB(99, 53, 99), 4);


    player.playSound(player.getLocation(), Sound.BLOCK_BUBBLE_COLUMN_BUBBLE_POP, 5, 1);
    ticks++;
    if (ticks >= 100) {
    this.cancel();

    } else if (ticks >= 40) {
    player.getWorld().spawnParticle(Particle.REDSTONE, smokeLocation, 1, 0, 0, 0, 0, dustTransition2);

    }
    }


    } .runTaskTimer(this, 0, 1);
    }
    }
    }




    А это код (я знаю что писать все в 1 классе плохо но все же
     
  3. quateris?

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

    Баллы:
    66
    realbebra.png вейп плохо, а насчёт плагина
    тебе нужно такое?
     
  4. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    eye location - это действительно точка на уровне глаз, но в центре хитбокса (если смотреть сверху).
    Если нужно, чтоб игрок видел перед собой частицы - необходимо отодвинуть точку от центра хитбокса на 1.5-2 блока. Таким образом, при вращении игрока должна получиться окружность из частиц.

    Теперь обращаемся к геометрии - необходимо получить координаты точки на окружности. Сделать это можно таким образом:
    x= x0 + r * cos(δ)
    y= y0 + r * sin(δ)
    x0,y0 - координаты центра окружности (координаты игрока в мире)
    r - радиус окружности (1.5 блока)
    δ - угол поворота радиуса вектора (поворот головы игрока)

    Подставляешь необходимые параметры и получаешь координаты для спауна частицы
     
  5. quateris?

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

    Баллы:
    66
    я просто добавил пару чисел из вектора взгляда игрока в локацию для спавна партикла (eyelocation)
     
  6. Автор темы
    MrKom3ta

    MrKom3ta Ньюби

    Баллы:
    1
    Имя в Minecraft:
    _TwX_
    То есть чтобы сделать это пишем этот код и пишем .getAyeLocation.add(x , y); ? (извините если вопрос тупой)
     
  7. Автор темы
    MrKom3ta

    MrKom3ta Ньюби

    Баллы:
    1
    Имя в Minecraft:
    _TwX_
    Location test = player.getEyeLocation();
    double x = test.x() + 1.5 * Math.cos(45);
    double y = test.y() + 1.5 * Math.sin(45);

    @Override
    public void run() {

    Location smokeLocation = player.getEyeLocation().add(x, y, 0);
    Particle.DustTransition dustTransition2 = new Particle.DustTransition(Color.PURPLE, Color.fromRGB(99, 53, 99), 4);

    вот мой код , он не работает ведь вместо того чтобы спавнить частицы оно телепортирует игрока.
     
  8. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Ты можешь получить локацию игрока и к ней что-то прибавить. Но потом эту локацию нужно применить для отображения частицы.
    Это не полный код. Я не вижу тут ни телепортации, ни спауна частицы. Но, в любом случае, что мешает заменить телепортацию на отображение частицы?

    Ещё заметил проблему, что ты добавляешь к локации неверную ось. Почему-то к Y ты прибавляешь, к вот к Z нет. Должно быть наоборот. Y в майне - это всегда высота
     
    Последнее редактирование: 17 авг 2023

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