Bibliotecas Auxiliares
Utilizamos várias bibliotecas auxiliares como dependências para nossos componentes principais.
Publicamos as nossas bibliotecas usando o JitPack!
JitPack.io é um serviço de repositório de pacotes que permite o compartilhamento e distribuição fácil de bibliotecas Java compilando o código-fonte de repositórios Git sob demanda.
O processo para publicar uma nova versão consiste em criar uma tag com o nome como a versão do componente e fazer push.
É necessário adicionar esta declaração de repositório ao seu projeto para usá-lo:
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
MMO Core
MMOCore é um componente fundamental do projeto, é uma biblioteca que fornece uma implementação abstrata do mecanismo de rede.
É usado tanto no Servidor de Login quanto no Servidor de Jogo para enviar/receber dados para/de clientes,
há dois (principais) métodos para cifrar/decifrar que devem ser implementados no servidor de jogo.
O tratamento do buffer é feito na classe SelectorThread
.
Estamos usando uma arquitetura não bloqueante multiplexada de um único thread para entrada/saída mais um grupo de threads para processar pacotes recebidos. DrHouse
<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-mmocore</artifactId>
<version>2.6.5.0</version>
</dependency>
Discussão sobre Asynchronous I/O, Multi-threaded MMOCore e aqui.
L2J Geo Driver
É a implementação padrão do Motor de Geodados.
<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-geo-driver</artifactId>
<version>2.6.5.0</version>
</dependency>
L2J Commons
É uma biblioteca de utilidade que contém várias classes que resolvem uma variedade de problemas dentro do servidor de login e do servidor de jogo.
<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-commons</artifactId>
<version>2.6.7.0</version>
</dependency>
Serviço UPnP
Universal Plug and Play (UPnP) é um conjunto de protocolos de rede que permite que dispositivos numa rede local descubram e se comuniquem automaticamente entre si. Simplifica a conectividade e configuração de dispositivos. UPnP também pode ser usado para encaminhamento de portas, o que permite acesso remoto a dispositivos atrás de um roteador. Com UPnP, dispositivos podem solicitar ao roteador criar e gerenciar automaticamente regras de encaminhamento de portas, eliminando a necessidade de configuração manual do roteador. Isso facilita para os usuários habilitarem acesso remoto a seus dispositivos sem exigir amplo conhecimento de redes ou procedimentos de configuração complexos.
Habilitado por padrão.
Fábrica de Conexões e Pool de Conexões
O L2J Server utiliza o JDBC simples (Java Database Connectivity), pode melhorar o desempenho em relação à frameworks de nível superior como JPA (Java Persistence API) ou outras opções porque oferece acesso direto e de baixo nível ao banco de dados, permitindo um controle detalhado e otimização das consultas SQL, estratégias de obtenção de dados e recursos específicos do banco de dados.
O L2J Server utiliza um pool de conexões para gerenciar um conjunto de conexões com o banco de dados, permitindo que o servidor reutilize e compartilhe conexões com um banco de dados. Isso ajuda a melhorar o desempenho e a escalabilidade, reduzindo o overhead de estabelecer novas conexões com o banco de dados para cada solicitação.
Por padrão, o L2J Server utiliza o HikariCP, uma biblioteca de pool de conexões JDBC de alto desempenho para aplicativos Java. O HikariCP oferece várias características que o tornam uma escolha popular para pooling de conexões, incluindo tamanho leve, baixa latência, alto throughput e gerenciamento automático de conexões.
Motor Blowfish
O algoritmo Blowfish é um cifrador de bloco simétrico que opera em blocos de dados e utiliza uma chave de comprimento variável. Foi projetado por Bruce Schneier em 1993 e é conhecido por sua flexibilidade e segurança.
Os métodos tryEncryptBlock e tryDecryptBlock realizam verificação de erros para garantir que os buffers de entrada e saída tenham tamanho suficiente. Os métodos encryptBlock e decryptBlock realmente realizam as operações de criptografia e descriptografia nos blocos de dados usando o algoritmo Blowfish.
Utils
HexUtils
A classe HexUtils é uma classe de utilidade que fornece métodos para converter dados em representações de caracteres hexadecimais e realizar operações relacionadas, como gerar despejos hexadecimais. Inclui funções para converter bytes e inteiros nas suas representações hexadecimais, gerar despejos hexadecimais de matrizes de bytes e converter matrizes de bytes em caracteres ASCII.
IPv4Filter
Esta classe é uma implementação de um filtro IPv4 que permite ou nega conexões com base na proteção contra inundação para endereços IP específicos.
Rnd
Rnd fornece funcionalidade de geração de números aleatórios. Oferece diferentes tipos de geradores de números aleatórios com base no RandomType especificado.
Os tipos disponíveis são:
- SECURE: usa SecureRandom para a melhor qualidade aleatória.
- UNSECURE_ATOMIC: usa java.util.Random para qualidade aleatória média.
- UNSECURE_THREAD_LOCAL: usa ThreadLocalRandom para velocidade de acesso paralelo. Cada thread tem sua própria instância aleatória.
- UNSECURE_VOLATILE: usa NonAtomicRandom para uma velocidade de acesso paralelo mais rápida. Pode gerar a mesma semente para dois threads.
Util
A classe contém vários métodos estáticos que oferecem diferentes funcionalidades.
Aqui está um resumo dos métodos fornecidos pela classe Util:
isInternalHostname(String host)
: Este método verifica se um nome de host é interno, verificando se é um endereço local do site ou um endereço de loopback.printData(byte[] data, int len)
: Este método gera uma representação hexadecimal de uma matriz de bytes. Ele leva a matriz de bytes e o comprimento dos dados a serem representados e retorna a representação hexadecimal como uma string.printData(byte[] data)
: Este método é uma abreviação para printData(byte[] data, int len) e imprime toda a matriz de bytes no formato hexadecimal.printData(ByteBuffer buf)
: Este método representa os bytes restantes de um ByteBuffer como uma string hexadecimal.generateHex(int size)
: Este método gera uma sequência aleatória de bytes do tamanho especificado e a retorna como uma matriz de bytes.getStackTrace(Throwable t)
: Este método recebe um objeto Throwable e retorna a sua pilha de rastreamento como uma string.replaceIllegalCharacters(String str)
: Este método substitui a maioria dos caracteres inválidos numa string por um caractere de sublinhado.isValidFileName(String name)
: Este método verifica se um nome de arquivo é válido criando um objeto File com o nome fornecido e verificando se ele pode recuperar o seu caminho canônico sem lançar uma exceção.splitWords(String input)
: Este método divide palavras numa string inserindo um espaço entre uma letra minúscula seguida de uma letra maiúscula.getNextClosestDateTime(DayOfWeek[] daysOfWeek, int hour, int min)
: Este método calcula a data mais próxima ou a mesma mais próxima a partir dos dias da semana especificados na hora e no minuto especificados.getNextClosestDateTime(List<DayOfWeek> daysOfWeek, int hour, int min)
: Esta é uma versão sobrecarregada do método anterior que aceita uma lista de objetos DayOfWeek em vez de uma matriz.mapToFunction(Map<K, V> map)
: Este método converte um mapa numa função, onde a função retorna o valor associado a uma chave específica no mapa.parseArg(String[] args, String arg, boolean hasArgValue)
: Este método analisa um argumento dado dos argumentos do programa Java. Ele pode recuperar o argumento em si ou o seu valor, se especificado.randomPassword(int length)
: Este método gera uma senha aleatória do comprimento especificado. A senha contém uma combinação de caracteres minúsculos, maiúsculos e dígitos.