/*
	TRADE
*/

#include <YSI_Coding\y_hooks>

#define TRADE_ITEM_NONE				(0)
#define TRADE_ITEM_MONEY			(1)
#define TRADE_ITEM_VEHICLE          (2)
#define TRADE_ITEM_HOUSE 			(3)
#define TRADE_ITEM_BIZ              (4)

#define TRADE_CANCEL_QUIT			(1)
#define TRADE_CANCEL_DEATH			(2)
#define TRADE_CANCEL_ESC			(3)
#define TRADE_CANCEL_DONE			(4)

enum E_TRADE_VARS
{
	bool:TradeStarted,
	TradeOffer,
	TradePlayer,
	TradeDelay,
	TradeItemType[5],
	TradeItemAmount[5],

	bool:TradeConfirm,
	TradeEndTime,
}

new tradeVariables[MAX_PLAYERS][E_TRADE_VARS],
	Iterator:trading<MAX_PLAYERS>;

new Text:TradeTD[17],
	PlayerText:TradePTD[MAX_PLAYERS][32];

hook OnGameModeInit()
{
	CreateTradeTextdraws();
}

hook OnPlayerConnect(playerid)
{
	CreateTradeTextdraws(playerid);

	ResetTradeVariables(playerid);
}

hook OnPlayerDisconnect(playerid, reason)
{
	if(tradeVariables[playerid][TradeStarted])
	{
		CallLocalFunction("OnPlayerCancelTrade", "ii", playerid, TRADE_CANCEL_QUIT);
	}
}

hook OnPlayerSpawn(playerid)
{
	if(tradeVariables[playerid][TradeStarted])
	{
		CallLocalFunction("OnPlayerCancelTrade", "ii", playerid, TRADE_CANCEL_DEATH);
	}
}

hook OnPlayerDeath(playerid, killerid, reason)
{
	if(tradeVariables[playerid][TradeStarted])
	{
		CallLocalFunction("OnPlayerCancelTrade", "ii", playerid, TRADE_CANCEL_DEATH);
	}
} 

hook OnPlayerClickTextDraw(playerid, Text:clickedid)
{
	if(tradeVariables[playerid][TradeStarted])
	{
		if(clickedid == Text:INVALID_TEXT_DRAW)
		{
			CallLocalFunction("OnPlayerCancelTrade", "ii", playerid, TRADE_CANCEL_ESC);
		}

		else if(clickedid == TradeTD[13])
		{
			if(GetPlayerTradeItems(playerid) == 5) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You can't add more than 5 items.");

			return AddTradeItem(playerid);
		}

		else if(clickedid == TradeTD[14])
		{
			if(GetPlayerTradeItems(playerid) == 0) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You don't have any item added to the trade.");
			if(tradeVariables[playerid][TradeConfirm]) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You can't delete your items right now.");

			return RemoveTradeItems(playerid);
		}

		else if(clickedid == TradeTD[15])
		{
			if(GetPlayerTradeItems(playerid) == 0) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You don't have any item added to the trade.");
			if(GetPlayerTradeItems(tradeVariables[playerid][TradePlayer]) == 0) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"That player doesn't have any item added.");
		
			TextDrawHideForPlayer(playerid, TradeTD[15]);
			TextDrawShowForPlayer(playerid, TradeTD[16]);

			new who = tradeVariables[playerid][TradePlayer];
			SCM(playerid, COLOR_YELLOW, "* %s is ready to do the trade.", GetName(playerid));
			SCM(who, COLOR_YELLOW, "* %s is ready to do the trade.", GetName(playerid));

			tradeVariables[playerid][TradeConfirm] = true;

			if(tradeVariables[playerid][TradeConfirm] == true && tradeVariables[who][TradeConfirm] == true)
			{
				if(tradeVariables[playerid][TradeEndTime] == 0)
				{
					tradeVariables[playerid][TradeEndTime] = 10;

					PlayerTextDrawSetString(playerid, TradePTD[playerid][0], "trade ends in: ~b~~h~00:10");
					PlayerTextDrawShow(playerid, TradePTD[playerid][0]);

					PlayerTextDrawSetString(who, TradePTD[who][0], "trade ends in: ~b~~h~00:10");
					PlayerTextDrawShow(who, TradePTD[who][0]);

					SCM(playerid, COLOR_YELLOW, "The trade will be ended in 10 seconds.");
					SCM(who, COLOR_YELLOW, "The trade will be ended in 10 seconds.");

					Iter_Add(trading, playerid);
				}
			}
		}

		else if(clickedid == TradeTD[16])
		{
			TextDrawHideForPlayer(playerid, TradeTD[16]);
			TextDrawShowForPlayer(playerid, TradeTD[15]);

			new who = tradeVariables[playerid][TradePlayer];
			SCM(playerid, COLOR_YELLOW, "* %s canceled the trade.", GetName(playerid));
			SCM(who, COLOR_YELLOW, "* %s canceled the trade.", GetName(playerid));

			tradeVariables[playerid][TradeConfirm] = false;

			if(tradeVariables[playerid][TradeEndTime] > 0)
			{
				tradeVariables[playerid][TradeEndTime] = tradeVariables[who][TradeEndTime] = 0;
				PlayerTextDrawHide(playerid, TradePTD[playerid][0]);
				PlayerTextDrawHide(who, TradePTD[who][0]);

				SetTimerEx("remove_from_trade_iter", 250, false, "i", playerid);
				SetTimerEx("remove_from_trade_iter", 250, false, "i", who);
			}
		}
	}

	return 1;
}

CB:remove_from_trade_iter(playerid)
{
	Iter_Remove(trading, playerid);
	return 1;
}

