PHP- Kodu:
/*================================================================================
    
    --------------------------------------
    -*- [ZP] Sub-Plugin: Ultimate Bank -*-
    --------------------------------------
    
    ~~~~~~~~~~~~~~~
    - Description -
    ~~~~~~~~~~~~~~~
    
    This plug-in offers the clients the possibility to save their
        ammo packs in a bank account and retrieve them when needed.
    Everything is configurable by cvar values.
    This bank has absolutely NO BUGS.
    This plug-in also has new features such as auto saving,
        auto withdrawing, ML and bot support.
    Enjoy it and have fun!
    
    Original forum thread: [ZP] Sub-Plugin: Ultimate Bank 1.1 - AlliedModders
    
    ~~~~~~~~~~~~~
    - Thanks to -
    ~~~~~~~~~~~~~
    
        MeRcyLeZZ - For such an awesome mod like Zombie Plague
            and for some code i used from it...once again
        Random1 - For the original plug-in
        abdul-rehman - For suggesting removal of entity for ads
            and providing a option to replace it
        dorin2oo7 - For his pictures i used to style up my post
    
    ~~~~~~~~~~~~~~~~~
    - Multi-lingual -
    ~~~~~~~~~~~~~~~~~
    
        EN: Me (AlliedModders - View Profile: georgik57)
        RO: Me (AlliedModders - View Profile: georgik57)
        ES: DJHD! (AlliedModders - View Profile: DJHD!),
            lNeedHelp (AlliedModders - View Profile: lNeedHelp)
        RU: GAARA54 (AlliedModders - View Profile: GAARA54)
        BR: BRDominik (AlliedModders - View Profile: BRDominik)
        TR: AnqeL' (AlliedModders - View Profile: AnqeL')
        LV: Zyhm (AlliedModders - View Profile: Zyhm)
        PL: artos (AlliedModders - View Profile: artos)
    
    ~~~~~~~~~~~~~~
    - To do list -
    ~~~~~~~~~~~~~~
    
        * Add donate
        * Add SQL support
    
    ~~~~~~~~~~~~~
    - Changelog -
    ~~~~~~~~~~~~~
    
    * v1.0 (11 Jul 2010)
        - First release
        - Added ML, auto-depositing/withdrawing,
           bot, steamid, ip, name saving support
        - Fixed all the bugs up to date
    
    * v1.1 (25 Sep 2010)
        - Fixed ML not displaying correctly when
           depositing a certain ammount of ammo packs
        - Fixed auto-withdraw bug which was
           giving players extra ammo packs
        - Replaced ad entity with a task
        - Added reseting the bank limit if it's
           set to a value lower than 1
        - Ads display now only the active options
        - Removed FakeMeta
    
================================================================================*/


#include <amxmodx>
#include <nvault>
#include <zombieplague>


#define CMDTARGET_OBEY_IMMUNITY (1<<0)
#define CMDTARGET_ALLOW_SELF    (1<<1)
#define CMDTARGET_ONLY_ALIVE    (1<<2)
#define CMDTARGET_NO_BOTS        (1<<3)


enum pcvar
{
    
enable 0,
    
cap,
    
start,
    
advertise,
    
deposit,
    
withdraw,
    
account,
    
savetype,
    
bot
}


new 
gvaultg_msgSayTextpcvars[pcvar], bankstorage[33]


public 
plugin_init()
{
    
register_plugin("[ZP] Sub Plugin: Ultimate Bank""1.1""93()|29!/<, Random1");
    
register_dictionary("zp_bank.txt")
    
    
gvault nvault_open("Zombie Bank Ultimate");
    
g_msgSayText get_user_msgid("SayText")
    
    
pcvars[enable] =    register_cvar("zp_bank""1");
    
pcvars[cap] =        register_cvar("zp_bank_limit""7500000007");
    
pcvars[start] =        register_cvar("zp_bank_blockstart""0");
    
pcvars[advertise] =    register_cvar("zp_bank_ad_delay""275.7")
    
pcvars[deposit] =    register_cvar("zp_bank_deposit""1")
    
pcvars[withdraw] =    register_cvar("zp_bank_withdraw""1")
    
pcvars[account] =    register_cvar("zp_bank_account""1")
    
pcvars[savetype] =    register_cvar("zp_bank_save_type""1")
    
pcvars[bot] =        register_cvar("zp_bank_bot_support""1")
    
    if (
get_pcvar_num(pcvars[cap]) > 2147483646)
    {
        
set_pcvar_num(pcvars[cap], 2147483646);
        
server_print("[%L] %L"LANG_PLAYER"BANK_PREFIX"LANG_PLAYER"BANK_LIMIT");
    }
    else if (
get_pcvar_num(pcvars[cap]) < 1)
        
set_pcvar_num(pcvars[cap], 1);
    
    
register_clcmd("say""handle_say");
    
register_clcmd("say_team""handle_say");
    
    if (
get_pcvar_num(pcvars[advertise]))
        
set_task(get_pcvar_float(pcvars[advertise]), "advertise_loop");
}


