Cet article n’est pas terminé. Plus d’explications sont à venir 😉

Après le LGdir et toujours dans notre quête à la création d’outils pour les mapmakers, nous sommes tombé sur une idée, le sain Graal de l’outil de création: une librairie ! Vous l’aurez compris, après Hierarchy, ce projet est notre deuxième petit bébé.

A quoi ça sert ?

Le principe est simple: regrouper tous les éléments pouvant être utiles à la création de n’importe quel map ou système Minecraft. Par exemple, vous aurez à dispositions une banque d’arbres permettant de faire des décors naturels plus facilement. Vous aurez aussi accès à des systèmes permettant par exemple de gérer des projectiles a la façon du LGdir, ou à des ressources pack pour embellir vos maps !

Pour les développeurs ?

Là où les adeptes du développement conçoivent aisément à quoi sert une librairie, d’autres ont une vision flou voir même obscure de leur utilité dans un projet de développement.

Concrètement, il s’agit d’un regroupement de fonctions déjà toutes faites, permettant au développeur de ne pas avoir à tout faire lui même et à user ses petits doigts. Certaines de ces fonctions sont par exemple, les fonctions mathématiques. Les maths, c’est compliqué, et pas très jouasse à intégrer à ses projets. C’est pour cette raison que certains développeurs fous ont, dans la plupart des langages, créé des fonctions permettant de faire des maths très facilement.

Ainsi, pour déterminer la racine carré d’un nombre, le développeur n’a qu’a appelé la fonction toute prête. Il n’a pas besoin de savoir comment trouver cette racine, ce qui lui permet de se concentrer sur son programme.

Ici, nous avons considéré que les commandes de Minecraft étaient assez évoluées pour pouvoir s’apparenter aux « vrais » langages. Et dans un élan de générosité, nous avons alors décidé de faire partie des ces fous qui créaient l’une de ces bibliothèques de fonctions toutes faites.

Documentation

Tutoriel

Comment utiliser les fonctions ?

Avant d’essayer d’utiliser les fonctions, il vous faut vous équiper des bons outils. Pour cela, nous vous recommandons d’installer le logiciel notepad++ (un éditeur de texte avancé) ainsi que notre add-on, le CSH (un colorateur syntaxique facilitant la lecture des fonctions).

Faire un tuto complet sur l’utilisation de chaque fonction serait bien trop long et indigeste. Pour cette raison, nous vous avons concocté un petit tuto général vous permettant de vous y retrouver dans n’importe quelle situation.

Chaque fonction dispose d’une en-tête vous permettant de comprendre:

  • Les prérequis (requierments): score(s) et/ou autre(s) élément(s) à mettre en place afin que le système puisse fonctionner
  • Les paramètres (input): score(s) et/ou éléments(s) que la fonction va utiliser comme données pour exécuter sa tâche (ex: dans une fonction cosinus, cette dernière doit avoir comme donnée un angle entre 0 et 360 degrés).
  • Les retours (output): score(s) et/ou autre(s) élément(s) que la fonction utilisera pour conserver les résultats (ex: la fonction cosinus mettra le résultat sur un score nommé « Res »).
  • Autre: certaines fonctions peuvent avoir un fonctionnement assez différent (même si c’est rare). Tout est alors décrit dans l’entête ou dans un ReadMe présent ans le dossier contenant la fonction.

Le principe d’une librairie est avant tout de « cacher » la complexité des fonctions (car après tout, en temps que développeurs digne de ce nom, nous nous devons d’être fainéant). Ainsi, pour utiliser une fonction qui calcule le cosinus d’un angle, vous n’aurez pas besoin de savoir comment le calculer. Il vous suffit juste d’appeler la fonction (Gunivers-Lib:Utils/Math/Cos) et vous aurez votre cosinus, comme par magie ! On appel ça une « boite noir » car il se passe des choses obscures à l’intérieur qu’on a pas besoin de connaître. Il suffit juste de savoir quelles données elle mange et quelles données elle renvois à la sortie (dans le cas d’un Cosinus, on donne un angle entre 0 et 360 et elle ressort une valeur entre 0 et 1)

Imaginons donc que notre fonction s’appelle Tuto. La démarche à suivre est donc la suivante:

Comme vous pouvez le voir, l’essentiel des informations sont déduites de l’entête et du nom de la fonction (la fonction Cosinus fera … un Cosinus, c’est comme le porc salut c’est marqué dessus).

Fonctionnalités

Vous pourrez trouver toutes les fonctions de la librairie ci-dessous ainsi qu’une rapide explication de ces dernières. Toutefois, il reste indispensable d’aller naviguer dans les fichiers et lire les entêtes afin de comprendre comment utiliser chacune des fonctions. Pour cela, nous vous recommandons d’utiliser notre colorateur syntaxique (CSH).

