#include <sourcemod>
#include <shop>
#include <csgo_colors>
#pragma semicolon 1

int g_CheckChatMoney[MAXPLAYERS+1];
int g_MoneyClient[MAXPLAYERS+1];
char g_FlipCoin[MAXPLAYERS+1][1024];
int TargetSaveClient[MAXPLAYERS+1];
int TargetFlipSilver[MAXPLAYERS+1];
int g_FlipCoinTarget[MAXPLAYERS+1];
int g_MoneyItem[MAXPLAYERS+1];
char TargetFlip[65][65];
char TargetFlip1[65][65];
int g_TMoney[MAXPLAYERS+1];
int g_CheckMoneyGame[MAXPLAYERS+1];

public Plugin:myinfo = 
{
	name		= "[Shop] FlipGame",
	author		= "FLASHER",
	description	= "FlipGame For Shop Core",
	version		= "1.1",
	url			= "skype: flshr328"
};

public OnPluginStart ()
{
	RegConsoleCmd ("sm_flip", flipgame);
	HookEvent("player_say", Say);
	if (Shop_IsStarted()) Shop_Started();
}

public int Shop_Started()
{
	Shop_AddToFunctionsMenu(OnFuncDisplay, OnFuncSelect);
}

public void OnPluginEnd()
{
	Shop_RemoveFromFunctionsMenu(OnFuncDisplay, OnFuncSelect);
}

public int OnFuncDisplay(int client, char[] buffer, int maxlength)
{
	FormatEx(buffer, maxlength, "Монетка");
}

public bool OnFuncSelect(int client)
{
	MoneyGameMenu(client);
	return true;
}

public Action:flipgame(client, args)
{
	MoneyGameMenu(client);
	return Plugin_Handled;
}

MoneyGameMenu(client)
{
	new Handle:FlipGameHandle = CreateMenu(FlipGameMenu);
	SetMenuTitle(FlipGameHandle, "Монетка\n \n");
	AddMenuItem(FlipGameHandle, "StartGame", "Начать игру");
	AddMenuItem(FlipGameHandle, "info", "Информация\n \n");
	SetMenuExitButton(FlipGameHandle, true);
	DisplayMenu(FlipGameHandle, client, 0);
}

MoneyGameStartMenu(client)
{
	if(g_CheckMoneyGame[client] == 0)
	{
		if(g_MoneyItem[client] == 0)
		{
			g_FlipCoin[client] = "Решка";
		}
		else
		{
			g_FlipCoin[client] = "Орёл";
		}
		new Handle:FlipGameStartHandle = CreateMenu(FlipGameStartMenu);
		SetMenuTitle(FlipGameStartHandle, "Старт игры\n \nВаша ставка [%i кредитов]\nВаша сторона монетки [%s]\n \n", g_MoneyClient[client], g_FlipCoin[client]);
		AddMenuItem(FlipGameStartHandle, "credits", "Изменить ставку");
		AddMenuItem(FlipGameStartHandle, "money", "Изменить сторону монетки\n \n");
		AddMenuItem(FlipGameStartHandle, "start", "Найти игрока");
		SetMenuExitButton(FlipGameStartHandle, true);
		DisplayMenu(FlipGameStartHandle, client, 0);
	}
	else
	{
		CGOPrintToChat(client, "У вас уже начата игра!");
		MoneyGameMenu(client);
	}
}

CreditsRateMenu(client)
{
	new Handle:MenuCreditsRateHandle = CreateMenu(MenuCreditsRateMenu); 
	SetMenuTitle(MenuCreditsRateHandle, "Кредиты для ставки [%i]\n \n", g_MoneyClient[client]);
	AddMenuItem(MenuCreditsRateHandle, "1", "+10");
	AddMenuItem(MenuCreditsRateHandle, "2", "+500");
	AddMenuItem(MenuCreditsRateHandle, "3", "+5000");
	AddMenuItem(MenuCreditsRateHandle, "4", "+50000");
	AddMenuItem(MenuCreditsRateHandle, "5", "+500000\n \n");
	AddMenuItem(MenuCreditsRateHandle, "done", "Готово");
	SetMenuExitButton(MenuCreditsRateHandle, true);
	DisplayMenu(MenuCreditsRateHandle, client, 0);
}

