【讨论】奇怪了,关于nwb13与hnroc 两者的显IP地址插件问题!
nwb132005-1-15 显示地址插件 AMXX1.0 版
http://forum.dt-club.net/showthread.php?t=17354
hnroc
显示IP及城市插件 for amx0.9.9详细制作方法!
http://forum.dt-club.net/showthread.php?t=17495
【讨论】:
我这因为一直使用AMX版插件,之前就用了hnroc提供的显IP地址插件,发觉每有玩家登录后在服务器执行IP查询时总会卡一下,
今天我试着将nwb13的AMXX1.0 版改为AMX版,已经正常使用中,可是并没有像hnroc那个会有卡机的现象,真是奇怪了,不知关健原因是什么,难道是两者因为使用不同的sql查询方式,IP数据差不多相同的情况下,nwb13的查询方式并不会引起服务器卡现象,并很顺畅得到地址,我真想不通了
希望nwb13和hnroc能对此问题讨论下, 多谢!!! 请问你们俩位都去哪了,我现在正在交换代码和数据库调试,看看关健在哪里~ 第一在于查询的时间
我的是按照闪闪的建议改的,在玩家连接的时候去查询
而hnroc的是在玩家完全连接入服务器时查询的
第二是连接的数量
我的是只有一个连接存在
hnroc的是有可能多个连接同时存在
你可以仔细看看代码中的区别
对了,hnroc的帖子后有我跟的帖子,里面有我对他的版本优化后的代码,你试试看 即使玩家不多,只要执行到sql查询处就会微卡一下,你的就一点也不会,当没事通过了,呵呵~
我试了你优先后的代码也会卡一下呀,真不明白了
卡当然不会是很明显,只不过在流量状态那可以看出来 那就只能说还有amx和amxx的mysql模块的问题了 yanexp 能不能 把你的改的AMX版的共享一下 。以前我用的也卡所以就不用了 Post by hai1989
yanexp 能不能 把你的改的AMX版的共享一下 。以前我用的也卡所以就不用了
好的,当然没问题,以下是我改好后的AMX版显IP地址插件
#include <amxmod>
#include <amxmisc>
#include <mysql>
#define DEBUG
#define HUD_CHANNEL 9
#define MSG_DELAY_TIME 5.0
new g_country,g_prov,g_city,g_addr
new g_buffer
new bool:g_specMode
new bool:g_sql_statu
new g_sql
public plugin_init() {
register_plugin("IP to address","0.2.1","nwb13")
register_cvar("amx_mysql_host","127.0.0.1")
register_cvar("amx_mysql_user","root")
register_cvar("amx_mysql_pass","***")
register_cvar("amx_mysql_db","amx")
register_cvar("amx_mysql_table","ipdatau")
register_cvar("amx_print_chat", "1")
register_srvcmd("amx_load_ita","sql_init")
register_event("TextMsg","setSpecMode","bd","2&ec_Mod")
register_event("StatusValue","showipinfo","bd","1=2")
new configsDir
get_basedir(configsDir, 127)
server_cmd("exec %s/config/mysql.cfg", configsDir)
server_cmd("amx_load_ita")
}
public sql_init() {
new host,user,pass,db,table,error
get_cvar_string("amx_mysql_host",host,63)
get_cvar_string("amx_mysql_user",user,31)
get_cvar_string("amx_mysql_pass",pass,31)
get_cvar_string("amx_mysql_db",db,31)
get_cvar_string("amx_mysql_table",table,31)
#if defined DEBUG
server_print("Sql setting:host[%s] user[%s] password[%s] database[%s] table[%s]",host,user,pass,db,table)
#endif
#if defined DEBUG
server_print("Start to connect sql server.")
#endif
new sql = mysql_connect(host,user,pass,db,error,127)
if (sql <= 1){
server_print(" Connect to sql server fail, please check your settings or sql server.")
g_sql_statu = false
}else{
server_print(" Connect to sql server success.")
g_sql_statu = true
g_sql = sql
}
if (g_sql_statu == true){
#if defined DEBUG
server_print("Creat table %s in sql server if it not exist.",table)
#endif
}
}
public setSpecMode(id) {
new arg
read_data( 2 , arg , 11 )
g_specMode = ( arg == '4' )// 设置为第一人称视角
return PLUGIN_HANDLED
}
// ip 计算
ip_to_number(userips){
new ipb1,ipb2,ipb3,ipb4
new ip
new nipb1,nipb2,nipb3,nipb4
new uip
copy(uip, 16, userips)
while(replace(uip, 16, ".", " ")){}
parse(uip, ipb1, 12, ipb2, 12, ipb3, 12, ipb4, 12)
nipb1 = str_to_num(ipb1)
nipb2 = str_to_num(ipb2)
nipb3 = str_to_num(ipb3)
nipb4 = str_to_num(ipb4)
ip=nipb1*16777216 + nipb2*65536 + nipb3*256 + nipb4
return ip
}
public showipinfo(id){
if ( g_specMode && g_sql_statu ){
new a = read_data(2)
if ( is_user_connected(a) ){
new name
get_user_name(a,name,31)
format(g_buffer,511,"%s^n来自^n%s^n%s",name,g_country,g_addr)
set_hudmessage(200, 100, 0, 0.85, 0.35, 0, 6.0, 8.0, 0.5, 0.15, 8)// 显示观察视角坐标 右上角
show_hudmessage(id,g_buffer)
}
}
return PLUGIN_HANDLED
}
public client_connect(id){
if (!g_sql_statu)
return PLUGIN_HANDLED
new ipaddr,name,userip,query,table,error
get_user_ip(id,userip,16,1)
get_user_name(id,name,31)
get_cvar_string("amx_mysql_table",table,31)
ipaddr=ip_to_number(userip)
if (ipaddr >=0)
format(query, 1024, "SELECT * FROM %s WHERE StartIP <=%d ORDER BY StartIP DESCLIMIT 0 , 1", table, ipaddr)
else
format(query, 1024, "SELECT * FROM %s WHERE StartIP <=%d + 4294967296 ORDER BY StartIP DESCLIMIT 0 , 1", table, ipaddr)
// 查找需要的数据
#if defined DEBUG
new ipaddrs
numtostr(ipaddr,ipaddrs,16)
//server_print(" Search data from table %s IP:%s/%s",table,ipaddrs,userip)
client_print(0,print_chat,"* Search data from table %s IP:%s/%s",table,ipaddrs,userip)
#endif
new Res = mysql_query(g_sql,query)
if (Res < 1) {
mysql_error(g_sql,error,127)
server_print(" Sql error '%s', can't load address.",error)
//mysql_free_result(Res)
//write_to_file(id,name,userip,Res,0)
return PLUGIN_HANDLED
}else if (Res ==0) {
server_print(" Warning! Ip[%s] not find in sql server!",userip)
return PLUGIN_HANDLED
}
// 读取数据
while(mysql_nextrow(Res) > 0 ) {
mysql_getfield(Res, 3, g_country, 127)
mysql_getfield(Res, 6, g_addr, 254)
}
if (strlen(g_country) == 0)
if (strlen(g_addr) == 0)
#if defined DEBUG
server_print(" Read address success! Player[%s] IP[%s] address[%s, %s, %s, %s]", name, userip, g_country, g_prov, g_city, g_addr)
#endif
return PLUGIN_HANDLED
}
public client_putinserver(id){
if (!g_sql_statu)
return PLUGIN_HANDLED
new parm
parm = id
set_task(MSG_DELAY_TIME,"show_msg",6666666,parm,2)
return PLUGIN_HANDLED
}
public client_disconnect(id){
if (g_sql_statu == false)
return PLUGIN_HANDLED
g_country = ""
g_prov = ""
g_city = ""
g_addr = ""
new name
get_user_name(id,name,31)
format(g_buffer,511,"%s 离开了服务器.^n期待你再次光临.",name)
set_hudmessage(255, 0, 255, 0.10, 0.55, 0, 6.0, 10.0, 0.5, 0.15, HUD_CHANNEL)
show_hudmessage(0, g_buffer)
return PLUGIN_CONTINUE
}
public show_msg(parm[]){
new name,id //server_name,id
id = parm
get_user_name(id,name,31)
format(g_buffer,511,"进入了服务器, 来自: %s, %s, 祝您玩得愉快!",g_country,g_addr)
if (get_cvar_num("amx_print_chat"))
client_print(0,print_chat,"* %s %s",name,g_buffer)
while(replace(g_buffer, 511, " ", "")){}
while(replace(g_buffer, 511, ",", "^n")){}
while(replace(g_buffer, 511, ":", "^n")){}
format(g_buffer,511,"%s %s",name,g_buffer)
set_hudmessage(0, 255, 0, 0.10, 0.55, 0, 6.0, 10.0, 0.5, 0.15, HUD_CHANNEL)
show_hudmessage(0, g_buffer)
return PLUGIN_CONTINUE
}
public plugin_end() {
if (!g_sql_statu)
return PLUGIN_CONTINUE
mysql_close(g_sql)
server_print(" SQL Connection closed!")
return PLUGIN_CONTINUE
}
数据我是使用
显示玩家IP及城市插件的2月10日IP库
http://www.dt-club.net/showthread.php?t=18240
欢迎大家继续讨论这个问题!!! 还有一点是关于ip的替换
我是借用x86提供的一段代码里改的,采用的是计算方式
hnroc是替换方式
查sql时是以这个为关键的,也许计算的方式有利于查找?! Post by nwb13
还有一点是关于ip的替换
我是借用x86提供的一段代码里改的,采用的是计算方式
hnroc是替换方式
查sql时是以这个为关键的,也许计算的方式有利于查找?!
我也觉得可能是那段IP转换的代码的问题了,不过还没空试,
要交换代码和数据表才知结果 是 amx0.99的吗??我编译出现错误,郁闷