#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <sqlx>
#if defined _zombieplague_included
  #endinput
#endif
#define _zombieplague_included
 
#define ZP_TEAM_ZOMBIE (1<<0)
#define ZP_TEAM_HUMAN (1<<1)
#define ZP_TEAM_NEMESIS (1<<2)
#define ZP_TEAM_SURVIVOR (1<<3)
 
enum
{
	MODE_INFECTION = 1,
	MODE_NEMESIS,
	MODE_SURVIVOR,
	MODE_SWARM,
	MODE_MULTI,
	MODE_PLAGUE
}
 
enum
{
	WIN_NO_ONE = 0,
	WIN_ZOMBIES,
	WIN_HUMANS
}
 
#define ZP_PLUGIN_HANDLED 97
 
native zp_get_user_zombie(id)
native zp_get_user_nemesis(id)
native zp_get_user_survivor(id)
native zp_get_user_first_zombie(id)
native zp_get_user_last_zombie(id)
native zp_get_user_last_human(id)
native zp_get_user_zombie_class(id)
native zp_get_user_next_class(id)
native zp_set_user_zombie_class(id, classid)
native zp_get_user_ammo_packs(id)
native zp_set_user_ammo_packs(id, amount)
native zp_get_zombie_maxhealth(id)
native zp_get_user_batteries(id)
native zp_set_user_batteries(id, charge)
native zp_get_user_nightvision(id)
native zp_set_user_nightvision(id, set)
native zp_infect_user(id, infector = 0, silent = 0, rewards = 0)
native zp_disinfect_user(id, silent = 0)
native zp_make_user_nemesis(id)
native zp_make_user_survivor(id)
native zp_respawn_user(id, team)
native zp_force_buy_extra_item(id, itemid, ignorecost = 0)
native zp_override_user_model(id, const newmodel[], modelindex = 0)
native zp_has_round_started()
native zp_is_nemesis_round()
native zp_is_survivor_round()
native zp_is_swarm_round()
native zp_is_plague_round()
native zp_get_zombie_count()
native zp_get_human_count()
native zp_get_nemesis_count()
native zp_get_survivor_count()
native zp_register_extra_item(const name[], cost, teams)
native zp_register_zombie_class(const name[], const info[], const model[], const clawmodel[], hp, speed, Float:gravity, Float:knockback)
native zp_get_extra_item_id(const name[])
native zp_get_zombie_class_id(const name[])
native zp_get_zombie_class_info(classid, info[], len)
forward zp_round_started(gamemode, id)
forward zp_round_ended(winteam)
forward zp_user_infected_pre(id, infector, nemesis)
forward zp_user_infected_post(id, infector, nemesis)
forward zp_user_humanized_pre(id, survivor)
forward zp_user_humanized_post(id, survivor)
forward zp_user_infect_attempt(id, infector, nemesis)
forward zp_user_humanize_attempt(id, survivor)
forward zp_extra_item_selected(id, itemid)
forward zp_user_unfrozen(id)
forward zp_user_last_zombie(id)
forward zp_user_last_human(id)
 
#define ZP_TEAM_ANY 0
#define ZP_TEAM_NO_ONE 0
 
enum Color
{
	NORMAL = 1, // clients scr_concolor cvar color
	GREEN, // Green Color
	TEAM_COLOR, // Red, grey, blue
	GREY, // grey
	RED, // Red
	BLUE, // Blue
}
 
new TeamName[][] = 
{
	"",
	"TERRORIST",
	"CT",
	"SPECTATOR"
}
 