public FlipGameMenu(Handle:FlipGameHandle, MenuAction:action, client, param2)
{
	if (action == MenuAction_End)
	{
		CloseHandle(FlipGameHandle);
		return; 
	}
	if (action == MenuAction_Select)
	{
		new String:info[64];
		GetMenuItem(FlipGameHandle, param2, info, sizeof(info));
		if(strcmp(info, "StartGame") == 0)
		{
			MoneyGameStartMenu(client);
		}
		else if(strcmp(info, "info") == 0)
		{
			new Handle:InfoMoneyHandle = CreateMenu(InfoMoneyMenu);
			SetMenuTitle(InfoMoneyHandle, "Информация\n \n* Игра 1 на 1\n-Если игрок не принял предложение\nперезайдите на сервер и снова ищите противника!-\n \n");
			AddMenuItem(InfoMoneyHandle, "exit", "Назад");
			SetMenuExitButton(InfoMoneyHandle, false);
			DisplayMenu(InfoMoneyHandle, client, 0);
		}
	}
}

public InfoMoneyMenu(Handle:InfoMoneyHandle, MenuAction:action, client, param2)
{
	if (action == MenuAction_Select)
	{
		new String:info[64];
		GetMenuItem(InfoMoneyHandle, param2, info, sizeof(info));
		if(strcmp(info, "exit") == 0)
		{
			MoneyGameMenu(client);
		}
	}
}

public FlipGameStartMenu(Handle:FlipGameStartHandle, MenuAction:action, client, param2)
{
	if (action == MenuAction_End)
	{
		CloseHandle(FlipGameStartHandle);
		return; 
	}
	if (action == MenuAction_Select)
	{
		new String:info[64];
		GetMenuItem(FlipGameStartHandle, param2, info, sizeof(info));
		if(strcmp(info, "credits") == 0)
		{
			g_CheckChatMoney[client] = 0;
			
			new Handle:ImputSelectionHandle = CreateMenu(ImputSelectionMenu); 
			SetMenuTitle(ImputSelectionHandle, "Выберите тип ввода\n \n");
			AddMenuItem(ImputSelectionHandle, "one", "В чат");
			AddMenuItem(ImputSelectionHandle, "two", "Через меню\n \n");
			AddMenuItem(ImputSelectionHandle, "exit", "Назад");
			SetMenuExitButton(ImputSelectionHandle, true);
			DisplayMenu(ImputSelectionHandle, client, 0);
		}
		else if(strcmp(info, "money") == 0)
		{
			if(g_MoneyItem[client] == 0)
			{
				g_MoneyItem[client] = 1;
			}
			else g_MoneyItem[client] = 0;
			MoneyGameStartMenu(client);
		}
		else if(strcmp(info, "start") == 0)
		{
			if(g_MoneyClient[client] != 0 && Shop_GetClientCredits(client) >= g_MoneyClient[client])
			{
				new player;
				new Handle:ChoicePlayerHandle = CreateMenu(ChoicePlayerMenu); 
				SetMenuTitle(ChoicePlayerHandle, "Выберите Игрока [%i кредитов]:\n \n", g_MoneyClient[client]); 
				decl String:userid[15], String:name[32]; 
				for (new i = 1; i <= MaxClients; i++) 
				{
					if(IsClientInGame(i))
					{
						if (!IsFakeClient(i) && Shop_GetClientCredits(i) >= g_MoneyClient[client] && i != client) 
						{ 
							IntToString(GetClientUserId(i), userid, 15); 
							GetClientName(i, name, 32); 
							AddMenuItem(ChoicePlayerHandle, userid, name); 
							player = player + 1;
						}
					}
				} 
				if (player == 0)
				{
					AddMenuItem(ChoicePlayerHandle, "nonplayer", "Нет подходящих игроков");
				}
				DisplayMenu(ChoicePlayerHandle, client, 0); 
			}
			else
			{
				CGOPrintToChat(client, "[{RED}Монетка{DEFAULT}] У вас не достаточно кредитов, либо ставка не может ранятся 0!");
				MoneyGameStartMenu(client);
			}
		}
	}
}

