#include <amxmodx>
 
 
#include <amxmisc>
 
 
#include <hamsandwich>
 
 
#include <fakemeta>
 
 
#include <colorchat>
 
 
#include <fun>
 
 
 
 
 
#define PLUGIN "Use button once"
 
 
#define VERSION "1.3"
 
 
#define AUTHOR "R3X"
 
 
 
 
 
#define MAX_BUTTONS 100
 
 
#define KeysButtonsMenu (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9) // Keys: 137890
 
 
#define KeysOptionsMenu (1<<0)|(1<<1)|(1<<8) //129
 
 
#define KeysDelayMenu (1<<0)|(1<<1)|(1<<2)|(1<<8) //1239
 
 
 
 
 
#define ANNOUNCE_TASK 10000
 
 
 
 
 
#define m_flWait 44
 
 
 
 
 
//Main
 
 
 
 
 
new gEnt[MAX_BUTTONS];
 
 
new gUsed[MAX_BUTTONS];
 
 
new giPointer=0;
 
 
new gOnStart[MAX_BUTTONS];
 
 
new Float:gDefaultDelay[MAX_BUTTONS];
 
 
new Float:gDelay[MAX_BUTTONS];
 
 
 
 
 
new gInMenu[33];
 
 
 
 
 
new gszFile[128];
 
 
 
 
 
new giSprite;
 
 
 
 
 
new gcvarDefault, gcvarTeam, gcvarFreeRun;
 
 
new gcvarLimit, gcvarLimitMode, gcvarPrivilege;
 
 
new gcvarMessage, gcvarRestore;
 
 
 
 
 
//VOTE
 
 
 
 
 
#define TASK_SHOWMENU 432
 
 
#define TASK_RES 123
 
 
 
 
 
#define MAX_ROUNDS 999
 
 
 
 
 
#define KeysFFVote (1<<0)|(1<<1) // Keys: 12
 
 
 
 
 
new gcvarFRVoteTime;
 
 
 
 
 
new giVoteStart, giVoteTime;
 
 
 
 
 
new bool:gbFreeRun=false;
 
 
new bool:gbVote=false;
 
 
 
 
 
#define VOTE_ON 0
 
 
#define VOTE_OFF 1
 
 
 
 
 
new giVotes[33][2];
 
 
 
 
 
new giRounds=MAX_ROUNDS, giTime=0;
 
 
 
 
 
new gCanFree;
 
 
 
 
 
