搜索
查看: 14701|回复: 18

[AMXX 带源码] CS中文ID – MYSQL 解决卡服问题

[复制链接]
发表于 2011-2-12 14:41:36 | 显示全部楼层 |阅读模式 来自 中国–河南–郑州
本帖最后由 cuikejie 于 2011-2-12 14:45 编辑

首先声明,此插件是有sakulekingz完全编写。经我们几个连续2天的测试,目前已修复已知BUG。
我在此由衷感谢sakulekingz,让人感觉到这个网络上还是热心人比较多。


使用SQLX异步的中文ID区别与DBI的中文ID能够更好的减轻服务器负担,能够有效解决读取时卡的问题。

需求metamod_version "1.19p32" 和upatch看下面附件
  1. #include <amxmodx>
  2. #include <amxmisc>
  3. #include <fakemeta>
  4. #include <sqlx>

  5. #define PLUGIN        "Chinese Name MySQL"
  6. #define VERSION        "1.0"
  7. #define AUTHOR        "k1nader"
  8. #define LOADING        "^n^t%s v%s, Copyright (C) 2011 by %s^n"

  9. new Handle:g_SqlTuple;
  10. new g_Error[512];

  11. new g_SetAllow[33];

  12. new g_host[33];
  13. new g_user[33];
  14. new g_pass[33];
  15. new g_dbname[33];
  16. new g_tabname[33];
  17. new g_retryonce[33];

  18. public plugin_init()
  19. {
  20.         register_plugin(PLUGIN, VERSION, AUTHOR);
  21.         server_print(LOADING,PLUGIN,VERSION,AUTHOR);
  22.         register_forward(FM_ClientUserInfoChanged, "fwdClientUserInfoChanged");

  23.         register_cvar("amx_sql_host", "127.0.0.1");
  24.         register_cvar("amx_sql_user", "");
  25.         register_cvar("amx_sql_pass", "");
  26.         register_cvar("amx_sql_db", "");
  27.         register_cvar("amx_sql_table", "admins");

  28.         new configsDir[64];
  29.         get_configsdir(configsDir, 63);
  30.         server_cmd("exec %s/sql.cfg", configsDir);
  31.         server_exec();
  32. }

  33. public plugin_cfg()
  34. {
  35.         get_cvar_string("amx_sql_host",g_host,32);
  36.         get_cvar_string("amx_sql_user",g_user,32);
  37.         get_cvar_string("amx_sql_pass",g_pass,32);
  38.         get_cvar_string("amx_sql_db",g_dbname,32);
  39.         get_cvar_string("amx_sql_table",g_tabname,32);
  40.         MySql_Init();
  41. }

  42. public MySql_Init()
  43. {
  44.         g_SqlTuple = SQL_MakeDbTuple(g_host,g_user,g_pass,g_dbname);
  45.         new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,charsmax(g_Error));
  46.         if(SqlConnection == Empty_Handle)
  47.                 set_fail_state(g_Error);

  48.         new Handle:Queries;
  49.         Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS %s (auth varchar(32),cnname varchar(32))", g_tabname);
  50.         if(!SQL_Execute(Queries))
  51.         {
  52.                 SQL_QueryError(Queries,g_Error,charsmax(g_Error));
  53.                 set_fail_state(g_Error);
  54.         }
  55.         SQL_FreeHandle(Queries);
  56.         SQL_FreeHandle(SqlConnection);
  57. }

  58. public Load_Mysql_Datex(id)
  59. {
  60.         if(is_user_connected(id))
  61.         {
  62.                 new szTemp[512];

  63.                 new Data[1];
  64.                 Data[0] = id;
  65.                 new szUidsetinfo[32];
  66.                 get_user_name(id,szUidsetinfo,31);
  67.                 format(szTemp,charsmax(szTemp),"SELECT CAST(CONVERT(`cnname` USING utf8) AS BINARY) FROM `%s` WHERE (`%s`.`auth` = '%s')", g_tabname, g_tabname, szUidsetinfo);
  68.                 SQL_ThreadQuery(g_SqlTuple,"register_client_datex",szTemp,Data,1);
  69.                 return PLUGIN_CONTINUE;
  70.         }
  71.         return PLUGIN_CONTINUE;
  72. }

  73. public register_client_datex(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)
  74. {
  75.         switch(FailState)
  76.         {
  77.                 case TQUERY_CONNECT_FAILED: log_amx("Load - Could not connect to SQL database.  [%d] %s", Errcode, Error);
  78.                 case TQUERY_QUERY_FAILED: log_amx("Load Query failed. [%d] %s", Errcode, Error);
  79.         }

  80.         new id;
  81.         id = Data[0];

  82.         if(SQL_NumResults(Query) < 1)
  83.                 return PLUGIN_HANDLED;

  84.         new info[2];
  85.         info[0] = id;
  86.         info[1] = get_user_flags(id);
  87.         set_task(1.0, "set_access", _, info , 2);

  88.         new CsName[32];

  89.         SQL_ReadResult(Query, 0, CsName, 31);

  90.         set_user_info(id, "name", CsName);
  91.         g_SetAllow[id] = 1;

  92.         return PLUGIN_HANDLED;
  93. }

  94. public set_access(info[2])
  95. {
  96.         new id = info[0];
  97.         if (is_user_connected(id))
  98.         {
  99.                 remove_user_flags(id);
  100.                 set_user_flags(id, info[1]);
  101.         }
  102. }

  103. public client_connect(id)
  104. {
  105.         g_SetAllow[id] = 0;
  106.         if (!g_retryonce[id])
  107.         {
  108.                 g_retryonce[id] = 1;
  109.                 client_cmd(id, "retry");
  110.         }
  111. }

  112. public client_putinserver(id)
  113.         return Load_Mysql_Datex(id);

  114. public fwdClientUserInfoChanged(id, buffer)
  115. {
  116.         if (!is_user_connected(id))
  117.                 return FMRES_IGNORED

  118.         if (!g_SetAllow[id])
  119.         {
  120.                 new oldname[32], newname[32];
  121.                 get_user_name(id, oldname, 31);
  122.                 get_user_info(id, "name", newname, 31);

  123.                 if (strcmp(newname, oldname) == 0)
  124.                         return FMRES_IGNORED;

  125.                 if (containi(newname, "[NO-sXe-I]")!=-1)
  126.                 {
  127.                         formatex(newname, 31, "[NO-sXe-I] %s", oldname);
  128.                         set_user_info(id, "name",newname);
  129.                 }
  130.                 else
  131.                         set_user_info(id, "name", oldname);

  132.                 return FMRES_SUPERCEDE;
  133.         }
  134.         else
  135.                 g_SetAllow[id] = 0;
  136.         return FMRES_SUPERCEDE;
  137. }

  138. public plugin_end()
  139.         SQL_FreeHandle(g_SqlTuple);
