Skocz do zawartości

[Skript Addon] HexVG-DatabaseAddon — asynchroniczna baza danych dla Skripta


Rekomendowane odpowiedzi

HexVG-DatabaseAddon

Addon do Skripta obsługujący operacje bazodanowe na serwerze VenomGrave

version minecraft skript papi license


O projekcie

HexVG-DatabaseAddon to addon do Skripta stworzony na potrzeby serwera VenomGrave. Sporo pracy poszło w to żeby asynchroniczność działała porządnie — w pewnym momencie musieliśmy przepisać cały system zapytań żeby pozbyć się deadlocków które freezowały serwer.

Plugin pozwala pisać skrypty które komunikują się z MySQL lub SQLite bez żadnej znajomości Javy. Połączenie, pula połączeń HikariCP, obsługa błędów, rollbacki transakcji, blokowanie graczy i tworzenie tabel — to wszystko jest po stronie pluginu. W Skripcie piszesz tylko co chcesz zrobić z danymi.


Funkcje

  • Obsługa MySQL i SQLite
  • W pełni asynchroniczne zapytania — serwer nigdy nie freezuje
  • Transakcje z automatycznym rollbackiem przy błędzie
  • System blokowania graczy — zapobiega race conditions przy duplikatach komend
  • Gwarantowane tworzenie tabel — db ensure table blokuje dopóki tabela nie istnieje, bez race conditions na starcie
  • Integracja z PlaceholderAPI — wartości z bazy dostępne w scoreboardach, tablistach, hologramach
  • Ochrona przed SQL injection przez PreparedStatement
  • Walidacja nazw tabel i kolumn
  • Cache wyników per gracz
  • Tryb debug z logowaniem zapytań i czasem wykonania
  • Wszystkie biblioteki spakowane w jarze — brak dodatkowych zależności

Wymagania

Wymaganie Wersja
Paper 1.16.5+
Skript 2.6+
Java 11+
PlaceholderAPI opcjonalne

Instalacja

  1. Wrzuć HexVG-DatabaseAddon.jar do folderu plugins/
  2. Uruchom serwer — plugin wygeneruje config.yml
  3. Skonfiguruj połączenie z bazą danych
  4. Zrestartuj serwer

Przy MySQL pamiętaj żeby wcześniej ręcznie utworzyć bazę: CREATE DATABASE nazwa_bazy;


Konfiguracja

debug: false

database:
  type: SQLITE   # SQLITE lub MYSQL

  sqlite:
    file: database.db

  mysql:
    host: localhost
    port: 3306
    database: nazwa_bazy
    username: root
    password: ""
    pool-size: 5

Składnia Skript

Tworzenie tabeli (zalecane)

Blokuje dopóki tabela nie powstanie — bezpieczne w on skript load, bez wait ticks, bez race conditions nawet gdy kilku graczy dołączy jednocześnie.

on skript load:
    db ensure table "players" with query "CREATE TABLE IF NOT EXISTS players (uuid VARCHAR(36) PRIMARY KEY, name VARCHAR(16), coins INT DEFAULT 0)"

Pobieranie danych

execute db query "SELECT * FROM players WHERE uuid = ?" with values {_uuid}
wait 2 ticks
set {_coins} to column "coins" from row 1 of last db query result
set {_rows} to db row count of last db query result

Dodawanie rekordu

set {_cols::1} to "uuid"
set {_cols::2} to "coins"
set {_vals::1} to {_uuid}
set {_vals::2} to "0"
db insert into table "players" columns {_cols::*} values {_vals::*}

Aktualizacja i usuwanie

db update table "players" set "coins" to "%{_new}%" where "uuid" = {_uuid}
db delete from table "players" where "uuid" = {_uuid}

Transakcje

Kilka zapytań jako jedna atomowa operacja — albo wszystko się zapisuje, albo nic.

db begin transaction

db update table "players" set "coins" to "%{_new}%" where "uuid" = {_uuid}
wait 2 ticks
db insert into table "purchases" columns {_cols::*} values {_vals::*}
wait 2 ticks