public 
plugin_cfg()
{
    
// Plugin is disabled
    
if (!get_pcvar_num(pcvars[enable]))
        return;
    
    
// Get configs dir
    
new cfgdir[32]
    
get_configsdir(cfgdircharsmax(cfgdir))
    
    
// Execute config file (zp_rewards.cfg)
    
server_cmd("exec %s/zp_bank.cfg"cfgdir)
}


public 
advertise_loop()
{
    if (!
get_pcvar_num(pcvars[enable]) || !get_pcvar_float(pcvars[advertise]))
    {
        
remove_task()
        
        return;
    }
    
    if (
get_pcvar_num(pcvars[cap]))
        
zp_colored_print(0"^x04[%L]^x01 %L"LANG_PLAYER"BANK_PREFIX"LANG_PLAYER"BANK_INFO1"get_pcvar_num(pcvars[cap]));
    
    if (
get_pcvar_num(pcvars[deposit]))
        
zp_colored_print(0"^x04[%L]^x01 %L"LANG_PLAYER"BANK_PREFIX"LANG_PLAYER"BANK_INFO_DPS");
    else
        
zp_colored_print(0"^x04[%L]^x01 %L"LANG_PLAYER"BANK_PREFIX"LANG_PLAYER"BANK_INFO_AS");
    
    if (
get_pcvar_num(pcvars[withdraw]))
        
zp_colored_print(0"^x04[%L]^x01 %L"LANG_PLAYER"BANK_PREFIX"LANG_PLAYER"BANK_INFO_WD");
    
    
set_task(get_pcvar_float(pcvars[advertise]), "advertise_loop");
}


public 
plugin_end()
    
nvault_close(gvault);
    
public 
handle_say(id)
{
    if (!
get_pcvar_num(pcvars[enable]))
        return 
PLUGIN_CONTINUE;
    
    new 
text[70], arg1[32], arg2[32], arg3[6];
    
read_args(textsizeof(text) - 1);
    
remove_quotes(text);
    
arg1[0] = '^0';
    
arg2[0] = '^0';
    
arg3[0] = '^0';
    
parse(textarg1sizeof(arg1) - 1arg2sizeof(arg2) - 1arg3sizeof(arg3) - 1);


    
//strip forward slash if present
    
if (equali(arg1"/"1))
        
format(arg131arg1[1]);
    
    
// if the chat line has more than 2 words, we're not interested at all
    
if (arg3[0])
        return 
PLUGIN_CONTINUE;
    
    if (
equali(arg1"deposit"7) || equali(arg1"save"4) || equali(arg1"store"5))
    {
        if (!
get_pcvar_num(pcvars[deposit]))
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_DNA");
            
            return 
PLUGIN_CONTINUE;
        }
        
        if (
isdigit(arg2[0]) || arg2[0] == '-' && isdigit(arg2[1]))
        {
            new 
amount str_to_num(arg2);
            if (
amount <= 0)
            {
                
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_VGZ");
                
                return 
PLUGIN_CONTINUE;
            }
            
store_packs(idamount);
            
            return 
PLUGIN_HANDLED;
        }
        else if (
equali(arg2"all"))
        {
            
store_packs(id0);
            
            return 
PLUGIN_HANDLED;
        }
        else if (!
arg2[0])
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_HELP_DPS");
            
            return 
PLUGIN_CONTINUE;
        }
        
        return 
PLUGIN_CONTINUE;
    }
    else if (
equali(arg1"withdraw"8) || equali(arg1"take"4) || equali(arg1"retrieve"8))
    {
        if (!
get_pcvar_num(pcvars[withdraw]))
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_WNA");
            
            return 
PLUGIN_CONTINUE;
        }
        
        if (
isdigit(arg2[0]) || arg2[0] == '-' && isdigit(arg2[1]))
        {
            new 
amount str_to_num(arg2);
            if (
amount <= 0)
            {
                
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_VGZ");
                
                return 
PLUGIN_CONTINUE;
            }
            
take_packs(idamount);
            
            return 
PLUGIN_HANDLED;
        }
        else if (
equali(arg2"all"3) || equali(arg2"everything"10))
        {
            
take_packs(id0);
            
            return 
PLUGIN_HANDLED;
        }
        else if (!
arg2[0])
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_HELP_WD");
            
            return 
PLUGIN_CONTINUE;
        }
        
        return 
PLUGIN_CONTINUE;
    }
    else if (
equali(arg1"packs"6) || equali(arg1"account"7) || equali(arg1"bank"4))
    {
        if (!
arg2[0])
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_INFO_CHK1"bankstorage[id]);
            
            return 
PLUGIN_HANDLED;
        }
        else
        {
            new 
id2 cmd_target(idarg22);
            if (!
id2)
                return 
PLUGIN_CONTINUE;
            
            static 
id2name[32];
            
get_user_name(id2id2name31);
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_INFO_CHK2"id2namebankstorage[id2]);
            
            return 
PLUGIN_HANDLED;
        }
        
        return 
