搜索
查看: 1976|回复: 5

这是AMXMOD上的IP通道保留插件(也就是可以内网优先)

[复制链接]
发表于 2005-11-9 22:23:38 | 显示全部楼层 |阅读模式 来自 中国–四川–凉山彝族自治州–西昌市
这个功能的插件在amxmod.net里面2002-11-21 年就有了,我都用了差不多2年了,看到有人原创不知道比这个好多少!所以发出来大家看看!!
大家找插件为什么不先去amx老家 amxmod.net,和amxx的老家?
其中amxmod.net中多的不得了,而且大多都能使用!!
这个功能得插件在amxmod中叫slots_reservation_by_ip, 这是源码,大家初略看看就晓得咋个用了!

/* AMX Mod script.
*
* Slots reservation by IP (reserveslotsip.sma)
*
* (c) Copyright 2002, SYZo
* This file is provided as is (no warranties).
-
* Slots reservation by IP (reserveslotsip.amx) working only with Slots reservation (adminslots.amx)
*
* Usage
* Create file cstrike/addons/amx/ips.ini
*这个路径可以在源码中改成了addons/amx/config/ips.ini再编译,这样配置文件更清楚!
* ips.ini file format:
* xxx.xxx.xxx.xxx/yyy.yyy.yyy.yyy
* where xxx.xxx.xxx.xxx - The address of the network
* yyy.yyy.yyy.yyy - Mask of a subnet
* For example:
* 192.168.224.0/255.255.224.0 保留网段
* 192.168.176.0/255.255.240.0 保留网段
* 192.168.76.97/255.255.255.255  保留单机
*以上就是ips.ini中应该设置的保留的ip端的内容.
* WARNING:
* Correct plugin.ini 正确的plugin.ini中的插件顺序
* insert "reserveslotsip.amx" before adminslots.amx 插在adminslots.amx 前面
* For example:
* welcome.amx
* admin.amx
* adminslay2.amx
* reserveslotsip.amx
* adminslots.amx
*注意上面2条的顺序!!
* adminvote.amx
* amx_atac.amx
*
*/

#include <amxmod>
#include <string>

ip_to_number(userip[16])
{
new ipb1[12]
new ipb2[12]
new ipb3[12]
new ipb4[12]
new ip
new nipb1
new nipb2
new nipb3
new nipb4
new uip[16]
copy(uip, 16, userip)
while(replace(uip, 16, ".", " ")){}
parse(uip, ipb1, 12, ipb2, 12, ipb3, 12, ipb4, 12)
nipb1 = strtonum(ipb1)
nipb2 = strtonum(ipb2)
nipb3 = strtonum(ipb3)
nipb4 = strtonum(ipb4)
ip = ((((nipb1 * 256) + nipb2) * 256) + nipb3) + ((((((nipb1 * 256) + nipb2) * 256) + nipb3) * 255) + nipb4)
return ip
}

net_hi_num(addr, mask)
{
return addr+4294967296-mask
}

net_belongs(ipaddr, ipmask, ipaddrin, ipmaskin)
{
if (ipaddr >= ipaddrin && net_hi_num(ipaddr, ipmask) <= net_hi_num(ipaddrin, ipmaskin)) {
return 1
}
return 0
}

public client_connect(id){
if (file_exists("addons\amx\ips.ini")) {
new readdata[50]
new sipaddr[16]
new sipmask[16]
new len
new userip[16]
get_user_ip(id,userip,16,1)
for(new i=0; i < 100 && read_file("addons\amx\ips.ini",i,readdata,50,len) != 0; i += 1) {
read_file("addons\amx\ips.ini",i,readdata,50,len)
replace(readdata, 50, "/", " ")
parse(readdata, sipaddr, 16, sipmask, 16)
if (net_belongs(ip_to_number(userip), ip_to_number("255.255.255.255"), ip_to_number(sipaddr), ip_to_number(sipmask)) == 1) {
set_user_flags(id,read_flags("b"))
}
}
}
return PLUGIN_CONTINUE
}

public plugin_init() {
register_plugin("Slots reservation by IP","0.1","SYZo")
*上面就是amx中插件的版权,请大家尊重作者不要修改成自己的了!
return PLUGIN_CONTINUE
}

很简单的!也很有效1.5/1.6amx amxx也应该可以通用(amxx我未测试,但是编译没问题)!!!

通过源码大家可以看到他的踢出方式和保留通道功能并不是这个插件提供的,而是由adminslots.amx提供的.
所以你首先得保证你得adminslots.amx插件得设置正常.
这个插件只是根据判断客户端IP 是否符合 IPS.ini 的ip规则如果符合就将客户设置为adminslots.amx中的B权限,然后剩下的就交给adminslots.amx插件来处理了!
发表于 2005-11-9 22:29:34 | 显示全部楼层 来自 中国–广东–广州–天河区

