Senior Member
|
08-20-2010
, 20:07
Re: [ES][ZP] Ayuda Banco!
|
#5
|
Quote:
Originally Posted by elpapadeloshelados
Buenas, mi problema es que desde que tengo server ZP eh tenido un gran problema, y es con el banco. Por ejemplo, yo deposito 1000 ammopacks y se supone que solamente se tienen que guardar a mi, pero no, se le guardan a todos los jugadores y si cambio mapa o cierro y abro de nuevo, todos empiezan con el banco en 5000 ammo packs o las que sea que yo tuviera, se las pueden gastar todas pero cuando se cambia mapa otra ves lo mismo, todos con 5000 ammo packs. En resumen, necesito poner que cuando uno deposite solo se le deposite a uno mismo y se queden guardados si se cambia de mapa o se desconecta, y cuando empiezes de nuevo tengas las que tenias antes, osea las que has depositado sin que se borren, aqui les voy a dejar el .sma del banco que yo utilizo:
Code:
// ZP Bank - allows saving of ammo packs
/* cvars
zp_bank 1 //<0/1> set whether plugin enabled or not
zp_bank_limit 1000000 //maximium storage capacity of each person's account
zp_bank_blockstart 1 //<0/1> set whether bank blocks zombie plague from giving the initial 5 ammo packs on start if user has an account
*/
#include <amxmodx>
#include <amxmisc>
#include <nvault>
#include <fakemeta>
#include <zombieplague>
static const version[] = "0.3";
static const plugin[] = "ZP Bank";
enum pcvar
{
enable = 0,
cap,
start
}
new pcvars[pcvar];
new bankstorage[33];
new gvault, thinkobj;
public plugin_init()
{
register_plugin(plugin, version, "Random1");
gvault = nvault_open("Zombie Bank");
pcvars[enable] = register_cvar("zp_bank", "1");
pcvars[cap] = register_cvar("zp_bank_limit", "5000");
pcvars[start] = register_cvar("zp_bank_blockstart", "0");
if ( get_pcvar_num(pcvars[cap]) > 2147483646 )
{
set_pcvar_num(pcvars[cap], 2147483646);
server_print("[%s] Due to a 32 bit restriction in perl zp_ammo_limit reset based on restriction", plugin);
}
register_clcmd("say", "handle_say");
register_clcmd("say_team", "handle_say");
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() + 240.0);
register_forward(FM_Think, "fourmin_think");
}
}
public fourmin_think(ent)
{
if ( ent != thinkobj ) return FMRES_IGNORED;
if ( !get_pcvar_num(pcvars[enable]) ) return FMRES_IGNORED;
client_print(0, print_chat, "[%s]Activado. %d es el limite de almacenamiento", plugin, get_pcvar_num(pcvars[cap]));
client_print(0, print_chat, "[%s] Puedes guardar tus ammo packs en el banco escribiendo ^"deposit <amount>^".", plugin);
client_print(0, print_chat, "[%s] Para retirar tus ammo packs del banco escribe ^"withdraw <amount>^"", plugin);
set_pev(ent, pev_nextthink, get_gametime() + 240.0);
return FMRES_HANDLED;
}
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(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);
//dbg_log("cmd_say() arg1:#%s# arg2:#%s# arg3:#%s#", arg1, arg2, arg3);
// if the chat line has more than 2 words, we're not interested at all
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 )
client_print(id, print_chat, "[%s] Para depositar los ammo packs escribir 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 )
client_print(id, print_chat, "[%s] Retirar ammo packs del banco escribir 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 ) {
client_print(id, print_chat, "[%s] Actualmente usted tiene %d ammo packs en el banco",plugin, bankstorage[id]);
return PLUGIN_HANDLED;
}
else {
new player = cmd_target(id,arg2,2);
if ( !player ) return PLUGIN_CONTINUE;
client_print(id, print_chat, "[%s] %s tiene %d ammo packs", plugin, arg2, bankstorage[player]);
return PLUGIN_HANDLED;
}
}
}
else if ( equali( arg1, "donate", 6 ) )
{
give_cmd(id, arg2, arg3);
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
give_cmd(id, target[], amnt[])
{
new temp = str_to_num(amnt);
if ( temp < 0 )
{
client_print(id, print_chat, "[%s] La ^"amount^" argumento pasado es negativo, puede que quiera enganar", plugin );
return;
}
new player = cmd_target(id, target, 8);
if ( !player ) return;
new temp2 = bankstorage[id] + zp_get_user_ammo_packs(id);
if ( temp > temp2 )
{
client_print(id, print_chat, "[%s] Usted no tiene suficiente ammo packs para donar, solo tienes %d de %d especificando",plugin,
temp2, temp);
return;
}
static playername[32], givename[32];
get_user_name(player, playername, 31);
get_user_name(id, givename, 31);
client_print(id, print_chat, "[%s] Usted a donado %d ammo packs a %s", plugin, temp, playername);
client_print(player, print_chat, "[%s] %s donado %d ammo packs a usted", plugin, givename, temp);
bankstorage[player] += temp;
if ( bankstorage[id] > temp ) bankstorage[id] -= temp;
else
{
temp -= bankstorage[id];
bankstorage[id] = 0;
zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) - temp);
}
}
//public zp_user_disconnect_pre(id)
public client_disconnect(id)
if ( bankstorage[id] > 0 ) save_data(id);
//public zp_user_connect_post(id)
public client_connect(id)
{
bankstorage[id] = 0; //clear residual before loading
retrieve_data(id);
}
store_cash(id, amnt)
{
if ( !get_pcvar_num(pcvars[enable]) ) return;
if ( amnt == -1 )
{
bankstorage[id] += zp_get_user_ammo_packs(id);
zp_set_user_ammo_packs(id, 0);
checkmax(id);
}
else if ( amnt > 0 )
{
new temp = zp_get_user_ammo_packs(id);
new limit = get_pcvar_num(pcvars[cap]);
if ( temp >= amnt )
{
if ( bankstorage[id] + amnt <= limit )
{
bankstorage[id] += amnt
zp_set_user_ammo_packs(id, temp - amnt);
}
else
{
new overflow = bankstorage[id] + amnt - limit;
bankstorage[id] = limit;
zp_set_user_ammo_packs(id, temp - amnt + overflow);
client_print(id, print_chat, "[%s] Su cuenta bancaria ha llegado a su capacidad de maxima %d", plugin, limit);
client_print(id, print_chat, "[%s] solo %d de la %d tu especificaste para depositar ha sido depositado", plugin,
amnt - overflow, amnt);
}
}
else
client_print(id, print_chat, "[%s] Cantidad especificada(%d) actual es mayor que ammo pack cuenta(%d)", plugin,
amnt, temp);
}
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 )
{
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 )
{
zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + amnt);
bankstorage[id] -= amnt;
}
else {
client_print(id, print_chat, "[%s] Cuenta especifica(%d) es mayor que en el banco(%d)", plugin,
amnt, bankstorage[id]);
}
}
else store_cash(id, -amnt);
}
save_data(id)
{
new AuthID[35];
get_user_authid(id,AuthID,34);
new vaultkey[40],vaultdata[13];
formatex( vaultkey, 39, "__%s__", AuthID);
formatex( vaultdata, 12, "%i", bankstorage[id] );
nvault_set(gvault, vaultkey, vaultdata);
}
retrieve_data(id)
{
new AuthID[35];
get_user_authid(id,AuthID,34);
new vaultkey[40], vaultdata[13];
format(vaultkey, 39, "__%s__", AuthID);
nvault_get(gvault, vaultkey, vaultdata, 12);
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(id, 0);
}
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;
}
Muchisimas gracias, recuerden que es para que las ammo se le guarden a uno mismo, osea un banco para cada uno, y que no se borren al cambiar de mapa o desconectarse. Gracias!
|
mmm,yo tenia los banco de ammo packs pero casi todos me daban bug,ahora uso un banco de autoguardado donde si se cae el server,cambio de map,quit,retry o cualquier cosa los AMMO PACKS SE GUARDAN SIN PONER DEPOSITAR O RETIRAR (autoguardado),ademas,los admin o rcon pueden dar ammo packs a quien sea (1.000.000 como maximo) hasta el momento no tiene bug,si quieres te lo paso. (NO USO AMMO PACK BANK POR QUE SIEMPRE ME SALIAN CON BUGS )
|
|