PLUGIN_CONTINUE;
    }
    
    return 
PLUGIN_CONTINUE;
}


//public zp_user_disconnect_pre(id)
public client_disconnect(id)
{
    if (!
get_pcvar_num(pcvars[enable]))
        return;
    
    if (
is_user_bot(id) && !get_pcvar_num(pcvars[bot]) || !zp_get_user_ammo_packs(id))
        return;
    else
        
store_packs(id0);
    
    if (
bankstorage[id] > 0)
        
save_data(id);
}


//public zp_user_connect_post(id)
public client_putinserver(id)
{
    if (!
get_pcvar_num(pcvars[enable]))
        return;
    
    
bankstorage[id] = 0//clear residual before loading
    
retrieve_data(id);
    if (!
get_pcvar_num(pcvars[withdraw]))
    {
        if (!
bankstorage[id] || is_user_bot(id) && !get_pcvar_num(pcvars[bot]))
            return;
        
        
take_packs(id0)
    }
}


store_packs(idamnt)
{
    if (!
get_pcvar_num(pcvars[enable]))
        return;
    
    new 
temp zp_get_user_ammo_packs(id);
    new 
limit get_pcvar_num(pcvars[cap]);
    new 
fill limit bankstorage[id];
    
    if (!
temp)
    {
        
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_NAPTD")
        
        return;
    }
    
    if (
amnt == 0)
    {
        if (
bankstorage[id] + temp <= limit)
        {
            
bankstorage[id] += temp;
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_DPST"temp)
            
zp_set_user_ammo_packs(id0);
        }
        else
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_CPCT"limit);
            if (!
fill)
            {
                
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_NDPST");
                
                return;
            }
            else
            {
                
bankstorage[id] += fill
                zp_set_user_ammo_packs
(idtemp fill);
                
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_PADPST"fill);
            }
        }
        
checkmax(id);
    }
    else if (
amnt 0)
    {        
        if (
temp >= amnt)
        {            
            if (
bankstorage[id] + amnt <= limit)
            {
                
bankstorage[id] += amnt
                zp_set_user_ammo_packs
(idtemp amnt);
                
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_DPST"amnt)
            }
            else
            {
                
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_CPCT"limit);
                if (!
fill)
                {
                    
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_NDPST");
                    
                    return;
                }
                else
                {
                    
bankstorage[id] += fill
                    zp_set_user_ammo_packs
(idtemp fill);
                    
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_PDPST"fillamnt);
                }
            }
        }
        else
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_ASTDG"amnttemp);
            
            return;
        }
    }
}


take_packs(idamnt)
{
    if (!
get_pcvar_num(pcvars[enable]))
        return;
    
    if (!
bankstorage[id])
    {
        
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_NPIA")
        
        return;
    }
    
    if (
amnt == 0)
    {
        
zp_set_user_ammo_packs(idzp_get_user_ammo_packs(id) + bankstorage[id])
        
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_WALL"bankstorage[id])
        
bankstorage[id] = 0;
    }
    else if (
amnt 0)
    {
        if (
bankstorage[id] >= amnt)
        {
            
zp_set_user_ammo_packs(idzp_get_user_ammo_packs(id) + amnt);
            
bankstorage[id] -= amnt;
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_WAM"amnt)
        }
        else
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_ASGB"amntbankstorage[id]);
            
            return;
        }
    }
}


save_data(id)
{
    new 
vaultkey[40], vaultdata[13];
    
    switch (
get_pcvar_num(pcvars[savetype]))
    {
        case 
1:
        {
            new 
AuthID[33];
            
get_user_authid(idAuthID32);
            
            
formatex(vaultkey39"__%s__"AuthID);
        }
        case 
2:
        {
            new 
IP[33];
            
get_user_ip(idIP32);
            
            
formatex(vaultkey39"__%s__"IP);
        }
        case 
3:
        {
            new 
Name[33];
            
get_user_name(idName32);
            
            
formatex(vaultkey39"__%s__"Name);
        }
    }
    
formatex(vaultdata12"%i"bankstorage[id]);
    
nvault_set(gvaultvaultkeyvaultdata);
}


retrieve_data(id)
{
    new 
vaultkey[40], vaultdata[13];
    
    switch (
get_pcvar_num(pcvars[savetype]))
    {
        case 
1:
        {
            new 
AuthID[33];
            
get_user_authid(idAuthID32);
            
            
formatex(vaultkey39"__%s__"AuthID);
        }
        case 
2:
        {
            new 
IP[33];
            
get_user_ip(idIP32);
            
            
formatex(vaultkey39"__%s__"IP);
        }
        case 
3:
        {
            new 
Name[33];
            
get_user_name(idName32);
            
            
formatex(vaultkey39"__%s__"Name);
        }
    }
    
nvault_get(gvaultvaultkeyvaultdata12); 
    
    
bankstorage[id] = str_to_num(vaultdata);
    
checkmax(id);    
    
    
// If they have an account don't allow zombie mod to give them 5 ammo packs at beggining
    
if (get_pcvar_num(pcvars[start]) && bankstorage[id] > 0)
        
zp_set_user_ammo_packs(id0);
}