回复: 这是AMXMOD上的IP通道保留插件(也就是可以内网优先)

其实这个插件很早就有的了,因为很多人试了都没效果,所以我才自己做了一个!
看上面插件的源码,算法有点复杂,浪费CPU资源。其实是一个很简单的判断,用不到这么多代码!

我也发布过让你的Admin插件具有IP段优先登录功能! (免费的)
http://forum.dt-club.net/showthread.php?t=23335






回复

使用道具 举报

 楼主| 发表于 2005-11-9 22:41:28 | 显示全部楼层 来自 中国–四川–凉山彝族自治州–西昌市

回复: 这是AMXMOD上的IP通道保留插件(也就是可以内网优先)

Post by yanexp
其实这个插件很早就有的了,因为很多人试了都没效果,所以我才自己做了一个!
看上面插件的源码,算法有点复杂,浪费CPU资源。其实是一个很简单的判断,用不到这么多代码!

我也发布过让你的Admin插件具有IP段优先登录功能! (免费的)
http://forum.dt-club.net/showthread.php?t=23335





http://npower.vicp.ne...

没效果哪是不可能的,因为你看代码就知道肯定有效,只要你的adminslots插件有效!!

没效果也是adminslots插件没设置好!

没觉得算法复杂,只觉得写的很不错!我水平低哈!!
回复

使用道具 举报

发表于 2005-11-9 22:48:54 | 显示全部楼层 来自 中国–广东–广州–天河区

回复: 这是AMXMOD上的IP通道保留插件(也就是可以内网优先)

Post by nihuahome
没效果哪是不可能的,因为你看代码就知道肯定有效,只要你的adminslots插件有效!!

没效果也是adminslots插件没设置好!

没觉得算法复杂,只觉得写的很不错!我水平低哈!!


看下面这段函数:

ip_to_number(userip[16])
{
new ipb1[12]
new ipb2[12]
new ipb3[12]
new ipb4[12]
new ip
new nipb1
new nipb2
new nipb3
new nipb4
new uip[16]
copy(uip, 16, userip)
while(replace(uip, 16, ".", " ")){}
parse(uip, ipb1, 12, ipb2, 12, ipb3, 12, ipb4, 12)
nipb1 = strtonum(ipb1)
nipb2 = strtonum(ipb2)
nipb3 = strtonum(ipb3)
nipb4 = strtonum(ipb4)
ip = ((((nipb1 * 256) + nipb2) * 256) + nipb3) + ((((((nipb1 * 256) + nipb2) * 256) + nipb3) * 255) + nipb4)
return ip
}

net_hi_num(addr, mask)
{
return addr+4294967296-mask
}

net_belongs(ipaddr, ipmask, ipaddrin, ipmaskin)
{
if (ipaddr >= ipaddrin && net_hi_num(ipaddr, ipmask) <= net_hi_num(ipaddrin, ipmaskin)) {
return 1
}
return 0
}


让每个正在尝试连接的IP都要整形后才能作判断,这就是浪费CPU了,
其实只要一个contain函数就能作很灵活的判断,完全不用像它那样+-*/都用上了
回复

使用道具 举报

发表于 2005-11-10 08:55:51 | 显示全部楼层 来自 中国–四川–成都

回复: 这是AMXMOD上的IP通道保留插件(也就是可以内网优先)

Post by yanexp


让每个正在尝试连接的IP都要整形后才能作判断,这就是浪费CPU了,
其实只要一个contain函数就能作很灵活的判断,完全不用像它那样+-*/都用上了



这样比是不对的。。。给出函数体在来判断比较好些。

它没有用到除法。

当然用contain函数确实效率高的多。不过这个插件2002年就出来了,那时amx上有这个函数么?


contain的函数体:
  1. static cell AMX_NATIVE_CALL containi(AMX *amx, cell *params) /* 2 param */
  2. {
  3.   register cell *a = get_amxaddr(amx,params[2]);
  4.   register cell *b = get_amxaddr(amx,params[1]);
  5.   register cell *c = b;
  6.   cell* str = b;
  7.   cell* substr = a;
  8.   while (*c) {
  9.     if (tolower(*c) == tolower(*a)) {
  10.       c++;
  11.       if (!*++a)
  12.         return b - str;
  13.     }
  14.     else {
  15.       c = ++b;
  16.       a = substr;
  17.     }
  18.   }
  19.   return -1;
  20. }
复制代码
回复

使用道具 举报

发表于 2005-11-22 11:47:18 | 显示全部楼层 来自 日本

回复: 这是AMXMOD上的IP通道保留插件(也就是可以内网优先)

如果设置为
0.0.0.0/0.0.0.0
是不是,只踢出ping最高用户?
回复

使用道具 举报

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

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