AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   plugin modification zp bank. (https://forums.alliedmods.net/showthread.php?t=320740)

Myshu 01-06-2020 18:00

plugin modification zp bank.
 
Hello guys.

Can somebody add in zp bank restriction and cvar for /withdraw command and with a chat message like:

/withdraw can be used after round 3

Can somebody add this restriction in this plugin?

HTML Code:

/* zp bank
initiallly this plugin started off with just the auto save feature making it just a plain save system
but it was decided that making it more like a bank would be more interesting and slowly it was converted
to include commands etc while leaving the original auto save function in place.  Later advanced bank accounts
with interest where added as was sql support.

say commands
deposit, send, store <amount/all>                                //deposites stated amount in bank account
                       
withdraw, take, retrieve <amount/all>                        //retrieves stated amount from bank account

mybank, account, bank <blank/name of person>        //if second parameter is left blank, states how many ap you have in your account
                                                                                                //if second parameter is specified it attempts to give a status on the said person's account

upgrade account                                                                        //will give a warning about what a advanced account does, after which person must say "advanced account" again to advance

server commands
zp_give_packs <steamid not name> <amount>        //gives ammo packs even if person not in game
zp_bank_amount <name/steamid>                                //same as bank say command, but works from server console
zp_reset_bank <time>                                                //will prune database by time based in days. time 0 = clean all


cvars copy/paste into your zombieplague.cfg file

zp_bank 1                                                        //plugin on or off?
zp_bank_auto 0                                                //0 = no auto save, 1 = auto save, 2 = auto save + auto withdraw all on connect
zp_bank_blockstart 0                                //if set we strip ammo packs zp gives when client first connects if they have an open bank account
zp_bank_upgradable 1                                //advanced accounts availalbe?
zp_bank_cost 1000                                        //cost to advance an account
zp_bank_interest 0.03                                //interest earned every x(zp_bank_clock) minutes
zp_bank_clock 60                                        //think is done in 1 minute intervals so 60 = 1 hr
zp_bank_transfee 3                                        //fee applied each time ammo packs are stored

*/
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <zombieplague>

enum {
        SAVE_NVAULT = 1,
        SAVE_SQL
}

#define SAVE_TYPE SAVE_NVAULT

#if SAVE_TYPE == SAVE_SQL
        #include <sqlx>
       
        new Handle:g_SqlX;
        new const sql_table[] = "zp_bank"
        new query_buff[1028];
#else
        #include <nvault>
       
        new gVault;
#endif

new const version[] = "4.4";
new const plugin[] = "ZP Bank";

enum pcvar
{ enable = 0, auto, start, account2, charge, interest, charge3, repitions }

new pcvars[pcvar];
new bankstorage[33], sessionstore[33];
new special[33], bool:warning[33], bool:xploaded[33], bool:lock_cmd[33];
new clockstore[33];

new thinkobj, g_msgSayText, loop_count;

public plugin_init()
{
        register_plugin(plugin, version, "Random1");
       
        pcvars[enable] =                        register_cvar("zp_bank", "1");
        pcvars[auto] =                                register_cvar("zp_bank_auto", "0");
        pcvars[start] =                                register_cvar("zp_bank_blockstart", "0");
        pcvars[account2] =                        register_cvar("zp_bank_upgradable", "1");
        pcvars[charge] =                        register_cvar("zp_bank_cost", "1000");
        pcvars[interest] =                        register_cvar("zp_bank_interest", "0.03");
        pcvars[repitions] =                        register_cvar("zp_bank_clock", "60");
        pcvars[charge3] =                        register_cvar("zp_bank_transfee", "3");
               
        register_clcmd("say", "handle_say");
        register_clcmd("say_team", "handle_say");
        register_concmd("zp_bank_amount", "serverbank", ADMIN_RCON, "<name/steamid>");
        register_concmd("zp_reset_bank", "prune_task", ADMIN_RCON, "<time> in days. time 0 = clean all");
        register_concmd("zp_give_packs", "givex_cmd", ADMIN_RCON, "<steamid not name> <amount>, gives ammo packs even if person not in game");
       
        #if SAVE_TYPE == SAVE_SQL
        set_task(0.5, "sql_init");
        register_logevent("logevent_round_end", 2, "1=Round_End");       
        #else
        gVault = nvault_open("zp_bank_data");
        #endif
       
       
        g_msgSayText = get_user_msgid("SayText");
       
        thinkobj = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
        if ( pev_valid(thinkobj) )
        {
                set_pev(thinkobj, pev_classname, "advertisement_loop");
                set_pev(thinkobj, pev_nextthink, get_gametime() + 60.0);
                register_forward(FM_Think, "onemin_think");
        }
}

public plugin_natives()
{
        register_native("zp_get_all_ammopacks", "native_retrieve_all_ap", 1);
        register_native("zp_get_bank_ammopacks", "native_retrieve_ap", 1);
        register_native("zp_set_bank_ammopacks", "native_set_ap", 1);
}

#if SAVE_TYPE == SAVE_SQL
public sql_init()
{
        g_SqlX = SQL_MakeStdTuple();
       
        formatex(query_buff, charsmax(query_buff), "CREATE TABLE IF NOT EXISTS `%s` (\
                                USER_KEY VARCHAR(36) NOT NULL PRIMARY KEY, \
                                AMMOPACK DECIMAL( 10 ) UNSIGNED NOT NULL DEFAULT '0', \
                                ADVANCED TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, \
                                TIMECLOCK INT(10) NOT NULL DEFAULT 0, \
                                LAST_PLAY_DATE TIMESTAMP(10) NOT NULL \
                        ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", sql_table)
       
        SQL_ThreadQuery(g_SqlX, "handle_error", query_buff);
}
       
public logevent_round_end()
{
        for( new id = 1; id <= 32; id++ )
                if ( is_user_connected(id) && !xploaded[id] )
                        retrieve_data(id);
}
#endif
       
public prune_task(id,level,cid)
{
        if (!cmd_access(id,level,cid,1)) {
                console_print(id,"You have no access to that command");
                return;
        }
        new connum = read_argc()
        if (connum >
2) {
                console_print(id,"Too many arguments supplied.");
                return;
        }
        if ( connum == 1 ) return;        //person just typed command to see the description
        //we check this because str_to_num will return 0 on an empty string thus doing the same thing as "zp_reset_bank 0" which does a full reset
       
        new adminname[32];
        get_user_name(id, adminname, 31);
        new arg[10];
        read_argv(1,arg,9);
        new timeamnt = str_to_num(arg);
        if ( timeamnt == 0 ) {
#if SAVE_TYPE == SAVE_NVAULT
                nvault_prune(gVault, 0, 0);
#else
                formatex(query_buff, charsmax(query_buff), "TRUNCATE TABLE `%s`", sql_table);
               
                SQL_ThreadQuery(g_SqlX, "handle_error", query_buff)
#endif
                zp_colored_print(0, "^x04[%s]^x03 The Bank's Been Robbed!, those dirty crooks stole all your money!", plugin);
                log_to_file("zp_error.log", "[%s] bank has been reset(completly) by admin %s", plugin, adminname);
                //for those who are in the server at the time of prune need to whipe out there stuff as well
                for( new o = 1; o < 33; o++)
                {
                        if ( !is_user_connected(o) || is_user_bot(o) ) continue;
                       
                        special[o] = 0;
                        warning[o] = false;
                        bankstorage[o] = 0;
                        clockstore[o] = -1;
                }
        }
        else {
#if SAVE_TYPE == SAVE_NVAULT
                nvault_prune(gVault, 0, get_systime() - (timeamnt * 86400));
#else
                formatex(query_buff, charsmax(query_buff), "DELETE FROM `%s` WHERE LAST_PLAY_DATE<(SYSDATE() - INTERVAL '%d' DAY)", sql_table, timeamnt);
               
                SQL_ThreadQuery(g_SqlX, "handle_error", query_buff)               
#endif
                log_to_file("zp_error.log", "[%s] bank has been pruned %d day%s by admin %s", plugin, timeamnt, timeamnt == 1 ? "" : "'s", adminname);               
        }
}

public givex_cmd(id,level,cid)
{
        if (!cmd_access(id,level,cid,1)) {
                console_print(id,"You have no access to that command");
                return;
        }
       
        if ( read_argc() >
3 ) return;
               
        new arg1[32], arg2[10], amount;
        read_argv(1, arg1, sizeof(arg1) - 1);
        read_argv(2, arg2, sizeof(arg2) - 1);
        if ( arg1[0] != 'S' && !isdigit(arg1[6]) )
        {
                server_print("[%s] please only use steamid and be sure to append the STEAM_0:", plugin);
                return;
        }
        if ( !isdigit(arg2[0]) && !isdigit(arg2[1]) ) {
                server_print("[%s] error argument2 = %s, should be a number", plugin, arg2);
                return;
        }
       
        amount = str_to_num(arg2);
        //first see if our player is not currently in server
        new i, AuthID[32];
        for( i = 1; i <= 32; i++ )
        {
                get_user_authid(i,AuthID,31);
                if ( equal(AuthID, arg1) )
                {
                        bankstorage[i] += amount;
                        server_print( "[%s] Succesfuly %s %d ammo packs %s %s. Account now has %d", plugin, amount >
0 ? "gave" : "took", amount, amount > 0 ? "to" : "from", arg1, bankstorage[i]);
                        log_to_file( "zp_banking.log", "[%s] Succesfuly %s %d ammo packs %s %s. Account now has %d", plugin, amount > 0 ? "gave" : "took", amount, amount > 0 ? "to" : "from", arg1, bankstorage[i]);
                        return;
                }
        }
        //not in the server so have to check our nvault file now
#if SAVE_TYPE == SAVE_NVAULT
        new vaultkey[38], vaultdata[64];
       
        formatex(vaultkey, 37, "__%s__", arg1);

        nvault_get(gVault, vaultkey, vaultdata, 63);
        if ( strlen(vaultdata) == 0 )
        {
                server_print( "[%s] player does not exsist within database, make sure your passing right steamid", plugin);
                return;
        }
        new cashamnt[51], has2[4], clockamnt[10], buffer[3];
        parse(vaultdata, cashamnt, 50, has2, 3, clockamnt, 9);       
       
        buffer[0] = str_to_num(cashamnt);
        buffer[1] = str_to_num(has2);
        buffer[2] = str_to_num(clockamnt);
        server_print( "[%s] %s has %d ammo packs before applying %d from zp_give_packs command", plugin, arg1, buffer[0], amount);
        //now apply the command
        buffer[0] += amount;
        if ( buffer[0] < 0 ) buffer[0] = 0;
        formatex(vaultdata, 63, "%i %i %i", buffer[0], buffer[1], buffer[2]);
       
        nvault_set(gVault, vaultkey, vaultdata);
        server_print( "[%s] Succesfuly %s %d ammo packs %s %s. Account now has %d", plugin, amount >
0 ? "gave" : "took", amount, amount > 0 ? "to" : "from", arg1, buffer[0]);
#else
        new data[38]
        data[0] = amount
        formatex(data[1], charsmax(data)-1, arg1);

        formatex(query_buff, charsmax(query_buff), "INSERT INTO `%s` SET USER_KEY='%s', AMMOPACK=%d ON DUPLICATE KEY UPDATE AMMOPACK=AMMOPACK+(%d)",
                sql_table, arg1, amount, amount);
               
        SQL_ThreadQuery(g_SqlX, "handle_error", query_buff, data, charsmax(data));
#endif
}

public onemin_think(ent)
{
        if ( ent != thinkobj ) return FMRES_IGNORED;
        if ( --loop_count <= 0 )
        {
                advertisement();
                loop_count = 4;
        }
       
        if ( !get_pcvar_num(pcvars[account2]) ) return FMRES_IGNORED;
       
        for ( new id = 1; id < 33; id++ )
        {
                if ( !is_user_alive(id) || is_user_bot(id) || lock_cmd[id] ) continue;
               
                save_data(id);
                                               
                if (special[id] ) {
                        clockstore[id]--
                        if ( clockstore[id] == 0 )
                        {
                                clockstore[id] = get_pcvar_num(pcvars[repitions]);
                                add_interest(id);
                        }
                }
        }
        set_pev(ent, pev_nextthink, get_gametime() + 60.0);
       
        return FMRES_HANDLED;       
}

add_interest(id)
{
        new Float:temp = float( bankstorage[id] );
        if ( temp <= 0.0 || temp >
100000.0 ) return;
        temp *= get_pcvar_float(pcvars[interest]);
        new temp2 = floatround(temp);
        if ( temp2 < 0 || temp2 > get_pcvar_num(pcvars[charge]) )
                return;
       
        localchange(id, temp2);
               
        zp_colored_print(id, "^x04[%s]^x03 interest applied new balance is %d", plugin, bankstorage[id]);
}

advertisement()
{
        if ( !get_pcvar_num(pcvars[enable]) ) return;
       
        zp_colored_print(0, "^x04[%s]^x03 Enabled. Transaction fee's of %d apply", plugin, get_pcvar_num(pcvars[charge3]) );
        zp_colored_print(0, "^x04[%s]^x03 Currently Ammo packs are %s", plugin,
                get_pcvar_num(pcvars[auto]) >= 1 ? "Saved automaticly during map change" : "Savable by typing ^"deposit <amount>^"." );
        zp_colored_print(0, "^x04[%s]^x03 %s", plugin,
                get_pcvar_num(pcvars[auto]) >= 2 ? "Ammo packs are withdrawn when connecting" : "To retrieve your ammo packs type ^"withdraw <amount>^"" );
        if ( get_pcvar_num(pcvars[account2]) )
        {
                new irepition = get_pcvar_num(pcvars[repitions]);
                new timetype[8];
                formatex(timetype, charsmax(timetype), "%s", irepition >= 60 ? "hours" : "minutes");
                if ( irepition >= 60 )
                        irepition /= 60;
                       
                zp_colored_print(0, "^x04[%s]^x03 Advance account's available, say ^"upgrade account^" for more details", plugin);
                zp_colored_print(0, "^x04[%s]^x03 An upgraded account will earn you %2.2f interest every %i %s", plugin, get_pcvar_float(pcvars[interest]), irepition, timetype);
        }
}
public plugin_end() {
        //one final save on all users before changing maps
        for ( new id = 1; id < 33; id++ )
                if ( is_user_connected(id) ) save_data(id);
               
#if SAVE_TYPE == SAVE_NVAULT
        nvault_close(gVault);
#else
        SQL_FreeHandle(g_SqlX);
#endif
}
       
public handle_say(id)
{
        if ( !get_pcvar_num(pcvars[enable]) || lock_cmd[id] ) return PLUGIN_CONTINUE;
       
        static text[70], arg1[32], arg2[32], arg3[6];
        read_args(text, sizeof(text)-1);
        remove_quotes(text);
        arg1[0] = '^0';
        arg2[0] = '^0';
        arg3[0] = '^0';
        parse(text, arg1, sizeof(arg1)-1, arg2, sizeof(arg2)-1, arg3, sizeof(arg3)-1);

        if (arg3[0] == 0)
        {
                //strip forward slash if present
                if ( equali(arg1, "/", 1) ) format(arg1, 31, arg1[1]);
               
                if ( equali(arg1, "deposit", 7) || equali(arg1, "send", 4) || equali(arg1, "store", 5) )
                {                               
                        if ( isdigit(arg2[0]) || (arg2[0] == '-' && isdigit(arg2[1])) )
                        {
                                new value = str_to_num(arg2);
                                store_cash(id, value);
                                return PLUGIN_HANDLED;
                        }
                        else if ( equali(arg2, "all") )
                        {
                                store_cash(id, -1);
                                return PLUGIN_HANDLED;
                        }                               
                        else if ( arg2[0] == 0 )
                                zp_colored_print(id, "^x04[%s]^x03 to deposit ammo packs in bank say deposit <amount to deposit>", plugin);
                       
                        return PLUGIN_CONTINUE;
                }
                else if ( equali(arg1, "withdraw", 8) || equali(arg1, "take", 4) || equali(arg1, "retrieve", 8) )
                {                               
                        if ( isdigit(arg2[0]) || (arg2[0] == '-' && isdigit(arg2[1])) )
                        {
                                new value = str_to_num(arg2);
                                take_cash(id, value);
                                return PLUGIN_HANDLED;
                        }
                        else if ( equali(arg2, "all") )
                        {
                                take_cash(id, -1);
                                return PLUGIN_HANDLED;
                        }
                        else if ( arg2[0] == 0 )
                                zp_colored_print(id, "^x04[%s]^x03 to withdraw ammo packs from bank say withdraw <amount to withdraw>", plugin);
                       
                        return PLUGIN_CONTINUE;
                }
                else if ( equali(arg1, "mybank", 6) || equali(arg1, "account", 7) || equali(arg1, "bank", 4) )
                {
                        if ( arg2[0] == 0 ) {
                                zp_colored_print(id, "^x04[%s]^x03 Currently your [%s]account has %d ammo packs in it",plugin,special[id] ? "advanced" : "regular", bankstorage[id]);
                                return PLUGIN_HANDLED;
                        }
                        else {
                                new player = cmd_target(id,arg2,2);
                                if ( !player ) return PLUGIN_CONTINUE;
                                zp_colored_print(id, "^x04[%s]^x03 %s has %d ammo packs", plugin, arg2, bankstorage[player]);
                                return PLUGIN_HANDLED;
                        }
                }
                else if ( equali(arg1, "upgrade", 7) && equali(arg2, "account", 7) )
                {
                        if ( !warning[id] )
                                upgrade_account(id);
                               
                        else
                                do_upgrade(id);
                }
        }
        return PLUGIN_CONTINUE;
}

public serverbank(id,level,cid)
{
        if (!cmd_access(id,level,cid,1)) {
                console_print(id,"You have no access to that command");
                return;
        }
       
        new arg[35], player, playername[35], AuthID[35];
        read_argv(1, arg, sizeof(arg) - 1);
       
        if ( equali(arg, "all") )
        {
                for ( new i = 1; i < 33; i++ )
                {
                        if ( !is_user_connected(i) ) continue;
                       
                        get_user_name( i, playername, sizeof(playername) - 1 );
                        server_print("[%s] %s has %d ammo packs", plugin, playername, bankstorage[i]);
                }
                return;
        }
                       
        player = 0
        for( new i = 1; i <= 32; i++ )
        {
                if ( !is_user_connected(i) || is_user_bot(i) ) continue;
               
                get_user_name( i, playername, charsmax(playername) );
                get_user_authid( i, AuthID, charsmax(AuthID) );
                if ( equal(AuthID, arg) || containi(playername, arg) )
                {
                        player = i;
                        break;
                }
        }

        if ( !player )
        {
                server_print("Error locating player");
                return;
        }
        server_print("[%s] %s has %d ammo packs", plugin, arg, bankstorage[player]);
}
 
upgrade_account(id)
{
        if ( !get_pcvar_num(pcvars[account2]) ) return;
       
        if ( special[id] )       
        {
                zp_colored_print(id, "^x04[%s]^x03 You already have an advanced account", plugin);
                return;
        }
        else
        {
                zp_colored_print(id, "^x04[%s]^x03 You have opted to upgrade your bank account type", plugin);
                zp_colored_print(id, "^x04[%s]^x03 An upgraded account will earn you %2.2f interest an hour", plugin, get_pcvar_float(pcvars[interest]));
                new temp = bankstorage[id] + zp_get_user_ammo_packs(id);
                if ( temp >
get_pcvar_num(pcvars[charge]) )
                {
                        zp_colored_print(id, "^x04[%s]^x03 There is a %d starting fee", plugin,        get_pcvar_num(pcvars[charge]) );       
                        zp_colored_print(id, "^x04[%s]^x03 If you accept these conditions simply retype ^"upgrade account^", and your account will be upgraded", plugin);
                        warning[id] = true;
                }
                else
                        zp_colored_print(id, "^x04[%s]^x03 You do not have the required %d ammo packs to upgrade account yet", plugin, get_pcvar_num(pcvars[charge]) );
        }
}

do_upgrade(id)
{
        if ( !get_pcvar_num(pcvars[account2]) ) return;
       
        new temp2 = bankstorage[id] + zp_get_user_ammo_packs(id);
        new temp = get_pcvar_num(pcvars[charge]);
        if ( temp2 > temp )
        {
                if ( bankstorage[id] - 1 > temp )
                        localchange(id, -temp);
                else
                {
                        temp -= bankstorage[id] - 1
                        bankstorage[id] = 1;
                        zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) - temp);
                }
                special[id] = 1;
                clockstore[id] = 1;        //time to start the clock
                zp_colored_print(id, "^x04[%s]^x03 You account has been upgraded", plugin);
        }
        else {
                zp_colored_print(id, "^x04[%s]^x03 You don't have the necessary amount of ammo packs to upgrade your account", plugin);
                warning[id] = false;
        }               
}