db commit transaction

if last db transaction failed:
    send "&cCoś poszło nie tak. Coiny nie zostały pobrane." to player
    stop

send "&aZakup zakończony sukcesem!" to player

db begin transaction i db commit transaction nie wymagają wait — blokują wewnętrznie do czasu zakończenia operacji.

Blokowanie gracza

Zapobiega wielokrotnemu wywołaniu komendy zanim poprzednie wykonanie się skończy.

if player is db locked:
    send "&cPoczekaj chwilę przed ponownym użyciem tej komendy." to player
    stop
db lock player

# ... zapytania ...

db unlock player

PlaceholderAPI

Jeśli PlaceholderAPI jest zainstalowane, ekspansja rejestruje się automatycznie. Ustaw wartość ze Skripta po zapytaniu i działa wszędzie gdzie PAPI jest obsługiwane.

execute db query "SELECT coins FROM players WHERE uuid = ?" with values {_uuid}
wait 2 ticks
set {_coins} to column "coins" from row 1 of last db query result
db set placeholder "coins" to "%{_coins}%" for player
Placeholder Opis
%hexvgdb_<klucz>% wartość ustawiona przez db set placeholder
%hexvgdb_connected% true / false — status połączenia z bazą
%hexvgdb_locked% true / false — czy gracz ma aktywny lock

Ważne — wait ticks

Zwykłe zapytania są asynchroniczne, więc przed odczytaniem wyniku daj wait 2 ticks.

db ensure table, db begin transaction i db commit transaction nie wymagają wait — blokują wewnętrznie.


Komendy

Komenda Opis Uprawnienie
/hexvgdb status Status połączenia z bazą hexvg.database.admin
/hexvgdb debug Włącza / wyłącza tryb debug hexvg.database.admin
/hexvgdb reload Przeładowuje konfigurację hexvg.database.admin

Domyślnie dostępne tylko dla operatorów.


Przykładowe skrypty

W repozytorium znajdują się dwa przykłady:

  • example.sk — system coinów z SELECT, INSERT, UPDATE, DELETE, transakcjami i lockami
  • example_papi.sk — system statystyk (coiny, kills, rank) z pełną integracją PlaceholderAPI

Autorzy

Stworzony dla serwera VenomGrave przez HexVG Team.
Błędy i propozycje: https://github.com/VenomGrave/HexVG-DatabaseAddon/issues

 

Edytowane przez VenomGrave
Odnośnik do komentarza
https://skript.pl/temat/59070-skript-addon-hexvg-databaseaddon-%E2%80%94-asynchroniczna-baza-danych-dla-skripta/
Udostępnij na innych stronach

Fajne, chociaż ja osobiście czekam aż ktoś calkiem przepisze system zapisywania zmiennych, bo trzymanie wszystkiego w jednym miejscu bez specjalnej kontroli zapisu jest troche ew

Godzinę temu, Fendi napisał:

Fajne, chociaż ja osobiście czekam aż ktoś calkiem przepisze system zapisywania zmiennych, bo trzymanie wszystkiego w jednym miejscu bez specjalnej kontroli zapisu jest troche ew

Dzięki za opinię.

No właśnie dlatego ten plugin w ogóle powstał, bo domyślny system Skripta jest dość ograniczony jeśli chodzi o kontrolę nad danymi. Tutaj masz pełną kontrolę — własne tabele, własne zapytania, sam decydujesz kiedy i co zapisujesz.

Co do aktualizacji —  w najbliższym czasie wrzucimy nową wersję. Między innymi wchodzą transakcje, więc jeśli kilka zapytań musi wykonać się razem albo żadne, to plugin sam zadba o rollback gdy coś pójdzie nie tak.

Update v1.2.0

Spory update — cztery nowe rzeczy.


1. Transakcje

Możesz teraz wykonać kilka zapytań jako jedną atomową operację — albo wszystko się zapisze, albo nic. Jeśli cokolwiek się posypie w trakcie, plugin automatycznie cofa wszystko i ustawia flagę którą możesz sprawdzić w Skripcie.

