Переделать плагин Nominate

Статус
В этой теме нельзя размещать новые ответы.

AleksandrM3

Участник
Сообщения
137
Реакции
2
есть стандартный плагин с номинацией карт, мне нужно его переделать, чтобы когда игрок пишет nominate, ему сначала выскакивало меню, где было бы несколько групп :
1. Маленькие карты
2. Стандартные
3. Новые
4. Все

И уже там игрок выбирал нужную карту

PHP:
public PlVers:__version =
{
    version = 5,
    filevers = "1.6.3",
    date = "11/25/2014",
    time = "07:42:41"
};
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 SharedPlugin:__pl_mapchooser =
{
    name = "mapchooser",
    file = "mapchooser.smx",
    required = 1,
};
public Plugin:myinfo =
{
    name = "Map Nominations",
    description = "Provides Map Nominations",
    author = "AlliedModders LLC",
    version = "1.6.3",
    url = "http://www.sourcemod.net/"
};
new Handle:g_Cvar_ExcludeOld;
new Handle:g_Cvar_ExcludeCurrent;
new Handle:g_MapList;
new Handle:g_MapMenu;
new g_mapFileSerial = -1;
new Handle:g_mapTrie;
public __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("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");
    VerifyCoreVersion();
    return 0;
}

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

PrintToChatAll(String:format[])
{
    decl String:buffer[192];
    new i = 1;
    while (i <= MaxClients)
    {
        if (IsClientInGame(i))
        {
            SetGlobalTransTarget(i);
            VFormat(buffer, 192, format, 2);
            PrintToChat(i, "%s", buffer);
        }
        i++;
    }
    return 0;
}

ByteCountToCells(size)
{
    if (!size)
    {
        return 1;
    }
    return size + 3 / 4;
}

public __pl_mapchooser_SetNTVOptional()
{
    MarkNativeAsOptional("NominateMap");
    MarkNativeAsOptional("RemoveNominationByMap");
    MarkNativeAsOptional("RemoveNominationByOwner");
    MarkNativeAsOptional("GetExcludeMapList");
    MarkNativeAsOptional("GetNominatedMapList");
    MarkNativeAsOptional("CanMapChooserStartVote");
    MarkNativeAsOptional("InitiateMapChooserVote");
    MarkNativeAsOptional("HasEndOfMapVoteFinished");
    MarkNativeAsOptional("EndOfMapVoteEnabled");
    return 0;
}

public OnPluginStart()
{
    LoadTranslations("common.phrases");
    LoadTranslations("nominations.phrases");
    new arraySize = ByteCountToCells(33);
    g_MapList = CreateArray(arraySize, 0);
    g_Cvar_ExcludeOld = CreateConVar("sm_nominate_excludeold", "1", "Specifies if the current map should be excluded from the Nominations list", 0, true, 0.0, true, 1.0);
    g_Cvar_ExcludeCurrent = CreateConVar("sm_nominate_excludecurrent", "1", "Specifies if the MapChooser excluded maps should also be excluded from Nominations", 0, true, 0.0, true, 1.0);
    RegConsoleCmd("sm_nominate", Command_Nominate, "", 0);
    RegAdminCmd("sm_nominate_addmap", Command_Addmap, 64, "sm_nominate_addmap <mapname> - Forces a map to be on the next mapvote.", "", 0);
    g_mapTrie = CreateTrie();
    return 0;
}

public OnConfigsExecuted()
{
    if (!(ReadMapList(g_MapList, g_mapFileSerial, "nominations", 3)))
    {
        if (g_mapFileSerial == -1)
        {
            SetFailState("Unable to create a valid map list.");
        }
    }
    BuildMapMenu();
    return 0;
}

public OnNominationRemoved(String:map[], owner)
{
    new status;
    if (!GetTrieValue(g_mapTrie, map, status))
    {
        return 0;
    }
    if (status & 16 != 16)
    {
        return 0;
    }
    SetTrieValue(g_mapTrie, map, any:1, true);
    return 0;
}

public Action:Command_Addmap(client, args)
{
    if (args < 1)
    {
        ReplyToCommand(client, "[SM] Usage: sm_nominate_addmap <mapname>");
        return Action:3;
    }
    decl String:mapname[64];
    GetCmdArg(1, mapname, 64);
    new status;
    if (!GetTrieValue(g_mapTrie, mapname, status))
    {
        ReplyToCommand(client, "%t", "Map was not found", mapname);
        return Action:3;
    }
    new NominateResult:result = NominateMap(mapname, true, 0);
    if (result > NominateResult:1)
    {
        ReplyToCommand(client, "%t", "Map Already In Vote", mapname);
        return Action:3;
    }
    SetTrieValue(g_mapTrie, mapname, any:18, true);
    ReplyToCommand(client, "%t", "Map Inserted", mapname);
    LogAction(client, -1, "\"%L\" inserted map \"%s\".", client, mapname);
    return Action:3;
}

public OnClientSayCommand_Post(client, String:command[], String:sArgs[])
{
    if (!client)
    {
        return 0;
    }
    if (!(strcmp(sArgs, "nominate", false)))
    {
        new ReplySource:old = SetCmdReplySource(ReplySource:1);
        AttemptNominate(client);
        SetCmdReplySource(old);
    }
    return 0;
}

