Русское сообщество по скриптингу

Статистика убийств ножом

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Статистика убийств ножом

Сообщение Racoon » 18 янв 2010, 03:34

Вот код плагина, который показывает статистику убийств ножом, аналогично плагину statsx.amxx. Но он как-то некорректно работает. Статистика ведётся не правильно и постоянно сбрасывается. Кому не сложно, помогите правильно отредактировать сие чудо)

Код: Выделить всё

#include <amxmodx>
#include <colorchat>
#include <nvault>
#include <amxmisc>

#define MAXENTRIES 1000

new gKnifeKills[33], gKnifeDeaths[33], gKnifeHeadShots[33], gConnect[33], g_cvar, RecDir[64];

public plugin_init() {
    register_plugin( "KnifeTop", "1.0", "Tolsty" );
    register_event("DeathMsg", "eventDeathMsg", "a", "1>0");
    g_cvar = register_cvar("knifetop_topsave", "1");
    register_clcmd("say /knifereset","top_reset",ADMIN_BAN);
    register_clcmd("say /kniferank","kniferank");
    register_clcmd("say /knifetop","topten_show");
    register_clcmd("say /knife","info");
    new DataDir[64];
    get_datadir(DataDir, 63);
    format(RecDir, 63, "%s/vault", DataDir);

}

public client_connect(plr) {
    if(!get_pcvar_num(g_cvar) )
        return
    gConnect[plr] = true;
    update(plr)
    set_task(15.0,"info", plr);
}
public client_disconnect(plr) {
    gConnect[plr] = false;
}
public update(plr) {
    if(!get_pcvar_num(g_cvar) )
        return PLUGIN_HANDLED
    static knifetop[128], szid[32];
    format(knifetop, 128, "%s/knifetop.vault",RecDir);
    if(get_pcvar_num(g_cvar) == 1)
        get_user_name(plr,szid,32);
    else if(get_pcvar_num(g_cvar) == 2 )
        get_user_ip(plr,szid,32);
    else if(get_pcvar_num(g_cvar) == 3 )
        get_user_authid(plr,szid,32);
    if( file_exists(knifetop)) {
        new szvault[64];
        format(szvault,64,"knifetop");
       
        new vault = nvault_open(szvault);
        if(vault != -1) {
            new szkey[4];
            for(new i=1;i<=MAXENTRIES;i++) {
                new szreturn[128];
                format(szkey,4,"%d",i);
                nvault_get(vault,szkey,szreturn,128);
                new arg1[16], arg2[16], arg3[8],  arg4[8],  arg5[8];
                if(parse(szreturn, arg1, 16, arg2, 16, arg3, 8, arg4, 8, arg5, 8) != 0 && equal(szid,arg1) ) {
                    gKnifeKills[plr] = str_to_num(arg3)
                    gKnifeDeaths[plr] = str_to_num(arg4)
                    gKnifeHeadShots[plr] = str_to_num(arg5)
                    if( !gConnect[plr] )
                        ColorChat(plr , RED, "[AMXX] You are %s in knifetop, with %d kills !", szkey, gKnifeKills[plr]);
                }
            }
            nvault_close(vault);
        }
    }
    if(gConnect[plr])
        gConnect[plr] = false
    return PLUGIN_HANDLED

}
public info(plr) {
    ColorChat(plr , RED, "[AMXX] type /knifetop to see the knife top10, or /kniferank to see your rank");
   
}
public kniferank(plr) {
    update(plr)
}
public eventDeathMsg() {
    if(!get_pcvar_num(g_cvar) )
        return PLUGIN_HANDLED
    static killer; killer = read_data( 1 );
    static victim; victim = read_data( 2 ) ;     
    static szweapon[5];
    read_data( 4 , szweapon , 4 );
     
    if ( ( szweapon[ 0 ] == 'k' ) && ( szweapon[ 3 ] == 'f' ) ) {   
        gKnifeKills[killer]++
        gKnifeDeaths[victim]++
        if ( read_data( 3 ) ) {
            gKnifeHeadShots[killer]++
        }   
        topten_update(killer)
        topten_update(victim)       
    }
    return PLUGIN_HANDLED
}

