搜索
查看: 6921|回复: 22

帖上自己修改的一个插件,几个联盟服间玩家的传递!

[复制链接]
发表于 2007-7-7 15:02:18 | 显示全部楼层 |阅读模式 来自 中国–浙江–嘉兴–海宁市
网页原因,导致代码出错![color="Red"]代码请下附件!功能:
1、几个联盟服间玩家的传递! 如同一IP间不同端口的几个服的玩家传递,不同IP也可
2、[color="Red"]VIP或是OP权限的可以进入自己指定的服如27015口的服(人满也可进),不会因人满而被传递3、普通玩家进入,如人满自动传递
4、网吧内部或是特定IP段进入自动给予 B 权限,使他有进入人满服的特权。
5、[color="red"]已经在如27015服中玩的普通玩家,如人满会因特权玩家的进入而被传递到其他服,不再是以前的直接踢除了,默认是Ping高的被传递。
6、自己在用,目前没问题,你如果用了,可以提出,大家看看,呵呵,只是整合了2 个插件为一个插件而已,没有其他的奥妙!
下面是代码,自己可以相应的修改!
[PHP]/* AMX Mod X script.
* 如果OP通道插件未启用,本插件奖自动设置amx_reservation为 1 ,即保留一个通道。
* 使用方法:
* 在amxx.cfg里加入
* amx_kickmode <参数>
* 参数为 <1> 或者 <2> 。
* 1 表示 - 当服务器人满时,有OP或者VIP登陆时则踢掉一个在线时间最短的玩家。
* 2 表示 - 当服务器人满时,有OP或者VIP登陆时则踢掉一个ping值最高的玩家。
* 内网IP地址设置方法:
* amx_netbarip "IP地址的前面7位"
* 例: amx_netbarip "192.168"
*/

#include <amxmodx>
#include <amxmisc>
public plugin_init()
{
        register_plugin("Slots Reservation","1.0","Lu0007")
        register_cvar("amx_kickmode","2")   //踢Ping高的,设1 为踢时间短的
        register_cvar("amx_reservation","1")
        //预留的通道数,没有权限的玩家进入此通道时会被kick
        register_cvar("amx_netbarip","192.168") // 网吧IP段
        //默认内网IP段
        register_cvar("amx_rd_server","x.x.x.x") //要转向的目的服务器,自己修改.
        register_cvar("amx_rd_serverport","27016") //端口,自己修改
        register_cvar("amx_rd_serverpw","") //密码,留空为无密码,自己修改
}