复制代码
中文ID使用方法:amxmodx/config/sql.cfg 设置好SQL的链接参数。
注意如果服务端未使用中文破解,需要upatch来进行补丁。(unpatch 见附件)
upatch使用方法:
一、需求
metamod v1.19-p32

二、安装步骤
1、新建目录“{MODDIR}/addons/upatch”。
2、将文件“upatch.dll”(Windows)或“upatch_i386.so”(Linux)复制到目录“{MODDIR}/addons/upatch”。
3、在“{MODDIR}/addons/metamod/plugins.ini”中增加一行(Windows):
win32 addons/upatch/upatch.dll
或(Linux)
linux addons/upatch/upatch_i386.so
4、将 upatch.cfg 复制到服务器根目录或游戏MOD目录(cstrike)。
5、根据需要编辑 upatch.cfg 文件。
6、重启你的CS服务器。

请根据你的数据库类型进行下载

如果大家觉得点通下载扣点通币太多可以去sakulekingz的网站下载
http://www.roshis.org/2011/02/chinese-id-for-mysqlx.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注个册吧

×
发表于 2011-2-12 19:56:48 | 显示全部楼层 来自 中国–浙江–宁波–余姚市
纯支持了.HL里面的中文ID看着还是比较别扭,语音出来的时候只能是乱码,毕竟已经是夕阳游戏啦.
回复

使用道具 举报

发表于 2011-2-15 08:59:51 | 显示全部楼层 来自 中国–天津–天津
谢谢楼主啦
回复

使用道具 举报

发表于 2011-2-15 10:26:33 | 显示全部楼层 来自 中国–江苏–连云港
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2011-2-15 12:00:41 | 显示全部楼层 来自 中国–天津–天津
换成中文名与奖励插件冲突,造成服务器死机,有中文名的奖励插件吗,怎么解决啊

点评

奖励插件还是amx的内核不是amxx的吧?  发表于 2013-7-23 06:21
回复

使用道具 举报

发表于 2011-3-22 14:56:38 | 显示全部楼层 来自 中国–云南–临沧
非常棒
。。。。
回复

使用道具 举报

发表于 2011-3-23 21:38:14 | 显示全部楼层 来自 中国–甘肃–天水
这个看下。希望能用到!
回复

使用道具 举报

发表于 2011-3-24 11:32:27 | 显示全部楼层 来自 中国–广东–广州–番禺区
这东西确实不错!留着肯定有用!
回复

使用道具 举报

发表于 2011-7-31 07:37:53 | 显示全部楼层 来自 中国–江苏–无锡
很不错的
回复

使用道具 举报

发表于 2011-8-25 17:14:45 | 显示全部楼层 来自 中国–四川–德阳–广汉市
不晓得管不管用!
回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

快速回复 返回顶部 返回列表