Enfin, dans la librairie, vous pourrez trouver des dossiers nommés « Advanced » ou bien « Basic » dans chacune des catégories. Ces derniers contiennent des fonctions similaires à celle de la catégorie, mais plus précises (même si peu recommandées car l’impact sur les performances est assez élevé), ou en plus basique (donc peu recommandé du au manque de précision)

MathHealthIdInventoryLocationOrientationVectorsBlockItem

  • Chemin d’accès: Gunivers-Lib:Math/…

Les fonctions « Math », comme leur nom l’indique, servent à faire des maths. Avant que vous ne partiez en courant en vous remémorant vos cours indigestes et incompréhensibles que vous avez subit à l’école, sachez qu’ici, vous n’aurez rien besoin de calculer (en fait, c’est le but de la lib de vous simplifier la vie). Néanmoins, les fonctions de math qui suivent sont théoriques, mais c’est aussi sur elles que reposent la majorité des autres systèmes.

Si vous ne voyez pas de quoi je veux parler, dites vous qu’avec cette lib, il est facile de créer (entre autres) un raycasting (= lancement de projectiles selon l’orientation d’un joueur). Ce système repose essentiellement sur de la trigonométrie. Mais encore une fois, rien de compliqué, tout est déjà fait 😉

  • Cos: Calcul le cosinus d’un angle (en °) compris entre 0 et 360. Cette fonction prend en paramètre le score « Tmp1 » compris entre 0 et 360 (correspondant à un angle) et retourne la valeur du cosinus sur le score « Res ». Attention, le résultat est est multiplié par 1000 afin de conserver les décimaux (1 => 1000; 0,5 => 500 etc …)
  • Sin: Calcul le sinus d’un angle (en °) compris entre 0 et 360. Cette fonction prend en paramètre le score « Tmp1 » compris entre 0 et 360 (correspondant à un angle) et retourne la valeur du sinus sur le score « Res ». Attention, le résultat est est multiplié par 1000 afin de conserver les décimaux (1 => 1000; 0,5 => 500 etc …)
  • Tan: (1.12 uniquement) Calcul la tangente d’un angle (en °) compris entre 0 et 360. Cette fonction prend en paramètre le score « Tmp1 » compris entre 0 et 360 (correspondant à un angle) et retourne la valeur de la tangente sur le score « Res ». Attention, le résultat est est multiplié par 1000 afin de conserver les décimaux (1 => 1000; 0,5 => 500 etc …)
  • Arccos: (1.12 uniquement) Calcul de l’arc-cosinus d’un nombre compris entre -1000 et +1000
  • Arcsin: (1.12 uniquement) Calcul de l’arc-sinus d’un nombre compris entre -1000 et +1000
  • Arctan: (1.12 uniquement) Calcul de l’arc-tangente d’un nombre compris entre -1000 et +1000
  • Divide: (1.12 uniquement) Permet de faire une division classique (contrairement à Minecraft qui ne propose que des division euclidiennes). Par exemple, 27/10 = 3 tandis que la division de Minecraft aurait donné 27/10 = 2 (la division classique arrondi à l’entier le plus proche tandis que la division euclidienne arrondit à l’entier directement inférieure).
  • Factorial: (1.12 uniquement) Calcul le factoriel d’un nombre (5! = 5*4*3*2*1 = 120). ATTENTION: la fonction factorielle est une fonction dont la sortie évolue de façon exponentielle par rapport à son entrée. Autrement dit, les résultats peuvent très vite (au delà de 12!) dépasser la limite des nombres gérés par Minecraft (2 147 483 647 mais, pour des raisons pratiques, nous considérons que cette limite est à 1 000 000 000)
  • Pow: (1.12 uniquement) Calcul la puissance d’un nombre par un autre (ex: 2^3 = 2*2*2 = 8)
  • Sqrt: Calcul la racine carrée (Square Root) d’un nombre (ex: Sqrt(16) = 4   car   4^2 = 4*4 = 16)
  • GCD: (1.12 uniquement) Calcul le plus grand diviseur commun de deux nombres
  • Get_pow2: (1.13 uniquement) Renvois la puissance de 2 supérieur ou égale à la veleur donné en paramètre (ex: 52 renverra 64, 112 renverra 128)

  • Chemin d’accès: Gunivers-Lib:Entity/Health/…

