CSMod反恐精英社区|提供CSPROMOD最新版本测试服务器

 找回密码
 注册

QQ登录

只需一步,快速开始

CSP1.09|CSP1.10|综合讨论 cspromod新闻|cspromod下载。

竞技外设中心 鼠标综合中心 - 装备自曝区

服务器插件技术区 SourceMod插件模块转载。

服务器OP投诉 AMXX模块插件 - CS1.6交流 - CSGO交流

查看: 15315|回复: 48

[有源码] 玩家游戏数据统计

  [复制链接]
just75 发表于 2010-10-18 08:05:39 | 显示全部楼层 |阅读模式
  1. #include <amxmodx>
  2. #include <cstrike>
  3. #include <amxmisc>
  4. #include <csx>
  5. #include <dbi>
  6. #include <acfun> // 如果你要用就删掉这个

  7. #define Lp_MAX 33
  8. new Set_Money[4] = {0,5500,3300,1100}; // 前三杀敌奖励
  9. new Lp_Kill[Lp_MAX],Lp_Death[Lp_MAX],Lp_Tk[Lp_MAX],Lp_Shot[Lp_MAX],Lp_Hit[Lp_MAX],Lp_Damage[Lp_MAX]; // 杀敌,死亡,Tk,开枪,命中,伤害
  10. new Lp_Head[Lp_MAX],Lp_vHead[Lp_MAX],Lp_OneK[Lp_MAX],Lp_OneD[Lp_MAX],Lp_FK[Lp_MAX],Lp_FD[Lp_MAX]; // 爆头,被爆头,最先杀敌,最先死亡,最后杀敌,最后死亡
  11. new Lp_Time[Lp_MAX],Lp_Round[Lp_MAX],Lp_TE[Lp_MAX],Lp_CT[Lp_MAX],Lp_SP[Lp_MAX]; // 在线时间,游戏回合,匪徒回合,警察回合,观战回合
  12. new Lp_Planted[Lp_MAX],Lp_Explode[Lp_MAX],Lp_Defusing[Lp_MAX],Lp_Defused[Lp_MAX],Lp_DefusBad[Lp_MAX]; // 安装C4,爆破C4,拆除C4,拆除成功,拆除失败
  13. new Kill_Count,Death_Count,Kill_ID,Death_ID; // 杀敌计数,死亡计数,杀敌ID,死亡ID
  14. new g_host[Lp_MAX], g_user[Lp_MAX], g_pass[Lp_MAX], g_dbname[Lp_MAX], g_error[Lp_MAX],amx_sql_stats[Lp_MAX],Sql:g_dbc,Result:g_result
  15. new User_Mid[Lp_MAX]; // 玩家Mid[UserId]

  16. public plugin_init()
  17. {
  18. register_plugin("MySql数据统计", "1.3.7", "小坏/root@lovehuai.cn");
  19. register_event("SendAudio", "Event_Round_End", "a", "2%!MRAD_terwin", "2&%!MRAD_ctwin", "2&%!MRAD_rounddraw"); // 回合结束
  20. register_event("TextMsg", "Event_Round_Restart", "a", "2#Game_C", "2&#Game_w") // 服务器刷新事件
  21. register_logevent("Event_Round_Start", 2, "1=Round_Start"); // 回合开始 ggystudio说不要用HLTV事件 于是乎咱的插件就都换这个了 - -!
  22. register_event("ResetHUD", "Event_User_ResetHUD", "be", "1=0", "2=0"); // 玩家HUD刷新
  23. // register_logevent("Event_Round_End", 2, "1=Round_End"); // 回合结束
  24. // register_logevent("Event_Round_Restart", 2, "1Restart_Round_"); // 服务器刷新事件

  25. register_cvar("stats_sql_host", "127.0.0.1");
  26. register_cvar("stats_sql_user", "root");
  27. register_cvar("stats_sql_pass", "love");
  28. register_cvar("stats_sql_db", "amx");
  29. register_cvar("stats_sql_table", "dwstats");

  30. new configsDir[64];
  31. get_configsdir(configsDir, 63);
  32. server_cmd("exec %s/stats_sql.cfg", configsDir);
  33. server_exec();
  34. return PLUGIN_CONTINUE;
  35. }

  36. public plugin_cfg()
  37. {
  38. get_cvar_string("stats_sql_host",g_host,Lp_MAX);
  39. get_cvar_string("stats_sql_user",g_user,Lp_MAX);
  40. get_cvar_string("stats_sql_pass",g_pass,Lp_MAX);
  41. get_cvar_string("stats_sql_db",g_dbname,Lp_MAX);
  42. get_cvar_string("stats_sql_table", amx_sql_stats, Lp_MAX);
  43. return PLUGIN_CONTINUE
  44. }

  45. public Event_User_ResetHUD(id) // 玩家HUD刷新
  46. {
  47. Lp_Round[id]++; // 玩家回合数
  48. switch(cs_get_user_team(id)) // 团队数
  49. {
  50. case CS_TEAM_T:{Lp_TE[id]++;}
  51. case CS_TEAM_CT:{Lp_CT[id]++;}
  52. case CS_TEAM_SPECTATOR:{Lp_SP[id]++;}
  53. }
  54. return PLUGIN_CONTINUE;
  55. }

  56. public Event_Round_Start() // 回合开始
  57. {
  58. Lp_FK[Kill_ID]++; // 最后杀敌 这里感觉有点不妥 可能会引起数据乱X
  59. Lp_FD[Death_ID]++; // 最后死亡
  60. ResetID(); // 复位杀敌/死亡计数等
  61. return PLUGIN_CONTINUE;
  62. }

  63. public Event_Round_End() // 回合结束 因为没有找到好用的攻击次数统计所以暂用 get_user_rstats 来获取攻击次数
  64. {
  65. new Temp_Stats[8];
  66. for(new i=1; i<=get_playersnum(0);i++)
  67. {
  68. if(get_user_rstats(i,Temp_Stats,"") & (User_Mid[i] > 0)){
  69. Lp_Shot[i] += Temp_Stats[4];
  70. Save_User_Stats(i);
  71. }
  72. }
  73. return PLUGIN_CONTINUE;
  74. }

  75. public Event_Round_Restart() // 服务器刷新事件
  76. {
  77. ResetID(); // 服务器刷新强制复位
  78. return PLUGIN_CONTINUE;
  79. }

  80. public client_connect(id) // 玩家接入
  81. {
  82. User_Mid[id] = 0;
  83. Reset_User_Stats(id);
  84. return PLUGIN_CONTINUE;
  85. }

  86. public client_putinserver(id) // 玩家进入到游戏
  87. {
  88. Get_User_StatS3(id)
  89. return PLUGIN_CONTINUE;
  90. }

  91. public client_disconnect(id) // 玩家断开连接
  92. {
  93. new Temp_Stats[8];
  94. if(get_user_rstats(id,Temp_Stats,"") & (User_Mid[id] > 0)){
  95. Lp_Shot[id] += Temp_Stats[4];
  96. Save_User_Stats(id);
  97. }
  98. reset_user_wstats(id); // 删掉
  99. return PLUGIN_CONTINUE;
  100. }

  101. public client_damage(attacker,victim,damage,wpnindex,hitplace,TK) // 玩家受到伤害
  102. {
  103. if(!TK & attacker != victim){
  104. Lp_Hit[attacker]++; // 命中
  105. Lp_Damage[attacker] += damage; // 伤害
  106. }
  107. return PLUGIN_CONTINUE;
  108. }

  109. public client_death(Killer,Victim,wpnindex,hitplace,TK) // 玩家死亡事件
  110. {
  111. Lp_Death[Victim]++; // 死亡
  112. Lp_Kill[Killer]++; // 杀敌
  113. if(TK) {
  114. Lp_Tk[Killer]++;
  115. } else if(Killer != Victim){
  116. Kill_Count++;
  117. Death_Count++
  118. Kill_ID = Killer;
  119. Death_ID = Victim;
  120. if(Kill_Count == 1){ Lp_OneK[Killer]++; Lp_OneD[Victim]++;} // 更新玩家 最先杀敌 最先第一死亡
  121. if(hitplace==1){ // 如果死亡时是被击中头部 更新玩家爆头/被爆头
  122. Lp_Head[Killer]++;
  123. Lp_vHead[Victim]++;
  124. }
  125. if (Kill_Count < 4) { // 前三杀敌奖励
  126. cs_set_user_money(Killer,cs_get_user_money(Killer)+Set_Money[Kill_Count]);
  127. new Name[32];
  128. get_user_name(Killer,Name,32);
  129. client_print(0,print_chat,"%s 第%i杀敌! 获得$:%i 奖励",Name,Kill_Count,Set_Money[Kill_Count]);
  130. }
  131. }
  132. return PLUGIN_CONTINUE;
  133. }

  134. public bomb_planted(id) // 安放C4
  135. {
  136. Lp_Planted[id]++;
  137. return PLUGIN_CONTINUE;
  138. }

  139. public bomb_explode(id,defuser) // C4爆炸
  140. {
  141. Lp_Explode[id]++;
  142. return PLUGIN_CONTINUE;
  143. }

  144. public bomb_defusing(id) // 尝试C4中
  145. {
  146. Lp_Defusing[id]++;
  147. return PLUGIN_CONTINUE;
  148. }

  149. public bomb_defused(id) // C4拆除成功
  150. {
  151. Lp_Defused[id]++;
  152. return PLUGIN_CONTINUE;
  153. }

  154. public ResetID() // 最新杀敌/死亡 杀敌/死亡ID复位[冲0]
  155. {
  156. Kill_Count = 0;
  157. Death_Count = 0;
  158. Kill_ID = 0;
  159. Death_ID = 0;
  160. }

  161. public Get_User_StatS3(id)
  162. {
  163. User_Mid[id] = acfun_get_user_mid(id);
  164. /*
  165. 我整合了DeDe Cms的网站管理系统 这里是我在admin_sql 里register_native
  166. 这个返回的是 玩家在网站管理系统里的注册序号 如果你要用 可以把它改为get_user_name 或者ip 或者info之类的
  167. 切记要把数据库mid字段改为varchar 长度32 我这里用的是int 长度10 如果你不改
  168. 直接往里写会杯具的
  169. */
  170. new name[33];
  171. get_user_name(id,name,32);
  172. if(User_Mid[id] != 0)
  173. {
  174. g_dbc = dbi_connect(g_host,g_user,g_pass,g_dbname,g_error,Lp_MAX);
  175. if (g_dbc == SQL_FAILED)
  176. {
  177. log_amx("数据库连接失败");
  178. } else {
  179. g_result = dbi_query(g_dbc,"SELECT * FROM `%s` WHERE mid = '%i'",amx_sql_stats,User_Mid[id]);
  180. while (dbi_nextrow(g_result) > 0 )
  181. {
  182. Lp_Kill[id] = dbi_result(g_result,"Kill");
  183. Lp_Death[id] = dbi_result(g_result,"Death");
  184. Lp_Tk[id] = dbi_result(g_result,"Tk");
  185. Lp_Shot[id] = dbi_result(g_result,"Shot");
  186. Lp_Hit[id] = dbi_result(g_result,"Hit");
  187. Lp_Damage[id] = dbi_result(g_result,"Damage");
  188. Lp_Head[id] = dbi_result(g_result,"Head");
  189. Lp_vHead[id] = dbi_result(g_result,"vHead");
  190. Lp_OneK[id] = dbi_result(g_result,"OneK");
  191. Lp_OneD[id] = dbi_result(g_result,"OneD");
  192. Lp_FK[id] = dbi_result(g_result,"FK");
  193. Lp_FD[id] = dbi_result(g_result,"FD");
  194. Lp_Time[id] = dbi_result(g_result,"Time");
  195. Lp_Round[id] = dbi_result(g_result,"Round");
  196. Lp_TE[id] = dbi_result(g_result,"TE");
  197. Lp_CT[id] = dbi_result(g_result,"CT");
  198. Lp_SP[id] = dbi_result(g_result,"SP");
  199. Lp_Planted[id] = dbi_result(g_result,"Planted");
  200. Lp_Explode[id] = dbi_result(g_result,"Explode");
  201. Lp_Defusing[id] = dbi_result(g_result,"Defusing");
  202. Lp_Defused[id] = dbi_result(g_result,"Defused");
  203. Lp_DefusBad[id] = dbi_result(g_result,"DefusBad");
  204. }
  205. dbi_free_result(g_result);
  206. dbi_close(g_dbc);
  207. }
  208. }
  209. }

  210. public Save_User_Stats(id)
  211. {
  212. g_dbc = dbi_connect(g_host,g_user,g_pass,g_dbname,g_error,Lp_MAX);
  213. if (g_dbc == SQL_FAILED)
  214. {
  215. log_amx("数据库连接失败");
  216. } else {
  217. dbi_query(g_dbc,"INSERT INTO `%s` (`mid`) VALUES ('%i');",amx_sql_stats,User_Mid[id]);
  218. dbi_query(g_dbc,"set names 'utf8'");
  219. new Sql_Text[641];
  220. new name[33];
  221. get_user_name(id,name,32);
  222. Lp_Time[id] += get_user_time(id);
  223. new len = format(Sql_Text,640,"UPDATE `%s` SET `name` = '%s',`date` = '%i',`Kill` = '%i',`Death` = '%i',`Tk` = '%i',`Shot` = '%i',`Hit` = '%i',`Damage` = '%i',`Head` = '%i',`vHead` = '%i',`OneK` = '%i',`OneD` = '%i',`FK` = '%i',",
  224. amx_sql_stats,name,get_systime(),Lp_Kill[id],Lp_Death[id],Lp_Tk[id],Lp_Shot[id],Lp_Hit[id],Lp_Damage[id],Lp_Head[id],Lp_vHead[id],Lp_OneK[id],Lp_OneD[id],Lp_FK[id]);
  225. len += format(Sql_Text[len],640-len,"`FD` = '%i',`Time` = '%i',`Round` = '%i',`TE` = '%i',`CT` = '%i',`SP` = '%i',`Planted` = '%i',`Explode` = '%i',`Defusing` = '%i',`Defused` = '%i',`DefusBad` = '%i' WHERE `mid` ='%i';",
  226. Lp_FD[id],Lp_Time[id],Lp_Round[id],Lp_TE[id],Lp_CT[id],Lp_SP[id],Lp_Planted[id],Lp_Explode[id],Lp_Defusing[id],Lp_Defused[id],Lp_DefusBad[id],User_Mid[id]);
  227. dbi_query(g_dbc,"%s",Sql_Text);
  228. dbi_close(g_dbc);
  229. }
  230. }

  231. public Reset_User_Stats(id)
  232. {
  233. Lp_Kill[id] = 0;
  234. Lp_Death[id] = 0;
  235. Lp_Tk[id] = 0;
  236. Lp_Shot[id] = 0;
  237. Lp_Hit[id] = 0;
  238. Lp_Damage[id] = 0;
  239. Lp_Head[id] = 0;
  240. Lp_vHead[id] = 0;
  241. Lp_OneK[id] = 0;
  242. Lp_OneD[id] = 0;
  243. Lp_FK[id] = 0;
  244. Lp_FD[id] = 0;
  245. Lp_Time[id] = 0;
  246. Lp_Round[id] = 0;
  247. Lp_TE[id] = 0;
  248. Lp_CT[id] = 0;
  249. Lp_SP[id] = 0;
  250. Lp_Planted[id] = 0;
  251. Lp_Explode[id] = 0;
  252. Lp_Defusing[id] = 0;
  253. Lp_Defused[id] = 0;
  254. Lp_DefusBad[id] = 0;
  255. }
