Création de plugin

vathib

Massacreur de Mouton
24 Novembre 2018
34
0
22
20
Bonjour,

Je suis débutant en Java, et je commence à crée des plugin minecraft, pour me familiarisé avec tout ça, je crée actuellement un plugin d'armes, actuellement l'arme tire des boules de neige, ce que n'est pas très pratique (Elles sont très visible), j'aimerais donc tiré des pig, transparent. Mais je me demandais comment faire, pour quand le cochon touche un joueur, celui si prend des dégâts, avec les boules de neiges je fessait comme ça :

Java:
public void onDamage(EntityDamageByEntityEvent e) {
    if (e.getDamager() instanceof Chicken) {
        Chicken ch = (Chicken) e.getDamager();

        if (ch.getShooter() instanceof Player) {
            Player shooter = (Player) ch.getShooter();

            if (shooter.getItemInHand().getType() == Material.DIAMOND_HOE) {
                e.setDamage(100);
            }
        }
    }
}

Mais avec les pig je sais pas comment faire, j'ai pensé à faire, que dès que le cochon passe à moin de 1 block d'un joueurs, il prennent des dégâts, mais comment aire et dans quel évents ?

Et aussi le cochon n'est pas transparent:

Java:
new BukkitRunnable() {
    @Override
    public void run() {
        ((CraftEntity)c).getHandle().setInvisible(true);
    }
};

Merci d'avance pour vos réponses, et bon confinement ;)
 
Dernière édition par un modérateur:
Salut,

Je pense que ça va être assez compliqué avec des cochons...
Bon, avant de te donner ma réponse/solution, voici quelques conseils. Sur le forum, utilise des balises "code" pour mettre ton code. Ce sera beaucoup plus lisible pour tout le monde. Si tu ne sais pas comment mettre une balise code, j'en parle ici: https://minecraft.fr/forum/threads/trucs-pour-résoudre-un-problème.77248/ A noter également que la section "plugins" est réservée à la recherche, la suggestion et la présentation de plugin. Tu aurais mieux fait de poster dans la section "support" (je signale à un modérateur qui déplacera surement ton message ;) ).

Concernant ton problème, je partirais plus sur un système comme hypixel dans le quake. Je ne sais pas si tu vois de quoi je veux parler mais l'idée est d'utiliser seulement les coordonnées et de calcules "à la main" si le joueur à bien tiré sur un autre joueur.
Pour cela, tu prend la direction dans lequel regarde le joueur:
Java:
Vector vecteur = player.getEyeHeight().getDirection();
vecteur = vecteur.normalize();
// On a donc le vecteur où le joueur regarde
vecteur.multiply(0.5);  // On ne prend qu'un demis block pour être sur de ne rien loupé
//  (c'est purement arbitraire de ma part)

// Je repars de la localisation du joueur et je met la direction à zéro
Location eyeLoc = player.getEyeLocation();
eyeLoc.setDirection(new org.bukkit.util.Vector(0, 0, 0));

// On va parcourir tous les blocks que le joueur peut voir (et on va mettre une limite de 
// porté de 200 demi-blocks (ça me parait déjà bien))
for(int i = 0; i < 200; ++i) {
    // On va calculer la nouvelle location
    Location loc = eyeLoc.add(vecteur);  // On ajoute notre vecteur

    // On vérifie que l'on ne touche pas un block
    if(loc.getBlock().getType().isSolid()) {
        break; // on arrête la boucle
    } else {
        // On récupère toutes les entités ce trouvant à la nouvelle position
        Collection<Entity> entity = loc.getWorld().getNearbyEntities(loc, 0, 0, 0);
        if(!entity.isEmpty()) { // Si il y a bien quelqu'un
            // la variable entity contient l'entitée qu'on vient de toucher.  
            // Tu lui met des dégâts, tu joues un son ect, tu fais ce que tu veux quoi ;)
        }
    }

}

Je n'ai pas testé le code... Il est possible qu'il ne marche pas. Pour le débug, je t'invite à faire spawn des particules pour vraiment comprendre où va ton vecteur ;)


Cordialement,
Detobel36
 
  • J'aime
Reactions: Fuzois21
Salut,

Déjà merci beaucoup, ton code fonctionne, mais il y'a encore quelques petits problème.