public plugin_init() {
 
 
        register_plugin(PLUGIN, VERSION, AUTHOR);
 
 
 
 
 
        register_dictionary("common.txt");
 
 
        register_dictionary("adminvote.txt");
 
 
        register_dictionary("use_button_once.txt");
 
 
 
 
 
        register_menucmd(register_menuid("FRVote"), KeysFFVote, "PressedFRVote");
 
 
        register_menucmd(register_menuid("ButtonsMenu"), KeysButtonsMenu, "PressedButtonsMenu");
 
 
        register_menucmd(register_menuid("OptionsMenu"), KeysOptionsMenu, "PressedOptionsMenu");
 
 
        register_menucmd(register_menuid("DelayMenu"), KeysDelayMenu, "PressedDelayMenu");
 
 
 
 
 
        register_clcmd("amx_buttons","cmd_amx_buttons",ADMIN_CFG,": Buttons Menu");
 
 
 
 
 
        //Default count of uses
 
 
        gcvarDefault=register_cvar("amx_buttons_default","1");
 
 
        //Who plugin analyze
 
 
        //0 - anyone(plugin disabled?)
 
 
        //1 - Te
 
 
        //2 - Ct
 
 
        //3 - Te+Ct
 
 
        gcvarTeam=register_cvar("amx_buttons_team","1");
 
 
        //Enabled FreeRun mode?
 
 
        gcvarFreeRun=register_cvar("amx_buttons_freerun","1");
 
 
        //Vote time
 
 
        gcvarFRVoteTime=register_cvar("amx_freerun_votetime","10");
 
 
 
 
 
        //Type of limit
 
 
        //0 - enabled after 'amx_freerun_limit' rounds
 
 
        //1 - enabled after 'amx_freerun_limit' minutes
 
 
        gcvarLimitMode=register_cvar("amx_freerun_limit_mode","0");
 
 
        //Size of Limit
 
 
        gcvarLimit=register_cvar("amx_freerun_limit","5");
 
 
 
 
 
        //Interval of message
 
 
        gcvarMessage=register_cvar("amx_freerun_info","120.0",0,120.0);
 
 
 
 
 
        //Terrorist`s privilege
 
 
        //if he use /free FreeRun will start without vote, can he?
 
 
        gcvarPrivilege=register_cvar("amx_freerun_tt_privilege","1");
 
 
 
 
 
        //restore buttons on new round
 
 
        gcvarRestore=register_cvar("amx_restore_buttons","1");
 
 
 
 
 
        register_clcmd("say /free","cmdVoteFreeRun");
 
 
        register_clcmd("say_team /free","cmdVoteFreeRun");
 
 
        register_clcmd("say free","cmdVoteFreeRun");
 
 
        register_clcmd("say_team free","cmdVoteFreeRun");
 
 
 
 
 
        register_clcmd("say /freerun","cmdVoteFreeRun");
 
 
        register_clcmd("say_team /freerun","cmdVoteFreeRun");
 
 
        register_clcmd("say freerun","cmdVoteFreeRun");
 
 
        register_clcmd("say_team freerun","cmdVoteFreeRun");
 
 
 
 
 
        register_clcmd("say /fr","cmdVoteFreeRun");
 
 
        register_clcmd("say_team /fr","cmdVoteFreeRun");
 
 
        register_clcmd("say fr","cmdVoteFreeRun");
 
 
        register_clcmd("say_team fr","cmdVoteFreeRun");
 
 
 
 
 
        if( engfunc(EngFunc_FindEntityByString,-1 ,"classname", "func_button"))
 
 
                RegisterHam(Ham_Use, "func_button", "fwButtonUsed");
 
 
 
 
 
        if(engfunc(EngFunc_FindEntityByString,-1 ,"classname","func_rot_button"))
 
 
                RegisterHam(Ham_Use, "func_rot_button", "fwButtonUsed");
 
 
 
 
 
        if(engfunc(EngFunc_FindEntityByString,-1 ,"classname", "button_target"))
 
 
                RegisterHam(Ham_Use, "button_target", "fwButtonUsed");
 
 
 
 
 
        register_logevent( "ResetButtons", 2, "0=World triggered", "1=Round_Start");
 
 
 
 
 
        RegisterHam( Ham_Touch, "armoury_entity", "FwdHamPlayerPickup" );
 
 
        RegisterHam( Ham_Touch, "weaponbox", "FwdHamPlayerPickup" );
 
 
 
 
 
        fillButtons("func_button");
 
 
        fillButtons("func_rot_button");
 
 
        fillButtons("button_target");
 
 
}
 
 
 
 
 
public FwdHamPlayerPickup( iEntity, id )
 
 
{
 
 
        if(gbFreeRun)
 
 
                return HAM_SUPERCEDE;
 
 
 
 
 
        return HAM_IGNORED;
 
 
 
 
 
}
 
 
 
 
 