//玩家进入初始化
public client_authorized(id) {

        new userip[17]
        new ips[8]
        new ips2[16]
        new name[33]
        new g_amx_netbarip[8]
        get_user_ip(id,userip,16,1)
        copy(ips,7,userip)  //前2段IP地址
        copy(ips2,16,userip) //全IP地址
        get_cvar_string("amx_netbarip",g_amx_netbarip,7)
        get_user_name(id,name,32)  //返回玩家名

        new rd_serverport = get_cvar_num("amx_rd_serverport")
        new rd_server[64], rd_serverpw[32]
        get_cvar_string("amx_rd_server",rd_server,63)
        get_cvar_string("amx_rd_serverpw",rd_serverpw,31)
       
        new maxplayers = get_maxplayers() //返回游戏最大人数
        new players = get_playersnum( 1 )   //统计人数 ,连正在连接的也算
        new limit = maxplayers - get_cvar_num("amx_reservation")  //服最大人数 减去预留人数
        new resType = get_cvar_num( "amx_kickmode" )    //踢人模式 是高Ping 还是时间最短的
        new who


        //当超过限制人数时
        if ( players > limit )
        {
                //进入的VIP&&OP 或是内网地址如192.168 或是如大内网IP段的如 10.0
                if ( get_user_flags(id) & ADMIN_RESERVATION || (equali(ips,g_amx_netbarip)) || (contain(ips,g_amx_netbarip)==0))
                {
                        set_user_flags(id, get_user_flags(id)|ADMIN_IMMUNITY)
                        //set_user_flags(id,read_flags("b"))
                        //设置玩家标记,b 为可通过预留通道加入服务器
                        switch(resType) {     
                                case 1:
                                        who = kickFresh() //踢时间短
                                case 2:
                                        who = kickLag() //踢高Ping
                                        }
                        if(who)  {
                                   get_user_name( who, name , 31 )
                                   client_cmd(id,"echo ^"* %s 已被KICK或是转移!^"" ,name )
                                   }
                        return PLUGIN_CONTINUE
                 
                }
                //如是外网普通用户进入
                if ( is_user_bot(id) ) //如是机器人,直接踢机器人
                        server_cmd("kick #%d 服务器人满! 请稍后再进入。", get_user_userid(id)  )
                else  {  //是人的,提示并踢除
                        //server_cmd("kick #%d 服务器人满! 请稍后再进入。", get_user_userid(id)  )
                        if ( !equal(rd_serverpw,"") )
                                client_cmd(id,"echo ^"Redirection - Set Password to %s^";password %s",rd_serverpw,rd_serverpw)
                        client_cmd(id,"echo ^"Redirection -  Redirecting to %s:%d^";connect %s:%d",rd_server,rd_serverport,rd_server,rd_serverport)
                        }
                return PLUGIN_HANDLED
        }
        return PLUGIN_CONTINUE
}
//踢Ping高的
kickLag() {
        new rd_serverport = get_cvar_num("amx_rd_serverport")
        new rd_server[64], rd_serverpw[32]
        get_cvar_string("amx_rd_server",rd_server,63)
        get_cvar_string("amx_rd_serverpw",rd_serverpw,31)
        new who = 0, ping, loss, worst = -1
        new maxplayers = get_maxplayers()
        for(new i = 1; i <= maxplayers; ++i) {
                if ( !is_user_connected(i) && !is_user_connecting(i) )
                        continue // not used slot  
                if (get_user_flags(i)&ADMIN_RESERVATION)
                        continue // has reservation, skip him
                get_user_ping(i,ping,loss) // get ping
                if ( ping > worst ) { //找出Ping最大的
                        worst = ping
                        who = i
                                        }
                                                }
        if(who)
                if ( is_user_bot(who) ) //如是机器人的
                        server_cmd("kick #%d [OP通道] 服务器踢高ping! 请稍后再进入。" , get_user_userid(who)  )
                else  { //如是人的
                        //server_cmd("kick #%d [OP通道] 服务器踢高ping! 请稍后再进入。" , get_user_userid(who)  )
                        if ( !equal(rd_serverpw,"") )
                                client_cmd(who,"echo ^"Redirection - Set Password to %s^";password %s",rd_serverpw,rd_serverpw)
                        client_cmd(who,"echo ^"Redirection -  Redirecting to %s:%d^";connect %s:%d",rd_server,rd_serverport,rd_server,rd_serverport)
                        }
        return who  
}
//踢时间短的
kickFresh() {
        new rd_serverport = get_cvar_num("amx_rd_serverport")
        new rd_server[64], rd_serverpw[32]
        get_cvar_string("amx_rd_server",rd_server,63)
        get_cvar_string("amx_rd_serverpw",rd_serverpw,31)
        new who = 0, itime, shortest = 0x7fffffff
        new maxplayers = get_maxplayers()
        for(new i = 1; i <= maxplayers; ++i){
                if ( !is_user_connected(i) && !is_user_connecting(i) )//不是连接和不是正连接
                        continue // not used slot
                if (get_user_flags(i)&ADMIN_RESERVATION) //是管理员的
                        continue // has reservation, skip him
                itime = get_user_time(i) // get user playing time with connection duration  
                if ( shortest > itime ) {
                        shortest = itime
                        who = i
                                        }
                                                }
        if(who) //如找到最短时间的
                if ( is_user_bot(who) ) //如是个机器人
                        server_cmd("kick #%d [OP通道] 服务器预留OP通道! 请稍后再进入。", get_user_userid(who)  )
                else  { //如是个人的
                        //server_cmd("kick #%d [OP通道] 服务器预留OP通道! 请稍后再进入。", get_user_userid(who)  )
                        if ( !equal(rd_serverpw,"") )
                                client_cmd(who,"echo ^"Redirection - Set Password to %s^";password %s",rd_serverpw,rd_serverpw)
                        client_cmd(who,"echo ^"Redirection -  Redirecting to %s:%d^";connect %s:%d",rd_server,rd_serverport,rd_server,rd_serverport)
                        }
        return who
}
[/PHP]

