Aller au contenu
Nashoba

Tuto Addon #4 - Créer une expression

Messages recommandés

Sommaire:

  1. Base de l'addon
  2. Créer un effet
  3. Créer une condition
  4. Créer une expression
  5. Créer un évent
  6. Créer un type

---------------------------

 

Avant de continuer, assurez-vous d'avoir suivi les précédents tutoriaux ou vous pourrez être perdus.

 

Créer une expression

 

Cette partie va être plus longue et plus complexe. Une expression je vous le rappelle renvoie un objet, n'importe lequel. Une expression peut être aussi « settable », c'est-à-dire que l'ont peut utiliser « add %object% to %object% » (le premier est votre expression et le deuxième ce que vous ajoutez), « remove %object% from %object% », « set %object% to %object% », « reset %object% » ou « remove all from %object% ».

 

Tout d'abord voici le code de base de votre class :

package votre.package;

import javax.annotation.Nullable;

import org.bukkit.event.Event;

import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;

public class VotreClass SimpleExpression<Object>{

   @Override
   public boolean isSingle() {
       return true;
   }

   @Override
   public Class<? extends Object> getReturnType() {
       return Object.class;
   }

   @SuppressWarnings("unchecked")
   @Override
   public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean paramKleenean, ParseResult paramParseResult) {
       return true;
   }

   @Override
   public String toString(@Nullable Event e, boolean paramBoolean) {
       return null;
   }

   @Override
   @Nullable
   protected Object[] get(Event e) {
       return new Object[]{  };
   }
}
 

Voyons les fonctions 1 par 1 :

isSingle() : Si vous renvoyez false, c'est que ce que vous renvoyez avec votre expression est une liste (plusieurs objets), si vous renvoyer true, vous ne renvoyez qu'un seul objet.

getReturnType() : Permet à Skript d'obtenir la class du type d'objet que vous renvoyez (ex : String.class, Integer.class, Player.class...).

init() : Si vous avez suivi le reste du tuto, vous la connaissez.

toString() : Vous connaissez aussi.

get() : Permet d'obtenir l'objet de l'expression. /!\ Vous devez renvoyer une liste obligatoirement, si vous renvoyez false à la fonction isSingle(), vous devez renvoyer une liste à un seul élément.

 

Dans votre class, la première chose à faire est de remplacer tous les « Object » par le type d'objet que vous voulez renvoyer (ex : String, Integer, Player, NPC, UUID, Long...).

Comme exemple je vais faire une expression qui renvoie le nom du joueur, ça renvoie donc un String (texte). Dans ma classe ça me donne :

package votre.package;

import javax.annotation.Nullable;

import org.bukkit.entity.Player;
import org.bukkit.event.Event;

import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;

public class ExprPlayerName extends SimpleExpression<String>{

   private Expression<Player> player;

   @Override
   public boolean isSingle() {
       return true;
   }

   @Override
   public Class<? extends String> getReturnType() {
       return String.class;
   }

   @SuppressWarnings("unchecked")
   @Override
   public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean paramKleenean, ParseResult paramParseResult) {
       player = (Expression<Player>) expr[0];
       return true;
   }

   @Override
   public String toString(@Nullable Event e, boolean paramBoolean) {
       return "name of player";
   }

   @Override
   @Nullable
   protected String[] get(Event e) {
       return new String[]{ };
   }
}
 

 

Maintenant voyons la fonction get(). Dans le « return new String[]{ } » je dois ajouter le nom du joueur dans la liste. J'obtiens donc le code suivant :

    @Override
   @Nullable
   protected String[] get(Event e) {
       String name = player.getSingle(e).getName();
       return new String[]{ name };
   }
}
 

 

Maintenant voyons voir pour une expression « settable ». On va rajouter 2 nouvelles fonctions dans notre class :

    @Override
   public void change(Event e, Object[] delta, Changer.ChangeMode mode){

   }

   @SuppressWarnings("unchecked")
   @Override
   public Class<?>[] acceptChange(final Changer.ChangeMode mode) {
       return null;
   }
 

