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

Помогите Как можно адекватно построить cuboid из эффектов.

neverlessy

Новичок
Пользователь
Баллы
21
Имя в Minecraft
neverlessy
я пытался, почти получилось. Но уже понимаю, что нарушаю один из принципов джавы - не повторяться :(

PHP:
public void createCuboid(World world, Player player) {
        double fdX  = firstPosition.getX();
        double fdY = firstPosition.getY();
        double fdZ = firstPosition.getZ();
        double sdX = secondPosition.getX();
        double sdY = secondPosition.getY();
        double sdZ = secondPosition.getZ();

        double distanceX = fdX - sdX;
        double distanceY = fdY - sdY;
        double distanceZ = fdZ - sdZ;

        player.sendMessage("§8[§2✔§8] §7Расстояние: §7[§6" + distanceX + "§7, §6" + distanceY + "§7, §6" + distanceZ + "§7]");

        if (distanceX >= 0) {
            for(double i = 0.0; i < distanceX; i+=0.1) {
                //.sendMessage("§6: §c" + fdX + i);
                ParticleBuilder partBuild = new ParticleBuilder(Particle.VILLAGER_HAPPY)
                        .particle(Particle.VILLAGER_HAPPY)
                        .receivers(player)
                        .location(world, fdX - i, fdY, fdZ)
                        .count(5)
                        .spawn();
            }
        } else {
            double dist = distanceX-(distanceX*2);
            for(double i = 0.0; i < dist; i+=0.1) {
                //.sendMessage("§6: §c" + fdX + i);
                ParticleBuilder partBuild = new ParticleBuilder(Particle.VILLAGER_HAPPY)
                        .particle(Particle.VILLAGER_HAPPY)
                        .receivers(player)
                        .location(world, fdX + i, fdY, fdZ)
                        .count(5)
                        .spawn();
            }
        }
        if (distanceY >= 0) {
            for(double i = 0.0; i < distanceY; i+=0.1) {
                //.sendMessage("§6: §c" + fdX + i);
                ParticleBuilder partBuild = new ParticleBuilder(Particle.VILLAGER_HAPPY)
                        .particle(Particle.VILLAGER_HAPPY)
                        .receivers(player)
                        .location(world, fdX, fdY - i, fdZ)
                        .count(5)
                        .spawn();
            }
        } else {
            double dist = distanceY-(distanceY*2);
            for(double i = 0.0; i < dist; i+=0.1) {
                //.sendMessage("§6: §c" + fdX + i);
                ParticleBuilder partBuild = new ParticleBuilder(Particle.VILLAGER_HAPPY)
                        .particle(Particle.VILLAGER_HAPPY)
                        .receivers(player)
                        .location(world, fdX, fdY + i, fdZ)
                        .count(5)
                        .spawn();
            }
        }
        if (distanceZ >= 0) {
            for(double i = 0.0; i < distanceZ; i+=0.1) {
                //.sendMessage("§6: §c" + fdX + i);
                ParticleBuilder partBuild = new ParticleBuilder(Particle.VILLAGER_HAPPY)
                        .particle(Particle.VILLAGER_HAPPY)
                        .receivers(player)
                        .location(world, fdX, fdY, fdZ - i)
                        .count(5)
                        .spawn();
            }
        } else {
            double dist = distanceZ-(distanceZ*2);
            for(double i = 0.0; i < dist; i+=0.1) {
                //.sendMessage("§6: §c" + fdX + i);
                ParticleBuilder partBuild = new ParticleBuilder(Particle.VILLAGER_HAPPY)
                        .particle(Particle.VILLAGER_HAPPY)
                        .receivers(player)
                        .location(world, fdX, fdY, fdZ + i)
                        .count(5)
                        .spawn();
            }
        }
    }

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

За код не бить, и так с телефона делал(
PHP:
import java.util.*;

 class Dcoder {
  
   public static Location firstlocation;
  
   public static Location secondlocation;
    
   public static void main(String args[]) {
     firstlocation = new Location(-2.0, 3.0, 12.0);
     secondlocation = new Location(2.0, -4.0, -7.0);
  
     createCuboid();
   }
  
   public static void createCuboid() {
     if(secondlocation.getX() >= 0.0) {
       for(double i = firstlocation.getX(); i <= secondlocation.getX(); i = i + 0.5) {
         System.out.println(String.format("%.1f, %.1f, %.1f", i, firstlocation.getY(), firstlocation.getZ()));
       }
      
       for(double j = firstlocation.getX(); j <= secondlocation.getX(); j = j + 0.5) {
         System.out.println(String.format("%.1f, %.1f, %.1f", j, secondlocation.getY(), firstlocation.getZ()));
       }
     } else {
      
     }
   }
 }
 
 class Location {
   private double x;
  
   private double y;
  
   private double z;
  
   public Location(double x, double y, double z) {
     this.x = x;
     this.y = y;
     this.z = z;
   }
  
   public Location() {
    
   }
  
   public double getX() {
     return this.x;
   }
  
   public double getY() {
     return this.y;
   }
  
   public double getZ() {
     return this.z;
   }
  
   public void setX(double x) {
     this.x = x;
   }
  
   public void setY(double y) {
     this.y = y;
   }
  
   public void setZ(double z) {
     this.z = z;
   }
  
 }
 
Ну, протестируй свой код для начала. Потому что я так и не понял, в чём заключается твой вопрос, если ты смог самостоятельно написать код.
Если про алгоритм говорить, то я бы создал константу и запихнул в неё список оффсетов координат, чтобы затем этот список спокойно перебирать в цикле, подсчитывать конкретные координаты и спаунить на них частицы. При желании можно будет сделать не только куб, но ещё и шар с пирамидой
 
я хочу сделать выделение как в WE, только из частиц. Пока что адекватно получилось только на один блок. Но чет моя башка не варит как можно соединить углы кубов...
 
upload_2022-10-28_10-31-36.png

сейчас уже получилось чет такое сделать

разными цветами разные точки
 
Но код имхо выглядит мега топорно
upload_2022-10-28_10-32-16.png
 
я хочу сделать выделение как в WE, только из частиц. Пока что адекватно получилось только на один блок. Но чет моя башка не варит как можно соединить углы кубов...
Тогда нужен алгоритм, который будет спаунить частицы не для куба, а для кубоида. Границы кубоида - минимальная точка выделения и максимальная точка выделения. По каждой оси надо будет прибавить единицу, чтобы работало корректно.

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

Но код имхо выглядит мега топорно
Посмотреть вложение 63657
Для такой задачи это норм. Можно визуально чуть лучше сделать, но оно того не стоит
 
Тогда нужен алгоритм, который будет спаунить частицы не для куба, а для кубоида. Границы кубоида - минимальная точка выделения и максимальная точка выделения. По каждой оси надо будет прибавить единицу, чтобы работало корректно.


Для такой задачи это норм. Можно визуально чуть лучше сделать, но оно того не стоит

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


PHP:
        for ( double x = xMin; x <= xMax + 1; x += 0.1 ) {
            particlesNavy.location(world, x, yMin, zMin).spawn();
            particlesNavy.location(world, x, yMax + 1, zMin).spawn();
            particlesNavy.location(world, x, yMin, zMax + 1).spawn();
            particlesNavy.location(world, x, yMax + 1, zMax + 1).spawn();
        }
        for ( double y = yMin; y <= yMax + 1; y += 0.1 ) {
            particlesNavy.location(world, xMin, y, zMin).spawn();
            particlesNavy.location(world, xMax + 1, y, zMin).spawn();
            particlesNavy.location(world, xMin, y, zMax + 1).spawn();
            particlesNavy.location(world, xMax + 1, y, zMax + 1).spawn();
        }
        for ( double z = zMin; z <= zMax + 1; z += 0.1 ) {
            particlesNavy.location(world, xMin, yMin, z).spawn();
            particlesNavy.location(world, xMax + 1, yMin, z).spawn();
            particlesNavy.location(world, xMin, yMax + 1, z).spawn();
            particlesNavy.location(world, xMax + 1, yMax + 1, z).spawn();
        }

PHP:
    private void normalize(int fdX, int fdY, int fdZ, int sdX, int sdY, int sdZ) {
        this.xMin = Math.min(fdX, sdX);
        this.xMax = Math.max(fdX, sdX);
        this.yMin = Math.min(fdY, sdY);
        this.yMax = Math.max(fdY, sdY);
        this.zMin = Math.min(fdZ, sdZ);
        this.zMax = Math.max(fdZ, sdZ);
    }


fdX, fdY, fdZ - Позиция первого блока по трем осям
sdX, sdY, sdZ - Позиция второго блока по трем осям.

PHP:
        ParticleBuilder particlesNavy = new ParticleBuilder(Particle.REDSTONE)
                .particle(Particle.REDSTONE)
                .data(new Particle.DustOptions(Color.NAVY, 0.8f))
                .receivers(player)
                .extra(1.0)
                .offset(0.3,0.5,1.0)
                .count(0);
 
Лайк ТСу за самостоятельность.
 
Назад
Верх