←  Pluginy AMXX

AMXX.pl: Support AMX Mod X i SourceMod

»

Database ORM

  • +
  • -
Misiaczek ;c - zdjęcie Misiaczek ;c 30.06.2014

Database ORM
Wersja: 1.0.1b
Wydana: 27 Czerwiec 2014

Autor: Backstabnoob
 

Opis



 
Database ORM jest kompleksowym API przystosowany do obsługi rożnych pluginów w których chcemy zaimplementować zapis/odczyt danych z MySQL. API zostało stworzone z myślą o serwerach które są bardzo mocno obciążone przez zapytania do baz oraz o osobach które chciały by dodać zapis MySQL do pluginu lecz nie potrafią, dzięki API możemy w łatwi sposób ograniczyć ilość zapytań/połączeń oraz ogólnie zwiększyć wydajność MySQL. Do używania API zalecana jest średnia znajomość AMXX, ponieważ w przypadku złego zastosowania może to odnieś skutek odwrotny od zamierzonego
 
UWAGA: Należy pamiętać, że jest to wersja beta i prawdopodobnie zawiera kilka błędów. Przetestowałem to jak tylko mogłem sam, ale to jest trochę trudne bez symulacji w czasie rzeczywistym. Tak więc prosił bym osoby które tego używają na swoich serwera o zgłaszanie błędów itp.
 

Możliwości



 
System ten może być przydatny w wielu aspektach, ale są pewne rzeczy w których lepiej go nie wykorzystywać.
 
Możemy go wykorzystać do:

  • Zapis Exp
  • Statystyki Graczy
  • Banki
  • Statystyki Serwera
  • Itp.

Nie zalecam używać go do:

  • Proste rzeczy które mogą być zastąpione przez prosty config bądź też cvar.

Upraszczając: Używaj przy API zdrowego rozsądku, aby nie przesadzić tongue.png
 

Wymagania



 
AMXX 1.8.3 ( do testów została użyta wersja git3921 ), na wersji 1.8.2 i niższej występują błędy.

Serwer Steam :)
 

Instalacja oraz Konfiguracja



 
Instalacja
Pobierz plik database_orm.sma  po czym go skompiluj i wrzuć do folderu plugins.
Pobierz plik orm_config.ini po czym wrzuć go do folderu configs i uzupełnij poprawnie.
 
Konfiguracja


orm_hostname

Adres serwera bazy danych

orm_username

Użytkownik bazy danych

orm_password

Hasło użytkownika bazy danych

orm_database

Nazwa bazy danych

orm_saveperiod

