|
我修改了 Rulzy 的插件 来实现有B权限的ID只能在指定的IP登陆。
如果listip.cfg IP列表文件只有一个IP时正常,当我添加多个IP时
在指定IP用B权限登陆也会被踢。求高手帮助
附上代码
[PHP]
/*
功能:禁止指定IP(段)进入
作者:Rulzy
命令及使用说明:
amx_addip <开始IP> [结束IP] - 禁止此IP(段)进入
amx_writeip - 将禁止进入的IP(段)信息保存到文件
amx_listip - 查看被禁止进入的IP(段)
amx_removeip <列表索引> [是否重写到文件] - 移除指定的IP(段),请先用 amx_listip 查看列表索引
使用时要注意,IP段不能从小于等于"127.255.255.255"的IP跨到大于等于"128.0.0.0"的IP,否则将无效。
*/
#include <amxmodx>
#include <amxmisc>
#define MAX_IPLIST_COUNT 2048
new g_iplist[MAX_IPLIST_COUNT][2]
new g_IpCount = 0
public plugin_init()
{
register_plugin("IP Filter", "1.0", "Rulzy")
register_concmd("amx_addip", "cmdAddIp", ADMIN_BAN, "<ip from> [ip to]")
register_concmd("amx_writeip", "cmdWriteIp", ADMIN_BAN, "- write ip list to file")
register_concmd("amx_listip", "cmdListIp", ADMIN_BAN, "- display ip list in console")
register_concmd("amx_removeip", "cmdRemoveIp", ADMIN_BAN, "<index> [write_to_file=0] - remove the ip by index, 0 for all")
new dir[256]
get_configsdir(dir, 255)
server_cmd("exec %s/listip.cfg", dir)
server_exec()
}
public cmdAddIp(id, level, cid)
{
if(!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
if(g_IpCount>=MAX_IPLIST_COUNT)
{
if(id==0)
server_print("Max ip count reached.")
else
console_print(id, "Max ip count reached.")
return PLUGIN_HANDLED
}
new ip[20], b1[4], b2[4], b3[4], b4[4]
read_argv(1, ip, 19)
replace_all(ip, 19, ".", " ")
parse(ip, b1, 3, b2, 3, b3, 3, b4, 3)
g_iplist[g_IpCount][0] = str_to_num(b1)*0x1000000+str_to_num(b2)*0x10000+str_to_num(b3)*0x100+str_to_num(b4)
read_argv(2, ip, 19)
if(ip[0])
{
replace_all(ip, 19, ".", " ")
parse(ip, b1, 3, b2, 3, b3, 3, b4, 3)
g_iplist[g_IpCount][1] = str_to_num(b1)*0x1000000+str_to_num(b2)*0x10000+str_to_num(b3)*0x100+str_to_num(b4)
}else{
g_iplist[g_IpCount][1] = g_iplist[g_IpCount][0]
}
new maxplayers = get_maxplayers()
new iip, userid
for(new i=1;i<=maxplayers;i++)
{
if(!is_user_connected(i)) continue
get_user_ip(i, ip, 19, 1)
replace_all(ip, 19, ".", " ")
parse(ip, b1, 3, b2, 3, b3, 3, b4, 3)
iip = str_to_num(b1)*0x1000000+str_to_num(b2)*0x10000+str_to_num(b3)*0x100+str_to_num(b4)
if(g_iplist[g_IpCount][0]<=iip && iip<=g_iplist[g_IpCount][1])
{
userid = get_user_userid(i)
server_cmd("kick #%d 对不起,管理员禁止你的IP登录", userid)
// CS1.5 使用如下命令(可将上面一行注释掉):
//client_cmd(i, "echo ^"Sorry, your ip is forbidden by admin.^"")
//server_cmd("kick #%d", userid)
}
}
g_IpCount++
return PLUGIN_HANDLED
}
public cmdWriteIp(id, level, cid)
{
if(!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED
new filename[256], b1, b2, b3, b4
get_configsdir(filename, 255)
add(filename, 255, "/listip.cfg")
new file = fopen(filename, "wt")
for(new i=0;i<g_IpCount;i++)
{
b1 = g_iplist[0]/0x1000000
if(b1<0) b1 += 256
b2 = (g_iplist[0]&0x00FF0000)/0x10000
b3 = (g_iplist[0]&0x0000FF00)/0x100
b4 = g_iplist[0]&0x000000FF
fprintf(file, "amx_addip %d.%d.%d.%d", b1, b2, b3, b4)
if(g_iplist[1]!=g_iplist[0])
{
b1 = g_iplist[1]/0x1000000
if(b1<0) b1 += 256
b2 = (g_iplist[1]&0x00FF0000)/0x10000
b3 = (g_iplist[1]&0x0000FF00)/0x100
b4 = g_iplist[1]&0x000000FF
fprintf(file, " %d.%d.%d.%d", b1, b2, b3, b4)
}
fprintf(file, "^n")
}
fclose(file)
if(id==0)
server_print("Writeing %d filter ip(s) to file successful.", g_IpCount)
else
console_print(id, "Writeing %d filter ip(s) to file successful.", g_IpCount)
return PLUGIN_HANDLED
}
public cmdListIp(id, level, cid)
{
if(!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED
new ip1[20], ip2[20], b1, b2, b3, b4
if(id==0)
{
server_print("=============== Filter IP List ===============")
server_print(" #. %22s%16s", "IP FROM", "IP TO")
}else{
console_print(id, "=========== Filter IP List ===========")
console_print(id, " #. %22s%16s", "IP FROM", "IP TO")
}
for(new i=0;i<g_IpCount;i++)
{
b1 = g_iplist[0]/0x1000000
if(b1<0) b1 += 256
b2 = (g_iplist[0]&0x00FF0000)/0x10000
b3 = (g_iplist[0]&0x0000FF00)/0x100
b4 = g_iplist[0]&0x000000FF
format(ip1, 19, "%d.%d.%d.%d", b1, b2, b3, b4)
copy(ip2, 19, "-")
if(g_iplist[1]!=g_iplist[0])
{
b1 = g_iplist[1]/0x1000000
if(b1<0) b1 += 256
b2 = (g_iplist[1]&0x00FF0000)/0x10000
b3 = (g_iplist[1]&0x0000FF00)/0x100
b4 = g_iplist[1]&0x000000FF
format(ip2, 19, "%d.%d.%d.%d", b1, b2, b3, b4)
}
if(id==0)
server_print("%4d. %22s%16s", i+1, ip1, ip2)
else
console_print(id, "%4d. %22s%16s", i+1, ip1, ip2)
}
if(id==0)
server_print("==============================================")
else
console_print(id, "==============================")
return PLUGIN_HANDLED
}
public cmdRemoveIp(id, level, cid)
{
if(!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new arg[12], arg2[2], index
read_argv(1, arg, 11)
read_argv(2, arg2, 1)
index = str_to_num(arg)
if(index>g_IpCount)
{
if(id==0)
server_print("Not that ip list by index.")
else
console_print(id, "Not that ip list by index.")
return PLUGIN_HANDLED
}
if(index==0)
{
g_IpCount = 0
if(id==0)
server_print("All ip lists have been removed.")
else
console_print(id, "All ip lists have been removed.")
if(arg2[0]) cmdWriteIp(id, level, cid)
return PLUGIN_HANDLED
}
new ip1[20], ip2[20], b1, b2, b3, b4
index--
b1 = g_iplist[index][0]/0x1000000
if(b1<0) b1 += 256
b2 = (g_iplist[index][0]&0x00FF0000)/0x10000
b3 = (g_iplist[index][0]&0x0000FF00)/0x100
b4 = g_iplist[index][0]&0x000000FF
format(ip1, 19, "%d.%d.%d.%d", b1, b2, b3, b4)
ip2[0] = 0
if(g_iplist[index][1]!=g_iplist[index][0])
{
b1 = g_iplist[index][1]/0x1000000
if(b1<0) b1 += 256
b2 = (g_iplist[index][1]&0x00FF0000)/0x10000
b3 = (g_iplist[index][1]&0x0000FF00)/0x100
b4 = g_iplist[index][1]&0x000000FF
format(ip2, 19, " - %d.%d.%d.%d", b1, b2, b3, b4)
}
for(new i=index+1;i<g_IpCount;i++)
{
g_iplist[i-1][0] = g_iplist[0]
g_iplist[i-1][1] = g_iplist[1]
}
g_IpCount--
if(id==0)
{
server_print("Filter IP removed: %s%s", ip1, ip2)
server_cmd("amx_listip")
}
else
{
console_print(id, "Filter IP removed: %s%s", ip1, ip2)
client_cmd(id, "amx_listip")
}
if(arg2[0]) cmdWriteIp(id, level, cid)
return PLUGIN_HANDLED
}
public client_authorized(id)
{
if ( get_user_flags(id) & ADMIN_RESERVATION )
{
new ip[20], b1[4], b2[4], b3[4], b4[4], iip, userid
get_user_ip(id, ip, 19, 1)
replace_all(ip, 19, ".", " ")
parse(ip, b1, 3, b2, 3, b3, 3, b4, 3)
iip = str_to_num(b1)*0x1000000+str_to_num(b2)*0x10000+str_to_num(b3)*0x100+str_to_num(b4)
for(new i=0;i<g_IpCount;i++)
if(g_iplist[0]<=iip && iip<=g_iplist[1])
{
//userid = get_user_userid(id)
//server_cmd("kick #%d 对不起,管理员禁止你的IP登录", userid)
// CS1.5 使用如下命令(可将上面一行注释掉):
//client_cmd(i, "echo ^"Sorry, your ip is forbidden by admin.^"")
//server_cmd("kick #%d", userid)
//break;
}
else
{
userid = get_user_userid(id)
server_cmd("kick #%d 对不起,您的ID只允许在雪风网吧连锁店登陆", userid)
}
}
}
public client_infochanged(id)
{
new newname[32]
new oldname[32]
get_user_name(id,oldname,31)
get_user_info(id,"name",newname,31)
if ( is_user_connected(id) && !equal(newname,oldname))
{
if ( get_user_flags(id) & ADMIN_RESERVATION )
{
new ip[20], b1[4], b2[4], b3[4], b4[4], iip, userid
get_user_ip(id, ip, 19, 1)
replace_all(ip, 19, ".", " ")
parse(ip, b1, 3, b2, 3, b3, 3, b4, 3)
iip = str_to_num(b1)*0x1000000+str_to_num(b2)*0x10000+str_to_num(b3)*0x100+str_to_num(b4)
for(new i=0;i<g_IpCount;i++)
if(g_iplist[0]<=iip && iip<=g_iplist[1])
{
//userid = get_user_userid(id)
//server_cmd("kick #%d 对不起,管理员禁止你的IP登录", userid)
// CS1.5 使用如下命令(可将上面一行注释掉):
//client_cmd(i, "echo ^"Sorry, your ip is forbidden by admin.^"")
//server_cmd("kick #%d", userid)
//break;
}
else
{
userid = get_user_userid(id)
server_cmd("kick #%d 对不起,您的ID只允许在雪风网吧登陆", userid)
}
}
}
return PLUGIN_CONTINUE
}
[/PHP] |
|