搜索
查看: 1751|回复: 0

我修改禁止指定IP登陆插件的问题求帮助

[复制链接]
发表于 2008-1-29 16:30:05 | 显示全部楼层 |阅读模式 来自 中国–广东–东莞
我修改了 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]
游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

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