ColorChat(id, Color:type, const msg[], {Float,Sql,Result,_}:...)
{
	static message[256];
 
	switch(type)
	{
		case NORMAL: // clients scr_concolor cvar color
		{
			message[0] = 0x01;
		}
		case GREEN: // Green
		{
			message[0] = 0x04;
		}
		default: // White, Red, Blue
		{
			message[0] = 0x03;
		}
	}
 
	vformat(message[1], 251, msg, 4);
	message[192] = '^0';
 
	static team, ColorChange, index, MSG_Type;
 
	if(id)
	{
		MSG_Type = MSG_ONE;
		index = id;
	} else {
		index = FindPlayer();
		MSG_Type = MSG_ALL;
	}
 
	team = get_user_team(index);
	ColorChange = ColorSelection(index, MSG_Type, type);
 
	ShowColorMessage(index, MSG_Type, message);
 
	if(ColorChange)
	{
		Team_Info(index, MSG_Type, TeamName[team]);
	}
}
 
ShowColorMessage(id, type, message[])
{
	message_begin(type, get_user_msgid("SayText"), _, id);
	write_byte(id)		
	write_string(message);
	message_end();	
}
 
Team_Info(id, type, team[])
{
	message_begin(type, get_user_msgid("TeamInfo"), _, id);
	write_byte(id);
	write_string(team);
	message_end();
 
	return 1;
}
 
ColorSelection(index, type, Color:Type)
{
	switch(Type)
	{
		case RED:
		{
			return Team_Info(index, type, TeamName[1]);
		}
		case BLUE:
		{
			return Team_Info(index, type, TeamName[2]);
		}
		case GREY:
		{
			return Team_Info(index, type, TeamName[0]);
		}
	}
 
	return 0;
}
 
FindPlayer()
{
	static i;
	i = -1;
 
	while(i <= get_maxplayers())
	{
		if(is_user_connected(++i))
		{
			return i;
		}
	}
 
	return -1;
}
 
 
#pragma semicolon 1
 
#if !defined MAX_PLAYERS
	#define MAX_PLAYERS 32
#endif
 
new PLUGIN_NAME[] = "[ZP]Addons: Bank SQL";
new PLUGIN_VERSION[] = "0.9.2";
new PLUGIN_AUTHOR[] = "Epmak";
new PLUGIN_PREFIX[] = "[ZP][Bank]";
 
enum vars_struct { 
	mode=0,
	annonce,
 
	save_limit,
	save_days,
	save_type,
 
	block_cname,
	startedammo,
	allow_passwd,
	allow_donate,
 
	bool:round_end,
 
	_pw_str[32],
	table[32],
	config_dir[128]
};
 
enum bank_struct {
	bool:ingame,
	bool:async,
	bool:loggin,
	auth[36],
	passwd[32],
	amount
}
 
new g_vars[vars_struct];
new g_Bank[MAX_PLAYERS+1][bank_struct];
new Handle:g_Sql = Empty_Handle,Handle:g_SqlTuple = Empty_Handle;
 
public plugin_init()
{
	register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
	register_cvar("zp_bank_sql", PLUGIN_VERSION, FCVAR_SERVER);
 
	register_dictionary("zp_bank.txt");
	register_dictionary("common.txt");
 
	register_clcmd("say", "handle_say");
	register_clcmd("say_team", "handle_say");
 
	register_concmd("zp_bank_show", "cmdBankShow", ADMIN_ADMIN);
	register_concmd("zp_bank_set", "cmdBankSet", ADMIN_RCON, "<name or #userid> <+ or ->amount");
 
	g_vars[startedammo] = get_cvar_pointer("zp_starting_ammo_packs");
 
	register_srvcmd("zp_bank_connect", "db_connect");
 
	register_forward(FM_ClientUserInfoChanged, "fwClientUserInfoChanged");
 
	server_cmd("zp_bank_connect");
}
 
