Русское сообщество по скриптингу

Помогите найти аналоги функций

Все вопросы по скриптингу для SourceMod, помощь в редактировании плагинов.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптингу для SourceMod.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [pawn], в противном случае, если тег [pawn] не отображает ваш код, можно использовать тег [code].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sp плагина.

Помогите найти аналоги функций

Сообщение Endi » 03 окт 2009, 14:43

Перевожу серверную часть античита с amxx на sourcemode, и возникло давольно много вопросов.
Не смог найти аналог функции
Код: Выделить всё
get_time("%m/%d/%Y - %H:%M:%S",buffer,charsmax(buffer)) 

Обычного write_file там нету да ? Надо открыть файл, а потом по хендлу уже писать.

А еще чем отличается OnClientConnected от OnClientConnect? (Ну по названиям понятно что первый сработыет когда полностью сконектился, но тогда когда сработывает второй?)

Есть ли аналоги precache_generic, md5_file, set_task?

На Вы должны зарегистрироваться, чтобы видеть ссылки. ничего подходящего не нашел..
Аватара пользователя
Endi
 
Сообщения: 95
Зарегистрирован: 25 авг 2009, 11:26
Благодарил (а): 13 раз.
Поблагодарили: 20 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source

Re: Помогите найти аналоги функций

Сообщение DJ_WEST » 04 окт 2009, 00:25

А еще чем отличается OnClientConnected от OnClientConnect? (Ну по названиям понятно что первый сработыет когда полностью сконектился, но тогда когда сработывает второй?)

OnClientConnect - если возвращать true игрок может зайти, если false, то его выкидывает с указанным сообщением в параметрах функции, а также OnClientDisconnect не вызывается.
OnClientConnected - вызывается тогда, когда игрок успешно подсоединился.
Не смог найти аналог функции
get_time("%m/%d/%Y - %H:%M:%S",buffer,charsmax(buffer))

GetTime + FormatTime
Обычного write_file там нету да ? Надо открыть файл, а потом по хендлу уже писать.

Есть WriteFileLine, что-то похожее. Но файл открывать надо самому и передавать в качестве аргумента его хэндл.
Есть ли аналоги precache_generic, md5_file, set_task?

set_task - CreateTimer
precache_generic - PrecacheGeneric (можно через IsGenericPrecached проверить успешность кэширования)
md5_file - аналога не видел, для строки:
Код: Выделить всё
// RSA Data Security, Inc. MD5 Message Digest Algorithm
// -- Ported to SourcePawn by sslice

stock MD5String(const String:str[], String:output[], maxlen)
{
    decl x[2];
    decl buf[4];
    decl input[64];
    new i, ii;
   
    new len = strlen(str);
   
    // MD5Init
    x[0] = x[1] = 0;
    buf[0] = 0x67452301;
    buf[1] = 0xefcdab89;
    buf[2] = 0x98badcfe;
    buf[3] = 0x10325476;
   
    // MD5Update
    new in[16];

    in[14] = x[0];
    in[15] = x[1];
   
    new mdi = (x[0] >>> 3) & 0x3F;
   
    if ((x[0] + (len << 3)) < x[0])
    {
        x[1] += 1;
    }
   
    x[0] += len << 3;
    x[1] += len >>> 29;
   
    new c = 0;
    while (len--)
    {
        input[mdi] = str[c];
        mdi += 1;
        c += 1;
       
        if (mdi == 0x40)
        {
            for (i = 0, ii = 0; i < 16; ++i, ii += 4)
            {
                in[i] = (input[ii + 3] << 24) | (input[ii + 2] << 16) | (input[ii + 1] << 8) | input[ii];
            }
            // Transform
            MD5Transform(buf, in);
           
            mdi = 0;
        }
    }
   
    // MD5Final
    new padding[64] = {
        0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    };
    new inx[16];
    inx[14] = x[0];
    inx[15] = x[1];
   
    mdi = (x[0] >>> 3) & 0x3F;
   
    len = (mdi < 56) ? (56 - mdi) : (120 - mdi);
    in[14] = x[0];
    in[15] = x[1];
   
    mdi = (x[0] >>> 3) & 0x3F;
   
    if ((x[0] + (len << 3)) < x[0])
    {
        x[1] += 1;
    }
   
    x[0] += len << 3;
    x[1] += len >>> 29;
   
    c = 0;
    while (len--)
    {
        input[mdi] = padding[c];
        mdi += 1;
        c += 1;
       
        if (mdi == 0x40)
        {
            for (i = 0, ii = 0; i < 16; ++i, ii += 4)
            {
                in[i] = (input[ii + 3] << 24) | (input[ii + 2] << 16) | (input[ii + 1] << 8) | input[ii];
            }
            // Transform
            MD5Transform(buf, in);
           
            mdi = 0;
        }
    }
   
    for (i = 0, ii = 0; i < 14; ++i, ii += 4)
    {
        inx[i] = (input[ii + 3] << 24) | (input[ii + 2] << 16) | (input[ii + 1] << 8) | input[ii];
    }
    MD5Transform(buf, inx);
   
    new digest[16];
    for (i = 0, ii = 0; i < 4; ++i, ii += 4)
    {
        digest[ii] = (buf[i]) & 0xFF;
        digest[ii + 1] = (buf[i] >>> 8) & 0xFF;
        digest[ii + 2] = (buf[i] >>> 16) & 0xFF;
        digest[ii + 3] = (buf[i] >>> 24) & 0xFF;
    }
   
    FormatEx(output, maxlen, "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
        digest[0], digest[1], digest[2], digest[3], digest[4], digest[5], digest[6], digest[7],
        digest[8], digest[9], digest[10], digest[11], digest[12], digest[13], digest[14], digest[15]);
}

