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

filipok

Участник
Сообщения
72
Реакции
28
Всем привет, есть плагин:
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_MAINNAME, author = PLUGIN_AUTHOR, version = PLUGIN_VERSION}
public void OnPluginStart()
{
    HookEvent("round_freeze_end", Event_RoundFreezeEnd, EventHookMode_PostNoCopy);
    RegAdminCmd("sm_place", WhereAmI, ADMFLAG_BAN);
}

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

    char location[32];
    GetEntPropString(client, Prop_Send, "m_szLastPlaceName", location, sizeof(location));
    ReplyToCommand(client, "%N is in %s", client, location);
    LogMessage("client %N is in %s", client, location);
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////

public void OnClientPostAdminCheck(int client){
    if(IsCorrectMap && !IsFakeClient(client)){
        SDKHook(client, SDKHook_PostThinkPost, OnPostThinkPost);
        CountPlayers = GetClientCount();
    }
}

public void OnPostThinkPost(int client){
    if(IsPlayerAlive(client))
    {
        static char location[16];
        static int i;
        GetEntPropString(client, Prop_Send, "m_szLastPlaceName", location, sizeof(location));
        //LogMessage("m_szLastPlaceName: %s", location);
        if( CountPlayers < MAX_PLAYERS_WHITHOUT_MIDDLE ){
            for (i = 0; i < 7; ++i){
                //LogMessage("StrEqual: %s-%s -> %b", location, MapName, StrEqual(location, MapName));
                if (StrEqual(location, MapName)){
                    PrintToChat(client, "Не ходи на Б!!!");
                    IgniteEntity(client, 3.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 КБ · Просмотры: 4

Reg1oxeN

Участник
Сообщения
399
Реакции
314
если я правильно понял, то как-то так
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 (i = 0; i < sizeof(MapList); ++i)
    MapList[i][0] - название карты
перебор значений после названия карты в строках осуществляется так
PHP:
for (i = 1; i < sizeof(MapList[]); ++i)
    MapList[позиция_карты][i] - название зоны


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