public topten_update( plr ) {
    new TopTenVault[64];
    format(TopTenVault, 64, "knifetop");
   
    new vault = nvault_open(TopTenVault);

    if(vault != -1) {

        new szkey[8];
        new szid[32];
        new szname[32];
        new cur_place;
        new new_place;

        if(get_pcvar_num(g_cvar) == 1)
            get_user_name(plr,szid,32);
        else if(get_pcvar_num(g_cvar) == 2 )
            get_user_ip(plr,szid,32);
        else if(get_pcvar_num(g_cvar) == 3 )
            get_user_authid(plr,szid,32);

        get_user_name(plr,szname,32);

        for(new i=1;i<=MAXENTRIES;i++) {
            new szreturn[128], arg1[32] ;
            format(szkey,8,"%d",i);
            nvault_get(vault,szkey,szreturn,128);
            if(parse(szreturn, arg1, 32) != 0 && equal(szid,arg1)) {
                cur_place = i;
                break;
            }
        }
        for(new i=1;i<=MAXENTRIES;i++) {
            new szreturn[256], arg1[32], arg3[32];
            format(szkey,8,"%d",i);
            nvault_get(vault,szkey,szreturn,256);
            if (cur_place == 1) {
                new_place = 1;
                break;
            }
            else if (cur_place != 0 && cur_place < i) {
                new_place = 0;
                break;
            }
            else if(parse(szreturn, arg1, 32) == 0) {
                new_place = i;
                break;
            }
            else if(gKnifeKills[plr]  > str_to_num(arg3) ) {
                new_place = i;
                break;
            }
        }
        if(cur_place == 0 && new_place <= 1000 && new_place > 0) {
            if(new_place < 1000) {
                new sztemp[128], sztempkey[8];
               
                for(new i=10;i>new_place;i--) {
                    format(sztempkey,8,"%d",i-1);
                    nvault_get(vault,sztempkey,sztemp,128);
                    if(!equal(sztemp,"")) {
                        format(sztempkey,8,"%d",i);
                        nvault_pset(vault,sztempkey,sztemp);
                    }
                }
            }
            client_print(0, print_chat, "[AMXX] %s now is %d knifetop with %d gKnifeKills!", szname, new_place, gKnifeKills[plr]);
           
            new sznew[512];
            format(szkey,8,"%d",new_place);
            format(sznew,512,"^"%s^" ^"%s^" ^"%d^" ^"%d^" ^"%d^" ", szid, szname, gKnifeKills[plr], gKnifeDeaths[plr], gKnifeHeadShots[plr]);   
            nvault_pset(vault,szkey,sznew);
        }
        else if(cur_place == new_place && cur_place > 0) {
                     
                new sznew[512], szkey[8];
                new szreturn[128], arg1[32], arg3[32], arg5[32];
                format(szkey,8,"%d",cur_place);
                nvault_get(vault,szkey,szreturn,128);
                   
                if(parse(szreturn, arg1, 32, arg3, 32) != 0) {
                    format(sznew,512,"^"%s^" ^"%s^" ^"%d^" ^"%d^" ^"%d^" ", szid, szname,  gKnifeKills[plr] > str_to_num(arg3) ? gKnifeKills[plr] : str_to_num(arg3), gKnifeDeaths[plr], gKnifeHeadShots[plr] > str_to_num(arg5) ? gKnifeHeadShots[plr] : str_to_num(arg5));   
                    nvault_pset(vault,szkey,sznew);
                }
        }
        else if (new_place < cur_place && new_place > 0) {
            new sznew[512];
            new szreturn[128], arg1[32], arg2[32];
            format(szkey,8,"%d",cur_place);
            nvault_get(vault,szkey,szreturn,128);
            if(parse(szreturn,arg1,32,arg2,32) != 0) {
                format(sznew,512,"^"%s^" ^"%s^" ^"%d^" ^"%d^" ^"%d^" ", szid, szname,  gKnifeKills[plr] , gKnifeDeaths[plr], gKnifeHeadShots[plr]);
                for(new i=cur_place;i>=new_place;i--) {
                    new szreturn[128], arg1[32], arg2[32];
                    format(szkey,8,"%d",i);
                    nvault_get(vault,szkey,szreturn,128);
                   
                    if(parse(szreturn,arg1,32,arg2,32) != 0){
                        new sztemp [128], sztempkey[8];
                        format(sztempkey,8,"%d",i-1);
                        nvault_get(vault,sztempkey,sztemp,128);
                       
                        if(!equal(sztemp,"")) {
                            format(sztempkey,8,"%d",i);
                            nvault_pset(vault,sztempkey,sztemp);
                        }
                    }
                    else break;
                }
               
                client_print(0, print_chat, "............" );
                nvault_pset(vault,szkey,sznew);
            }
        }
        nvault_close(vault);
    }
}





public topten_show( plr) {
   
   
    static knifetop[128];
   
    format(knifetop, 128, "%s/knifetop.vault",RecDir);
   
    if( file_exists(knifetop)) {
       
        new motd[2500];
        new szvault[64];

        format(szvault,64,"knifetop");
       
        new vault = nvault_open(szvault);
        if(vault != -1) {
       
            add(motd,2500,"<html><style>");
            add(motd,2500,"body { background-color:#000000; }");
            add(motd,2500,".tabel { color:#FFB000; }");
            add(motd,2500,".header { background-color:#3d3c23; color:#FFB000;}");
            add(motd,2500,"</style><body>");
            add(motd,2500,"<br><br><table align=center border=1 width=90% class=tabel>");
            add(motd,2500,"<tr><td class=header width=5% align=center>#</td><td class=header width=24%>Name</td><td class=header width=24%>KnifeKills</td><td class=header width=24%>KnifeDeaths</td><td class=header width=24%>KnifeHeadShots</td></tr>");
            new szkey[4];
            for(new i=1;i<=10;i++) {
                new szreturn[128];
                format(szkey,4,"%d",i);
                nvault_get(vault,szkey,szreturn,128);
               
                new arg1[16], arg2[16], arg3[8],  arg4[8],  arg5[8];
                if(parse(szreturn, arg1, 15, arg2, 15, arg3, 7, arg4, 7, arg5, 7) != 0) {
                    while (containi(arg2, "<") != -1) replace(arg2, 63, "<", "&lt")
                    while (containi(arg2, ">") != -1) replace(arg2, 63, ">", "&gt")
                    add(motd,2048,"<tr><td>");
                    add(motd,2048,szkey);
                    add(motd,2048,"</td><td>");
                    add(motd,2500,arg2);
                    add(motd,2500,"</td><td>");
                    add(motd,2500,arg3);
                    add(motd,2500,"</td><td>");
                    add(motd,2500,arg4);
                    add(motd,2500,"</td><td>");
                    add(motd,2500,arg5);
                    add(motd,2500,"</td><td>");
                    add(motd,2500,"</td></tr>");
                   
                   
                }
            }
           
            nvault_close(vault);
           
            add(motd,2500,"</table></body></html>");
            show_motd(plr ,motd,"KnifeTop");
        }
    } else {
        ColorChat(plr , RED, "No records in topfile");
    }
}

public top_reset(plr,level,cid) {
    if(!cmd_access(plr,level,cid,0)) {
        return PLUGIN_HANDLED;
    }
   
    new name[32];
    get_user_name(plr, name, 32);
   
   
    static knifetop[128];
    format(knifetop, 128, "%s/knifetop.vault",RecDir);
    if( file_exists(knifetop)) {
        delete_file(knifetop);
        ColorChat(0, GREEN, "[AMXX] ADMIN %s reseted the KnifeTop top", name);
        }
    return PLUGIN_HANDLED;
   
}
Аватара пользователя
Racoon
 
Сообщения: 16
Зарегистрирован: 08 янв 2010, 15:44
Благодарил (а): 5 раз.
Поблагодарили: 1 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6

Re: Статистика убийств ножом

Сообщение DJ_WEST » 18 янв 2010, 14:07

Значение knifetop_topsave какое стоит?
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Статистика убийств ножом

Сообщение Racoon » 18 янв 2010, 16:07

knifetop_topsave 1
Аватара пользователя
Racoon
 
Сообщения: 16
Зарегистрирован: 08 янв 2010, 15:44
Благодарил (а): 5 раз.
Поблагодарили: 1 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14