public plugin_precache()
{
	get_configsdir(g_vars[config_dir], 127);
 
	g_vars[mode] = register_cvar("zp_bank", "1");
	g_vars[annonce] = register_cvar("zp_bank_annonce", "360.0");
	g_vars[save_limit] = register_cvar("zp_bank_save_limit", "1000");
	g_vars[save_days] = register_cvar("zp_bank_save_days", "24");
	g_vars[save_type] = register_cvar("zp_bank_save_type", "2");
	g_vars[block_cname] = register_cvar("zp_bank_block_name_change", "1");
	g_vars[allow_passwd] = register_cvar("zp_bank_allow_passwd", "1");
	g_vars[allow_donate] = register_cvar("zp_bank_allow_donate", "1");
 
	register_cvar("zp_bank_host", "127.0.0.1");
	register_cvar("zp_bank_user", "root");
	register_cvar("zp_bank_pass", "");
	register_cvar("zp_bank_db", "amxx");
	register_cvar("zp_bank_type", "mysql");
	register_cvar("zp_bank_table", "zp_bank");
	register_cvar("zp_bank_pw_str", "_bpw");
 
	server_cmd("exec %s/zp_bank.cfg", g_vars[config_dir]);
	server_exec();
}
 
public plugin_cfg()
{
	g_vars[mode] = get_pcvar_num(g_vars[mode]);
	g_vars[save_limit] = get_pcvar_num(g_vars[save_limit]);
	g_vars[save_days] = get_pcvar_num(g_vars[save_days]);
	g_vars[save_type] = get_pcvar_num(g_vars[save_type]);
	g_vars[block_cname] = get_pcvar_num(g_vars[block_cname]);
	g_vars[allow_passwd] = get_pcvar_num(g_vars[allow_passwd]);
	g_vars[allow_donate] = get_pcvar_num(g_vars[allow_donate]);
 
	if(g_vars[save_limit] < 0) g_vars[save_limit] = 0;
 
	if(get_pcvar_num(g_vars[annonce]))
		set_task(get_pcvar_float(g_vars[annonce]), "print_annonce",_,_,_,"b");
 
	get_cvar_string("zp_bank_pw_str", g_vars[_pw_str], 31);
} 
 
public plugin_end()
{
	if(g_Sql != Empty_Handle) SQL_FreeHandle(g_Sql);
	if(g_SqlTuple != Empty_Handle) SQL_FreeHandle(g_SqlTuple);
}
 
public zp_round_started(gamemode, id)
{
	g_vars[round_end] = false;
}
 
public zp_round_ended(winteam)
{
	if (!g_vars[mode] || g_Sql == Empty_Handle)
		return ;
 
	static i;
	for(i=1;i<=MAX_PLAYERS;i++)
	{
		if(!g_Bank[i][ingame] || !g_Bank[i][loggin] || !g_Bank[i][async])
			continue;
 
		SaveClientBank(i);
	}
 
	g_vars[round_end] = true;
}
 
public client_connect(id)
{
	if (!g_vars[mode])
		return ;
 
	GetAuthId(id, g_Bank[id][auth],35);
 
	g_Bank[id][amount] = 0;
	g_Bank[id][async] = false;
	g_Bank[id][loggin] = false;
 
	if(g_vars[mode] == 2)
		zp_set_user_ammo_packs(id, get_pcvar_num(g_vars[startedammo]));
 
	LoadClientBank(id);
}
 
public client_putinserver(id)
{
	g_Bank[id][ingame] = true;
 
	if(g_Bank[id][async] == true && g_Bank[id][loggin] == true)
		SetAmmoBank(id, g_Bank[id][amount]);
}
 
public client_disconnect(id)
{
	if (!g_vars[mode] || g_Sql == Empty_Handle)
		return ;
 
	if(g_vars[round_end] == false && g_Bank[id][async] == true && g_Bank[id][loggin] == true)
		SaveClientBank(id);
 
	g_Bank[id][ingame] = false;
	g_Bank[id][auth][0] = '^0';
	g_Bank[id][passwd][0] = '^0';
}
 
public cmdBankShow(id, level, cid)
{
	if (!cmd_access(id, level, cid, 1))
		return PLUGIN_HANDLED;
 
	static pl_name[32], pl_amount[11], i;
	console_print(id, "%33s amount","name");
	for(i=1;i<=MAX_PLAYERS;i++)
	{
		if(!g_Bank[i][ingame]) continue;
 
		get_user_name(i,pl_name,31);
 
		if(!g_Bank[i][async])
			pl_amount = "not loaded";
		else if(!g_Bank[i][loggin])
			pl_amount = "not loggin";
		else
			num_to_str(GetAmmoBank(i),pl_amount,10);
 
		console_print(id, "%33s %s", pl_name, pl_amount);
	}
 
	return PLUGIN_HANDLED;
}
 