public plugin_cfg(){
 
 
        setButtons();
 
 
 
 
 
        new iLen=0, iMax=charsmax(gszFile);
 
 
        iLen=get_configsdir(gszFile, iMax );
 
 
        iLen+=copy(gszFile[iLen], iMax-iLen, "/dr_buttons/");
 
 
 
 
 
        if(!dir_exists(gszFile)){
 
 
                set_fail_state("Not found dir: configs/dr_buttons");
 
 
                return;
 
 
        }
 
 
        new szMap[32];
 
 
        get_mapname(szMap, 31);
 
 
        formatex(gszFile[iLen], charsmax(gszFile)-iLen, "%s.ini", szMap);
 
 
        if(!file_exists(gszFile)){
 
 
                return;
 
 
        }
 
 
        new szLine[51];
 
 
        new szButton[4], szTimes[3], szDelay[5];
 
 
        new Float:fDelay;
 
 
        for(new i=0;read_file(gszFile, i, szLine, 50, iLen);i++){
 
 
                if(iLen==0) continue;
 
 
                trim(szLine);
 
 
                if(szLine[0]==';') continue;
 
 
                parse(szLine, szButton, 3, szTimes, 2, szDelay, 4);
 
 
                fDelay=szDelay[0]?str_to_float(szDelay):-1.0;
 
 
                set_start_value(str_to_num(szButton), str_to_num(szTimes), fDelay);
 
 
        }
 
 
        new Float:fInterval=get_pcvar_float(gcvarMessage);
 
 
        if(fInterval > 0.0)
 
 
                set_task(120.0, "announceVote",ANNOUNCE_TASK,_,_,"b");
 
 
}
 
 
public plugin_precache(){
 
 
        giSprite=precache_model("sprites/flare1.spr");
 
 
 
 
 
}
 
 
public client_putinserver(id){
 
 
        if(!is_user_bot(id))
 
 
                eventInGame(id);
 
 
}
 
 
public client_connect(id){
 
 
        giVotes[id][VOTE_ON]=0;
 
 
        giVotes[id][VOTE_OFF]=0;
 
 
}
 
 
public announceVote(){
 
 
        if(get_pcvar_num(gcvarFreeRun))
 
 
                ColorChat(0,GREEN, "[FreeRun]^x01 %L",LANG_SERVER, "ANNOUNCE");
 
 
}
 
 
setButtons(){
 
 
        new iDef=get_pcvar_num(gcvarDefault);
 
 
        for(new i=0;i<giPointer;i++){
 
 
                gUsed[i]=iDef;
 
 
                gOnStart[i]=iDef;
 
 
                gDelay[i]=get_pdata_float(gEnt[i],m_flWait);
 
 
                gDefaultDelay[i]=gDelay[i];
 
 
        }
 
 
}
 
 
fillButtons(const szClass[]){
 
 
        new ent = -1;
 
 
        while((ent = engfunc(EngFunc_FindEntityByString,ent ,"classname", szClass)) != 0){
 
 
                gEnt[giPointer++]=ent;
 
 
                set_pev(ent, pev_iuser4, giPointer);
 
 
        }
 
 
}
 
 
set_start_value(ent, times, Float:delay){
 
 
        new index=get_ent_index(ent);
 
 
        if(index!=-1){
 
 
                gOnStart[index]=times;
 
 
                if(delay>=0.0)
 
 
                        gDelay[index]=delay;
 
 
        }
 
 
}
 
 
get_ent_index(ent){
 
 
        /*
 
 
        for(new i=0;i<giPointer;i++)
 
 
                if(gEnt[i]==ent) return i;
 
 
        return -1;
 
 
        */
 
 
        return pev(ent, pev_iuser4)-1;
 
 
}
 
 
restoreButton(ent){
 
 
        if(pev(ent, pev_frame) > 0.0){
 
 
                new Float:Life;
 
 
                pev(ent, pev_nextthink, Life);
 
 
                set_pev(ent, pev_ltime, Life-0.01);
 
 
        }
 
 
}
 
 
public ResetButtons(){
 
 
        gbFreeRun=false;
 
 
        gCanFree = true;
 
 
        set_task(10.0, "CannotFree");
 
 
        gbVote=false;
 
 
        new bool:bRestore=get_pcvar_num(gcvarRestore)!=0;
 
 
        for(new i=0;i<MAX_BUTTONS;i++){
 
 
                gUsed[i]=gOnStart[i];
 
 
                if(bRestore){
 
 
                        restoreButton(gEnt[i]);
 
 
                }
 
 
        }
 
 
        giRounds++;
 
 
}
 
 
 
 
 
public CannotFree()
 
 
{
 
 
        gCanFree = false;
 
 
        return PLUGIN_HANDLED;
 
 
}
 
 
 
 
 