stock MD5Transform_FF(&a, &b, &c, &d, x, s, ac)
{
    a += (((b) & (c)) | ((~b) & (d))) + x + ac;
    a = (((a) << (s)) | ((a) >>> (32-(s))));
    a += b;
}

stock MD5Transform_GG(&a, &b, &c, &d, x, s, ac)
{
    a += (((b) & (d)) | ((c) & (~d))) + x + ac;
    a = (((a) << (s)) | ((a) >>> (32-(s))));
    a += b;
}

stock MD5Transform_HH(&a, &b, &c, &d, x, s, ac)
{
    a += ((b) ^ (c) ^ (d)) + x + ac;
    a = (((a) << (s)) | ((a) >>> (32-(s))));
    a += b;
}

stock MD5Transform_II(&a, &b, &c, &d, x, s, ac)
{
    a += ((c) ^ ((b) | (~d))) + x + ac;
    a = (((a) << (s)) | ((a) >>> (32-(s))));
    a += b;
}

stock MD5Transform(buf[], in[])
{
    new a = buf[0];
    new b = buf[1];
    new c = buf[2];
    new d = buf[3];
   
    MD5Transform_FF(a, b, c, d, in[0], 7, 0xd76aa478);
    MD5Transform_FF(d, a, b, c, in[1], 12, 0xe8c7b756);
    MD5Transform_FF(c, d, a, b, in[2], 17, 0x242070db);
    MD5Transform_FF(b, c, d, a, in[3], 22, 0xc1bdceee);
    MD5Transform_FF(a, b, c, d, in[4], 7, 0xf57c0faf);
    MD5Transform_FF(d, a, b, c, in[5], 12, 0x4787c62a);
    MD5Transform_FF(c, d, a, b, in[6], 17, 0xa8304613);
    MD5Transform_FF(b, c, d, a, in[7], 22, 0xfd469501);
    MD5Transform_FF(a, b, c, d, in[8], 7, 0x698098d8);
    MD5Transform_FF(d, a, b, c, in[9], 12, 0x8b44f7af);
    MD5Transform_FF(c, d, a, b, in[10], 17, 0xffff5bb1);
    MD5Transform_FF(b, c, d, a, in[11], 22, 0x895cd7be);
    MD5Transform_FF(a, b, c, d, in[12], 7, 0x6b901122);
    MD5Transform_FF(d, a, b, c, in[13], 12, 0xfd987193);
    MD5Transform_FF(c, d, a, b, in[14], 17, 0xa679438e);
    MD5Transform_FF(b, c, d, a, in[15], 22, 0x49b40821);
   
    MD5Transform_GG(a, b, c, d, in[1], 5, 0xf61e2562);
    MD5Transform_GG(d, a, b, c, in[6], 9, 0xc040b340);
    MD5Transform_GG(c, d, a, b, in[11], 14, 0x265e5a51);
    MD5Transform_GG(b, c, d, a, in[0], 20, 0xe9b6c7aa);
    MD5Transform_GG(a, b, c, d, in[5], 5, 0xd62f105d);
    MD5Transform_GG(d, a, b, c, in[10], 9, 0x02441453);
    MD5Transform_GG(c, d, a, b, in[15], 14, 0xd8a1e681);
    MD5Transform_GG(b, c, d, a, in[4], 20, 0xe7d3fbc8);
    MD5Transform_GG(a, b, c, d, in[9], 5, 0x21e1cde6);
    MD5Transform_GG(d, a, b, c, in[14], 9, 0xc33707d6);
    MD5Transform_GG(c, d, a, b, in[3], 14, 0xf4d50d87);
    MD5Transform_GG(b, c, d, a, in[8], 20, 0x455a14ed);
    MD5Transform_GG(a, b, c, d, in[13], 5, 0xa9e3e905);
    MD5Transform_GG(d, a, b, c, in[2], 9, 0xfcefa3f8);
    MD5Transform_GG(c, d, a, b, in[7], 14, 0x676f02d9);
    MD5Transform_GG(b, c, d, a, in[12], 20, 0x8d2a4c8a);
   
    MD5Transform_HH(a, b, c, d, in[5], 4, 0xfffa3942);
    MD5Transform_HH(d, a, b, c, in[8], 11, 0x8771f681);
    MD5Transform_HH(c, d, a, b, in[11], 16, 0x6d9d6122);
    MD5Transform_HH(b, c, d, a, in[14], 23, 0xfde5380c);
    MD5Transform_HH(a, b, c, d, in[1], 4, 0xa4beea44);
    MD5Transform_HH(d, a, b, c, in[4], 11, 0x4bdecfa9);
    MD5Transform_HH(c, d, a, b, in[7], 16, 0xf6bb4b60);
    MD5Transform_HH(b, c, d, a, in[10], 23, 0xbebfbc70);
    MD5Transform_HH(a, b, c, d, in[13], 4, 0x289b7ec6);
    MD5Transform_HH(d, a, b, c, in[0], 11, 0xeaa127fa);
    MD5Transform_HH(c, d, a, b, in[3], 16, 0xd4ef3085);
    MD5Transform_HH(b, c, d, a, in[6], 23, 0x04881d05);
    MD5Transform_HH(a, b, c, d, in[9], 4, 0xd9d4d039);
    MD5Transform_HH(d, a, b, c, in[12], 11, 0xe6db99e5);
    MD5Transform_HH(c, d, a, b, in[15], 16, 0x1fa27cf8);
    MD5Transform_HH(b, c, d, a, in[2], 23, 0xc4ac5665);

    MD5Transform_II(a, b, c, d, in[0], 6, 0xf4292244);
    MD5Transform_II(d, a, b, c, in[7], 10, 0x432aff97);
    MD5Transform_II(c, d, a, b, in[14], 15, 0xab9423a7);
    MD5Transform_II(b, c, d, a, in[5], 21, 0xfc93a039);
    MD5Transform_II(a, b, c, d, in[12], 6, 0x655b59c3);
    MD5Transform_II(d, a, b, c, in[3], 10, 0x8f0ccc92);
    MD5Transform_II(c, d, a, b, in[10], 15, 0xffeff47d);
    MD5Transform_II(b, c, d, a, in[1], 21, 0x85845dd1);
    MD5Transform_II(a, b, c, d, in[8], 6, 0x6fa87e4f);
    MD5Transform_II(d, a, b, c, in[15], 10, 0xfe2ce6e0);
    MD5Transform_II(c, d, a, b, in[6], 15, 0xa3014314);
    MD5Transform_II(b, c, d, a, in[13], 21, 0x4e0811a1);
    MD5Transform_II(a, b, c, d, in[4], 6, 0xf7537e82);
    MD5Transform_II(d, a, b, c, in[11], 10, 0xbd3af235);
    MD5Transform_II(c, d, a, b, in[2], 15, 0x2ad7d2bb);
    MD5Transform_II(b, c, d, a, in[9], 21, 0xeb86d391);
   
    buf[0] += a;
    buf[1] += b;
    buf[2] += c;
    buf[3] += d;
}
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Помогите найти аналоги функций

