/*
    EASTER QUEST
*/

#include <YSI_Coding\y_hooks>

enum E_EASTER_QUEST
{
    easter_object,
    easter_object_area,
    easter_object_mapicon,
    Text3D:easter_object_label
}

new EasterQuest[25][E_EASTER_QUEST];

new Float:EasterQuestCoords[25][3] = {
    {1774.3724,-1159.1256,23.8281},
	{2236.7361,1286.7241,25.6712},
	{1051.8251,2909.5303,47.8231},
	{1660.0811,1052.0798,10.8203},
	{2759.8262,415.0934,7.9197},
	{1604.1747,-1927.0035,26.8519},
	{1207.9817,-800.2192,81.8494},
	{2330.1282,2263.7510,10.8203},
	{598.0341,-617.5733,18.2430},
	{1749.8014,637.7985,10.8203},
	{626.0535,-1823.9709,6.0625},
	{2760.5640,-2575.2712,3.0000},
	{1184.2411,-758.1301,79.0405},
	{783.9380,-900.6025,46.8859},
	{1660.8900,-481.3177,47.2946},
	{1621.6090,22.2517,24.4234},
	{2815.0671,1290.3687,10.7500},
	{1839.8654,935.2743,10.8130},
	{1676.6791,1448.8125,10.783},
    {-2086.7295,-2803.3340,5.637},
    {-2708.9863,-1942.2467,77.437},
    {-2543.7168,-1995.2020,164.4338},
    {-1986.4722,-1554.8010,129.8090},
    {-2243.5898,-1989.0295,246.9576},
    {-541.4976,-2234.7495,33.813}
};

new EasterVehicle[MAX_PLAYERS] = {INVALID_VEHICLE_ID, ...};

new EasterQuestProgress[MAX_PLAYERS][25], Iterator:easter_quest<MAX_PLAYERS>;

new InEggID[MAX_PLAYERS], HasEggInHands[MAX_PLAYERS];

hook OnGameModeInit()
{
    for(new x; x < 25; x++)
    {
        EasterQuest[x][easter_object] = CreateDynamicObjectEx(19343, EasterQuestCoords[x][0], EasterQuestCoords[x][1], EasterQuestCoords[x][2], 0.0, 0.0, 0.0, 200.0, 200.0, .worlds = { 0, 2222 }, .interiors = { 0 }, .players = {1001}, .maxplayers = MAX_PLAYERS + 1);
        EasterQuest[x][easter_object_area] = CreateDynamicSphere(EasterQuestCoords[x][0], EasterQuestCoords[x][1], EasterQuestCoords[x][2], 2.0, 0, 0, -1);
        Streamer_SetIntData(STREAMER_TYPE_AREA, EasterQuest[x][easter_object_area], E_STREAMER_EXTRA_ID, 27000 + x);

        EasterQuest[x][easter_object_mapicon] = CreateDynamicMapIconEx(EasterQuestCoords[x][0], EasterQuestCoords[x][1], EasterQuestCoords[x][2], 0, COLOR_PINK, MAPICON_GLOBAL, 6000.0, .worlds = { 0, 2222 }, .interiors = { 0 }, .players = {1001}, .maxplayers = MAX_PLAYERS + 1);
        EasterQuest[x][easter_object_label] = CreateDynamic3DTextLabelEx("Easter Egg\n{FFFFFF}Press 'Y' to collect.", COLOR_PINK, EasterQuestCoords[x][0], EasterQuestCoords[x][1], EasterQuestCoords[x][2], 10.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, 15.0, .worlds = { 0, 2222 }, .interiors = { 0 }, .players = {1001}, .maxplayers = MAX_PLAYERS + 1);
    }

    CreateDynamicActor(10, -88.1915, -1566.0215, 2.6107, 222.1823, 1, 100.0, 0, -1, -1, 100.0);
    CreateDynamic3DTextLabel("Easter Quest\n{FFFFFF}Type /startquest to start the special easter quest.", COLOR_PINK, -88.1915, -1566.0215, 2.6107, 10.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID);
}

