Direkt zum Inhalt

Hilfsbibliotheken (Auxiliary Libraries)

Wir verwenden mehrere Hilfsbibliotheken als Abhängigkeiten für unsere Hauptkomponenten.

Wir veröffentlichen unsere Bibliotheken über JitPack!

JitPack.io ist ein Paket-Repository-Dienst, der das einfache Teilen und Verteilen von Java-Bibliotheken ermöglicht, indem er Quellcode aus Git-Repositories on-demand baut.

Der Prozess zur Veröffentlichung einer neuen Version besteht darin, einen neuen Tag mit dem Namen der Komponentenversion zu erstellen und diesen zu pushen.

Es ist erforderlich, diese Repository-Deklaration zu Ihrem Projekt hinzuzufügen, um es zu verwenden:

<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>

MMO Core

MMOCore ist eine grundlegende Komponente des Projekts. Es ist eine Bibliothek, die eine abstrakte Implementierung der Netzwerk-Engine bereitstellt. Sie wird vom Login-Server und dem Game-Server verwendet, um Daten von/an Clients zu senden/empfangen. Es gibt zwei (Haupt-)Methoden zum Ver- und Entschlüsseln, die auf dem Game-Server implementiert werden sollten. Die Pufferbehandlung erfolgt in der Klasse SelectorThread.

Wir verwenden eine nicht-blockierende, multiplexte Single-Thread-Architektur für In/Out sowie einen Thread-Pool zur Verarbeitung empfangbarer Pakete. —— DrHouse

<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-mmocore</artifactId>
<version>2.6.5.0</version>
</dependency>

Diskussion über Asynchronous I/O, Multi-threaded MMOCore und hier.

L2J Geo Driver

Dies ist die Standardimplementierung der Geodata-Engine.

<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-geo-driver</artifactId>
<version>2.6.5.0</version>
</dependency>

L2J Commons

Dies ist eine Utility-Bibliothek, die mehrere Klassen enthält, die eine Vielzahl von Problemen im Login- und Game-Server lösen.

<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-commons</artifactId>
<version>2.6.7.0</version>
</dependency>

UPnP-Dienst

Universal Plug and Play (UPnP) ist eine Reihe von Netzwerkprotokollen, die es Geräten in einem lokalen Netzwerk ermöglichen, sich automatisch gegenseitig zu entdecken und miteinander zu kommunizieren. Es vereinfacht die Gerätekonnektivität und -konfiguration. UPnP kann auch für die Portweiterleitung verwendet werden, was den Fernzugriff auf Geräte hinter einem Router ermöglicht. Mit UPnP können Geräte den Router auffordern, automatisch Portweiterleitungsregeln zu erstellen und zu verwalten, wodurch die manuelle Router-Konfiguration entfällt. Dies erleichtert es Benutzern, den Fernzugriff auf ihre Geräte zu aktivieren, ohne umfangreiche Netzwerkkenntnisse oder komplexe Einrichtungsverfahren zu benötigen.

Info

Standardmäßig aktiviert.

Connection Factory und Connection Pool

L2J Server verwendet einfaches JDBC (Java Database Connectivity). Es kann die Leistung gegenüber High-Level-Frameworks wie JPA (Java Persistence API) oder anderen Optionen verbessern, da es einen direkten und Low-Level-Zugriff auf die Datenbank bietet, was eine feingranulare Steuerung und Optimierung von SQL-Abfragen, Datenabrufstrategien und datenbankspezifischen Funktionen ermöglicht.

L2J Server verwendet einen Connection Pool, um einen Pool von Datenbankverbindungen zu verwalten, wodurch der Server Verbindungen zu einer Datenbank wiederverwenden und teilen kann. Dies hilft, die Leistung und Skalierbarkeit zu verbessern, indem der Overhead für den Aufbau neuer Datenbankverbindungen für jede Anfrage reduziert wird.

Standardmäßig verwendet L2J Server HikariCP, eine leistungsstarke JDBC-Connection-Pool-Bibliothek für Java-Anwendungen. HikariCP bietet mehrere Funktionen, die es zu einer beliebten Wahl für das Connection Pooling machen, darunter eine geringe Speicherauslastung, niedrige Latenz, hoher Durchsatz und automatisches Verbindungsmanagement.

Blowfish-Engine

Der Blowfish-Algorithmus ist eine symmetrische Blockchiffre, die auf Datenblöcken operiert und einen Schlüssel variabler Länge verwendet. Er wurde 1993 von Bruce Schneier entworfen und ist für seine Flexibilität und Sicherheit bekannt.

Die Methoden tryEncryptBlock und tryDecryptBlock führen Fehlerprüfungen durch, um sicherzustellen, dass die Eingabe- und Ausgabepuffer eine ausreichende Größe haben. Die Methoden encryptBlock und decryptBlock führen die eigentlichen Ver- und Entschlüsselungsoperationen an den Datenblöcken unter Verwendung des Blowfish-Algorithmus durch.