CB:OnPlayerCancelTrade(playerid, reason)
{
	new who = tradeVariables[playerid][TradePlayer];
	SetTimerEx("remove_from_trade_iter", 250, false, "i", playerid);
	SetTimerEx("remove_from_trade_iter", 250, false, "i", who);

	if(IsPlayerConnected(who))
	{
		ResetTradeVariables(who);
		HideTradeTextdraws(who);

		switch(reason)
		{
			case TRADE_CANCEL_QUIT:
			{
				SCM(who, COLOR_GREY, "Trade canceled - %s left the server.", GetName(playerid));
			}

			case TRADE_CANCEL_DEATH:
			{
				SCM(who, COLOR_GREY, "Trade canceled - %s died.", GetName(playerid));
				SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"Trade canceled. You died!");
			}

			case TRADE_CANCEL_ESC:
			{
				SCM(who, COLOR_GREY, "Trade canceled - %s denied the deal.", GetName(playerid));
				SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"Trade canceled.");
			}	
		}
	}

	ResetTradeVariables(playerid);

	if(reason != TRADE_CANCEL_QUIT) HideTradeTextdraws(playerid);
}

CB:OnPlayerAcceptsTrade(playerid, who)
{
	if(tradeVariables[playerid][TradeOffer] == INVALID_PLAYER_ID) return SCM(playerid, COLOR_GREY, "Nobody has sent you an offer.");
	if(tradeVariables[playerid][TradeOffer] != who) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"That player didn't sent you an invite.");

	if(IsPlayerInTrade(who)) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"That player is already in a trade.");

	tradeVariables[who][TradePlayer] = playerid;
	tradeVariables[playerid][TradePlayer] = who;

	tradeVariables[who][TradeStarted] = true;
	tradeVariables[playerid][TradeStarted] = true;

	for(new x; x < 3; x++)
	{
		TextDrawShowForPlayer(playerid, TradeTD[x]);
		TextDrawShowForPlayer(who, TradeTD[x]);
	}

	new textdraw[64];
	format(textdraw, sizeof(textdraw), "%s's items", GetName(who));
	PlayerTextDrawSetString(playerid, TradePTD[playerid][31], textdraw);

	format(textdraw, sizeof(textdraw), "%s's items", GetName(playerid));
	PlayerTextDrawSetString(who, TradePTD[who][31], textdraw);

	PlayerTextDrawShow(playerid, TradePTD[playerid][31]);
	PlayerTextDrawShow(who, TradePTD[who][31]);

	for(new x = 13; x <= 15; x++)
	{
		TextDrawShowForPlayer(playerid, TradeTD[x]);
		TextDrawShowForPlayer(who, TradeTD[x]);
	}

	SelectTextDraw(playerid, COLOR_WHITE);
	SelectTextDraw(who, COLOR_WHITE);

	SCM(who, COLOR_YELLOW, ">> %s (%d) accepted your trade invitation.", GetName(playerid), playerid);
	SCM(playerid, COLOR_YELLOW, "You accepted %s's trade invitation.", GetName(who));
	return 1;
}

