Транслирование содержимого массива в условие цикла

Тема в разделе "Программирование / Скриптинг", создана пользователем filipok, 25 фев 2016.

  1. filipok

    filipok

    Сообщения:
    73
    Симпатии:
    8
    Всем привет, есть плагин:
    PHP:
    /**
    Credits:

    Топик плагина http://hlmod.ru/threads/maplimit-otbivaem-oxotu-begat-na-b-pri-malom-kolichestve-igrokov-na-karte-de_dust2.34302/
    Этот плагин не был бы таким солидным и супер мега оптимизированным без помощи пользователей http://hlmod.ru/
    Огромное спасибо за помощь и советы пользователям: R1KO и AlmzON
    Особую благодарность хочу выразить AlmazON. В нынешнем состоянии весь код состоит из его подсказок и советов. От меня тут осталась только идея)
    AlmazON, чувак, общение с тобой - бесценный опыт, спасибо.
    **/
    #pragma semicolon 1
    #include <sourcemod>
    #include <sdkhooks>
    #include <sdktools>

    #define PLUGIN_MAINNAME "MapLimit"
    #define PLUGIN_NAME "MapLimit"
    #define PLUGIN_AUTHOR "filip fixed by AlmazON"
    #define PLUGIN_VERSION "0.1.0"

    #define MAX_PLAYERS_WHITHOUT_MIDDLE        10

    char MapList[][] = {
        
    "de_dust2",
        
    "de_inferno",
        
    "de_mirage"
    };

    char de_dust2[][] = { "OutsideTunnel""UpperTunnel""LowerTunnel""Middle""MidDoors""BDoors""BombsiteB" };
    char de_inferno[][] = {"Zone1""Zone2""Zone3""Zone4""Zone5""Zone6""Zone7"};
    char de_mirage[][] = {"Zone1""Zone2""Zone3""Zone4""Zone5""Zone6""Zone7"};

    bool    OneTimeNotify;
    bool    IsCorrectMap;
    int        CountPlayers;
    char    MapName[16];

    public 
    Plugin myinfo = {name PLUGIN_MAINNAMEauthor PLUGIN_AUTHORversion PLUGIN_VERSION}
    public 
    void OnPluginStart()
    {
        
    HookEvent("round_freeze_end"Event_RoundFreezeEndEventHookMode_PostNoCopy);
        
    RegAdminCmd("sm_place"WhereAmIADMFLAG_BAN);
    }

    public 
    void OnConfigsExecuted(){
        
    char sBuffer[16];
        static 
    int i;
        
    GetCurrentMap(sBuffersizeof(sBuffer));
        for (
    0sizeof(MapList); ++i){
            
    IsCorrectMap StrEqual(sBufferMapList[i]);
            if(
    IsCorrectMap){
                
    FormatEx(MapNamesizeof(MapName), "%s[i]"sBuffer);
                return;
            }
        }
    }
    //////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////CheckZoneNameComand (for test)/////////////////////////////////////////////////////
    public Action WhereAmI(int clientint args){

        
    char location[32];
        
    GetEntPropString(clientProp_Send"m_szLastPlaceName"locationsizeof(location));
        
    ReplyToCommand(client"%N is in %s"clientlocation);
        
    LogMessage("client %N is in %s"clientlocation);
    }
    //////////////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////////

    public void OnClientPostAdminCheck(int client){
        if(
    IsCorrectMap && !IsFakeClient(client)){
            
    SDKHook(clientSDKHook_PostThinkPostOnPostThinkPost);
            
    CountPlayers GetClientCount();
        }
    }

    public 
    void OnPostThinkPost(int client){
        if(
    IsPlayerAlive(client))
        {
            static 
    char location[16];
            static 
    int i;
            
    GetEntPropString(clientProp_Send"m_szLastPlaceName"locationsizeof(location));
            
    //LogMessage("m_szLastPlaceName: %s", location);
            
    if( CountPlayers MAX_PLAYERS_WHITHOUT_MIDDLE ){
                for (
    07; ++i){
                    
    //LogMessage("StrEqual: %s-%s -> %b", location, MapName, StrEqual(location, MapName));
                    
    if (StrEqual(locationMapName)){
                        
    PrintToChat(client"Не ходи на Б!!!");
                        
    IgniteEntity(client3.8);
                        return;
                    }
                }
            }
        }
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////////
    ///////////////////////////оповещения вначале раунда///////////////////////////////////////////////

    public Event_RoundFreezeEnd(Handle:event, const String:name[], bool:dontBroadcast) {
        if ( 
    IsCorrectMap ) {
            if (
    GetClientCount() < MAX_PLAYERS_WHITHOUT_MIDDLE){
                
    PrintHintTextToAll("Проходы на Б и мидл запрещены, на сервере менее %d игроков"MAX_PLAYERS_WHITHOUT_MIDDLE);
                
    OneTimeNotify true;
            }
            else if (
    OneTimeNotify){
                
    PrintHintTextToAll("Играет полная карта");
                
    OneTimeNotify false;
            }
        }
    }
    Есть несколько глобальных массивов с названиями карт.
    Получаю название карты и в строке 51 форматирую массив MapName в таком виде: "Название_карты[i)" Проще говоря добавляю [i).
    Далее пытаюсь сравнить MapName в цикле с шагом i (строка 85).
    Чего хочу: подставить в цикл название карты с [I) и что бы оно понималось не как текст, а как ячейка массива.
    Но компилятор выдает варнинги о том, что глобальные массивы с названиями карт не используются, т.е. сурсмод понимает содержание массива MapName именно как текст.

    Есть ли какая-то функция, которая могла бы транслировать текст в другие функции как часть их синтаксиса?
    Надеюсь правильно выразился.
     

    Вложения:

    • MapLimit.sp
      Размер файла:
      4,3 КБ
      Просмотров:
      1
  2. Reg1oxeN

    Reg1oxeN

    Сообщения:
    86
    Симпатии:
    26
    если я правильно понял, то как-то так
    PHP:
    char MapList[][][] =
    {
        {
    "de_dust2""OutsideTunnel""UpperTunnel""LowerTunnel""Middle""MidDoors""BDoors""BombsiteB"},
        {
    "de_inferno""Zone1""Zone2""Zone3""Zone4""Zone5""Zone6""Zone7"},
        {
    "de_mirage""OutsideTunnel""UpperTunnel""LowerTunnel""Middle""MidDoors""BDoors""BombsiteB"}
    };
    перебор карт (строк) делается почти так же
    PHP:
    for (0sizeof(MapList); ++i)
        
    MapList[i][0] - название карты
    перебор значений после названия карты в строках осуществляется так
    PHP:
    for (1sizeof(MapList[]); ++i)
        
    MapList[позиция_карты][i] - название зоны

    имхо, уж лучше юзать конфиги.