Gestion par scoreboard de la vie d’une entité. Permet entre autre d’éviter l’écran de respawn quand un joueur meurt

  • Sethealth: Défini la vie du joueur via un scoreboard (lorsque le score est modifié, le joueur verra sa vie modifié d’autant). Cette fonction doit être exécuté en boucle pour fonctionner correctement.

ATTENTION: Cette fonction nécessite de modifier les effets d’absorption, de poison et de régénération. Si votre projet utilise ces effets, ce système risque de mal fonctionner.

  • Time to live: (1.13 uniquement) Défini un temps de vie aux entités. Par défaut, lorsque la fonction est activée, toutes les entités ont un temps de vie de 10 secondes

  • Chemin d’accès: Gunivers-Lib:Entity/Id/…

La gestion d’UID des entités permet d’identifier précisément une entité. Utile par exemple dans le cas d’un jeu de tir pour savoir qui tire sur qui.

  • SUID: (Simple Unique ID) Permet à l’entité exécutant la fonction d’obtenir un score ID différent de toutes les autres entités ayant déjà exécuté la fonction.
  • CUID: (Chain Unique ID) Permet à l’entité exécutant la fonction d’obtenir un score ID différent de toutes les autres entités ayant déjà exécuté la fonction. La différence avec GetSUID se trouve dans la façon dont les scores sont attribués. Ici, les scores ID sont attribué dynamiquement en fonction des scores disponibles, de sorte à former une chaine. Ainsi, si il y a 5 entité, elles seront numéroté de 1 à 5, sans « trou ». Pour ne pas que cette chaine puisse être rompue, il faut également exécuter la fonction UpdateCUID-Check en boucle.
  • Check: Permet de comparer les scores ID des entités avec le score « TargetID » de l’entité ayant exécuté la fonction. Cette dernière recoit le tag « IdChecker ». Quand aux autres entités, elles recoivent « IdUpper » si leur ID est supérieur, « IdLower » si leur score ID est inférieur et « IdMatch » si le ID est égale au score « TargetID » de l’entité ayant exécuté la fonction.

  • Chemin d’accès: Gunivers-Lib:Entity/Inventory/…

Les fonction d’inventaire permettent de manipuler plus facilement l’inventaire d’un joueur.

  • ActiveSlot: Récupère le slot actif du joueur dans le score « ActiveSlot » (de 0 à 8).
  • IsOffHand: Détecte si le joueur possède quelque chose dans sa deuxième main. Si c’est le cas, ce dernier reçoit le tag « IsOffHand ».

  • Chemin d’accès: Gunivers-Lib:Entity/Location/…

Les fonctions « Location » permettent de gérer la position des entités via des scores. Il est ainsi possible de détecter la position d’une entité ou bien de placer cette dernière à une position définie par un score.

  • Get: Détecte la position de l’entité (coordonnées) et stock les valeurs sur les scores « LocX », « LocY » et « LocZ ».
  • GetDistanceToTargetID: Calcul la distance en nombre de blocs séparent l’entité exécutant la fonction de celle qui possède l’identifiant visé (voir les fonctions « Id »)
  • RelativeToTargetID: Après avoir calculer les coordonnées absolues avec la fonction Get, il est possible d’avoir les coordonnées relative à un entité visée via un ID (voir les fonctions « Id »).
  • Set: Permet de placer l’entité à une coordonnée précise (donnée via un scoreboard).
  • Biome: Détecte le biome dans lequel se situe l’entité et le stock dans le score « Biome » (voir liste des Biomes sur le ReadMe.txt).

  • Chemin d’accès: Gunivers-Lib:Entity/Orientation/…
  • Get: Détecte l’orientation d’une entité et la stock sur les scores « Phi » et « Theta », correspondant respectivement aux angles formés sur le plan horizontal et vertical par l’orientation de l’entité.
  • Set: Permet d’orienter l’entité selon ses scores « Phi » et « Theta ».
  • GetPhiByVector & GetThetaByVector: Calcul les angles Phi et Theta formés par le vecteur de l’entité (voir l’onglet « Vectors » ci-dessous). Cela permet entre autre de faire correspondre la visée de l’entité avec son sens de déplacement.
    Ces fonctions ont été séparées car ellefont intervenir de lourds calculs pouvant faire ralentir votre ordinateur et/ou votre serveur.
  • RelativeToTargetID: Calcul la différence d’orientation entre l’entité exécutant la fonction avec l’entité visée par le score ID (voir les fonctions Id).
  • Rotate: Permet de faire tourner de façon continue l’orientation de l’entité via 2 variables (correspondant à une vitesse angulaire sur Phi et sur Theta) données en paramètre.

  • Chemin d’accès: Gunivers-Lib:Entity/Vectors/…