Сообщение Endi » 04 окт 2009, 14:56

Спасибо, сдвинулся с мертвой точки.
По поводу открывания файла и чтения, не будет ли это грузить серв при каждом конекте юзаре скажем открыть banlist, читать построчно а потом закрыть ?
А по поводу md5_file, видимо придеться самому реализовать, ну т.е. читать по 64 байта и пропускать через MD5String да ?
Аватара пользователя
Endi
 
Сообщения: 95
Зарегистрирован: 25 авг 2009, 11:26
Благодарил (а): 13 раз.
Поблагодарили: 20 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source

Re: Помогите найти аналоги функций

Сообщение DJ_WEST » 04 окт 2009, 17:48

По поводу открывания файла и чтения, не будет ли это грузить серв при каждом конекте юзаре скажем открыть banlist, читать построчно а потом закрыть ?

А разве write_file не открывает файл, перемещается в конец файла, записывает строку и закрывает файл? В любом случае можно открыть файл один раз, а закрыть после смена карты или каком-либо другом условии, только тогда ручное взаимодействие с ним (на уровне ОС) думаю врятли будет возможным. Да и считывать можно один раз и хранить информацию в памяти.
А по поводу md5_file, видимо придеться самому реализовать, ну т.е. читать по 64 байта и пропускать через MD5String да ?