public cmdBankSet(id, level, cid)
{
	if (!cmd_access(id, level, cid, 3))
		return PLUGIN_HANDLED;
 
	static s_player[32], player, s_amount[12], i_amount;
	read_argv(1, s_player, 31);
	player = cmd_target(id, s_player, CMDTARGET_ALLOW_SELF);
 
	if (!player)
		return PLUGIN_HANDLED;
 
	get_user_name(player,s_player,31);
	if(!g_Bank[player][async])
	{
		console_print(id,"The player '%s' has not loaded bank", s_player);
		return PLUGIN_HANDLED;
	}
	else if(!g_Bank[player][loggin])
	{
		console_print(id,"The player '%s' has not loggin bank", s_player);
		return PLUGIN_HANDLED;
	}
 
	read_argv(2, s_amount, 11);
	remove_quotes(s_amount);
	i_amount = str_to_num(s_amount);
 
	switch(s_amount[0])
	{
		case '+':
			SetAmmoBank(player, GetAmmoBank(player)+i_amount);
		case '-':
			SetAmmoBank(player, GetAmmoBank(player)-(0-i_amount));
		default:
			SetAmmoBank(player,i_amount);
	}
 
	return PLUGIN_HANDLED;
}
 
public print_annonce()
{
	if (!g_vars[mode] || g_Sql == Empty_Handle)
		return ;
 
	ColorChat(0, GREY, "%L", LANG_PLAYER, "BANK_ANNOUNCE1");
	if(g_vars[mode] == 1)
	{
		ColorChat(0, GREY, "%L", LANG_PLAYER, "BANK_ANNOUNCE2");
		ColorChat(0, GREY, "%L", LANG_PLAYER, "BANK_ANNOUNCE3");
	}
	else
	{
		ColorChat(0, GREY, "%L", LANG_PLAYER, "BANK_ANNOUNCE4");
	}
}
 
public db_loadcurrent()
{
	for(new i=1;i<=MAX_PLAYERS;i++)
	{
		if(g_Bank[i][async] || !g_Bank[i][ingame]) continue;
 
		LoadClientBank(i);
	}
}
 
public db_connect(count)
{
	if(!g_vars[mode])
		return ;
 
	new host[64], user[32], pass[32], db[128];
	new get_type[13], set_type[12];
	new error[128], errno;
 
	get_cvar_string("zp_bank_host", host, 63);
	get_cvar_string("zp_bank_user", user, 31);
	get_cvar_string("zp_bank_pass", pass, 31);
	get_cvar_string("zp_bank_type", set_type, 11);
	get_cvar_string("zp_bank_db", db, 127);
	get_cvar_string("zp_bank_table", g_vars[table], 31);
 
	if(is_module_loaded(set_type) == -1)
	{
		server_print("^r^n%s error: module '%s' not loaded.^r^n%s Add line %s to %s/modules.ini and restart server^r^n", PLUGIN_PREFIX, set_type, PLUGIN_PREFIX, set_type, g_vars[config_dir]);
		return ;
	}
 
	SQL_GetAffinity(get_type, 12);
 
	if (!equali(get_type, set_type))
		if (!SQL_SetAffinity(set_type))
			log_amx("Failed to set affinity from %s to %s.", get_type, set_type);
 
	g_SqlTuple = SQL_MakeDbTuple(host, user, pass, db);
 
	g_Sql = SQL_Connect(g_SqlTuple, errno, error, 127);
 
	if (g_Sql == Empty_Handle)
	{
		server_print("%s SQL Error #%d - %s", PLUGIN_PREFIX, errno, error);
 
		count += 1;
		set_task(10.0, "db_connect", count);
 
		return ;
	}
 
	SQL_QueryAndIgnore(g_Sql, "SET NAMES utf8");
 
	if (equali(set_type, "sqlite") && !sqlite_TableExists(g_Sql, g_vars[table])) SQL_QueryAndIgnore(g_Sql, "CREATE TABLE %s (auth VARCHAR(36) PRIMARY KEY, password VARCHAR(32) NOT NULL DEFAULT '', amount INTEGER DEFAULT 0, timestamp INTEGER NOT NULL DEFAULT 0)",g_vars[table]);
	else if (equali(set_type, "mysql")) SQL_QueryAndIgnore(g_Sql,"CREATE TABLE IF NOT EXISTS `%s` (`auth` VARCHAR(36) NOT NULL, `password` VARCHAR(32) NOT NULL DEFAULT '', `amount` INT(10) NOT NULL DEFAULT 0, `timestamp` INT(10) NOT NULL DEFAULT 0, PRIMARY KEY (`auth`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;", g_vars[table]);
 
	CleanDataBase();
	if(count > 1)
		db_loadcurrent();
 
	server_print("%s connected to: '%s://%s:****@%s/%s/%s'",PLUGIN_PREFIX, set_type, user, host, db, g_vars[table]);
}
 
