Tutoriel [Skript] Crée des plugins sans java ! (énorme)


#1

Salut à tous!
Je vous propose aujourd’hui un grand tuto sur le plugin Skript qui permet à son tour de faire des plugins pour Minecraft! N’hésitez pas à me dire ce qui ne vas pas ou ce qui est mal expliqué pour que je règle ça :wink:
Pour trouver la version de Skript qui marche avec votre version Minecraft je vous redirige vers ce lien: https://skript-mc.fr/forum/threads/♦-skpack-1-7-›-1-12-♦.8911/
Je vous invite à rejoindre la communauté francophone de Skript-mc qui se fera un plaisir de vous aider: https://skript-mc.fr/forum/
Petit répertoire de skript
Pour finir, vous pouvez avoir plein d’addons et documentation sur ce site: https://www.skunity.com/

Introduction

Skript est un plugin qui permet de crée des plugins pour votre serveur très simplement.Si vous n’avait pas un minimum de niveau en anglais passez votre chemin .
Il sert à faire des truc assez simples et très utiles ( panel de modération , ajouter des effets lors d’un clique avec un item , etc)

Prérequis :

  • un serveur bukkit / spigot
  • un éditeur de texte (par exemple notepad ++)

Avantages

  • langage simple
  • création du plugin rapidement (pas besoin de compilation)
  • pas besoin de reload tout le serveur quand on le modifie
  • besoin seulement d’un éditeur de texte

Inconvénients

  • un peu plus lent que java

Voici une comparaison des deux langages

Skript :

on break: #Quand le bloc est cassé
if player's tool is not diamond pickaxe: #Si le joueur ne tient pas une pioche en diamant
    cancel event # Annuler l'evenement

Java :

@EventHandler //Annontation
public void onBreak(BlockBreakEvent e) { //Quand un bloc est cassé
    if(e.getPlayer().getItemInHand().getType()!=Material.DIAMOND_PICKAXE) { //Si le joueur de tient pas une pioche en diamant
        e.setCancelled(true); //Annuler l'evenement
    }
}

Comment ça marche ?

Je vais tous d’abord vous apprendre à créer le fichier qui contiendra vos skript. Vous devez tous d’abord aller sur votre FTP à la racine de votre serveur puis dans plugins/Skript/scripts/. Si vous n’avez encore jamais touché à ce dossier, vous devriez avoir plein de fichier. Ce sont des codes que le développeur a mis. Vous remarquerez qu’ils ont tous un nom du style “- %nom%.sk”, c’est normal, si un fichier de code pour Skript à un “-” devant son nom, c’est que ce fichier est désactivé. Vous pouvez supprimer tous ces fichiers si vous en avez pas besoin.
Ensuite vous allez créer votre propre fichier. Vous ouvrez votre éditeur de texte. Ensuite vous enregistrez sous votre fichier vierge dans le dossier plugins/Skript/scripts sous le nom suivant:
"%nom que je veux%.sk". Le .sk est très important, si vous mettez .txt le plugin ne lira tous simplement pas ce fichier.
Voila, vous avez votre premier fichier de code. Mais bien sur vous n’avez rien mis donc ça ne fera rien.
Pour reload (donc redémarrer votre plugin) vous faites en jeu soit “/skript reload all” pour reload tous les plugins Skript soit “/skript reload %nom de votre fichier sans le .sk%” pour redémarrer que un seul plugin.
Et en Skript, si une ligne finie par “:”, la ligne suivante contiendra un TAB (Le tab est ici sur votre clavier) de plus que la précédente.
Voici un exemple

Code:

#diamant
on craft: #Evévenement: lors du craft (0 tab)
    if event-item is diamond pickaxe or diamond shovel or diamond sword or diamond hoe or diamond axe: #Si l'item crafté est un outil un diamant (1 tab)
        chance of 5%: #5% de chance (2 tab)
            give 1 diamond to player #Donner 1 diamant au joueur (3 tab)
            send "&f[&6Serveur&f]&cVous avez &e&n1 diamant&c dont vous n'avez pas eu besoin pour votre craft!" to player #Envoyer le message au joueur (3 tab)