Co ile ma być dokonywany zapis danych ( czas podajemy w sekundach ( domyślnie 1200.0 ( 20 minut ) )
Jeśli mamy serwer gdzie ciągle leci ta sama mapa 24/7/365 zostawiamy wartość tak jak jest bądź zwiększamy, jeśli mamy serwer normalny gdzie mapy zmieniają się co 20-30 min ustawiamy wartość na 0

orm_preparedquery

Opcje zapisu danych

  • a - Kazdy gracz osobno ( przy wyjściu z serwera )
  • b - Wszyscy na raz ( jest cvar orm_saveperiod jest różny od 0 )
  • c - Statyczny ( przy jakiekolwiek zmianie w trakcie gry, działa podobnie do b i ma te same wymagania )
  • d - W trakcie zmian ( zawsze kiedys cos usuniemy przez CSRP_Delete{ Player/Static }ClassItem( ) )
  • e - Koniec Mapy ( Kiedy mapa jest zmieniana wszystko zostaje zapisane )
  • f - Nuke ( gdy wystapi błąd w natywie CSRP_Nuke{ Player/Static }Class( ) )
orm_showsavemsg

Pokazuje wiadomośc o zapisanie danych, aktywne tylko gdy orm_saveperiod jest różny od 0

Podziękowania



 
Hawk552 - Pomysłodawca, pomoc z wieloma rzeczami, wspieranie
Black Rose - Dyskusja, pomysły, ogólna pomoc gdy była potrzebna, wsparcie
 

Lista Zmian


  • 1.0.0
    • Pierwsze Wydanie
    • Data: 25 Czerwiec 2014
  • 1.0.1b

Pobierz



 
Include
Załączony plik  database_orm.inc   11,02 KB   179 Ilość pobrań
SMA
Załączony plik  database_orm.sma   64,19 KB   218 Ilość pobrań
Konfiguracja
Załączony plik  orm_config.ini   350 bajtów   171 Ilość pobrań
 
 
Źródło: https://forums.allie...ad.php?t=242833


dasiek (01.07.2014 07:19):
nie uważasz że powinno to być w scriptingu gotowych funkcjach?
Odpowiedz

  • +
  • -
Misiaczek ;c - zdjęcie Misiaczek ;c 30.06.2014

Przykład użycia


 

Prosty System Bankowy

#include <amxmodx>
#include <database_orm>
#include <cstrike>

new Class: g_hBank

new bool: g_bReady[ 33 ]

enum _: DatabaseColumns {
	Bank_Money,
	Bank_CreationDate 
}

new g_DatabaseColumns[ DatabaseColumns ][ ClassColumnStruct ] = {
	{ "bank_money", Column_Int, 11 },
	{ "bank_created", Column_Int, 11 }
}

public plugin_init( ) {
	new Array: aColumns = ArrayCreate( ClassColumnStruct, DatabaseColumns )
	for( new i; i < DatabaseColumns; i ++ ) {
		ArrayPushArray( aColumns, g_DatabaseColumns[ i ] )
	}
	
	g_hBank = CSRP_CreatePlayerClass( "orm_examplebank", aColumns, -1, "_Callback" )
	
	register_clcmd( "withdraw", "_cWithdraw" )
	register_clcmd( "deposit", "_cDeposit" )
	register_clcmd( "accountinfo", "_cAccountInfo" )    
}

public _cWithdraw( id ) {
	if( !g_bReady[ id ] ) {
		client_print( id, print_console, "Please wait for load." )
		return PLUGIN_HANDLED
	}
	
	new szArgs[ 11 ]
	read_args( szArgs, charsmax( szArgs ) )
	
	remove_quotes( szArgs )
	trim( szArgs )
	
	new iArgs = str_to_num( szArgs )
	
	new Array: aBankAccount = CSRP_FindInPlayerClassUnique( g_hBank, id )
	
	new iBankMoney = ArrayGetCell( aBankAccount, Bank_Money )
	
	if( iArgs > iBankMoney ) {
		client_print( id, print_console, "You don't have that much money in your account!" )
		return PLUGIN_HANDLED
	}
	
	cs_set_user_money( id, cs_get_user_money( id ) + iArgs )
	
	ArraySetCell( aBankAccount, Bank_Money, iBankMoney - iArgs )
	
	client_print( id, print_console, "You have withdrawn $%d. You now have $%d in your account.", iArgs, iBankMoney - iArgs )
	return PLUGIN_HANDLED
}

public _cDeposit( id ) {
	if( !g_bReady[ id ] ){
		client_print( id, print_console, "Please wait for load." )
		return PLUGIN_HANDLED
	}
	
	new szArgs[ 11 ]
	read_args( szArgs, charsmax( szArgs ) )
	
	remove_quotes( szArgs )
	trim( szArgs )
	
	new iArgs = str_to_num( szArgs )
	new iMoney = cs_get_user_money( id )
	
	if( iMoney < iArgs ) {
		client_print( id, print_console, "You don't have that much money!" )
		return PLUGIN_HANDLED
	}
	
	new Array: aBankAccount = CSRP_FindInPlayerClassUnique( g_hBank, id )
	
	new iBankMoney = ArrayGetCell( aBankAccount, Bank_Money )
	
	ArraySetCell( aBankAccount, Bank_Money, iBankMoney + iArgs )
	cs_set_user_money( id, iMoney - iArgs )
	
	client_print( id, print_console, "You have deposited $%d. You now have $%d in your bank account.", iArgs, iBankMoney + iArgs )
	return PLUGIN_HANDLED
}

public _cAccountInfo( id ) {
	if( !g_bReady[ id ] ){
		client_print( id, print_console, "Please wait for load." )
		return PLUGIN_HANDLED
	}
	
	new Array: aBankAccount = CSRP_FindInPlayerClassUnique( g_hBank, id )
	
	client_print( id, print_console, "Your account was created on %d.^nYou have $%d in your account.", ArrayGetCell( aBankAccount, Bank_CreationDate ), ArrayGetCell( aBankAccount, Bank_Money ) )
	
	return PLUGIN_HANDLED
}

public CSRP_OnPlayerLoad( id ) {
	g_bReady[ id ] = true
	
	new Array: aBankAccount = CSRP_FindInPlayerClassUnique( g_hBank, id )
	
	if( aBankAccount == Invalid_Array ) {
		aBankAccount = ArrayCreate( 1, DatabaseColumns )
		
		ArrayPushCell( aBankAccount, 0 )
		
		ArrayPushCell( aBankAccount, get_systime( ) )
		
		CSRP_PushPlayerClassItem( g_hBank, id, aBankAccount )
	}
}

public client_disconnect( id ) {
	g_bReady[ id ] = false
}

public CSRP_OnSave( ) {
	if( g_hBank != Invalid_Class ) {
		CSRP_SavePlayerClass( g_hBank )
	}
}

public _Callback( ) { }  

Wynik

deposit 1300
You have deposited $1300. You now have $1300 in your bank account.
withdraw 1300
You have withdrawn $1300. You now have $0 in your account.
accountinfo
Your account was created on 1403828050.
You have $0 in your account.

Załączone pliki

Odpowiedz

  • +
  • -
ex0 - zdjęcie ex0 01.07.2014

Wszystko fajnie tylko pytanie o ile w rzeczywistości ograniczamy zużycie serwera a ile w domyśle mielibyśmy to zrobić?
Ograniczamy zapytania z kilkunastu przykładowo małych na jedno ogromne czy to nie będzie aby jeszcze pogarszać?
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 01.07.2014

Ograniczamy zapytania z kilkunastu przykładowo małych na jedno ogromne czy to nie będzie aby jeszcze pogarszać?

Kilka/naście małych zapytań < jedno większe zapytanie

A co do pluginu, to widzę tam fakemetę, ale wykorzystaną chyba tylko do rozłączania graczy, po co?
Odpowiedz

  • +
  • -
Misiaczek ;c - zdjęcie Misiaczek ;c 02.07.2014

 

Ograniczamy zapytania z kilkunastu przykładowo małych na jedno ogromne czy to nie będzie aby jeszcze pogarszać?

Kilka/naście małych zapytań < jedno większe zapytanie

A co do pluginu, to widzę tam fakemetę, ale wykorzystaną chyba tylko do rozłączania graczy, po co?

 

 

z SMA

// FM_ClientDisconnect isn't called on mapchange, which is extremely helpful 
// as we don't want to save the data twice (once on client_disconnect and once on plugin_end)

sebul (02.07.2014 15:32):
Takie buty ^ ^
Odpowiedz

  • +
  • -
MAGNET - zdjęcie MAGNET 03.07.2014

Mógłbyś wyjaśnić poszczególne funkcje i za co one odpowiadają, a także wytłumaczyć jak stworzyć swój zapis MySQL?

Odpowiedz

  • +
  • -
Misiaczek ;c - zdjęcie Misiaczek ;c 03.07.2014

Mógłbyś wyjaśnić poszczególne funkcje i za co one odpowiadają, a także wytłumaczyć jak stworzyć swój zapis MySQL?

Przykład zapisu masz w orm_bank, a opis poszczególnych funkcji masz w pliku inc.

Odpowiedz

  • +
  • -
Misiaczek ;c - zdjęcie Misiaczek ;c 03.07.2014

Jak ktoś może niech sprawdzi tą wersje

 

Powinien być zapis w niej na nick o ile dobrze edytowałem :P

 

Załączone pliki

Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 16.07.2014

Zauważyłem, że brak tu primary key oraz lepszej konfiguracji unique key. Unique key można ustawić tylko na id, albo na id + jakaś kolumna, nie da się ustawić samego unique na jakąś jedną kolumnę inną od id. Ciekawe czy autor tego pluginu będzie go jeszcze rozwijał.
Odpowiedz

  • +
  • -
wiwi249 - zdjęcie wiwi249 26.03.2015

Dla mnie bezużyteczny, skoro tylko Steam :/


Hiroshima (27.03.2015 00:40):
Archeolog co ma mało do powiedzenia niech lepiej uważa żeby warnów nie zbierać bo na koncie czysto nie ma...
Odpowiedz