public Action:Command_Nominate(client, args)
{
    if (!client)
    {
        return Action:3;
    }
    if (args)
    {
        decl String:mapname[64];
        GetCmdArg(1, mapname, 64);
        new status;
        if (!GetTrieValue(g_mapTrie, mapname, status))
        {
            ReplyToCommand(client, "%t", "Map was not found", mapname);
            return Action:3;
        }
        if (status & 2 == 2)
        {
            if (status & 4 == 4)
            {
                ReplyToCommand(client, "[SM] %t", "Can't Nominate Current Map");
            }
            if (status & 8 == 8)
            {
                ReplyToCommand(client, "[SM] %t", "Map in Exclude List");
            }
            if (status & 16 == 16)
            {
                ReplyToCommand(client, "[SM] %t", "Map Already Nominated");
            }
            return Action:3;
        }
        new NominateResult:result = NominateMap(mapname, false, client);
        if (result > NominateResult:1)
        {
            if (result == NominateResult:2)
            {
                ReplyToCommand(client, "%t", "Map Already In Vote", mapname);
            }
            else
            {
                ReplyToCommand(client, "[SM] %t", "Map Already Nominated");
            }
            return Action:3;
        }
        SetTrieValue(g_mapTrie, mapname, any:18, true);
        decl String:name[64];
        GetClientName(client, name, 64);
        PrintToChatAll("[SM] %t", "Map Nominated", name, mapname);
        return Action:0;
    }
    AttemptNominate(client);
    return Action:3;
}

AttemptNominate(client)
{
    SetMenuTitle(g_MapMenu, "%T", "Nominate Title", client);
    DisplayMenu(g_MapMenu, client, 0);
    return 0;
}

BuildMapMenu()
{
    if (g_MapMenu)
    {
        CloseHandle(g_MapMenu);
        g_MapMenu = MissingTAG:0;
    }
    ClearTrie(g_mapTrie);
    g_MapMenu = CreateMenu(Handler_MapSelectMenu, MenuAction:796);
    decl String:map[64];
    new Handle:excludeMaps;
    decl String:currentMap[32];
    if (GetConVarBool(g_Cvar_ExcludeOld))
    {
        excludeMaps = CreateArray(ByteCountToCells(33), 0);
        GetExcludeMapList(excludeMaps);
    }
    if (GetConVarBool(g_Cvar_ExcludeCurrent))
    {
        GetCurrentMap(currentMap, 32);
    }
    new i;
    while (GetArraySize(g_MapList) > i)
    {
        new status = 1;
        GetArrayString(g_MapList, i, map, 64);
        if (GetConVarBool(g_Cvar_ExcludeCurrent))
        {
            if (StrEqual(map, currentMap, true))
            {
                status = 6;
            }
        }
        new var1;
        if (GetConVarBool(g_Cvar_ExcludeOld) && status == 1)
        {
            if (FindStringInArray(excludeMaps, map) != -1)
            {
                status = 10;
            }
        }
        AddMenuItem(g_MapMenu, map, map, 0);
        SetTrieValue(g_mapTrie, map, status, true);
        i++;
    }
    SetMenuExitButton(g_MapMenu, true);
    if (excludeMaps)
    {
        CloseHandle(excludeMaps);
    }
    return 0;
}

public Handler_MapSelectMenu(Handle:menu, MenuAction:action, param1, param2)
{
    switch (action)
    {
        case 4:
        {
            decl String:map[64];
            decl String:name[64];
            GetMenuItem(menu, param2, map, 64, 0, "", 0);
            GetClientName(param1, name, 64);
            new NominateResult:result = NominateMap(map, false, param1);
            if (result == NominateResult:2)
            {
                PrintToChat(param1, "[SM] %t", "Map Already Nominated");
                return 0;
            }
            if (result == NominateResult:4)
            {
                PrintToChat(param1, "[SM] %t", "Max Nominations");
                return 0;
            }
            SetTrieValue(g_mapTrie, map, any:18, true);
            if (result == NominateResult:1)
            {
                PrintToChatAll("[SM] %t", "Map Nomination Changed", name, map);
                return 0;
            }
            PrintToChatAll("[SM] %t", "Map Nominated", name, map);
        }
        case 256:
        {
            decl String:map[64];
            GetMenuItem(menu, param2, map, 64, 0, "", 0);
            new status;
            if (!GetTrieValue(g_mapTrie, map, status))
            {
                LogError("Menu selection of item not in trie. Major logic problem somewhere.");
                return 0;
            }
            if (status & 2 == 2)
            {
                return 1;
            }
            return 0;
        }
        case 512:
        {
            decl String:map[64];
            GetMenuItem(menu, param2, map, 64, 0, "", 0);
            new status;
            if (!GetTrieValue(g_mapTrie, map, status))
            {
                LogError("Menu selection of item not in trie. Major logic problem somewhere.");
                return 0;
            }
            decl String:display[100];
            if (status & 2 == 2)
            {
                if (status & 4 == 4)
                {
                    Format(display, 100, "%s (%T)", map, "Current Map", param1);
                    return RedrawMenuItem(display);
                }
                if (status & 8 == 8)
                {
                    Format(display, 100, "%s (%T)", map, "Recently Played", param1);
                    return RedrawMenuItem(display);
                }
                if (status & 16 == 16)
                {
                    Format(display, 100, "%s (%T)", map, "Nominated", param1);
                    return RedrawMenuItem(display);
                }
            }
            return 0;
        }
        default:
        {
        }
    }
    return 0;
}
если кто то возьмется , вопрос благодарности, в личку
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу