Synd1qate

Участник
Сообщения
819
Реакции
292
Тогда нужно плагин декомпилить и смотреть путь, раз автору не хватило мозгов написать этот путь, мб название не то или путь кастомный
декомпил:
 public PlVers:__version =
{
    version = 5,
    filevers = "1.9.0.6282",
    date = "03/09/2020",
    time = "20:56:47"
};
new Float:NULL_VECTOR[3];
new String:NULL_STRING[4];
public Extension:__ext_core =
{
    name = "Core",
    file = "core",
    autoload = 0,
    required = 0,
};
new MaxClients;
public Extension:__ext_sdktools =
{
    name = "SDKTools",
    file = "sdktools.ext",
    autoload = 1,
    required = 1,
};
public SharedPlugin:__pl_shop =
{
    name = "shop",
    file = "shop.smx",
    required = 1,
};
new String:CTag[6][] =
{
    "{default}",
    "{green}",
    "{lightgreen}",
    "{red}",
    "{blue}",
    "{olive}"
};
new String:CTagCode[6][16] =
{
    "\x01",
    "\x04",
    "\x03",
    "\x03",
    "\x03",
    "\x05"
};
new bool:CTagReqSayText2[6] =
{
    0, 0, 1, 1, 1, 0
};
new bool:CEventIsHooked;
new bool:CSkipList[66];
new bool:CProfile_Colors[6] =
{
    1, 1, 0, 0, 0, 0
};
new CProfile_TeamIndex[6] =
{
    -1, ...
};
new bool:CProfile_SayText2;
public Extension:__ext_cprefs =
{
    name = "Client Preferences",
    file = "clientprefs.ext",
    autoload = 1,
    required = 1,
};
public Plugin:myinfo =
{
    name = "Contracts",
    description = "",
    author = "Tonki_Ton",
    version = "1.0.0",
    url = "vk.com/tonki_ton"
};
new g_iClientAward[66];
new g_iPercent;
new g_iTemporaryMoney[66];
new g_iTempClient[66];
new g_iColors[4];
new bool:g_bPrintTime[66];
new String:g_sClienWeapon[66][64];
new String:g_sTempCategory[66][64];
new String:g_sTempWeapon[66][64];
new String:g_sExecutor[66][36];
new Handle:g_hCookies;
new KeyValues:g_hKV;
public void:__ext_core_SetNTVOptional()
{
    MarkNativeAsOptional("GetFeatureStatus");
    MarkNativeAsOptional("RequireFeature");
    MarkNativeAsOptional("AddCommandListener");
    MarkNativeAsOptional("RemoveCommandListener");
    MarkNativeAsOptional("BfWriteBool");
    MarkNativeAsOptional("BfWriteByte");
    MarkNativeAsOptional("BfWriteChar");
    MarkNativeAsOptional("BfWriteShort");
    MarkNativeAsOptional("BfWriteWord");
    MarkNativeAsOptional("BfWriteNum");
    MarkNativeAsOptional("BfWriteFloat");
    MarkNativeAsOptional("BfWriteString");
    MarkNativeAsOptional("BfWriteEntity");
    MarkNativeAsOptional("BfWriteAngle");
    MarkNativeAsOptional("BfWriteCoord");
    MarkNativeAsOptional("BfWriteVecCoord");
    MarkNativeAsOptional("BfWriteVecNormal");
    MarkNativeAsOptional("BfWriteAngles");
    MarkNativeAsOptional("BfReadBool");
    MarkNativeAsOptional("BfReadByte");
    MarkNativeAsOptional("BfReadChar");
    MarkNativeAsOptional("BfReadShort");
    MarkNativeAsOptional("BfReadWord");
    MarkNativeAsOptional("BfReadNum");
    MarkNativeAsOptional("BfReadFloat");
    MarkNativeAsOptional("BfReadString");
    MarkNativeAsOptional("BfReadEntity");
    MarkNativeAsOptional("BfReadAngle");
    MarkNativeAsOptional("BfReadCoord");
    MarkNativeAsOptional("BfReadVecCoord");
    MarkNativeAsOptional("BfReadVecNormal");
    MarkNativeAsOptional("BfReadAngles");
    MarkNativeAsOptional("BfGetNumBytesLeft");
    MarkNativeAsOptional("BfWrite.WriteBool");
    MarkNativeAsOptional("BfWrite.WriteByte");
    MarkNativeAsOptional("BfWrite.WriteChar");
    MarkNativeAsOptional("BfWrite.WriteShort");
    MarkNativeAsOptional("BfWrite.WriteWord");
    MarkNativeAsOptional("BfWrite.WriteNum");
    MarkNativeAsOptional("BfWrite.WriteFloat");
    MarkNativeAsOptional("BfWrite.WriteString");
    MarkNativeAsOptional("BfWrite.WriteEntity");
    MarkNativeAsOptional("BfWrite.WriteAngle");
    MarkNativeAsOptional("BfWrite.WriteCoord");
    MarkNativeAsOptional("BfWrite.WriteVecCoord");
    MarkNativeAsOptional("BfWrite.WriteVecNormal");
    MarkNativeAsOptional("BfWrite.WriteAngles");
    MarkNativeAsOptional("BfRead.ReadBool");
    MarkNativeAsOptional("BfRead.ReadByte");
    MarkNativeAsOptional("BfRead.ReadChar");
    MarkNativeAsOptional("BfRead.ReadShort");
    MarkNativeAsOptional("BfRead.ReadWord");
    MarkNativeAsOptional("BfRead.ReadNum");
    MarkNativeAsOptional("BfRead.ReadFloat");
    MarkNativeAsOptional("BfRead.ReadString");
    MarkNativeAsOptional("BfRead.ReadEntity");
    MarkNativeAsOptional("BfRead.ReadAngle");
    MarkNativeAsOptional("BfRead.ReadCoord");
    MarkNativeAsOptional("BfRead.ReadVecCoord");
    MarkNativeAsOptional("BfRead.ReadVecNormal");
    MarkNativeAsOptional("BfRead.ReadAngles");
    MarkNativeAsOptional("BfRead.BytesLeft.get");
    MarkNativeAsOptional("PbReadInt");
    MarkNativeAsOptional("PbReadFloat");
    MarkNativeAsOptional("PbReadBool");
    MarkNativeAsOptional("PbReadString");
    MarkNativeAsOptional("PbReadColor");
    MarkNativeAsOptional("PbReadAngle");
    MarkNativeAsOptional("PbReadVector");
    MarkNativeAsOptional("PbReadVector2D");
    MarkNativeAsOptional("PbGetRepeatedFieldCount");
    MarkNativeAsOptional("PbSetInt");
    MarkNativeAsOptional("PbSetFloat");
    MarkNativeAsOptional("PbSetBool");
    MarkNativeAsOptional("PbSetString");
    MarkNativeAsOptional("PbSetColor");
    MarkNativeAsOptional("PbSetAngle");
    MarkNativeAsOptional("PbSetVector");
    MarkNativeAsOptional("PbSetVector2D");
    MarkNativeAsOptional("PbAddInt");
    MarkNativeAsOptional("PbAddFloat");
    MarkNativeAsOptional("PbAddBool");
    MarkNativeAsOptional("PbAddString");
    MarkNativeAsOptional("PbAddColor");
    MarkNativeAsOptional("PbAddAngle");
    MarkNativeAsOptional("PbAddVector");
    MarkNativeAsOptional("PbAddVector2D");
    MarkNativeAsOptional("PbRemoveRepeatedFieldValue");
    MarkNativeAsOptional("PbReadMessage");
    MarkNativeAsOptional("PbReadRepeatedMessage");
    MarkNativeAsOptional("PbAddMessage");
    MarkNativeAsOptional("Protobuf.ReadInt");
    MarkNativeAsOptional("Protobuf.ReadFloat");
    MarkNativeAsOptional("Protobuf.ReadBool");
    MarkNativeAsOptional("Protobuf.ReadString");
    MarkNativeAsOptional("Protobuf.ReadColor");
    MarkNativeAsOptional("Protobuf.ReadAngle");
    MarkNativeAsOptional("Protobuf.ReadVector");
    MarkNativeAsOptional("Protobuf.ReadVector2D");
    MarkNativeAsOptional("Protobuf.GetRepeatedFieldCount");
    MarkNativeAsOptional("Protobuf.SetInt");
    MarkNativeAsOptional("Protobuf.SetFloat");
    MarkNativeAsOptional("Protobuf.SetBool");
    MarkNativeAsOptional("Protobuf.SetString");
    MarkNativeAsOptional("Protobuf.SetColor");
    MarkNativeAsOptional("Protobuf.SetAngle");
    MarkNativeAsOptional("Protobuf.SetVector");
    MarkNativeAsOptional("Protobuf.SetVector2D");
    MarkNativeAsOptional("Protobuf.AddInt");
    MarkNativeAsOptional("Protobuf.AddFloat");
    MarkNativeAsOptional("Protobuf.AddBool");
    MarkNativeAsOptional("Protobuf.AddString");
    MarkNativeAsOptional("Protobuf.AddColor");
    MarkNativeAsOptional("Protobuf.AddAngle");
    MarkNativeAsOptional("Protobuf.AddVector");
    MarkNativeAsOptional("Protobuf.AddVector2D");
    MarkNativeAsOptional("Protobuf.RemoveRepeatedFieldValue");
    MarkNativeAsOptional("Protobuf.ReadMessage");
    MarkNativeAsOptional("Protobuf.ReadRepeatedMessage");
    MarkNativeAsOptional("Protobuf.AddMessage");
    VerifyCoreVersion();
    return void:0;
}

bool:StrEqual(String:str1[], String:str2[], bool:caseSensitive)
{
    return strcmp(str1, str2, caseSensitive) == 0;
}

ExplodeString(String:text[], String:split[], String:buffers[][], maxStrings, maxStringLength, bool:copyRemainder)
{
    new reloc_idx;
    new idx;
    new total;
    new var1;
    if (maxStrings < 1 || !split[0])
    {
        return 0;
    }
    while ((idx = SplitString(text[reloc_idx], split, buffers[total], maxStringLength)) != -1)
    {
        reloc_idx = idx + reloc_idx;
        total++;
        if (maxStrings == total)
        {
            if (copyRemainder)
            {
                strcopy(buffers[total + -1], maxStringLength, text[reloc_idx - idx]);
            }
            return total;
        }
    }
    total++;
    strcopy(buffers[total], maxStringLength, text[reloc_idx]);
    return total;
}