public ImputSelectionMenu(Handle:ImputSelectionHandle, MenuAction:action, client, param2)
{
	if (action == MenuAction_End)
	{
		CloseHandle(ImputSelectionHandle);
		return; 
	}
	if (action == MenuAction_Select)
	{
		new String:info[64];
		GetMenuItem(ImputSelectionHandle, param2, info, sizeof(info));
		if(strcmp(info, "one") == 0)
		{
			g_CheckChatMoney[client] = 1;
			CGOPrintToChat(client, "[{RED}Монетка{DEFAULT}] Введите сумму в чат{DEFAULT}:");
			MoneyGameStartMenu(client);
		}
		else if(strcmp(info, "two") == 0)
		{
			g_MoneyClient[client] = 0;
			CreditsRateMenu(client);
		}
		else if(strcmp(info, "exit") == 0)
		{
			MoneyGameStartMenu(client);
		}
	}
}

public MenuCreditsRateMenu(Handle:MenuCreditsRateHandle, MenuAction:action, client, param2)
{
	if (action == MenuAction_End)
	{
		CloseHandle(MenuCreditsRateHandle);
		return; 
	}
	if (action == MenuAction_Select)
	{
		new String:info[64];
		GetMenuItem(MenuCreditsRateHandle, param2, info, sizeof(info));
		if(strcmp(info, "1") == 0)
		{
			if((Shop_GetClientCredits(client) - g_MoneyClient[client] - 10) >= 0)
			{
				g_MoneyClient[client] = g_MoneyClient[client] + 10;
			}
			else CGOPrintToChat(client, "[{RED}Монетка{DEFAULT}] Не достаточно кредитов!");
			CreditsRateMenu(client);
		}
		else if(strcmp(info, "2") == 0)
		{
			if((Shop_GetClientCredits(client) - g_MoneyClient[client] - 500) >= 0)
			{
				g_MoneyClient[client] = g_MoneyClient[client] + 500;
			}
			else CGOPrintToChat(client, "[{RED}Монетка{DEFAULT}] Не достаточно кредитов!");
			CreditsRateMenu(client);
		}
		else if(strcmp(info, "3") == 0)
		{
			if((Shop_GetClientCredits(client) - g_MoneyClient[client] - 5000) >= 0)
			{
				g_MoneyClient[client] = g_MoneyClient[client] + 5000;
			}
			else CGOPrintToChat(client, "[{RED}Монетка{DEFAULT}] Не достаточно кредитов!");
			CreditsRateMenu(client);
		}
		else if(strcmp(info, "4") == 0)
		{
			if((Shop_GetClientCredits(client) - g_MoneyClient[client] - 50000) >= 0)
			{
				g_MoneyClient[client] = g_MoneyClient[client] + 50000;
			}
			else CGOPrintToChat(client, "[{RED}Монетка{DEFAULT}] Не достаточно кредитов!");
			CreditsRateMenu(client);
		}
		else if(strcmp(info, "5") == 0)
		{
			if((Shop_GetClientCredits(client) - g_MoneyClient[client] - 500000) >= 0)
			{
				g_MoneyClient[client] = g_MoneyClient[client] + 500000;
			}
			else CGOPrintToChat(client, "[{RED}Монетка{DEFAULT}] Не достаточно кредитов!");
			CreditsRateMenu(client);
		}
		else if(strcmp(info, "done") == 0)
		{
			if(Shop_GetClientCredits(client) >= g_MoneyClient[client])
			{
				MoneyGameStartMenu(client);
			}
			else
			{
				CGOPrintToChat(client, "[{RED}Монетка{DEFAULT}] У вас  уже не достаточно кредитов! Ставка равна 0");
				g_MoneyClient[client] = 0;
				MoneyGameStartMenu(client);
			}
		}
	}
}