CB:OnPlayerFinishTrade(playerid)
{
	new who = tradeVariables[playerid][TradePlayer], log[256];
	SCM(who, COLOR_YELLOW, "Ai finalizat schimbul cu %s si ai primit:", GetName(playerid));

	format(log, sizeof(log), "%s[user:%d] made a deal with %s[user:%d], items exchanged: (", GetName(playerid), playerVariables[playerid][pSQLID], GetName(who), playerVariables[who][pSQLID]);
	new amount = GetTradeItemCount(playerid, TRADE_ITEM_MONEY);
	if(amount > 0)
	{
        SubstractBigInt(playerVariables[playerid][pCashStore], playerVariables[playerid][pCash], amount);
        AddBigInt(playerVariables[who][pCashStore], playerVariables[who][pCash], amount);

		SCM(who, COLOR_YELLOW, ">> $%s", FormatNumber(amount));

		for(new x; x < 5; x++)
		{
			if(tradeVariables[playerid][TradeItemType][x] == TRADE_ITEM_MONEY)
			{
				tradeVariables[playerid][TradeItemType][x] = TRADE_ITEM_NONE;
			}
		}

		if(GetPlayerTradeItems(playerid) == 0) format(log, sizeof(log), "%s$%s)", log, FormatNumber(amount));
		else format(log, sizeof(log), "%s$%s, ", log, FormatNumber(amount));
	}

    amount = GetTradeItemCount(playerid, TRADE_ITEM_VEHICLE);
	if(amount > 0)
	{
        for(new x; x < 5; x++)
		{
			if(tradeVariables[playerid][TradeItemType][x] == TRADE_ITEM_VEHICLE)
			{
                new dbid = tradeVariables[playerid][TradeItemAmount][x];

                //aici transfer
                sendVehicleFromPlayerToPlayer(playerid, who, dbid);

                SCM(who, COLOR_YELLOW, ">> %s (ID %d)", vehNames[personalVehicles[amount][pvModel] - 400], dbid);

                tradeVariables[playerid][TradeItemType][x] = TRADE_ITEM_NONE;

                if(GetPlayerTradeItems(playerid) == 0) format(log, sizeof(log), "%s%s[car:%d])", log, vehNames[personalVehicles[amount][pvModel] - 400], dbid);
                else format(log, sizeof(log), "%s%s[car:%d], ", log, vehNames[personalVehicles[amount][pvModel] - 400], dbid);
            }
        }
	}

	amount = GetTradeItemCount(playerid, TRADE_ITEM_HOUSE);
	if(amount > 0)
	{
		for(new x; x < 5; x++)
		{
			if(tradeVariables[playerid][TradeItemType][x] == TRADE_ITEM_HOUSE)
			{
				new house = tradeVariables[playerid][TradeItemAmount][x];
				removePlayerHouse(playerid, house);
                transferHouseToPlayer(who, house);

				tradeVariables[playerid][TradeItemType][x] = TRADE_ITEM_NONE;

				SCM(who, COLOR_YELLOW, ">> House %d", house);

                if(GetPlayerTradeItems(playerid) == 0) format(log, sizeof(log), "%s[house:%d])", log, house);
                else format(log, sizeof(log), "%s[house:%d], ", log, house);

				break;
			}
		}
	}

    amount = GetTradeItemCount(playerid, TRADE_ITEM_BIZ);
	if(amount > 0)
	{
		for(new x; x < 5; x++)
		{
			if(tradeVariables[playerid][TradeItemType][x] == TRADE_ITEM_BIZ)
			{
				new house = tradeVariables[playerid][TradeItemAmount][x];
				transferBusinessToPlayer(who, house);

				tradeVariables[playerid][TradeItemType][x] = TRADE_ITEM_NONE;

				SCM(who, COLOR_YELLOW, ">> Business %d", house);

                if(GetPlayerTradeItems(playerid) == 0) format(log, sizeof(log), "%s[biz:%d])", log, house);
                else format(log, sizeof(log), "%s[biz:%d], ", log, house);

				break;
			}
		}
	}

	SCM(playerid, COLOR_YELLOW, "Ai finalizat schimbul cu %s si ai primit:", GetName(who));
	
	strcat(log, " on (");

	amount = GetTradeItemCount(who, TRADE_ITEM_MONEY);
	if(amount > 0)
	{
		SubstractBigInt(playerVariables[who][pCashStore], playerVariables[who][pCash], amount);
        AddBigInt(playerVariables[playerid][pCashStore], playerVariables[playerid][pCash], amount);

		SCM(playerid, COLOR_YELLOW, ">> $%s", FormatNumber(amount));

		for(new x; x < 5; x++)
		{
			if(tradeVariables[who][TradeItemType][x] == TRADE_ITEM_MONEY)
			{
				tradeVariables[who][TradeItemType][x] = TRADE_ITEM_NONE;
			}
		}

		if(GetPlayerTradeItems(who) == 0) format(log, sizeof(log), "%s$%s)", log, FormatNumber(amount));
		else format(log, sizeof(log), "%s$%s, ", log, FormatNumber(amount));
	}

    amount = GetTradeItemCount(who, TRADE_ITEM_VEHICLE);
	if(amount > 0)
	{
        for(new x; x < 5; x++)
		{
			if(tradeVariables[who][TradeItemType][x] == TRADE_ITEM_VEHICLE)
			{
                new dbid = tradeVariables[who][TradeItemAmount][x];

                //aici transfer
                sendVehicleFromPlayerToPlayer(who, playerid, dbid);

                SCM(playerid, COLOR_YELLOW, ">> %s (ID %d)", vehNames[personalVehicles[amount][pvModel] - 400], dbid);

                tradeVariables[who][TradeItemType][x] = TRADE_ITEM_NONE;

                if(GetPlayerTradeItems(who) == 0) format(log, sizeof(log), "%s%s[car:%d])", log, vehNames[personalVehicles[amount][pvModel] - 400], dbid);
                else format(log, sizeof(log), "%s%s[car:%d], ", log, vehNames[personalVehicles[amount][pvModel] - 400], dbid);
            }
        }
	}

	amount = GetTradeItemCount(who, TRADE_ITEM_HOUSE);
	if(amount > 0)
	{
		for(new x; x < 5; x++)
		{
			if(tradeVariables[who][TradeItemType][x] == TRADE_ITEM_HOUSE)
			{
				new house = tradeVariables[who][TradeItemAmount][x];
				removePlayerHouse(who, house);
                transferHouseToPlayer(playerid, house);

				SCM(playerid, COLOR_YELLOW, ">> House %d", house);

				tradeVariables[who][TradeItemType][x] = TRADE_ITEM_NONE;

                if(GetPlayerTradeItems(who) == 0) format(log, sizeof(log), "%s[house:%d])", log, house);
                else format(log, sizeof(log), "%s[house:%d], ", log, house);

				break;
			}
		}
	}

    amount = GetTradeItemCount(who, TRADE_ITEM_BIZ);
	if(amount > 0)
	{
		for(new x; x < 5; x++)
		{
			if(tradeVariables[who][TradeItemType][x] == TRADE_ITEM_BIZ)
			{
				new house = tradeVariables[who][TradeItemAmount][x];
                transferBusinessToPlayer(playerid, house);

				SCM(playerid, COLOR_YELLOW, ">> Business %d", house);

				tradeVariables[who][TradeItemType][x] = TRADE_ITEM_NONE;

                if(GetPlayerTradeItems(who) == 0) format(log, sizeof(log), "%s[biz:%d])", log, house);
                else format(log, sizeof(log), "%s[biz:%d], ", log, house);

				break;
			}
		}
	}

	strcat(log, ".");

	SendAdminMessage(COLOR_YELLOW, log);
	CallLocalFunction("OnPlayerCancelTrade", "ii", playerid, TRADE_CANCEL_DONE);
}

