· 7 years ago · Oct 17, 2018, 02:36 PM
1//pravimo sql strukturu sa ID igraca, name, steamid i naravno ono sto zelimo da mu pamti, u ovom primeru say /ljstats (stavimo mu ime kolone 'ljstats' )
2
3<include sqlx>
4
5new const napravi_tabelu[] = ""CREATE TABLE IF NOT EXISTS player_connect_i (id INTEGER PRIMARY KEY, steamid VARCHAR(35) UNIQUE, name CHAR(32), ljstats INTEGER );" //nek stoji kao global, deluje preglednije a i lepse
6
7//uvodimo i globale koji su potrebni
8
9new SteamID[ 33 ]//po ovome igrace ubacujemo u tabelu
10new bool:lj_p[ 33 ] //bool, vazan je kad igrac kuca /ljstats...da i ovaj plugin, pored ljstats plugina, upamti kad je promenio
11new lj[ 33 ] //ovo je napravljeno da transferuje query rezultat, jer ajde neka bude integer u tabeli
12new postoji_igrac[ id ] //ako igrac vec postoji u sql tabeli s kojom radimo
13
14new Handle:SQLTuple, query_cache[ 1024 ] //potrebne stvari za sam sql rad
15
16//plugin radi na svaki konekt igraca, ali pisacu hijerarhijski sta se poziva prvo, da bi bilo malo jasnije onima kojima nije jasno :D
17public plugin_init()
18{
19 //ok naravno na svaki start mape moramo da ocitamo taj nas divni sql
20 NapraviTabelu()
21}
22NapraviTabelu()
23{
24 SQL_SetAffinity( "sqlite" ) //uzimamo sqlite opciju za ovaj rad
25 g_SQLTuple = SQL_MakeDbTuple( "", "", "", "player_connect_info" ) //username, pass i ip su nebitni ovde, jer je sve na lokal masini, samo dajemo ime baze, gde sve cuvamo: player_connect_info
26
27 new Handle:SqlConnection , ErrorCode;
28 SqlConnection = SQL_Connect( SQLTuple , ErrorCode , query_cache , charsmax( QueryCache ) )
29
30 if( SqlConnection == Empty_Handle )
31 set_fail_state( query_cache )
32
33 RunQuery( SqlConnection , napravi_tabelu ) //ovo smo vec definisali gore: ako ne postoji tabela - napravi je...
34}
35
36public RunQuery( Handle:SQLConnection , const szQuery[] )
37{
38 new Handle:Query = SQL_PrepareQuery( SQLConnection , szQuery )
39
40 if( !SQL_Execute( Query ) )
41 {
42 SQL_QueryError( Query , query_cache , 100 )
43 set_fail_state( query_cache )
44 }
45}//ovo sto ne komentujem je ili dosadan deo koda (a obavezan) ili je mnogo prosto da ne treba koment...u ovom slucaju je ovo prvo i moj predlog je da kopirate to :)
46
47//aj da vidimo sad, sta se desava kad se sam igrac konektuje na srv
48public client_putinserver( id )
49{
50 postoji_igrac[ id ] = false //odma ga pretpostavljamo da ga nema u tabeli, ubrzo ce da proverimo to
51
52 new Data[ 1 ]; Data[ 0 ] = id //podaci vazni za sql (by Bugsy)
53 get_user_authid( id , SteamID[ id ] , charsmax( SteamID[] ) )
54
55 formatex( query_cache, charsmax( query_cache ) , "SELECT id, name, steamid, ljstats FROM player_connect_i WHERE steamid='%s'" , SteamID[ id ] ) //kad saljemo komandu preko sql-a, selektovacemo tog igraca prema SteamID-u
56 SQL_ThreadQuery( SQLTuple , "SelectHandle" , query_cache , Data , sizeof( Data ) ) //saljemo upit aj da vidimo sta se dogadja:
57}
58
59
60
61public SelectHandle( FailState , Handle:Query , Error[] , Errcode , Data[] , DataSize )
62{
63 if( FailState == TQUERY_CONNECT_FAILED )
64 {
65 return set_fail_state("Could not connect to SQL database." )
66 }
67 else if( FailState == TQUERY_QUERY_FAILED )
68 {
69 log_amx( "Query error: %s" , Error )
70 return set_fail_state( query_cache )
71 }
72
73 if( Errcode )
74 return log_amx( "Error on query: %s" , Error )
75
76 new id = Data[ 0 ]
77
78 //ovo iznad valjda vidite o cemu je rec...kao sto rekoh, to je dosadan deo ali nemojte bez njega...znaci kopirajte ga ili ga pamtite ako hocete, vas izbor...ajmo sad nesto interesantnije:
79
80 if ( SQL_NumResults( Query ) ) //ako su pronadjeni rezultati za tog igraca u tabeli:
81 {
82 pronadjen_igrac[ id ] = true //evo ga, cim je pronadjen, stavljamo mu tru, ovo ce koristiti kasnije za client_diskonnect
83 server_print( "RADI RADI SQLITE") //aj da ubacimo i rucni debug :D
84 lj[ id ] = SQL_ReadResult( Query, 3 ) //ovo je mozda i najvaznija stvar...nasu promenljivu stavljamo da je jednaka nekom rezultatu iz tabele...
85
86 //kako da znamo koji je koj rezultat? vrlo lako; SQL_ReadResult( Query, 3 ), ova linija cita kolonu-1 iz nase tabele; mi imamo tamo: id, name, steamid, ljstats (znaci trojka iz te komande je u STVARNOJ VREDNOSTI 4, znaci u nasoj tabeli je to ljstats..i idiot moze ovo da skapira :D)
87
88 }
89 if( lj[ id ] > 0 ) //pretvaramo broj u bool
90 lj_p[ id ] = true //ovo je mozda glupa forica za int->bool, ali trenutno ne znam pametnije, a i lepo radi :D
91 else
92 lj_p[ id ] = false //ako je tom igracu lj[ id ] = 0 onda mu je upamceno u tabeli da mu je lj stats iskljucen
93
94 return PLUGIN_CONTINUE
95} //sad moze da odahnemo jer smo najvazniji deo koda zavrsili...sta nam ostaje posle kratke pauze? pa ostaje da vidimo kako cemo da usnimimo igraca ili da mu apdejtujemo podatke, zavisno od pronadjen_igrac[id], pa ae i to:
96
97
98public client_disconnect( id )
99{
100 new Data[ 1 ]; Data[ 0 ] = id
101 new name_p[ 32 ]
102
103 if ( is_user_bot( id ) )
104 return PLUGIN_HANDLED
105
106 get_user_authid( id , SteamID[ id ] , charsmax( SteamID[] ) )
107 get_user_name( id, name_p, charsmax( name_p ) )
108
109 if( pronadjen_igrac[ id ] ) //ako je postojao, tj da smo ga pronasli u iznad funkciji, onda cemo da mu apdejtujemo samo ljstats kolonu, ne treba nista vise
110 {
111 server_print( "ovo je uradjeno bajo sqlite-pronadjen_igrac" ) //opet moj neki licni debilski debug heheh
112 formatex( query_cache, charsmax( query_cache ) , "UPDATE player_connect_i SET ljstats=%d WHERE steamid='%s'", lj[ id ], SteamID[ id ] ) //lj[ id ] mu ubacujemo, jer sa bool:lj_p[ id ] se nisam proslavio
113 }
114 else //ako ga ranije nismo pronasli u bazi, ajde onda ga na diskonekt sa servera ubacujemo u tabelu za svagda!
115 formatex( query_cache, charsmax( query_cache ) , "INSERT INTO player_connect_i (name, steamid, ljstats ) VALUES ('%s', '%s', '%d' )", name_p, zSteamID[ id ], lj[ id ] ) //provaljuje se valjda sta je uradjeno
116 }
117
118
119 new Handle:SqlConnection , ErrorCode;
120 SqlConnection = SQL_Connect( g_SQLTuple , ErrorCode , query_cache , charsmax( query_cache ) );
121
122 if( SqlConnection == Empty_Handle )
123 set_fail_state( query_cache )
124
125
126 //iznad smo formatirali sta saljemo za sql...ajde onda ga i stvarno posaljemo
127 RunQuery( SqlConnection , query_cache )
128}
129//pazi sad...sve je uradjeno kako treba sem jedne, isto vazne stvari..
130//moramo da provalimo kad je igrac odradio say /ljstats...aj to je ez:
131register_clcmd( "say /ljstats", "ljstats" )
132
133public ljstats( id )
134{
135 if( lj[ id ] == 0 ) //ako je ovo ocitano za igraca iz tabele, onda
136 lj[ id ] = 1 //mu se menja jer je pozvao ovu fuknciju
137 else
138 lj[ id ] = 0
139}
140
141
142if( postoji_igrac[ id ] )
143 formatex( query_cache, charsmax( query_cache ) , "SELECT id, name, steamid, ljstats FROM player_connect_i WHERE steamid='%s'" , SteamID[ id ] ) //formatirali smo poruku koju server treba da salje, a to je da selektuje vec postojeceg igraca
144else
145 formatex( query_cache, charsmax( query_cache ) , "UPDATE player_connect_i SET ljstats=%d WHERE steamid='%s'", lj[ id ], g_szSteamID[ id ] ); )