搜索
查看: 2669|回复: 9

内网优先转服自动踢出[NO-sXe-I]玩家问题

[复制链接]
发表于 2007-11-30 17:45:19 | 显示全部楼层 |阅读模式 来自 中国–浙江–温州
如果这个搭配sxei_required2.amxx这个插件使用,当人满时候OP/VIP进入服务器,先自动踢出
[NO-sXe-I] 的ID呢?请大家帮我修改个!
/* 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
发表于 2007-12-1 08:49:12 | 显示全部楼层 来自 中国–广东–深圳

回复: 内网优先转服自动踢出[NO-sXe-I]玩家问题

Post by zhoug
如果这个搭配sxei_required2.amxx这个插件使用,当人满时候OP/VIP进入服务器,先自动踢出
[NO-sXe-I] 的ID呢?请大家帮我修改个!
/* AMX Mod X script.  
* 如果OP通道插件未启用,本插件奖自动设置amx_reservation为 1 ,即保留一个通道。
* 使用方法:  
* 在amxx.cfg里加入
* amx_kickmode <参数>  
* 参数为 <1> 或者 <2> 。
* 1 表示 - 当服务器人满时,有OP或者VIP登陆时则踢掉一个在线时间最短的玩家。
* 2 ...


之前我改过一次,没成功。
昨天晚上我又改了一下,但是未测试,今天晚上再测试一下,测试后我再把插件发上来。
回复

使用道具 举报

发表于 2007-12-1 13:24:30 | 显示全部楼层 来自 中国–广东–惠州–惠城区

回复: 内网优先转服自动踢出[NO-sXe-I]玩家问题

可以用get_players()函数找出带[NO-sXe-I] 名字的玩家
[php]
new num player[32]
get_players(player,num,"f","[NO-sXe-I]")
[/php]
回复

使用道具 举报

发表于 2007-12-1 13:29:01 | 显示全部楼层 来自 中国–广东–深圳–宝安区

回复: 内网优先转服自动踢出[NO-sXe-I]玩家问题

Post by zwfgdlc
可以用get_players()函数找出带[NO-sXe-I] 名字的玩家
[php]
new num player[32]
get_players(player,num,"f","[NO-sXe-I]")
[/php]


这倒提醒了我。我改的那个把所有玩家都找了个遍。。。还要加个判断退出循环。我回去再改改。

我用的是kill-no-sxe-i里面的部分代码。要比较ID前面的字符是这个。
回复

使用道具 举报

 楼主| 发表于 2007-12-2 18:11:38 | 显示全部楼层 来自 中国–浙江–温州

回复: 内网优先转服自动踢出[NO-sXe-I]玩家问题

可是服务器玩家NND有几个故意把名字前加个NO-sXe啊!能不能直接叛断是没有开sXe的呢?
回复

使用道具 举报

发表于 2007-12-2 22:33:32 | 显示全部楼层 来自 中国–广东–深圳

回复: 内网优先转服自动踢出[NO-sXe-I]玩家问题

Post by zhoug
可是服务器玩家NND有几个故意把名字前加个NO-sXe啊!能不能直接叛断是没有开sXe的呢?

简单,你强制开一下,没开sxe的就会被强制踢出。。__sxei_required "1"
回复

使用道具 举报

发表于 2007-12-17 19:49:55 | 显示全部楼层 来自 中国–江西–新余

回复: 内网优先转服自动踢出[NO-sXe-I]玩家问题

请问这个插件现在写成功了么?
能不能发上来?
回复

使用道具 举报

发表于 2007-12-18 03:24:48 | 显示全部楼层 来自 中国–广东

回复: 内网优先转服自动踢出[NO-sXe-I]玩家问题

以下是yanexp内网优先的源码修改的,没测试过,试下.
[php]
#include <amxmodx>
#include <amxmisc>
public client_connect(id){
new userip[17]
new ips[8]
new name[33]
new g_amx_netbarip[8]
get_user_ip(id,userip,16,1)
copy(ips,7,userip)
get_cvar_string("amx_netbarip",g_amx_netbarip,7)
get_user_name(id,name,32)
if (equali(ips,g_amx_netbarip)){
  set_user_flags(id,read_flags("b"))
  client_print(0,print_chat,"*[AMX]LanPlayer: %s (%s)",name,userip)
  new maxplayers = get_maxplayers()
  new players = get_playersnum( 1 )
  new limit = maxplayers - 1
  if( players > limit ){
  kickhping()
  }
  }else{
  client_print(0,print_chat,"*[AMX]NetPlayer: %s (%s)trying to connect...",name,userip)
  }
//client_print(0,print_chat,"*test: %s |%s",ips,g_amx_netbarip)
return PLUGIN_CONTINUE
}
kickhping() {

    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
new name[32]                               // 增加行
        get_user_name(i,name,31)                  // 增加行
        if(containi(name,"[NO-sXe-I]")==-1)     // 增加行
  continue                          // 增加行
        get_user_ping(i,ping,loss) // get ping
        if ( ping > worst ) {
            worst = ping
            who = i
        }
    }
    if(who)
        if ( is_user_bot(who) )
            server_cmd("kick #%d", get_user_userid(who)  )
        else{
  client_cmd(who,"echo ^"Dropped due to high ping to free slot for an admin^";disconnect")
  client_print(0,print_chat,"*[AMX]Dropped due to high ping to free slot for an admin!")
  }
    return who
}
public plugin_init() {
   register_plugin("NetBar","0.2","YanOnline")
   register_cvar("amx_netbarip","192.168")
   return PLUGIN_CONTINUE
}

[/php]
回复

使用道具 举报

发表于 2007-12-23 06:20:49 | 显示全部楼层 来自 中国–江西–新余

回复: 内网优先转服自动踢出[NO-sXe-I]玩家问题

请教一个菜鸟问题,以上的代码如何保存为SMA格式呀?直接复制到记事本并更改文件后缀名吗?
回复

使用道具 举报

发表于 2007-12-23 11:18:09 | 显示全部楼层 来自 中国–广东–深圳–宝安区

回复: 内网优先转服自动踢出[NO-sXe-I]玩家问题

Post by zoutao8
请教一个菜鸟问题,以上的代码如何保存为SMA格式呀?直接复制到记事本并更改文件后缀名吗?
复制到记事本,然后选择另存,保存类型:所有文件,文件名为xx.sma  最后面的编码选择uft-8格式
回复

使用道具 举报

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

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