Les vecteurs servent à définir la trajectoire d’une entité. Ainsi, ils permettent de gérer des projectiles facilement, en offrant la possibilité de faire subir des collision, d’imiter la gravité, le vent etc …

  • GetByOrientation: Calcul le vecteur de déplacement de l’entité selon son orientation (Phi et Theta). Ce vecteur est composée de 3 vecteurs élémentaires « VectorX », « VectorY » et « VectorZ » (compris chacun entre -1000 et 1000) et d’un coefficient de vitesse « VectorSpeed » (1000 = 1 bloc/tick).
  • GetByTargetID: Calcul un vecteur allant de l’entité source à l’entité cible. La cible sera alors l’entité la plus proche possédant le score « ShooterId » égal au score « TargetId » de l’entité source.
  • RelativeToTargetID: Permet de calculer la différence de vecteurs (aussi appelée vecteur d’éloignement) entre l’entité exécutant la fonction avec l’entité visée par le score ID (voir les fonctions Id).
  • Addition: Calcul la somme de deux vecteurs.
  • Normalize: Normalise les vecteurs de l’entité (les ramène à des valeurs comprises entre -X et X sur chaque axe en conservant les proportions). X est définit via un score passé en paramètre.
  • Move: Permet de mettre en mouvement l’entité selon son vecteur sur chacun des axes. Un vecteur de 1000 sur un axe entraînera un déplacement d’un bloc à chaque exécution de la fonction. La somme des mouvements sur chacun des axes donnera un mouvement dans l’espace (donc en 3 dimensions), correspondant au vecteur global de l’entité.

ATTENTION: Ce système n’a aucune limite de vitesse, mais plus l’entité se déplacera vite, plus le système demandera des ressources importantes.

Les collisions sont intégrés à ce système et sont très fiables. Ne s’active que lorsque l’entité possède un score Collision supérieur à 1 (chaque valeur correspond à un type de collision).

  • SimpleMove: Permet de mettre en mouvement l’entité selon son vecteur. Un vecteur de 1000 sur un axe entrainera un déplacement d’un bloc à chaque exécution de la fonction. La somme des mouvements sur chacun des axes donnera un mouvement dans l’espace (donc en 3 dimensions), correspondant au vecteur global de l’entité.Les collisions ne sont pas intégré à ce système mais peuvent être activé à part entière grâce à la fonction « SimpleCollision ». Cependant, ces collisions ne sont pas très fiables. Il est donc recommandé de les utilisé dans des lieux préentant des formes géométriques simples (murs sans trou ni reliefs).

ATTENTION: Ce système est optimisé mais ne gère pas les vitesses au delà de 4000 (4 blocs par tick) ni en deçà de -4000.

  • Collisions: Permet à l’entité de subir des collisions selon son vecteur de déplacement.

ATTENTION: Cette fonction est appelée par la fonction Move et n’a que très peu d’utilité en dehors de cette dernière.

  • SimpleCollisions: Permet à l’entité de subir des collisions selon son vecteur de déplacement.

ATTENTION: Ce système n’est pas très fiable mais il est compatible (et indépendant) avec le système de mise en mouvement de base. Ce système n’est efficace que lorsque l’entité possède un score Collision supérieur à 1 (chaque valeur correspond à un type de collision).

  • Chemin d’accès: Gunivers-Lib:Object/Block/…

Les fonctions « block » permettent d’interagir avec l’environnement.

  • Get: Détecte le bloc présent à l’endroit où la fonction est exécuté. L’ID du bloc ainsi que sont « damage » sont ainsi stocké dans des scores.
  • Set: Pose un bloc à l’endroit où la fonction est exécuté. Le bloc ainsi que son « damage » correspondront à ceux donné via des scores.
  • SetFallingBlock: Créer un FallingBlock à l’endroit où la fonction est exécuté. Le bloc correspondra à celui donné via un score.

A sa création, le FallingBlock possède les NBT suivant: NoGravity:1,Time:1,Data:0,DropItem:0

  • Chemin d’accès: Gunivers-Lib:Object/Item/…