public client_disconnect(id)
{
        if ( get_pcvar_num(pcvars[auto]) )
                store_cash(id, -1);
       
        if ( bankstorage[id] > 0 ) save_data(id);
        lock_cmd[id] = true;        //basically this prevents players attempting to dupe their ap by reconnecting
}

public client_putinserver(id)
        set_task(1.0, "delayed_connect", id);        //a small delay allows zp to load all its data before we mess with it
       
public delayed_connect(id)
{       
        warning[id] = false;
        special[id] = 0;
        xploaded[id] = false;
        bankstorage[id] = 0;
        sessionstore[id] = 0;
        clockstore[id] = -1;
        lock_cmd[id] = false;        //now they have officially connected and we allow bank commands again
       
        //attempt to retrive the data right away
        retrieve_data(id);
}

store_cash(id, amnt)
{
        if ( !get_pcvar_num(pcvars[enable]) ) return;
       
        new userpacks = zp_get_user_ammo_packs(id);
        if ( amnt == -1 )
        {
                localchange(id, userpacks);
                zp_set_user_ammo_packs(id, 0);
        }
        else if ( amnt > 0 )
        {
                if ( amnt > get_pcvar_num(pcvars[charge3]) )
                {
                        deduction(id);
                        amnt -= get_pcvar_num(pcvars[charge3]);
                }
               
                if ( userpacks >= amnt )
                {                       
                        localchange(id, amnt);
                        zp_set_user_ammo_packs(id, userpacks - amnt);
                }
                else
                        zp_colored_print(id, "^x04[%s]^x03 Amount specified(%d) is greater than current ammo pack count(%d)", plugin,
                        amnt, userpacks);                       
        }
        else
                take_cash(id, -amnt);
}