Handle:StartMessageOne(String:msgname[], client, flags)
{
    new players[1];
    players[0] = client;
    return StartMessage(msgname, players, 1, flags);
}

GetEntSendPropOffs(ent, String:prop[], bool:actual)
{
    new String:cls[64];
    if (!GetEntityNetClass(ent, cls, 64))
    {
        return -1;
    }
    new local = -1;
    new offset = FindSendPropInfo(cls, prop, 0, 0, local);
    if (actual)
    {
        return offset;
    }
    return local;
}

void:SetEntityRenderMode(entity, RenderMode:mode)
{
    static bool:gotconfig;
    static String:prop[32];
    if (!gotconfig)
    {
        new Handle:gc = LoadGameConfigFile("core.games");
        new bool:exists = GameConfGetKeyValue(gc, "m_nRenderMode", prop, 32);
        CloseHandle(gc);
        if (!exists)
        {
            strcopy(prop, 32, "m_nRenderMode");
        }
        gotconfig = true;
    }
    SetEntProp(entity, PropType:0, prop, mode, 1, 0);
    return void:0;
}

void:SetEntityRenderColor(entity, r, g, b, a)
{
    static bool:gotconfig;
    static String:prop[32];
    if (!gotconfig)
    {
        new Handle:gc = LoadGameConfigFile("core.games");
        new bool:exists = GameConfGetKeyValue(gc, "m_clrRender", prop, 32);
        CloseHandle(gc);
        if (!exists)
        {
            strcopy(prop, 32, "m_clrRender");
        }
        gotconfig = true;
    }
    new offset = GetEntSendPropOffs(entity, prop, false);
    if (0 >= offset)
    {
        ThrowError("SetEntityRenderColor not supported by this mod");
    }
    SetEntData(entity, offset, r, 1, true);
    SetEntData(entity, offset + 1, g, 1, true);
    SetEntData(entity, offset + 2, b, 1, true);
    SetEntData(entity, offset + 3, a, 1, true);
    return void:0;
}

CPrintToChat(client, String:szMessage[])
{
    new var1;
    if (client <= 0 || client > MaxClients)
    {
        ThrowError("Invalid client index %d", client);
    }
    if (!IsClientInGame(client))
    {
        ThrowError("Client %d is not in game", client);
    }
    decl String:szBuffer[252];
    decl String:szCMessage[252];
    SetGlobalTransTarget(client);
    Format(szBuffer, 250, "\x01%s", szMessage);
    VFormat(szCMessage, 250, szBuffer, 3);
    new index = CFormat(szCMessage, 250, -1);
    if (index == -1)
    {
        PrintToChat(client, szCMessage);
    }
    else
    {
        CSayText2(client, index, szCMessage);
    }
    return 0;
}

CPrintToChatAll(String:szMessage[])
{
    decl String:szBuffer[252];
    new i = 1;
    while (i <= MaxClients)
    {
        new var1;
        if (IsClientInGame(i) && !IsFakeClient(i) && !CSkipList[i])
        {
            SetGlobalTransTarget(i);
            VFormat(szBuffer, 250, szMessage, 2);
            CPrintToChat(i, szBuffer);
        }
        CSkipList[i] = 0;
        i++;
    }
    return 0;
}

CFormat(String:szMessage[], maxlength, author)
{
    if (!CEventIsHooked)
    {
        CSetupProfile();
        HookEvent("server_spawn", CEvent_MapStart, EventHookMode:2);
        CEventIsHooked = true;
    }
    new iRandomPlayer = -1;
    if (author != -1)
    {
        if (CProfile_SayText2)
        {
            ReplaceString(szMessage, maxlength, "{teamcolor}", "\x03", true);
            iRandomPlayer = author;
        }
        else
        {
            ReplaceString(szMessage, maxlength, "{teamcolor}", CTagCode[1], true);
        }
    }
    else
    {
        ReplaceString(szMessage, maxlength, "{teamcolor}", "", true);
    }
    new i;
    while (i < 6)
    {
        if (!(StrContains(szMessage, CTag[i], true) == -1))
        {
            if (!CProfile_Colors[i])
            {
                ReplaceString(szMessage, maxlength, CTag[i], CTagCode[1], true);
            }
            else
            {
                if (!CTagReqSayText2[i])
                {
                    ReplaceString(szMessage, maxlength, CTag[i], CTagCode[i], true);
                }
                if (!CProfile_SayText2)
                {
                    ReplaceString(szMessage, maxlength, CTag[i], CTagCode[1], true);
                }
                if (iRandomPlayer == -1)
                {
                    iRandomPlayer = CFindRandomPlayerByTeam(CProfile_TeamIndex[i]);
                    if (iRandomPlayer == -2)
                    {
                        ReplaceString(szMessage, maxlength, CTag[i], CTagCode[1], true);
                    }
                    else
                    {
                        ReplaceString(szMessage, maxlength, CTag[i], CTagCode[i], true);
                    }
                }
                ThrowError("Using two team colors in one message is not allowed");
            }
        }
        i++;
    }
    return iRandomPlayer;
}

CFindRandomPlayerByTeam(color_team)
{
    if (color_team)
    {
        new i = 1;
        while (i <= MaxClients)
        {
            new var1;
            if (IsClientInGame(i) && color_team == GetClientTeam(i))
            {
                return i;
            }
            i++;
        }
        return -2;
    }
    return 0;
}

CSayText2(client, author, String:szMessage[])
{
    new Handle:hBuffer = StartMessageOne("SayText2", client, 0);
    if (GetUserMessageType() == 1)
    {
        PbSetInt(hBuffer, "ent_idx", author, -1);
        PbSetBool(hBuffer, "chat", true, -1);
        PbSetString(hBuffer, "msg_name", szMessage, -1);
        PbAddString(hBuffer, "params", "");
        PbAddString(hBuffer, "params", "");
        PbAddString(hBuffer, "params", "");
        PbAddString(hBuffer, "params", "");
    }
    else
    {
        BfWriteByte(hBuffer, author);
        BfWriteByte(hBuffer, 1);
        BfWriteString(hBuffer, szMessage);
    }
    EndMessage();
    return 0;
}

CSetupProfile()
{
    decl String:szGameName[32];
    GetGameFolderName(szGameName, 30);
    if (StrEqual(szGameName, "cstrike", false))
    {
        CProfile_Colors[2] = 1;
        CProfile_Colors[3] = 1;
        CProfile_Colors[4] = 1;
        CProfile_Colors[5] = 1;
        CProfile_TeamIndex[2] = 0;
        CProfile_TeamIndex[3] = 2;
        CProfile_TeamIndex[4] = 3;
        CProfile_SayText2 = true;
    }
    else
    {
        if (StrEqual(szGameName, "tf", false))
        {
            CProfile_Colors[2] = 1;
            CProfile_Colors[3] = 1;
            CProfile_Colors[4] = 1;
            CProfile_Colors[5] = 1;
            CProfile_TeamIndex[2] = 0;
            CProfile_TeamIndex[3] = 2;
            CProfile_TeamIndex[4] = 3;
            CProfile_SayText2 = true;
        }
        new var1;
        if (StrEqual(szGameName, "left4dead", false) || StrEqual(szGameName, "left4dead2", false))
        {
            CProfile_Colors[2] = 1;
            CProfile_Colors[3] = 1;
            CProfile_Colors[4] = 1;
            CProfile_Colors[5] = 1;
            CProfile_TeamIndex[2] = 0;
            CProfile_TeamIndex[3] = 3;
            CProfile_TeamIndex[4] = 2;
            CProfile_SayText2 = true;
        }
        if (StrEqual(szGameName, "hl2mp", false))
        {
            if (GetConVarBool(FindConVar("mp_teamplay")))
            {
                CProfile_Colors[3] = 1;
                CProfile_Colors[4] = 1;
                CProfile_Colors[5] = 1;
                CProfile_TeamIndex[3] = 3;
                CProfile_TeamIndex[4] = 2;
                CProfile_SayText2 = true;
            }
            else
            {
                CProfile_SayText2 = false;
                CProfile_Colors[5] = 1;
            }
        }
        if (StrEqual(szGameName, "dod", false))
        {
            CProfile_Colors[5] = 1;
            CProfile_SayText2 = false;
        }
        if (GetUserMessageId("SayText2") == -1)
        {
            CProfile_SayText2 = false;
        }
        CProfile_Colors[3] = 1;
        CProfile_Colors[4] = 1;
        CProfile_TeamIndex[3] = 2;
        CProfile_TeamIndex[4] = 3;
        CProfile_SayText2 = true;
    }
    return 0;
}

public Action:CEvent_MapStart(Handle:event, String:name[], bool:dontBroadcast)
{
    CSetupProfile();
    new i = 1;
    while (i <= MaxClients)
    {
        CSkipList[i] = 0;
        i++;
    }
    return Action:0;
}

public void:OnPluginStart()
{
    g_hCookies = RegClientCookie("contracts", "", CookieAccess:2);
    RegConsoleCmd("sm_contracts", ContCmd, "", 0);
    RegConsoleCmd("sm_nb", ContCmdNB, "", 0);
    new i = 1;
    while (i <= MaxClients)
    {
        new var1;
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            OnClientCookiesCached(i);
        }
        i++;
    }
    HookEvent("player_spawn", ePS, EventHookMode:1);
    HookEvent("player_death", ePD, EventHookMode:1);
    return void:0;
}

public void:OnPluginEnd()
{
    new i = 1;
    while (i <= MaxClients)
    {
        new var1;
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            OnClientDisconnect(i);
        }
        i++;
    }
    return void:0;
}