希望对大家有用!
Amxx.cfg中加入以下:
amx_reservation 1
// 1 个预留通道
amx_kickmode 1|2
// 参数为 <1> 或者 <2>
amx_netbarip "192.168"
//自动转服
amx_rd_server "1.1.1.1"  //你要传递到的服IP
amx_rd_serverport "27016" //端口
amx_rd_serverpw "" //这样是没密码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注个册吧

×
 楼主| 发表于 2007-7-7 15:04:03 | 显示全部楼层 来自 中国–浙江–嘉兴–海宁市

回复: 帖上自己修改的一个插件,几个联盟服间玩家的传递!

保存文件名 可为 slots_reservation_CN.sma  编码 是 UTF-8  这个地球人都会吧!
回复

使用道具 举报

发表于 2007-7-7 23:07:59 | 显示全部楼层 来自 中国–四川–宜宾

回复: 帖上自己修改的一个插件,几个联盟服间玩家的传递!

我一直使用的是NETBAR3.0那个版本的,不知道你这个和那个有什么区别?
回复

使用道具 举报

发表于 2007-7-8 05:17:54 | 显示全部楼层 来自 中国–广东–深圳

回复: 帖上自己修改的一个插件,几个联盟服间玩家的传递!

又是个实用插件,问下哦,如果服务器已经满位了也能挤的进去?例如说32/32的情况
回复

使用道具 举报

 楼主| 发表于 2007-7-8 11:00:30 | 显示全部楼层 来自 中国–浙江–嘉兴–海宁市

回复: 帖上自己修改的一个插件,几个联盟服间玩家的传递!

如果OP通道插件未启用,本插件奖自动设置amx_reservation为 1 ,即保留一个通道。

呵呵,所以不会出现你说的32/32的情况啊,当然OP Vip是随时随地能进的啊,只是挤了一个玩家到另外的一个服而已
回复

使用道具 举报

发表于 2007-7-8 14:00:21 | 显示全部楼层 来自 中国–上海–上海–浦东新区

回复: 帖上自己修改的一个插件,几个联盟服间玩家的传递!

编译出错!!!!!!!!
回复

使用道具 举报

发表于 2007-7-8 14:04:58 | 显示全部楼层 来自 中国–上海–上海–浦东新区

回复: 帖上自己修改的一个插件,几个联盟服间玩家的传递!

78行  80行   86行   出错!!

我用的是 AMXX1.76c
回复

使用道具 举报

 楼主| 发表于 2007-7-8 14:28:06 | 显示全部楼层 来自 中国–浙江–嘉兴–海宁市

回复: 帖上自己修改的一个插件,几个联盟服间玩家的传递!

我也是用Amxx 1.76C编译的,运行良好!
回复

使用道具 举报

发表于 2007-7-8 15:14:54 | 显示全部楼层 来自 中国–上海–上海–浦东新区

回复: 帖上自己修改的一个插件,几个联盟服间玩家的传递!

谢谢 已经有附件能成功编译 可能我ue有问题
回复

使用道具 举报

发表于 2007-7-8 20:02:12 | 显示全部楼层 来自 中国–福建–漳州–漳浦县

回复: 帖上自己修改的一个插件,几个联盟服间玩家的传递!

呵呵   这个插件真的实用   不错   定
回复

使用道具 举报

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

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