public CleanDataBase()
{
	SQL_QueryAndIgnore(g_Sql, "DELETE FROM %s WHERE amount='0' AND password = '';", g_vars[table]);
 
	if (!g_vars[save_days]) return ;
 
	new curTime = get_systime();
	curTime -= ((g_vars[save_days] * 24) * 3600);
 
	SQL_QueryAndIgnore(g_Sql,"DELETE FROM %s WHERE timestamp < '%d';", g_vars[table], curTime);
}
 
public fwClientUserInfoChanged(id, buffer)
{
	if (!g_vars[mode] || !is_user_connected(id))
		return FMRES_IGNORED;
 
	new name[32], val[32], name_1[] = "name";
	get_user_name(id, name, 31);
	engfunc(EngFunc_InfoKeyValue, buffer, name_1, val, 31);
	if (equal(val, name))
		return FMRES_IGNORED;
 
	if(g_vars[block_cname])
	{
		engfunc(EngFunc_SetClientKeyValue, id, buffer, name_1, name);
		client_cmd(id, "name ^"%s^"; setinfo name ^"%s^"", name, name);
		console_print(id, "%L", id ,"NO_NAME_CHANGE");
	}
	else
	{
		GetAuthId(id,g_Bank[id][auth],35);
		return FMRES_IGNORED;
	}
 
	return FMRES_SUPERCEDE;
}
 