Les fonctions « block » permettent d’interagir avec les différents items de la map.

  • Get: Détecte l’item sur lequel la fonction est exécuté. L’ID de l’item ainsi que sont « damage » sont ainsi stocké dans des scores (sur l’item).
  • Set: Fait apparaître un item à l’endroit où la fonction est exécuté. L’item ainsi que son « damage » correspondront à ceux donné via des scores.
  • GetMainHand: Détecte l’item présent dans la main principale de l’entité laquelle la fonction est exécuté. L’ID de l’item ainsi que sont « damage » sont ainsi stocké dans des scores (sur l’entité).
  • GetOffHand: Détecte l’item présent dans la main secondaire de l’entité laquelle la fonction est exécuté. L’ID de l’item ainsi que sont « damage » sont ainsi stocké dans des scores (sur l’entité).
  • GetHead: Détecte l’item présent sur la tête de l’entité laquelle la fonction est exécuté. L’ID de l’item ainsi que sont « damage » sont ainsi stocké dans des scores (sur l’entité).
  • SetMainHand: Place un item dans la main principale de l’entité laquelle la fonction est exécuté. L’ID de l’item ainsi que sont « damage » correspondront à celui donné via des scores.
  • SetOffHand: Place un item dans la main secondaire de l’entité laquelle la fonction est exécuté. L’ID de l’item ainsi que sont « damage » correspondront à celui donné via des scores.
  • SetHead: Place un item sur la tête de l’entité laquelle la fonction est exécuté. L’ID de l’item ainsi que sont « damage » correspondront à celui donné via des scores.

Dans « Gunivers-Lib:Utils/Lists/… » vous aurez accès aux liste des:

  • Entités
  • Items
  • Biomes
  • Stats (objectifs de scoreboard)

Pratique si vous êtes un développer et que vous souhaiter créer vos propres fonctions 😉

Et pour les constructeurs ?

Pas de panique ! Le but de cette librairie n’est pas de rassembler que des fonctions, mais aussi des structures pré-construites, comme des rochers, des arbres, des maisons ou autre constructions qui reviennent souvent dans différentes maps. Le but est de permettre aux constructeurs de passer moins de temps sur des choses banales, et ainsi se concentrer sur l’essentiel.

Pour le moment (en 1.12), les datapacks ne sont pas encore été ajouté au jeu limitant cette librairie aux fonctions de développement. Revenez donc après la 1.13 pour découvrir les structure. Par ailleurs, si vous souhaitez participer, on vous attends sur notre serveur Discord !

Liste des éléments (1.13)

TreesUtils

Chemin d’accès: gunivers-lib:trees/…

Vous trouverez ici différents pack d’arbres permettant de réaliser différentes forêt ou décors naturels sur vos maps.

Pack 1

Exemple d’utilisation: gunivers-lib:trees/dead_spruce_3

La catégorie « utils » contient toute les structures utilisés par les systèmes de la lib. Vous ne devez donc pas la modifier ! (Mieux vaut prévenir que guérir)

Et pour les graphistes et modélisateurs ?

Vous aussi vous aurez le droit à votre lot de cadeaux ! En effet, plusieurs ressource-packs seront à disposition contenant, des textures de tous types, tout plein de chapeaux 3D et autres modèles et textures. Vous n’aurez qu’a vous balader au milieu de tout ça pour trouver votre bonheur !

Tout comme pour les structures, les ressource-packs n’arriveront que dans les versions 1.13 de la librairie (ils seront ainsi intégré aux datapacks

Trailer

Crédits

  • LeiRoF: Concept & développement
  • Théogiraudet/Oromis: Développement
  • Luludatra: Développement
  • KubbyDev: Développement
  • TheTagMen: Construction

Téléchargement

Si vous utilisez cette librairie dans une création publique, merci de renseigner Gunivers dans les crédits de cette dernière. Ce projet étant gratuit, c’est un moindre remerciement.

Gunivers-Lib 1.13-1 (STABLE)

Installation

  • Versions stables: Décompressez l’archive et placez le dossier « Gunivers-Lib » dans le répertoire « data/function » présent dans celui de votre monde. Retournez sur votre jeu dans le monde en question et entre « /reload » dans le chat.
  • Version de développement: L’archive contiendra un dossier « Gunivers-Lib-master » ou « Gunivers-Lib-1.12 ». Renommez le en « Gunivers-Lib » puis installez le de la même façon que pour les versions stables.

Le projet étant en cours de développement, il est mis à jour régulièrement. Les liens de téléchargement « stable » sont mis à jour à chaque nouvelle version testée et validée, tandis que le lien vers la version de développement est automatiquement mis à jour (instantanément, dès qu’on fait quelque chose, vous le voyez. C’est beau la technologie). N’hésitez pas à nous dire sur notre discord si vous avez des suggestion ou autre idées a apporter à ce projet.

LeiRoF

Hey ! Moi c'est LeiRoF (Vincent de mon vrai nom), j'ai 21 ans, je suis étudiant en license de Physique-Chimie, j'ai créé Gunivers et je développe tout ce qui me passe par la tête dans mes heures perdues. Bref, j'aime bien la quiche. Des questions ?

1 réponse

  1. 25 janvier 2018

    […] Lien Original […]

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

Aller à la barre d’outils