Из исходников AMXX функции для md5:
Код: Выделить всё
static cell AMX_NATIVE_CALL amx_md5(AMX *amx, cell *params)
{
    int len = 0;
    char *str = get_amxstring(amx, params[1], 0, len);
    char buffer[33];

    MD5 md5;
    md5.update((unsigned char *)str, len);
    md5.finalize();
    md5.hex_digest(buffer);

    return set_amxstring(amx, params[2], buffer, 32);
}

static cell AMX_NATIVE_CALL amx_md5_file(AMX *amx, cell *params)
{
    int len = 0;
    char *str = get_amxstring(amx, params[1], 0, len);
    char buffer[33];
    char file[255];

    build_pathname_r(file, sizeof(file)-1, "%s", str);

    FILE *fp = fopen(file, "rb");
    
    if 
(!fp)
    {
        LogError(amx, AMX_ERR_NATIVE, "Cant open file \"%s\"", file);
        return 0;
    }

    MD5 md5;
    md5.update(fp);            //closes for you
    md5.finalize();
    md5.hex_digest(buffer);

    return set_amxstring(amx, params[2], buffer, 32);
}
 
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Помогите найти аналоги функций

Сообщение Endi » 16 окт 2009, 11:34

А есть аналог
Код: Выделить всё
      set_hudmessage(id,255,0,-1.0,0.25,0,0.25,5.1,3.1,3.1,4)
      show_hudmessage(id,reason)

?
Аватара пользователя
Endi
 
Сообщения: 95
Зарегистрирован: 25 авг 2009, 11:26
Благодарил (а): 13 раз.
Поблагодарили: 20 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source

Re: Помогите найти аналоги функций

Сообщение DJ_WEST » 16 окт 2009, 11:47

А есть аналог

HUD сообщений в Source не работают, есть HINT:
Код: Выделить всё

PrintHintText
(client, const String:format[], any:...)
PrintHintTextToAll(const String:format[], any:...)
 

Это по-мойму снизу по середине выводит. Можно еще выводить по левому краю в середине через меню, то есть в качестве меню, но без опций. Можно еще выводить текст по центру экрана (белый):
Код: Выделить всё

PrintCenterText
(client, const String:format[], any:...)
PrintCenterTextAll(const String:format[], any:...)
 

VALVe либо забили на HUD, либо забыли о нем, но клиент не может отображать их. Можешь попробовать в CS: Source, к примеру, я не знаю будет работать или нет:
Код: Выделить всё

stock SendMsg_HudMsg
(client, channel, 
                    Float
:x, Float:y, 
                    aRclr
, aGclr, aBclr, aTclr, 
                    bRclr
, bGclr, bBclr, bTclr, 
                    effect
, 
                    Float
:fadein, Float:fadeout, 
                    Float
:holdtime, Float:fxtime, 
                    const String
:szMsg[])
{
  new Handle:hBf;
  if (!client)
     hBf = StartMessageAll("HudMsg");
  else hBf = StartMessageOne("HudMsg", client);
  if (hBf != INVALID_HANDLE)
  {
     BfWriteByte(hBf, channel); //channel
     BfWriteFloat(hBf, x); // x ( -1 = center )
     BfWriteFloat(hBf, y); // y ( -1 = center )
     // second color
     BfWriteByte(hBf, aRclr); //r1
     BfWriteByte(hBf, aGclr); //g1
     BfWriteByte(hBf, aBclr); //b1
     BfWriteByte(hBf, aTclr); //a1 // transparent?
     // init color
     BfWriteByte(hBf, bRclr); //r2
     BfWriteByte(hBf, bGclr); //g2
     BfWriteByte(hBf, bBclr); //b2
     BfWriteByte(hBf, bTclr); //a2
     BfWriteByte(hBf, effect); //effect (0 is fade in/fade out; 1 is flickery credits; 2 is write out)
     BfWriteFloat(hBf, fadein); //fadeinTime (message fade in time - per character in effect 2)
     BfWriteFloat(hBf, fadeout); //fadeoutTime
     BfWriteFloat(hBf, holdtime); //holdtime
     BfWriteFloat(hBf, fxtime); //fxtime (effect type(2) used)
     BfWriteString(hBf, szMsg); //Message
     EndMessage();
  }
}
 

