Bibliothèques auxiliaires (Auxiliary Libraries)
Nous utilisons plusieurs bibliothèques auxiliaires comme dépendances pour nos composants principaux.
Nous publions nos bibliothèques via JitPack !
JitPack.io est un service de dépôt de paquets qui permet de partager et de distribuer facilement des bibliothèques Java en construisant le code source à partir de dépôts Git à la demande.
Le processus de publication d'une nouvelle version consiste à créer un nouveau tag avec le nom de la version et à le pousser vers le dépôt.
Pour l'utiliser, vous devez ajouter la déclaration de dépôt à votre projet :
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
MMO Core
MMOCore est le fondement de ce projet. C'est une bibliothèque qui fournit une implémentation abstraite du moteur réseau. Elle est utilisée à la fois par le serveur de connexion (Login Server) et le serveur de jeu (Game Server) pour envoyer/recevoir des données vers/depuis les clients de jeu. Deux méthodes (principales) de codage et de décodage des données doivent être implémentées du côté du serveur de jeu. La gestion de la mise en mémoire tampon des données est effectuée dans la classe SelectorThread.
Nous utilisons une architecture non bloquante, multiplexée et mono-thread pour les opérations d'entrée/sortie (In/Out), ainsi qu'un nouveau pool de threads pour traiter les paquets reçus. —— DrHouse
<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-mmocore</artifactId>
<version>2.6.5.0</version>
</dependency>
Discussion concernant les E/S asynchrones, MMOCore multi-threadé et ici.
L2J Geo Driver
C'est l'implémentation standard du moteur Geodata.
<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-geo-driver</artifactId>
<version>2.6.5.0</version>
</dependency>
L2J Commons
C'est une bibliothèque d'utilitaires contenant de nombreuses classes qui résolvent divers problèmes tant dans le Login Server que dans le Game Server.
<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-commons</artifactId>
<version>2.6.7.0</version>
</dependency>
Service UPnP
Universal Plug and Play (UPnP) est un ensemble de protocoles réseau qui permet aux appareils d'un réseau local de se découvrir automatiquement et de communiquer entre eux. Il simplifie la configuration des appareils et leur connexion mutuelle. L'UPnP peut également être utilisé pour la redirection de ports (port forwarding), permettant un accès distant aux appareils situés derrière un routeur. Avec l'UPnP, les appareils peuvent demander au routeur de créer et de gérer automatiquement les règles de redirection de ports, éliminant ainsi le besoin de configuration manuelle du routeur. Cela permet aux utilisateurs d'accéder plus facilement à leurs appareils à distance sans nécessiter de connaissances avancées en réseau ou de procédures de configuration complexes.
Activé par défaut.
Fabrique de connexions (Connection Factory) et pool de connexions (Connection Pool)
L2J Server utilise du code JDBC (Java Database Connectivity) brut. Cela peut améliorer les performances par rapport aux frameworks de haut niveau tels que JPA (Java Persistence API) ou d'autres options, car il offre un accès direct et bas niveau à la base de données, permettant un contrôle granulaire et une optimisation des requêtes SQL, des stratégies de récupération de données et des fonctionnalités spécifiques à la base de données.
L2J Server utilise un pool de connexions (Connection Pool) pour gérer les connexions à la base de données, permettant au serveur de réutiliser et de partager les connexions. Cela aide à améliorer les performances et l'extensibilité en réduisant le coût de l'établissement d'une nouvelle connexion à la base de données pour chaque requête.
Par défaut, L2J Server utilise HikariCP, une bibliothèque de pool de connexions JDBC haute performance pour les applications Java. HikariCP offre de nombreuses fonctionnalités qui en font un choix populaire, notamment une faible empreinte mémoire, une faible latence, un débit élevé et une gestion automatique des connexions.
Moteur Blowfish
L'algorithme Blowfish est un chiffrement symatrique par blocs qui opère sur des blocs de données en utilisant une clé de longueur variable. Il a été conçu en 1993 par Bruce Schneier et est reconnu pour sa flexibilité et son haut niveau de sécurité.
Les méthodes tryEncryptBlock et tryDecryptBlock effectuent des vérifications d'erreurs pour s'assurer que les tampons d'entrée et de sortie ont une taille suffisante. Les méthodes encryptBlock et decryptBlock réalisent les opérations réelles de chiffrement et de déchiffrement des blocs de données en utilisant l'algorithme Blowfish.
Utilitaires (Utility Classes)
HexUtils
La classe HexUtils est une classe d'utilitaires fournissant des méthodes pour convertir des données en représentations hexadécimales et effectuer des opérations connexes, comme la création de vidages hexadécimaux (hex dumps). Elle inclut des fonctions pour convertir des octets et des entiers en leurs formes hexadécimales, générer des vidages hexad écimaux à partir de tableaux d'octets et convertir des tableaux d'octets en caractères ASCII.
IPv4Filter
Cette classe est une implémentation de filtre IPv4 qui autorise ou refuse des connexions en fonction de la protection contre les inondations (flood protection) pour des adresses IP spécifiques.
Rnd
Rnd fournit des fonctionnalités pour générer des nombres aléatoires. Il fournit différents types de générateurs de nombres aléatoires selon le RandomType spécifié.
Les types disponibles sont :
- SECURE : utilise
SecureRandompour une qualité d'aléa optimale. - UNSECURE_ATOMIC : utilise
java.util.Randompour une qualité d'aléa moyenne. - UNSECURE_THREAD_LOCAL : utilise
ThreadLocalRandompour la rapidité d'accès concurrent. Chaque thread possède sa propre instance de générateur. - UNSECURE_VOLATILE : utilise
NonAtomicRandompour un accès concurrent encore plus rapide. Il y a une chance de générer la même graine (seed) pour deux threads.
Util
Cette classe contient de nombreuses méthodes statiques fournissant diverses fonctionnalités.
Voici un résumé des méthodes fournies par la classe Util :
isInternalHostname(String host): cette méthode vérifie si un nom d'hôte est interne en vérifiant s'il s'agit d'une adresse locale ou d'une adresse de bouclage (loopback).printData(byte[] data, int len): cette méthode génère une représentation hexadécimale d'un tableau d'octets. Elle prend un tableau d'octets et la longueur des données à afficher, puis renvoie la représentation hexadécimale sous forme de chaîne de caractères (String).printData(byte[] data): un raccourci pourprintData(byte[] data, int len), affichant l'intégralité du tableau d'octets sous forme hexadécimale.printData(ByteBuffer buf): cette méthode représente les octets restants d'un objetByteBuffersous forme de chaîne hexadécimale.generateHex(int size): cette méthode génère une séquence aléatoire d'octets de la taille spécifiée et la renvoie sous forme de tableau d'octets.getStackTrace(Throwable t): cette méthode prend un objetThrowableet renvoie sa trace de pile (stack trace) sous forme de chaîne de caractères.replaceIllegalCharacters(String str): cette méthode remplace la plupart des caractères illégaux d'une chaîne par un soulignement.isValidFileName(String name): cette méthode vérifie la validité d'un nom de fichier en essayant de créer un objetFileavec le nom donné et en vérifiant si son chemin canonique peut être récupéré sans lever d'exception.splitWords(String input): cette méthode sépare les mots d'une chaîne en insérant un espace entre une minuscule et la majuscule suivante.getNextClosestDateTime(DayOfWeek[] daysOfWeek, int hour, int min): cette méthode calcule la date et l'heure les plus proches ou les plus éloignées parmi les jours de la semaine fournis, pour l'heure et la minute spécifiées.getNextClosestDateTime(List<DayOfWeek> daysOfWeek, int hour, int min): une version surchargée de la méthode précédente, acceptant une liste d'objetsDayOfWeekau lieu d'un tableau.mapToFunction(Map<K, V> map): cette méthode convertit une mappe en fonction, où la fonction renvoie la valeur associée à une clé donnée dans la mappe.parseArg(String[] args, String arg, boolean hasArgValue): cette méthode analyse l'argument donné à partir des arguments du programme Java. Elle peut renvoyer soit l'argument lui-même, soit sa valeur si elle est fournie.randomPassword(int length): cette méthode génère un mot de passe aléatoire de la longueur spécifiée. Le mot de passe contient une combinaison de lettres minuscules, majuscules et de chiffres.