CB:OnPlayerAddTradeItem(playerid, item, amount)
{
	if(!IsPlayerInTrade(playerid)) return 1;
	if(tradeVariables[playerid][TradeConfirm] == true) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You can't add items while you confirmed the trade.");
	new who = tradeVariables[playerid][TradePlayer], slot = GetEmptyTradeSlot(playerid);
    if((GetPlayerVehicles(who) + GetTradeItemCount(playerid, TRADE_ITEM_VEHICLE)) >= 20) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"That player doesn't have any empty vehicle slot.");

	tradeVariables[playerid][TradeItemType][slot] = item;
	tradeVariables[playerid][TradeItemAmount][slot] = amount;

	PlayerTextDrawSetPreviewRot(playerid, TradePTD[playerid][1 + slot], 0.0, 0.0, 0.0, 1.0);
	PlayerTextDrawSetPreviewRot(who, TradePTD[who][6 + slot], 0.0, 0.0, 0.0, 1.0);

	new td[128], model, Float:preview_rot[3];
	switch(item)
	{
		case TRADE_ITEM_MONEY:
		{
			model = 1274;
			preview_rot[2] = 180.0;

			format(td, sizeof(td), "$%s", FormatNumber(amount));

			SCM(who, COLOR_GREY, "[TRADE] %s added $%s.", GetName(playerid), FormatNumber(amount));
			SCM(playerid, COLOR_ERROR, "[TRADE] %s added $%s.", GetName(playerid), FormatNumber(amount));
		}

        case TRADE_ITEM_VEHICLE:
        {
            model = personalVehicles[amount][pvModel];
            preview_rot[2] = 45.0;

            new upgrades[32];
            if(personalVehicles[amount][pvVIP]) format(upgrades, 32, "~n~~b~[VIP]");

            format(td, sizeof(td), "~b~~h~~h~%s ~w~~h~(ID %d) - %d/%d~n~%d days - %0.2f km~n~%s", vehNames[personalVehicles[amount][pvModel] - 400], amount, personalVehicles[amount][pvColorOne], personalVehicles[amount][pvColorTwo], CalculateDays(gettime()-personalVehicles[amount][pvAge]), personalVehicles[amount][pvOdometer], upgrades);
            
            PlayerTextDrawSetPreviewVehCol(playerid, TradePTD[playerid][1 + slot], personalVehicles[amount][pvColorOne], personalVehicles[amount][pvColorTwo]);
            PlayerTextDrawSetPreviewVehCol(who, TradePTD[who][6 + slot], personalVehicles[amount][pvColorOne], personalVehicles[amount][pvColorTwo]);

            SCM(who, COLOR_GREY, "[TRADE] %s added vehicle %s (ID %d).", GetName(playerid), vehNames[personalVehicles[amount][pvModel] - 400], amount);
			SCM(playerid, COLOR_ERROR, "[TRADE] %s added vehicle %s (ID %d).", GetName(playerid), vehNames[personalVehicles[amount][pvModel] - 400], amount);
        }

		case TRADE_ITEM_HOUSE:
		{
			model = 1273;
			preview_rot[2] = 180.0;

			format(td, sizeof(td), "house ~b~~h~~h~%d", amount);

			SCM(who, COLOR_GREY, "[TRADE] %s added house %d.", GetName(playerid), amount);
			SCM(playerid, COLOR_ERROR, "[TRADE] %s added house %d.", GetName(playerid), amount);
		}

        case TRADE_ITEM_BIZ:
		{
			model = 1239;
			preview_rot[2] = 180.0;

			format(td, sizeof(td), "business ~b~~h~~h~%d", amount);

			SCM(who, COLOR_GREY, "[TRADE] %s added business %d.", GetName(playerid), amount);
			SCM(playerid, COLOR_ERROR, "[TRADE] %s added business %d.", GetName(playerid), amount);
		}
	}

	PlayerTextDrawSetPreviewModel(playerid, TradePTD[playerid][1 + slot], model);
	PlayerTextDrawSetPreviewRot(playerid, TradePTD[playerid][1 + slot], preview_rot[0], preview_rot[1], preview_rot[2], 1.0);

	PlayerTextDrawSetPreviewModel(who, TradePTD[who][6 + slot], model);
	PlayerTextDrawSetPreviewRot(who, TradePTD[who][6 + slot], preview_rot[0], preview_rot[1], preview_rot[2], 1.0);

	PlayerTextDrawShow(playerid, TradePTD[playerid][1 + slot]);
	PlayerTextDrawShow(who, TradePTD[who][6 + slot]);

	TextDrawShowForPlayer(playerid, TradeTD[3 + slot]);
	TextDrawShowForPlayer(who, TradeTD[8 + slot]);

	if(item != TRADE_ITEM_VEHICLE)
	{
		if(!isnull(td)) PlayerTextDrawSetString(playerid, TradePTD[playerid][11 + slot], td);
		PlayerTextDrawShow(playerid, TradePTD[playerid][11 + slot]);

		PlayerTextDrawSetString(who, TradePTD[who][16 + slot], td);
		PlayerTextDrawShow(who, TradePTD[who][16 + slot]);
	}

	else
	{
		if(!isnull(td)) PlayerTextDrawSetString(playerid, TradePTD[playerid][21 + slot], td);
		PlayerTextDrawShow(playerid, TradePTD[playerid][21 + slot]);

		if(!isnull(td)) PlayerTextDrawSetString(who, TradePTD[who][26 + slot], td);
		PlayerTextDrawShow(who, TradePTD[who][26 + slot]);
	}

	return 1;
}

stock GetPlayerTradeItems(playerid)
{
	new count;
	for(new x; x < 5; x++) if(tradeVariables[playerid][TradeItemType][x] != TRADE_ITEM_NONE) count++;
	return count;
}

stock ResetTradeVariables(playerid)
{
	tradeVariables[playerid][TradeOffer] = INVALID_PLAYER_ID;
	tradeVariables[playerid][TradeDelay] = gettime() + 30;
	tradeVariables[playerid][TradePlayer] = INVALID_PLAYER_ID;

	for(new x; x < 5; x++)
	{
		tradeVariables[playerid][TradeItemType][x] = 0;
		tradeVariables[playerid][TradeItemAmount][x] = 0;
	}

	tradeVariables[playerid][TradeConfirm] = tradeVariables[playerid][TradeStarted] = false;
	tradeVariables[playerid][TradeEndTime] = 0;
	return 1;
}

stock RemoveTradeItems(playerid)
{
	new who = tradeVariables[playerid][TradePlayer];

	for(new slot; slot < 5; slot++)
	{
		tradeVariables[playerid][TradeItemType][slot] = TRADE_ITEM_NONE;
		tradeVariables[playerid][TradeItemAmount][slot] = 0;

		TextDrawHideForPlayer(playerid, TradeTD[3 + slot]);
		TextDrawHideForPlayer(who, TradeTD[8 + slot]);

		PlayerTextDrawHide(who, TradePTD[who][6 + slot]);
		PlayerTextDrawHide(who, TradePTD[who][16 + slot]);
		PlayerTextDrawHide(who, TradePTD[who][26 + slot]);

		PlayerTextDrawHide(playerid, TradePTD[playerid][1 + slot]);
		PlayerTextDrawHide(playerid, TradePTD[playerid][11 + slot]);
		PlayerTextDrawHide(playerid, TradePTD[playerid][21 + slot]);
	}

	SCM(who, COLOR_GREY, "[TRADE] %s deleted his items.", GetName(playerid));
	SCM(playerid, COLOR_ERROR, "[TRADE] %s deleted his items.", GetName(playerid));
	return 1;
}

