Nashoba Posté(e) le 18 septembre 2016 Posté(e) le 18 septembre 2016 (modifié) Sommaire: Base de l'addon Créer un effet Créer une condition Créer une expression Créer un évent 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é le 26 juillet 2018 par Nashoba
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant