· 8 years ago · Jun 25, 2018, 03:02 AM
1#include < a_samp >
2#include < zcmd >
3
4native WP_Hash( buffer[ ], len = sizeof( buffer ), const str[ ] );
5
6#define DB_USE_WHIRLPOOL true
7#define DB_LOG_TO_CHAT false
8#define DB_DEBUG false
9
10#include < sqlitei >
11
12main( ) { }
13
14new const
15 DATABASE_NAME[] = "my_server.db";
16
17new
18 DB:g_db,
19 DBStatement:g_stmt_account_exists,
20 DBStatement:g_stmt_log_in,
21 DBStatement:g_stmt_register,
22
23 g_IsLoggedIn[ MAX_PLAYERS ],
24 g_IsRegistered[ MAX_PLAYERS ],
25 ScoreTimer[ MAX_PLAYERS ],
26 Text:Textdraw0[ MAX_PLAYERS ];
27
28public OnGameModeInit( )
29{
30 SetGameModeText( "SQLitei testing" );
31
32 SetTimer( "UpdateTimer", 1000, true );
33
34 AddPlayerClass( 265, 1958.3783, 1343.1572, 15.3746, 270.1425, 0, 0, 0, 0, -1, -1 );
35
36 if( !( g_db = db_open_persistent( DATABASE_NAME ) ) )
37 {
38 print( "Failed to open the database." );
39 return;
40 }
41
42 db_query( g_db, "CREATE TABLE IF NOT EXISTS `users` (`userid` INTEGER PRIMARY KEY, `name` TEXT COLLATE NOCASE, `passhash` BLOB)");
43
44 g_stmt_account_exists = db_prepare( g_db, "SELECT COUNT(*) FROM `users` WHERE name = ?" );
45 g_stmt_log_in = db_prepare( g_db, "SELECT COUNT(*) FROM `users` WHERE name = ? AND `passhash` = ?" );
46 g_stmt_register = db_prepare( g_db, "INSERT INTO `users` (`name`, `passhash`) VALUES (?, ?)" );
47}
48
49public OnGameModeExit( )
50{
51 db_free_persistent( g_db );
52}
53
54public OnPlayerConnect( playerid )
55{
56 new
57 registered = false;
58
59 g_IsLoggedIn[ playerid ] = false;
60 g_IsRegistered[ playerid ] = false;
61
62 stmt_bind_value( g_stmt_account_exists, 0, DB::TYPE_PLAYER_NAME, playerid );
63 stmt_bind_result_field( g_stmt_account_exists, 0, DB::TYPE_INT, registered );
64
65 if( stmt_execute( g_stmt_account_exists ) )
66 {
67 stmt_fetch_row( g_stmt_account_exists );
68 }
69 if( registered )
70 {
71 g_IsRegistered[ playerid ] = true;
72 SendClientMessage( playerid, 0xF95F2EFF, "* This nickname is registered. Use {FFFFFF}/login [password] {F95F2E}or connect with a different nickname." );
73 }
74 else SendClientMessage(playerid, 0xF95F2EFF, "* This nickname is not registered. Use {FFFFFF}/register [password] {F95F2E} to register it.");
75 ScoreTimer[ playerid ] = SetTimerEx( "ScoreGive", 60000, true, "i", playerid );
76
77 Textdraw0[ playerid ] = TextDrawCreate( 488.0000, 9.0000, "SCORE: 0");
78 TextDrawBackgroundColor(Textdraw0[ playerid ], 255);
79 TextDrawFont(Textdraw0[ playerid ], 3);
80 TextDrawLetterSize(Textdraw0[ playerid ], 0.539999, 1.199999);
81 TextDrawColor(Textdraw0[ playerid ], -6946561);
82 TextDrawSetOutline(Textdraw0[ playerid ], 1);
83 TextDrawSetProportional(Textdraw0[ playerid ], 1);
84 return 1;
85}
86
87public OnPlayerDisconnect( playerid, reason )
88{
89 KillTimer( ScoreTimer[ playerid ] );
90 TextDrawDestroy( Textdraw0[ playerid ] );
91 return 1;
92}
93public OnPlayerRequestSpawn( playerid )
94{
95 if( !g_IsLoggedIn[ playerid ] )
96 {
97 if( g_IsRegistered[ playerid ] ) GameTextForPlayer( playerid, "~n~~n~~r~~h~You must login before you spawn", 2000, 3 );
98 else GameTextForPlayer( playerid, "~n~~n~~r~~h~You must register before you spawn", 2000, 3 );
99 return 0;
100 }
101 return 1;
102}
103
104public OnPlayerRequestClass(playerid, classid)
105{
106 SetPlayerInterior(playerid, 14);
107 SetPlayerPos(playerid, 258.4893, -41.4008, 1002.0234);
108 SetPlayerFacingAngle(playerid, 270.0);
109 SetPlayerCameraPos(playerid, 256.0815, -43.0475, 1004.0234);
110 SetPlayerCameraLookAt(playerid, 258.4893, -41.4008, 1002.0234);
111 return 1;
112}
113
114public OnPlayerSpawn( playerid )
115{
116 SetPlayerInterior( playerid, 0 );
117 TextDrawShowForPlayer( playerid, Textdraw0[ playerid ] );
118 return 1;
119}
120
121COMMAND:register( playerid, params[ ] )
122{
123 if( g_IsLoggedIn[ playerid ] ) SendClientMessage( playerid, 0xC00000FF, "* You're already logged in!" );
124 else if( g_IsRegistered[ playerid ] ) SendClientMessage( playerid, 0xC00000FF, "* This nickname is already registered." );
125 else
126 {
127 stmt_bind_value( g_stmt_register, 0, DB::TYPE_PLAYER_NAME, playerid );
128 stmt_bind_value( g_stmt_register, 1, DB::TYPE_WP_HASH, params );
129
130 if( stmt_execute( g_stmt_register ) )
131 {
132 new
133 uid = db_last_insert_rowid( g_db ),
134 buf[ 128 ];
135
136 format( buf, sizeof( buf ), "* Successfully registered. Your UID is {FFFFFF}%d{F95F2E}.", uid );
137
138 SendClientMessage( playerid, 0xF95F2EFF, buf );
139
140 g_IsRegistered[ playerid ] = true;
141 g_IsLoggedIn[ playerid ] = true;
142 }
143 else SendClientMessage( playerid, 0xC00000FF, "* Failed to register. Try reconnecting with a different nickname." );
144 }
145 return 1;
146}
147
148COMMAND:login( playerid, params[ ] )
149{
150 if( g_IsLoggedIn[ playerid ] ) SendClientMessage( playerid, 0xC00000FF, "* You're already logged in!" );
151 else if( !g_IsRegistered[ playerid ] ) SendClientMessage(playerid, 0xC00000FF, "* This nickname is not registered. Use {FFFFFF}/register [password]{F95F2E}." );
152 else
153 {
154 new
155 success;
156
157 stmt_bind_value( g_stmt_log_in, 0, DB::TYPE_PLAYER_NAME, playerid );
158 stmt_bind_value( g_stmt_log_in, 1, DB::TYPE_WP_HASH, params );
159
160 stmt_bind_result_field( g_stmt_log_in, 0, DB::TYPE_INT, success );
161
162 if (stmt_execute( g_stmt_log_in ) )
163 {
164 stmt_fetch_row( g_stmt_log_in );
165 stmt_free_result( g_stmt_log_in );
166
167 if( success )
168 {
169 SendClientMessage( playerid, 0xF95F2EFF, "* You are now logged in!" );
170
171 g_IsLoggedIn[ playerid ] = true;
172 }
173 else SendClientMessage( playerid, 0xC00000FF, "* Invalid password." );
174 }
175 }
176 return 1;
177}
178
179forward ScoreGive( playerid );
180public ScoreGive( playerid )
181{
182 SetPlayerScore( playerid, GetPlayerScore( playerid ) + 1 );
183}
184
185forward UpdateTimer( );
186public UpdateTimer( )
187{
188 for( new x; x < MAX_PLAYERS; x ++ )
189 {
190 if( !IsPlayerConnected( x ) || IsPlayerNPC( x ) ) continue;
191 new Score = GetPlayerScore( x );
192 new TDstring[ 64 ];
193 format( TDstring, sizeof( TDstring ), "SCORE: %d", Score );
194 TextDrawSetString( Textdraw0[ x ], TDstring );
195 TextDrawBackgroundColor(Textdraw0[ x ], 255);
196 TextDrawFont(Textdraw0[ x ], 3);
197 TextDrawLetterSize(Textdraw0[ x ], 0.539999, 1.199999);
198 TextDrawColor(Textdraw0[ x ], -6946561);
199 TextDrawSetOutline(Textdraw0[ x ], 1);
200 TextDrawSetProportional(Textdraw0[ x ], 1);
201 }
202 return 1;
203}