checkmax(id)
{
    if (
bankstorage[id] > get_pcvar_num(pcvars[cap]))
        
bankstorage[id] = get_pcvar_num(pcvars[cap]);
    else if (
bankstorage[id] < 0)
        
bankstorage[id] = 0;
}


// Colored chat print by MeRcyLeZZ
zp_colored_print(target, const message[], any:...)
{
    static 
buffer[512], iargscount
    argscount 
numargs()
    
    
// Send to everyone
    
if (!target)
    {
        static 
player
        
for (player 1player <= get_maxplayers(); player++)
        {
            
// Not connected
            
if (!is_user_connected(player))
                continue;
            
            
// Remember changed arguments
            
static changed[5], changedcount // [5] = max LANG_PLAYER occurencies
            
changedcount 0
            
            
// Replace LANG_PLAYER with player id
            
for (2argscounti++)
            {
                if (
getarg(i) == LANG_PLAYER)
                {
                    
setarg(i0player)
                    
changed[changedcount] = i
                    changedcount
++
                }
            }
            
            
// Format message for player
            
vformat(buffercharsmax(buffer), message3)
            
            
// Send it
            
message_begin(MSG_ONE_UNRELIABLEg_msgSayText_player)
            
write_byte(player)
            
write_string(buffer)
            
message_end()
            
            
// Replace back player id's with LANG_PLAYER
            
for (0changedcounti++)
                
setarg(changed[i], 0LANG_PLAYER)
        }
    }
    
// Send to specific target
    
else
    {
        
// Format message for player
        
vformat(buffercharsmax(buffer), message3)
        
        
// Send it
        
message_begin(MSG_ONEg_msgSayText_target)
        
write_byte(target)
        
write_string(buffer)
        
message_end()
    }
}


// Stock from AmxMisc
stock get_configsdir(name[], len)
    return 
get_localinfo("amxx_configsdir"namelen);