stock CreateTradeTextdraws(playerid = INVALID_PLAYER_ID)
{
	new Float:x_coords, Float:y_coords;

	if(playerid != INVALID_PLAYER_ID)
	{
		TradePTD[playerid][0] = CreatePlayerTextDraw(playerid, 320.000000, 131.000000, "trade ends in: ~b~~h~XX:XX");
		PlayerTextDrawFont(playerid, TradePTD[playerid][0], 3);
		PlayerTextDrawLetterSize(playerid, TradePTD[playerid][0], 0.262499, 1.299998);
		PlayerTextDrawTextSize(playerid, TradePTD[playerid][0], 400.000000, 123.500000);
		PlayerTextDrawSetOutline(playerid, TradePTD[playerid][0], 1);
		PlayerTextDrawAlignment(playerid, TradePTD[playerid][0], 2);
		PlayerTextDrawBackgroundColor(playerid, TradePTD[playerid][0], 255);
		PlayerTextDrawUseBox(playerid, TradePTD[playerid][0], false);
		PlayerTextDrawSetProportional(playerid, TradePTD[playerid][0], true);

		x_coords = 133.666666;
		y_coords = 162.666666;

		for(new x = 1; x <= 10; x++)
		{
			TradePTD[playerid][x] = CreatePlayerTextDraw(playerid, x_coords, y_coords, "Preview_Model");
			PlayerTextDrawFont(playerid, TradePTD[playerid][x], 5);
			PlayerTextDrawLetterSize(playerid, TradePTD[playerid][x], 0.600000, 2.000000);
			PlayerTextDrawTextSize(playerid, TradePTD[playerid][x], 39.000000, 48.000000);
			PlayerTextDrawAlignment(playerid, TradePTD[playerid][x], 1);
			PlayerTextDrawBackgroundColor(playerid, TradePTD[playerid][x], -2016478642);
			PlayerTextDrawBoxColor(playerid, TradePTD[playerid][x], -2016478465);
			PlayerTextDrawSetProportional(playerid, TradePTD[playerid][x], true);
			PlayerTextDrawSetPreviewModel(playerid, TradePTD[playerid][x], 1274);
			PlayerTextDrawSetPreviewRot(playerid, TradePTD[playerid][x], 5.000000, 0.000000, 180.000000, 1.000000);
			PlayerTextDrawSetPreviewVehCol(playerid, TradePTD[playerid][x], 1, 1);

			y_coords += 48.666666;

			if(x == 5)
			{
				x_coords = 333.666666;
				y_coords = 162.666666;
			}
		}

		x_coords = 179.0;
		y_coords = 182.0;

		for(new x = 11; x <= 30; x++)
		{
			TradePTD[playerid][x] = CreatePlayerTextDraw(playerid, x_coords, y_coords, "PROP AMOUNT");
			PlayerTextDrawFont(playerid, TradePTD[playerid][x], 2);
			PlayerTextDrawLetterSize(playerid, TradePTD[playerid][x], 0.129166, 0.949998);

			if((x > 15 && x <= 20) || (x > 25 && x <= 30)) PlayerTextDrawTextSize(playerid, TradePTD[playerid][x], 500.0, 134.5);
			else PlayerTextDrawTextSize(playerid, TradePTD[playerid][x], 295.0, 134.5);
			
			PlayerTextDrawSetOutline(playerid, TradePTD[playerid][x], 1);
			PlayerTextDrawAlignment(playerid, TradePTD[playerid][x], 1);
			PlayerTextDrawColor(playerid, TradePTD[playerid][x], -1);
			PlayerTextDrawBackgroundColor(playerid, TradePTD[playerid][x], 255);
			PlayerTextDrawUseBox(playerid, TradePTD[playerid][x], false);
			PlayerTextDrawSetProportional(playerid, TradePTD[playerid][x], true);

			y_coords += 48.666666;

			if(x == 15)
			{
				x_coords = 379.0;
				y_coords = 182.0;
			}

			if(x == 20)
			{
				x_coords = 179.0;
				y_coords = 175.0;
			}

			if(x == 25)
			{
				x_coords = 379.0;
				y_coords = 175.0;
			}
		}

		TradePTD[playerid][31] = CreatePlayerTextDraw(playerid, 420.000000, 148.333328, "X's items");
		PlayerTextDrawFont(playerid, TradePTD[playerid][31], 2);
		PlayerTextDrawLetterSize(playerid, TradePTD[playerid][31], 0.191666, 1.399999);
		PlayerTextDrawTextSize(playerid, TradePTD[playerid][31], 400.000000, 170.000000);
		PlayerTextDrawSetOutline(playerid, TradePTD[playerid][31], 1);
		PlayerTextDrawAlignment(playerid, TradePTD[playerid][31], 2);
		PlayerTextDrawColor(playerid, TradePTD[playerid][31], -1);
		PlayerTextDrawBackgroundColor(playerid, TradePTD[playerid][31], 255);
		PlayerTextDrawBoxColor(playerid, TradePTD[playerid][31], 0x349AFBFF);
		PlayerTextDrawUseBox(playerid, TradePTD[playerid][31], true);
		PlayerTextDrawSetProportional(playerid, TradePTD[playerid][31], true);
	}

	else
	{
		TradeTD[0] = TextDrawCreate(220.000000, 148.333328, "~w~~h~Your items");
		TextDrawFont(TradeTD[0], 2);
		TextDrawLetterSize(TradeTD[0], 0.191666, 1.399999);
		TextDrawTextSize(TradeTD[0], 400.000000, 170.000000);
		TextDrawSetOutline(TradeTD[0], 1);
		TextDrawAlignment(TradeTD[0], 2);
		TextDrawBackgroundColor(TradeTD[0], 255);
		TextDrawBoxColor(TradeTD[0], 0x349AFBFF);
		TextDrawUseBox(TradeTD[0], true);
		TextDrawSetProportional(TradeTD[0], true);

		for(new x = 1; x <= 2; x++)
		{
			TradeTD[x] = TextDrawCreate(x == 1 ? 220.0 : 420.0, 164.000000, "_");
			TextDrawFont(TradeTD[x], 1);
			TextDrawLetterSize(TradeTD[x], 0.600000, 26.739999);
			TextDrawTextSize(TradeTD[x], 298.500000, 170.000000);
			TextDrawAlignment(TradeTD[x], 2);
			TextDrawBackgroundColor(TradeTD[x], 255);
			TextDrawBoxColor(TradeTD[x], 88);
			TextDrawUseBox(TradeTD[x], true);
			TextDrawSetProportional(TradeTD[x], true);
		}


		x_coords = 220.0;
		y_coords = 164.0;

		for(new x = 3; x <= 12; x++)
		{
			TradeTD[x] = TextDrawCreate(x_coords, y_coords, "_");
			TextDrawFont(TradeTD[x], 1);
			TextDrawLetterSize(TradeTD[x], 0.600000, 5.000000);
			TextDrawTextSize(TradeTD[x], 298.500000, 170.000000);
			TextDrawAlignment(TradeTD[x], 2);
			TextDrawBackgroundColor(TradeTD[x], 255);
			TextDrawBoxColor(TradeTD[x], 135);
			TextDrawUseBox(TradeTD[x], true);
			TextDrawSetProportional(TradeTD[x], true);

			y_coords += 48.666666;

			if(x == 7)
			{
				x_coords = 420.0;
				y_coords = 164.0;
			}
		}

		x_coords = 220.0;
		for(new x = 13; x <= 14; x++)
		{
			TradeTD[x] = TextDrawCreate(x_coords, 411.333312, x == 13 ? "ADD ITEM" : "REMOVE ITEMS");
			TextDrawFont(TradeTD[x], 2);
			TextDrawLetterSize(TradeTD[x], 0.191666, 1.399999);
			TextDrawTextSize(TradeTD[x], 15.000000, 66.000000);
			TextDrawSetOutline(TradeTD[x], 1);
			TextDrawAlignment(TradeTD[x], 2);
			TextDrawBackgroundColor(TradeTD[x], 255);
			TextDrawBoxColor(TradeTD[x], x == 13 ? 9109754 : -1962934022);
			TextDrawUseBox(TradeTD[x], true);
			TextDrawSetProportional(TradeTD[x], true);
			TextDrawSetSelectable(TradeTD[x], true);

			x_coords += 100;
		}

		for(new x = 15; x <= 16; x++)
		{
			TradeTD[x] = TextDrawCreate(420.000000, 411.333312, x == 15 ? "READY" : "CANCEL");
			TextDrawFont(TradeTD[x], 2);
			TextDrawLetterSize(TradeTD[x], 0.191666, 1.399999);
			TextDrawTextSize(TradeTD[x], 15.000000, 66.000000);
			TextDrawSetOutline(TradeTD[x], 1);
			TextDrawAlignment(TradeTD[x], 2);
			TextDrawBackgroundColor(TradeTD[x], 255);
			TextDrawBoxColor(TradeTD[x], x == 15 ? -2686726 : -764862726);
			TextDrawUseBox(TradeTD[x], true);
			TextDrawSetProportional(TradeTD[x], true);
			TextDrawSetSelectable(TradeTD[x], true);
		}
	}
}

