Przejdź do treści

Biblioteki pomocnicze (Auxiliary Libraries)

Używamy kilku bibliotek pomocniczych jako zależności dla naszych głównych komponentów.

Publikujemy nasze biblioteki za pośrednictwem JitPack!

JitPack.io to usługa repozytorium pakietów, która umożliwia łatwe udostępnianie i dystrybucję bibliotek Java poprzez budowanie kodu źródłowego z repozytoriów Git na żądanie.

Proces publikowania nowej wersji polega na utworzeniu nowego tagu z nazwą wersji i wypchnięciu go do repozytorium.

Aby z tego korzystać, musisz dodać deklarację repozytorium do swojego projektu:

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

MMO Core

MMOCore to podstawa projektu. Jest to biblioteka, która dostarcza abstrakcyjną implementację silnika sieciowego. Jest używana zarówno przez Login Server, jak i Game Server do wysyłania/odbierania danych do/z klientów gry. Istnieją dwie (główne) metody kodowania i dekodowania danych, które muszą być zaimplementowane po stronie Game Serwera. Obsługa buforowania danych odbywa się w klasie SelectorThread.

Stosujemy nieblokującą, multipleksową architekturę jednoterminową (single-thread) dla operacji wejścia/wyjścia (In/Out) oraz pulę wątków (thread pool) do przetwarzania otrzymanych pakietów. —— DrHouse

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

Dyskusja na temat Asynchronous I/O, Multi-threaded MMOCore oraz tutaj.

L2J Geo Driver

To jest standardowa implementacja silnika Geodata.

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

L2J Commons

Jest to biblioteka narzędziowa (utility) zawierająca wiele klas rozwiązujących różnorodne problemy zarówno w Login Serwerze, jak i Game Serwerze.

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

Usługa UPnP

Universal Plug and Play (UPnP) to zestaw protokołów sieciowych, które pozwalają urządzeniom w sieci lokalnej na automatyczne odkrywanie się i wzajemną komunikację. Upraszcza to konfigurowanie urządzeń i łączenie ich ze sobą. UPnP może być również używane do przekierowywania portów, co pozwala na zdalny dostęp do urządzeń znajdujących się za routerem. Dzięki UPnP urządzenia mogą prosić router o automatyczne tworzenie i zarządzanie regułami przekierowania portów, eliminując potrzebę ręcznej konfiguracji routera. Ułatwia to użytkownikom zdalny dostęp do swoich urządzeń bez potrzeby posiadania zaawansowanej wiedzy o sieciach czy przechodzenia przez skomplikowane procedury konfiguracyjne.

Info

Włączone domyślnie.

Connection Factory (Fabryka połączeń) i Connection Pool (Pula połączeń)

L2J Server wykorzystuje surowy kod JDBC (Java Database Connectivity). Może to poprawić wydajność w porównaniu do wysokopoziomowych frameworków, takich jak JPA (Java Persistence API) czy inne opcje, ponieważ zapewnia bezpośredni i niskopoziomowy dostęp do bazy danych, pozwalając na precyzyjną kontrolę i optymalizację zapytań SQL, strategii pobierania danych oraz funkcji specyficznych dla danej bazy danych.

L2J Server wykorzystuje Connection Pool (Pulę połączeń) do zarządzania połączeniami z bazą danych, umożliwiając serwerowi ponowne wykorzystanie i współdzielenie połączeń. Pomaga to poprawić wydajność i skalowalność poprzez zmniejszenie narzutu związanego z nawiązywaniem nowego połączenia z bazą danych przy każdym żądaniu.

Domyślnie L2J Server używa HikariCP, wysokowydajnej biblioteki puli połączeń JDBC dla aplikacji Java. HikariCP oferuje wiele funkcji, które czynią go popularnym wyborem, w tym niskie zużycie pamięci, niskie opóźnienia, wysoką przepustowość oraz automatyczne zarządzanie połączeniami.

Silnik Blowfish

Algorytm Blowfish to symetryczny szyfr blokowy, który operuje na blokach danych przy użyciu klucza o zmiennej długości. Został zaprojektowany w 1993 roku przez Bruce’a Schneiera i jest znany ze swej elastyczności oraz wysokiego poziomu bezpieczeństwa.