public handle_say(id)
{
	if(!g_vars[mode])
	{
		ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "BANK_DISABLED");
 
		return PLUGIN_CONTINUE;
	}
	else if(g_Sql == Empty_Handle)
	{
		ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "BANK_ERR");
 
		return PLUGIN_CONTINUE;
	}
	else if (!g_Bank[id][async])
		return PLUGIN_CONTINUE;
 
	new text[60], command[16], command2[32], password[32], set_packs;
	read_args(text, 59);
	remove_quotes(text);
 
	command[0] = '^0';
	command2[0] = '^0';
	password[0] = '^0';
	parse(text, command, 15, command2, 31, password, 31);
 
	if (equali(command, "/", 1))
		format(command, 15, command[1]);
 
	if (g_vars[allow_donate] && equali(command, "kuldes", 6))
	{
		donate(id, command2, str_to_num(password));
	}
	else if (equali(command, "mybank", 6) || equali(command, "bank", 4))
	{
		if(g_vars[save_type] == 2 && g_vars[allow_passwd])
		{
			if(equali(command2, "login", 5))
			{
				if(g_Bank[id][loggin]) {
					ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "BANK_LOGIN_ALREADY");
					return PLUGIN_HANDLED;
				}
 
				if(g_Bank[id][passwd][0] && equal(password, g_Bank[id][passwd]))
				{
					g_Bank[id][loggin] = true;
					SetAmmoBank(id, g_Bank[id][amount]);
					client_cmd(id, "setinfo %s ^"%s^"", g_vars[_pw_str], password);
					ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "BANK_LOGIN_SUCCESS");
				}
				else
				{
					ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "BANK_LOGIN_BAD");
				}
 
				return PLUGIN_HANDLED;
			}
			else if(!g_Bank[id][loggin])
			{
				ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "BANK_LOGIN");
				return PLUGIN_HANDLED;
			}
			else if(equali(command2, "password", 8))
			{
				if(password[0])
				{
					g_Bank[id][passwd] = password;
					client_cmd(id, "setinfo %s ^"%s^"", g_vars[_pw_str], password);
					ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "BANK_LOGIN_PASSWORD_SET", g_Bank[id][passwd]);
				}
				else
				{
					ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "BANK_LOGIN_PASSWORD", g_Bank[id][passwd]);
				}
				return PLUGIN_HANDLED;
			}
			else if(!g_Bank[id][passwd][0])
				ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "BANK_LOGIN_PASSWORD_SETHELP");
		}
 
		if(g_vars[mode] == 2)
		{
			ColorChat(id, GREY, "%L", LANG_PLAYER, "BANK_ANNOUNCE4");
			return PLUGIN_CONTINUE;
		}
 
		ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "BANK", g_Bank[id][amount]);	
		ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "BANK_ANNOUNCE2");
		ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "BANK_ANNOUNCE3");
	}
	else if (g_vars[mode] == 2)
		return PLUGIN_CONTINUE;
	else if (equali(command, "deposit", 7) || equali(command, "send", 4) || equali(command, "store", 5))
	{
		new user_ammo_packs = zp_get_user_ammo_packs(id);
 
		if (equali(command2, "all")) set_packs = user_ammo_packs;
		else set_packs = str_to_num(command2);
 
		new limit_exceeded=false;
 
		if (g_vars[save_limit] && set_packs > 0 && g_Bank[id][amount] + set_packs > g_vars[save_limit])
		{
			new overflow = g_Bank[id][amount] + set_packs - g_vars[save_limit];
			set_packs -= overflow;
 
			ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "DEPOSIT_MAX", g_vars[save_limit]);
 
			limit_exceeded = true;
		}
 
		if (set_packs > 0)
		{
			if (user_ammo_packs >= set_packs)
			{
				g_Bank[id][amount] += set_packs;
				zp_set_user_ammo_packs(id, user_ammo_packs - set_packs);
				ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "DEPOSIT", set_packs, g_Bank[id][amount]);
			}
			else
				ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "DEPOSIT_ERR", set_packs, user_ammo_packs);
 
			return PLUGIN_HANDLED;
		}
		else if(!limit_exceeded)
			ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "BANK_ANNOUNCE2");
	}
	else if (equali(command, "withdraw", 8) || equali(command, "take", 4) || equali(command, "retrieve", 8) || equali(command, "wd", 2))
	{
		new user_ammo_packs = zp_get_user_ammo_packs(id);
 
		if (equali(command2, "all")) set_packs = g_Bank[id][amount];
		else set_packs = str_to_num(command2);
 
		if (set_packs > 0)
		{
			if (g_Bank[id][amount] >= set_packs)
			{
				zp_set_user_ammo_packs(id, user_ammo_packs + set_packs);
				g_Bank[id][amount] -= set_packs;
				ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "WITHDRAW", set_packs, g_Bank[id][amount]);
			}
			else
				ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "WITHDRAW_ERR", set_packs, g_Bank[id][amount]);
 
			return PLUGIN_HANDLED;
		}
		else
			ColorChat(id, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "BANK_ANNOUNCE3");
	}
 
	return PLUGIN_CONTINUE;
}
 