stock HideTradeTextdraws(playerid)
{
	for(new x; x < 17; x++)
	{
		TextDrawHideForPlayer(playerid, TradeTD[x]);
	}

	for(new x; x < 32; x++)
	{
		PlayerTextDrawHide(playerid, TradePTD[playerid][x]);
	}

	CancelSelectTextDraw(playerid);

	return 1;
}

stock HasItemInTrade(playerid, item)
{
	new bool:exist = false;
	for(new x; x < 5; x++)
	{
		if(tradeVariables[playerid][TradeItemType][x] == item) 
		{
			exist = true;
			break;
		}
	}
	return exist;
}

stock GetEmptyTradeSlot(playerid)
{
	new slot = -1;
	for(new x; x < 5; x++) 
	{
		if(tradeVariables[playerid][TradeItemType][x] == TRADE_ITEM_NONE)
		{
			slot = x;
			break;
		}
	}

	return slot;
}

stock GetTradeItemCount(playerid, type, amount = 0)
{
	new count;
	for(new x; x < 5; x++)
	{
		if(tradeVariables[playerid][TradeItemType][x] == type && amount == 0)
		{
			count += tradeVariables[playerid][TradeItemAmount][x];
		}

		else if(amount > 0)
		{
			if(tradeVariables[playerid][TradeItemAmount][x] == amount)
			{
				count++;
			}
		}
	}
	return count;
}

stock AddTradeItem(playerid)
{	
	if(tradeVariables[playerid][TradeConfirm] == true) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You can't add items while you confirmed the trade.", "Nu mai poti adauga iteme in timp ce ai confirmat trade-ul.");
	if(GetEmptyTradeSlot(playerid) == -1) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You already have 5 items added.", "Ai deja 5 iteme adaugate.");

	return ShowDialog(playerid, DIALOG_TRADE_ADD, DIALOG_STYLE_TABLIST_HEADERS, "SERVER: Add item to trade", "Choose the item you want to add:\nMoney\nVehicle\nHouse\nBusiness", "Select", "Cancel");
}

stock IsPlayerInTrade(playerid)
{
	return tradeVariables[playerid][TradeStarted];
}

CB:DIALOG_TRADE_ADD(playerid, dialogid, response, listitem, inputtext[])
{
	if(!response) return 1;
	if(tradeVariables[playerid][TradeConfirm] == true) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You can't add items while you confirmed the trade.", "Nu mai poti adauga iteme in timp ce ai confirmat trade-ul.");

	switch(listitem)
	{
		// money
		case 0:
		{
			if(HasItemInTrade(playerid, TRADE_ITEM_MONEY)) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You can add money only one time.");

			new caption[128];
			format(caption, sizeof(caption), "Enter here the amount that you want to add:\n\nYou have $%s.", FormatNumber(GetPlayerCash(playerid))); 

			ShowDialog(playerid, DIALOG_TRADE_ADD_CASH, DIALOG_STYLE_INPUT, "SERVER: Add cash to trade", caption, "Add", "Exit");
		}

        case 1:
        {
            if(GetPlayerVehicles(playerid) == 0) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You don't have any personal vehicle.");

            for(new x; x < 20; x++) masinite[playerid][x] = 0;

            gDialog[0] = EOS;
	        format(gDialog, sizeof(gDialog), "No.\tVehicle\tStatus\tID\n");
            new count;
            for(new i; i < 20; i++) {
                if(playerVariables[playerid][pVehicles][i] > 0) {
                    for(new x; x < 20; x++) if(masinite[playerid][x] == 0) {
                        masinite[playerid][x] = playerVariables[playerid][pVehicles][i];	
                        break;
                    }

                    count++;

                    if(personalVehicles[playerVariables[playerid][pVehicles][i]][pvSpawnID] != INVALID_VEHICLE_ID) format(gDialog, sizeof(gDialog), "%s%d\t%s\t"EMBED_DARKGREEN"spawned\t%d\n", gDialog, count, vehNames[personalVehicles[playerVariables[playerid][pVehicles][i]][pvModel]-400], personalVehicles[playerVariables[playerid][pVehicles][i]][pvSpawnID]);
                    else format(gDialog, sizeof(gDialog), "%s%d\t%s\t"EMBED_DARKRED"not spawned\t"EMBED_WHITE"not spawned\n", gDialog, count, vehNames[personalVehicles[playerVariables[playerid][pVehicles][i]][pvModel]-400]);
                }
            }

	        Dialog_ShowCallback(playerid, using public DIALOG_TRADE_ADD_VEHICLE<iiiis>, DIALOG_STYLE_TABLIST_HEADERS, ""EMBED_SERVER"omega.ro: "EMBED_WHITE"Your vehicles", gDialog, "Select", "Cancel");
        }

		case 2:
		{
			if(HasItemInTrade(playerid, TRADE_ITEM_HOUSE)) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You can add only one house.");

			if(!GetPlayerHouses(playerid)) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You don't have a house.");
            
            for(new x; x < 5; x++) casuta[playerid][x] = 0;

            gDialog[0] = EOS;
            for(new i; i < 5; i++) {
                if(playerVariables[playerid][pHouses][i] > 0) {
                    for(new x; x < 5; x++) if(casuta[playerid][x] == 0) {
                        casuta[playerid][x] = playerVariables[playerid][pHouses][i];	
                        break;
                    }
                    
                    format(gDialog, sizeof(gDialog), "%sHouse "EMBED_SERVER"%d "EMBED_WHITE"(%s) - safe balance: "EMBED_SERVER"$%s "EMBED_WHITE"\n", gDialog, playerVariables[playerid][pHouses][i], house_sizes(housesVariables[playerVariables[playerid][pHouses][i]][hType]), FormatNumber(housesVariables[playerVariables[playerid][pHouses][i]][hSafeBalance]));
                }
            }

            return Dialog_ShowCallback(playerid, using public DIALOG_TRADE_ADD_HOUSE<iiiis>, DIALOG_STYLE_LIST, ""EMBED_SERVER"omega.ro: "EMBED_WHITE"Houses owned by you", gDialog, "Select", "Exit");
		}

        case 3:
        {
            if(HasItemInTrade(playerid, TRADE_ITEM_BIZ)) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You can add only one business.");

			if(!GetPlayerBusinesses(playerid)) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You don't have a business.");

            for(new x; x < 3; x++) biz[playerid][x] = 0;

            new b;
            gDialog[0] = EOS;
            for(new i; i < 3; i++) {
                if(playerVariables[playerid][pBusinesses][i] > 0) {
                    for(new x; x < 3; x++) if(biz[playerid][x] == 0) {
                        biz[playerid][x] = playerVariables[playerid][pBusinesses][i];
                        break;
                    }
                    b = playerVariables[playerid][pBusinesses][i];
                    format(gDialog, sizeof(gDialog), "%sBiz #%d - "EMBED_ADMIN"%s"EMBED_WHITE" - safe: $%s\n", gDialog, b, biz_types[businessVariables[b][bType]], FormatNumber(businessVariables[b][bSafeBalance]));
                }
            }
            return Dialog_ShowCallback(playerid, using public DIALOG_TRADE_ADD_BIZ<iiiis>, DIALOG_STYLE_LIST, ""EMBED_ADMIN"omega.ro: "EMBED_WHITE"Businesses owned by you", gDialog, "Select", "Exit");
        }
	}

	return 1;
}