public void:OnMapStart()
{
    if (g_hKV)
    {
        CloseHandle(g_hKV);
        g_hKV = MissingTAG:0;
    }
    new String:sBuff[256];
    new String:sColors[4][8] = {
        "contracts",
        "s",
        "",
        "igs/contracts.ini"
    };
    g_hKV = KeyValues.KeyValues("contracts", "", "");
    BuildPath(PathType:0, sBuff, 256, "configs/contracts.ini");
    if (!KeyValues.ImportFromFile(g_hKV, sBuff))
    {
        SetFailState("Конфигурационный файл отсутсвует!");
    }
    g_iPercent = KeyValues.GetNum(g_hKV, "percent", 0);
    KeyValues.GetString(g_hKV, "player_colors", sBuff, 32, "");
    ExplodeString(sBuff, " ", sColors, 4, 8, false);
    new i;
    while (i < 4)
    {
        g_iColors[i] = StringToInt(sColors[i], 10);
        i++;
    }
    return void:0;
}

public Action:ContCmdNB(iClient, iArgs)
{
    GlobaWantedList(iClient);
    return Action:3;
}

public Action:ContCmd(iClient, iArgs)
{
    new Menu:hMenu = Menu.Menu(ConMainMenuHandler, MenuAction:28);
    Menu.SetTitle(hMenu, "Награда за голову\n ");
    Menu.AddItem(hMenu, NULL_STRING, "Выставить награду", 0);
    new iCount;
    new String:sAuth[36];
    GetClientAuthId(iClient, AuthIdType:1, sAuth, 36, true);
    new i = 1;
    while (i <= MaxClients)
    {
        new var1;
        if (IsClientInGame(i) && !IsFakeClient(i) && !strcmp(g_sExecutor[i], sAuth, true))
        {
            iCount++;
        }
        i++;
    }
    if (!iCount)
    {
        Menu.AddItem(hMenu, NULL_STRING, "Снять награду (Выставленно: 0)\n ", 1);
    }
    else
    {
        new String:sBuff[64];
        FormatEx(sBuff, 64, "Снять награду (Выставленно: %i)\n ", iCount);
        Menu.AddItem(hMenu, NULL_STRING, sBuff, 0);
    }
    Menu.AddItem(hMenu, NULL_STRING, "Список особо опасных", 0);
    Menu.Display(hMenu, iClient, 0);
    return Action:3;
}

ConMainMenuHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            switch (iPick)
            {
                case 0:
                {
                    ChoiceAmount(iClient);
                }
                case 1:
                {
                    YourWantedList(iClient);
                }
                case 2:
                {
                    GlobaWantedList(iClient);
                }
                default:
                {
                }
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:GlobaWantedList(iClient)
{
    new Menu:hMenu = Menu.Menu(GlobalWantedListMenuHandler, MenuAction:28);
    Menu.SetTitle(hMenu, "Список особо опасных:\n ");
    new String:sName[64];
    new String:sUserID[16];
    new i = 1;
    while (i < MaxClients)
    {
        new var1;
        if (IsClientInGame(i) && g_iClientAward[i])
        {
            IntToString(GetClientUserId(i), sUserID, 16);
            FormatEx(sName, 64, "%N", i);
            Menu.AddItem(hMenu, sUserID, sName, 0);
        }
        i++;
    }
    if (!Menu.ItemCount.get(hMenu))
    {
        Menu.AddItem(hMenu, NULL_STRING, "Нет подходящих игроков.", 1);
    }
    Menu.ExitBackButton.set(hMenu, true);
    Menu.Display(hMenu, iClient, 0);
    return void:0;
}

GlobalWantedListMenuHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            new String:sPick[16];
            Menu.GetItem(hMenu, iPick, sPick, 16, 0, "", 0);
            new iPicker = GetClientOfUserId(StringToInt(sPick, 10));
            new var1;
            if (!iPicker || !IsClientInGame(iPicker))
            {
                CPrintToChat(iClient, "\x01[SM] \x04Выбранный игрок покинул сервер\x01.");
                GlobaWantedList(iClient);
                return 0;
            }
            ConfirmWipe(iClient, iPicker);
        }
        case 8:
        {
            if (iPick == -6)
            {
                ContCmd(iClient, 0);
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:ConfirmWipe(iClient, iPicker)
{
    new Panel:hTop = Panel.Panel(Handle:0);
    new String:sDisplay[128];
    FormatEx(sDisplay, 128, "Награда за голову %N:\n ", iPicker);
    Panel.SetTitle(hTop, sDisplay, false);
    FormatEx(sDisplay, 128, "Размер награды: %i кредитов", g_iClientAward[iPicker]);
    Panel.DrawText(hTop, sDisplay);
    FormatEx(sDisplay, 128, "Условия выполнения: Оружие %s", g_sClienWeapon[iPicker][1]);
    Panel.DrawText(hTop, sDisplay);
    new String:sAuth[32];
    new iExecutor;
    new i = 1;
    while (i < MaxClients)
    {
        if (IsClientInGame(i))
        {
            GetClientAuthId(i, AuthIdType:1, sAuth, 32, true);
            if (!strcmp(g_sExecutor[iPicker], sAuth, true))
            {
                iExecutor = i;
            }
        }
        i++;
    }
    new var1;
    if (!iExecutor)
    {
        var1[0] = 21388;
    }
    else
    {
        var1[0] = 21428;
    }
    FormatEx(sDisplay, 128, var1, iExecutor);
    Panel.DrawText(hTop, sDisplay);
    Panel.DrawItem(hTop, " ", 10);
    SetPanelCurrentKey(hTop, 1);
    Panel.DrawItem(hTop, "Назад", 0);
    Panel.Send(hTop, iClient, ConfirmWipeHandler, 30);
    CloseHandle(hTop);
    hTop = MissingTAG:0;
    return void:0;
}

ConfirmWipeHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            GlobaWantedList(iClient);
            ClientCommand(iClient, "play buttons/combine_button7.wav");
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:YourWantedList(iClient)
{
    new Menu:hMenu = Menu.Menu(YouWantedListMenuHandler, MenuAction:28);
    Menu.SetTitle(hMenu, "Выберите игрока:\nКомиссия: %i\n ", g_iPercent);
    new String:sName[64];
    new String:sUserID[16];
    new String:sAuth[36];
    GetClientAuthId(iClient, AuthIdType:1, sAuth, 36, true);
    new i = 1;
    while (i < MaxClients)
    {
        new var1;
        if (IsClientInGame(i) && g_iClientAward[i] && !strcmp(g_sExecutor[i], sAuth, true))
        {
            IntToString(GetClientUserId(i), sUserID, 16);
            FormatEx(sName, 64, "%N", i);
            Menu.AddItem(hMenu, sUserID, sName, 0);
        }
        i++;
    }
    if (!Menu.ItemCount.get(hMenu))
    {
        Menu.AddItem(hMenu, NULL_STRING, "Нет подходящих игроков", 1);
    }
    Menu.ExitBackButton.set(hMenu, true);
    Menu.Display(hMenu, iClient, 0);
    return void:0;
}

YouWantedListMenuHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            new String:sPick[16];
            Menu.GetItem(hMenu, iPick, sPick, 16, 0, "", 0);
            new iPicker = GetClientOfUserId(StringToInt(sPick, 10));
            new var1;
            if (!iPicker || !IsClientInGame(iPicker))
            {
                CPrintToChat(iClient, "\x01[SM] \x04Выбранный игрок покинул сервер\x01.");
                YourWantedList(iClient);
                return 0;
            }
            CPrintToChatAll("\x01%N \x04снял заказ на голову игрока {red}%N", iClient, iPicker);
            CPrintToChat(iClient, "\x01Вы вернули \x04%i \x01кредитов за отменненный заказ", g_iClientAward[iPicker]);
            decl iAmount;
            new var2 = g_iClientAward[iPicker];
            new var3 = g_iPercent * g_iClientAward[iPicker] / 100;
            var2 -= var3;
            iAmount = var2 - var3;
            Shop_GiveClientCredits(iClient, iAmount, -5);
            g_iClientAward[iPicker] = 0;
            SetClientCookie(iPicker, g_hCookies, NULL_STRING);
            ContCmd(iClient, 0);
        }
        case 8:
        {
            if (iPick == -6)
            {
                ContCmd(iClient, 0);
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:ChoiceAmount(iClient)
{
    new Menu:hMenu = Menu.Menu(ConAmountMenuHandler, MenuAction:28);
    Menu.SetTitle(hMenu, "Выберите награду\n ");
    Menu.AddItem(hMenu, "chat", "Выставить награду через чат", 0);
    KeyValues.Rewind(g_hKV);
    new var1;
    if (KeyValues.JumpToKey(g_hKV, "amounts", false) && KeyValues.GotoFirstSubKey(g_hKV, false))
    {
        new String:sSecName[32];
        new String:sName[64];
        do {
            KeyValues.GetSectionName(g_hKV, sSecName, 32);
            KeyValues.GetString(g_hKV, NULL_STRING, sName, 64, "");
            new var2;
            if (StringToInt(sSecName, 10) > Shop_GetClientCredits(iClient))
            {
                var2 = 1;
            }
            else
            {
                var2 = 0;
            }
            Menu.AddItem(hMenu, sSecName, sName, var2);
        } while (KeyValues.GotoNextKey(g_hKV, false));
    }
    Menu.ExitBackButton.set(hMenu, true);
    Menu.Display(hMenu, iClient, 0);
    return void:0;
}

ConAmountMenuHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            new String:sPick[32];
            Menu.GetItem(hMenu, iPick, sPick, 32, 0, "", 0);
            if (!strcmp(sPick, "chat", true))
            {
                g_bPrintTime[iClient] = 1;
            }
            else
            {
                g_iTemporaryMoney[iClient] = StringToInt(sPick, 10);
                ChoiceWeaponSection(iClient);
            }
        }
        case 8:
        {
            if (iPick == -6)
            {
                ContCmd(iClient, 0);
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:ChoiceWeaponSection(iClient)
{
    new Menu:hMenu = Menu.Menu(ConWepSectionMenuHandler, MenuAction:28);
    Menu.SetTitle(hMenu, "Выберите тип оружия:\n ");
    KeyValues.Rewind(g_hKV);
    new var1;
    if (KeyValues.JumpToKey(g_hKV, "weapons", false) && KeyValues.GotoFirstSubKey(g_hKV, true))
    {
        new String:sSecName[48];
        do {
            KeyValues.GetSectionName(g_hKV, sSecName, 48);
            Menu.AddItem(hMenu, sSecName, sSecName, 0);
        } while (KeyValues.GotoNextKey(g_hKV, true));
    }
    Menu.ExitBackButton.set(hMenu, true);
    Menu.Display(hMenu, iClient, 0);
    return void:0;
}

ConWepSectionMenuHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            new String:sPick[48];
            Menu.GetItem(hMenu, iPick, sPick, 48, 0, "", 0);
            strcopy(g_sTempCategory[iClient], 64, sPick);
            ChoiceWeapon(iClient, sPick);
        }
        case 8:
        {
            if (iPick == -6)
            {
                ChoiceAmount(iClient);
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:ChoiceWeapon(iClient, String:sWeapon[])
{
    new Menu:hMenu = Menu.Menu(ConWepMenuHandler, MenuAction:28);
    Menu.SetTitle(hMenu, "Категория: %s\nВыберите оружие:\n ", g_sTempCategory[iClient]);
    KeyValues.Rewind(g_hKV);
    new var1;
    if (KeyValues.JumpToKey(g_hKV, "weapons", false) && KeyValues.JumpToKey(g_hKV, sWeapon, false) && KeyValues.GotoFirstSubKey(g_hKV, false))
    {
        new String:sSecName[48];
        new String:sName[64];
        do {
            KeyValues.GetSectionName(g_hKV, sSecName, 48);
            KeyValues.GetString(g_hKV, NULL_STRING, sName, 64, "");
            Menu.AddItem(hMenu, sSecName, sName, 0);
        } while (KeyValues.GotoNextKey(g_hKV, false));
    }
    Menu.ExitBackButton.set(hMenu, true);
    Menu.Display(hMenu, iClient, 0);
    return void:0;
}

ConWepMenuHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            new String:sPick[48];
            Menu.GetItem(hMenu, iPick, sPick, 48, 0, "", 0);
            strcopy(g_sTempWeapon[iClient], 64, sPick);
            PlayerListMenu(iClient);
        }
        case 8:
        {
            if (iPick == -6)
            {
                ChoiceWeaponSection(iClient);
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:PlayerListMenu(iClient)
{
    new Menu:hMenu = Menu.Menu(ConPlayerListMenuHandler, MenuAction:28);
    Menu.SetTitle(hMenu, "Выберите игрока:\n ", iClient);
    new String:sName[64];
    new String:sUserID[16];
    new i = 1;
    while (i < MaxClients)
    {
        new var1;
        if (IsClientInGame(i) && !g_iClientAward[i])
        {
            IntToString(GetClientUserId(i), sUserID, 16);
            FormatEx(sName, 64, "%N", i);
            Menu.AddItem(hMenu, sUserID, sName, 0);
        }
        i++;
    }
    if (!Menu.ItemCount.get(hMenu))
    {
        Menu.AddItem(hMenu, NULL_STRING, "Нет подходящих игроков", 1);
    }
    Menu.ExitBackButton.set(hMenu, true);
    Menu.Display(hMenu, iClient, 0);
    return void:0;
}

ConPlayerListMenuHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            new String:sPick[16];
            Menu.GetItem(hMenu, iPick, sPick, 16, 0, "", 0);
            new iPicker = GetClientOfUserId(StringToInt(sPick, 10));
            new var1;
            if (!iPicker || !IsClientInGame(iPicker))
            {
                CPrintToChat(iClient, "\x01[SM] \x04Выбранный игрок покинул сервер\x01.");
                PlayerListMenu(iClient);
                return 0;
            }
            ConfirmContract(iClient, iPicker);
        }
        case 8:
        {
            if (iPick == -6)
            {
                ChoiceWeapon(iClient, g_sTempCategory[iClient]);
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:ConfirmContract(iClient, iPicker)
{
    new Panel:hTop = Panel.Panel(Handle:0);
    new String:sDisplay[256];
    new String:sWepName[64];
    KeyValues.Rewind(g_hKV);
    FormatEx(sDisplay, 256, "weapons/%s/%s", g_sTempCategory[iClient], g_sTempWeapon[iClient]);
    KeyValues.GetString(g_hKV, sDisplay, sWepName, 64, "");
    FormatEx(sDisplay, 256, "Вы уверены, что хотите выставить\nнаграду за голову игрока %N\nв размере %i кредитов\nОружие: %s", iPicker, g_iTemporaryMoney[iClient], sWepName);
    Panel.SetTitle(hTop, sDisplay, false);
    g_iTempClient[iClient] = iPicker;
    Panel.DrawItem(hTop, " ", 10);
    SetPanelCurrentKey(hTop, 1);
    Panel.DrawItem(hTop, "Выставить Награду", 0);
    SetPanelCurrentKey(hTop, 2);
    Panel.DrawItem(hTop, "Разорвать Контракт", 0);
    Panel.Send(hTop, iClient, ConfirmContractHandler, 30);
    CloseHandle(hTop);
    hTop = MissingTAG:0;
    return void:0;
}

ConfirmContractHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            if (iPick == 1)
            {
                new var1;
                if (!g_iTempClient[iClient] || !IsClientInGame(g_iTempClient[iClient]))
                {
                    CPrintToChat(iClient, "\x01[SM] \x04Выбранный игрок покинул сервер\x01.");
                    PlayerListMenu(iClient);
                    return 0;
                }
                new String:sAuth[36];
                GetClientAuthId(iClient, AuthIdType:1, sAuth, 36, true);
                g_iClientAward[g_iTempClient[iClient]] = g_iTemporaryMoney[iClient];
                strcopy(g_sClienWeapon[g_iTempClient[iClient]], 64, g_sTempWeapon[iClient]);
                strcopy(g_sExecutor[g_iTempClient[iClient]], 36, sAuth);
                Shop_TakeClientCredits(iClient, g_iTemporaryMoney[iClient], -1);
                CPrintToChat(iClient, "\x01С вашего баланса снято \x04%i \x01кредитов", g_iTemporaryMoney[iClient]);
                CPrintToChatAll("\x04%N \x01выставил награду за голову {red}%N", iClient, g_iTempClient[iClient]);
                new String:sBuff[128];
                new String:sWepName[64];
                KeyValues.Rewind(g_hKV);
                FormatEx(sBuff, 128, "weapons/%s/%s", g_sTempCategory[iClient], g_sTempWeapon[iClient]);
                KeyValues.GetString(g_hKV, sBuff, sWepName, 64, "");
                CPrintToChatAll("\x01Сумма награды: {red}%i \x04кредитов. \x01Оружие: \x04%s", g_iTemporaryMoney[iClient], sWepName);
                ColorPlayer(g_iTempClient[iClient]);
                ClientCommand(iClient, "play buttons/button14.wav");
            }
            else
            {
                ClientCommand(iClient, "play buttons/combine_button7.wav");
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

public void:ePD(Event:hEvent, String:sName[], bool:bDontBroadcast)
{
    new iAttacker = GetClientOfUserId(Event.GetInt(hEvent, "attacker", 0));
    new iClient = GetClientOfUserId(Event.GetInt(hEvent, "userid", 0));
    new var1;
    if (iAttacker != iClient && IsClientInGame(iClient) && IsClientInGame(iAttacker) && g_iClientAward[iClient])
    {
        new String:sWeapon[48];
        GetClientWeapon(iAttacker, sWeapon, 48);
        if (!strcmp(sWeapon, g_sClienWeapon[iClient], true))
        {
            CPrintToChatAll("\x04%N \x01выполнил заказ на игрока {red}%N \x01и получил \x04%i \x01кредитов", iAttacker, iClient, g_iClientAward[iClient]);
            Shop_GiveClientCredits(iAttacker, g_iClientAward[iClient], -5);
            g_iClientAward[iClient] = 0;
            SetClientCookie(iClient, g_hCookies, NULL_STRING);
        }
    }
    return void:0;
}

public void:ePS(Event:hEvent, String:sName[], bool:bDontBroadcast)
{
    new iClient = GetClientOfUserId(Event.GetInt(hEvent, "userid", 0));
    new var1;
    if (iClient && IsClientInGame(iClient) && g_iClientAward[iClient])
    {
        ColorPlayer(iClient);
    }
    return void:0;
}

void:ColorPlayer(iClient)
{
    SetEntityRenderMode(iClient, RenderMode:1);
    SetEntityRenderColor(iClient, g_iColors[0], g_iColors[1], g_iColors[2], g_iColors[3]);
    return void:0;
}

public Action:OnClientSayCommand(iClient, String:command[], String:sArgs[])
{
    if (g_bPrintTime[iClient])
    {
        new iBet;
        new var1;
        if ((iBet = StringToInt(sArgs, 10)) > Shop_GetClientCredits(iClient) || iBet <= 0)
        {
            CPrintToChat(iClient, "\x01[SM] \x04Некорректная сумма\x01.");
            g_bPrintTime[iClient] = 0;
            return Action:3;
        }
        g_iTemporaryMoney[iClient] = iBet;
        ChoiceWeaponSection(iClient);
        g_bPrintTime[iClient] = 0;
        return Action:3;
    }
    return Action:0;
}

public void:OnClientCookiesCached(iClient)
{
    new String:sCookies[128];
    GetClientCookie(iClient, g_hCookies, sCookies, 128);
    if (sCookies[0])
    {

/* ERROR! offset 23048, count 0, length 23016 */
 function "OnClientCookiesCached" (number 40)
public void:OnClientDisconnect(iClient)
{
    if (g_iClientAward[iClient])
    {
        new String:sCookies[128];
        FormatEx(sCookies, 128, "%i|%s|%s", g_iClientAward[iClient], g_sExecutor[iClient], g_sClienWeapon[iClient]);
        SetClientCookie(iClient, g_hCookies, sCookies);
    }
    return void:0;
}
 

7pElllHuK

Участник
Сообщения
1,458
Реакции
485
декомпил:
 public PlVers:__version =
{
    version = 5,
    filevers = "1.9.0.6282",
    date = "03/09/2020",
    time = "20:56:47"
};
new Float:NULL_VECTOR[3];
new String:NULL_STRING[4];
public Extension:__ext_core =
{
    name = "Core",
    file = "core",
    autoload = 0,
    required = 0,
};
new MaxClients;
public Extension:__ext_sdktools =
{
    name = "SDKTools",
    file = "sdktools.ext",
    autoload = 1,
    required = 1,
};
public SharedPlugin:__pl_shop =
{
    name = "shop",
    file = "shop.smx",
    required = 1,
};
new String:CTag[6][] =
{
    "{default}",
    "{green}",
    "{lightgreen}",
    "{red}",
    "{blue}",
    "{olive}"
};
new String:CTagCode[6][16] =
{
    "\x01",
    "\x04",
    "\x03",
    "\x03",
    "\x03",
    "\x05"
};
new bool:CTagReqSayText2[6] =
{
    0, 0, 1, 1, 1, 0
};
new bool:CEventIsHooked;
new bool:CSkipList[66];
new bool:CProfile_Colors[6] =
{
    1, 1, 0, 0, 0, 0
};
new CProfile_TeamIndex[6] =
{
    -1, ...
};
new bool:CProfile_SayText2;
public Extension:__ext_cprefs =
{
    name = "Client Preferences",
    file = "clientprefs.ext",
    autoload = 1,
    required = 1,
};
public Plugin:myinfo =
{
    name = "Contracts",
    description = "",
    author = "Tonki_Ton",
    version = "1.0.0",
    url = "vk.com/tonki_ton"
};
new g_iClientAward[66];
new g_iPercent;
new g_iTemporaryMoney[66];
new g_iTempClient[66];
new g_iColors[4];
new bool:g_bPrintTime[66];
new String:g_sClienWeapon[66][64];
new String:g_sTempCategory[66][64];
new String:g_sTempWeapon[66][64];
new String:g_sExecutor[66][36];
new Handle:g_hCookies;
new KeyValues:g_hKV;
public void:__ext_core_SetNTVOptional()
{
    MarkNativeAsOptional("GetFeatureStatus");
    MarkNativeAsOptional("RequireFeature");
    MarkNativeAsOptional("AddCommandListener");
    MarkNativeAsOptional("RemoveCommandListener");
    MarkNativeAsOptional("BfWriteBool");
    MarkNativeAsOptional("BfWriteByte");
    MarkNativeAsOptional("BfWriteChar");
    MarkNativeAsOptional("BfWriteShort");
    MarkNativeAsOptional("BfWriteWord");
    MarkNativeAsOptional("BfWriteNum");
    MarkNativeAsOptional("BfWriteFloat");
    MarkNativeAsOptional("BfWriteString");
    MarkNativeAsOptional("BfWriteEntity");
    MarkNativeAsOptional("BfWriteAngle");
    MarkNativeAsOptional("BfWriteCoord");
    MarkNativeAsOptional("BfWriteVecCoord");
    MarkNativeAsOptional("BfWriteVecNormal");
    MarkNativeAsOptional("BfWriteAngles");
    MarkNativeAsOptional("BfReadBool");
    MarkNativeAsOptional("BfReadByte");
    MarkNativeAsOptional("BfReadChar");
    MarkNativeAsOptional("BfReadShort");
    MarkNativeAsOptional("BfReadWord");
    MarkNativeAsOptional("BfReadNum");
    MarkNativeAsOptional("BfReadFloat");
    MarkNativeAsOptional("BfReadString");
    MarkNativeAsOptional("BfReadEntity");
    MarkNativeAsOptional("BfReadAngle");
    MarkNativeAsOptional("BfReadCoord");
    MarkNativeAsOptional("BfReadVecCoord");
    MarkNativeAsOptional("BfReadVecNormal");
    MarkNativeAsOptional("BfReadAngles");
    MarkNativeAsOptional("BfGetNumBytesLeft");
    MarkNativeAsOptional("BfWrite.WriteBool");
    MarkNativeAsOptional("BfWrite.WriteByte");
    MarkNativeAsOptional("BfWrite.WriteChar");
    MarkNativeAsOptional("BfWrite.WriteShort");
    MarkNativeAsOptional("BfWrite.WriteWord");
    MarkNativeAsOptional("BfWrite.WriteNum");
    MarkNativeAsOptional("BfWrite.WriteFloat");
    MarkNativeAsOptional("BfWrite.WriteString");
    MarkNativeAsOptional("BfWrite.WriteEntity");
    MarkNativeAsOptional("BfWrite.WriteAngle");
    MarkNativeAsOptional("BfWrite.WriteCoord");
    MarkNativeAsOptional("BfWrite.WriteVecCoord");
    MarkNativeAsOptional("BfWrite.WriteVecNormal");
    MarkNativeAsOptional("BfWrite.WriteAngles");
    MarkNativeAsOptional("BfRead.ReadBool");
    MarkNativeAsOptional("BfRead.ReadByte");
    MarkNativeAsOptional("BfRead.ReadChar");
    MarkNativeAsOptional("BfRead.ReadShort");
    MarkNativeAsOptional("BfRead.ReadWord");
    MarkNativeAsOptional("BfRead.ReadNum");
    MarkNativeAsOptional("BfRead.ReadFloat");
    MarkNativeAsOptional("BfRead.ReadString");
    MarkNativeAsOptional("BfRead.ReadEntity");
    MarkNativeAsOptional("BfRead.ReadAngle");
    MarkNativeAsOptional("BfRead.ReadCoord");
    MarkNativeAsOptional("BfRead.ReadVecCoord");
    MarkNativeAsOptional("BfRead.ReadVecNormal");
    MarkNativeAsOptional("BfRead.ReadAngles");
    MarkNativeAsOptional("BfRead.BytesLeft.get");
    MarkNativeAsOptional("PbReadInt");
    MarkNativeAsOptional("PbReadFloat");
    MarkNativeAsOptional("PbReadBool");
    MarkNativeAsOptional("PbReadString");
    MarkNativeAsOptional("PbReadColor");
    MarkNativeAsOptional("PbReadAngle");
    MarkNativeAsOptional("PbReadVector");
    MarkNativeAsOptional("PbReadVector2D");
    MarkNativeAsOptional("PbGetRepeatedFieldCount");
    MarkNativeAsOptional("PbSetInt");
    MarkNativeAsOptional("PbSetFloat");
    MarkNativeAsOptional("PbSetBool");
    MarkNativeAsOptional("PbSetString");
    MarkNativeAsOptional("PbSetColor");
    MarkNativeAsOptional("PbSetAngle");
    MarkNativeAsOptional("PbSetVector");
    MarkNativeAsOptional("PbSetVector2D");
    MarkNativeAsOptional("PbAddInt");
    MarkNativeAsOptional("PbAddFloat");
    MarkNativeAsOptional("PbAddBool");
    MarkNativeAsOptional("PbAddString");
    MarkNativeAsOptional("PbAddColor");
    MarkNativeAsOptional("PbAddAngle");
    MarkNativeAsOptional("PbAddVector");
    MarkNativeAsOptional("PbAddVector2D");
    MarkNativeAsOptional("PbRemoveRepeatedFieldValue");
    MarkNativeAsOptional("PbReadMessage");
    MarkNativeAsOptional("PbReadRepeatedMessage");
    MarkNativeAsOptional("PbAddMessage");
    MarkNativeAsOptional("Protobuf.ReadInt");
    MarkNativeAsOptional("Protobuf.ReadFloat");
    MarkNativeAsOptional("Protobuf.ReadBool");
    MarkNativeAsOptional("Protobuf.ReadString");
    MarkNativeAsOptional("Protobuf.ReadColor");
    MarkNativeAsOptional("Protobuf.ReadAngle");
    MarkNativeAsOptional("Protobuf.ReadVector");
    MarkNativeAsOptional("Protobuf.ReadVector2D");
    MarkNativeAsOptional("Protobuf.GetRepeatedFieldCount");
    MarkNativeAsOptional("Protobuf.SetInt");
    MarkNativeAsOptional("Protobuf.SetFloat");
    MarkNativeAsOptional("Protobuf.SetBool");
    MarkNativeAsOptional("Protobuf.SetString");
    MarkNativeAsOptional("Protobuf.SetColor");
    MarkNativeAsOptional("Protobuf.SetAngle");
    MarkNativeAsOptional("Protobuf.SetVector");
    MarkNativeAsOptional("Protobuf.SetVector2D");
    MarkNativeAsOptional("Protobuf.AddInt");
    MarkNativeAsOptional("Protobuf.AddFloat");
    MarkNativeAsOptional("Protobuf.AddBool");
    MarkNativeAsOptional("Protobuf.AddString");
    MarkNativeAsOptional("Protobuf.AddColor");
    MarkNativeAsOptional("Protobuf.AddAngle");
    MarkNativeAsOptional("Protobuf.AddVector");
    MarkNativeAsOptional("Protobuf.AddVector2D");
    MarkNativeAsOptional("Protobuf.RemoveRepeatedFieldValue");
    MarkNativeAsOptional("Protobuf.ReadMessage");
    MarkNativeAsOptional("Protobuf.ReadRepeatedMessage");
    MarkNativeAsOptional("Protobuf.AddMessage");
    VerifyCoreVersion();
    return void:0;
}

bool:StrEqual(String:str1[], String:str2[], bool:caseSensitive)
{
    return strcmp(str1, str2, caseSensitive) == 0;
}

ExplodeString(String:text[], String:split[], String:buffers[][], maxStrings, maxStringLength, bool:copyRemainder)
{
    new reloc_idx;
    new idx;
    new total;
    new var1;
    if (maxStrings < 1 || !split[0])
    {
        return 0;
    }
    while ((idx = SplitString(text[reloc_idx], split, buffers[total], maxStringLength)) != -1)
    {
        reloc_idx = idx + reloc_idx;
        total++;
        if (maxStrings == total)
        {
            if (copyRemainder)
            {
                strcopy(buffers[total + -1], maxStringLength, text[reloc_idx - idx]);
            }
            return total;
        }
    }
    total++;
    strcopy(buffers[total], maxStringLength, text[reloc_idx]);
    return total;
}

Handle:StartMessageOne(String:msgname[], client, flags)
{
    new players[1];
    players[0] = client;
    return StartMessage(msgname, players, 1, flags);
}

GetEntSendPropOffs(ent, String:prop[], bool:actual)
{
    new String:cls[64];
    if (!GetEntityNetClass(ent, cls, 64))
    {
        return -1;
    }
    new local = -1;
    new offset = FindSendPropInfo(cls, prop, 0, 0, local);
    if (actual)
    {
        return offset;
    }
    return local;
}

void:SetEntityRenderMode(entity, RenderMode:mode)
{
    static bool:gotconfig;
    static String:prop[32];
    if (!gotconfig)
    {
        new Handle:gc = LoadGameConfigFile("core.games");
        new bool:exists = GameConfGetKeyValue(gc, "m_nRenderMode", prop, 32);
        CloseHandle(gc);
        if (!exists)
        {
            strcopy(prop, 32, "m_nRenderMode");
        }
        gotconfig = true;
    }
    SetEntProp(entity, PropType:0, prop, mode, 1, 0);
    return void:0;
}

void:SetEntityRenderColor(entity, r, g, b, a)
{
    static bool:gotconfig;
    static String:prop[32];
    if (!gotconfig)
    {
        new Handle:gc = LoadGameConfigFile("core.games");
        new bool:exists = GameConfGetKeyValue(gc, "m_clrRender", prop, 32);
        CloseHandle(gc);
        if (!exists)
        {
            strcopy(prop, 32, "m_clrRender");
        }
        gotconfig = true;
    }
    new offset = GetEntSendPropOffs(entity, prop, false);
    if (0 >= offset)
    {
        ThrowError("SetEntityRenderColor not supported by this mod");
    }
    SetEntData(entity, offset, r, 1, true);
    SetEntData(entity, offset + 1, g, 1, true);
    SetEntData(entity, offset + 2, b, 1, true);
    SetEntData(entity, offset + 3, a, 1, true);
    return void:0;
}

CPrintToChat(client, String:szMessage[])
{
    new var1;
    if (client <= 0 || client > MaxClients)
    {
        ThrowError("Invalid client index %d", client);
    }
    if (!IsClientInGame(client))
    {
        ThrowError("Client %d is not in game", client);
    }
    decl String:szBuffer[252];
    decl String:szCMessage[252];
    SetGlobalTransTarget(client);
    Format(szBuffer, 250, "\x01%s", szMessage);
    VFormat(szCMessage, 250, szBuffer, 3);
    new index = CFormat(szCMessage, 250, -1);
    if (index == -1)
    {
        PrintToChat(client, szCMessage);
    }
    else
    {
        CSayText2(client, index, szCMessage);
    }
    return 0;
}

CPrintToChatAll(String:szMessage[])
{
    decl String:szBuffer[252];
    new i = 1;
    while (i <= MaxClients)
    {
        new var1;
        if (IsClientInGame(i) && !IsFakeClient(i) && !CSkipList[i])
        {
            SetGlobalTransTarget(i);
            VFormat(szBuffer, 250, szMessage, 2);
            CPrintToChat(i, szBuffer);
        }
        CSkipList[i] = 0;
        i++;
    }
    return 0;
}

CFormat(String:szMessage[], maxlength, author)
{
    if (!CEventIsHooked)
    {
        CSetupProfile();
        HookEvent("server_spawn", CEvent_MapStart, EventHookMode:2);
        CEventIsHooked = true;
    }
    new iRandomPlayer = -1;
    if (author != -1)
    {
        if (CProfile_SayText2)
        {
            ReplaceString(szMessage, maxlength, "{teamcolor}", "\x03", true);
            iRandomPlayer = author;
        }
        else
        {
            ReplaceString(szMessage, maxlength, "{teamcolor}", CTagCode[1], true);
        }
    }
    else
    {
        ReplaceString(szMessage, maxlength, "{teamcolor}", "", true);
    }
    new i;
    while (i < 6)
    {
        if (!(StrContains(szMessage, CTag[i], true) == -1))
        {
            if (!CProfile_Colors[i])
            {
                ReplaceString(szMessage, maxlength, CTag[i], CTagCode[1], true);
            }
            else
            {
                if (!CTagReqSayText2[i])
                {
                    ReplaceString(szMessage, maxlength, CTag[i], CTagCode[i], true);
                }
                if (!CProfile_SayText2)
                {
                    ReplaceString(szMessage, maxlength, CTag[i], CTagCode[1], true);
                }
                if (iRandomPlayer == -1)
                {
                    iRandomPlayer = CFindRandomPlayerByTeam(CProfile_TeamIndex[i]);
                    if (iRandomPlayer == -2)
                    {
                        ReplaceString(szMessage, maxlength, CTag[i], CTagCode[1], true);
                    }
                    else
                    {
                        ReplaceString(szMessage, maxlength, CTag[i], CTagCode[i], true);
                    }
                }
                ThrowError("Using two team colors in one message is not allowed");
            }
        }
        i++;
    }
    return iRandomPlayer;
}

CFindRandomPlayerByTeam(color_team)
{
    if (color_team)
    {
        new i = 1;
        while (i <= MaxClients)
        {
            new var1;
            if (IsClientInGame(i) && color_team == GetClientTeam(i))
            {
                return i;
            }
            i++;
        }
        return -2;
    }
    return 0;
}

CSayText2(client, author, String:szMessage[])
{
    new Handle:hBuffer = StartMessageOne("SayText2", client, 0);
    if (GetUserMessageType() == 1)
    {
        PbSetInt(hBuffer, "ent_idx", author, -1);
        PbSetBool(hBuffer, "chat", true, -1);
        PbSetString(hBuffer, "msg_name", szMessage, -1);
        PbAddString(hBuffer, "params", "");
        PbAddString(hBuffer, "params", "");
        PbAddString(hBuffer, "params", "");
        PbAddString(hBuffer, "params", "");
    }
    else
    {
        BfWriteByte(hBuffer, author);
        BfWriteByte(hBuffer, 1);
        BfWriteString(hBuffer, szMessage);
    }
    EndMessage();
    return 0;
}

CSetupProfile()
{
    decl String:szGameName[32];
    GetGameFolderName(szGameName, 30);
    if (StrEqual(szGameName, "cstrike", false))
    {
        CProfile_Colors[2] = 1;
        CProfile_Colors[3] = 1;
        CProfile_Colors[4] = 1;
        CProfile_Colors[5] = 1;
        CProfile_TeamIndex[2] = 0;
        CProfile_TeamIndex[3] = 2;
        CProfile_TeamIndex[4] = 3;
        CProfile_SayText2 = true;
    }
    else
    {
        if (StrEqual(szGameName, "tf", false))
        {
            CProfile_Colors[2] = 1;
            CProfile_Colors[3] = 1;
            CProfile_Colors[4] = 1;
            CProfile_Colors[5] = 1;
            CProfile_TeamIndex[2] = 0;
            CProfile_TeamIndex[3] = 2;
            CProfile_TeamIndex[4] = 3;
            CProfile_SayText2 = true;
        }
        new var1;
        if (StrEqual(szGameName, "left4dead", false) || StrEqual(szGameName, "left4dead2", false))
        {
            CProfile_Colors[2] = 1;
            CProfile_Colors[3] = 1;
            CProfile_Colors[4] = 1;
            CProfile_Colors[5] = 1;
            CProfile_TeamIndex[2] = 0;
            CProfile_TeamIndex[3] = 3;
            CProfile_TeamIndex[4] = 2;
            CProfile_SayText2 = true;
        }
        if (StrEqual(szGameName, "hl2mp", false))
        {
            if (GetConVarBool(FindConVar("mp_teamplay")))
            {
                CProfile_Colors[3] = 1;
                CProfile_Colors[4] = 1;
                CProfile_Colors[5] = 1;
                CProfile_TeamIndex[3] = 3;
                CProfile_TeamIndex[4] = 2;
                CProfile_SayText2 = true;
            }
            else
            {
                CProfile_SayText2 = false;
                CProfile_Colors[5] = 1;
            }
        }
        if (StrEqual(szGameName, "dod", false))
        {
            CProfile_Colors[5] = 1;
            CProfile_SayText2 = false;
        }
        if (GetUserMessageId("SayText2") == -1)
        {
            CProfile_SayText2 = false;
        }
        CProfile_Colors[3] = 1;
        CProfile_Colors[4] = 1;
        CProfile_TeamIndex[3] = 2;
        CProfile_TeamIndex[4] = 3;
        CProfile_SayText2 = true;
    }
    return 0;
}

public Action:CEvent_MapStart(Handle:event, String:name[], bool:dontBroadcast)
{
    CSetupProfile();
    new i = 1;
    while (i <= MaxClients)
    {
        CSkipList[i] = 0;
        i++;
    }
    return Action:0;
}

public void:OnPluginStart()
{
    g_hCookies = RegClientCookie("contracts", "", CookieAccess:2);
    RegConsoleCmd("sm_contracts", ContCmd, "", 0);
    RegConsoleCmd("sm_nb", ContCmdNB, "", 0);
    new i = 1;
    while (i <= MaxClients)
    {
        new var1;
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            OnClientCookiesCached(i);
        }
        i++;
    }
    HookEvent("player_spawn", ePS, EventHookMode:1);
    HookEvent("player_death", ePD, EventHookMode:1);
    return void:0;
}

public void:OnPluginEnd()
{
    new i = 1;
    while (i <= MaxClients)
    {
        new var1;
        if (IsClientInGame(i) && !IsFakeClient(i))
        {
            OnClientDisconnect(i);
        }
        i++;
    }
    return void:0;
}

public void:OnMapStart()
{
    if (g_hKV)
    {
        CloseHandle(g_hKV);
        g_hKV = MissingTAG:0;
    }
    new String:sBuff[256];
    new String:sColors[4][8] = {
        "contracts",
        "s",
        "",
        "igs/contracts.ini"
    };
    g_hKV = KeyValues.KeyValues("contracts", "", "");
    BuildPath(PathType:0, sBuff, 256, "configs/contracts.ini");
    if (!KeyValues.ImportFromFile(g_hKV, sBuff))
    {
        SetFailState("Конфигурационный файл отсутсвует!");
    }
    g_iPercent = KeyValues.GetNum(g_hKV, "percent", 0);
    KeyValues.GetString(g_hKV, "player_colors", sBuff, 32, "");
    ExplodeString(sBuff, " ", sColors, 4, 8, false);
    new i;
    while (i < 4)
    {
        g_iColors[i] = StringToInt(sColors[i], 10);
        i++;
    }
    return void:0;
}

public Action:ContCmdNB(iClient, iArgs)
{
    GlobaWantedList(iClient);
    return Action:3;
}

public Action:ContCmd(iClient, iArgs)
{
    new Menu:hMenu = Menu.Menu(ConMainMenuHandler, MenuAction:28);
    Menu.SetTitle(hMenu, "Награда за голову\n ");
    Menu.AddItem(hMenu, NULL_STRING, "Выставить награду", 0);
    new iCount;
    new String:sAuth[36];
    GetClientAuthId(iClient, AuthIdType:1, sAuth, 36, true);
    new i = 1;
    while (i <= MaxClients)
    {
        new var1;
        if (IsClientInGame(i) && !IsFakeClient(i) && !strcmp(g_sExecutor[i], sAuth, true))
        {
            iCount++;
        }
        i++;
    }
    if (!iCount)
    {
        Menu.AddItem(hMenu, NULL_STRING, "Снять награду (Выставленно: 0)\n ", 1);
    }
    else
    {
        new String:sBuff[64];
        FormatEx(sBuff, 64, "Снять награду (Выставленно: %i)\n ", iCount);
        Menu.AddItem(hMenu, NULL_STRING, sBuff, 0);
    }
    Menu.AddItem(hMenu, NULL_STRING, "Список особо опасных", 0);
    Menu.Display(hMenu, iClient, 0);
    return Action:3;
}

ConMainMenuHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            switch (iPick)
            {
                case 0:
                {
                    ChoiceAmount(iClient);
                }
                case 1:
                {
                    YourWantedList(iClient);
                }
                case 2:
                {
                    GlobaWantedList(iClient);
                }
                default:
                {
                }
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:GlobaWantedList(iClient)
{
    new Menu:hMenu = Menu.Menu(GlobalWantedListMenuHandler, MenuAction:28);
    Menu.SetTitle(hMenu, "Список особо опасных:\n ");
    new String:sName[64];
    new String:sUserID[16];
    new i = 1;
    while (i < MaxClients)
    {
        new var1;
        if (IsClientInGame(i) && g_iClientAward[i])
        {
            IntToString(GetClientUserId(i), sUserID, 16);
            FormatEx(sName, 64, "%N", i);
            Menu.AddItem(hMenu, sUserID, sName, 0);
        }
        i++;
    }
    if (!Menu.ItemCount.get(hMenu))
    {
        Menu.AddItem(hMenu, NULL_STRING, "Нет подходящих игроков.", 1);
    }
    Menu.ExitBackButton.set(hMenu, true);
    Menu.Display(hMenu, iClient, 0);
    return void:0;
}

GlobalWantedListMenuHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            new String:sPick[16];
            Menu.GetItem(hMenu, iPick, sPick, 16, 0, "", 0);
            new iPicker = GetClientOfUserId(StringToInt(sPick, 10));
            new var1;
            if (!iPicker || !IsClientInGame(iPicker))
            {
                CPrintToChat(iClient, "\x01[SM] \x04Выбранный игрок покинул сервер\x01.");
                GlobaWantedList(iClient);
                return 0;
            }
            ConfirmWipe(iClient, iPicker);
        }
        case 8:
        {
            if (iPick == -6)
            {
                ContCmd(iClient, 0);
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:ConfirmWipe(iClient, iPicker)
{
    new Panel:hTop = Panel.Panel(Handle:0);
    new String:sDisplay[128];
    FormatEx(sDisplay, 128, "Награда за голову %N:\n ", iPicker);
    Panel.SetTitle(hTop, sDisplay, false);
    FormatEx(sDisplay, 128, "Размер награды: %i кредитов", g_iClientAward[iPicker]);
    Panel.DrawText(hTop, sDisplay);
    FormatEx(sDisplay, 128, "Условия выполнения: Оружие %s", g_sClienWeapon[iPicker][1]);
    Panel.DrawText(hTop, sDisplay);
    new String:sAuth[32];
    new iExecutor;
    new i = 1;
    while (i < MaxClients)
    {
        if (IsClientInGame(i))
        {
            GetClientAuthId(i, AuthIdType:1, sAuth, 32, true);
            if (!strcmp(g_sExecutor[iPicker], sAuth, true))
            {
                iExecutor = i;
            }
        }
        i++;
    }
    new var1;
    if (!iExecutor)
    {
        var1[0] = 21388;
    }
    else
    {
        var1[0] = 21428;
    }
    FormatEx(sDisplay, 128, var1, iExecutor);
    Panel.DrawText(hTop, sDisplay);
    Panel.DrawItem(hTop, " ", 10);
    SetPanelCurrentKey(hTop, 1);
    Panel.DrawItem(hTop, "Назад", 0);
    Panel.Send(hTop, iClient, ConfirmWipeHandler, 30);
    CloseHandle(hTop);
    hTop = MissingTAG:0;
    return void:0;
}

ConfirmWipeHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            GlobaWantedList(iClient);
            ClientCommand(iClient, "play buttons/combine_button7.wav");
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:YourWantedList(iClient)
{
    new Menu:hMenu = Menu.Menu(YouWantedListMenuHandler, MenuAction:28);
    Menu.SetTitle(hMenu, "Выберите игрока:\nКомиссия: %i\n ", g_iPercent);
    new String:sName[64];
    new String:sUserID[16];
    new String:sAuth[36];
    GetClientAuthId(iClient, AuthIdType:1, sAuth, 36, true);
    new i = 1;
    while (i < MaxClients)
    {
        new var1;
        if (IsClientInGame(i) && g_iClientAward[i] && !strcmp(g_sExecutor[i], sAuth, true))
        {
            IntToString(GetClientUserId(i), sUserID, 16);
            FormatEx(sName, 64, "%N", i);
            Menu.AddItem(hMenu, sUserID, sName, 0);
        }
        i++;
    }
    if (!Menu.ItemCount.get(hMenu))
    {
        Menu.AddItem(hMenu, NULL_STRING, "Нет подходящих игроков", 1);
    }
    Menu.ExitBackButton.set(hMenu, true);
    Menu.Display(hMenu, iClient, 0);
    return void:0;
}

YouWantedListMenuHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            new String:sPick[16];
            Menu.GetItem(hMenu, iPick, sPick, 16, 0, "", 0);
            new iPicker = GetClientOfUserId(StringToInt(sPick, 10));
            new var1;
            if (!iPicker || !IsClientInGame(iPicker))
            {
                CPrintToChat(iClient, "\x01[SM] \x04Выбранный игрок покинул сервер\x01.");
                YourWantedList(iClient);
                return 0;
            }
            CPrintToChatAll("\x01%N \x04снял заказ на голову игрока {red}%N", iClient, iPicker);
            CPrintToChat(iClient, "\x01Вы вернули \x04%i \x01кредитов за отменненный заказ", g_iClientAward[iPicker]);
            decl iAmount;
            new var2 = g_iClientAward[iPicker];
            new var3 = g_iPercent * g_iClientAward[iPicker] / 100;
            var2 -= var3;
            iAmount = var2 - var3;
            Shop_GiveClientCredits(iClient, iAmount, -5);
            g_iClientAward[iPicker] = 0;
            SetClientCookie(iPicker, g_hCookies, NULL_STRING);
            ContCmd(iClient, 0);
        }
        case 8:
        {
            if (iPick == -6)
            {
                ContCmd(iClient, 0);
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:ChoiceAmount(iClient)
{
    new Menu:hMenu = Menu.Menu(ConAmountMenuHandler, MenuAction:28);
    Menu.SetTitle(hMenu, "Выберите награду\n ");
    Menu.AddItem(hMenu, "chat", "Выставить награду через чат", 0);
    KeyValues.Rewind(g_hKV);
    new var1;
    if (KeyValues.JumpToKey(g_hKV, "amounts", false) && KeyValues.GotoFirstSubKey(g_hKV, false))
    {
        new String:sSecName[32];
        new String:sName[64];
        do {
            KeyValues.GetSectionName(g_hKV, sSecName, 32);
            KeyValues.GetString(g_hKV, NULL_STRING, sName, 64, "");
            new var2;
            if (StringToInt(sSecName, 10) > Shop_GetClientCredits(iClient))
            {
                var2 = 1;
            }
            else
            {
                var2 = 0;
            }
            Menu.AddItem(hMenu, sSecName, sName, var2);
        } while (KeyValues.GotoNextKey(g_hKV, false));
    }
    Menu.ExitBackButton.set(hMenu, true);
    Menu.Display(hMenu, iClient, 0);
    return void:0;
}

ConAmountMenuHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            new String:sPick[32];
            Menu.GetItem(hMenu, iPick, sPick, 32, 0, "", 0);
            if (!strcmp(sPick, "chat", true))
            {
                g_bPrintTime[iClient] = 1;
            }
            else
            {
                g_iTemporaryMoney[iClient] = StringToInt(sPick, 10);
                ChoiceWeaponSection(iClient);
            }
        }
        case 8:
        {
            if (iPick == -6)
            {
                ContCmd(iClient, 0);
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:ChoiceWeaponSection(iClient)
{
    new Menu:hMenu = Menu.Menu(ConWepSectionMenuHandler, MenuAction:28);
    Menu.SetTitle(hMenu, "Выберите тип оружия:\n ");
    KeyValues.Rewind(g_hKV);
    new var1;
    if (KeyValues.JumpToKey(g_hKV, "weapons", false) && KeyValues.GotoFirstSubKey(g_hKV, true))
    {
        new String:sSecName[48];
        do {
            KeyValues.GetSectionName(g_hKV, sSecName, 48);
            Menu.AddItem(hMenu, sSecName, sSecName, 0);
        } while (KeyValues.GotoNextKey(g_hKV, true));
    }
    Menu.ExitBackButton.set(hMenu, true);
    Menu.Display(hMenu, iClient, 0);
    return void:0;
}

ConWepSectionMenuHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            new String:sPick[48];
            Menu.GetItem(hMenu, iPick, sPick, 48, 0, "", 0);
            strcopy(g_sTempCategory[iClient], 64, sPick);
            ChoiceWeapon(iClient, sPick);
        }
        case 8:
        {
            if (iPick == -6)
            {
                ChoiceAmount(iClient);
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:ChoiceWeapon(iClient, String:sWeapon[])
{
    new Menu:hMenu = Menu.Menu(ConWepMenuHandler, MenuAction:28);
    Menu.SetTitle(hMenu, "Категория: %s\nВыберите оружие:\n ", g_sTempCategory[iClient]);
    KeyValues.Rewind(g_hKV);
    new var1;
    if (KeyValues.JumpToKey(g_hKV, "weapons", false) && KeyValues.JumpToKey(g_hKV, sWeapon, false) && KeyValues.GotoFirstSubKey(g_hKV, false))
    {
        new String:sSecName[48];
        new String:sName[64];
        do {
            KeyValues.GetSectionName(g_hKV, sSecName, 48);
            KeyValues.GetString(g_hKV, NULL_STRING, sName, 64, "");
            Menu.AddItem(hMenu, sSecName, sName, 0);
        } while (KeyValues.GotoNextKey(g_hKV, false));
    }
    Menu.ExitBackButton.set(hMenu, true);
    Menu.Display(hMenu, iClient, 0);
    return void:0;
}

ConWepMenuHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            new String:sPick[48];
            Menu.GetItem(hMenu, iPick, sPick, 48, 0, "", 0);
            strcopy(g_sTempWeapon[iClient], 64, sPick);
            PlayerListMenu(iClient);
        }
        case 8:
        {
            if (iPick == -6)
            {
                ChoiceWeaponSection(iClient);
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:PlayerListMenu(iClient)
{
    new Menu:hMenu = Menu.Menu(ConPlayerListMenuHandler, MenuAction:28);
    Menu.SetTitle(hMenu, "Выберите игрока:\n ", iClient);
    new String:sName[64];
    new String:sUserID[16];
    new i = 1;
    while (i < MaxClients)
    {
        new var1;
        if (IsClientInGame(i) && !g_iClientAward[i])
        {
            IntToString(GetClientUserId(i), sUserID, 16);
            FormatEx(sName, 64, "%N", i);
            Menu.AddItem(hMenu, sUserID, sName, 0);
        }
        i++;
    }
    if (!Menu.ItemCount.get(hMenu))
    {
        Menu.AddItem(hMenu, NULL_STRING, "Нет подходящих игроков", 1);
    }
    Menu.ExitBackButton.set(hMenu, true);
    Menu.Display(hMenu, iClient, 0);
    return void:0;
}

ConPlayerListMenuHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            new String:sPick[16];
            Menu.GetItem(hMenu, iPick, sPick, 16, 0, "", 0);
            new iPicker = GetClientOfUserId(StringToInt(sPick, 10));
            new var1;
            if (!iPicker || !IsClientInGame(iPicker))
            {
                CPrintToChat(iClient, "\x01[SM] \x04Выбранный игрок покинул сервер\x01.");
                PlayerListMenu(iClient);
                return 0;
            }
            ConfirmContract(iClient, iPicker);
        }
        case 8:
        {
            if (iPick == -6)
            {
                ChoiceWeapon(iClient, g_sTempCategory[iClient]);
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

void:ConfirmContract(iClient, iPicker)
{
    new Panel:hTop = Panel.Panel(Handle:0);
    new String:sDisplay[256];
    new String:sWepName[64];
    KeyValues.Rewind(g_hKV);
    FormatEx(sDisplay, 256, "weapons/%s/%s", g_sTempCategory[iClient], g_sTempWeapon[iClient]);
    KeyValues.GetString(g_hKV, sDisplay, sWepName, 64, "");
    FormatEx(sDisplay, 256, "Вы уверены, что хотите выставить\nнаграду за голову игрока %N\nв размере %i кредитов\nОружие: %s", iPicker, g_iTemporaryMoney[iClient], sWepName);
    Panel.SetTitle(hTop, sDisplay, false);
    g_iTempClient[iClient] = iPicker;
    Panel.DrawItem(hTop, " ", 10);
    SetPanelCurrentKey(hTop, 1);
    Panel.DrawItem(hTop, "Выставить Награду", 0);
    SetPanelCurrentKey(hTop, 2);
    Panel.DrawItem(hTop, "Разорвать Контракт", 0);
    Panel.Send(hTop, iClient, ConfirmContractHandler, 30);
    CloseHandle(hTop);
    hTop = MissingTAG:0;
    return void:0;
}

ConfirmContractHandler(Menu:hMenu, MenuAction:maAction, iClient, iPick)
{
    switch (maAction)
    {
        case 4:
        {
            if (iPick == 1)
            {
                new var1;
                if (!g_iTempClient[iClient] || !IsClientInGame(g_iTempClient[iClient]))
                {
                    CPrintToChat(iClient, "\x01[SM] \x04Выбранный игрок покинул сервер\x01.");
                    PlayerListMenu(iClient);
                    return 0;
                }
                new String:sAuth[36];
                GetClientAuthId(iClient, AuthIdType:1, sAuth, 36, true);
                g_iClientAward[g_iTempClient[iClient]] = g_iTemporaryMoney[iClient];
                strcopy(g_sClienWeapon[g_iTempClient[iClient]], 64, g_sTempWeapon[iClient]);
                strcopy(g_sExecutor[g_iTempClient[iClient]], 36, sAuth);
                Shop_TakeClientCredits(iClient, g_iTemporaryMoney[iClient], -1);
                CPrintToChat(iClient, "\x01С вашего баланса снято \x04%i \x01кредитов", g_iTemporaryMoney[iClient]);
                CPrintToChatAll("\x04%N \x01выставил награду за голову {red}%N", iClient, g_iTempClient[iClient]);
                new String:sBuff[128];
                new String:sWepName[64];
                KeyValues.Rewind(g_hKV);
                FormatEx(sBuff, 128, "weapons/%s/%s", g_sTempCategory[iClient], g_sTempWeapon[iClient]);
                KeyValues.GetString(g_hKV, sBuff, sWepName, 64, "");
                CPrintToChatAll("\x01Сумма награды: {red}%i \x04кредитов. \x01Оружие: \x04%s", g_iTemporaryMoney[iClient], sWepName);
                ColorPlayer(g_iTempClient[iClient]);
                ClientCommand(iClient, "play buttons/button14.wav");
            }
            else
            {
                ClientCommand(iClient, "play buttons/combine_button7.wav");
            }
        }
        case 16:
        {
            CloseHandle(hMenu);
            hMenu = MissingTAG:0;
        }
        default:
        {
        }
    }
    return 0;
}

public void:ePD(Event:hEvent, String:sName[], bool:bDontBroadcast)
{
    new iAttacker = GetClientOfUserId(Event.GetInt(hEvent, "attacker", 0));
    new iClient = GetClientOfUserId(Event.GetInt(hEvent, "userid", 0));
    new var1;
    if (iAttacker != iClient && IsClientInGame(iClient) && IsClientInGame(iAttacker) && g_iClientAward[iClient])
    {
        new String:sWeapon[48];
        GetClientWeapon(iAttacker, sWeapon, 48);
        if (!strcmp(sWeapon, g_sClienWeapon[iClient], true))
        {
            CPrintToChatAll("\x04%N \x01выполнил заказ на игрока {red}%N \x01и получил \x04%i \x01кредитов", iAttacker, iClient, g_iClientAward[iClient]);
            Shop_GiveClientCredits(iAttacker, g_iClientAward[iClient], -5);
            g_iClientAward[iClient] = 0;
            SetClientCookie(iClient, g_hCookies, NULL_STRING);
        }
    }
    return void:0;
}

public void:ePS(Event:hEvent, String:sName[], bool:bDontBroadcast)
{
    new iClient = GetClientOfUserId(Event.GetInt(hEvent, "userid", 0));
    new var1;
    if (iClient && IsClientInGame(iClient) && g_iClientAward[iClient])
    {
        ColorPlayer(iClient);
    }
    return void:0;
}

void:ColorPlayer(iClient)
{
    SetEntityRenderMode(iClient, RenderMode:1);
    SetEntityRenderColor(iClient, g_iColors[0], g_iColors[1], g_iColors[2], g_iColors[3]);
    return void:0;
}

public Action:OnClientSayCommand(iClient, String:command[], String:sArgs[])
{
    if (g_bPrintTime[iClient])
    {
        new iBet;
        new var1;
        if ((iBet = StringToInt(sArgs, 10)) > Shop_GetClientCredits(iClient) || iBet <= 0)
        {
            CPrintToChat(iClient, "\x01[SM] \x04Некорректная сумма\x01.");
            g_bPrintTime[iClient] = 0;
            return Action:3;
        }
        g_iTemporaryMoney[iClient] = iBet;
        ChoiceWeaponSection(iClient);
        g_bPrintTime[iClient] = 0;
        return Action:3;
    }
    return Action:0;
}

public void:OnClientCookiesCached(iClient)
{
    new String:sCookies[128];
    GetClientCookie(iClient, g_hCookies, sCookies, 128);
    if (sCookies[0])
    {

/* ERROR! offset 23048, count 0, length 23016 */
 function "OnClientCookiesCached" (number 40)
public void:OnClientDisconnect(iClient)
{
    if (g_iClientAward[iClient])
    {
        new String:sCookies[128];
        FormatEx(sCookies, 128, "%i|%s|%s", g_iClientAward[iClient], g_sExecutor[iClient], g_sClienWeapon[iClient]);
        SetClientCookie(iClient, g_hCookies, sCookies);
    }
    return void:0;
}
ну вот configs/contracts.ini, а он залил в configs/shop/contracts.ini
 
Сверху Снизу