public donate(donater, const reciever_name[], ammo)
{
	if(!reciever_name[0] || ammo <= 0 || zp_get_user_ammo_packs(donater) < ammo)
	{
		ColorChat(donater, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "BANK_DONATE_USAGE");
		return ;
	}
 
	new reciever = cmd_target(donater, reciever_name, CMDTARGET_ALLOW_SELF);
	if (!reciever || reciever == donater)
	{
		ColorChat(donater, GREY, "$g%s$t %L", PLUGIN_PREFIX, LANG_PLAYER, "CL_NOT_FOUND");	
		return ;
	}
 
	zp_set_user_ammo_packs(donater, zp_get_user_ammo_packs(donater)-ammo);
	zp_set_user_ammo_packs(reciever, zp_get_user_ammo_packs(reciever)+ammo);
}
 
public LoadClientBank(id)
{
	if (g_SqlTuple == Empty_Handle || g_Sql == Empty_Handle || g_Bank[id][async] == true)
		return ;
 
	new szQuery[120];
	format(szQuery, 119,"SELECT amount,password FROM %s WHERE auth='%s';", g_vars[table], g_Bank[id][auth]);
 
	new szData[2];
	szData[0] = id;
	szData[1] = get_user_userid(id);
 
	SQL_ThreadQuery(g_SqlTuple, "LoadClient_QueryHandler", szQuery, szData, 2);
}
 
public LoadClient_QueryHandler(iFailState, Handle:hQuery, szError[], iErrnum, szData[], iSize, Float:fQueueTime)
{
	if(iFailState != TQUERY_SUCCESS)
	{
		log_amx("%s SQL Error #%d - %s", PLUGIN_PREFIX, iErrnum, szError);
		return ;
	}
 
	new id = szData[0];
 
	if (szData[1] != get_user_userid(id))
		return ;
 
	new packs=0,info_pw[32];
 
	if(g_vars[mode] == 2)
		packs = get_pcvar_num(g_vars[startedammo]);
 
	if(SQL_NumResults(hQuery))
	{
		packs = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "amount"));
		SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "password"), g_Bank[id][passwd], 31);
	}
 
	g_Bank[id][amount] = CheckLimit(packs);
	if(g_vars[allow_passwd] && g_Bank[id][passwd][0])
	{
		get_user_info(id,g_vars[_pw_str],info_pw,31);
		if(equal(info_pw, g_Bank[id][passwd]))
		{
			g_Bank[id][loggin] = true;
		}
	}
	else
		g_Bank[id][loggin] = true;
 
	if(g_Bank[id][ingame] == true && g_Bank[id][loggin] == true)
	{
		SetAmmoBank(id, g_Bank[id][amount]);
	}
	g_Bank[id][async] = true;
}
 
public SaveClientBank(id)
{
	if (g_Sql == Empty_Handle)
		return ;
 
	new packs = GetAmmoBank(id);
	packs = CheckLimit(packs);
 
	SQL_QuoteString(g_Sql, g_Bank[id][passwd], 31, g_Bank[id][passwd]);
	SQL_QueryAndIgnore(g_Sql, "REPLACE INTO %s (auth,password,amount,timestamp) VALUES('%s', '%s', %d, %d);", g_vars[table], g_Bank[id][auth], g_Bank[id][passwd], packs, get_systime());
}
 
stock GetAuthId(id, Buffer[]="", BufferSize=0)
{
	switch(g_vars[save_type])
	{
		case 1: get_user_authid(id,Buffer,BufferSize);
		case 2:
		{
			new name[32];
			get_user_name(id,name,31);
			SQL_QuoteString(g_Sql, Buffer, BufferSize, name);
		}
		case 3: get_user_ip(id,Buffer,BufferSize,true);
	}
}
 
public CheckLimit(packs)
{
	if(g_vars[save_limit] && packs > g_vars[save_limit])
	{
		packs = g_vars[save_limit];
	}
	return packs;
}
 
public SetAmmoBank(id, packs)
{
	if(g_vars[mode] == 2)
		zp_set_user_ammo_packs(id,packs);
	else
		g_Bank[id][amount] = packs;
}
 
public GetAmmoBank(id)
{
	if(g_vars[mode] == 2)
		return zp_get_user_ammo_packs(id);
 
	return g_Bank[id][amount];
}