Metody tryEncryptBlock oraz tryDecryptBlock przeprowadzają sprawdzenie błędów, aby upewnić się, że bufor wejściowy i wyjściowy mają wystarczający rozmiar. Metody encryptBlock oraz decryptBlock wykonują rzeczywiste operacje szyfrowania i odszyfrowania bloczków danych przy użyciu algorytmu Blowfish.

Utility (Klasy narzędziowe)

HexUtils

Klasa HexUtils to klasa narzędziowa dostarczająca metod do konwersji danych na reprezentację szesnastkową oraz wykonywania powiązanych operacji, takich jak tworzenie zrzutów szesnastkowych (hex dumps). Zawiera funkcje do konwertowania bajtów i liczb całkowitych na ich postać szesnastkową, generowania hex-dumpów z tablic bajtów oraz konwertowania tablic bajtów na znaki ASCII.

IPv4Filter

Klasa ta jest implementacją filtra IPv4, który zezwala lub odmawia połączeń w oparciu o ochronę przeciw zalewaniu danymi (flood protection) dla konkretnych adresów IP.

Rnd

Rnd dostarcza funkcji do generowania liczb losowych. Dostarcza różne rodzaje generatorów liczb losowych w zależności od określonego typu RandomType.

Dostępne typy to:

  • SECURE: używa SecureRandom dla uzyskania najlepszej jakości losowości.
  • UNSECURE_ATOMIC: używa java.util.Random dla średniej jakości losowości.
  • UNSECURE_THREAD_LOCAL: używa ThreadLocalRandom dla szybkości dostępu równoległego. Każdy wątek posiada własną instancję generatora.
  • UNSECURE_VOLATILE: używa NonAtomicRandom dla jeszcze szybszego dostępu równoległego. Istnieje szansa wygenerowania tego samego ziarna (seed) dla dwóch wątków.

Util

Klasa zawiera wiele statycznych metod dostarczających różnorodne funkcjonalności.

Oto podsumowanie metod dostarczanych przez klasę Util:

  • isInternalHostname(String host): ta metoda sprawdza, czy nazwa hosta jest wewnętrzna, weryfikując czy jest to adres lokalny lub adres pętli zwrotnej (loopback).
  • printData(byte[] data, int len): ta metoda generuje szesnastkową reprezentację tablicy bajtów. Przyjmuje tablicę bajtów i długość danych do wyświetlenia, a następnie zwraca szesnastkową reprezentację jako ciąg znaków (String).
  • printData(byte[] data): skrót dla printData(byte[] data, int len), wypisuje całą tablicę bajtów w formacie szesnastkowym.
  • printData(ByteBuffer buf): metoda ta reprezentuje pozostałe bajty obiektu ByteBuffer jako ciąg szesnastkowy.
  • generateHex(int size): metoda ta generuje losową sekwencję bajtów o określonym rozmiarze i zwraca ją jako tablicę bajtów.
  • getStackTrace(Throwable t): metoda ta przyjmuje obiekt Throwable i zwraca jego ślad stosu (stack trace) jako ciąg znaków.
  • replaceIllegalCharacters(String str): metoda ta zastępuje większość niedozwolonych znaków w ciągu znaków podkreśleniem.
  • isValidFileName(String name): metoda ta weryfikuje poprawność nazwy pliku poprzez próbę utworzenia obiektu File o podanej nazwie i sprawdzenie, czy można pobrać jego ścieżkę kanoniczną bez wywołania wyjątku.
  • splitWords(String input): metoda ta dzieli słowa w ciągu znaków, wstawiając spację pomiędzy małą literą a następującą po niej wielką literą.
  • getNextClosestDateTime(DayOfWeek[] daysOfWeek, int hour, int min): metoda ta oblicza najbliższą lub najdalszą datę z podanych dni tygodnia dla określonej godziny i minuty.
  • getNextClosestDateTime(List<DayOfWeek> daysOfWeek, int hour, int min): przeciążona wersja poprzedniej metody, przyjmująca listę obiektów DayOfWeek zamiast tablicy.
  • mapToFunction(Map<K, V> map): metoda ta konwertuje mapę na funkcję, gdzie funkcja zwraca wartość skojarzoną z danym kluczem w mapie.
  • parseArg(String[] args, String arg, boolean hasArgValue): metoda ta parsuje dany argument z argumentów programu Java. Może pobrać sam argument lub jego wartość, jeśli została podana.
  • randomPassword(int length): metoda ta generuje losowe hasło o określonej długości. Hasło zawiera kombinację małych i wielkich liter oraz cyfr.