hook OnPlayerConnect(playerid)
{
    ToggleEasterEggs(playerid, 0);

    HasEggInHands[playerid] = -1;
    InEggID[playerid] = -1;
}

hook OnPlayerDisconnect(playerid, reason)   
{
    Iter_Remove(easter_quest, playerid);
}

hook OnPlayerDeath(playerid, killerid, reason)
{
    FailEasterQuest(playerid);
}

hook OnVehicleDeath(vehicleid, killerid)
{
    foreach(new playerid : easter_quest)
    {
        if(EasterVehicle[playerid] == vehicleid)
        {
            SCM(playerid, COLOR_ERROR, "Quest-ul de Paste a esuat. Vehiculul tau a fost distrus!");

            SetTimerEx("FailEasterQuest", 200, false, "i", playerid);
        }
    }
}

hook OnPlayerEnterDynArea(playerid, areaid)
{
    if(Iter_Contains(easter_quest, playerid))
    {
        new extra_id = Streamer_GetIntData(STREAMER_TYPE_AREA, areaid, E_STREAMER_EXTRA_ID);

        if(extra_id >= 27000 && extra_id <= 27024)
        {
            InEggID[playerid] = areaid;
        }
    }
}

hook OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    if(newkeys == KEY_YES)
    {
        if(HasEggInHands[playerid] == -1) 
        {
            if(IsPlayerInDynamicArea(playerid, InEggID[playerid]))
            {
                new id = Streamer_GetIntData(STREAMER_TYPE_AREA, InEggID[playerid], E_STREAMER_EXTRA_ID);
                InEggID[playerid] = id - 27000;

                if(InEggID[playerid] >= 0 && EasterQuestProgress[playerid][InEggID[playerid]] == 0)
                {
                    if(GetPVarInt(playerid, "easter_quest_delay") > gettime())
                    {
                        SCM(playerid, COLOR_ERROR, "Trebuie sa astepti %d secunde inainte de a colecta alt obiect.", GetPVarInt(playerid, "easter_quest_delay") - gettime());
                        return;
                    }

                    ToggleEasterEgg(playerid, InEggID[playerid], 0);

                    HasEggInHands[playerid] = InEggID[playerid];
                    InEggID[playerid] = -1;

                    SetPlayerSpecialAction(playerid, SPECIAL_ACTION_CARRY);
                    SetPlayerAttachedObject(playerid, 0, 19320, 6, 0.100000, 0.000000, -0.100000, 0.000000, 0.000000, 0.000000, 1.000000, 1.000000, 1.000000);

                    SCM(playerid, COLOR_YELLOW, "Mergi in spatele masinii tale si apasa 'Y' pentru a depozita oul.");
                }
            }

            else InEggID[playerid] = -1;
        }

        else
        {
            new Float:X, Float:Y, Float:Z;
            GetVehiclePos(EasterVehicle[playerid], X, Y, Z);

            if(!IsPlayerInRangeOfPoint(playerid, 4.0, X, Y, Z)) return;

            RemovePlayerAttachedObject(playerid, 0);
            SetPlayerSpecialAction(playerid, SPECIAL_ACTION_NONE);

            EasterQuestProgress[playerid][HasEggInHands[playerid]] = 1;
            SaveEasterQuestProgress(playerid);

            SCM(playerid, COLOR_PINK, "EASTER QUEST: {FFFFFF}Ou colectat. Mai ai de gasit %d oua!", 25 - GetEasterEggs(playerid));
            SetPVarInt(playerid, "easter_quest_delay", gettime() + 15);

            HasEggInHands[playerid] = -1;
            InEggID[playerid] = -1;

            if(GetEasterEggs(playerid) == 25)
            {
                OnEasterQuestCompleted(playerid);
            }
        }
    }
}

CB:LoadEasterQuestProgress(playerid)
{
    new query[128];
    mysql_format(SQL, query, sizeof(query), "SELECT `easter_quest` FROM `server_accounts` WHERE `playerID` = '%d'", playerVariables[playerid][pSQLID]);
    mysql_tquery(SQL, query, "OnEasterQuestProgressLoaded", "i", playerid);
    return 1;
}

