Veteran Member
Join Date: Sep 2019
Location: Egypt
|
08-01-2021
, 02:05
Re: save nvault on plugin_end
|
#8
|
Quote:
Originally Posted by Bugsy
I didn't read your code thoroughly, but loading at authorized, saving at disconnect, and closing at plugin_end() is the ideal way for storing data, IMO. It doesn't matter where you place the function in your code.
|
I actually did this but when the server get shut down the data doesn't get saved, I added code for saving the data every 30 second for that reason.
Full code:
Spoiler
PHP Code:
#include <amxmodx> #include <amxmisc> #include <cstrike> #include <nvault> #include <cromchat>
#if !defined client_disconnected #define client_disconnected client_disconnect #endif
#define get_user_cash(%1) cs_get_user_money(%1) #define set_user_cash(%1,%2) cs_set_user_money(%1, %2)
#define MAX_MENU_LENGTH 512 #define MAX_PLAYERS 32
new const PLUGIN_NAME[ ] = "Bank System" new const VERSION[ ] = "1.7" new const AUTHOR[ ] = "Supremache"
const Float:AUTO_SAVE = 30.0
enum eData { Name[ 33 ], AuthID[ 34 ], IP[ 33 ], Cash, Donate }
enum _:TotalCvars { MAX_CASH = 0, MAX_CASH_SAVE, SAVE_DATA, LIMIT }
enum _:TYPE { SAVE = 0, LOAD };
new const iCommands[ ][ ] = { "say /bank", "say_team /bank" }
new g_iCvars[ TotalCvars ], g_iPlayerData[ MAX_PLAYERS + 1 ][ eData ], g_Vault, g_iMaxPlayers; public plugin_init() { register_plugin ( .plugin_name = PLUGIN_NAME, .version = VERSION, .author = AUTHOR ) for( new i ; i < sizeof( iCommands ) ; i++ ) { register_clcmd(iCommands[i], "CustomMenu"); } register_clcmd("EnterAmount", "OnDonate"); register_clcmd("DepositCash", "OnDepositCash"); register_clcmd("TakeCash", "OnTakeCash"); CC_SetPrefix("&x04[Bank System]&x01") /* Save the data using ( SteamID, Name, IP ) * SteamID = 1 - Name = 2 - IP = 3 */ g_iCvars[SAVE_DATA] = register_cvar( "save_type", "1"); g_iCvars[LIMIT] = register_cvar( "limit_cash", "1"); //Change to 0 if u want to be able to withdraw / deposit more than 16k$ g_iCvars[MAX_CASH] = register_cvar( "max_cash", "16000"); // Maximum cash withdraw / deposit from/to the bank g_iCvars[MAX_CASH_SAVE] = register_cvar( "max_cash", "100000000"); // Maximum cash saving in the bank g_iMaxPlayers = get_maxplayers() if ( ( g_Vault = nvault_open( "Bank" ) ) == INVALID_HANDLE ) set_fail_state( "Error opening vault." ); }
public plugin_cfg() { set_task(AUTO_SAVE, "AutoSave", _, _, _, "b") }
public AutoSave() { for( new i ; i < g_iMaxPlayers ; i++ ) { if( is_user_connected(i) ) ReadData(i, SAVE); } }
public client_authorized(id) { get_user_authid( id , g_iPlayerData[ id ][ AuthID ] , charsmax( g_iPlayerData[ ][ AuthID ] ) ); get_user_name( id , g_iPlayerData[ id ][ Name ] , charsmax( g_iPlayerData[ ][ Name ] ) ); get_user_ip( id, g_iPlayerData[ id ][ IP ] , charsmax(g_iPlayerData[ ][ IP ]), 1 ); if(!is_user_hltv(id) && !is_user_bot(id)) { ReadData(id, LOAD); } }
public client_disconnect(id) { if(!is_user_hltv(id) && !is_user_bot(id)) { ReadData(id, SAVE); } }
public CustomMenu(id) { static iMenu, szData[MAX_MENU_LENGTH] formatex(szData, charsmax(szData), "\yBank System: \r[Protected]");
iMenu = menu_create(szData, "Handler"); new const iData[][] = { "Deposit", "Deposit All^n", "Withdraw", "Withdraw All^n", "Check Your Cash", "Donate", "Reset Bank" } for( new i ; i < sizeof ( iData ) ; i++ ) { formatex(szData, charsmax(szData), "%s", iData[i]); menu_additem(iMenu, szData, ""); }
menu_setprop(iMenu, MPROP_EXITNAME, "\rClose")
menu_display(id, iMenu) return PLUGIN_HANDLED }
public Handler(id, iMenu, iItem) { if(iItem != MENU_EXIT) { switch(iItem) { case 0: { client_cmd(id, "messagemode DepositCash"); set_hudmessage(255, 255, 85, 0.01, 0.18, 2, 0.5, 6.0, 0.05, 0.05, -1); show_hudmessage(id, "Type how much you want to deposit."); } case 1: DepositAllCash(id); case 2: { client_cmd(id, "messagemode TakeCash"); set_hudmessage(255, 255, 85, 0.01, 0.18, 2, 0.5, 6.0, 0.05, 0.05, -1); show_hudmessage(id, "Type how much you want to take."); } case 3: WithdrawAllCash(id); case 4: CC_SendMessage(id,"Your Cash is:^4 %d", g_iPlayerData[ id ][ Cash ]); case 5: DonateMenu(id) case 6: ResetMenu(id) } } menu_destroy(iMenu); return PLUGIN_HANDLED }
/* 1. UserID 2. Menu Access 3. Menu Title 4. Menu Handler 5. Player Flags - P.s: 's' = do not include self client */ public DonateMenu(id) { PlayerMenu ( id, " ", "\yChoose a player: \r[Donate]", "Donate_Handler", "chs" ) }
public ResetMenu(id) { PlayerMenu ( id, "a", "\yChoose a player: \r[Reset Bank]", "Reset_Handler", "chs" ) }
public DepositAllCash(id) { new iCash = get_user_cash(id); if( iCash <= 0) { CC_SendMessage(id,"You do not have enough money or invalid value."); return PLUGIN_CONTINUE; }
if( g_iPlayerData[ id ][ Cash ] > get_pcvar_num(g_iCvars[MAX_CASH_SAVE]) ) { CC_SendMessage(id,"Your bank is full."); return PLUGIN_CONTINUE } CC_SendMessage(id,"You have deposit^4 %i.", iCash); g_iPlayerData[ id ][ Cash ] += iCash; set_user_cash(id, iCash - iCash); ReadData(id, SAVE); return PLUGIN_HANDLED; }
public WithdrawAllCash(id) { new iCash = get_user_cash(id); new iBankCash;
if( g_iPlayerData[ id ][ Cash ] <= 0) { CC_SendMessage(id,"You do not have enough money or invalid value."); return PLUGIN_CONTINUE } if( get_pcvar_num(g_iCvars[LIMIT]) != 1) { CC_SendMessage(id,"You have withdraw^4 %i.", g_iPlayerData[ id ][ Cash ]); g_iPlayerData[ id ][ Cash ] -= g_iPlayerData[ id ][ Cash ] set_user_cash(id, iCash + g_iPlayerData[ id ][ Cash ]); } else { iBankCash = get_pcvar_num(g_iCvars[MAX_CASH]) - iCash; if(g_iPlayerData[ id ][ Cash ] < iBankCash) { CC_SendMessage(id,"You have withdraw^4 %i.", g_iPlayerData[ id ][ Cash ]); set_user_cash(id, iCash + g_iPlayerData[ id ][ Cash ]); g_iPlayerData[ id ][ Cash ] -= g_iPlayerData[ id ][ Cash ]; } else { CC_SendMessage(id,"You have withdraw^4 %i.", g_iPlayerData[ id ][ Cash ]); set_user_cash(id, iCash + iBankCash); g_iPlayerData[ id ][ Cash ] -= iBankCash; } } ReadData(id, SAVE); return PLUGIN_HANDLED; }
public OnDepositCash(id) { static szValue[32], iValue, iCash read_argv(1, szValue, charsmax(szValue)); iValue = str_to_num(szValue); iCash = get_user_cash(id); if( iCash < iValue || iValue <= 0) { CC_SendMessage(id,"You do not have enough money or invalid value."); return PLUGIN_CONTINUE }
if( g_iPlayerData[ id ][ Cash ] > get_pcvar_num(g_iCvars[MAX_CASH_SAVE]) ) { CC_SendMessage(id,"Your bank is full."); return PLUGIN_CONTINUE } g_iPlayerData[ id ][ Cash ] += iValue; set_user_cash(id, clamp(iCash - iValue, 0, _)); CC_SendMessage(id,"You have deposit^4 %i.", iValue); ReadData(id, SAVE); return PLUGIN_HANDLED; }
public OnTakeCash(id) { static szValue[32], iValue, iCash read_argv(1, szValue, charsmax(szValue)); iValue = str_to_num(szValue); iCash = get_user_cash(id); if( g_iPlayerData[ id ][ Cash ] < iValue || iValue <= 0) { CC_SendMessage(id,"You do not have enough money or invalid value."); return PLUGIN_CONTINUE } if( get_pcvar_num(g_iCvars[LIMIT]) == 1) { if( iValue <= get_pcvar_num(g_iCvars[MAX_CASH]) ) { g_iPlayerData[ id ][ Cash ] -= iValue; set_user_cash(id, iCash + iValue); CC_SendMessage(id,"You have withdraw^4 %i.", iValue); } else { CC_SendMessage(id,"Max withdraw is:^4 %i.", get_pcvar_num(g_iCvars[MAX_CASH])); } } else { g_iPlayerData[ id ][ Cash ] -= iValue; set_user_cash(id, iCash + iValue); CC_SendMessage(id,"You have withdraw^4 %i.", iValue); } ReadData(id, SAVE); return PLUGIN_HANDLED; }
public Donate_Handler(id, iMenu, iItem) { if(iItem != MENU_EXIT) { new iAccess, iCallback, iData[6], szName[MAX_PLAYERS * 2]; menu_item_getinfo(iMenu, iItem, iAccess, iData, charsmax(iData), szName, charsmax(szName), iCallback); g_iPlayerData[ id ][ Donate ] = find_player("k", str_to_num(iData)) if (!g_iPlayerData[ id ][ Donate ]) { CC_SendMessage(id,"This player does not exist."); menu_display(id, iMenu) return PLUGIN_HANDLED; } client_cmd(id, "messagemode EnterAmount"); set_hudmessage(255, 255, 85, 0.01, 0.18, 2, 0.5, 6.0, 0.05, 0.05, -1); show_hudmessage(id, "Type how much you want to give."); } menu_destroy(iMenu); return PLUGIN_HANDLED }
public Reset_Handler(id, iMenu, iItem) { if(iItem != MENU_EXIT) { new iAccess, iCallback, iData[6], szName[MAX_PLAYERS * 2]; menu_item_getinfo(iMenu, iItem, iAccess, iData, charsmax(iData), szName, charsmax(szName), iCallback); new iPlayer = find_player("k", str_to_num(iData)); if (!iPlayer) { CC_SendMessage(id,"This player does not exist."); menu_display(id, iMenu) return PLUGIN_HANDLED; } ResetBank(id, iPlayer) } menu_destroy(iMenu); return PLUGIN_HANDLED }
public OnDonate(id) { static szValue[10], iValue, iPlayer, iCash read_argv(1, szValue, charsmax(szValue)); iValue = str_to_num(szValue) iCash = get_user_cash(id) iPlayer = g_iPlayerData[ id ][ Donate ];
if( iCash < iValue || iValue <= 0) { CC_SendMessage(id,"You do not have enough money or invalid value."); return PLUGIN_CONTINUE } set_user_cash( id, iCash - iValue) set_user_cash( iPlayer, get_user_cash(iPlayer) + iValue) CC_SendMessage(0,"Player^4 %s^1 donated^4 $%i^1 for^4 %s.", g_iPlayerData[ id ][ Name ], iValue, g_iPlayerData[ iPlayer ][ Name ]); client_cmd(iPlayer, "spk ^"items/9mmclip1.wav^"") return PLUGIN_HANDLED; }
public ResetBank(id, iPlayer) { g_iPlayerData[ iPlayer ][ Cash ] = 0 CC_SendMessage(id,"^1[ADMIN]^4 %s:^1 reset bank of^4 %s.", g_iPlayerData[ id ][ Name ], g_iPlayerData[ iPlayer ][ Name ]); ReadData(id, SAVE); return PLUGIN_HANDLED; }
PlayerMenu(id, const szAccess[ ], const szTitle[ ], const szHandler[ ], const szGetPlayersFlag[ ]) { static iPlayers[MAX_PLAYERS], iNum, szUserID[32], szData[MAX_MENU_LENGTH], iMenu if( !access ( id, read_flags( szAccess ) ) ) { CC_SendMessage(id, "You don't have access to this command."); return PLUGIN_HANDLED } formatex(szData, charsmax(szData), szTitle) iMenu = menu_create(szData, szHandler); get_players(iPlayers, iNum, szGetPlayersFlag); for(new iPlayer, i; i < iNum; i++) { iPlayer = iPlayers[i] if( szGetPlayersFlag[0] == 's' ) { if( id == iPlayer ) continue; } formatex(szData, charsmax(szData), "%s", g_iPlayerData[ iPlayer ][ Name ]); num_to_str(get_user_userid(iPlayer), szUserID, charsmax(szUserID)); menu_additem(iMenu, szData, szUserID) } menu_setprop(iMenu, MPROP_BACKNAME, "Previous page") menu_setprop(iMenu, MPROP_NEXTNAME, "Next page") menu_setprop(iMenu, MPROP_EXITNAME, "\rClose")
menu_display(id, iMenu) return PLUGIN_HANDLED }
public ReadData(id, Type) { new szData[8], szKey[64], iCash[10];
switch( get_pcvar_num(g_iCvars[SAVE_DATA]) ) { case 2: formatex(szKey , charsmax(szKey), "%s-NAME" , g_iPlayerData[ id ][ Name ] ); case 3: formatex(szKey , charsmax(szKey), "%s-IP" , g_iPlayerData[ id ][ IP ] ); default: formatex(szKey , charsmax(szKey), "%s-ID" , g_iPlayerData[ id ][ AuthID ] ); } switch ( Type ) { case SAVE: { formatex( szData , charsmax( szData ) , "%i" , g_iPlayerData[ id ][ Cash ] ); nvault_set( g_Vault , szKey , szData ); } case LOAD: { formatex( szData , charsmax( szData ) , "%i" , g_iPlayerData[ id ][ Cash ] ); nvault_get( g_Vault, szKey, szData, charsmax(szData) ) parse(szData, iCash, charsmax(iCash)); g_iPlayerData[ id ][ Cash ] = str_to_num(iCash) } } }
public plugin_end() { nvault_close( g_Vault ); }
__________________
Last edited by Supremache; 08-01-2021 at 08:14.
|
|