take_cash(id, amnt)
{
        if ( !get_pcvar_num(pcvars[enable]) ) return;
       
        if ( amnt == 0 ) return;        //otherwise a non terminal loop is possible
       
        if ( amnt == -1 )
        {
                if ( special[id] )
                {
                        zp_set_user_ammo_packs(id, bankstorage[id] - 1)
                        bankstorage[id] = 1;
                }
                else
                {
                        zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + bankstorage[id])
                        bankstorage[id] = 0;
                }
        }
        else if ( amnt > 0 )
        {
                if ( bankstorage[id] >= amnt )
                {
                        deduction(id);
                                                                                       
                        zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + amnt);
                        localchange(id, -amnt);
                } else {
                        zp_colored_print(id, "^x04[%s]^x03 Amount specified(%d) is greater than whats in bank(%d)", plugin, amnt, bankstorage[id]);               
                }       
        }
        else store_cash(id, -amnt);
}

localchange(id, amount, mainload = 0)
{
        new playerAP = bankstorage[id]
        new newTotal = playerAP + amount

        if ( amount > 0 && newTotal < playerAP ) {
                // Max possible signed 32bit int
                bankstorage[id] = 2147483647
        }
        else if ( amount < 0 && (newTotal < -1000000 || newTotal >
playerAP) ) {
                bankstorage[id] = -1000000
        }
        else {
                bankstorage[id] = newTotal
        }
        if ( mainload )
                sessionstore[id] += amount;
}
       
