| Offline |
 |
Csatlakozott:2022.02.12. 19:19 Hozzászólások:3 Megköszönt másnak: 11 alkalommal
|
Én ezt így csinálnám! van egy mrk_core.amxx, ami: kezeli az SQL kapcsolatot (egy helyen), regisztrálja a LANG fájlt, ad nativokat a többi mrk_*.amxx pluginnek (pl. pont lekérés, mentés, stb.). a többi plugin (skins, crates, missions, market, shop, stb.) nem nyit saját SQL kapcsolatot, hanem a core‑on keresztül dolgozik minden szöveg (chat, HUD, menük, hibák) LANG fájlban van, nem a kódba. Így: átláthatóbb, könnyebb bővíteni, nem duplikálod a kódot, az SQL is egy helyen van, nem 10 külön kapcsolat. Alább egy minta, hogyan nézhet ki ez a gyakorlatban. Lang: mrk_system.txt[hu] MRK_WELCOME = Üdv a MRK rendszerben! MRK_OPEN_MENU = Megnyitottad a MRK főmenüt. MRK_NO_PERMISSION = Ehhez a funkcióhoz nincs jogosultságod. MRK_MISSION_NEW = Új küldetés érhető el számodra! MRK_MARKET_INFO = A piacon új ajánlatok jelentek meg. MRK_SHOP_BOUGHT = Sikeresen megvásároltad: %s MRK_ERROR = Hiba történt, próbáld újra később. MRK_POINTS_INFO = Jelenlegi pontjaid: %d
mrk_core.sma ( Core, SQL, Lang, Nativok) #include <amxmodx> #include <amxmisc> #include <sqlx> #define PLUGIN_NAME "MRK Core" #define PLUGIN_VERSION "1.0" #define PLUGIN_AUTHOR "Unknown" // SQL adatok – ide írd a sajátod new const SQL_HOST[] = "localhost"; new const SQL_USER[] = "user"; new const SQL_PASS[] = "pass"; new const SQL_DB[] = "mrk_db"; new Handle:g_SqlTuple; new Handle:g_Sql; // egyszerű példa: játékos pontok tárolása memóriában (SQL szinkronnal) new g_iPoints[33]; public plugin_init() { register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR); // Lang fájl register_dictionary("mrk_system.txt"); // Parancs a főmenüre register_clcmd("say /mrk", "cmdOpenMenu"); // Nativok a moduloknak register_native("mrk_get_points", "native_get_points"); register_native("mrk_set_points", "native_set_points"); register_native("mrk_add_points", "native_add_points"); } public plugin_cfg() { // SQL tuple létrehozása g_SqlTuple = SQL_MakeDbTuple(SQL_HOST, SQL_USER, SQL_PASS, SQL_DB); // Kapcsolódás new szError[128], iError; g_Sql = SQL_Connect(g_SqlTuple, iError, szError, charsmax(szError)); if (g_Sql == Empty_Handle) { log_amx("[MRK] SQL connect hiba: %s", szError); } else { log_amx("[MRK] SQL kapcsolat létrejött."); sql_create_tables(); } } public plugin_end() { if (g_Sql != Empty_Handle) { SQL_FreeHandle(g_Sql); } if (g_SqlTuple != Empty_Handle) { SQL_FreeHandle(g_SqlTuple); } } sql_create_tables() { if (g_Sql == Empty_Handle) return; new Handle:hQuery; hQuery = SQL_PrepareQuery(g_Sql, "CREATE TABLE IF NOT EXISTS mrk_players ( \ steamid VARCHAR(32) PRIMARY KEY, \ points INT DEFAULT 0 \ )" ); if (!SQL_Execute(hQuery)) { new szError[128], iError; iError = SQL_QueryError(hQuery, szError, charsmax(szError)); log_amx("[MRK] SQL tabla hiba (%d): %s", iError, szError); } SQL_FreeHandle(hQuery); } public client_authorized(id) { load_player_data(id); } public client_disconnect(id) { save_player_data(id); } load_player_data(id) { if (g_Sql == Empty_Handle || !is_user_connected(id)) return; new szAuth[32]; get_user_authid(id, szAuth, charsmax(szAuth)); new Handle:hQuery; hQuery = SQL_PrepareQuery(g_Sql, "SELECT points FROM mrk_players WHERE steamid = '%s'", szAuth ); if (!SQL_Execute(hQuery)) { new szError[128], iError; iError = SQL_QueryError(hQuery, szError, charsmax(szError)); log_amx("[MRK] SQL select hiba (%d): %s", iError, szError); SQL_FreeHandle(hQuery); return; } if (SQL_NumResults(hQuery) > 0) { g_iPoints[id] = SQL_ReadResult(hQuery, 0); } else { // nincs rekord, létrehozzuk g_iPoints[id] = 0; SQL_FreeHandle(hQuery); hQuery = SQL_PrepareQuery(g_Sql, "INSERT INTO mrk_players (steamid, points) VALUES ('%s', %d)", szAuth, g_iPoints[id] ); SQL_Execute(hQuery); } SQL_FreeHandle(hQuery); } save_player_data(id) { if (g_Sql == Empty_Handle) return; new szAuth[32]; get_user_authid(id, szAuth, charsmax(szAuth)); new Handle:hQuery; hQuery = SQL_PrepareQuery(g_Sql, "UPDATE mrk_players SET points = %d WHERE steamid = '%s'", g_iPoints[id], szAuth ); if (!SQL_Execute(hQuery)) { new szError[128], iError; iError = SQL_QueryError(hQuery, szError, charsmax(szError)); log_amx("[MRK] SQL update hiba (%d): %s", iError, szError); } SQL_FreeHandle(hQuery); } public cmdOpenMenu(id) { if (!is_user_connected(id)) return PLUGIN_HANDLED; client_print(id, print_chat, "%L", id, "MRK_OPEN_MENU"); show_main_menu(id); return PLUGIN_HANDLED; } show_main_menu(id) { new menu = menu_create("MRK Főmenü", "menu_handler"); menu_additem(menu, "Küldetések", "1"); menu_additem(menu, "Piac", "2"); menu_additem(menu, "Pontjaim", "3"); menu_display(id, menu); } public menu_handler(id, menu, item) { if (item == MENU_EXIT) { menu_destroy(menu); return PLUGIN_HANDLED; } new szData[6], szName[64], iAccess, iCallback; menu_item_getinfo(menu, item, iAccess, szData, charsmax(szData), szName, charsmax(szName), iCallback); new key = str_to_num(szData); switch (key) { case 1: { // itt hívhatod a missions plugint, vagy csak parancsot client_cmd(id, "say /mission"); } case 2: { client_cmd(id, "say /market"); } case 3: { client_print(id, print_chat, "%L", id, "MRK_POINTS_INFO", g_iPoints[id]); } } menu_destroy(menu); return PLUGIN_HANDLED; } // ===== Nativok modul pluginoknak ===== public native_get_points(plugin, params) { new id = get_param(1); if (id < 1 || id > 32) return 0; return g_iPoints[id]; } public native_set_points(plugin, params) { new id = get_param(1); new value = get_param(2); if (id < 1 || id > 32) return 0; g_iPoints[id] = value; return 1; } public native_add_points(plugin, params) { new id = get_param(1); new value = get_param(2); if (id < 1 || id > 32) return 0; g_iPoints[id] += value; return g_iPoints[id]; }
mrk_mission.sma ( Modul, Core, Nativ , Lang) #include <amxmodx> native mrk_get_points(id); native mrk_add_points(id, value); public plugin_init() { register_plugin("MRK Missions", "1.0", "8mTNNe"); register_clcmd("say /mission", "cmdMission"); } public cmdMission(id) { if (!is_user_connected(id)) return PLUGIN_HANDLED; // Példa: adunk neki 10 pontot, és kiírjuk new newPoints = mrk_add_points(id, 10); client_print(id, print_chat, "%L", id, "MRK_MISSION_NEW"); client_print(id, print_chat, "%L", id, "MRK_POINTS_INFO", newPoints); return PLUGIN_HANDLED; }
mrk_market.sma Másik modul, ugyan azt a coret-t használja#include <amxmodx> native mrk_get_points(id); native mrk_set_points(id, value); public plugin_init() { register_plugin("MRK Market", "1.0", "8mTNNe"); register_clcmd("say /market", "cmdMarket"); } public cmdMarket(id) { if (!is_user_connected(id)) return PLUGIN_HANDLED; new points = mrk_get_points(id); if (points < 50) { client_print(id, print_chat, "%L", id, "MRK_NO_PERMISSION"); return PLUGIN_HANDLED; } // levonunk 50 pontot mrk_set_points(id, points - 50); client_print(id, print_chat, "%L", id, "MRK_MARKET_INFO"); client_print(id, print_chat, "%L", id, "MRK_POINTS_INFO", mrk_get_points(id)); return PLUGIN_HANDLED; }
 A Core kezeli a SQL-t, Langot, Nativokat a modulok nem nyitnak saját SQL kapcsolatot csak a Core-t hívják így mindeg a Lang fájlba
|
|