Необходимо добавить на клиенте в ClientScheme.res:
Код: Выделить всё

CenterPrintText
{
   "1"
   {
      "name" "Trebuchet MS"
      "tall" "14"
      "weight" "600"
      "range" "0x0000 0x007F" // Basic Latin
      "antialias" "1"
      "additive" "1"
   }
}
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Помогите найти аналоги функций

Сообщение Endi » 16 окт 2009, 13:18

Спасибо, думаю PrintCenterText пойдет..
И еще одна загвоздка. Есть у меня массив new Buffer[33][32], надо сравнить только первые 8 байт. Делаю так Buffer[id][8] = 0, не обнуляется, в буфере больше 8 символов суравно. Как быть ? Не хочется скопировать в отдельный буфер.

Еще опять стает вопрос удаления строки из банлиста. Читать научился
Код: Выделить всё
      new HANDLE:file = OpenFile("banlist.txt","r")
      while (!IsEndOfFile(file) && ReadFileLine(file,buffer,sizeof(buffer))){
      }

А вот удалить нужную строку пока хз как :)
Аватара пользователя
Endi
 
Сообщения: 95
Зарегистрирован: 25 авг 2009, 11:26
Благодарил (а): 13 раз.
Поблагодарили: 20 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source

Re: Помогите найти аналоги функций

Сообщение DJ_WEST » 16 окт 2009, 17:09

А вот удалить нужную строку пока хз как

Как вариант вставляешь пустые строки, там где нужно удалить. Затем записываешь в какой-нибудь другой файл temp.txt из banlist.txt, считывая строки, если находится пустая строка (CR LF), то тогда пропускаешь считывание и идешь дальше, потом удаляешь banlist.txt, а temp.txt переименовываешь в banlist.txt =)
Есть у меня массив new Buffer[33][32], надо сравнить только первые 8 байт. Делаю так Buffer[id][8] = 0, не обнуляется, в буфере больше 8 символов суравно. Как быть ? Не хочется скопировать в отдельный буфер.

Если у тебя строковый массив, то:
Код: Выделить всё
new String:Buffer[33][32] 


Добавлено спустя 2 минуты 18 секунд:
И в Source игроков 64, там уже есть константа MAXPLAYERS, поэтому:
Код: Выделить всё
new String:Buffer[MAXPLAYERS+1][32]  
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

Re: Помогите найти аналоги функций

Сообщение Endi » 26 окт 2009, 07:23

А как получить путь до cstrike\addons\sourcemod\configs? На amxx было локальная переменная amxx_configsdir, по которой моно было получить путь до директории configs. А тут подобной переменной не нашел.
Аватара пользователя
Endi
 
Сообщения: 95
Зарегистрирован: 25 авг 2009, 11:26
Благодарил (а): 13 раз.
Поблагодарили: 20 раз.
Опыт программирования: Около 6 месяцев
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source

Re: Помогите найти аналоги функций

Сообщение DJ_WEST » 26 окт 2009, 09:17

А как получить путь до cstrike\addons\sourcemod\configs? На amxx было локальная переменная amxx_configsdir, по которой моно было получить путь до директории configs. А тут подобной переменной не нашел.

Код: Выделить всё
new String:s_File[PLATFORM_MAX_PATH]
BuildPath(Path_SMs_Filesizeof(s_File), "configs/file.ini")
 
Не пишите мне в ЛС: если вам нужна помощь на бесплатной основе. Любые вопросы на форум.
Аватара пользователя
DJ_WEST
Администратор
 
Сообщения: 3641
Зарегистрирован: 22 авг 2009, 00:38
Благодарил (а): 48 раз.
Поблагодарили: 2209 раз.
Опыт программирования: Больше трех лет
Языки программирования: Counter-Strike 1.6
Counter-Strike: Source
Left 4 Dead
Left 4 Dead 2

След.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron