Plugin Résolu [JAVA] Système de particules faciles

Kenda

Architecte en herbe
16 Juillet 2016
292
1
2
125
32
www.youtube.com
Bonjour/Bonsoir à tous,

Actuellement en développement de gadgets (notamment un fly), j'aimerai reprendre le système de particules à la style Funcraft (surtout les particules de fly).
J'aimerai donc savoir comment je pourrais faire, de façon optimal (donc surement avec une boucle) afin d'affiché un petit nuage en dessous du joueur quand il fly.

J'ai déjà ma location de particule de faite :

Java:
private void spawnParticules(Player player){
        double x = player.getLocation().getX();
        double y = player.getLocation().getY();
        double z = player.getLocation().getZ();

        Bukkit.getWorld("world").spawnParticle(Particle.CLOUD, new Location(player.getWorld(),x, y - 1, z), 10);
        Bukkit.getWorld("world").spawnParticle(Particle.CLOUD, new Location(player.getWorld(),x+1, y - 1, z), 10);
        Bukkit.getWorld("world").spawnParticle(Particle.CLOUD, new Location(player.getWorld(),x+1, y - 1, z+1), 10);
        Bukkit.getWorld("world").spawnParticle(Particle.CLOUD, new Location(player.getWorld(),x, y - 1, z+1), 10);
        Bukkit.getWorld("world").spawnParticle(Particle.CLOUD, new Location(player.getWorld(),x-1, y - 1, z+1), 10);
        Bukkit.getWorld("world").spawnParticle(Particle.CLOUD, new Location(player.getWorld(),x-1, y - 1, z), 10);
        Bukkit.getWorld("world").spawnParticle(Particle.CLOUD, new Location(player.getWorld(),x-1, y - 1, z-1), 10);
        Bukkit.getWorld("world").spawnParticle(Particle.CLOUD, new Location(player.getWorld(),x, y - 1, z-1), 10);
        Bukkit.getWorld("world").spawnParticle(Particle.CLOUD, new Location(player.getWorld(),x+1, y - 1, z-1), 10);
    }

Un peu d'aide pour m'aiguié ?

Merci :)
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 129
162
461
247
21
Mìlhüsa
Bonsoir,

Et du coup qu'est-ce qu'il te manque ?
Je ne connais pas le système de particules de Funcraft donc je ne sais pas si ta fonction n'a pas le style souhaité, ou si c'est la boucle/savoir quand est-ce que le jouer vole/optimiser le tout qui te pose problème.

Cordialement,
ShE3py
 

Kenda

Architecte en herbe
16 Juillet 2016
292
1
2
125
32
www.youtube.com
Bonsoir,

Et du coup qu'est-ce qu'il te manque ?
Je ne connais pas le système de particules de Funcraft donc je ne sais pas si ta fonction n'a pas le style souhaité, ou si c'est la boucle/savoir quand est-ce que le jouer vole/optimiser le tout qui te pose problème.

Cordialement,
ShE3py

J'aimerai savoir comment je pourrai faire un "cercle" ou un "carré" de particules qui se répète à l'infinie, tant que le joueur est en vol.
Est-ce qu'une tâche, en runTaskTimer, répétitive pourrait faire l'affaire, ou alors un moyen plus opti ?