public fwButtonUsed(this, idcaller, idactivator, use_type, Float:value){
 
 
        if(idcaller!=idactivator) return HAM_IGNORED;
 
 
 
 
 
        if(pev(this, pev_frame) > 0.0)
 
 
                 return HAM_IGNORED;
 
 
        new index=get_ent_index(this);
 
 
        if(index==-1)
 
 
                return HAM_IGNORED;
 
 
        if(get_user_team(idcaller)&get_pcvar_num(gcvarTeam)){
 
 
 
 
 
                if(gbFreeRun){
 
 
                        ColorChat(idcaller,GREEN, "[FreeRun]^x01 %L",idcaller, "BUTTON_FREERUN");
 
 
                        return HAM_SUPERCEDE;
 
 
                }
 
 
                else if(gUsed[index]<=0 && gOnStart[index]!=-1){
 
 
                        ColorChat(idcaller,GREEN, "[Info]^x01 %L",idcaller,"BUTTON_NOMORE");
 
 
                        return HAM_SUPERCEDE;
 
 
                }
 
 
                else{
 
 
                        if(gUsed[index]>0)
 
 
                                if(--gUsed[index]){
 
 
                                        ColorChat(idcaller, GREEN, "[Info]^x01 %L", idcaller, "BUTTON_LEFT", gUsed[index]);
 
 
                                }else
 
 
                                        ColorChat(idcaller, GREEN, "[Info]^x01 %L", idcaller, "BUTTON_ENDOFLIMIT");
 
 
                }
 
 
        }
 
 
 
 
 
        set_task(0.1,"setDelay",this);
 
 
 
 
 
        return HAM_IGNORED;
 
 
}
 
 
public setDelay(this){
 
 
        new index=get_ent_index(this);
 
 
        set_pev(this, pev_nextthink, pev(this, pev_ltime)+gDelay[index]+0.01);
 
 
}
 
 
 
 
 
//MENU--------------
 
 
public cmd_amx_buttons(id, level, cid){
 
 
        if(!cmd_access(id, level, cid, 1))
 
 
                return PLUGIN_HANDLED;
 
 
        if(giPointer==0)
 
 
                client_print(id, print_chat, "%L", id,"NO_BUTTONS");
 
 
        else
 
 
                ShowButtonsMenu(id);
 
 
        return PLUGIN_HANDLED;
 
 
}
 
 
ShowButtonsMenu(id, trace=1){
 
 
        if(!is_user_alive(id)){
 
 
                client_print(id, print_center, "%L",id, "MUST_B_ALIVE");
 
 
                return;
 
 
        }
 
 
        new iNow=gInMenu[id];
 
 
        new iKeys=(1<<0)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<9);
 
 
        new szMenu[196], iLen, iMax=(sizeof szMenu) - 1;
 
 
        new szNoLimit[32];
 
 
        formatex(szNoLimit,31,"(%L)",id,"NOLIMIT");
 
 
        iLen=copy(szMenu, iMax,"\yButtons Menu^n");
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"\wEnt#%d^n^n",gEnt[iNow]);
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"%L: %d %s^n\y1\w. %L ",id, "USAGE",gOnStart[iNow],(gOnStart[iNow]==-1)?szNoLimit:"", id, "MORE");
 
 
 
 
 
        if(gOnStart[iNow]>=0){
 
 
                iLen+=formatex(szMenu[iLen], iMax-iLen,"\y2\w. %L",id, "WORD_LESS");
 
 
                iKeys|=(1<<1);
 
 
        }else
 
 
                iLen+=formatex(szMenu[iLen], iMax-iLen,"\d2. %L\w",id,"WORD_LESS");
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"^n^n3. %L^n^n4. %L^n^n",id, "DELAY_EDITOR",id,"OPTIONS");
 
 
 
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"5. %sNo Clip\w^n",isNoClip(id)?"\r":"");
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"6. %sGodMode\w^n",isGodMode(id)?"\r":"");
 
 
 
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"^n7. \r%L^n\w",id, "WORD_SAVE");
 
 
 
 
 
        if(iNow>0){
 
 
                iLen+=formatex(szMenu[iLen], iMax-iLen,"^n8. %L",id, "BACK");
 
 
                iKeys|=(1<<7);
 
 
        }
 
 
        if(iNow<giPointer-1){
 
 
                iLen+=formatex(szMenu[iLen], iMax-iLen,"^n9. %L",id, "WORD_NEXT");
 
 
                iKeys|=(1<<8);
 
 
        }
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"^n0. %L", id, "EXIT");
 
 
        show_menu(id, iKeys, szMenu, -1, "ButtonsMenu");
 
 
        if(trace){
 
 
                new Float:fOrigin[3], Float:fOrigin2[3];
 
 
                fm_get_brush_entity_origin(gEnt[gInMenu[id]], fOrigin);
 
 
                pev(id, pev_origin, fOrigin2);
 
 
                Create_TE_BEAMPOINTS(fOrigin, fOrigin2, giSprite, 0, 10, 20, 5, 1, 255, 0, 0, 100, 50);
 
 
        }
 
 
}
 
 
bool:isNoClip(id)
 
 
        return pev(id, pev_movetype)==MOVETYPE_NOCLIP;
 
 
 
 
 