CB:OnEasterQuestProgressLoaded(playerid)
{
    new quest[200];
    cache_get_value_name(0, "easter_quest", quest);

    sscanf(quest, "p< >iiiiiiiiiiiiiiiiiiiiiiiii", EasterQuestProgress[playerid][0], EasterQuestProgress[playerid][1], EasterQuestProgress[playerid][2], EasterQuestProgress[playerid][3], EasterQuestProgress[playerid][4],
    EasterQuestProgress[playerid][5], EasterQuestProgress[playerid][6], EasterQuestProgress[playerid][7], EasterQuestProgress[playerid][8], EasterQuestProgress[playerid][9],
    EasterQuestProgress[playerid][10], EasterQuestProgress[playerid][11], EasterQuestProgress[playerid][12], EasterQuestProgress[playerid][13], EasterQuestProgress[playerid][14],
    EasterQuestProgress[playerid][15], EasterQuestProgress[playerid][16], EasterQuestProgress[playerid][17], EasterQuestProgress[playerid][18], EasterQuestProgress[playerid][19],
    EasterQuestProgress[playerid][20], EasterQuestProgress[playerid][21], EasterQuestProgress[playerid][22], EasterQuestProgress[playerid][23], EasterQuestProgress[playerid][24]);
    return 1;
}

stock SaveEasterQuestProgress(playerid)
{
    new query[250];
    mysql_format(SQL, query, sizeof(query), "UPDATE `server_accounts` SET `easter_quest` = '%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d' WHERE `playerID` = '%d'", EasterQuestProgress[playerid][0], EasterQuestProgress[playerid][1], EasterQuestProgress[playerid][2], EasterQuestProgress[playerid][3], EasterQuestProgress[playerid][4],
    EasterQuestProgress[playerid][5], EasterQuestProgress[playerid][6], EasterQuestProgress[playerid][7], EasterQuestProgress[playerid][8], EasterQuestProgress[playerid][9],
    EasterQuestProgress[playerid][10], EasterQuestProgress[playerid][11], EasterQuestProgress[playerid][12], EasterQuestProgress[playerid][13], EasterQuestProgress[playerid][14],
    EasterQuestProgress[playerid][15], EasterQuestProgress[playerid][16], EasterQuestProgress[playerid][17], EasterQuestProgress[playerid][18], EasterQuestProgress[playerid][19],
    EasterQuestProgress[playerid][20], EasterQuestProgress[playerid][21], EasterQuestProgress[playerid][22], EasterQuestProgress[playerid][23], EasterQuestProgress[playerid][24], playerVariables[playerid][pSQLID]);
    mysql_tquery(SQL, query, "", "");
    return 1;
}

stock OnEasterQuestCompleted(playerid)
{
    FailEasterQuest(playerid);

    new money = random(75000) + 25000;
    GivePlayerCash(playerid, money);

    new mats = random(3000) + 1500;
    playerVariables[playerid][pMaterials] += mats;

    new pills = random(3) + 1, weed = random(6) + 5;
    playerVariables[playerid][pPills] += pills;
    playerVariables[playerid][pWeed] += weed;

    new pp = random(6) + 5;
    playerVariables[playerid][pAmethysts] += pp;

    new robp = random(7) + 1, escape = random(7) + 1;
    playerVariables[playerid][pRobPoints] += robp;
    playerVariables[playerid][pEscapePoints] += escape;

    gQuery[0] = EOS;
    mysql_format(SQL, gQuery, sizeof(gQuery), "update `server_accounts` set `playerPills` = '%d', `playerWeed` = '%d', `playerMaterials` = '%d', `playerAmethysts` = '%d', `playerRobPoints` = '%d', `playerEscapePoints` = '%d' where `playerID` = '%d'", playerVariables[playerid][pPills], playerVariables[playerid][pWeed], playerVariables[playerid][pMaterials], playerVariables[playerid][pAmethysts], playerVariables[playerid][pRobPoints], playerVariables[playerid][pEscapePoints], playerVariables[playerid][pSQLID]);
    mysql_tquery(SQL, gQuery, "", "");
    va_SendClientMessageToAll(COLOR_ANNOUNCE, "(( Easter Quest: %s a gasit toate ouale si a finalizat quest-ul. Felicitari! ))", GetName(playerid));

    S(playerid, COLOR_MONEY, "(+) Ai primit $%s, %s materiale, %d pills, %d weed, %d ametiste, %d rob points si %d escape points.", FormatNumber(money), FormatNumber(mats), pills, weed, pp, robp, escape);
    SCM(playerid, COLOR_MONEY, "Vei putea face din nou quest-ul special la ora 20:00!");
    return 1;
}