Utils

HexUtils

Die Klasse HexUtils ist eine Utility-Klasse, die Methoden zur Konvertierung von Daten in hexadezimale Zeichendarstellungen und zur Durchführung verwandter Operationen, wie das Erstellen von Hex-Dumps, bereitstellt. Sie enthält Funktionen zum Konvertieren von Bytes und Integern in ihre hexadezimalen Darstellungen, zum Generieren von Hex-Dumps von Byte-Arrays und zum Konvertieren von Byte-Arrays in ASCII-Zeichen.

IPv4Filter

Diese Klasse ist eine Implementierung eines IPv4-Filters, der Verbindungen basierend auf dem Flood-Schutz für spezifische IP-Adressen zulässt oder ablehnt.

Rnd

Rnd bietet Funktionen zur Generierung von Zufallszahlen. Es bietet verschiedene Arten von Zufallszahlengeneratoren basierend auf dem spezifizierten RandomType.

Die verfügbaren Typen sind:

  • SECURE: Verwendet SecureRandom für beste Zufallsqualität.
  • UNSECURE_ATOMIC: Verwendet java.util.Random für durchschnittliche Zufallsqualität.
  • UNSECURE_THREAD_LOCAL: Verwendet ThreadLocalRandom für parallele Zugriffsgeschwindigkeit. Jeder Thread hat seine eigene Zufallsinstanz.
  • UNSECURE_VOLATILE: Verwendet NonAtomicRandom für schnellere parallele Zugriffsgeschwindigkeit. Es kann derselbe Seed für zwei Threads generiert werden.

Util

Die Klasse enthält mehrere statische Methoden, die verschiedene Funktionalitäten bieten.

Hier ist eine Zusammenfassung der von der Klasse Util bereitgestellten Methoden:

  • isInternalHostname(String host): Diese Methode prüft, ob ein Hostname intern ist, indem sie verifiziert, ob es sich um eine standortlokale Adresse oder eine Loopback-Adresse handelt.
  • printData(byte[] data, int len): Diese Methode generiert eine hexadezimale Darstellung eines Byte-Arrays. Sie nimmt das Byte-Array und die Länge der darzustellenden Daten entgegen und gibt die hexadezimale Darstellung als String zurück.
  • printData(byte[] data): Dies ist eine Kurzform für printData(byte[] data, int len) und gibt das gesamte Byte-Array im Hexadezimalformat aus.
  • printData(ByteBuffer buf): Diese Methode stellt die verbleibenden Bytes eines ByteBuffer als hexadezimalen String dar.
  • generateHex(int size): Diese Methode generiert eine zufällige Sequenz von Bytes der angegebenen Größe und gibt sie als Byte-Array zurück.
  • getStackTrace(Throwable t): Diese Methode nimmt ein Throwable-Objekt entgegen und gibt dessen Stacktrace als String zurück.
  • replaceIllegalCharacters(String str): Diese Methode ersetzt die meisten ungültigen Zeichen in einem String durch einen Unterstrich.
  • isValidFileName(String name): Diese Methode verifiziert, ob ein Dateiname gültig ist, indem sie ein File-Objekt mit dem angegebenen Namen erstellt und prüft, ob sie dessen kanonischen Pfad abrufen kann, ohne eine Ausnahme auszulösen.
  • splitWords(String input): Diese Methode teilt Wörter in einem String auf, indem sie ein Leerzeichen zwischen einem Kleinbuchstaben gefolgt von einem Großbuchstaben einfügt.
  • getNextClosestDateTime(DayOfWeek[] daysOfWeek, int hour, int min): Diese Methode berechnet das nächste oder am nächsten liegende Datum von den angegebenen Wochentagen zur angegebenen Stunde und Minute.
  • getNextClosestDateTime(List<DayOfWeek> daysOfWeek, int hour, int min): Dies ist eine überladene Version der vorherigen Methode, die eine Liste von DayOfWeek-Objekten anstelle eines Arrays akzeptiert.
  • mapToFunction(Map<K, V> map): Diese Methode konvertiert eine Map in eine Funktion, wobei die Funktion den Wert zurückgibt, der einem gegebenen Schlüssel in der Map zugeordnet ist.
  • parseArg(String[] args, String arg, boolean hasArgValue): Diese Methode analysiert ein gegebenes Argument aus den Java-Programmargumenten. Sie kann entweder das Argument selbst oder seinen Wert abrufen, falls angegeben.
  • randomPassword(int length): Diese Methode generiert ein zufälliges Passwort der angegebenen Länge. Das Passwort enthält eine Kombination aus Kleinbuchstaben, Großbuchstaben und Ziffern.