Перейти до основного вмісту

Допоміжні бібліотеки

Ми використовуємо кілька допоміжних бібліотек як залежності для наших основних компонентів.

Ми публікуємо наші бібліотеки за допомогою JitPack!

JitPack.io — це сервіс репозиторію пакетів, який дозволяє легко ділитися та розповсюджувати бібліотеки Java шляхом збирання вихідного коду з Git-репозиторіїв за запитом.

Процес публікації нової версії складається зі створення нового тега з ім'ям, що відповідає версії компонента, та його відправлення (push).

Для використання необхідно додати це оголошення репозиторію у ваш проєкт:

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

MMO Core

MMOCore є фундаментальним компонентом проєкту, це бібліотека, яка надає абстрактну реалізацію мережевого рушія. Вона використовується Login Server та Game Server для надсилання/отримання даних від клієнтів. Існує два (основні) методи шифрування/дешифрування, які мають бути реалізовані на ігровому сервері. Обробка буфера виконується в класі SelectorThread.

Ми використовуємо неблокуючу мультиплексовану однопотокову архітектуру для введення/виведення плюс пул потоків для обробки пакетів, що отримуються. 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 Engine).

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

L2J Commons

Це службова бібліотека, що містить кілька класів, які вирішують різноманітні проблеми в Login та Game серверах.

<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 також можна використовувати для перенаправлення портів (port forwarding), що забезпечує віддалений доступ до пристроїв за маршрутизатором. За допомогою UPnP пристрої можуть запитувати у маршрутизатора автоматичне створення та керування правилами перенаправлення портів, усуваючи необхідність ручного налаштування маршрутизатора. Це спрощує користувачам віддалений доступ до своїх пристроїв без необхідності в глибоких мережевих знаннях або складних процедурах налаштування.

інфо

Увімкнено за замовчуванням.

Фабрика з'єднань та пул з'єднань

L2J Server використовує чистий JDBC (Java Database Connectivity), це може підвищити продуктивність порівняно з високорівневими фреймворками, такими як JPA (Java Persistence API), оскільки забезпечує прямий та низькорівневий доступ до бази даних, дозволяючи здійснювати тонке налаштування та оптимізацію SQL-запитів, стратегій вибірки даних та специфічних функцій бази даних.

L2J Server використовує пул з'єднань для керування заздалегідь створеними з'єднаннями з базою даних, дозволяючи серверу повторно використовувати та спільно використовувати з'єднання. Це допомагає підвищити продуктивність та масштабованість за рахунок зниження витрат на встановлення нових з'єднань для кожного запиту.

За замовчуванням L2J Server використовує HikariCP — високопродуктивну бібліотеку пулу з'єднань JDBC для застосунків Java. HikariCP пропонує кілька функцій, що роблять його популярним вибором, включаючи легкість, низьку затримку, високу пропускну здатність та автоматичне керування з'єднаннями.

Рушій Blowfish

Алгоритм Blowfish — це симетричний блочний шифр, який працює з блоками даних і використовує ключ змінної довжини. Він був розроблений Брюсом Шнайєром у 1993 році і відомий своєю гнучкістю та безпекою.

Методи tryEncryptBlock та tryDecryptBlock виконують перевірку помилок, щоб переконатися, що вхідні та вихідні буфери мають достатній розмір. Методи encryptBlock та decryptBlock фактично виконують операції шифрування та дешифрування блоків даних з використанням алгоритму Blowfish.

Утиліти (Utils)

HexUtils

Клас HexUtils — це службовий клас, який надає методи для перетворення даних у шістнадцяткові представлення символів та виконання пов'язаних операцій, таких как створення шістнадцяткових дампів (hex dumps). Він включає функції для перетворення байтів та цілих чисел у їхні шістнадцяткові представлення, створення дампів масивів байтів та перетворення масивів байтів у символи ASCII.

IPv4Filter

Цей клас є реалізацією фільтра IPv4, який дозволяє або забороняє з'єднання на основі захисту від флуду (flood protection) для певних IP-адрес.

Rnd

Rnd надає функціональність генерації випадкових чисел. Він пропонує різні типи генераторів випадкових чисел на основі вказаного RandomType.

Доступні типи:

  • SECURE: використовує SecureRandom для найкращої якості випадкових чисел.
  • UNSECURE_ATOMIC: використовує java.util.Random для середньої якості.
  • UNSECURE_THREAD_LOCAL: використовує ThreadLocalRandom для швидкості паралельного доступу. Кожен потік має свій власний екземпляр рандома.
  • UNSECURE_VOLATILE: використовує NonAtomicRandom для швидшої швидкості паралельного доступу. Може генерувати те саме зерно (seed) для двох потоків.

Util

Клас містить кілька статичних методів, що пропонують різні функціональні можливості.

Нижче наведено короткий опис методів, що надаються класом Util:

  • isInternalHostname(String host): перевіряє, чи є ім'я хоста внутрішнім, перевіряючи, чи є воно локальною адресою сайту або адресою зворотної петлі (loopback).
  • printData(byte[] data, int len): генерує шістнадцяткове представлення масиву байтів. Приймає масив байтів та довжину даних і повертає шістнадцяткове представлення у вигляді рядка.
  • printData(byte[] data): скорочення для printData(byte[] data, int len), друкує весь масив байтів у шістнадцятковому форматі.
  • printData(ByteBuffer buf): представляє залишені байти ByteBuffer у вигляді шістнадцяткового рядка.
  • 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): перетворює карту (map) у функцію, де функція повертає значення, пов'язане із заданим ключем у карті.
  • parseArg(String[] args, String arg, boolean hasArgValue): аналізує заданий аргумент із аргументів програми Java.
  • randomPassword(int length): генерує випадковий пароль вказаної довжини, що містить комбінацію малих, великих літер та цифр.