stock cmd_target(id,const arg[],flags CMDTARGET_OBEY_IMMUNITY
{
    new 
player find_player("bl",arg);
    if (
player
    {
        if ( 
player != find_player("blj",arg) ) 
        {
#if defined AMXMOD_BCOMPAT
            
console_print(idSIMPLE_T("There are more clients matching to your argument"));
#else
            
console_print(id,"%L",id,"MORE_CL_MATCHT");
#endif
            
return 0;
        }
    }
    else if ( ( 
player find_player("c",arg) )==&& arg[0]=='#' && arg[1] )
    {
        
player find_player("k",str_to_num(arg[1]));
    }
    if (!
player
    {
#if defined AMXMOD_BCOMPAT
        
console_print(idSIMPLE_T("Client with that name or userid not found"));
#else
        
console_print(id,"%L",id,"CL_NOT_FOUND");
#endif
        
return 0;
    }
    if (
flags CMDTARGET_OBEY_IMMUNITY
    {
        if ((
get_user_flags(player) & ADMIN_IMMUNITY) && 
            ((
flags CMDTARGET_ALLOW_SELF) ? (id != player) : true) ) 
        {
            new 
imname[32];
            
get_user_name(player,imname,31);
#if defined AMXMOD_BCOMPAT
            
console_print(idSIMPLE_T("Client ^"%s^" has immunity"), imname);
#else
            
console_print(id,"%L",id,"CLIENT_IMM",imname);
#endif
            
return 0;
        }
    }
    if (
flags CMDTARGET_ONLY_ALIVE
    {
        if (!
is_user_alive(player)) 
        {
            new 
imname[32];
            
get_user_name(player,imname,31);
#if defined AMXMOD_BCOMPAT
            
console_print(idSIMPLE_T("That action can't be performed on dead client ^"%s^""), imname);
#else
            
console_print(id,"%L",id,"CANT_PERF_DEAD",imname);
#endif
            
return 0;
        }
    }
    if (
flags CMDTARGET_NO_BOTS
    {
        if (
is_user_bot(player)) 
        {
            new 
imname[32];
            
get_user_name(player,imname,31);
#if defined AMXMOD_BCOMPAT
            
console_print(idSIMPLE_T("That action can't be performed on bot ^"%s^""), imname);
#else
            
console_print(id,"%L",id,"CANT_PERF_BOT",imname);
#endif
            
return 0;
        }
    }
    return 
player;
}

- - - - - - - - - -

/*================================================================================
    
    --------------------------------------
    -*- [ZP] Sub-Plugin: Ultimate Bank -*-
    --------------------------------------
    
    ~~~~~~~~~~~~~~~
    - Description -
    ~~~~~~~~~~~~~~~
    
    This plug-in offers the clients the possibility to save their
        ammo packs in a bank account and retrieve them when needed.
    Everything is configurable by cvar values.
    This bank has absolutely NO BUGS.
    This plug-in also has new features such as auto saving,
        auto withdrawing, ML and bot support.
    Enjoy it and have fun!
    
    Original forum thread: https://forums.alliedmods.net/showthread.php?t=132326
    
    ~~~~~~~~~~~~~
    - Thanks to -
    ~~~~~~~~~~~~~
    
        MeRcyLeZZ - For such an awesome mod like Zombie Plague
            and for some code i used from it...once again
        Random1 - For the original plug-in
        abdul-rehman - For suggesting removal of entity for ads
            and providing a option to replace it
        dorin2oo7 - For his pictures i used to style up my post
    
    ~~~~~~~~~~~~~~~~~
    - Multi-lingual -
    ~~~~~~~~~~~~~~~~~
    
        EN: Me (https://forums.alliedmods.net/member.php?u=42526)
        RO: Me (https://forums.alliedmods.net/member.php?u=42526)
        ES: DJHD! (https://forums.alliedmods.net/member.php?u=65176),
            lNeedHelp (https://forums.alliedmods.net/member.php?u=82951)
        RU: GAARA54 (https://forums.alliedmods.net/member.php?u=62855)
        BR: BRDominik (https://forums.alliedmods.net/member.php?u=80474)
        TR: AnqeL' (https://forums.alliedmods.net/member.php?u=83506)
        LV: Zyhm (https://forums.alliedmods.net/member.php?u=55789)
        PL: artos (https://forums.alliedmods.net/member.php?u=73986)
    
    ~~~~~~~~~~~~~~
    - To do list -
    ~~~~~~~~~~~~~~
    
        * Add donate
        * Add SQL support
    
    ~~~~~~~~~~~~~
    - Changelog -
    ~~~~~~~~~~~~~
    
    * v1.0 (11 Jul 2010)
        - First release
        - Added ML, auto-depositing/withdrawing,
           bot, steamid, ip, name saving support
        - Fixed all the bugs up to date
    
    * v1.1 (25 Sep 2010)
        - Fixed ML not displaying correctly when
           depositing a certain ammount of ammo packs
        - Fixed auto-withdraw bug which was
           giving players extra ammo packs
        - Replaced ad entity with a task
        - Added reseting the bank limit if it's
           set to a value lower than 1
        - Ads display now only the active options
        - Removed FakeMeta
    
================================================================================*/


#include <amxmodx>
#include <nvault>
#include <zombieplague>


#define CMDTARGET_OBEY_IMMUNITY (1<<0)
#define CMDTARGET_ALLOW_SELF    (1<<1)
#define CMDTARGET_ONLY_ALIVE    (1<<2)
#define CMDTARGET_NO_BOTS        (1<<3)


enum pcvar
{
    
enable 0,
    
cap,
    
start,
    
advertise,
    
deposit,
    
withdraw,
    
account,
    
savetype,
    
bot
}


new 
gvaultg_msgSayTextpcvars[pcvar], bankstorage[33]


public 
plugin_init()
{
    
register_plugin("[ZP] Sub Plugin: Ultimate Bank""1.1""93()|29!/<, Random1");
    
register_dictionary("zp_bank.txt")
    
    
gvault nvault_open("Zombie Bank Ultimate");
    
g_msgSayText get_user_msgid("SayText")
    
    
pcvars[enable] =    register_cvar("zp_bank""1");
    
pcvars[cap] =        register_cvar("zp_bank_limit""7500000007");
    
pcvars[start] =        register_cvar("zp_bank_blockstart""0");
    
pcvars[advertise] =    register_cvar("zp_bank_ad_delay""275.7")
    
pcvars[deposit] =    register_cvar("zp_bank_deposit""1")
    
pcvars[withdraw] =    register_cvar("zp_bank_withdraw""1")
    
pcvars[account] =    register_cvar("zp_bank_account""1")
    
pcvars[savetype] =    register_cvar("zp_bank_save_type""1")
    
pcvars[bot] =        register_cvar("zp_bank_bot_support""1")
    
    if (
get_pcvar_num(pcvars[cap]) > 2147483646)
    {
        
set_pcvar_num(pcvars[cap], 2147483646);
        
server_print("[%L] %L"LANG_PLAYER"BANK_PREFIX"LANG_PLAYER"BANK_LIMIT");
    }
    else if (
get_pcvar_num(pcvars[cap]) < 1)
        
set_pcvar_num(pcvars[cap], 1);
    
    
register_clcmd("say""handle_say");
    
register_clcmd("say_team""handle_say");
    
    if (
get_pcvar_num(pcvars[advertise]))
        
set_task(get_pcvar_float(pcvars[advertise]), "advertise_loop");
}


public 
plugin_cfg()
{
    
// Plugin is disabled
    
if (!get_pcvar_num(pcvars[enable]))
        return;
    
    
// Get configs dir
    
new cfgdir[32]
    
get_configsdir(cfgdircharsmax(cfgdir))
    
    
// Execute config file (zp_rewards.cfg)
    
server_cmd("exec %s/zp_bank.cfg"cfgdir)
}


public 
advertise_loop()
{
    if (!
get_pcvar_num(pcvars[enable]) || !get_pcvar_float(pcvars[advertise]))
    {
        
remove_task()
        
        return;
    }
    
    if (
get_pcvar_num(pcvars[cap]))
        
zp_colored_print(0"^x04[%L]^x01 %L"LANG_PLAYER"BANK_PREFIX"LANG_PLAYER"BANK_INFO1"get_pcvar_num(pcvars[cap]));
    
    if (
get_pcvar_num(pcvars[deposit]))
        
zp_colored_print(0"^x04[%L]^x01 %L"LANG_PLAYER"BANK_PREFIX"LANG_PLAYER"BANK_INFO_DPS");
    else
        
zp_colored_print(0"^x04[%L]^x01 %L"LANG_PLAYER"BANK_PREFIX"LANG_PLAYER"BANK_INFO_AS");
    
    if (
get_pcvar_num(pcvars[withdraw]))
        
zp_colored_print(0"^x04[%L]^x01 %L"LANG_PLAYER"BANK_PREFIX"LANG_PLAYER"BANK_INFO_WD");
    
    
set_task(get_pcvar_float(pcvars[advertise]), "advertise_loop");
}


public 
plugin_end()
    
nvault_close(gvault);
    
public 
handle_say(id)
{
    if (!
get_pcvar_num(pcvars[enable]))
        return 
PLUGIN_CONTINUE;
    
    new 
text[70], arg1[32], arg2[32], arg3[6];
    
read_args(textsizeof(text) - 1);
    
remove_quotes(text);
    
arg1[0] = '^0';
    
arg2[0] = '^0';
    
arg3[0] = '^0';
    
parse(textarg1sizeof(arg1) - 1arg2sizeof(arg2) - 1arg3sizeof(arg3) - 1);


    
//strip forward slash if present
    
if (equali(arg1"/"1))
        
format(arg131arg1[1]);
    
    
// if the chat line has more than 2 words, we're not interested at all
    
if (arg3[0])
        return 
PLUGIN_CONTINUE;
    
    if (
equali(arg1"deposit"7) || equali(arg1"save"4) || equali(arg1"store"5))
    {
        if (!
get_pcvar_num(pcvars[deposit]))
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_DNA");
            
            return 
PLUGIN_CONTINUE;
        }
        
        if (
isdigit(arg2[0]) || arg2[0] == '-' && isdigit(arg2[1]))
        {
            new 
amount str_to_num(arg2);
            if (
amount <= 0)
            {
                
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_VGZ");
                
                return 
PLUGIN_CONTINUE;
            }
            
store_packs(idamount);
            
            return 
PLUGIN_HANDLED;
        }
        else if (
equali(arg2"all"))
        {
            
store_packs(id0);
            
            return 
PLUGIN_HANDLED;
        }
        else if (!
arg2[0])
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_HELP_DPS");
            
            return 
PLUGIN_CONTINUE;
        }
        
        return 
PLUGIN_CONTINUE;
    }
    else if (
equali(arg1"withdraw"8) || equali(arg1"take"4) || equali(arg1"retrieve"8))
    {
        if (!
get_pcvar_num(pcvars[withdraw]))
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_WNA");
            
            return 
PLUGIN_CONTINUE;
        }
        
        if (
isdigit(arg2[0]) || arg2[0] == '-' && isdigit(arg2[1]))
        {
            new 
amount str_to_num(arg2);
            if (
amount <= 0)
            {
                
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_VGZ");
                
                return 
PLUGIN_CONTINUE;
            }
            
take_packs(idamount);
            
            return 
PLUGIN_HANDLED;
        }
        else if (
equali(arg2"all"3) || equali(arg2"everything"10))
        {
            
take_packs(id0);
            
            return 
PLUGIN_HANDLED;
        }
        else if (!
arg2[0])
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_HELP_WD");
            
            return 
PLUGIN_CONTINUE;
        }
        
        return 
PLUGIN_CONTINUE;
    }
    else if (
equali(arg1"packs"6) || equali(arg1"account"7) || equali(arg1"bank"4))
    {
        if (!
arg2[0])
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_INFO_CHK1"bankstorage[id]);
            
            return 
PLUGIN_HANDLED;
        }
        else
        {
            new 
id2 cmd_target(idarg22);
            if (!
id2)
                return 
PLUGIN_CONTINUE;
            
            static 
id2name[32];
            
get_user_name(id2id2name31);
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_INFO_CHK2"id2namebankstorage[id2]);
            
            return 
PLUGIN_HANDLED;
        }
        
        return 
PLUGIN_CONTINUE;
    }
    
    return 
PLUGIN_CONTINUE;
}


//public zp_user_disconnect_pre(id)
public client_disconnect(id)
{
    if (!
get_pcvar_num(pcvars[enable]))
        return;
    
    if (
is_user_bot(id) && !get_pcvar_num(pcvars[bot]) || !zp_get_user_ammo_packs(id))
        return;
    else
        
store_packs(id0);
    
    if (
bankstorage[id] > 0)
        
save_data(id);
}


//public zp_user_connect_post(id)
public client_putinserver(id)
{
    if (!
get_pcvar_num(pcvars[enable]))
        return;
    
    
bankstorage[id] = 0//clear residual before loading
    
retrieve_data(id);
    if (!
get_pcvar_num(pcvars[withdraw]))
    {
        if (!
bankstorage[id] || is_user_bot(id) && !get_pcvar_num(pcvars[bot]))
            return;
        
        
take_packs(id0)
    }
}


store_packs(idamnt)
{
    if (!
get_pcvar_num(pcvars[enable]))
        return;
    
    new 
temp zp_get_user_ammo_packs(id);
    new 
limit get_pcvar_num(pcvars[cap]);
    new 
fill limit bankstorage[id];
    
    if (!
temp)
    {
        
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_NAPTD")
        
        return;
    }
    
    if (
amnt == 0)
    {
        if (
bankstorage[id] + temp <= limit)
        {
            
bankstorage[id] += temp;
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_DPST"temp)
            
zp_set_user_ammo_packs(id0);
        }
        else
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_CPCT"limit);
            if (!
fill)
            {
                
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_NDPST");
                
                return;
            }
            else
            {
                
bankstorage[id] += fill
                zp_set_user_ammo_packs
(idtemp fill);
                
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_PADPST"fill);
            }
        }
        
checkmax(id);
    }
    else if (
amnt 0)
    {        
        if (
temp >= amnt)
        {            
            if (
bankstorage[id] + amnt <= limit)
            {
                
bankstorage[id] += amnt
                zp_set_user_ammo_packs
(idtemp amnt);
                
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_DPST"amnt)
            }
            else
            {
                
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_CPCT"limit);
                if (!
fill)
                {
                    
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_NDPST");
                    
                    return;
                }
                else
                {
                    
bankstorage[id] += fill
                    zp_set_user_ammo_packs
(idtemp fill);
                    
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_PDPST"fillamnt);
                }
            }
        }
        else
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_ASTDG"amnttemp);
            
            return;
        }
    }
}