复制代码

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

247140593 发表于 2010-10-18 08:59:17 | 显示全部楼层
{:csmod13:}
回复 支持 反对

使用道具 举报

247140593 发表于 2010-10-18 09:12:53 | 显示全部楼层
undefined symbol "acfun_get_user_mid"
回复 支持 反对

使用道具 举报

2099502 发表于 2010-10-24 00:31:44 | 显示全部楼层
undefined symbol "acfun_get_user_mid"
回复 支持 反对

使用道具 举报

blue1ce 发表于 2010-10-28 21:03:40 | 显示全部楼层
好像是乌龟的吧,复制的还快
回复 支持 反对

使用道具 举报

cs8992679 发表于 2010-11-6 14:15:36 | 显示全部楼层
顶一个
回复 支持 反对

使用道具 举报

fz12 发表于 2010-11-10 03:48:44 | 显示全部楼层
路过顶一下
回复 支持 反对

使用道具 举报

l976753980 发表于 2010-11-15 18:13:57 | 显示全部楼层
绝对支持啊!! 很好。
回复 支持 反对

使用道具 举报

a858535399 发表于 2010-11-27 21:30:32 | 显示全部楼层
看看,支持下.
回复 支持 反对

使用道具 举报

Sui 发表于 2010-12-20 01:54:00 | 显示全部楼层
很好 支持下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Powered by Discuz!|小黑屋|网站地图|CSMod.com ( 粤ICP备11059827号 )

GMT+8, 2019-8-22 11:49 , Processed in 2.097913 second(s), 8 queries , Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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