J'ai ajouter un broadcast, dès que le joueur est touché, pour savoir si ça fonctionne, et ça marche !
Sauf que des fois, le joueur est touché 2 fois, alors que je click que une seul fois.
J'ai aussi essayer d'ajouter des effet de particule sur le vector, mais je n'est rien trouver de fonctionnelle sur internet, si tu pourrait m'aider.


Java:
                    if(cooldowns.containsKey(p.getName())){

                        int seconds = 200;
                        long timeleft = ((cooldowns.get(p.getName())) + seconds) - (System.currentTimeMillis());
                        if(timeleft > 0){
                            e.setCancelled(true);
                            return;
                        }

                        chargeurAk.put(p.getUniqueId(), chargeurAk.get(p.getUniqueId()) - 1);
                        p.setLevel(chargeurAk.get(p.getUniqueId()));

                        World world = Bukkit.getWorld("world");

                        Vector vecteur = p.getEyeLocation().getDirection();
                        vecteur = vecteur.normalize();
                        // On a donc le vecteur où le joueur regarde
                        vecteur.multiply(0.5);  // On ne prend qu'un demis block pour être sur de ne rien loupé
                        //  (c'est purement arbitraire de ma part)

                        // Je repars de la localisation du joueur et je met la direction à zéro
                        Location eyeLoc = p.getEyeLocation();
                        eyeLoc.setDirection(new org.bukkit.util.Vector(0, 0, 0));

                        // On va parcourir tous les blocks que le joueur peut voir (et on va mettre une limite de
                        // porté de 200 demi-blocks (ça me parait déjà bien))
                        for(int i = 0; i < 200; ++i) {
                            // On va calculer la nouvelle location
                            Location loc = eyeLoc.add(vecteur);  // On ajoute notre vecteur

                            // On vérifie que l'on ne touche pas un block
                            if(loc.getBlock().getType().isSolid()) {
                                break; // on arrête la boucle
                            } else {
                                // On récupère toutes les entités ce trouvant à la nouvelle position
                                Collection<Entity> entity = loc.getWorld().getNearbyEntities(loc, 0, 0, 0);
                                if(!entity.isEmpty()) { // Si il y a bien quelqu'un
                                    // la variable entity contient l'entitée qu'on vient de toucher.
                                    // Tu lui met des dégâts, tu joues un son ect, tu fais ce que tu veux quoi ;)
                                    Bukkit.broadcastMessage("Touché !");
                                }
                            }

                        }

                    }

Voila la partie de mon code la plus importante, j’espère que tu pourras m'aider.


Bon confinement et bonne journée ;)
 
Salut,

Sauf que des fois, le joueur est touché 2 fois, alors que je click que une seul fois.
Est-ce que tu n'as pas déclaré ton listener 2 fois ?
Met un message de débug tout au début, tu verra bien si c'est un problème dans la boucle ou dans l'event.

Pour les particules je t'avoues que je suis habitué à utilisé une API créé pour notre serveur :/ J'ai cependant trouvé ce tutoriel qui pourra surement t'aider: https://www.spigotmc.org/threads/comprehensive-particle-spawning-guide-1-13.343001/


Cordialement,
Detobel36
 
Salut,

Enfaîte plus rien ne marche, j'ai ajouter un [B]if (entity instanceof LivingEntity) {[/B], et ça ne marche plus, je pense que avant ça touchait des entity non vivante, et du coup y'avait le messsage.

C'est peut être du au fait que j'ai modifier Vector vecteur = player.getEyeHeight().getDirection(); par Vector vecteur = p.getEyeLocation().getDirection();, le getDirection() sur getEyeHeight ne marchait pas, sa mettait une erreur, voila du coup je sais pas trop quoi faire, si tu as d'autres idée.


Merci d'avance et bon confinement ;)

Code:
[16:53:57 ERROR]: Could not pass event PlayerInteractEvent to armes v1.0.0
org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.craftbukkit.v1_8_R3.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:228) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.craftbukkit.v1_8_R3.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:195) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.BlockSoil.fallOn(BlockSoil.java:67) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.Entity.a(Entity.java:811) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.EntityLiving.a(EntityLiving.java:160) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.EntityPlayer.a(EntityPlayer.java:621) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:456) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInFlying.a(SourceFile:126) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInFlying$PacketPlayInPositionLook.a(SourceFile:18) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_232]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_232]
        at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_232]
Caused by: java.lang.NullPointerException
        at fr.vathib.gun.events.Weapon.onInteract(Weapon.java:38) ~[?:?]
        at sun.reflect.GeneratedMethodAccessor13.invoke(Unknown Source) ~[?:?]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_232]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_232]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
        ... 21 more

PS: erreur dans la console
 
Dernière édition par un modérateur:
Salut,

Code:
Caused by: java.lang.NullPointerException
        at fr.vathib.gun.events.Weapon.onInteract(Weapon.java:38) ~[?:?]
Qu'est-ce qu'il y a ligne 38 ? Tu pourrais nous montrer ton code ?


Cordialement,
Detobel36
 
Salut,

Voila mon code:


Code:
package fr.vathib.gun.events;

import com.sun.xml.internal.bind.v2.schemagen.xmlschema.Particle;
import fr.vathib.gun.Main;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftEntity;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;

import javax.management.Attribute;
import java.util.*;


public class Weapon implements Listener {
    public Map<String, Long> cooldowns = new HashMap<>();
    public Map<UUID, Integer> chargeurAk = new HashMap<java.util.UUID, Integer>();
    public Map<UUID, Chicken> ammo = new HashMap<java.util.UUID, Chicken>();

    public Weapon(Main main) {}


    @EventHandler
    public void onInteract(PlayerInteractEvent e) {
        Player p = e.getPlayer();

        //AK
        if (e.getItem().getType() == Material.DIAMOND_HOE) {
            if (e.getAction() == Action.RIGHT_CLICK_AIR) {

                if (chargeurAk.get(p.getUniqueId()) > 0) {
                    if(chargeurAk.get(p.getUniqueId()) == 0){
                        p.sendMessage("Votre chargeur est vide (Click gauche pour recharger)");
                        e.setCancelled(true);
                        return;
                    }

                    if(cooldowns.containsKey(p.getName())){

                        int seconds = 200;
                        long timeleft = ((cooldowns.get(p.getName())) + seconds) - (System.currentTimeMillis());
                        if(timeleft > 0){
                            e.setCancelled(true);
                            return;
                        }

                        chargeurAk.put(p.getUniqueId(), chargeurAk.get(p.getUniqueId()) - 1);
                        p.setLevel(chargeurAk.get(p.getUniqueId()));

                        World world = Bukkit.getWorld("world");

                        Vector vecteur = p.getEyeLocation().getDirection();
                        vecteur = vecteur.normalize();
                        // On a donc le vecteur où le joueur regarde
                        vecteur.multiply(0.5);  // On ne prend qu'un demis block pour être sur de ne rien loupé
                        //  (c'est purement arbitraire de ma part)

                        // Je repars de la localisation du joueur et je met la direction à zéro
                        Location eyeLoc = p.getEyeLocation();
                        eyeLoc.setDirection(new org.bukkit.util.Vector(0, 0, 0));

                        // On va parcourir tous les blocks que le joueur peut voir (et on va mettre une limite de
                        // porté de 200 demi-blocks (ça me parait déjà bien))
                        for(int i = 0; i < 200; ++i) {
                            // On va calculer la nouvelle location
                            Location loc = eyeLoc.add(vecteur);  // On ajoute notre vecteur

                            // On vérifie que l'on ne touche pas un block
                            if(loc.getBlock().getType().isSolid()) {
                                break; // on arrête la boucle
                            } else {
                                // On récupère toutes les entités ce trouvant à la nouvelle position
                                Collection<Entity> entity = loc.getWorld().getNearbyEntities(loc, 0, 0, 0);
                                if(!entity.isEmpty()) { // Si il y a bien quelqu'un
                                    // la variable entity contient l'entitée qu'on vient de toucher.
                                    // Tu lui met des dégâts, tu joues un son ect, tu fais ce que tu veux quoi ;)
                                    if (entity instanceof Player) {
                                        Bukkit.broadcastMessage("Touché !");
                                    }
                                }
                            }

                        }

                    }

                    cooldowns.put(p.getName(), System.currentTimeMillis());
                }

            }

            if(e.getAction() == Action.LEFT_CLICK_AIR){
                if(p.getInventory().contains(Material.DIAMOND)){
                    if(p.getInventory().contains(Material.DIAMOND, 30 - chargeurAk.get(p.getUniqueId()))){
                        p.getInventory().removeItem(new ItemStack(Material.DIAMOND, 30 - chargeurAk.get(p.getUniqueId())));
                        chargeurAk.put(p.getUniqueId(), 30);
                    }else{
                        int nbDiamonds = Arrays.asList(p.getInventory().getContents()).stream().filter(i -> i != null).filter(item -> item.getType() == Material.DIAMOND).mapToInt(item -> item.getAmount()).findAny().getAsInt();
                        p.getInventory().removeItem(new ItemStack(Material.DIAMOND, nbDiamonds));
                        chargeurAk.put(p.getUniqueId(), chargeurAk.get(p.getUniqueId()) + nbDiamonds);
                        p.setLevel(chargeurAk.get(p.getUniqueId()));
                    }
                }else{
                    p.sendMessage("Tu n'as plus de munitions dans ton inventaire !");
                }
            }

        }

    }

    @EventHandler
    public void onChangeGun(PlayerItemHeldEvent e){

        Player p = e.getPlayer();
        int slot = e.getNewSlot();

        ItemStack item = p.getInventory().getItem(e.getNewSlot());
        boolean isAk = (item != null && item.getType() == Material.DIAMOND_HOE);
        boolean hand = (item == null);

        if(isAk == true){

            if(!chargeurAk.containsKey(p.getUniqueId())){
                chargeurAk.put(p.getUniqueId(), 30);
            }

            p.setLevel(chargeurAk.get(p.getUniqueId()));

        }
        if(hand == true){
            p.setLevel(0);
        }



        }

    }
J’espère que vous pourrez m'aider,bon confinement ;)
 
Salut,

L'erreur vient d'ici:
Java:
if (e.getItem().getType() == Material.DIAMOND_HOE) {
Le e.getItem() peut être vide....
Java:
if (e.getItem() != null && e.getItem().getType() == Material.DIAMOND_HOE) {

Pour être sûr que tu n'a déclaré le listener qu'une fois, change le constructeur:
Java:
public Weapon(Main main) {
    main.getLogger().info("Listener enregistre");
}


Cordialement,
Detobel36
 
Salut,


Il n'y a plus d'erreur c'est bon, mais quand je tire sur une entity, quel sois player ou non, rien ne se passe.

Pourtant aucune erreur, je pense que le vector ne part pas au bonne endroit, mais comment le vérifier ?
Je n'est pas réussi à mettre d'effets de particules avec les liens que tu m'as donné

J’espère que tu pourra m'aider et bon confinement ;)

Ah, je n'es rien dit nouvelle erreur:


Code:
[18:02:03 ERROR]: Could not pass event PlayerInteractEvent to armes v1.0.0
org.bukkit.event.EventException
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:310) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:62) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.fireEvent(SimplePluginManager.java:502) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:487) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.craftbukkit.v1_8_R3.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:228) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.craftbukkit.v1_8_R3.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:195) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at org.bukkit.craftbukkit.v1_8_R3.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:191) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:717) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInBlockPlace.a(PacketPlayInBlockPlace.java:52) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PacketPlayInBlockPlace.a(PacketPlayInBlockPlace.java:1) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_232]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_232]
        at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [spigot.jar:git-Spigot-db6de12-18fbb24]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_232]
Caused by: java.lang.NullPointerException
        at fr.vathib.gun.events.Weapon.onInteract(Weapon.java:37) ~[?:?]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_232]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_232]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_232]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_232]
        at org.bukkit.plugin.java.JavaPluginLoader$1.execute(JavaPluginLoader.java:306) ~[spigot.jar:git-Spigot-db6de12-18fbb24]
        ... 18 more
 
Dernière édition par un modérateur:
Salut,

Pourtant aucune erreur, je pense que le vector ne part pas au bonne endroit, mais comment le vérifier ?
Dans le pire des cas, pose des blocks au Location que tu parcours ;)

Code:
Caused by: java.lang.NullPointerException 
at fr.vathib.gun.events.Weapon.onInteract(Weapon.java:37) ~[?:?]
L'erreur vient d'une variable qui serait vide à la ligne 37 de ta class "Weapon".


Cordialement,
Detobel36