bool:isGodMode(id)
 
 
        return pev(id, pev_takedamage)==0.0;
 
 
 
 
 
public PressedButtonsMenu(id, key) {
 
 
        if(!is_user_alive(id)){
 
 
                client_print(id, print_center, "%L",id,"MUST_B_ALIVE");
 
 
                return;
 
 
        }
 
 
        /* Menu:
 
 
        * Buttons Menu
 
 
        * Ent#<ent>
 
 
        *
 
 
        * Uzyc: <ile>
 
 
        * 1. Wiecej 2. Mniej
 
 
        *
 
 
        * 3. Editor
 
 
        *
 
 
        * 4. Options
 
 
        *
 
 
        * 5. NoClip
 
 
        * 6. GodMode
 
 
        *
 
 
        * 7. Zapisz
 
 
        *
 
 
        * 8. Poprzedni
 
 
        * 9. Nastepny
 
 
        * 0. Wyjdz
 
 
        */
 
 
        new trace=0;
 
 
        switch (key) {
 
 
                case 0: { // 1
 
 
                        gOnStart[gInMenu[id]]++;
 
 
                }
 
 
                case 1: { // 2
 
 
                        gOnStart[gInMenu[id]]--;
 
 
                }
 
 
                case 2: { // 3
 
 
                        ShowDelayMenu(id);
 
 
                        return;
 
 
                }
 
 
                case 3:{ //4
 
 
                        ShowOptionsMenu(id);
 
 
                        return;
 
 
                }
 
 
                case 4:{ //5
 
 
                        set_pev(id, pev_movetype, isNoClip(id)?MOVETYPE_WALK:MOVETYPE_NOCLIP);
 
 
                }
 
 
                case 5:{ //6
 
 
                        set_pev(id, pev_takedamage, isGodMode(id)?1.0:0.0);
 
 
                }
 
 
                case 6: { // 7
 
 
                        save2File(id);
 
 
                }
 
 
                case 7: { // 8
 
 
                        gInMenu[id]--;
 
 
                        trace=1;
 
 
                }
 
 
                case 8: { // 9
 
 
                        gInMenu[id]++;
 
 
                        trace=1;
 
 
                }
 
 
                case 9: { // 0
 
 
                        return;
 
 
                }
 
 
        }
 
 
        ShowButtonsMenu(id, trace);
 
 
}
 
 
//--------------
 
 
ShowOptionsMenu(id){
 
 
        if(!is_user_alive(id)){
 
 
                client_print(id, print_center, "%L",id,"MUST_B_ALIVE");
 
 
                return;
 
 
        }
 
 
        new szMenu[196], iLen, iMax=(sizeof szMenu) - 1;
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"\yOptions^n^n");
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"\w1. %L^n",id, "GOTO");
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"2. %L^n^n",id, "NEAREST");
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"9. %L",id, "BACK");
 
 
        show_menu(id, KeysOptionsMenu, szMenu, -1, "OptionsMenu");
 
 
}
 
 
public PressedOptionsMenu(id, key){
 
 
        if(!is_user_alive(id)){
 
 
                client_print(id, print_center, "%L",id,"MUST_B_ALIVE");
 
 
                return;
 
 
        }
 
 
        new trace=0;
 
 
        switch (key) {
 
 
                case 0: { // 1
 
 
                        go2Button(id);
 
 
                }
 
 
                case 1: { // 2
 
 
                        gInMenu[id]=findTheClosest(id);
 
 
                        trace=1;
 
 
                }
 
 
        }
 
 
        ShowButtonsMenu(id, trace);
 
 
}
 
 
//-------------
 
 
ShowDelayMenu(id){
 
 
        if(!is_user_alive(id)){
 
 
                client_print(id, print_center, "%L",id,"MUST_B_ALIVE");
 
 
                return;
 
 
        }
 
 
        new iNow=gInMenu[id];
 
 
        new iKeys=(1<<0)|(1<<2)|(1<<8);
 
 
        new szMenu[196], iLen, iMax=(sizeof szMenu) - 1;
 
 
        iLen=copy(szMenu, iMax,"\yDelay Menu^n");
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"\wEnt#%d^n^n",gEnt[iNow]);
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"%L: %.1f^n",id, "CURRENT_DELAY", gDelay[iNow]);
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"\y1\w. %L ",id, "MORE");
 
 
        if(gDelay[iNow]>0.0){
 
 
                iLen+=formatex(szMenu[iLen], iMax-iLen,"\y2\w. %L",id, "WORD_LESS");
 
 
                iKeys|=(1<<1);
 
 
        }else
 
 
                iLen+=formatex(szMenu[iLen], iMax-iLen,"\d2. %L\w",id,"WORD_LESS");
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"^n3. %L",id, "DEFAULT");
 
 
        iLen+=formatex(szMenu[iLen], iMax-iLen,"^n^n9. %L",id, "BACK");
 
 
        show_menu(id, iKeys, szMenu, -1, "DelayMenu");
 
 
}
 
 
public PressedDelayMenu(id, key){
 
 
        new iNow=gInMenu[id];
 
 
        switch(key){
 
 
                case 0:{
 
 
                        gDelay[iNow]+=1.0;
 
 
                }
 
 
                case 1:{
 
 
                        gDelay[iNow]-=1.0;
 
 
                        if(gDelay[iNow] < 0.0)
 
 
                                gDelay[iNow]=0.0;
 
 
                }
 
 
                case 2:{
 
 
                        gDelay[iNow]=gDefaultDelay[iNow];
 
 
                }
 
 
                case 8:{
 
 
                        ShowButtonsMenu(id, 0);
 
 
                        return;
 
 
                }
 
 
        }
 
 
        ShowDelayMenu(id);
 
 
}
 
 
//-------------
 
 
save2File(id){
 
 
        if(file_exists(gszFile))
 
 
                delete_file(gszFile);
 
 
        write_file(gszFile, ";<ent> <count> <delay>");
 
 
        new szLine[35];
 
 
        for(new i=0;i<giPointer;i++){
 
 
                formatex(szLine, 34, "%d %d %.1f",gEnt[i], gOnStart[i], gDelay[i]);
 
 
                write_file(gszFile, szLine);
 
 
        }
 
 
        client_print(id, print_center, "%L!",id,"WORD_SAVED");
 
 
}
 
 
findTheClosest(id){
 
 
        new Float:fPlayerOrig[3];
 
 
        pev(id, pev_origin, fPlayerOrig);
 
 
        new Float:fOrigin[3];
 
 
        fm_get_brush_entity_origin(gEnt[0], fOrigin);
 
 
 
 
 
        new Float:fRange=get_distance_f(fOrigin, fPlayerOrig), index=0;
 
 
        new Float:fNewRange;
 
 
        for(new i=1;i<giPointer;i++){
 
 
                fm_get_brush_entity_origin(gEnt[i], fOrigin);
 
 
                fNewRange=get_distance_f( fOrigin,  fPlayerOrig);
 
 
                if(fNewRange < fRange){
 
 
                        fRange=fNewRange;
 
 
                        index=i;
 
 
                }
 
 
        }
 
 
        return index;
 
 
}
 
 
go2Button(id, ent=-1){
 
 
        if(ent==-1)
 
 
                ent=gInMenu[id];
 
 
        ent=gEnt[ent];
 
 
        if(!pev_valid(ent)){
 
 
                client_print(id, print_center, "%L",id,"NOTARGET");
 
 
                return;
 
 
        }
 
 
        new Float:fOrigin[3];
 
 
        fm_get_brush_entity_origin(ent, fOrigin);
 
 
        set_pev(id, pev_origin, fOrigin);
 
 
        client_print(id, print_chat, "PS. No Clip <!-- s:) --><img src=\"{SMILIES_PATH}/icon_e_smile.gif\" alt=\":)\" title=\"mosoly\" /><!-- s:) -->");
 
 
}
 
 
//FreeRun
 
 
public cmdVoteFreeRun(id){
 
 
 
 
 
        if(!gCanFree)
 
 
        {
 
 
                ColorChat(id, GREEN, "FreeRun]^x01Letelt az ido, mar nem tudsz free kort inditani!");
 
 
                return PLUGIN_HANDLED;
 
 
        }
 
 
 
 
 
        if(get_pcvar_num(gcvarFreeRun)==0){
 
 
                ColorChat(id, GREEN, "[FreeRun]^x01 %L",id,"FREERUN_DISABLED");
 
 
                return PLUGIN_HANDLED;
 
 
        }
 
 
        if(gbVote){
 
 
                ColorChat(id, GREEN, "[FreeRun]^x01 %L",id,"FREERUN_VOTE_IS_NOW");
 
 
                return PLUGIN_HANDLED;
 
 
        }
 
 
        if(!is_user_alive(id)){
 
 
                client_print(id, print_center, "%L",id, "MUST_B_ALIVE");
 
 
                return PLUGIN_HANDLED;
 
 
        }
 
 
        if(get_pcvar_num(gcvarPrivilege)!=0 && !gbFreeRun && get_user_team(id)==1){
 
 
                ColorChat(id, GREEN, "[FreeRun]^x01 %L",id,"FREERUN_TT_DECIDED");
 
 
                makeFreeRun(true);
 
 
                return PLUGIN_HANDLED;
 
 
        }
 
 
        new iLimit=get_pcvar_num(gcvarLimit);
 
 
        new iOffset=0;
 
 
        if(get_pcvar_num(gcvarLimitMode)){
 
 
                iOffset = ( giTime + iLimit * 60 )  - get_systime();
 
 
                if( iOffset > 0 ){
 
 
                        ColorChat(id, GREEN, "[FreeRun]^x01 %L",id,"FREERUN_NEXT_VOTE_TIME", iOffset/60, iOffset%60);
 
 
                        return PLUGIN_HANDLED;
 
 
                }
 
 
        }
 
 
        else{
 
 
                iOffset =  min(MAX_ROUNDS, iLimit) - giRounds;
 
 
                if( iOffset > 0 ){
 
 
                        ColorChat(id, GREEN, "[FreeRun]^x01 %L",id,"FREERUN_NEXT_VOTE_ROUNDS", iOffset);
 
 
                        return PLUGIN_HANDLED;
 
 
                }
 
 
        }
 
 
 
 
 
        makeVote();
 
 
        return PLUGIN_CONTINUE;
 
 
}
 
 
//FREERUN
 
 
public makeVote(){
 
 
        giVoteTime=get_pcvar_num(gcvarFRVoteTime);
 
 
        gbVote=true;
 
 
        giVoteStart=get_systime();
 
 
        set_task(float(giVoteTime), "resultsOfVote", TASK_RES);
 
 
        new Players[32], playerCount;
 
 
        new id;
 
 
        get_players(Players, playerCount);
 
 
        for (new i=0; i<playerCount; i++){
 
 
                id = Players[i];
 
 
                eventInGame(id);
 
 
        }
 
 
 
 
 
}
 
 
public resultsOfVote(tid){
 
 
        gbVote=false;
 
 
 
 
 
        new giVotesOn=count(VOTE_ON);
 
 
        new giVotesOff=count(VOTE_OFF);
 
 
 
 
 
        ColorChat(0,GREEN, "[FreeRun]^x01 %L %L(%d) vs %L(%d)",LANG_SERVER,"FREERUN_RESULTS",LANG_SERVER,"YES",giVotesOn,LANG_SERVER,"NO", giVotesOff);
 
 
 
 
 
        if( giVotesOn == giVotesOff ){
 
 
                ColorChat(0,GREEN, "[FreeRun]^x01 %L",LANG_SERVER,"FREERUN_TIE");
 
 
                return;
 
 
        }
 
 
        makeFreeRun((giVotesOn > giVotesOff));
 
 
        ColorChat(0,GREEN, "[FreeRun]^x01 %L ^x03%L",LANG_SERVER,"FREERUN_WINOPTION",LANG_SERVER, gbFreeRun?"YES":"NO");
 
 
}
 
 
makeFreeRun(bool:bFR=true){
 
 
        gbFreeRun=bFR;
 
 
        reset();
 
 
        giRounds=0;
 
 
        giTime=get_systime();
 
 
 
 
 
        if(gbFreeRun){
 
 
                set_hudmessage(0, 255, 255, 0.02, -1.0);
 
 
                show_hudmessage(0, "FreeRun!");
 
 
 
 
 
                new players[32], pnum;
 
 
                get_players(players, pnum);
 
 
                for(new i=0; i<pnum; i++)
 
 
                {
 
 
                new pid = players[i];
 
 
                strip_user_weapons(pid);
 
 
                give_item(pid, "weapon_knife");
 
 
               }
 
 
        }
 
 
 
 
 
}
 
 
count(VOTE_STATE){
 
 
        new iCounter=0;
 
 
        for(new i=1;i<33;i++)
 
 
                if(giVotes[i][VOTE_STATE])
 
 
                        iCounter++;
 
 
        return iCounter;
 
 
}
 
 
reset(){
 
 
        for(new i=1;i<33;i++){
 
 
                giVotes[i][VOTE_ON]=0;
 
 
                giVotes[i][VOTE_OFF]=0;
 
 
        }
 
 
}
 
 
public show_menu_(tid){
 
 
        new id=tid-TASK_SHOWMENU;
 
 
        new iTeam=get_user_team(id);
 
 
        new menu_id, keys;
 
 
        new menuUp = player_menu_info( id, menu_id, keys );
 
 
        // Only display menu if another isn't shown
 
 
        if ( iTeam && (menuUp <= 0 || menu_id < 0) ){
 
 
                new iTime=get_pcvar_num(gcvarFRVoteTime);
 
 
                new iOffset=get_systime()-giVoteStart;
 
 
                iTime-=iOffset;
 
 
                new szMenu[128];
 
 
                formatex(szMenu, 127, "\y%L^n^n\w1. %L^n2. %L",id,"FREERUN_VOTEMENU",id,"YES",id,"NO");
 
 
                show_menu(id, KeysFFVote, szMenu, iTime, "FRVote");
 
 
        }else
 
 
                set_task(1.0, "show_menu_", tid);
 
 
}
 
 
public eventInGame(id){
 
 
        if(giVotes[id][VOTE_ON] || giVotes[id][VOTE_OFF])
 
 
                return;
 
 
        if(gbVote)
 
 
                set_task(1.0, "show_menu_", id+TASK_SHOWMENU);
 
 
}
 
 
public PressedFRVote(id, key) {
 
 
        if(gbVote==false) return;
 
 
        switch (key) {
 
 
                case VOTE_ON: { // 1
 
 
                        giVotes[id][VOTE_ON]=1;
 
 
                }
 
 
                case VOTE_OFF: { // 2
 
 
                        giVotes[id][VOTE_OFF]=1;
 
 
                }
 
 
                default:{
 
 
                        return;
 
 
                }
 
 
        }
 
 
        new szName[32];
 
 
        get_user_name(id, szName, 31);
 
 
 
 
 
        client_print(0, print_chat, "* %L",LANG_PLAYER,(key==VOTE_ON)?"VOTED_FOR":"VOTED_AGAINST", szName);
 
 
}
 
 
 
 
 
