#pragma semicolon 1
#pragma newdecls required
Database g_db; bool started;
int gPlayerCoin[MAXPLAYERS + 1];
#define PREFIX "[Тест]"
public void OnPluginStart() {
ConnectDatabase();
RegConsoleCmd("sm_coin", sm_coin);
}
public Action sm_coin(int client, int args) {
if (client && IsClientInGame(client)) {
if (g_db == null || !DB_IsStarted()) {
ReplyToCommand(client, "\x04%s \x01Нет соединения с базой данных, сообщите на форум", PREFIX);
return Plugin_Handled;
}
gPlayerCoin[client]++; // +1 монетка
DB_SaveClientStats(client); // сохраняем данные игрока
ReplyToCommand(client, "Монеток: %i", gPlayerCoin[client]);
}
return Plugin_Handled;
}
void ConnectDatabase() {
if (g_db != null) return;
if (SQL_CheckConfig("test_db")) Database.Connect(DB_Connect, "test_db", 1); // подключение к базе данных mysql
}
public void DB_Connect(Database db, const char[] error, any data) {
g_db = db;
switch (g_db) {
case null: {
LogError("[ERROR] DB_Connect: %s", error);
CreateTimer(10.0, DB_ReconnectTimer);
return;
}
}
if (error[0]) LogError("[ERROR] DB_Connect %d: %s", data, error);
g_db.SetCharset("utf8");
DB_CreateTables(g_db);
}
public Action DB_ReconnectTimer(Handle timer) {
switch (g_db) {
case null: ConnectDatabase();
}
}
void DB_CreateTables(Database db) {
char query[512];
FormatEx(query, sizeof(query), "CREATE TABLE IF NOT EXISTS `test_players` (\
`id` int(5) NOT NULL AUTO_INCREMENT,\
`auth` varchar(22) NOT NULL,\
`coin` int(12) NOT NULL,\
PRIMARY KEY (`id`), \
UNIQUE KEY `auth` (`auth`) \
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;");
db.Query(DB_PlayersTable, query, 1, DBPrio_High);
}
public void DB_PlayersTable(Database db, DBResultSet results, const char[] error, any data) {
if (error[0]) {
LogError("[ERROR] DB_PlayersTable %d: %s", data, error);
delete g_db;
g_db = null;
CreateTimer(10.0, DB_ReconnectTimer);
return;
}
switch (data) {
case 1: DB_Start();
}
}
void DB_Start() {
if (!DB_IsStarted()) {
started = true;
for (int i = 1; i <= MaxClients; i++) {
if (IsClientInGame(i)) OnClientPutInServer(i);
}
}
}
stock bool DB_IsStarted() {
return started;
}
public void OnClientPutInServer(int client) {
if (!DB_IsStarted()) return;
DB_CheckPlayer(client); // загружаю информацию об игроке
}
void DB_CheckPlayer(int client, DBPriority prio = DBPrio_Normal) {
if (g_db == null || !DB_IsStarted()) {
LogError("[IPB - Warnings] DB_CheckPlayer: g_db = (%d) or bonus %s", g_db, DB_IsStarted() ? "started" : "not started");
return;
}
char query[512], auth[32];
Client_SteamID(client, auth, sizeof(auth));
FormatEx(query, sizeof(query), "SELECT `coin` FROM `test_players` WHERE auth = '%s';", auth); // извлекаем coin из test_players где auth
g_db.Query(DB_CheckPlayer_Select, query, client, prio);
}
public void DB_CheckPlayer_Select(Database db, DBResultSet results, const char[] error, any data) {
if (!IsClientInGame(data)) return;
if (results.HasResults && results.FetchRow()) {
gPlayerCoin[data] = results.FetchInt(0);
} else {
char auth[32], query[512];
Client_SteamID(data, auth, sizeof(auth));
FormatEx(query, sizeof(query), "INSERT INTO `test_players` (`auth`, `coin`) VALUES ('%s', '%d');", auth, gPlayerCoin[data] = 0);
DB_TQueryEx(query, _, 1);
DB_CheckPlayer(data);
}
}
stock void DB_TQueryEx(const char[] query, DBPriority prio = DBPrio_Normal, any data = 0) {
if (g_db == null || !DB_IsStarted()) {
LogError("[IPB - Warnings] (data %d) DB_TQueryEx: g_db = (%d) or bonus %s", data, g_db, DB_IsStarted() ? "started" : "not started");
return;
}
g_db.Query(DB_ErrorCheck, query, data, prio);
}
public void DB_ErrorCheck(Database db, DBResultSet results, const char[] error, any data) {
if (error[0]) LogError("DB_ErrorCheck (data %d): %s", data, error);
}
void DB_SaveClientStats(int client, DBPriority prio = DBPrio_Normal) {
if (!IsValidPlayer(client)) return;
char query[512], auth[32];
Client_SteamID(client, auth, sizeof(auth));
FormatEx(query, sizeof(query), "UPDATE `test_players` SET `coin` = %d WHERE `auth` = '%s';", gPlayerCoin[client], auth); // обновляем данные игрока
DB_TQueryEx(query, prio, 1);
}
public bool Client_SteamID(int client, char[] steam, int maxlen) {
if (IsClientInGame(client)) {
return view_as<bool>(GetClientAuthId(client, AuthId_Steam2, steam, maxlen));
}
return false;
}
stock bool IsValidPlayer(int client){
if (0 < client <= MaxClients && IsClientInGame(client)) return true;
else return false;
}