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

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

MrKom3ta

Ньюби
Баллы
1
Имя в Minecraft
_TwX_
Здравствуйте тому кто это читает! Я делаю свой плагин на электронные сигареты и мне нужно
чтобы частицы дыма спавнились там , куда смотрит игрок. Точнее возле его рта . Но
в коде я прописал .getAyeLocation() и в понимании Bukkit AyeLocation это только высота
так вот , можно ли сделать так чтобы частицы спавнились возле рта куда бы не смотрел игрок.
(буду очень рад любой помощи ведь я новичек и все советы для меня важны).
 
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 классе плохо но все же
 
realbebra.png вейп плохо, а насчёт плагина
тебе нужно такое?
 
Здравствуйте тому кто это читает! Я делаю свой плагин на электронные сигареты и мне нужно
чтобы частицы дыма спавнились там , куда смотрит игрок. Точнее возле его рта . Но
в коде я прописал .getAyeLocation() и в понимании Bukkit AyeLocation это только высота
так вот , можно ли сделать так чтобы частицы спавнились возле рта куда бы не смотрел игрок.
(буду очень рад любой помощи ведь я новичек и все советы для меня важны).
eye location - это действительно точка на уровне глаз, но в центре хитбокса (если смотреть сверху).
Если нужно, чтоб игрок видел перед собой частицы - необходимо отодвинуть точку от центра хитбокса на 1.5-2 блока. Таким образом, при вращении игрока должна получиться окружность из частиц.

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

Подставляешь необходимые параметры и получаешь координаты для спауна частицы
 
я просто добавил пару чисел из вектора взгляда игрока в локацию для спавна партикла (eyelocation)
 
eye location - это действительно точка на уровне глаз, но в центре хитбокса (если смотреть сверху).
Если нужно, чтоб игрок видел перед собой частицы - необходимо отодвинуть точку от центра хитбокса на 1.5-2 блока. Таким образом, при вращении игрока должна получиться окружность из частиц.

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

Подставляешь необходимые параметры и получаешь координаты для спауна частицы
То есть чтобы сделать это пишем этот код и пишем .getAyeLocation.add(x , y); ? (извините если вопрос тупой)
 
eye location - это действительно точка на уровне глаз, но в центре хитбокса (если смотреть сверху).
Если нужно, чтоб игрок видел перед собой частицы - необходимо отодвинуть точку от центра хитбокса на 1.5-2 блока. Таким образом, при вращении игрока должна получиться окружность из частиц.

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

Подставляешь необходимые параметры и получаешь координаты для спауна частицы
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);

вот мой код , он не работает ведь вместо того чтобы спавнить частицы оно телепортирует игрока.
 
То есть чтобы сделать это пишем этот код и пишем .getAyeLocation.add(x , y); ? (извините если вопрос тупой)
Ты можешь получить локацию игрока и к ней что-то прибавить. Но потом эту локацию нужно применить для отображения частицы.
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);

вот мой код , он не работает ведь вместо того чтобы спавнить частицы оно телепортирует игрока.
Это не полный код. Я не вижу тут ни телепортации, ни спауна частицы. Но, в любом случае, что мешает заменить телепортацию на отображение частицы?

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

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

Назад
Верх