La fonction change() est appelée quand l'objet doit être changé. Vous avez 3 paramètres dedans :

e : Vous le connaissez (pour récupérer une variable private avec getSingle(e))

delta : L'objet que vous devrez ajouter (vous devrez le cast)

mode : Le type de changement : add, remove, reset...

La fonction acceptChange() doit renvoyer les class des objets que vous acceptez lors d'un changement. Par exemple si vous souhaitez pouvoir ajouter uniquement des nombres en fonction de certains mode, il faut faire une condition avec le type de mode et renvoyer Number.class.

 

Exemple : Avec le plugin PayerPoints, pouvoir récupérer les points du joueur et pouvour en add, remove, reset ou set :

package fr.nashoba24.wolvsk.playerpoints;

import javax.annotation.Nullable;

import org.black_ixx.playerpoints.PlayerPoints;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;

import ch.njol.skript.classes.Changer;
import ch.njol.skript.classes.Changer.ChangeMode;
import ch.njol.skript.lang.Expression;
import ch.njol.skript.lang.SkriptParser.ParseResult;
import ch.njol.skript.lang.util.SimpleExpression;
import ch.njol.util.Kleenean;
import ch.njol.util.coll.CollectionUtils;

public class ExprPoints extends SimpleExpression<Integer>{

   private Expression<Player> player;

   @Override
   public boolean isSingle() {
       return true;
   }

   @Override
   public Class<? extends Integer> getReturnType() {
       return Integer.class;
   }

   @SuppressWarnings("unchecked")
   @Override
   public boolean init(Expression<?>[] expr, int matchedPattern, Kleenean paramKleenean, ParseResult paramParseResult) {
       player = (Expression<Player>) expr[0];
       return true;
   }

   @Override
   public String toString(@Nullable Event e, boolean paramBoolean) {
       return "points of player";
   }

   @Override
   @Nullable
   protected Integer[] get(Event e) {
       return new Integer[]{ PlayerPoints.getPlugin(PlayerPoints.class).getAPI().look(player.getSingle(e).getUniqueId()) };
   }

   @Override
   public void change(Event e, Object[] delta, Changer.ChangeMode mode){
       if (mode == ChangeMode.SET) {
           PlayerPoints.getPlugin(PlayerPoints.class).getAPI().set(player.getSingle(e).getUniqueId(), ((Number) delta[0]).intValue());
       }
       else if (mode == ChangeMode.RESET) {
           PlayerPoints.getPlugin(PlayerPoints.class).getAPI().reset(player.getSingle(e).getUniqueId());
       }
       else if(mode == ChangeMode.ADD) {
           PlayerPoints.getPlugin(PlayerPoints.class).getAPI().give(player.getSingle(e).getUniqueId(), ((Number) delta[0]).intValue());
       }
       else if(mode == ChangeMode.REMOVE) {
           PlayerPoints.getPlugin(PlayerPoints.class).getAPI().take(player.getSingle(e).getUniqueId(), ((Number) delta[0]).intValue());
       }
   }

   @SuppressWarnings("unchecked")
   @Override
   public Class<?>[] acceptChange(final Changer.ChangeMode mode) {
       if (mode == ChangeMode.SET || mode == ChangeMode.RESET || mode == ChangeMode.ADD || mode == ChangeMode.REMOVE)
           return CollectionUtils.array(Number.class);
       return null;
   }
}
 

 

Maintenant il ne nous reste plus qu'à enregistrer l'expression dans Skript :

Skript.registerExpression(VotreClassclass, Object.class, ExpressionType.PROPERTY, pattern);
 

La seule chose en plus des autres patterns est « Object.class ». Vous devez mettre à la place le type d'objet que vous renvoyez dans votre expression. Par exemple avec l'exemple précédent j'obtiens :

Skript.registerExpression(ExprPoints.class, Integer.class, ExpressionType.PROPERTY, "point[s] of %player%", "%player%['s] point[s]");
 
Modifié par Nashoba

Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.