take_packs(idamnt)
{
    if (!
get_pcvar_num(pcvars[enable]))
        return;
    
    if (!
bankstorage[id])
    {
        
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_NPIA")
        
        return;
    }
    
    if (
amnt == 0)
    {
        
zp_set_user_ammo_packs(idzp_get_user_ammo_packs(id) + bankstorage[id])
        
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_WALL"bankstorage[id])
        
bankstorage[id] = 0;
    }
    else if (
amnt 0)
    {
        if (
bankstorage[id] >= amnt)
        {
            
zp_set_user_ammo_packs(idzp_get_user_ammo_packs(id) + amnt);
            
bankstorage[id] -= amnt;
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_WAM"amnt)
        }
        else
        {
            
zp_colored_print(id"^x04[%L]^x01 %L"id"BANK_PREFIX"id"BANK_ASGB"amntbankstorage[id]);
            
            return;
        }
    }
}


save_data(id)
{
    new 
vaultkey[40], vaultdata[13];
    
    switch (
get_pcvar_num(pcvars[savetype]))
    {
        case 
1:
        {
            new 
AuthID[33];
            
get_user_authid(idAuthID32);
            
            
formatex(vaultkey39"__%s__"AuthID);
        }
        case 
2:
        {
            new 
IP[33];
            
get_user_ip(idIP32);
            
            
formatex(vaultkey39"__%s__"IP);
        }
        case 
3:
        {
            new 
Name[33];
            
get_user_name(idName32);
            
            
formatex(vaultkey39"__%s__"Name);
        }
    }
    
formatex(vaultdata12"%i"bankstorage[id]);
    
nvault_set(gvaultvaultkeyvaultdata);
}