deduction(id)
{
        new temp = bankstorage[id] + zp_get_user_ammo_packs(id) - 1;
        new temp2 = get_pcvar_num(pcvars[charge3]);
        if ( temp >= temp2 )
        {
                if ( bankstorage[id] - 1 > temp2 )
                        localchange(id, -temp2);
                       
                else
                {
                        temp2 -= ( bankstorage[id] - 1 );
                        zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) - temp2);
                        bankstorage[id] = 1;
                }
        }
}

#if SAVE_TYPE == SAVE_NVAULT

save_data(id)
{
        if ( !xploaded[id] ) {
                retrieve_data(id);
                return;
        }
       
        new AuthID[35];
        get_user_authid(id, AuthID, charsmax(AuthID));
        if ( !strlen(AuthID) ) return;
       
        new vaultdata[64], temp;

        temp = special[id] ? 1 : 0;
       
        formatex( vaultdata, 511, "%i %i %i", bankstorage[id], temp, clockstore[id] );

        nvault_set(gVault, AuthID, vaultdata);
}

retrieve_data(id)
{
        if ( xploaded[id] || !is_user_connected(id) ) return;
       
        new AuthID[35];
        get_user_authid(id, AuthID, charsmax(AuthID));
        if ( !strlen(AuthID) ) return;

        new vaultdata[64];
       
        nvault_get(gVault, AuthID, vaultdata, 63);
       
        new cashamnt[51], has2[4], clockamnt[10];
        parse(vaultdata, cashamnt, charsmax(cashamnt), has2, charsmax(has2), clockamnt, charsmax(clockamnt));       
       
        localchange(id, str_to_num(cashamnt), 1);
        special[id] = ( str_to_num(has2) == 1 );
        clockstore[id] = str_to_num(clockamnt);
        xploaded[id] = true;
       
        // 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(id, 0);
               
        if ( get_pcvar_num(pcvars[auto]) == 2 )       
                take_cash(id, -1);
}

#else

save_data(id)
{       
        if ( !xploaded[id] ) {
                retrieve_data(id);
                return;
        }
        new AuthID[35];
        get_user_authid(id, AuthID, charsmax(AuthID));
        if ( !strlen(AuthID) || bankstorage[id] <= 0 ) return;
               
        formatex(query_buff, charsmax(query_buff), "INSERT INTO `%s` SET USER_KEY='%s', AMMOPACK=%d, ADVANCED=%d, TIMECLOCK=%d, LAST_PLAY_DATE=SYSDATE() ON DUPLICATE KEY UPDATE AMMOPACK=AMMOPACK+(%d), ADVANCED=%d, TIMECLOCK=%d, LAST_PLAY_DATE=SYSDATE()",
                sql_table, AuthID, bankstorage[id], special[id] ? 1 : 0, clockstore[id], sessionstore[id], special[id] ? 1 : 0, clockstore[id]);
       
        SQL_ThreadQuery(g_SqlX, "handle_error", query_buff);
}
public handle_error(failstate, Handle:query, error[], errnum, data[], size)
{
        if (failstate)
        {
                server_print("[%s] SQL error: '%s'", plugin, error);
                log_to_file("zp_error.log", "[%s] SQL error: '%s'", plugin, error);
                return;
        }
        if ( size >
36 ) {
                new authid[35], amount;
                amount = data[0];
                copy(authid, charsmax(authid), data[1]);
                server_print( "[%s] Succesfuly %s %d ammo packs %s %s.", plugin, amount > 0 ? "gave" : "took", amount, amount > 0 ? "to" : "from", authid);
                log_to_file( "zp_banking.log", "[%s] Succesfuly %s %d ammo packs %s %s.", plugin, amount > 0 ? "gave" : "took", amount, amount > 0 ? "to" : "from", authid);
        }       
}

retrieve_data(id)
{
        new buffer[38], AuthID[35];
        get_user_authid(id, AuthID, charsmax(AuthID));
        if ( !strlen(AuthID) ) return;

        formatex(query_buff, charsmax(query_buff), "SELECT AMMOPACK,ADVANCED,TIMECLOCK FROM `%s` WHERE USER_KEY='%s'", sql_table, AuthID);
       
        buffer[0] = id;
        copy(buffer[1], charsmax(buffer)-1, AuthID);
       
        SQL_ThreadQuery(g_SqlX, "handle_retrieve", query_buff, buffer, charsmax(buffer));
}
public handle_retrieve(failstate, Handle:hrquery, error[], errnum, data[], size)
{
        new id = data[0];
        if ( xploaded[id] || !is_user_connected(id) ) return;
       
        new AuthExpected[35], AuthCalled[35];
        get_user_authid(id, AuthExpected, 34);
        copy(AuthCalled, 34, data[1]);
        if ( !equali(AuthExpected, AuthCalled) )
        {
                log_to_file("zp_error.log", "[%s] Load Glitch, expected = %s, passed = %s", plugin, AuthExpected, AuthCalled);
                return;
        }                       
        if (failstate)
        {
                log_to_file("zp_error.log", "[%s] SQL error: '%s'", plugin, error);
                return;
        }
        else
        {               
                if ( !SQL_NumResults(hrquery) )
                        console_print(id, "[%s] No save data located", plugin);                               

                else
                {
                        new ipacks = 0;
                        ipacks = SQL_ReadResult(hrquery, 0);
                               
                        special[id] = SQL_ReadResult(hrquery, 1) >= 1 ? 1 : 0;
                        clockstore[id] = SQL_ReadResult(hrquery, 2);
                       
                        if( special[id] && !clockstore[id] )
                                clockstore[id] = get_pcvar_num(pcvars[repitions]);        //in case an error occured durig saving process before
       
                        localchange(id, ipacks, 1);
                        console_print(id, "[%s] account has been loaded from save table", plugin);
                       
                        // 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(id, 0);
                }
                xploaded[id] = true;
        }
               
        if ( get_pcvar_num(pcvars[auto]) == 2 )       
                take_cash(id, -1);
}

#endif
       
// Prints a colored message to target (use 0 for everyone), supports ML formatting.
zp_colored_print(target, const message[], any:...)
{
        new buffer[512], i, argscount
        argscount = numargs()
       
        // Send to everyone
        if (!target)
        {
                new player
                for (player = 1; player <= 33; player++)
                {
                        // Not connected
                        if ( !is_user_connected(player) || is_user_bot(player) )
                                continue;
                       
                        // Remember changed arguments
                        new changed[5], changedcount // [5] = max LANG_PLAYER occurencies
                        changedcount = 0
                       
                        // Replace LANG_PLAYER with player id
                        for (i = 2; i < argscount; i++)
                        {
                                if (getarg(i) == LANG_PLAYER)
                                {
                                        setarg(i, 0, player)
                                        changed[changedcount] = i
                                        changedcount++
                                }
                        }
                       
                        // Format message for player
                        vformat(buffer, sizeof buffer - 1, message, 3)
                       
                        // Send it
                        message_begin(MSG_ONE_UNRELIABLE, g_msgSayText, _, player)
                        write_byte(player)
                        write_string(buffer)
                        message_end()
                       
                        // Replace back player id's with LANG_PLAYER
                        for (i = 0; i < changedcount; i++)
                                setarg(changed[i], 0, LANG_PLAYER)
                }
        }
       
        // Send to specific target
        else
        {               
                // Format message for player
                vformat(buffer, sizeof buffer - 1, message, 3)
               
                // Send it
                message_begin(MSG_ONE, g_msgSayText, _, target)
                write_byte(target)
                write_string(buffer)
                message_end()
        }
}

public native_retrieve_all_ap(id)
        return zp_get_user_ammo_packs(id) + bankstorage[id];

public native_retrieve_ap(id)
        return bankstorage[id];
       
public native_set_ap(id, amount, bool:addto)
{
        if ( !is_user_connected(id) ) return;
       
        bankstorage[id] = addto ? bankstorage[id] + amount : amount;
}


Shadows Adi 01-09-2020 08:38

Re: plugin modification zp bank.
 
Restriction for what? Do You mean only admins can withdraw ?
And cvar...? Be more expilicit.

Shadows Adi 01-09-2020 09:17

Re: plugin modification zp bank.
 
Hope this will help you. I made it to be used in 3rd round.
PHP Code:

#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <zombieplague>

enum {
    
SAVE_NVAULT 1,
    
SAVE_SQL
}

#define SAVE_TYPE SAVE_NVAULT

#if SAVE_TYPE == SAVE_SQL
    #include <sqlx>
    
    
new Handle:g_SqlX;
    new const 
sql_table[] = "zp_bank"
    
new query_buff[1028];
#else
    #include <nvault>
    
    
new gVault;
#endif
new round[33] = 0;
new const 
version[] = "4.4";
new const 
plugin[] = "ZP Bank";

enum pcvar
enable 0autostartaccount2chargeinterestcharge3repitions }

new 
pcvars[pcvar];
new 
bankstorage[33], sessionstore[33];
new 
special[33], bool:warning[33], bool:xploaded[33], bool:lock_cmd[33];
new 
clockstore[33];

new 
thinkobjg_msgSayTextloop_count;

public 
plugin_init()
{
    
register_plugin(pluginversion"Random1");
    
    
pcvars[enable] =            register_cvar("zp_bank""1");
    
pcvars[auto] =                register_cvar("zp_bank_auto""0");
    
pcvars[start] =                register_cvar("zp_bank_blockstart""0");
    
pcvars[account2] =            register_cvar("zp_bank_upgradable""1");
    
pcvars[charge] =            register_cvar("zp_bank_cost""1000");
    
pcvars[interest] =            register_cvar("zp_bank_interest""0.03");
    
pcvars[repitions] =            register_cvar("zp_bank_clock""60");
    
pcvars[charge3] =            register_cvar("zp_bank_transfee""3");
        
    
register_clcmd("say""check3");
    
register_clcmd("say_team""check3");
    
register_concmd("zp_bank_amount""serverbank"ADMIN_RCON"<name/steamid>");
    
register_concmd("zp_reset_bank""prune_task"ADMIN_RCON"<time> in days. time 0 = clean all");
    
register_concmd("zp_give_packs""givex_cmd"ADMIN_RCON"<steamid not name> <amount>, gives ammo packs even if person not in game");
    
    
#if SAVE_TYPE == SAVE_SQL
    
set_task(0.5"sql_init");
    
register_logevent("logevent_round_end"2"1=Round_End");    
    
#else
    
gVault nvault_open("zp_bank_data");
    
#endif
    
    
    
g_msgSayText get_user_msgid("SayText");
    
    
thinkobj engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"info_target"));
    if ( 
pev_valid(thinkobj) )
    {
        
set_pev(thinkobjpev_classname"advertisement_loop");
        
set_pev(thinkobjpev_nextthinkget_gametime() + 60.0);
        
register_forward(FM_Think"onemin_think");
    }
}

public 
plugin_natives()
{
    
register_native("zp_get_all_ammopacks""native_retrieve_all_ap"1);
    
register_native("zp_get_bank_ammopacks""native_retrieve_ap"1);
    
register_native("zp_set_bank_ammopacks""native_set_ap"1);
}

#if SAVE_TYPE == SAVE_SQL
public sql_init()
{
    
g_SqlX SQL_MakeStdTuple();
    
    
formatex(query_buffcharsmax(query_buff), "CREATE TABLE IF NOT EXISTS `%s` (\
                USER_KEY VARCHAR(36) NOT NULL PRIMARY KEY, \
                AMMOPACK DECIMAL( 10 ) UNSIGNED NOT NULL DEFAULT '0', \
                ADVANCED TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, \
                TIMECLOCK INT(10) NOT NULL DEFAULT 0, \
                LAST_PLAY_DATE TIMESTAMP(10) NOT NULL \
            ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"
sql_table)
    
    
SQL_ThreadQuery(g_SqlX"handle_error"query_buff);
}
    
public 
logevent_round_end()
{
    for( new 
id 1id <= 32id++ )
        if ( 
is_user_connected(id) && !xploaded[id] )
            
retrieve_data(id);
}
#endif
    
public prune_task(id,level,cid)
{
    if (!
cmd_access(id,level,cid,1)) {
        
console_print(id,"You have no access to that command");
        return;
    }
    new 
connum read_argc()
    if (
connum 2) {
        
console_print(id,"Too many arguments supplied.");
        return;
    }
    if ( 
connum == ) return;    //person just typed command to see the description
    //we check this because str_to_num will return 0 on an empty string thus doing the same thing as "zp_reset_bank 0" which does a full reset
    
    
new adminname[32];
    
get_user_name(idadminname31);
    new 
arg[10];
    
read_argv(1,arg,9);
    new 
timeamnt str_to_num(arg);
    if ( 
timeamnt == ) {
#if SAVE_TYPE == SAVE_NVAULT
        
nvault_prune(gVault00);
#else
        
formatex(query_buffcharsmax(query_buff), "TRUNCATE TABLE `%s`"sql_table);
        
        
SQL_ThreadQuery(g_SqlX"handle_error"query_buff)
#endif
        
zp_colored_print(0"^x04[%s]^x03 The Bank's Been Robbed!, those dirty crooks stole all your money!"plugin);
        
log_to_file("zp_error.log""[%s] bank has been reset(completly) by admin %s"pluginadminname);
        
//for those who are in the server at the time of prune need to whipe out there stuff as well
        
for( new 133o++)
        {
            if ( !
is_user_connected(o) || is_user_bot(o) ) continue;
            
            
special[o] = 0;
            
warning[o] = false;
            
bankstorage[o] = 0;
            
clockstore[o] = -1;
        }
    }
    else {
#if SAVE_TYPE == SAVE_NVAULT
        
nvault_prune(gVault0get_systime() - (timeamnt 86400));
#else
        
formatex(query_buffcharsmax(query_buff), "DELETE FROM `%s` WHERE LAST_PLAY_DATE<(SYSDATE() - INTERVAL '%d' DAY)"sql_tabletimeamnt);
        
        
SQL_ThreadQuery(g_SqlX"handle_error"query_buff)        
#endif
        
log_to_file("zp_error.log""[%s] bank has been pruned %d day%s by admin %s"plugintimeamnttimeamnt == "" "'s"adminname);        
    }
}