public ChoicePlayerMenu(Handle:ChoicePlayerHandle, MenuAction:action, client, option) 
{ 
	if (action == MenuAction_End) 
	{ 
		CloseHandle(ChoicePlayerHandle); 
		return; 
	} 
	if (action != MenuAction_Select) 
	{
		return; 
	}
	if (Shop_GetClientCredits(client) >= g_MoneyClient[client])
	{
		CGOPrintToChat(client, "[{RED}Монетка{DEFAULT}] Предложение отправлено");
		decl String:userid[15]; 
		GetMenuItem(ChoicePlayerHandle, option, userid, 15); 
		new target = GetClientOfUserId(StringToInt(userid)); 
		if (target > 0) 
		{
			if(Shop_GetClientCredits(target) >= g_MoneyClient[client])
			{
				g_CheckMoneyGame[client] = 1;
				TargetSaveClient[target] = client;
				TargetFlipSilver[target] = g_MoneyClient[client];
				g_FlipCoinTarget[target] = g_MoneyItem[client];
				new Handle:TargetFlipHandle = CreateMenu(TargetFliChoicePlayerHandle);
				SetMenuTitle(TargetFlipHandle, "-Монетка-\n \nПредложение сыграть с игроком %N\nСтавка [%i кредитов]\nСторона монетки %N [%s]\n \n", client, TargetFlipSilver[target], client, g_FlipCoin[client]); 
				AddMenuItem(TargetFlipHandle, "yes", "Принять предложение");
				AddMenuItem(TargetFlipHandle, "no", "Отказаться от предложения");
				SetMenuExitButton(TargetFlipHandle, false);
				DisplayMenu(TargetFlipHandle, target, 0);
			}
			else
			{
				CGOPrintToChat(client, "[{RED}Монетка{DEFAULT}] У игрока уже нет достаточного количества кредитов!");
				MoneyGameStartMenu(client); 
			}
		} 
		else
		{				
			CGOPrintToChat(client, "[{RED}Монетка{DEFAULT}] Игрок не найден (вышел с сервера)"); 
			MoneyGameStartMenu(client); 
		}
	}
	else
	{
		CGOPrintToChat(client, "[{RED}Монетка{DEFAULT}] У вас не достаточно кредитов!");
		MoneyGameStartMenu(client);
	}
}

public TargetFliChoicePlayerHandle(Handle:TargetFlipHandle, MenuAction:action, client, param2)
{
	if (action == MenuAction_Select)
	{
		int clients;
		clients = TargetSaveClient[client];
		new String:info[64];
		GetMenuItem(TargetFlipHandle, param2, info, sizeof(info));
		if(strcmp(info, "yes") == 0)
		{
			if(IsClientInGame(client) && IsClientInGame(clients))
			{
				if(Shop_GetClientCredits(client) >= TargetFlipSilver[client] && Shop_GetClientCredits(clients) >= TargetFlipSilver[client])
				{
					g_CheckMoneyGame[client] = 1;
					if(g_FlipCoinTarget[client] == 0)
					{
						TargetFlip[client] = "Орёл";
						TargetFlip1[client] = "Решка";
					}
					else
					{
						TargetFlip[client] = "Решка";
						TargetFlip1[client] = "Орёл";
					}
					CGOPrintToChat(clients, "[{RED}Монетка{DEFAULT}] {BLUE}%N {DEFAULT}принял предложение", client);
					Shop_SetClientCredits(client, Shop_GetClientCredits(client) - TargetFlipSilver[client]);
					Shop_SetClientCredits(clients, Shop_GetClientCredits(clients) - TargetFlipSilver[client]);
				
					g_TMoney[client] = 10;
					CreateTimer(1.0, MoneyTime, GetClientUserId(client), TIMER_REPEAT);
				}
				else
				{
					CGOPrintToChat(client, "[{RED}Монетка{DEFAULT}] Ошибка!!!");
					CGOPrintToChat(clients, "[{RED}Монетка{DEFAULT}] Ошибка!!!");
					g_CheckMoneyGame[client] = 0;
					g_CheckMoneyGame[TargetSaveClient[client]] = 0;
				}
			}
			else
			{
				if(IsClientInGame(client))
				{
					CGOPrintToChat(client, "[{RED}Монетка{DEFAULT}] Ошибка!!!");
					g_CheckMoneyGame[client] = 0;
				}
				if(IsClientInGame(clients))
				{
					CGOPrintToChat(clients, "[{RED}Монетка{DEFAULT}] Ошибка!!!");
					g_CheckMoneyGame[TargetSaveClient[client]] = 0;
				}
				
			}
		}
		else if(strcmp(info, "no") == 0)
		{
			if(IsClientInGame(clients))
			{
				CGOPrintToChat(clients, "[{RED}Монетка{DEFAULT}] {BLUE}%N {DEFAULT}отказался", client);
				g_CheckMoneyGame[TargetSaveClient[client]] = 0;
			}
		}
	}
}

