chat id для соба

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

pav_snow

Новичок
Автор темы
17
0
подскажите как сделать что бы собейт отображал ид игрока рядом с ником. Где что надо прописывать.

Заранее спасибо!!
 

pav_snow

Новичок
Автор темы
17
0
Исходник уже скачал! Нужен сам алгоритм и куда его поставить)
 

pav_snow

Новичок
Автор темы
17
0
как я понял, это в RPC_ClientMessage.
но как изменить сообщение? там вроде все в байтах
 

pav_snow

Новичок
Автор темы
17
0
как можно подставить ID рядом с ником? посимвольный перебор строки вроде не работает. Желателен пример)
 

pav_snow

Новичок
Автор темы
17
0
другой вопрос. Как записать текст в стрим? делаю так

bsData.ResetWritePointer();
bsData.Write(dwColor);
bsData.Write((int)strlen(output));
bsData.Write(output, (int)strlen(output));
bsData.ResetReadPointer();

но на предпоследнем пункте вылетает игра.
 

pav_snow

Новичок
Автор темы
17
0
Сделал умножение на 8 (Как я понял, он их изначально делил в начале). Но ошибка осталась.
Особенность в том, что если функция добавления ида сделает перебор символов и ничего не добавит / изменит (то есть strlen = const), то не вылетает. Как только размер меняется - вылет.

BitStream bsData(rpcParams->input, rpcParams->numberOfBitsOfData / 8, false);
uint32_t dwStrLen, dwColor;
char szMsg[256];
static char last_servermsg[256];
static DWORD allow_show_again = 0;

bsData.Read(dwColor);
bsData.Read(dwStrLen);

if (dwStrLen >= sizeof(szMsg)) dwStrLen = sizeof(szMsg) - 1;

bsData.Read(szMsg, dwStrLen);
bsData.ResetReadPointer();
szMsg[dwStrLen] = '\0';

char output[256];
strcpy(output, AddID(szMsg));
output[strlen(output) + 1] = '\0';
bsData.ResetWritePointer();
bsData.Write(dwColor);
bsData.Write((int)strlen(output));
bsData.Write(output, (strlen(output) * 8));
bsData.ResetReadPointer();

P.S: затестил щас снова, теперь постоянно вылет
P.S.S: если не умножать на 8, то будет отправлять неизменённые строки, с изменёнными краш.
 
Последнее редактирование:

pav_snow

Новичок
Автор темы
17
0
Даже если поставить перед размером (BYTE) всёравно вылет(
Может проблема в алгоритме добавления ида?

C++:
char* AddID(char *str)
{
    char res[256]; char tmp[256];    char idx = 0;
    memset(res, 0, sizeof(res));
    memset(tmp, 0, sizeof(tmp));

    int size = strlen(str);
    for (int i = 0; i < size; i++)
    {
        if (str[I] != ' ')
        {
            tmp[idx] = str[I];
            idx++;
        }
        if (str[I] == ' ' || i + 1 == size)
        {
            if (strlen(tmp) > 0)
            {
                for (int k = 0; k < SAMP_MAX_PLAYERS; k++)
                {
                    if (g_Players->iIsListed[k] != 1)
                        continue;
                    if (!strcmp(tmp, getPlayerName(k)))
                    {
                        char name[8];
                        memset(name, 0, sizeof(name));
                        sprintf_s(name, "[%d]", k);
                        strcat_s(tmp, name);
                        break;
                    }
                }
                strcat_s(res, tmp);
                idx = 0;
                memset(tmp, 0, sizeof(tmp));
            }
            if (i + 1 != size)
                strcat_s(res, " ");
        }
    }
    return res;
}
 
Последнее редактирование модератором:

pav_snow

Новичок
Автор темы
17
0
Покрутился немного с кодом. Как я понял, проблема в алгоритме добавления ида. (Если, например, на запись поставить любую фразу вместо переменной, то всё работает). Если ид не добавлять - строка отправляется. Если что-то добавить в строку - вылет на этапе bsData.Write(output, (strlen(output)));

Попробовал другой вариант:
C++:
int find_substring(char s[], char p[])
{
   int i, j, N, M;
   N = strlen(s);
   M = strlen(p);
   int *d = (int*)malloc(M*sizeof(int)); /* динамический массив длины М*/
   /* Вычисление префикс-функции */
   d[0] = 0;
   for (i = 1, j = 0; i<M; i++)
   {
     while (j>0 && p[j] != p[i])
       j = d[j - 1];
     if (p[j] == p[i])
       j++;
     d[i] = j;
   }
   /* поиск */
   for (i = 0, j = 0; i<N; i++)
   {
     while (j>0 && p[j] != s[i])
       j = d[j - 1];
     if (p[j] == s[i])
       j++;
     if (j == M)
     {
       free(d); /* освобождение памяти массива d */
       return i - j + 1;
     }
   }
   free(d); /* освобождение памяти массива d */
   return -1;
}

char* AddID(char *str, char *name, int k)
{
   int join = find_substring(str, name);
   if (join != -1)
   {
       // 1) Выделяем память размером strlen(myString) + strlen(subString) + 1
       char name[8];
       sprintf_s(name, "[%d]", k);
       int Size, Size3;
       Size = strlen(str) + strlen(name) + 1;
       Size3 = strlen(str) - join;
       char *returnChar = new char[Size];
       char *temp = new char[Size3];

       // 2) Копируем туда часть строки myString до символа n - 1
       strncpy(returnChar, str + 0, join);
       returnChar[join] = '\0';

       // 3) Копируем туда subString
       strcat(returnChar, name);

       // 4) Копируем туда часть myString от символа n до конца
       strncpy(temp, str + join, strlen(str) - join);
       temp[strlen(str) - join] = '\0';
       strcat(returnChar, temp);
       return returnChar;
   }
   else return str;
}
 
Статус
В этой теме нельзя размещать новые ответы.