Ensuite pour tout ce qui est particules, pour les coordonnés/position etc.. Aurait-il un moyen de visualisé sans a chaque fois build le plugin ? (Après niveau particules, j'ai jamais trop touché à ça, donc désolé si sa peut paraître bête).

Merci
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 129
162
461
247
21
Mìlhüsa
J'aimerai savoir comment je pourrai faire un "cercle" ou un "carré" de particules qui se répète à l'infinie, tant que le joueur est en vol.
Un cercle 2D ou une particule qui suit une trajectoire circulaire ?

Est-ce qu'une tâche, en runTaskTimer, répétitive pourrait faire l'affaire, ou alors un moyen plus opti ?
C'est une boucle infinie donc oui il faut passer par le scheduler de Bukkit, après niveau optimisation c'est à voir de comment tu implémentes le système « non-optimisé ».

Ensuite pour tout ce qui est particules, pour les coordonnés/position etc.. Aurait-il un moyen de visualisé sans a chaque fois build le plugin ? (Après niveau particules, j'ai jamais trop touché à ça, donc désolé si sa peut paraître bête).
Les paramètres sont à peu près équivalents à ceux de la commande /particles, et il s'agit du moyen le plus efficace en testant sur soit ; tu as juste à recopier les valeurs dans le code ensuite.
 

Kenda

Architecte en herbe
16 Juillet 2016
292
1
2
125
32
www.youtube.com
Un cercle 2D ou une particule qui suit une trajectoire circulaire ?
Oui un cercle 2D sous les pieds du joueur.

C'est une boucle infinie donc oui il faut passer par le scheduler de Bukkit, après niveau optimisation c'est à voir de comment tu implémentes le système « non-optimisé ».
J'avais pensé à un système comme ceci :
Java:
public class FlyingParticles extends BukkitRunnable implements Runnable {

    private int timer = 10;
    @Override
    public void run() {


        if(timer == 1){
           timer = 10;
        }
        timer--;
    }
}

Les paramètres sont à peu près équivalents à ceux de la commande /particles, et il s'agit du moyen le plus efficace en testant sur soit ; tu as juste à recopier les valeurs dans le code ensuite.
Mouai justement, j'ai jamais compris le système de particules, même en vanilla ducoup j'suis vachement aider :)
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 129
162
461
247
21
Mìlhüsa
Oui un cercle 2D sous les pieds du joueur.
J'ai écrit un code un peu avancé alors n'hésite pas à me dire si t'as une partie que tu ne comprends pas bien histoire que je la réécrive autrement.
Java:
public class ParticleEngine implements Runnable {
   // le rayon du cercle (en cubes/mètres)
   private static final double CIRCLE_RADIUS = 2;
   
   // le nombre de points du cercle
   private static final double CIRCLE_POINTS = 8;
   
   // la distance (en radians) entre deux points
   private static final double CIRCLE_POINT_STEP = (2 * Math.PI) / CIRCLE_POINTS;
   
   // la liste des joueurs avec des particles à afficher
   private final List<WeakReference<Player>> players = new ArrayList<>();
   
   @Override
   public void run() {
      getPlayers().filter(Player::isFlying).forEach(player -> {
         Location location = player.getLocation();
         World world = location.getWorld();
         
         for(double alpha = 0; alpha <= (2 * Math.PI); alpha += CIRCLE_POINT_STEP) {
            double x = (CIRCLE_RADIUS * Math.cos(alpha)) + location.getX();
            double z = (CIRCLE_RADIUS * Math.sin(alpha)) + location.getZ();
            double y = location.getY();
            
            //noinspection ConstantConditions
            world.spawnParticle(Particle.CLOUD, x, y, z, 1);
         }
      });
   }
   
   public void addPlayer(Player player) {
      players.add(new WeakReference<>(player));
   }
   
   public void removePlayer(Player player) {
      removePlayer(player.getUniqueId());
   }
   
   public void removePlayer(UUID uuid) {
      players.removeIf(ref -> {
         Player player = ref.get();
         
         return player == null || !player.getUniqueId().equals(uuid);
      });
   }
   
   public Stream<Player> getPlayers() {
      return players.stream().map(WeakReference::get).filter(Objects::nonNull);
   }
   
   public boolean hasPlayer(Player player) {
      return getPlayers().anyMatch(p -> p == player);
   }
   
   public boolean hasPlayer(UUID uuid) {
      return getPlayers().anyMatch(p -> p.getUniqueId().equals(uuid));
   }
}
Il faut juste que tu schedules la méthode run() pour être appelée au taux que tu veux, et te rajouter dans la liste des joueurs pour qu'il te créer des particules au niveau de tes pieds.

Mouai justement, j'ai jamais compris le système de particules, même en vanilla ducoup j'suis vachement aider :)
Bah faut essayer de le comprendre :3
 
  • J'aime
Reactions: Niz

Niz

l | l | l | l | l
18 Août 2013
1 064
1
639
267
J'ai écrit un code un peu avancé alors n'hésite pas à me dire si t'as une partie que tu ne comprends pas bien histoire que je la réécrive autrement.
Java:
public class ParticleEngine implements Runnable {
   // le rayon du cercle (en cubes/mètres)
   private static final double CIRCLE_RADIUS = 2;
  
   // le nombre de points du cercle
   private static final double CIRCLE_POINTS = 8;
  
   // la distance (en radians) entre deux points
   private static final double CIRCLE_POINT_STEP = (2 * Math.PI) / CIRCLE_POINTS;
  
   // la liste des joueurs avec des particles à afficher
   private final List<WeakReference<Player>> players = new ArrayList<>();
  
   @Override
   public void run() {
      getPlayers().filter(Player::isFlying).forEach(player -> {
         Location location = player.getLocation();
         World world = location.getWorld();
        
         for(double alpha = 0; alpha <= (2 * Math.PI); alpha += CIRCLE_POINT_STEP) {
            double x = (CIRCLE_RADIUS * Math.cos(alpha)) + location.getX();
            double z = (CIRCLE_RADIUS * Math.sin(alpha)) + location.getZ();
            double y = location.getY();
           
            //noinspection ConstantConditions
            world.spawnParticle(Particle.CLOUD, x, y, z, 1);
         }
      });
   }
  