Attention Skript est composé comme le Java (pour Minecraft) en 3 étapes:

  • L’évenement 1 seule fois au début (la seule exception est pour créer un commande)
  • Les conditions eventuellement mais quasi indispensable
  • Les actions (ou effects) qui sont ce qui sera fait

Les événements

Nous allons commencer par les événements.
Un événement est une action que fais le joueur, le serveur , entité , etc :
Voici une petite liste:

  • on craft # quand le joueur craft (fabrique) quelque chose
  • on join # quand le joueur rejoins le serveur
  • on death # quand lune entité meurt
  • on click # quand le joueur clique
  • on damage #quand une entité reçois un dommage
    Si vous voulez la liste des événements là-voici
    Un événement ne fini jamais par ‘:’ et il n’y a jamais de TAB , et jamais d’événement dans un événement

Conditions

Les condition permetent de vérifier si telle ou telle chose vaut ceci, est vrai etc…
Voici des exemple concrets:

  • Si le joueur s’appelle “Jean-Kevin”
  • Si le monde s’appelle “paradis”
  • Si l’expérience du joueur est plus grande que 14
  • Si l’entité est empoisonnée
    etc…
    Une condition pourra être suivie d’un “else:” ou “else if …:” traduits par “sinon” et "sinon si…"
    Ça permet que si la conditions n’est pas vérifiée (exemple: Si le joueur est op, si ce n’est pas vérifié (donc qu’il n’est pas op)) ça fera ce qui est dans le "else"
    Ensuite, une condition commencera toujours par if (sauf exception) et se finira par ":"
    Pour tester une conditions vous devez ensuite mettre un comparateur (égal, plus grand etc…)
    Voici une liste:
    is (est égal)
    is greater than (est plus grand que)
    is smaller than (est plus petit que)
    is not (n’est pas égal)
    is between %valeur% and %valeur% (est entre ces deux valeurs)
    has (possède)

Ces comparatifs se situent ici:
if player’s health is 5: (si la vie du joueur est 5)
Elle se situe donc entre le “if %valeur%” et ce qui est testé donc ici 5

Autres exemples:
if “%damage cause%” is “void”: #Si la cause des dégâts est le vide
if player’s tool is diamond pickaxe: #Si le joueur tient une pioche en diamant
if player’s food level is greather than 3: #Si la faim du joueur est plus grande que 3
if altitude of attacker is smaller than altitude of victim: #Si l’altitude de l’attaquant est inférieure a celle de la victime
if y-location of player is between 50 and 64: #Si la location y du joueur est entre 50 et 64
if player has permission “skript.exemple”: #Si le joueur a la permission “skript.exemple”

Pour la liste des conditions c’est ici
et ici les expressions

Les exceptions:
Je vous avais parlé d’exceptions au-dessus. Nous y voilà!
Ces exceptions sont des conditions qui ne contiennent pas de if au debut. Elle ne terminent pas non plus par “:”. Ces conditions peuvent être utilisées si vous voulez un code moins long et si vous n’avez pas de else ensuite.
Exemples:
player’s health is 10 (équivaut à if player’s health is 10: )
experience of player is greater than 16 (équivaut à if experience of player is greater than 16: )
player is flying (équivaut à if player is flying: )
chance of 18% (il y a une chance de 18 % )

Actions

Les actions / effets sont ce qui va être fait lorsque l’événement à été produit et après les éventuelles conditions (voir entre 2 conditions).
Elles vont souvent utiliser les acteurs de l’action comme le joueur l’ayant fait, le type de bloc cassé etc…
La liste des actions est ici
Exemples d’actions:
push the player upward at speed 10 #Éjecter le joueur a une vitesse de 10 vers le haut
cancel event #Annuler l’événement
teleport victim to attacker #téléporter la victime a l’attaquant

Un petit point sur l’action “cancel event”:
Cette action permet d’annuler TOUS ce que l’événement vas faire

on break:
    cancel event

Ici quand un bloc va être cassé, tous va être annulé!
Donc ça nous fait:

  • Le bloc va être reposé
  • Les dégâts subit par l’outils du joueur va être annulé
  • Les drops effacé
    etc…

Les boucles ou loops

Je vais parler ici des boucles. Ces boucles permettent de tester toutes les valeurs pour la boucle souhaitée.
Exemple:
loop all players: #tester tous les joueurs
loop all entities in world “hell”: #tester toutes les entités dans le monde "hell"
loop all items in inventory of player: #tester tous les items dans l’inventaire du joueur

Les boucles finissent elles aussi par “:” et donc la ligne suivante aura 1 TAB en plus
Lorsque vous avez déclaré une boucle, une nouvelle “expression” va être créée nommé souvent “loop-%type de loop%” a part pour les variables mais on en parlera plus tard.
Exemples:

loop all players:
    if loop-player is in world "jean-pierre":
        send "THUG LIFE!" to loop-player #Je suis désolé j'ai plus d'idées rationnelles :/
loop all items in player inventory:
    if loop-item is diamond pickaxe:
        set loop-item to air
        send "Adieu la pioche en diamant de %player% MOUAHAHA &kkkkkkkkk" to player

Les commandes

Vous déclarez une commande à la place d’un événement comme ceci:

command /nomdelacommande:
    trigger:

Le trigger est a partir de l’endroit où les conditions et actions commenceront. Avant vous pouvez mettre les descriptions, qui peut les exécuter etc… Sachez que ceci n’est pas obligé d’être mis, perso je ne les met pas ^^
Voici ce que vous pouvez mettre avant le trigger:

  • description: La description de ce que fait la commande
  • usage: Comment la commande doit être utilisée, ex: /nomdelacommande
  • permission: les.permissions.necessaires
  • permission message: Le message affiché si le joueur n’a pas la permission
  • executable by: Qui peut exécuter la commande: players, console OU players and console
  • aliases: Les abréviations pour exécuter la commande, ex: /c

Pour les arguments vous devez ajouter <type d’argument> après le "command /nomdelacommande:"
Exemple:

command /abcdef <text> <int>:
    trigger:

Dans les conditions et actions vous allez devoir utiliser “arg 1/2/3…” ou “%argument 1%” si vous voulez l’inclure dans une variable comme dans un message par exemple
Exemple:

command /coucou <player>:
    trigger:
        send "&bCOUCOU %argument 1%" to arg 1

Les variables

Il existe en Skript 3 types de variables:

  • Les variables temporaires
  • Les variables enregistrées
  • Les groupes de variables

Les variables sont définies et utilisées entre des {}. Elles peuvent également contenir des “.”.
Exemple:
{coucou}
{variable}
{skript.test}

Les variables contiennent une valeur (a part pour les groupes) et peuvent être changées ou implémentées dans un texte ou une condition
Une variable temporaire contient un _ avant le nom. Cette variable ne sera pas sauvegardée et si 2 même événements sont produits en même temps, même si les variables utilisées ont le même nom, elles pourront être différentes. Ces variables seront également supprimées à la fin de l’événement.
Exemple:
{_coucou}
{_variable}
{_skript.test}

Les variables enregistrées ou fixes sont sauvegarder dans une base de données et peuvent être réutilisées ou changées à n’importe quel moment.
Exemple:
{coucou}
{variable}
{skript.test}

Pour finir nous avons les groupes de variables, ce sont des groupes contenants plein de variables. Avec une boucle, nous pouvons tester toutes les variables contenues dans ce groupe. Ils sont définis avec “::” après le nom
De plus, si vous mettez "::", c’est le groupe en entier qui est sélectionnée et si vous mettez “::%nom d’une variable%”, ce sera juste la variable avec ce nom dans ce groupe qui sera sélectionnée.
Ce groupes peuvent contenir n’importe quelle données aussi, comme des noms de joueur, des UniqueUID, des entités, des localisations…
Exemple:
{list.skript::
}
{joueur.op::*}

Si vous utilisez une variable dans du code, elle sera remplacée par la valeur la contenant:
Exemple:
if {time.player} is greater than 45:

Ici {time.player} sera remplacée par la valeur la contenant.
Autre exemple:
teleport player to {location.spawn}

Si la variable {location.spawn} est bien une localisation, ça marchera. Si la variable est imaginons 5, rien ne se passera car une joueur ne peut pas être téléporter a un nombre
Les variables peuvent également être utilisées dans les textes et elles seront remplacées par leur valeur mais elles devront être contenues entre des %.
Exemple:
broadcast “%player% a joué %{time.%player%}%”

Pour éditer une variable, vous utiliserez ceci:

  • set {var} to location of player #La variable sera la position du joueur
  • add 5 to {var} #On ajoutera 5 à la variable
  • remove 9 from {var} #9 sera retiré de la variable
  • clear {var} #La variable sera effacée

Exemples de Skript:​

Idée souhaité : pouvoir avoir avec l’item un effet de force

on right click with 4519: # au clic droit avec id 4519
	if player is op: # si le joueur est op
		if {4519} was less than 2 minutes: # si la variable 4519 est passée depuis 2 minutes
			send "&f[&6Serveur&f]&cVous devez attendre 2 minutes" to player # envoyer ... au joueur
			stop
		else: # sinon
			apply strength 2 to the player for 10 second # appliquer l'effet force 2 au joueur pendant 10 secondes
		set {4519} to now # mettre la variable 4519 maintenant

Idée souhaité : avec une commande avoir les liens du forum , du twitter , du discord et du site

command /liens: 
	executable by: player
	trigger:
		send "&f[&6Serveur&f]&b Twitter https://twitter.com/badycraft"
		send "&f[&6Serveur&f]&d Discord https://discord.gg/NgNhv32"
		send "&f[&6Serveur&f]&e Site http://badycraft.web.boxtoplay.com"
		send "&f[&6Serveur&f]&a Forum http://badycraft.web.boxtoplay.com/forum"

Idée souhaité : être sur que lors l’usage d’une commande il n’y est aucune erreur

command /arret:
	permission: staff.sk
	trigger:
		broadcast "&f[&6Serveru&f]&cArret &edu &cserveur"
		wait 5 tick
		broadcast "&f[&6Serveru&f]&c3"
		wait 5 tick
		broadcast "&f[&6Serveru&f]&e2"
		wait 5 tick
		broadcast "&f[&6Serveru&f]&c1"
		wait 5 tick
		make player execute command "/save-all"
		wait 50 tick
		make player execute command "/kickall"
		make player execute command "/stop"

C’est fini pour ce tutoriel j’espère qu’il vous sera utile je l’ai fais en le piquant et en le modifiant pour que ce soit le plus simple possible .
Ps: je suis pas un copieur la plupart des exemple viennent de mon serveur


Problème withelist
#2

Merci pour ce tutoriel très complet ! :clap:


#3

Copié collé de Minecraft Fr.

->https://minecraft.fr/forum/threads/skript-enorme-tuto-créez-des-plugins-sans-java.151203/

Et fait pas genre c’est toi qui l’a fait vu que le vrai tuto date de 2015 :).


#4

Oui je l’assume , c’est pour que plus de monde sache que skript existe et je l’ai modifié et puis je l’ai dit.


#5

Tu aurais pu dire que tu avais une source ^^


#6

Ouai je vais modifié ça , ah je peut pas modifié


#7

Tu n’as pas le petit “crayon” ?


#8

Nan , comme c’est un vieux sujet .


#9

Ah, dommage :/…
C’est comme ça


#10

Toute de façon , je vais faire une V2 du tutoriel.


#11

Okay,

Bon courage !

Cordialement,


#12

Est il possible de faire un skript qui marche que dans un seule monde avec le plugin multiverse-core ?

Merci


#13

Bonjour @anthony1,

Je pense qu’il suffirait de tester le nom du monde dans lequel se trouve le joueur au début du code ^^.

Cordialement

Aurélien


#14

Enfaite je voudrais que seulement dans le monde minage les dégat sois retiré mais pas dans les autres mondes…

Merci


#15

Enfin un bon tuto sur le skripts !


#16

@anthony1 C’est possible avec cette condition
if player is in world “(le nom de ton monde”: (si le joueur se trouve dans le monde appelé … )
exemple :

on craft of gold ingot:
  if player is in world "world":
    send to player "&6Mon précieux *_*" to player