Aller au contenu

Classement

Contenu populaire

Affichage du contenu avec la meilleure réputation le 01/08/2025 dans Messages

  1. Introduction Hello les Skripteurs!! 👋 Je vous propose ici un tutoriel complet et un Skript prêt à l’emploi en bas de page. Ce tutoriel concerne une problématique qui manque cruellement de doc claire sur les forums de Skript en général: L’idée m’est venue en aidant un membre (coucou @Mamadoug 😄) qui voulait déclencher un évènement uniquement les week-end. Cependant, Skript ne propose pas d'expression native pour ça. Mais pas de panique, on va utiliser un peu de logique et un algorithme fiable et on va y aller par étape. Contexte Skript propose une expression now pour récupérer la date actuelle, mais il n’existe aucun moyen direct de faire une condition telle que : # output an error: Can't understand this condition: 'now is 'Monday'' if now is "Monday": Cette condition n'est pas comprises par Skript, ce qui est très frustrant quand on veut faire une action selon le jour de la semaine Étape 1 – Comprendre ce qu’on a : l'expression now (Skript Hub - Documentation) Skript implémente l'expression now, qui donne l’instant actuel (avec jour, mois, année, heure, minute). Mais il ne donne pas le jour de la semaine directement comme tu peux le voir dans l'output ci-dessous.... 👉 On a donc besoin de transformer now en quelque chose qu’on peut analyser... du texte par exemple. Étape 2 – Obtenir les composantes de la date La date donnée par now ressemble à ça : 12/07/2025 00:11 On crée une fonction formatDate() qui transforme/découpe ce texte en une liste : [12, 07, 2025, 00, 11] -> [jour, mois, année, heure, minute] set {_date::*} to "%{_d}%" split by "/" Cela nous permet de séparer jour, mois, année, ce qui est indispensable pour la suite. Étape 3 – Ajouter une fonction modulo, absente de Skript... Pour certains calculs, on a besoin d’un reste de division euclidienne, qu’on appelle modulo. Or, Skript ne possède pas de fonction native modulo()... Donc on doit la créer nous-mêmes : # Merci Yghore https://skript-mc.fr/forum/topic/16351-skript-modulo/#findComment-131599 function modulo(n1: number, n2: number) :: number: set {_divise} to round down ({_n1} / {_n2}) set {_multiple} to {_n2} * {_divise} set {_modulo} to ({_n1} - {_multiple}) return {_modulo} Je ne vais pas détailler le fonctionnement du modulo Ici car cela peut faire l'objet d'un autre post. En savoir plus sur le modulo : Modulo (opération) — Wikipédia Cette fonction sera indispensable dans l’étape suivante, lorsqu’on fera un calcul plus avancé sur la date. 😉 ...et merci @Yghore pour le snippet 🙂 Étape 4 – Utiliser les maths : l'algorithme de Zeller Pourquoi ? Puisqu’on n’a pas de fonction pour trouver le jour de la semaine directement dans Skript, on fait comme les anciens : on le calcule mathématiquement à partir de la date.. Ce qui donne cette formule pour notre calendrier géorgien: L'idée de Zeller : On prend le jour (q), le mois (m), et "l’année" (K), et on fait des opérations mathématiques. Ici en fonction de la valeur de h, nous pouvons en déduire du jours de la semaine car cette formule donne le jour de la semaine sous forme d’un nombre de 0 à 6 : Pour chaque valeur de h, interpréter de la manière suivante : 0 : "Saturday" # Samedi 1 : "Sunday" # Dimanche 2 : "Monday" # Lundi 3 : "Tuesday" # Mardi 4 : "Wednesday" # Mercredi 5 : "Thursday" # Jeudi 6 : "Friday" # Vendredi Nous avons heureusement implémenté notre fonction modulo() plus tôt, et cela va nous servir à réécrire cette formule en Skript! Donc la formule énoncée plus haut donnerai quelque chose comme ça: # Uses the Zeller's Congruence algorithm to calculate the day of the week # Ref: https://fr.wikipedia.org/wiki/D%C3%A9termination_du_jour_de_la_semaine if {_month} is "January": set {_month} to 13 set {_year} to {_year} - 1 else if {_month} is "February": set {_month} to 14 set {_year} to {_year} - 1 else: set {_month} to {_month} + 1 set {_k} to modulo({_year}, 100) set {_j} to {_year} / 100 set {_f} to {_day} + (13 * ({_month} + 1)) / 5 + {_k} + {_k} / 4 + {_j} / 4 - (2 * {_j}) set {_f} to modulo({_f}, 7) # à partir de là, {_f} contient notre jour de la semaine de manière numérique Je ne vais pas détailler plus loin, si vous voulez en savoir plus au niveau de la transcription de cette formule mathématique en langage de programmation, voici une ressource qui vous sera utile: Zeller's Congruence | Find the Day for a Date - GeeksforGeeks Étape 5 – On écrit getDayOfTheWeek(d: date) Cette fonction prend la date, applique l’algorithme de Zeller, et retourne une chaîne de caractères : "Monday", "Tuesday", ..., "Sunday" Maintenant, on peut poser une vraie question lisible : if getDayOfTheWeek(now) is "Sunday": Nous avons donc codé cette formule dans la fonction getDayOfTheWeek() qui prend en paramètre une date et qui retourne en fonction de la valeur de h, le jour de la semaine en anglais. Bonus - Une commande pour tester directement Pour finir, j’ai codé une petite commande pratique: Elle permet d’afficher le jour de la semaine actuel, formaté proprement avec l’heure et la date. Commande à utiliser : /now Elle affiche par exemple : Saturday 12/07/2025 00:11 Pratique pour tester rapidement le fonctionnement de la fonction getDayOfTheWeek() ! 😉 Voilà, j’espère que ce tutoriel vous aura été utile et qu’il vous aura permis d’apprendre quelque chose au passage 🙂 Notamment sur comment contourner certaines limites de Skript en s’appuyant sur un peu de logique mathématique (merci Zeller 😄). L’idée était simple à la base, mais demandait une mise en œuvre un peu plus technique, désormais à votre portée ! Le code proposé est plug-and-play, libre à vous de l’adapter à vos besoins (event spécial, message du jour, gestion hebdomadaire, etc...). Et si vous souhaitez aller plus loin (exécution à heure fixe, détection de jours fériés, commandes manuelles...), je serai ravi de vous filer un coup de main ! Bref... Bon dev à tous… et bon week-end... si c’en est un 😉 Ah... et... comme promis... voici le Skript dans son entièreté (ne me remerciez pas): time.sk
    1 point
  2. Salut @Mamadoug, Je te partage ici une solution fonctionnelle en bas de page, que j’ai codée pour répondre précisément à ton besoin: attribuer une permission uniquement le week-end (samedi/dimanche), et la retirer sinon..... 🙂 Comprend d'où venait ton erreur: Le problème rencontré est que Skript ne comprend pas la condition : # output: Can't understand this condition: '{_now} is 'Saturday' or {_now} is 'Sunday'' set {_now} to now if {_now} is 'Saturday' or {_now} is 'Sunday': Skript ne sait ni reconnaître le jour de la semaine, ni interpréter "Saturday" comme une constante magique... Donc il faut calculer nous-mêmes le jour de la semaine à partir de la date ! On va y aller par étapes. Étape 1 – Comprendre ce qu’on a : l'expression now (Skript Hub - Documentation) Skript implémente l'expression now, qui donne l’instant actuel (avec jour, mois, année, heure, minute). Mais il ne donne pas le jour de la semaine directement comme tu peux le voir dans l'output ci-dessous.... 👉 On a donc besoin de transformer now en quelque chose qu’on peut analyser... du texte par exemple. Étape 2 – Obtenir les composantes de la date La date donnée par now ressemble à ça : 12/07/2025 00:11 On crée une fonction formatDate() qui transforme/découpe ce texte en une liste : [12, 07, 2025, 00, 11] -> [jour, mois, année, heure, minute] set {_date::*} to "%{_d}%" split by "/" Cela nous permet de séparer jour, mois, année, ce qui est indispensable pour la suite. Étape 3 – Utiliser les maths : l'algorithme de Zeller Pourquoi ? Puisqu’on n’a pas de fonction pour trouver le jour de la semaine directement dans Skript, on fait comme les anciens : on le calcule mathématiquement à partir de la date.. Ce qui donne cette formule pour notre calendrier géorgien: L'idée de Zeller : On prend le jour (q), le mois (m), et "l’année" (K), et on fait des opérations mathématiques. Ici en fonction de la valeur de h, nous pouvons en déduire du jours de la semaine car cette formule donne le jour de la semaine sous forme d’un nombre de 0 à 6 : Pour chaque valeur de h, interpréter de la manière suivante : 0 : "Saturday" # Samedi 1 : "Sunday" # Dimanche 2 : "Monday" # Lundi 3 : "Tuesday" # Mardi 4 : "Wednesday" # Mercredi 5 : "Thursday" # Jeudi 6 : "Friday" # Vendredi Je ne vais pas détailler plus loin, si tu veux savoir plus au niveau de la transcription de cette formule mathématique en langage de programmation, voici une ressource qui te sera utile: Zeller's Congruence | Find the Day for a Date - GeeksforGeeks Étape 4 – On écrit getDayOfTheWeek(d: date) Cette fonction prend la date, applique l’algorithme de Zeller, et retourne une chaîne de caractères : "Monday", "Tuesday", ..., "Sunday" Maintenant, on peut poser une vraie question lisible : if getDayOfTheWeek(now) is "Sunday": Nous avons donc codé cette formule dans la fonction getDayOfTheWeek() qui prend en paramètre une date et qui retourne en fonction de la valeur de h, le jour de la semaine en anglais. Étape 5 – Créer une fonction isWeekend(date) Comme on veut rendre la chose plus simple à lire et à réutiliser, on crée une fonction dédiée: function isWeekend(d: date) :: boolean: set {_day} to getDayOfTheWeek({_d}) if {_day} is "Saturday": return true else if {_day} is "Sunday": return true else: return false On pourra ensuite écrire: if isWeekend(now) is true: Et ça veut bien dire : si on est samedi ou dimanche 🙂 Étape 6 – Implémenter ces fonctions dans ton code Tu voulais faire une boucle qui ajoute les permissions régulièrement en fonction du jour de la semaine pour tous les joueurs mais plutôt que de vérifier toutes les 5 minutes pour tous les joueurs connectés, on va vérifier au moment où chaque joueur rejoint le serveur 😄 Pourquoi c’est mieux ? Moins de charge serveur : pas de boucle inutile. Pas besoin de timer ou de tâche répétitive. La permission est attribuée dès que le joueur arrive, ce qui suffit dans la plupart des cas. on join: if isWeekend(now) is true: # Donner la permission si le joueur ne l'a pas if player does not have permission "shopguiplus.shops.weekend": execute console command "lp user %player% permission set shopguiplus.shops.weekend true" else: # Retirer la permission si le joueur l'a if player has permission "shopguiplus.shops.weekend": execute console command "lp user %player% permission unset shopguiplus.shops.weekend" Voilà, j’espère que tout ça t’aura été utile et que tu auras appris quelque chose au passage 🙂 notamment sur comment contourner les limites de Skript en utilisant un peu de logique mathématique (merci Zeller 😄). En tout cas, ton idée de départ était bonne, il ne manquait qu’une manière un peu plus technique de l’implémenter. Je te laisse tester tout ça, normalement le code disponible juste en dessous est plug-and-play, et si jamais tu veux aller plus loin (déclenchement à minuit, commande manuelle, etc...), je serai ravi de t’aider à peaufiner. Bonne chance pour ton projet et bon week-end… si c’en est un 😉 Code/Solution ICI: Révéler le code:
    1 point
×
×
  • Créer...

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.