db begin transaction

db update table "players" set "coins" to "%{_new}%" where "uuid" = {_uuid}
wait 2 ticks
db insert into table "purchases" columns {_cols::*} values {_vals::*}
wait 2 ticks

db commit transaction

if last db transaction failed:
    send "&cCoś poszło nie tak." to player
    stop

send "&aZakup udany!" to player

2. Blokowanie graczy

Zapobiega race conditions gdy gracz wywołuje komendę kilka razy zanim poprzednia się skończy. Locki trzymane są w pamięci pluginu — żadnych zmiennych Skriptowych.

if player is db locked:
    send "&cPoczekaj chwilę." to player
    stop
db lock player

# ... zapytania ...

db unlock player

3. db ensure table

Nowy efekt do tworzenia tabel który rozwiązuje problem z race conditions na starcie serwera. Blokuje wykonanie skryptu dopóki tabela faktycznie nie powstanie — nie trzeba już kombinować z wait ticks ani flagami.

# Nowe
on skript load:
    db ensure table "players" with query "CREATE TABLE IF NOT EXISTS players (...)"
# Stare
on skript load:
    check db table "players"
    wait 20 ticks
    if db table "players" doesn't exist:
        execute db query "CREATE TABLE IF NOT EXISTS players (...)"
        wait 5 ticks

4. PlaceholderAPI

Jeśli macie PlaceholderAPI na serwerze, plugin automatycznie rejestruje własne placeholdery. Ustawiacie wartość ze Skripta po zapytaniu i działa wszędzie — scoreboard, tablist, hologramy, cokolwiek obsługuje PAPI.

execute db query "SELECT coins FROM players WHERE uuid = ?" with values {_uuid}
wait 2 ticks
set {_coins} to column "coins" from row 1 of last db query result
db set placeholder "coins" to "%{_coins}%" for player

Od tej chwili %hexvgdb_coins% zwraca aktualną wartość dla gracza.

Placeholder Opis
%hexvgdb_<klucz>% wartość ustawiona ze Skripta
%hexvgdb_connected% true / false — status połączenia z bazą
%hexvgdb_locked% true / false — czy gracz ma aktywny lock

PlaceholderAPI jest opcjonalne — bez niego plugin działa dokładnie tak samo jak wcześniej.


W repozytorium są dwa przykładowe skrypty — example.sk z systemem coinów i nowy example_papi.sk pokazujący system statystyk z pełną integracją PlaceholderAPI.

Jak coś nie działa albo macie pomysły — piszcie w komentarzach albo otwórzcie Issue na GitHubie.

  • 6 miesięcy temu...

HexVG-DatabaseAddon 1.2.1 – aktualizacja poprawkowa

https://github.com/VenomGrave/HexVG-DatabaseAddon

Zalecana dla wszystkich serwerów, szczególnie tych ze sklepami i ekonomią na Skripcie.

Co naprawiono:
- Zapytania do bazy nie zamrażają już serwera. Wcześniej każde zapytanie mogło zatrzymać serwer nawet na 5 sekund.
- Wyniki zapytań w komendach, przy śmierci gracza czy w GUI trafiają teraz do właściwego gracza. Wcześniej gracze mogli „widzieć” nawzajem swoje dane.
- Transakcje są w pełni bezpieczne: błąd dowolnego zapytania cofa wszystko, nie ma już częściowych zapisów (np. przedmiotu kupionego bez zapłaty).
- Ochrona przed podwójnym zakupem przy spamowaniu komendy.
- Porzucone transakcje i blokady (db lock) wygasają same po 30 sekundach.
- Po restarcie MySQL plugin sam łączy się ponownie.
- Poprawki dla MySQL i drobne optymalizacje.

Ważne dla skryptów:
- "wait" po zapytaniu nie jest już potrzebny, bo wynik jest dostępny od razu w następnej linijce.
- Nie używajcie "wait" między "db begin transaction" a "db commit transaction".

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Nieaktywny
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...