Bibliotecas Auxiliares
Utilizamos varias bibliotecas auxiliares como dependencias para nuestros componentes principales.
¡Publicamos nuestras bibliotecas usando JitPack!
JitPack.io es un servicio de repositorio de paquetes que permite compartir y distribuir fácilmente bibliotecas de Java compilando el código fuente desde repositorios Git bajo demanda.
El proceso para publicar una nueva versión consiste en crear una nueva etiqueta con el nombre como la versión del componente y hacer push.
Es necesario agregar esta declaración de repositorio a tu proyecto para usarlo:
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
MMO Core
MMOCore es un componente fundamental del proyecto, es una biblioteca que proporciona una implementación abstracta del motor de red.
Se utiliza tanto en el Servidor de Inicio de Sesión como en el Servidor de Juego para enviar/recibir datos hacia/desde los clientes,
hay dos (principales) métodos para cifrar/descifrar que deben implementarse en el servidor de juego.
El manejo del búfer se realiza en la clase SelectorThread
.
Estamos utilizando una arquitectura no bloqueante multiplexada de un solo hilo para entrada/salida más un grupo de hilos para procesar paquetes recibidos. DrHouse
<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-mmocore</artifactId>
<version>2.6.5.0</version>
</dependency>
Discusión sobre Asynchronous I/O, Multi-threaded MMOCore y aquí.
L2J Geo Driver
Es la implementación predeterminada del Motor de Geodatos.
<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-geo-driver</artifactId>
<version>2.6.5.0</version>
</dependency>
L2J Commons
Es una biblioteca de utilidades que contiene varias clases que resuelven una variedad de problemas dentro del servidor de inicio de sesión y del servidor de juego.
<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-commons</artifactId>
<version>2.6.7.0</version>
</dependency>
Servicio UPnP
Universal Plug and Play (UPnP) es un conjunto de protocolos de red que permite que los dispositivos en una red local descubran y se comuniquen automáticamente entre sí. Simplifica la conectividad y configuración de dispositivos. UPnP también se puede utilizar para el reenvío de puertos, lo que permite el acceso remoto a dispositivos detrás de un enrutador. Con UPnP, los dispositivos pueden solicitar al enrutador que cree y administre automáticamente reglas de reenvío de puertos, eliminando la necesidad de configuración manual del enrutador. Esto facilita que los usuarios habiliten el acceso remoto a sus dispositivos sin necesidad de conocimientos extensos de redes o procedimientos de configuración complejos.
Habilitado de forma predeterminada.
Fábrica de Conexiones y Pool de Conexiones
L2J Server utiliza JDBC simple (Java Database Connectivity), puede mejorar el rendimiento sobre frameworks de nivel superior como JPA (Java Persistence API) u otras opciones porque proporciona acceso directo y de bajo nivel a la base de datos, lo que permite un control detallado y optimización de las consultas SQL, estrategias de obtención de datos y características específicas de la base de datos.
L2J Server utiliza un pool de conexiones para gestionar un conjunto de conexiones a la base de datos, lo que permite al servidor reutilizar y compartir conexiones a una base de datos. Ayuda a mejorar el rendimiento y la escalabilidad al reducir el sobrecoste de establecer nuevas conexiones a la base de datos para cada solicitud.
De forma predeterminada, L2J Server utiliza HikariCP, una biblioteca de pool de conexiones JDBC de alto rendimiento para aplicaciones Java. HikariCP ofrece varias características que lo convierten en una opción popular para la agrupación de conexiones, incluido un tamaño reducido, baja latencia, alto rendimiento y gestión automática de conexiones.
Motor Blowfish
El algoritmo Blowfish es un cifrado de bloque simétrico que opera en bloques de datos y utiliza una clave de longitud variable. Fue diseñado por Bruce Schneier en 1993 y es conocido por su flexibilidad y seguridad.
Los métodos tryEncryptBlock y tryDecryptBlock realizan comprobaciones de errores para garantizar que los búferes de entrada y salida tengan un tamaño suficiente. Los métodos encryptBlock y decryptBlock realmente realizan las operaciones de cifrado y descifrado en los bloques de datos utilizando el algoritmo Blowfish.
Utils
HexUtils
La clase HexUtils es una clase de utilidad que proporciona métodos para convertir datos en representaciones de caracteres hexadecimales y realizar operaciones relacionadas, como generar volcados hexadecimales. Incluye funciones para convertir bytes e enteros en sus representaciones hexadecimales, generar volcados hexadecimales de matrices de bytes y convertir matrices de bytes en caracteres ASCII.
IPv4Filter
Esta clase es una implementación de un filtro IPv4 que permite o niega conexiones basadas en la protección contra inundaciones para direcciones IP específicas.
Rnd
Rnd proporciona funcionalidad de generación de números aleatorios. Ofrece diferentes tipos de generadores de números aleatorios según el RandomType especificado.
Los tipos disponibles son:
- SECURE: Utiliza SecureRandom para la mejor calidad aleatoria.
- UNSECURE_ATOMIC: Utiliza java.util.Random para una calidad aleatoria promedio.
- UNSECURE_THREAD_LOCAL: Utiliza ThreadLocalRandom para velocidad de acceso paralelo. Cada hilo tiene su propia instancia aleatoria.
- UNSECURE_VOLATILE: Utiliza NonAtomicRandom para una velocidad de acceso paralelo más rápida. Puede generar la misma semilla para dos hilos.
Util
La clase contiene varios métodos estáticos que ofrecen diferentes funcionalidades.
Aquí hay un resumen de los métodos proporcionados por la clase Util:
isInternalHostname(String host)
: Este método verifica si un nombre de host es interno verificando si es una dirección de sitio local o una dirección de bucle de retorno.printData(byte[] data, int len)
: Este método genera una representación hexadecimal de una matriz de bytes. Toma la matriz de bytes y la longitud de los datos a representar y devuelve la representación hexadecimal como una cadena.printData(byte[] data)
: Este método es una forma abreviada para printData(byte[] data, int len) e imprime toda la matriz de bytes en formato hexadecimal.printData(ByteBuffer buf)
: Este método representa los bytes restantes de un ByteBuffer como una cadena hexadecimal.generateHex(int size)
: Este método genera una secuencia aleatoria de bytes del tamaño especificado y la devuelve como una matriz de bytes.getStackTrace(Throwable t)
: Este método toma un objeto Throwable y devuelve su traza de pila como una cadena.replaceIllegalCharacters(String str)
: Este método reemplaza la mayoría de los caracteres no válidos en una cadena con un carácter de subrayado.isValidFileName(String name)
: Este método verifica si un nombre de archivo es válido creando un objeto File con el nombre dado y verificando si puede recuperar su ruta canónica sin lanzar una excepción.splitWords(String input)
: Este método divide palabras en una cadena insertando un espacio entre una letra minúscula seguida de una letra mayúscula.getNextClosestDateTime(DayOfWeek[] daysOfWeek, int hour, int min)
: Este método calcula la fecha próxima o la más cercana desde los días de la semana especificados en la hora y el minuto especificados.getNextClosestDateTime(List<DayOfWeek> daysOfWeek, int hour, int min)
: Esta es una versión sobrecargada del método anterior que acepta una lista de objetos DayOfWeek en lugar de una matriz.mapToFunction(Map<K, V> map)
: Este método convierte un mapa en una función, donde la función devuelve el valor asociado con una clave dada en el mapa.parseArg(String[] args, String arg, boolean hasArgValue)
: Este método analiza un argumento dado de los argumentos del programa Java. Puede recuperar el argumento en sí o su valor si se especifica.randomPassword(int length)
: Este método genera una contraseña aleatoria de la longitud especificada. La contraseña contiene una combinación de caracteres en minúsculas, mayúsculas y dígitos.