- Баллы
- 153
Я знаю, что это все давно уже есть в паблике, да и вытащить это просто, но я собрал некоторый код из разных уголков баккита, и сделал утилиту для партиклов, и Вы можете ей удобно пользоваться в своем плагине, плюс, понять, как это все работает. Все очень просто и понятно (Надеюсь)
Для использования утилиты требуется этот класс - https://bukkit.org/threads/1-8-particleeffect-v1-7.154406/
Утилита:
Пример использования:
Скриншоты (Эффекты по порядку):
Надеюсь, это оказалось для кого-то полезным!
Спасибо за прочтение
Для использования утилиты требуется этот класс - https://bukkit.org/threads/1-8-particleeffect-v1-7.154406/
Утилита:
Java:
public class ShapedParticles {
public enum ShapeType {
HEAD_HEARTS("Необычные Сердца"),
HEAD_MAGIC("Темная Магия"),
HEAD_NOTE("Громкие Ноты"),
SNAKE("Водная Змея"),
RAIN("Облачный Дождь");
private String name;
ShapeType(String name) {
this.name = name;
}
public String getName() { return name; }
}
public static void runEffect(Player p, ShapeType type, int minutes) {
switch(type) {
case HEAD_HEARTS:
runHeart(p, minutes * 20 * 60);
break;
case HEAD_MAGIC:
runMagic(p, minutes * 20 * 60);
break;
case HEAD_NOTE:
runNote(p, minutes * 20 * 60);
break;
case SNAKE:
runSnake(p, minutes * 20 * 60);
break;
case RAIN:
runRain(p, minutes * 20 * 60);
break;
}
p.sendMessage("§7Для вас включен эффект §c" + type.getName() + "§7!");
p.sendMessage("§7Время действия эффекта - §c" + minutes + " " + getMinutes(minutes) + "§7!");
}
public static String getMinutes(int minutes) {
if(minutes >= 11 && minutes <= 19) return "минут";
String last = String.valueOf(minutes);
int lastNumber = Integer.parseInt(last.substring(last.length() - 1, last.length()));
if(lastNumber == 1) return "минута";
if(lastNumber >= 2 && lastNumber <= 4) return "минуты";
return "минут";
}
private static void runHeart(final Player p, final int ticks)
{
final double radialsPerStep = Math.PI / 4;
new BukkitRunnable() {
float step = 0;
int count = 0;
@Override
public void run() {
if(p == null || !p.isOnline()) {
this.cancel();
return;
}
if(count >= ticks) {
p.sendMessage("§7Время действия эффекта §c" + ShapeType.HEAD_HEARTS.getName() + " §7закончено!");
this.cancel();
return;
}
Location newLoc = p.getLocation().add(0, 2, 0).add(Math.cos(radialsPerStep * this.step) * 0.4, 0.0D, Math.sin(radialsPerStep * this.step) * 0.4);
ParticleEffect.HEART.display(newLoc, 0, 0, 0, 0, 1);
step++;
count++;
}
}.runTaskTimer(Core.getPlugin(), 0, 2);
}
private static void runMagic(final Player p, final int ticks)
{
final double radialsPerStep = Math.PI / 4;
new BukkitRunnable() {
float step = 0;
int count = 0;
@Override
public void run() {
if(p == null || !p.isOnline()) {
this.cancel();
return;
}
if(count >= ticks) {
p.sendMessage("§7Время действия эффекта §c" + ShapeType.HEAD_MAGIC.getName() + " §7закончено!");
this.cancel();
return;
}
Location newLoc = p.getLocation().add(0, 2, 0).add(Math.cos(radialsPerStep * this.step) * 0.4, 0.0D, Math.sin(radialsPerStep * this.step) * 0.4);
ParticleEffect.WITCH_MAGIC.display(newLoc, 0, 0, 0, 0, 10);
step++;
count+=2;
}
}.runTaskTimer(Core.getPlugin(), 0, 2);
}
private static void runNote(final Player p, final int ticks)
{
final double radialsPerStep = Math.PI / 4;
new BukkitRunnable() {
float step = 0;
int count = 0;
@Override
public void run() {
if(p == null || !p.isOnline()) {
this.cancel();
return;
}
if(count >= ticks) {
p.sendMessage("§7Время действия эффекта §c" + ShapeType.HEAD_NOTE.getName() + " §7закончено!");
this.cancel();
return;
}
Location newLoc = p.getLocation().add(0, 2, 0).add(Math.cos(radialsPerStep * this.step) * 0.4, 0.0D, Math.sin(radialsPerStep * this.step) * 0.4);
ParticleEffect.NOTE.display(newLoc, 0, 0, 0, 10, 1);
step++;
count+=2;
}
}.runTaskTimer(Core.getPlugin(), 0, 2);
}
private static void runSnake(final Player p, final int ticks) {
new BukkitRunnable() {
float step = 0;
int count = 0;
@Override
public void run() {
if(p == null || !p.isOnline()) {
this.cancel();
return;
}
if(count >= ticks) {
p.sendMessage("§7Время действия эффекта §c" + ShapeType.SNAKE.getName() + " §7закончено!");
this.cancel();
return;
}
Vector vector = new Vector();
Location location = p.getLocation();
for (int i = 0; i < 10; i++) {
step++;
float t = (float) Math.PI / 150 * step;
float r = (float) Math.sin(t) * 1.0F;
float s = (float) (Math.PI * 2) * t;
vector.setX(1.0F * r * Math.cos(s) + 0.0F);
vector.setZ(1.0F * r * Math.sin(s) + 0.0F);
vector.setY(2.0F * 1.0F * Math.cos(t) + 0.8F + 1);
if(i <= 1) {
ParticleEffect.SMOKE.display(location.add(vector), 5, 0.0F, 0.0F, 0.0F, 0.0F, 1);
} else {
ParticleEffect.MAGIC_CRIT.display(location.add(vector), 5, 0.0F, 0.0F, 0.0F, 0.0F, 1);
}
location.subtract(vector);
}
count++;
}
}.runTaskTimer(Core.getPlugin(), 0, 1);
}
private static void runRain(final Player p, final int ticks)
{
final double radialsPerStep = Math.PI / 4;
new BukkitRunnable() {
float step = 0;
int count = 0;
@Override
public void run() {
if(p == null || !p.isOnline()) {
this.cancel();
return;
}
if(count >= ticks) {
p.sendMessage("§7Время действия эффекта §c" + ShapeType.RAIN.getName() + " §7закончено!");
this.cancel();
return;
}
Location newLoc = p.getLocation().add(0, 3, 0).add(Math.cos(radialsPerStep * this.step) * 0.4, 0.0D, Math.sin(radialsPerStep * this.step) * 0.4);
for(int i = 0; i < 10; i++) {
ParticleEffect.EXPLODE.display(newLoc, 0, 0, 0, 0, 1);
}
ParticleEffect.DRIP_WATER.display(newLoc, 0, 0, 0, 0, 1);
step++;
count+=2;
}
}.runTaskTimer(Core.getPlugin(), 0, 2);
}
}
Пример использования:
Java:
Player player = ...;
ShapedParticles.runEffect(player, ShapeType.HEAD_HEARTS, 2); // Аргумент 1 - Какому игроку воспроизвести эффект, Аргумент 2 - Тип партиклов, Аргумент 3 - Время в минутах
Скриншоты (Эффекты по порядку):
Надеюсь, это оказалось для кого-то полезным!
Спасибо за прочтение

Последнее редактирование: