Stockage de valeur et objet dans l'inventaire

sixcrocs

Bucheron
10 Mars 2018
9
0
12
28
Bonsoir,

Je débute sur les plugins (aujourd'hui ). Je me demandais comment faire pour stocker des valeurs, pour qu'elle soit réutilisable d'un fichier a l'autre.
Par exemple je voudrais mettre un paramètre a une valeur de 10, et je me demandais comment faire, si il fallait passer par des scoreboard ou pas.

Et en passant je me demandais si on pouvais vérifier si joueur possède "1 stone" et si il n'a pas écrire un message. (En gros faire en sorte d'exécuter une fonction tout le temps, je sais pas trop... )

J'ai marquer deux exemples simple pour comprendre,

Merci d'avance
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
157
456
247
21
Mìlhüsa
Bonsoir,

Je débute sur les plugins (aujourd'hui ). Je me demandais comment faire pour stocker des valeurs, pour qu'elle soit réutilisable d'un fichier a l'autre.
Cela dépend où veux-tu stocker ta valeur. Est-elle liée à un joueur, une entité, un item, un bloc, ..., ou rien ?
Par contre je n'ai pas compris le fait d'être « réutilisable d'un fichier à l'autre ».

Et en passant je me demandais si on pouvais vérifier si joueur possède "1 stone" et si il n'a pas écrire un message.
Tu dois itérer tous les slots de l'inventaire du joueur jusqu'à ce que tu trouves ton item souhaité.
Pour la deuxième condition, je ne sais pas si tu parles d'avoir écrit un message en particulier (« bonjour ! ») ou si tu veux savoir s'il n'a pas parlé depuis x secondes.

En gros faire en sorte d'exécuter une fonction tout le temps, je sais pas trop...
Tu peux utiliser le Scheduler de Bukkit.

Cordialement,
ShE3py
 

Detobel36

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

@sixcrocs tu as fait des commands block avant de te lancer dans la programmation ?
Si oui, oublies tout ce que tu as appris... cela ne fonctionne pas du tout de la même manière !


Je me demandais comment faire pour stocker des valeurs, pour qu'elle soit réutilisable d'un fichier a l'autre.
Toutes les variables stockent des valeurs... Alors maintenant il faut bien faire la différence entre variable et attribut...
Java:
public class Test {
    private Integer attribut = 5;
    public Integer attributPublic = 10;

    public void methodeDeClass() {
        Integer variable = 3;
        ++variable;
        System.out.println(variable);
    }
}
Les attributs vont exister "tout le temps" ou ton programme s'exécute.
Alors que la variable elle va être "détruite" après l'exécution de la méthode (ici la méthode "methodeDeClass").

Pour récupérer les attributs dans "un autre fichier" (en fait tu veux dire "une autre classes"). Tu as deux solutions.
Soit ton attributs est public et dans ce cas tu peux faire:
Java:
Test testObject = new Test();
testObject.attributPublic; // on récupère 10
Mais c'est une mauvaise pratique...
La deuxième solution est de faire un "getter". Donc de rajouter une méthode dans la class "Test" qui permet de récupérer la valeur de l'attribut:
Java:
public class Test {
    // ...

    public Integer getAttribut() {
        return attribut;
    }
}
Et ensuite tu n'aura qu'a faire:
Java:
testObject.getAttribut()

Il est cependant important de noter que tout ceci est la base de la programmation orienté objet... Si tu ne maitrise pas ça, ça montre que tu n'es pas encore pret à faire des plugins et qu'il vaut mieux continuer à lire des tutoriels et à faire un "simple" programme Java pour t’entraîner.


Cordialement,
Detobel36
 

sixcrocs

Bucheron
10 Mars 2018
9
0
12
28
Salut,

@Detobel36

Merci pour cette réponse, en effet j'ai fais pas mal de commande block avant ça.

Je me doutais qu'il fallait créer un objet pour stocker mes valeur.

J'ai fait mes getter et setter pour toutes mes fonctions ainsi que mon constructeur.

Code:
//Ligne d'initialisation
Parameter mesparams = new Parameter();

//Ligne pour un de mes getters
mesparams.getKnockback();

  • Je me demandais où l'initialiser, dans quel fichier (Main, Listener, ou mes fichiers de command).
  • Et comment je peux effectuer la deuxième commande entre mes packages ou mes classes (étant donner que j'ai modifier mes valeurs.)

Cordialement
sixcrocs
 

ShE3py

Enbogueuse
Support
26 Septembre 2015
4 087
157
456
247
21
Mìlhüsa
Je me demandais où l'initialiser, dans quel fichier (Main, Listener, ou mes fichiers de command).
Le plus simple serait de l'initialiser là où elle est déclarée.

Et comment je peux effectuer la deuxième commande entre mes packages ou mes classes (étant donner que j'ai modifier mes valeurs.)
Tu n'as pas besoin d'instancier une classe pour pouvoir accéder à ses champs s'ils sont static.

Java:
public class Attributes {
   public static int knockback = 4;
   private static float attackRange = 3.1415f;
   
   public static float getAttackRange() {
      return attackRange;
   }
}
Java:
public class Foo {
   public static void main(String[] args) {
      System.out.println(Attributes.knockback);
      System.out.println(Attributes.getAttackRange());
   }
}

Je tiendrais juste à préciser que si tu emploies le mot « fichier » pour parler du code source, préfère le mot « classe » car cela lève l'ambiguïté sur le type de fichier (.java ou .yml [fichier de configuration que ton programme lit] ?).
 

sixcrocs

Bucheron
10 Mars 2018
9
0
12
28
En fait je voulais modifier la valeur avec un setter de mon knockback.

Tu n'as pas besoin d'instancier une classe pour pouvoir accéder à ses champs s'ils sont static.

Du coup je ne veux pas qu'il soit static.

Capture d’écran 2021-02-11 120855.png


Mais si j'exécute une commande de ma classe CommandStart qui fais un give de l'épée avec les paramètre de mon objet .

Je ne peux pas récupérer cette valeur qui a été initialiser dans MonpluginListener.

(MonpluginListener initialise mes paramètres et CommandStart give une épée avec les paramètres)

Je sais pas si c'est beaucoup plus clair ou si je m'y prend de la bonne manière.

Merci d'avance
 

Detobel36

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

Je vais un peu me répéter mais je pense vraiment que tu n'as "pas le niveau" pour te lancer dans le développement d'un plugin.

Ce n'est pas la bonne manière de réfléchir...
Java est un langage orienté objet. Sais-tu ce que ça veut dire et ce que ça implique ? Si la réponse est non, ça confirme ce que je dis ci-dessus.
En effet, Java est un langage OO mais l'API Bukkit/Spigot impose de parfois "contourner" cet orienté objet. Donc comprendre un concept dans une situation ou le dit concept ne peux pas être appliqué à 100% est compliqué.

Pour expliqué l'OO, j'aime bien partir d'un jeu de société. Partont par exemple du Monopoly. Dans un Monopoly on a un plateau de jeu, des pions, des cases (que l'on peut acheter), ... Tout cela se sont des classes. C'est quelque chose de "physique" que l'on peut toucher, représenter, décrire.
Ces objets ont des propriétés. La taille du plateau par exemple, la couleur des pions, ... toutes ces informations sont des "attributs".
Enfin, on peut faire des actions avec ces objets. Les cases peuvent être acheté, misent en hypothèque, les pions peuvent avancer.

Ce qui est difficile avec l'informatique c'est qu'il n'y a pas UNE bonne manière de faire. C'est un peu comme en mathématique. Peut important la démonstration, tant que la situation de base et la situation final sont la même, les formules entre les deux doivent juste être vrai et logiques l'une avec l'autre...

Donc si on reprend la partie de Monopoly, une structure possible serait:
Java:
public class plateau {
    private final ArrayList<Pion> listeDesPionsEnJeu;
    private Integer idJoueurDevantJouer;

    public plateau(ArrayList<Pion> listeDesPions) {
        this.listeDesPionsEnJeu = listeDesPions;
        idJoueurDevantJouer = 0;
    }

    public void lancerLesDes() {
        int resultatDes = new Random()....;
        listeDesPionsEnJeu.get(joueurDevantJouer).avance(resultatDes);
        joueurSuivant();
    }

    private void joueurSuivant() {
        joueurDevantJouer = (joueurDevantJouer+1) % listeDesPionsEnJeu.size();
    }
}

public abstract class Pion { // On imagine que chaque pion est un enfant de cet objet. Par exemple "Avion" serait le pion en forme d'avion...
    protected final Couleur couleur;
    private Integer position;
 
    protected Pion() {
        position = 0;
    }

    public void avance(Integer nombreDeCase) {
        position += nombreDeCase;
    }

}
Tout ceci n'est qu'un exemple et la structure est discutable... Mais ça montre que ce sont des objets qui "discutent" entre eux.

Dans spigot/bukkit, tu ne "peux pas" faire ça a 100%. En effet, l'API défini ce qu'est un "Material", ce qu'est un "Player" ect. Tu ne peux pas les extends et leur ajouter tes propres méthodes.
Par contre, ton projet lui doit suivre l'OO...


Cordialement,
Detobel36
 
  • Wouah
Reactions: EdgarPi