Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите [Решено] Как сделать луч из частиц между двумя точками?

Тема в разделе "Разработка плагинов для новичков", создана пользователем Reality_SC, 30 июн 2015.

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

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Делаю свой игровой режим.

    В мире будут определённые точки, если игрок (или несколько) подходят к ним на определённое расстояние, нужно рендерить луч из какого-нибудь симпатичного вида частиц от этой точки до каждого игрока.

    Не нашёл в гугле картинки более близкой к теме :)
    [​IMG]

    Дано: Location locCore = центр лучей; Location locPlayer = координата игрока во время срабатывания onPlayerMove.

    Как это сделать попроще (но и поправильнее?) :)

    @DPOH-VAR @MYXOMOPX @fromgate
     
    Последнее редактирование: 30 июн 2015
  2. Хостинг MineCraft
    <
  3. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Берёшь BlockIterator, переделываешь под локации, а не блоки, для большей плотности луча.
     
  4. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Как-то сильно кратко, извини =)
    Настрогать кучу координат между двумя точками я могу и сам, простым циклом...

    Не очень понятно, как их отрендерить? Спавнить на каждой точке какой-то объект? Где-то существуют предопределения видов Particle? Какое у них время жизни? Что делать, если нужно сдвинуть луч? Пересоздать все, или сдвинуть?
    Я впервые в этой теме =)[DOUBLEPOST=1435673198,1435671763][/DOUBLEPOST]Ткну ещё ребяток :)
    @Plasticable @CraftCoder @Bars @serega6531
     
  5. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Как-то так:
    Код:
    def playRay(Location start,Location end) {
       int period = 0.1 ; // период частиц
       Location current = start.clone();
       double distance = start.distance(end);
       int stepCount = distance / period;
       Vector step = new Vector(end.x - start.x, end.y - start.y, end.z - start.z)
       while (stepCount --> 0) {
           playParticleAt(current);
           current.add(step);
       }
    }
    def playParticleAt(Location loc){
        // использовать PlayEffect или любой другой API, или:
        loc.world.playEffect(loc, Effect.COLOURED_DUST, 0);
    }
    //----------
     
  6. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Большое спасибо! Лучше буду без других API делать :)
    А какое время жизни у луча? Какое-то стандартное для частиц определенного типа (возможно для всех)?
     
  7. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Каждая частица отображается по своему. COLOURED_DUST (он же на скрине) показывается около секунды. Другие эффекты обычно дольше.
     
  8. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Благодарность! :)
     
  9. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Если нужно отражение частиц от стен, могу поделиться кодом из DarkRuna2 (groovy).
    UPD: ошибся ссылкой
     
  10. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Ну, с Groovy я вряд ли буду разбираться :)
     
  11. CraftCoder

    CraftCoder Старожил Пользователь

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Ооо, меня уже зовут в темы)))
    Отвечу, сам с партиклами не разбирался, использовал PlayEffect.
     
  12. Plasticable

    Plasticable Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    plasticable
    Имя в Minecraft:
    Plasticable
    Можно использовать апи PlayEffect от @fromgate
     
  13. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Ну, луч у меня вполне получилось сделать, но частицы все какие-то унылые.
    Завтра попробую потыкать PlayEffect, вдруг там хорошие есть :)
     
  14. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Окай, в целом у меня нет задачи сделать прям много эффектов, нужно просто, чтобы игроки в радиусе действия блока были "связаны" с ним лучём :) Приемлимо, что бы он был пульсирующим, как выстрелы от лазера.

    @DPOH-VAR, можешь подсказать, твои башни каким видом эффекта "стреляют"? Не смог найти в списке красную пыль, а COLOURED_DUST как я понял нераскрашиваемая... в идеале я был бы не против сорцов в лс или тут, разобрался бы дальше сам.
     
  15. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Тут тебе 3 варианта:
    1) Формировать и отправлять пакет вручную (код будет жестко зависимым от версии сервера)
    Нужно подключать свой используемый сервер как API, искать в классы пакетов (в nms, в зависимости от версии сервера):
    "{nms}.Packet63WorldParticles",
    "{nms}.PacketPlayOutWorldParticles",
    "{nm}.network.play.server.S2APacketParticles"
    А затем отправлять, примерно так: player.handle.playerConnection.sendPacket(packet)

    2) Используй API от PlayEffect. Ничего сложного

    3) VarScript. Он позволяет работать коду, даже если в import используется другая версия nms. Собственно, мой вариант. Но это груви. И динамически компилируемые скрипты.

    PS: у меня используется COLOURED_DUST. Он же /particle reddust. Если сформировать пакет вручную, можно задать больше параметров. Один из них отвечает за цветность.
     
  16. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    По сути, вот это пакет?: http://wiki.vg/Protocol#Particle
    Сейчас мне кажется, что world.playEffect() посылает http://wiki.vg/Protocol#Effect, вместо того.

    Всё, насчёт reddust понял, возможно хорошим оправданным вариантом в моём случае будет использовать ProtocolLib для формирования своего пакета со всем, что надо.
    Завтра попробую, если что ещё поспрашиваю вас =) спасибки.

    P.S. Нашёл прикольную темку по сабжу: https://www.spigotmc.org/threads/43212/. В ней разжёвывается много технических деталей.

    P.P.S. С цветом всё-таки пока не получилось, даже выставив count в ноль =(

    upload_2015-7-1_2-2-48.png
     
    Последнее редактирование: 17 дек 2015
  17. Freeos

    Freeos Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    freeos
    UP! Я так и не понял, как луч сделать? Я пробовал вот это
    Код:
    public void playRay(Location start, Location end) {
               double period = 0.1;
               Location current = start.clone();
               double distance = start.distance(end);
               double stepCount = distance / period;
               Vector step = new Vector(end.getX() - start.getX(), end.getY() - start.getY(), end.getZ() - start.getZ());
               while (stepCount --> 0) {
                   playParticleAt(current);
                   current.add(step);
               }
            }
       
        public void playParticleAt(Location loc){
            loc.getWorld().playEffect(loc, Effect.COLOURED_DUST, 0);
        }
    Оно "спавнит" партиклы только на локациях start и end.

    И еще. Так как сделать красный партикл?

    @Reality_SC
     
  18. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Красный он сразу, так как партикл — REDDUST (красная пыль). Вроде как цвет менять можно, но у меня сразу не вышло, а дальше я не бился.[DOUBLEPOST=1452329976,1452329843][/DOUBLEPOST]
    Вот мой код, который у меня работает. Там не обращай внимание на distanceMax, я просто рисую лучи от игроков до точки если они недалеко от неё, тебе это не надо.
    P.S. Посмотрел на твой код, у тебя step = расстоянию между start и end, его нужно поделить на число шагов, иначе ты на первых итерациях рисуешь партикл на start и end, и убегаешь дальше в дали.
    Кстати, твой Vector, это org.bukkit.util.Vector, а не встроенный устаревший в java?
     
    Последнее редактирование: 9 янв 2016
  19. Freeos

    Freeos Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    freeos
    Да я использовал org.bukkit.util.Vector. Я тебя не совсем понял про step. Но это не важно. Попробую тем способ, что ты сказал. Спасибо, кстате!
     
  20. Автор темы
    Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    У тебя в коде step = end - start. По логике ты должен прибавить step к start ровно stepCount раз, значит его (step) следовало бы поделить на stepCount.
     

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