   public void addPlayer(Player player) {
      players.add(new WeakReference<>(player));
   }
  
   public void removePlayer(Player player) {
      removePlayer(player.getUniqueId());
   }
  
   public void removePlayer(UUID uuid) {
      players.removeIf(ref -> {
         Player player = ref.get();
        
         return player == null || !player.getUniqueId().equals(uuid);
      });
   }
  
   public Stream<Player> getPlayers() {
      return players.stream().map(WeakReference::get).filter(Objects::nonNull);
   }
  
   public boolean hasPlayer(Player player) {
      return getPlayers().anyMatch(p -> p == player);
   }
  
   public boolean hasPlayer(UUID uuid) {
      return getPlayers().anyMatch(p -> p.getUniqueId().equals(uuid));
   }
}
Il faut juste que tu schedules la méthode run() pour être appelée au taux que tu veux, et te rajouter dans la liste des joueurs pour qu'il te créer des particules au niveau de tes pieds.


Bah faut essayer de le comprendre :3
Yo !
J'ai une petite question à propos de ton code :x
Pourquoi as-tu mis tes constantes en statique ?

Merci de ton temps.
 

Detobel36

Créateur de plugins (PhoenixRebirth)
Support
17 Août 2012
10 531
24
2 247
347
27
Bruxelles - Belgique
www.phoenix-rebirth.fr
Salut,

Pourquoi as-tu mis tes constantes en statique ?
Les variables static sont partagées par toutes les classes du même type. Cela signifie que la valeur stocké dans la variable ne sera mémorisée qu'une fois en mémoire.

Si tu ne met pas de static, toute les classes de ce type vont "enregistrer" la valeur.
Donc si tu défini 3 miles fois la class: ParticleEngine, tu aura 3 miles fois les valeurs en mémoire (si tu ne met pas de static).

Alors qu'avec un static, tu n'aura qu'une fois la valeur.


Cordialement,
Detobel36
 
  • J'aime
Reactions: Niz

Kenda

Architecte en herbe
16 Juillet 2016
292
1
2
125
32
www.youtube.com
J'ai écrit un code un peu avancé alors n'hésite pas à me dire si t'as une partie que tu ne comprends pas bien histoire que je la réécrive autrement.
Java:
public class ParticleEngine implements Runnable {
   // le rayon du cercle (en cubes/mètres)
   private static final double CIRCLE_RADIUS = 2;
  
   // le nombre de points du cercle
   private static final double CIRCLE_POINTS = 8;
  
   // la distance (en radians) entre deux points
   private static final double CIRCLE_POINT_STEP = (2 * Math.PI) / CIRCLE_POINTS;
  
   // la liste des joueurs avec des particles à afficher
   private final List<WeakReference<Player>> players = new ArrayList<>();
  
   @Override
   public void run() {
      getPlayers().filter(Player::isFlying).forEach(player -> {
         Location location = player.getLocation();
         World world = location.getWorld();
        
         for(double alpha = 0; alpha <= (2 * Math.PI); alpha += CIRCLE_POINT_STEP) {
            double x = (CIRCLE_RADIUS * Math.cos(alpha)) + location.getX();
            double z = (CIRCLE_RADIUS * Math.sin(alpha)) + location.getZ();
            double y = location.getY();
           
            //noinspection ConstantConditions
            world.spawnParticle(Particle.CLOUD, x, y, z, 1);
         }
      });
   }
  
   public void addPlayer(Player player) {
      players.add(new WeakReference<>(player));
   }
  
   public void removePlayer(Player player) {
      removePlayer(player.getUniqueId());
   }
  
   public void removePlayer(UUID uuid) {
      players.removeIf(ref -> {
         Player player = ref.get();
        
         return player == null || !player.getUniqueId().equals(uuid);
      });
   }
  
   public Stream<Player> getPlayers() {
      return players.stream().map(WeakReference::get).filter(Objects::nonNull);
   }
  
   public boolean hasPlayer(Player player) {
      return getPlayers().anyMatch(p -> p == player);
   }
  
   public boolean hasPlayer(UUID uuid) {
      return getPlayers().anyMatch(p -> p.getUniqueId().equals(uuid));
   }
}
Il faut juste que tu schedules la méthode run() pour être appelée au taux que tu veux, et te rajouter dans la liste des joueurs pour qu'il te créer des particules au niveau de tes pieds.


Bah faut essayer de le comprendre :3
Bonjour,

Merci pour ce code, je le testerai un de ces quatres quand j'aurais un petit peu plus de temps pour dev mon lobby. Après tout, les particules c'est purement gadgets et pour le moment je prefère laisser sa de coté avant de m'embarqué dans un travail trop dur alors que le reste est plus important.

Merci beaucoup, je garde sa sous la main :)