Войти или зарегистрироваться

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

Reality_SC

Старожил
Пользователь
Баллы
123
Имя в Minecraft
Reality_SC
Делаю свой игровой режим.

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

Не нашёл в гугле картинки более близкой к теме :)
8BNjnVd_31_hjI1xz5Y088VvDaTO-spjjiYrCjMK-g3lkowl0GsPfcR7UxFg3v6PTABYQHeXUReUXi5lHCP3IfkHwM0QBPdv3fhcmsSK0q9666jYuTg


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

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

@DPOH-VAR @MYXOMOPX @fromgate
 
Последнее редактирование:
Берёшь BlockIterator, переделываешь под локации, а не блоки, для большей плотности луча.
 
Как-то сильно кратко, извини =)
Настрогать кучу координат между двумя точками я могу и сам, простым циклом...

Не очень понятно, как их отрендерить? Спавнить на каждой точке какой-то объект? Где-то существуют предопределения видов Particle? Какое у них время жизни? Что делать, если нужно сдвинуть луч? Пересоздать все, или сдвинуть?
Я впервые в этой теме =)
Ткну ещё ребяток :)
@Plasticable @CraftCoder @Bars @serega6531
 
Как-то так:
Код:
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);
}
//----------
 
Большое спасибо! Лучше буду без других API делать :)
А какое время жизни у луча? Какое-то стандартное для частиц определенного типа (возможно для всех)?
 
Большое спасибо! Лучше буду без других API делать :)
А какое время жизни у луча? Какое-то стандартное для частиц определенного типа (возможно для всех)?
Каждая частица отображается по своему. COLOURED_DUST (он же на скрине) показывается около секунды. Другие эффекты обычно дольше.
 
Если нужно отражение частиц от стен, могу поделиться кодом из DarkRuna2 (groovy).
UPD: ошибся ссылкой
 
Ну, с Groovy я вряд ли буду разбираться :)
 
Ооо, меня уже зовут в темы)))
Отвечу, сам с партиклами не разбирался, использовал PlayEffect.
 
Ну, луч у меня вполне получилось сделать, но частицы все какие-то унылые.
Завтра попробую потыкать PlayEffect, вдруг там хорошие есть :)
 
@Reality_SC
У меня отрисовка поблочная. Линии красивой не нарисовать. Всё руки не доходят сделать более красивое рисование линий.

Выстрелы в лазерах у @DPOH-VAR гораздо симпатичнее
 
Окай, в целом у меня нет задачи сделать прям много эффектов, нужно просто, чтобы игроки в радиусе действия блока были "связаны" с ним лучём :) Приемлимо, что бы он был пульсирующим, как выстрелы от лазера.

@DPOH-VAR, можешь подсказать, твои башни каким видом эффекта "стреляют"? Не смог найти в списке красную пыль, а COLOURED_DUST как я понял нераскрашиваемая... в идеале я был бы не против сорцов в лс или тут, разобрался бы дальше сам.
 
@DPOH-VAR, можешь подсказать, твои башни каким видом эффекта "стреляют"? Не смог найти в списке красную пыль, а COLOURED_DUST как я понял нераскрашиваемая... в идеале я был бы не против сорцов в лс или тут, разобрался бы дальше сам.
Тут тебе 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. Если сформировать пакет вручную, можно задать больше параметров. Один из них отвечает за цветность.
 
Формировать и отправлять пакет вручную
По сути, вот это пакет?: 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
 
Последнее редактирование:
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
 
И еще. Так как сделать красный партикл?
Красный он сразу, так как партикл — REDDUST (красная пыль). Вроде как цвет менять можно, но у меня сразу не вышло, а дальше я не бился.
Я пробовал вот это ... оно спавнит партиклы только на локациях start и end.
Вот мой код, который у меня работает. Там не обращай внимание на distanceMax, я просто рисую лучи от игроков до точки если они недалеко от неё, тебе это не надо.
P.S. Посмотрел на твой код, у тебя step = расстоянию между start и end, его нужно поделить на число шагов, иначе ты на первых итерациях рисуешь партикл на start и end, и убегаешь дальше в дали.
Кстати, твой Vector, это org.bukkit.util.Vector, а не встроенный устаревший в java?
 
Последнее редактирование:
Красный он сразу, так как партикл — REDDUST (красная пыль). Вроде как цвет менять можно, но у меня сразу не вышло, а дальше я не бился.

Вот мой код, который у меня работает. Там не обращай внимание на distanceMax, я просто рисую лучи от игроков до точки если они недалеко от неё, тебе это не надо.
P.S. Посмотрел на твой код, у тебя step = расстоянию между start и end, его нужно поделить на число шагов, иначе ты на первых итерациях рисуешь партикл на start и end, и убегаешь дальше в дали.
Кстати, твой Vector, это org.bukkit.util.Vector, а не встроенный устаревший в java?

Да я использовал org.bukkit.util.Vector. Я тебя не совсем понял про step. Но это не важно. Попробую тем способ, что ты сказал. Спасибо, кстате!
 
Назад
Верх