public Action MoneyTime(Handle timer, any UserId)
{
	new credits;
	char g_mText[512];
	int iClient = GetClientOfUserId(UserId);
	credits = (TargetFlipSilver[iClient] + TargetFlipSilver[iClient]);
	if(g_TMoney[iClient] != 0)
	{
		if(IsClientInGame(iClient))
		{
			Format(g_mText,sizeof(g_mText), "<font size='16'> <center>★★★★★★★Монетка★★★★★★★</center>\nВы [%s] Vs Противник [%s]\nНа кону %i кредитов\nДо спина %i секунд</font>",TargetFlip[iClient], TargetFlip1[iClient], credits, g_TMoney[iClient]);
			PrintHintText(iClient, g_mText);
		}
		if(iClient && IsClientInGame(iClient))
		{
			Format(g_mText,sizeof(g_mText), "<font size='16'> <center>★★★★★★★Монетка★★★★★★★</center>\nПротивник [%s] Vs Вы [%s]\nНа кону %i кредитов\nДо спина %i секунд</font>",TargetFlip[iClient], TargetFlip1[iClient], credits, g_TMoney[iClient]);
			PrintHintText(TargetSaveClient[iClient], g_mText);
		}
		g_TMoney[iClient] = g_TMoney[iClient] - 1;
		return Plugin_Continue;
	}
	else
	{
		new i = GetRandomInt(0, 1);
		char MoneyWin[64];
		if (i == 0)
		{
			MoneyWin = "Решку";
		}
		else
		{
			MoneyWin = "Орла";
		}
		if(iClient)
		{
			Format(g_mText,sizeof(g_mText), "<font size='16'> <center>★★★★★★★Монетка★★★★★★★</center>\nВы [%s] Vs Противник [%s]\nНа кону %i кредитов\nМонетка повернулась на %s</font>",TargetFlip[iClient], TargetFlip1[iClient], credits, MoneyWin);
			PrintHintText(iClient, g_mText);
		}
		if(TargetSaveClient[iClient])
		{
			Format(g_mText,sizeof(g_mText), "<font size='16'> <center>★★★★★★★Монетка★★★★★★★</center>\nПротивник [%s] Vs Вы [%s]\nНа кону %i кредитов\nМонетка повернулась на %s</font>",TargetFlip[iClient], TargetFlip1[iClient], credits, MoneyWin);
			PrintHintText(TargetSaveClient[iClient], g_mText);
		}
		if (i == 0)
		{
			if(g_FlipCoinTarget[iClient] == 0)
			{
				if(IsClientInGame(TargetSaveClient[iClient]))
				{
					Shop_SetClientCredits(TargetSaveClient[iClient], Shop_GetClientCredits(TargetSaveClient[iClient]) + credits);
					CGOPrintToChat(TargetSaveClient[iClient], "[{RED}Монетка{DEFAULT}] Вы выиграли {RED}%i {DEFAULT}кредитов", credits);
					CGOPrintToChatAll("[{RED}Монетка{DEFAULT}] {BLUE}%N {DEFAULT}выиграл {RED}%i {DEFAULT}кредитов у {BLUE}%N",TargetSaveClient[iClient], credits, iClient);
				}
				if(IsClientInGame(iClient))
				{
					CGOPrintToChat(iClient, "[{RED}Монетка{DEFAULT}] Вы проиграли в битве. Выпала {RED}Решка");
				}
			}
			else
			{
				if(iClient && IsClientInGame(iClient))
				{
					Shop_SetClientCredits(iClient, Shop_GetClientCredits(iClient) + credits);
					CGOPrintToChat(iClient, "[{RED}Монетка{DEFAULT}] Вы выиграли {RED}%i {DEFAULT}кредитов", credits);
					CGOPrintToChatAll("[{RED}Монетка{DEFAULT}] {BLUE}%N {DEFAULT}выиграл {RED}%i {DEFAULT}кредитов у {BLUE}%N",iClient, credits, TargetSaveClient[iClient]);
				}
				if(IsClientInGame(TargetSaveClient[iClient]))
				{
					CGOPrintToChat(TargetSaveClient[iClient], "[{RED}Монетка{DEFAULT}] Вы проиграли в битве. Выпала {RED}Решка");
				}
			}
		}
		if (i == 1)
		{
			if(g_FlipCoinTarget[iClient] == 1)
			{
				if(TargetSaveClient[iClient] && IsClientInGame(TargetSaveClient[iClient]))
				{
					Shop_SetClientCredits(TargetSaveClient[iClient], Shop_GetClientCredits(TargetSaveClient[iClient]) + credits);
					CGOPrintToChat(TargetSaveClient[iClient], "[{RED}Монетка{DEFAULT}] Вы выиграли {RED}%i {DEFAULT}кредитов", credits);
					CGOPrintToChatAll("[{RED}Монетка{DEFAULT}] {BLUE}%N {DEFAULT}выиграл {RED}%i {DEFAULT}кредитов у {BLUE}%N",TargetSaveClient[iClient], credits, iClient);
				}
				if(iClient && IsClientInGame(iClient))
				{
					CGOPrintToChat(iClient, "[{RED}Монетка{DEFAULT}] Вы проиграли в битве. Выпал {RED}Орёл");
				}
			}
			else
			{
				if(iClient)
				{
					Shop_SetClientCredits(iClient, Shop_GetClientCredits(iClient) + credits);
					CGOPrintToChat(iClient, "[{RED}Монетка{DEFAULT}] Вы выиграли {RED}%i {DEFAULT}кредитов", credits);
					CGOPrintToChatAll("[{RED}Монетка{DEFAULT}] {BLUE}%N {DEFAULT}выиграл {RED}%i {DEFAULT}кредитов у {BLUE}%N",iClient, credits, TargetSaveClient[iClient]);
				}
				if(IsClientInGame(TargetSaveClient[iClient]))
				{
					CGOPrintToChat(TargetSaveClient[iClient], "[{RED}Монетка{DEFAULT}] Вы проиграли в битве. Выпал {RED}Орёл");
				}
			}
		}
	}
	g_CheckMoneyGame[iClient] = 0;
	g_CheckMoneyGame[TargetSaveClient[iClient]] = 0;
	return Plugin_Stop;
}

public Say(Handle:event, const String:name[], bool:dontBroadcast) 
{ 
	new i = GetClientOfUserId(GetEventInt(event, "userid")); 
	decl String:text[64];
	if(g_CheckChatMoney[i] == 1)
	{
		GetEventString(event, "text", text, sizeof(text));
		g_MoneyClient[i] = StringToInt(text);
		if(g_MoneyClient[i] > 0)
		{
			if(Shop_GetClientCredits(i) < g_MoneyClient[i])
			{
				CGOPrintToChat(i,"[{RED}Монетка{DEFAULT}] У вас не достаточно кредитов");
				g_MoneyClient[i] = 0;
			}
		}
		else
		{
			CGOPrintToChat(i,"[{RED}Монетка{DEFAULT}] Не правильное число");
			g_MoneyClient[i] = 0;
		}
		g_CheckChatMoney[i] = 0;
		MoneyGameStartMenu(i);
	}
}

public OnClientPostAdminCheck(iClient)
{
	g_CheckMoneyGame[iClient] = 0;
	g_CheckChatMoney[iClient] = 0;
	g_MoneyClient[iClient] = 0;
}