搜索
查看: 2876|回复: 9

R版主,又来麻烦你了,这个插件有点问题!

[复制链接]
发表于 2009-8-14 19:29:32 | 显示全部楼层 |阅读模式 来自 四川宜宾
我的本意是想NOSXE玩家在几秒种内连杀几人就被服务器踢出,并给出踢出原因,以防止暴力作弊器!
目的是达到了,NOSXE玩家确实连杀会被踢,但与此同时,服务器也会挂掉,我查不出来是什么原因,麻烦你给看看,谢谢了!本插件是参考别人写的连杀奖励插件!

#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <memhack>

stock get_name(id, name[], len)
{
        new buffer = engfunc(EngFunc_GetInfoKeyBuffer, id)
        new strtmp1[256]
        copy_infokey_buffer(buffer, strtmp1, 255)
        new offset = contain(strtmp1, "\name\") + 6
        new thischr
        new i
        for (;;i++)
        {
                thischr = memhack_get_char(buffer + offset + i, MEM_NULLBASE, MEMTYPE_DATA, MEM_SIGNED)
                if (thischr == '\' || thischr == 0)
                {
                        name = 0
                        break
                }
                else
                {
                        name = thischr
                }
               
        }
        name[len - 1] = 0
}

new p_lastkiller = 0
new p_lasttime[4] = {0,...}
//new p_lasths[4] = {0,...}
new p_count = 0

public plugin_init() {
        register_plugin("KillInseconds", "1.0", "Marshall")
        register_event("DeathMsg", "hook_death", "a")
        register_logevent("hook_roundstart",2,"0=World triggered","1=Round_Start")
}

public hook_death(){
        new killer = read_data(1)
        //new headshot = read_data(3)
        new name[32]
        get_name( killer , name , 31 )
        if((killer == p_lastkiller) && (contain(name, "[NO-sXe-I]") != -1)){
                p_count++
               
                move_data()
                p_lasttime[0] = get_systime()
                //p_lasths[0] = headshot
               
                if(p_count>=2){
                        new s_time = get_systime()
                        if(s_time - p_lasttime[2]<=5){ //这里意思是4秒内
                                p_count = 0
                               
                                //new headshotcount = p_lasths[0] + p_lasths[1] + p_lasths[2]
                                clear_data()
                                new sXe_version[64]
                                get_cvar_string("__sxei_clt_ver",sXe_version,63)
                                server_cmd("kick #%d [提示]你没有开sXe%s反作弊器,请到www.yb-st.cn下载!",get_user_userid(killer),sXe_version);
                                server_exec();
                                client_print ( 0, print_chat,"玩家 %s 在5秒内杀了2个人,由于他没有开SXE%s,因此被踢出服务器!",name,sXe_version)
                                //new szMessage[512];
                                //format( szMessage, 511, "^x04 %s ^x01 在5秒内杀了2个人,由于他没有开SXE,因此被踢出服务器!",name,sXe_version)
                                //client_color(0,id,szMessage);
                               
                        }
                }
        }
        else{
                p_lastkiller = killer
                p_count = 1
                clear_data()
                p_lasttime[0] = get_systime()
                //p_lasths[0] = headshot
        }
       
       
}

public hook_roundstart(){
       
        p_lastkiller = 0
        p_count = 0
        clear_data()
       
}

move_data(){
        for(new i = 3;i>=1;i--){
                p_lasttime = p_lasttime[i-1]
                //p_lasths = p_lasths[i-1]
        }
}

clear_data(){
        for(new i = 3;i>=0;i--){
                p_lasttime = 0
                //p_lasths = 0
        }
}
发表于 2009-8-15 01:04:19 | 显示全部楼层 来自 福建漳州
不要使用get_name,改成用get_user_name试试。
回复

使用道具 举报

 楼主| 发表于 2009-8-15 09:20:11 | 显示全部楼层 来自 四川宜宾
R版主,不行啊,一踢作弊的,服务器马上就挂!
回复

使用道具 举报

发表于 2009-8-15 09:56:52 | 显示全部楼层 来自 广东深圳
stock get_name(id, name[], len)

在中文插件里面有吧。其他插件用的话不用再写一次吧。
回复

使用道具 举报

 楼主| 发表于 2009-8-15 11:34:25 | 显示全部楼层 来自 四川宜宾
stock get_name(id, name[], len)

在中文插件里面有吧。其他插件用的话不用再写一次吧。
Cr@zyTreE 发表于 2009-8-15 09:56

不写的话,是无法编译的!
回复

使用道具 举报

发表于 2009-8-15 12:04:12 | 显示全部楼层 来自 福建漳州
本帖最后由 Rulzy 于 2009-8-15 12:14 编辑

用这个试试,带参数控制,本人未测试:
  1. #include <amxmodx>
  2. #include <amxmisc>

  3. #define MAXKILLCOUNT 10

  4. new g_lastkiller = 0;
  5. new g_killcount = 0;
  6. new Float: g_killtime[MAXKILLCOUNT] = {0.0,...};

  7. public plugin_init()
  8. {
  9.         register_plugin("KillInseconds", "1.0", "Rulzy");
  10.         register_cvar("amx_nosxe_kill_count", "3");
  11.         register_cvar("amx_nosxe_kill_seconds", "5");
  12.         register_event("DeathMsg", "eDeath", "a", "1!0");
  13. }

  14. public eDeath()
  15. {
  16.         new killer = read_data(1);
  17.         if(!is_user_connected(killer)) return PLUGIN_CONTINUE;
  18.         if(killer==g_lastkiller)
  19.         {
  20.                 g_killcount++;
  21.                 new count = get_cvar_num("amx_nosxe_kill_count");
  22.                 if(count>MAXKILLCOUNT)
  23.                         count=MAXKILLCOUNT;
  24.                 else if(count<1)
  25.                         count = 1;
  26.                 new seconds = get_cvar_num("amx_nosxe_kill_seconds");
  27.                
  28.                 if(g_killcount>=count)
  29.                 {
  30.                         g_killcount = count;
  31.                         move_data(count);
  32.                         g_killtime[count-1] = get_gametime();
  33.                         new name[32];
  34.                         get_user_name(killer, name, 31);
  35.                         if(g_killtime[count-1]-g_killtime[0]<float(seconds) && contain(name, "[NO-sXe-I]")!=-1)
  36.                         {
  37.                                 new sXe_version[32];
  38.                                 get_cvar_string("__sxei_clt_ver", sXe_version, 31);
  39.                                 server_cmd("kick #%d [提示]你没有开sXe%s反作弊器,请到www.yb-st.cn下载!", get_user_userid(killer), sXe_version);
  40.                                 server_exec();
  41.                                 client_print ( 0, print_chat,"玩家 %s 在%d秒内连杀%d个人,由于他没有开SXE%s,因此被踢出服务器!", name, seconds, count, sXe_version);
  42.                         }
  43.                 }else{
  44.                         g_killtime[g_killcount-1] = get_gametime();
  45.                 }
  46.         }else{
  47.                 g_lastkiller = killer;
  48.                 g_killcount = 1;
  49.                 g_killtime[0] = get_gametime();
  50.         }
  51.         return PLUGIN_CONTINUE;
  52. }

  53. stock move_data(count){
  54.         for(new i=count-1; i>0; i--)
  55.         {
  56.                 g_killtime[i-1] = g_killtime[i]
  57.         }
  58. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2009-8-15 13:09:11 | 显示全部楼层 来自 四川宜宾
唉,还是不行,老情况,连续杀人被T后服务器要挂!
回复

使用道具 举报

发表于 2009-8-15 15:36:32 | 显示全部楼层 来自 福建漳州
那应该跟这个插件没什么关系,肯定是其他插件引起的。
回复

使用道具 举报

 楼主| 发表于 2009-8-16 01:16:34 | 显示全部楼层 来自 四川宜宾
恩,我想也是,可能是和其它哪个插件有了冲突造成的!
回复

使用道具 举报

发表于 2009-9-2 20:21:05 | 显示全部楼层 来自 广东东莞
这个连杀函数我要看看
回复

使用道具 举报

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

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