CB:DIALOG_TRADE_ADD_HOUSE(playerid, dialogid, response, listitem, inputtext[])
{
    if(!response) return 1;
 
    return OnPlayerAddTradeItem(playerid, TRADE_ITEM_HOUSE, casuta[playerid][listitem]);
}

CB:DIALOG_TRADE_ADD_BIZ(playerid, dialogid, response, listitem, inputtext[])
{
    if(!response) return 1;
 
    return OnPlayerAddTradeItem(playerid, TRADE_ITEM_HOUSE, biz[playerid][listitem]);
}

CB:DIALOG_TRADE_ADD_CASH(playerid, dialogid, response, listitem, inputtext[])
{
	if(!response) return 1;

	new amount = strval(inputtext);

	if(amount < 1 || amount > 999999999) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You can add between $1 and $999,999,999.");
	if(GetPlayerCash(playerid) < amount) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You don't have this amount of money.");

	return OnPlayerAddTradeItem(playerid, TRADE_ITEM_MONEY, amount);
}

CB:DIALOG_TRADE_ADD_VEHICLE(playerid, dialogid, response, listitem, inputtext[])
{
    if(!response)
    {
        return 1;
    }

    if(GetTradeItemCount(playerid, TRADE_ITEM_VEHICLE, masinite[playerid][listitem]) > 0) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You already added this vehicle in trade.");

    return OnPlayerAddTradeItem(playerid, TRADE_ITEM_VEHICLE, masinite[playerid][listitem]);
}

CMD:trade(playerid, params[])
{
	if(IsPlayerInTrade(playerid)) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You can't use this command while you are in a trade.");

	new who;
	if(sscanf(params, "u", who)) return SCM(playerid, COLOR_GREY, "Syntax: "EMBED_WHITE"/trade [player id/name]");
	if(!IsPlayerConnected(who)) return SendClientMessage(playerid, COLOR_GREY, "Player not connected.");
	if(who == playerid) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You can't send an offer to yourself.");

	if(GetPlayerScore(playerid) < 5) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You need level 5 to start trading.");
	if(GetPlayerScore(who) < 5) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"That player doesn't have level 5.");
	//if(tradeVariables[playerid][TradeDelay] > gettime()) return SCM(playerid, COLOR_ERROR, "You can send another request in %d seconds.", tradeVariables[playerid][TradeDelay] - gettime());
	if(!IsPlayerInRangeOfPlayer(playerid, who, 10.0)) return SendClientMessage(playerid, COLOR_GREY, "You are not near that player.");

	if(IsPlayerInTrade(who)) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"That player is already in a trade.");
	if(tradeVariables[who][TradeOffer] == playerid) return SCM(playerid, COLOR_GREY, "Error: "EMBED_WHITE"You already sent an invitation to that player.");

	tradeVariables[playerid][TradeDelay] = gettime() + 120;
	tradeVariables[who][TradeOffer] = playerid;

	SCM(who, COLOR_PINK, "* %s te-a invitat sa faceti un schimb. Foloseste comanda /accept trade %d pentru a accepta.", GetName(playerid), playerid);
	SCM(playerid, COLOR_MONEY, "You have sent %s (%d) a trade offer.", GetName(who), who);
	return 1;
}

task tradeTimer[1000]()
{
	foreach(new playerid : trading)
	{
		if(tradeVariables[playerid][TradeEndTime] > 0)
		{
			tradeVariables[playerid][TradeEndTime]--;

			new td[48];
			format(td, sizeof(td), "trade ends in: ~b~~h~00:%02d", tradeVariables[playerid][TradeEndTime]);
			PlayerTextDrawSetString(playerid, TradePTD[playerid][0], td);

			new who = tradeVariables[playerid][TradePlayer];
			PlayerTextDrawSetString(who, TradePTD[who][0], td);

			if(tradeVariables[playerid][TradeEndTime] == 0)
			{
				CallLocalFunction("OnPlayerFinishTrade", "i", playerid);
			}
		}
	}
}