retrieve_data(id)
{
    new 
vaultkey[40], vaultdata[13];
    
    switch (
get_pcvar_num(pcvars[savetype]))
    {
        case 
1:
        {
            new 
AuthID[33];
            
get_user_authid(idAuthID32);
            
            
formatex(vaultkey39"__%s__"AuthID);
        }
        case 
2:
        {
            new 
IP[33];
            
get_user_ip(idIP32);
            
            
formatex(vaultkey39"__%s__"IP);
        }
        case 
3:
        {
            new 
Name[33];
            
get_user_name(idName32);
            
            
formatex(vaultkey39"__%s__"Name);
        }
    }
    
nvault_get(gvaultvaultkeyvaultdata12); 
    
    
bankstorage[id] = str_to_num(vaultdata);
    
checkmax(id);    
    
    
// If they have an account don't allow zombie mod to give them 5 ammo packs at beggining
    
if (get_pcvar_num(pcvars[start]) && bankstorage[id] > 0)
        
zp_set_user_ammo_packs(id0);
}


checkmax(id)
{
    if (
bankstorage[id] > get_pcvar_num(pcvars[cap]))
        
bankstorage[id] = get_pcvar_num(pcvars[cap]);
    else if (
bankstorage[id] < 0)
        
bankstorage[id] = 0;
}


