Test

#include #include #include #pragma semicolon 1 #pragma newdecls required // Настройки подключения к MySQL const char[] MYSQL_HOST = "localhost"; // Хост базы данных const char[] MYSQL_USER = "your_username"; // Имя пользователя const char[] MYSQL_PASS = "your_password"; // Пароль const char[] MYSQL_DB = "your_database"; // Имя базы данных const int MYSQL_PORT = 3306; // Порт (по умолчанию 3306) // Объект для работы с базой данных Handle g_hDatabase = INVALID_HANDLE; // Начисляемая сумма денег const int MONEY_REWARD = 16000; // Информация о плагине public Plugin myinfo = { name = "Gender Question with Money Reward", author = "YourName", description = "Asks players their gender and gives them money upon selection.", version = "1.0", url = "https://example.com" }; // Инициализация плагина public void OnPluginStart() { // Регистрация события подключения игрока HookEvent("player_connect", Event_PlayerConnect); // Регистрация команды для изменения пола RegConsoleCmd("sm_changegender", Command_ChangeGender, "Change your gender (only once)."); // Подключение к базе данных MySQL ConnectToDatabase(); } // Подключение к базе данных MySQL void ConnectToDatabase() { // Попытка подключения g_hDatabase = SQL_Connect(MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASS, MYSQL_DB, true); if (g_hDatabase == INVALID_HANDLE) { SetFailState("Failed to connect to MySQL database."); } // Создание таблицы, если она не существует CreateDatabaseTable(); } // Создание таблицы в базе данных void CreateDatabaseTable() { char query[256]; Format(query, sizeof(query), "CREATE TABLE IF NOT EXISTS players (steamid VARCHAR(32) PRIMARY KEY, gender VARCHAR(10), changes INT DEFAULT 0, balance INT DEFAULT 0)"); SQL_TQuery(g_hDatabase, QueryCallback_CreateTable, query); } // Обработка события подключения игрока public Action Event_PlayerConnect(Event event, const char[] name, bool dontBroadcast) { // Получаем ID игрока int client = GetClientOfUserId(event.GetInt("userid")); // Проверяем, что игрок существует и находится в игре if (client == -1 || !IsClientInGame(client)) return Plugin_Continue; // Получаем SteamID игрока char steamid[32]; GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid)); // Проверяем, есть ли запись в базе данных CheckPlayerGender(client, steamid); return Plugin_Continue; } // Команда для изменения пола public Action Command_ChangeGender(int client, int args) { if (!IsClientInGame(client)) { ReplyToCommand(client, "\x04[Gender]\x01 Вы должны быть в игре, чтобы использовать эту команду."); return Plugin_Handled; } // Получаем SteamID игрока char steamid[32]; GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid)); // Проверяем, может ли игрок изменить пол CheckChangeGender(client, steamid); return Plugin_Handled; } // Проверка возможности изменения пола void CheckChangeGender(int client, const char[] steamid) { char query[256]; Format(query, sizeof(query), "SELECT changes FROM players WHERE steamid = '%s'", steamid); SQL_TQuery(g_hDatabase, QueryCallback_CheckChange, query, DBPrio_High, client); } // Обработчик запроса проверки возможности изменения пола public void QueryCallback_CheckChange(Handle owner, Handle hndl, char[] error, any client) { if (hndl == INVALID_HANDLE) { LogError("Error checking changes: %s", error); return; } if (SQL_MoreRows(hndl)) { int changes = SQL_FetchInt(hndl, 0); SQL_FreeHandle(hndl); if (changes >= 1) { PrintToChat(client, "\x04[Gender]\x01 Вы уже изменили свой пол. Больше изменений недоступно."); return; } // Если изменения разрешены, показываем меню AskGender(client); } else { SQL_FreeHandle(hndl); PrintToChat(client, "\x04[Gender]\x01 Ваш пол еще не сохранен. Используйте команду /changegender после выбора."); } } // Функция для отправки меню с вопросом void AskGender(int client) { // Создаем меню Menu genderMenu = new Menu(MenuHandler_GenderChoice); genderMenu.SetTitle("Вы девушка или парень?"); // Добавляем варианты ответа genderMenu.AddItem("male", "Я парень"); genderMenu.AddItem("female", "Я девушка"); // Отображаем меню игроку genderMenu.Display(client, MENU_TIME_FOREVER); } // Обработчик выбора в меню public int MenuHandler_GenderChoice(Menu menu, MenuAction action, int client, int param2) { if (action == MenuAction_Select) { char info[32]; menu.GetItem(param2, info, sizeof(info)); // Получаем SteamID игрока char steamid[32]; GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid)); // Сохраняем выбор в базу данных SavePlayerGender(client, steamid, info); // Добавляем тег перед никнеймом SetPlayerTag(client, info); // Начисляем деньги AddMoneyToPlayer(client, steamid, MONEY_REWARD); } else if (action == MenuAction_Cancel) { PrintToChat(client, "\x04[Gender]\x01 Вы не выбрали пол."); } delete menu; } // Сохранение выбора игрока в базу данных void SavePlayerGender(int client, const char[] steamid, const char[] gender) { char query[256]; Format(query, sizeof(query), "INSERT INTO players (steamid, gender, changes, balance) VALUES ('%s', '%s', 0, 0) ON DUPLICATE KEY UPDATE gender = '%s', changes = changes + 1", steamid, gender, gender); SQL_TQuery(g_hDatabase, QueryCallback_SaveGender, query, DBPrio_High, client); } // Обработчик запроса сохранения пола public void QueryCallback_SaveGender(Handle owner, Handle hndl, char[] error, any client) { if (hndl == INVALID_HANDLE) { LogError("Error saving gender: %s", error); return; } SQL_FreeHandle(hndl); } // Начисление денег игроку void AddMoneyToPlayer(int client, const char[] steamid, int amount) { char query[256]; Format(query, sizeof(query), "UPDATE players SET balance = balance + %d WHERE steamid = '%s'", amount, steamid); SQL_TQuery(g_hDatabase, QueryCallback_AddMoney, query, DBPrio_High, client); } // Обработчик запроса начисления денег public void QueryCallback_AddMoney(Handle owner, Handle hndl, char[] error, any client) { if (hndl == INVALID_HANDLE) { LogError("Error adding money: %s", error); return; } SQL_FreeHandle(hndl); // Уведомляем игрока о начислении денег PrintToChat(client, "\x04[Gender]\x01 Вам начислено %d монет!", MONEY_REWARD); } // Функция для добавления тега перед никнеймом void SetPlayerTag(int client, const char[] gender) { char tag[32]; if (StrEqual(gender, "male")) { Format(tag, sizeof(tag), "[Парень]"); } else if (StrEqual(gender, "female")) { Format(tag, sizeof(tag), "[Девушка]"); } char newName[MAX_NAME_LENGTH]; Format(newName, sizeof(newName), "%s %N", tag, client); SetEntityName(client, newName); }