public 
givex_cmd(id,level,cid)
{
    if (!
cmd_access(id,level,cid,1)) {
        
console_print(id,"You have no access to that command");
        return;
    }
    
    if ( 
read_argc() > ) return;
        
    new 
arg1[32], arg2[10], amount;
    
read_argv(1arg1sizeof(arg1) - 1);
    
read_argv(2arg2sizeof(arg2) - 1);
    if ( 
arg1[0] != 'S' && !isdigit(arg1[6]) )
    {
        
server_print("[%s] please only use steamid and be sure to append the STEAM_0:"plugin);
        return;
    }
    if ( !
isdigit(arg2[0]) && !isdigit(arg2[1]) ) {
        
server_print("[%s] error argument2 = %s, should be a number"pluginarg2);
        return;
    }
    
    
amount str_to_num(arg2);
    
//first see if our player is not currently in server
    
new iAuthID[32];
    for( 
1<= 32i++ )
    {
        
get_user_authid(i,AuthID,31);
        if ( 
equal(AuthIDarg1) )
        {
            
bankstorage[i] += amount;
            
server_print"[%s] Succesfuly %s %d ammo packs %s %s. Account now has %d"pluginamount "gave" "took"amountamount "to" "from"arg1bankstorage[i]);
            
log_to_file"zp_banking.log""[%s] Succesfuly %s %d ammo packs %s %s. Account now has %d"pluginamount "gave" "took"amountamount "to" "from"arg1bankstorage[i]); 
            return;
        }
    }
    
//not in the server so have to check our nvault file now
#if SAVE_TYPE == SAVE_NVAULT
    
new vaultkey[38], vaultdata[64]; 
    
    
formatex(vaultkey37"__%s__"arg1);

    
nvault_get(gVaultvaultkeyvaultdata63); 
    if ( 
strlen(vaultdata) == )
    {
        
server_print"[%s] player does not exsist within database, make sure your passing right steamid"plugin);
        return;
    }
    new 
cashamnt[51], has2[4], clockamnt[10], buffer[3];
    
parse(vaultdatacashamnt50has23clockamnt9);    
    
    
buffer[0] = str_to_num(cashamnt);
    
buffer[1] = str_to_num(has2);
    
buffer[2] = str_to_num(clockamnt);
    
server_print"[%s] %s has %d ammo packs before applying %d from zp_give_packs command"pluginarg1buffer[0], amount);
    
//now apply the command
    
buffer[0] += amount;
    if ( 
buffer[0] < buffer[0] = 0;
    
formatex(vaultdata63"%i %i %i"buffer[0], buffer[1], buffer[2]);
    
    
nvault_set(gVaultvaultkeyvaultdata);
    
server_print"[%s] Succesfuly %s %d ammo packs %s %s. Account now has %d"pluginamount "gave" "took"amountamount "to" "from"arg1buffer[0]);
#else
    
new data[38]
    
data[0] = amount
    formatex
(data[1], charsmax(data)-1arg1);

    
formatex(query_buffcharsmax(query_buff), "INSERT INTO `%s` SET USER_KEY='%s', AMMOPACK=%d ON DUPLICATE KEY UPDATE AMMOPACK=AMMOPACK+(%d)",
        
sql_tablearg1amountamount);
        
    
SQL_ThreadQuery(g_SqlX"handle_error"query_buffdatacharsmax(data));
#endif
}

public 
onemin_think(ent)
{
    if ( 
ent != thinkobj ) return FMRES_IGNORED;
    if ( --
loop_count <= )
    {
        
advertisement();
        
loop_count 4;
    }
    
    if ( !
get_pcvar_num(pcvars[account2]) ) return FMRES_IGNORED;
    
    for ( new 
id 1id 33id++ )
    {
        if ( !
is_user_alive(id) || is_user_bot(id) || lock_cmd[id] ) continue;
        
        
save_data(id);
                        
        if (
special[id] ) {
            
clockstore[id]--
            if ( 
clockstore[id] == )
            {
                
clockstore[id] = get_pcvar_num(pcvars[repitions]);
                
add_interest(id);
            }
        }
    }
    
set_pev(entpev_nextthinkget_gametime() + 60.0);
    
    return 
FMRES_HANDLED;    
}

add_interest(id)
{
    new 
Float:temp floatbankstorage[id] );
    if ( 
temp <= 0.0 || temp 100000.0 ) return;
    
temp *= get_pcvar_float(pcvars[interest]);
    new 
temp2 floatround(temp);
    if ( 
temp2 || temp2 get_pcvar_num(pcvars[charge]) )
        return;
    
    
localchange(idtemp2);
        
    
zp_colored_print(id"^x04[%s]^x03 interest applied new balance is %d"pluginbankstorage[id]);
}

advertisement()
{
    if ( !
get_pcvar_num(pcvars[enable]) ) return;
    
    
zp_colored_print(0"^x04[%s]^x03 Enabled. Transaction fee's of %d apply"pluginget_pcvar_num(pcvars[charge3]) );
    
zp_colored_print(0"^x04[%s]^x03 Currently Ammo packs are %s"plugin,
        
get_pcvar_num(pcvars[auto]) >= "Saved automaticly during map change" "Savable by typing ^"deposit <amount>^"." );
    
zp_colored_print(0"^x04[%s]^x03 %s"plugin,
        
get_pcvar_num(pcvars[auto]) >= "Ammo packs are withdrawn when connecting" "To retrieve your ammo packs type ^"withdraw <amount>^"" );
    if ( 
get_pcvar_num(pcvars[account2]) )
    {
        new 
irepition get_pcvar_num(pcvars[repitions]);
        new 
timetype[8];
        
formatex(timetypecharsmax(timetype), "%s"irepition >= 60 "hours" "minutes");
        if ( 
irepition >= 60 )
            
irepition /= 60;
            
        
zp_colored_print(0"^x04[%s]^x03 Advance account's available, say ^"upgrade account^" for more details"plugin);
        
zp_colored_print(0"^x04[%s]^x03 An upgraded account will earn you %2.2f interest every %i %s"pluginget_pcvar_float(pcvars[interest]), irepitiontimetype);
    }
}
public 
plugin_end() {
    
//one final save on all users before changing maps
    
for ( new id 1id 33id++ )
        if ( 
is_user_connected(id) ) save_data(id);
        
#if SAVE_TYPE == SAVE_NVAULT
    
nvault_close(gVault);
#else
    
SQL_FreeHandle(g_SqlX);
#endif
}

public 
check3(id)
{
    if(
round[id] >=3) {
        
handle_say(id)
    }
    else {
        
zp_colored_print(0"^x04[ZP]^x03 You can acces this only in 3rd round.");
    }
    
round[id]++;
}
    
public 
handle_say(id)
{
    if ( !
get_pcvar_num(pcvars[enable]) || lock_cmd[id] ) return PLUGIN_CONTINUE;
    
    static 
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);

    if (
arg3[0] == 0)
    {
        
//strip forward slash if present
        
if ( equali(arg1"/"1) ) format(arg131arg1[1]);
        
        if ( 
equali(arg1"deposit"7) || equali(arg1"send"4) || equali(arg1"store"5) )
        {                
            if ( 
isdigit(arg2[0]) || (arg2[0] == '-' && isdigit(arg2[1])) ) 
            {
                new 
value str_to_num(arg2);
                
store_cash(idvalue);
                return 
PLUGIN_HANDLED;
            }
            else if ( 
equali(arg2"all") )
            {
                
store_cash(id, -1);
                return 
PLUGIN_HANDLED;
            }                
            else if ( 
arg2[0] == )
                
zp_colored_print(id"^x04[%s]^x03 to deposit ammo packs in bank say deposit <amount to deposit>"plugin);
            
            return 
PLUGIN_CONTINUE;
        }
        else if ( 
equali(arg1"withdraw"8) || equali(arg1"take"4) || equali(arg1"retrieve"8) )
        {                
            if ( 
isdigit(arg2[0]) || (arg2[0] == '-' && isdigit(arg2[1])) ) 
            {
                new 
value str_to_num(arg2);
                
take_cash(idvalue);
                return 
PLUGIN_HANDLED;
            }
            else if ( 
equali(arg2"all") )
            {
                
take_cash(id, -1);
                return 
PLUGIN_HANDLED;
            }
            else if ( 
arg2[0] == )
                
zp_colored_print(id"^x04[%s]^x03 to withdraw ammo packs from bank say withdraw <amount to withdraw>"plugin);
            
            return 
PLUGIN_CONTINUE;
        }
        else if ( 
equali(arg1"mybank"6) || equali(arg1"account"7) || equali(arg1"bank"4) )
        {
            if ( 
arg2[0] == ) {
                
zp_colored_print(id"^x04[%s]^x03 Currently your [%s]account has %d ammo packs in it",plugin,special[id] ? "advanced" "regular"bankstorage[id]);
                return 
PLUGIN_HANDLED;
            }
            else {
                new 
player cmd_target(id,arg2,2);
                if ( !
player ) return PLUGIN_CONTINUE;
                
zp_colored_print(id"^x04[%s]^x03 %s has %d ammo packs"pluginarg2bankstorage[player]);
                return 
PLUGIN_HANDLED;
            }
        }
        else if ( 
equali(arg1"upgrade"7) && equali(arg2"account"7) )
        {
            if ( !
warning[id] )
                
upgrade_account(id);
                
            else 
                
do_upgrade(id);
        }
    }
    return 