stock ToggleEasterEgg(playerid, x, toggle)
{
    Streamer_ToggleItem(playerid, STREAMER_TYPE_OBJECT, EasterQuest[x][easter_object], toggle);
    Streamer_ToggleItem(playerid, STREAMER_TYPE_3D_TEXT_LABEL, EasterQuest[x][easter_object_label], toggle);
    Streamer_ToggleItem(playerid, STREAMER_TYPE_MAP_ICON, EasterQuest[x][easter_object_mapicon], toggle);

    Streamer_Update(playerid, STREAMER_TYPE_OBJECT);
    Streamer_Update(playerid, STREAMER_TYPE_3D_TEXT_LABEL);
    Streamer_Update(playerid, STREAMER_TYPE_MAP_ICON);
    return 1;
}

CB:FailEasterQuest(playerid)
{
    Iter_Remove(easter_quest, playerid);

    ToggleEasterEggs(playerid, 0);
    EasterVehicle[playerid] = INVALID_VEHICLE_ID;
    return 1;
}

CB:ResetEasterQuest(hour)
{
    if(hour != 20) return 1;

    foreach(new playerid : Player)
    {
        if(GetEasterEggs(playerid) == 25)
        {
            for(new x; x < 25; x++)
            {
                EasterQuestProgress[playerid][x] = 0;
            }

            SCM(playerid, COLOR_ERROR, "Acum poti face din nou quest-ul de easter!");
        }
    }

    mysql_tquery(SQL, "UPDATE `server_accounts` SET `easter_quest` = '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0' WHERE `easter_quest` = '1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1'");
    return 1;
}

stock ToggleEasterEggs(playerid, toggle)
{
    for(new x; x < 25; x++)
    {
        if(toggle)
        {
            if(EasterQuestProgress[playerid][x] == 0)
            {
                ToggleEasterEgg(playerid, x, 1);
            }
        }

        else ToggleEasterEgg(playerid, x, 0);
    }

    return 1;
}

stock GetEasterEggs(playerid)
{
    new count;
    for(new x; x < 25; x++)
    {
        if(EasterQuestProgress[playerid][x] == 1) count++;
    }

    return count;
}

CB:OnEasterQuestStart(playerid)
{
    if(GetEasterEggs(playerid) == 25)
    {
        return SCM(playerid, COLOR_ERROR, "Ai completat deja quest-ul astazi!");
    }

    if(Iter_Contains(easter_quest, playerid)) return 1;

    if(!IsPlayerInAnyVehicle(playerid))
    {
        return SCM(playerid, COLOR_ERROR, "Trebuie sa fii intr-un vehicul pentru a putea incepe quest-ul special!");
    }

    EasterVehicle[playerid] = GetPlayerVehicleID(playerid);
    SCM(playerid, COLOR_PINK, "EASTER QUEST: {FFFFFF}Mai ai %d oua de Paste de gasit. Mult succes!", 25 - GetEasterEggs(playerid));

    Iter_Add(easter_quest, playerid);
    ToggleEasterEggs(playerid, 1);

    HasEggInHands[playerid] = -1;
    InEggID[playerid] = -1;
    return 1;
}