メインコンテンツへスキップ

補助ライブラリ (Auxiliary Libraries)

当プロジェクトでは、メインコンポーネントの依存関係としていくつかの補助ライブラリを使用しています。

私たちのライブラリは JitPack 経由で公開されています!

JitPack.io はパッケージリポジトリサービスで、Javaライブラリを簡単に共有・配布できるようにします。Gitリポジトリからソースコードをオンデマンドでビルドします。

新しいバージョンを公開するには、コンポーネントバージョンの名前で新しいタグを作成し、それをプッシュするだけです。

これを使用するには、プロジェクトのリポジトリ宣言に追加する必要があります:

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

MMO Core

MMOCore はプロジェクトの基盤コンポーネントです。ネットワークエンジンの抽象的な実装を提供するライブラリです。Login Server と Game Server の両方で使用され、クライアントとのデータのやり取りを管理します。Game Server で実装すべき(主な)エンコード/デコード方法は2種類あります。バッファ処理は SelectorThread クラスで行われます。

私たちは In/Out にノンブロッキングなマルチプレクス・シングルスレッド・アーキテクチャを使用し、受け取ったパケットの処理にはスレッドプールを採用しています。 —— DrHouse

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

Asynchronous I/O, Multi-threaded MMOCore および こちら での議論。

L2J Geo Driver

これが Geodata エンジンの標準実装です。

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

L2J Commons

これは、Login Server と Game Server の両方でさまざまな問題を解決するためのユーティリティクラスを多数含むライブラリです。

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

UPnP サービス

Universal Plug and Play (UPnP) は、ローカルネットワーク上のデバイスが自動的に互いを発見し通信できるようにするネットワークプロトコルのセットです。デバイスの接続と設定を簡素化します。UPnP はポート転送にも使用でき、ルーターの背後にあるデバイスへのリモートアクセスを可能にします。UPnP を使用すると、デバイスはルーターにポート転送ルールを自動的に作成・管理するよう要求できるため、手動の設定が不要になります。これにより、専門的なネットワーク知識がなくてもリモートアクセスを簡単に有効にできます。

情報

デフォルトで有効になっています。

コネクションファクトリとコネクションプール

L2J Server では、素の JDBC (Java Database Connectivity) を使用しています。これは、JPA (Java Persistence API) などのハイレベルなフレームワークに比べてパフォーマンスが向上する可能性があります。データベースへの直接的で低レベルなアクセスを提供することで、SQLクエリ、データ取得戦略、データベース固有の機能を細かく制御・最適化できるためです。

L2J Server はコネクションプールを使用して、データベース接続を管理します。これにより、サーバーはデータベースへの接続を再利用・共有できます。接続プールは、リクエストごとに新しいデータベース接続を確立するオーバーヘッドを削減し、パフォーマンスとスケーラビリティを向上させます。

デフォルトでは、L2J Server は HikariCP を使用しています。これは高性能な JDBC 接続プールライブラリで、メモリ使用量が少なく、低レイテンシ、高スループット、自動接続管理などの特徴があります。

Blowfish エンジン

Blowfish アルゴリズムは、可変長のキーを使用するデータブロックを処理する対称型ブロック暗号です。1993年に Bruce Schneier によって設計され、その柔軟性とセキュリティで知られています。

tryEncryptBlocktryDecryptBlock メソッドは、入力および出力バッファが十分なサイズであることを確認するためのエラーチェックを行います。encryptBlockdecryptBlock メソッドは、Blowfish アルゴリズムを使用してデータブロックに対して実際の暗号化・復号化操作を実行します。

ユーティリティ (Utils)

HexUtils

HexUtils クラスは、データを16進文字列に変換したり、ヘキサダンプの作成などの関連操作を提供したりするためのユーティリティクラスです。バイトや整数を16進数に変換する機能、バイト配列のヘキサダンプを生成する機能、バイト配列を ASCII 文字に変換する機能などが含まれています。

IPv4Filter

このクラスは、特定の IP アドレスに対するフラッド保護(Flood protection)に基づいて、接続を許可または拒否する IPv4 フィルターの実装です。

Rnd

Rnd は乱数生成機能を提供します。指定された RandomType に応じてさまざまなタイプの乱数ジェネレーターを提供します。

利用可能なタイプは以下の通りです:

  • SECURE: 乱数の品質として最高レベルの SecureRandom を使用します。
  • UNSECURE_ATOMIC: 平均的な乱数品質の java.util.Random を使用します。
  • UNSECURE_THREAD_LOCAL: 並列アクセス速度に優れた ThreadLocalRandom を使用します。スレッドごとに独自の乱数インスタンスを持ちます。
  • UNSECURE_VOLATILE: 並列アクセス速度がより速い NonAtomicRandom を使用します。2つのスレッドで同じシードが生成される可能性があります。

Util

このクラスには、さまざまな機能を提供する複数の静的メソッドが含まれています。

Util クラスが提供するメソッドの概要は以下の通りです:

  • isInternalHostname(String host): サイトローカルアドレスまたはループバックアドレスかを確認することで、ホスト名が内部のものかを判定します。
  • printData(byte[] data, int len): バイト配列の16進数表現を生成します。バイト配列と表示するデータの長さを引数に取り、16進表現を文字列として返します。
  • printData(byte[] data): printData(byte[] data, int len) のショートカットで、バイト配列全体を16進形式で出力します。
  • printData(ByteBuffer buf): ByteBuffer の残りのバイトを16進文字列として表現します。
  • generateHex(int size): 指定されたサイズのランダムなバイトシーケンスを生成し、バイト配列として返します。
  • getStackTrace(Throwable t): 指定された Throwable オブジェクトからスタックトレースを文字列として返します。
  • replaceIllegalCharacters(String str): 文字列内のほとんどの不正な文字をアンダースコア(_)に置き換えます。
  • isValidFileName(String name): 指定された名前で File オブジェクトを作成し、例外を発生させずにその正規パスを取得できるかを確認することで、ファイル名が有効かを検証します。
  • splitWords(String input): 文字列内の単語を分割します(小文字の後に大文字が続く箇所にスペースを挿入します)。
  • getNextClosestDateTime(DayOfWeek[] daysOfWeek, int hour, int min): 指定された曜日、時間から最も近い日時を計算します。
  • getNextClosestDateTime(List<DayOfWeek> daysOfWeek, int hour, int min): 前述のメソッドのオーバーロードで、配列の代わりに DayOfWeek オブジェクトのリストを引数に取ります。
  • mapToFunction(Map<K, V> map): マップを関数に変換します。関数は、マップ内の指定されたキーに関連付けられた値を返します。
  • parseArg(String[] args, String arg, boolean hasArgValue): Java プログラム引数から指定された引数を解析します。引数そのもの、または引数の値を(指定されていれば)取得します。
  • randomPassword(int length): 指定された長さのランダムなパスワードを生成します。パスワードには小文字、大文字、数字が含まれます。