PLUGIN_CONTINUE;
}

public 
serverbank(id,level,cid)
{
    if (!
cmd_access(id,level,cid,1)) {
        
console_print(id,"You have no access to that command");
        return;
    }
    
    new 
arg[35], playerplayername[35], AuthID[35];
    
read_argv(1argsizeof(arg) - 1);
    
    if ( 
equali(arg"all") )
    {
        for ( new 
133i++ )
        {
            if ( !
is_user_connected(i) ) continue;
            
            
get_user_nameiplayernamesizeof(playername) - );
            
server_print("[%s] %s has %d ammo packs"pluginplayernamebankstorage[i]);
        }
        return;
    }
            
    
player 0
    
for( new 1<= 32i++ )
    {
        if ( !
is_user_connected(i) || is_user_bot(i) ) continue;
        
        
get_user_nameiplayernamecharsmax(playername) );
        
get_user_authidiAuthIDcharsmax(AuthID) );
        if ( 
equal(AuthIDarg) || containi(playernamearg) )
        {
            
player i;
            break;
        }
    }

    if ( !
player )
    {
        
server_print("Error locating player");
        return;
    }
    
server_print("[%s] %s has %d ammo packs"pluginargbankstorage[player]);
}
 
upgrade_account(id)
{
    if ( !
get_pcvar_num(pcvars[account2]) ) return;
    
    if ( 
special[id] )    
    {
        
zp_colored_print(id"^x04[%s]^x03 You already have an advanced account"plugin);
        return;
    }
    else
    {
        
zp_colored_print(id"^x04[%s]^x03 You have opted to upgrade your bank account type"plugin);
        
zp_colored_print(id"^x04[%s]^x03 An upgraded account will earn you %2.2f interest an hour"pluginget_pcvar_float(pcvars[interest]));
        new 
temp bankstorage[id] + zp_get_user_ammo_packs(id);
        if ( 
temp get_pcvar_num(pcvars[charge]) )
        {
            
zp_colored_print(id"^x04[%s]^x03 There is a %d starting fee"plugin,    get_pcvar_num(pcvars[charge]) );    
            
zp_colored_print(id"^x04[%s]^x03 If you accept these conditions simply retype ^"upgrade account^", and your account will be upgraded"plugin);
            
warning[id] = true;
        }
        else
            
zp_colored_print(id"^x04[%s]^x03 You do not have the required %d ammo packs to upgrade account yet"pluginget_pcvar_num(pcvars[charge]) );
    }
}

do_upgrade(id)
{
    if ( !
get_pcvar_num(pcvars[account2]) ) return;
    
    new 
temp2 bankstorage[id] + zp_get_user_ammo_packs(id);
    new 
temp get_pcvar_num(pcvars[charge]);
    if ( 
temp2 temp )
    {
        if ( 
bankstorage[id] - temp )
            
localchange(id, -temp);
        else
        {
            
temp -= bankstorage[id] - 1
            bankstorage
[id] = 1;
            
zp_set_user_ammo_packs(idzp_get_user_ammo_packs(id) - temp);
        }
        
special[id] = 1;
        
clockstore[id] = 1;    //time to start the clock
        
zp_colored_print(id"^x04[%s]^x03 You account has been upgraded"plugin);
    }
    else {
        
zp_colored_print(id"^x04[%s]^x03 You don't have the necessary amount of ammo packs to upgrade your account"plugin);
        
warning[id] = false;
    }        
}

public 
client_disconnect(id)
{
    if ( 
get_pcvar_num(pcvars[auto]) ) 
        
store_cash(id, -1);
    
    if ( 
bankstorage[id] > save_data(id);
    
lock_cmd[id] = true;    //basically this prevents players attempting to dupe their ap by reconnecting
    
round[id] = 0;
}

public 
client_putinserver(id)
{
    
set_task(1.0"delayed_connect"id);    //a small delay allows zp to load all its data before we mess with it
    
round[id] = 0;
}
public 
delayed_connect(id)
{    
    
warning[id] = false;
    
special[id] = 0;
    
xploaded[id] = false;
    
bankstorage[id] = 0;
    
sessionstore[id] = 0;
    
clockstore[id] = -1;
    
lock_cmd[id] = false;    //now they have officially connected and we allow bank commands again
    
    //attempt to retrive the data right away
    
retrieve_data(id);
}

store_cash(idamnt)
{
    if ( !
get_pcvar_num(pcvars[enable]) ) return;
    
    new 
userpacks zp_get_user_ammo_packs(id);
    if ( 
amnt == -)
    {
        
localchange(iduserpacks);
        
zp_set_user_ammo_packs(id0);
    }
    else if ( 
amnt )
    {
        if ( 
amnt get_pcvar_num(pcvars[charge3]) )
        {
            
deduction(id);
            
amnt -= get_pcvar_num(pcvars[charge3]);
        }
        
        if ( 
userpacks >= amnt )
        {            
            
localchange(idamnt);
            
zp_set_user_ammo_packs(iduserpacks amnt);
        }
        else
            
zp_colored_print(id"^x04[%s]^x03 Amount specified(%d) is greater than current ammo pack count(%d)"plugin,
            
amntuserpacks);            
    }
    else
        
take_cash(id, -amnt);
}

take_cash(idamnt)
{
    if ( !
get_pcvar_num(pcvars[enable]) ) return;
    
    if ( 
amnt == ) return;    //otherwise a non terminal loop is possible
    
    
if ( amnt == -)
    {
        if ( 
special[id] ) 
        {
            
zp_set_user_ammo_packs(idbankstorage[id] - 1)
            
bankstorage[id] = 1;
        }
        else
        {
            
zp_set_user_ammo_packs(idzp_get_user_ammo_packs(id) + bankstorage[id])
            
bankstorage[id] = 0;
        }
    }
    else if ( 
amnt )
    {
        if ( 
bankstorage[id] >= amnt )
        {
            
deduction(id);
                                            
            
zp_set_user_ammo_packs(idzp_get_user_ammo_packs(id) + amnt);
            
localchange(id, -amnt);
        } else {
            
zp_colored_print(id"^x04[%s]^x03 Amount specified(%d) is greater than whats in bank(%d)"pluginamntbankstorage[id]);        
        }    
    }
    else 
store_cash(id, -amnt);
}

localchange(idamountmainload 0)
{
    new 
playerAP bankstorage[id]
    new 
newTotal playerAP amount

    
if ( amount && newTotal playerAP ) {
        
// Max possible signed 32bit int
        
bankstorage[id] = 2147483647
    
}
    else if ( 
amount && (newTotal < -1000000 || newTotal playerAP) ) {
        
bankstorage[id] = -1000000
    
}
    else {
        
bankstorage[id] = newTotal
    
}
    if ( 
mainload )
        
sessionstore[id] += amount;
}
    
deduction(id)
{
    new 
temp bankstorage[id] + zp_get_user_ammo_packs(id) - 1;
    new 
temp2 get_pcvar_num(pcvars[charge3]);
    if ( 
temp >= temp2 )
    {
        if ( 
bankstorage[id] - temp2 )
            
localchange(id, -temp2);
            
        else
        {
            
temp2 -= ( bankstorage[id] - );
            
zp_set_user_ammo_packs(idzp_get_user_ammo_packs(id) - temp2);
            
bankstorage[id] = 1;
        }
    }
}

#if SAVE_TYPE == SAVE_NVAULT

save_data(id)
{
    if ( !
xploaded[id] ) {
        
retrieve_data(id);
        return;
    }
    
    new 
AuthID[35];
    
get_user_authid(idAuthIDcharsmax(AuthID));
    if ( !
strlen(AuthID) ) return;
    
    new 
vaultdata[64], temp;

    
temp special[id] ? 0;
    
    
formatexvaultdata511"%i %i %i"bankstorage[id], tempclockstore[id] );

    
nvault_set(gVaultAuthIDvaultdata); 
}