stock Create_TE_BEAMPOINTS(Float:start[3], Float:end[3], iSprite, startFrame, frameRate, life, width, noise, red, green, blue, alpha, speed){
 
 
        message_begin( MSG_BROADCAST, SVC_TEMPENTITY )
 
 
        write_byte( TE_BEAMPOINTS )
 
 
        write_coord( floatround(start[0]) )
 
 
        write_coord( floatround(start[1]) )
 
 
        write_coord( floatround(start[2]) )
 
 
        write_coord( floatround(end[0]) )
 
 
        write_coord( floatround(end[1]) )
 
 
        write_coord( floatround(end[2]) )
 
 
        write_short( iSprite )                  // model
 
 
        write_byte( startFrame )                // start frame
 
 
        write_byte( frameRate )                 // framerate
 
 
        write_byte( life )                              // life
 
 
        write_byte( width )                             // width
 
 
        write_byte( noise )                             // noise
 
 
        write_byte( red)                                // red
 
 
        write_byte( green )                             // green
 
 
        write_byte( blue )                              // blue
 
 
        write_byte( alpha )                             // brightness
 
 
        write_byte( speed )                             // speed
 
 
        message_end()
 
 
}
 
 
stock fm_get_brush_entity_origin(ent, Float:fOrigin[3]){
 
 
        new Float:fMins[3], Float:fMaxs[3];
 
 
        pev(ent, pev_mins, fMins);
 
 
        pev(ent, pev_maxs, fMaxs);
 
 
 
 
 
        for(new i=0;i<3;i++)
 
 
                fOrigin[i]=(fMins[i]+fMaxs[i])/2;
 
 
}