// Colored chat print by MeRcyLeZZ
zp_colored_print(target, const message[], any:...)
{
    static 
buffer[512], iargscount
    argscount 
numargs()
    
    
// Send to everyone
    
if (!target)
    {
        static 
player
        
for (player 1player <= get_maxplayers(); player++)
        {
            
// Not connected
            
if (!is_user_connected(player))
                continue;
            
            
// Remember changed arguments
            
static changed[5], changedcount // [5] = max LANG_PLAYER occurencies
            
changedcount 0
            
            
// Replace LANG_PLAYER with player id
            
for (2argscounti++)
            {
                if (
getarg(i) == LANG_PLAYER)
                {
                    
setarg(i0player)
                    
changed[changedcount] = i
                    changedcount
++
                }
            }
            
            
// Format message for player
            
vformat(buffercharsmax(buffer), message3)
            
            
// Send it
            
message_begin(MSG_ONE_UNRELIABLEg_msgSayText_player)
            
write_byte(player)
            
write_string(buffer)
            
message_end()
            
            
// Replace back player id's with LANG_PLAYER
            
for (0changedcounti++)
                
setarg(changed[i], 0LANG_PLAYER)
        }
    }
    
// Send to specific target
    
else
    {
        
// Format message for player
        
vformat(buffercharsmax(buffer), message3)
        
        
// Send it
        
message_begin(MSG_ONEg_msgSayText_target)
        
write_byte(target)
        
write_string(buffer)
        
message_end()
    }
}


// Stock from AmxMisc
stock get_configsdir(name[], len)
    return 
get_localinfo("amxx_configsdir"namelen);


stock cmd_target(id,const arg[],flags CMDTARGET_OBEY_IMMUNITY
{
    new 
player find_player("bl",arg);
    if (
player
    {
        if ( 
player != find_player("blj",arg) ) 
        {
#if defined AMXMOD_BCOMPAT
            
console_print(idSIMPLE_T("There are more clients matching to your argument"));
#else
            
console_print(id,"%L",id,"MORE_CL_MATCHT");
#endif
            
return 0;
        }
    }
    else if ( ( 
player find_player("c",arg) )==&& arg[0]=='#' && arg[1] )
    {
        
player find_player("k",str_to_num(arg[1]));
    }
    if (!
player
    {
#if defined AMXMOD_BCOMPAT
        
console_print(idSIMPLE_T("Client with that name or userid not found"));
#else
        
console_print(id,"%L",id,"CL_NOT_FOUND");
#endif
        
return 0;
    }
    if (
flags CMDTARGET_OBEY_IMMUNITY
    {
        if ((
get_user_flags(player) & ADMIN_IMMUNITY) && 
            ((
flags CMDTARGET_ALLOW_SELF) ? (id != player) : true) ) 
        {
            new 
imname[32];
            
get_user_name(player,imname,31);
#if defined AMXMOD_BCOMPAT
            
console_print(idSIMPLE_T("Client ^"%s^" has immunity"), imname);
#else
            
console_print(id,"%L",id,"CLIENT_IMM",imname);
#endif
            
return 0;
        }
    }
    if (
flags CMDTARGET_ONLY_ALIVE
    {
        if (!
is_user_alive(player)) 
        {
            new 
imname[32];
            
get_user_name(player,imname,31);
#if defined AMXMOD_BCOMPAT
            
console_print(idSIMPLE_T("That action can't be performed on dead client ^"%s^""), imname);
#else
            
console_print(id,"%L",id,"CANT_PERF_DEAD",imname);
#endif
            
return 0;
        }
    }
    if (
flags CMDTARGET_NO_BOTS
    {
        if (
is_user_bot(player)) 
        {
            new 
imname[32];
            
get_user_name(player,imname,31);
#if defined AMXMOD_BCOMPAT
            
console_print(idSIMPLE_T("That action can't be performed on bot ^"%s^""), imname);
#else
            
console_print(id,"%L",id,"CANT_PERF_BOT",imname);
#endif
            
return 0;
        }
    }
    return 
player;