retrieve_data(id)
{
    if ( 
xploaded[id] || !is_user_connected(id) ) return;
    
    new 
AuthID[35];
    
get_user_authid(idAuthIDcharsmax(AuthID));
    if ( !
strlen(AuthID) ) return;

    new 
vaultdata[64]; 
    
    
nvault_get(gVaultAuthIDvaultdata63); 
    
    new 
cashamnt[51], has2[4], clockamnt[10];
    
parse(vaultdatacashamntcharsmax(cashamnt), has2charsmax(has2), clockamntcharsmax(clockamnt));    
    
    
localchange(idstr_to_num(cashamnt), 1);
    
special[id] = ( str_to_num(has2) == );
    
clockstore[id] = str_to_num(clockamnt);
    
xploaded[id] = true;
    
    
// 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] > 
        
zp_set_user_ammo_packs(id0);
        
    if ( 
get_pcvar_num(pcvars[auto]) == )     
        
take_cash(id, -1);
}

#else

save_data(id)
{    
    if ( !
xploaded[id] ) {
        
retrieve_data(id);
        return;
    }
    new 
AuthID[35];
    
get_user_authid(idAuthIDcharsmax(AuthID));
    if ( !
strlen(AuthID) || bankstorage[id] <= ) return;
        
    
formatex(query_buffcharsmax(query_buff), "INSERT INTO `%s` SET USER_KEY='%s', AMMOPACK=%d, ADVANCED=%d, TIMECLOCK=%d, LAST_PLAY_DATE=SYSDATE() ON DUPLICATE KEY UPDATE AMMOPACK=AMMOPACK+(%d), ADVANCED=%d, TIMECLOCK=%d, LAST_PLAY_DATE=SYSDATE()",
        
sql_tableAuthIDbankstorage[id], special[id] ? 0clockstore[id], sessionstore[id], special[id] ? 0clockstore[id]);
    
    
SQL_ThreadQuery(g_SqlX"handle_error"query_buff);
}
public 
handle_error(failstateHandle:queryerror[], errnumdata[], size)
{
    if (
failstate)
    {
        
server_print("[%s] SQL error: '%s'"pluginerror);
        
log_to_file("zp_error.log""[%s] SQL error: '%s'"pluginerror);
        return;
    }
    if ( 
size 36 ) {
        new 
authid[35], amount;
        
amount data[0];
        
copy(authidcharsmax(authid), data[1]);
        
server_print"[%s] Succesfuly %s %d ammo packs %s %s."pluginamount "gave" "took"amountamount "to" "from"authid);
        
log_to_file"zp_banking.log""[%s] Succesfuly %s %d ammo packs %s %s."pluginamount "gave" "took"amountamount "to" "from"authid);
    }    
}

retrieve_data(id)
{
    new 
buffer[38], AuthID[35];
    
get_user_authid(idAuthIDcharsmax(AuthID));
    if ( !
strlen(AuthID) ) return;

    
formatex(query_buffcharsmax(query_buff), "SELECT AMMOPACK,ADVANCED,TIMECLOCK FROM `%s` WHERE USER_KEY='%s'"sql_tableAuthID);
    
    
buffer[0] = id;
    
copy(buffer[1], charsmax(buffer)-1AuthID);
    
    
SQL_ThreadQuery(g_SqlX"handle_retrieve"query_buffbuffercharsmax(buffer));
}
public 
handle_retrieve(failstateHandle:hrqueryerror[], errnumdata[], size)
{
    new 
id data[0];
    if ( 
xploaded[id] || !is_user_connected(id) ) return;
    
    new 
AuthExpected[35], AuthCalled[35];
    
get_user_authid(idAuthExpected34);
    
copy(AuthCalled34data[1]);
    if ( !
equali(AuthExpectedAuthCalled) )
    {
        
log_to_file("zp_error.log""[%s] Load Glitch, expected = %s, passed = %s"pluginAuthExpectedAuthCalled);
        return;
    }            
    if (
failstate)
    {
        
log_to_file("zp_error.log""[%s] SQL error: '%s'"pluginerror);
        return;
    }
    else
    {        
        if ( !
SQL_NumResults(hrquery) )
            
console_print(id"[%s] No save data located"plugin);                

        else
        {
            new 
ipacks 0;
            
ipacks SQL_ReadResult(hrquery0);
                
            
special[id] = SQL_ReadResult(hrquery1) >= 0;
            
clockstore[id] = SQL_ReadResult(hrquery2);
            
            if( 
special[id] && !clockstore[id] )
                
clockstore[id] = get_pcvar_num(pcvars[repitions]);    //in case an error occured durig saving process before
    
            
localchange(idipacks1);
            
console_print(id"[%s] account has been loaded from save table"plugin);
            
            
// 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] > 
                
zp_set_user_ammo_packs(id0);
        }
        
xploaded[id] = true;
    }
        
    if ( 
get_pcvar_num(pcvars[auto]) == )     
        
take_cash(id, -1);
}

#endif
    
// Prints a colored message to target (use 0 for everyone), supports ML formatting.
zp_colored_print(target, const message[], any:...)
{
    new 
buffer[512], iargscount
    argscount 
numargs()
    
    
// Send to everyone
    
if (!target)
    {
        new 
player
        
for (player 1player <= 33player++)
        {
            
// Not connected
            
if ( !is_user_connected(player) || is_user_bot(player) )
                continue;
            
            
// Remember changed arguments
            
new 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(buffersizeof buffer 1message3)
            
            
// 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(buffersizeof buffer 1message3)
        
        
// Send it
        
message_begin(MSG_ONEg_msgSayText_target)
        
write_byte(target)
        
write_string(buffer)
        
message_end()
    }
}

public 
native_retrieve_all_ap(id)
    return 
zp_get_user_ammo_packs(id) + bankstorage[id];

public 
native_retrieve_ap(id)
    return 
bankstorage[id];
    
public 
native_set_ap(idamountbool:addto)
{
    if ( !
is_user_connected(id) ) return;
    
    
bankstorage[id] = addto bankstorage[id] + amount amount;



Myshu 01-09-2020 13:00

Re: plugin modification zp bank.
 
I will test it right now.

Thanks <3

Edit.

After test, plugin works great.

Edit 2.

The only problem is that message.

You can use this only after 3rd round...

Can you remove it? To much spam


All times are GMT -4. The time now is 02:51.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.