Half-Life и Adrenaline Gamer форум

Всё об игре в Халф-Лайф и АГ
Текущее время: 19 апр 2024, 05:16

Часовой пояс: UTC + 5 часов [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: SV_Multicast
СообщениеДобавлено: 17 мар 2014, 17:41 
Не в сети
Зарегистрирован:
09 апр 2013, 19:15
Последнее посещение:
17 июл 2023, 18:44
Сообщения: 150
Откуда: Томск-7
Добрый вечер ребят, в общем так получается что отправлять через BuildSoundMsg, это двойной месседж игроку
SVC_NOP + SVC_SOUND, в общем жалуются на оверфлов.

ладно продолжил пытаться отправлять напрямую через MSG_*
убедился что звук отправляется игроку и только SVC_SOUND, заменив buf (Sever Multicast Buffer) на клиентский буфер (netchan->message)

Код:

typedef struct sizebuf_s
{
   char *name;
   int overflow;
   byte *data;
   unsigned int maxsize;
   unsigned int cursize;
} sizebuf_t;

typedef struct sv_client_s
{
   char padding_0[123];//offset 124 down
   sizebuf_t message;
} sv_client_t;

//argument sv_client_t *cl;
//print cl->message.name = "netchan->message"

Config->MSG_WriteByte(&cl->message,6);
Config->MSG_StartBitWriting(&cl->message);
Config->MSG_WriteBits(flags,9);
Config->MSG_WriteBits(CHAN_BODY,3);
Config->MSG_WriteBits(pHost->index,11);
Config->MSG_WriteBits(soundIndex,8);
Config->MSG_WriteBitVec3Coord(pHost->IsOrigin());
Config->MSG_EndBitWriting(&cl->message);
звук отправляется, проверял я это у одной функции которая передает аргумент клиента с доступом netchan->message.

единственный вариант получить нетчан, это svs.client[id]->message
в поиске svs на линуксе проблем не возникает, на винде да(

p.s еще видел сорсы дпрото старой версии, там используется перехват svs.
толком не понял)


Последний раз редактировалось s1lent 17 мар 2014, 18:02, всего редактировалось 1 раз.

Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: SV_Multicast
СообщениеДобавлено: 17 мар 2014, 18:01 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
18 апр 2024, 17:14
Сообщения: 6867
s1lent писал(а):
SVC_NOP + SVC_SOUND, в общем жалуются на оверфлов.
Не смешите мои тапочки. Вы их с какой скоростью генерите? Плюс один байт к мессаге не должен давать большой разницы.

Легких путей не ищите, да? :D


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: SV_Multicast
СообщениеДобавлено: 17 мар 2014, 18:07 
Не в сети
Аватара пользователя
Зарегистрирован:
06 июн 2010, 16:53
Последнее посещение:
16 апр 2024, 16:38
Сообщения: 1143
Откуда: Владивосток
s1lent писал(а):
в поиске svs на линуксе проблем не возникает, на винде да(
Код:
bool Parse_SvsMaxPlayers(size_t start, size_t end)
{
   int count = 0;

   size_t pTemp   = NULL;
   size_t pAdress   = NULL;

   char string[]         = "#      name userid uniqueid frag time p";
   unsigned char mask[]   = "\x68\x00\x00\x00\x00\x53\x56";
   char pattern[]         = "xxxxxxx";
   
   pTemp = FindStringInDLL(start, end, string);

   while (pTemp)
   {
      *(size_t*)(mask + 1) = (size_t)pTemp;

      if ((pAdress = FindAdressInDLL(start, end, mask, pattern)) != NULL)
      {
         count++;
      }

      pTemp = FindStringInDLL(pTemp + 1, end, string);
   }

   if (!count)
   {
      printf2("[%s]: Error: svs.maxplayers not found\n", Plugin_info.logtag);
      return false;
   }
   else if (count > 1)
   {
      printf2("[%s]: Error: %d candidates found for svs.maxplayers\n", Plugin_info.logtag, count);
      return false;
   }

   pAdress += 13;
   g_pSvsMaxPlayers = (int*)*(size_t*)pAdress;

   printf2("[%s]: Found svs.maxplayers at %p\n", Plugin_info.logtag, pAdress);

   return true;
}
Вот как-то надо было svs.maxplayers сменить.

Добавлено спустя 15 минут 1 секунду:
Код:
pAdress += 13;
заменить на
Код:
pAdress += 1;
И будет адрес svs

Добавлено спустя 2 минуты 50 секунд:
Вот еще FindStringInDLL и FindAdressInDLL если надо хД

 

_________________
Изображение
Vi Veri Veniversum Vivus Vici


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: SV_Multicast
СообщениеДобавлено: 17 мар 2014, 18:26 
Не в сети
Зарегистрирован:
09 апр 2013, 19:15
Последнее посещение:
17 июл 2023, 18:44
Сообщения: 150
Откуда: Томск-7
Lev писал(а):
s1lent писал(а):
SVC_NOP + SVC_SOUND, в общем жалуются на оверфлов.
Не смешите мои тапочки. Вы их с какой скоростью генерите? Плюс один байт к мессаге не должен давать большой разницы.

Легких путей не ищите, да? :D

Lev, постараюсь не смешить)
легкий не легкий, но все равно оптимальный способ без ограничений все же хотелось бы.
для игроков с не мощным каналом, при спавне 32-х игроков, умноженная 2 не вытягивают.

KORD_12.7, я пока не силен в поиске указателя и смещениями к ним, не то что функции)

вот вроде уже есть E8 ? ? ? ? 8B ? ? ? ? ? 33 ? 83 ? ? 0F 9F C0 50, не помню где нашел.

 Code


Последний раз редактировалось s1lent 17 мар 2014, 20:54, всего редактировалось 10 раз(а).

Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: SV_Multicast
СообщениеДобавлено: 17 мар 2014, 18:27 
Не в сети
Аватара пользователя
Зарегистрирован:
06 июн 2010, 16:53
Последнее посещение:
16 апр 2024, 16:38
Сообщения: 1143
Откуда: Владивосток
В теории по строке "# name userid uniqueid frag time p" поиск адреса svs должен корректно работать как на новых, так и на старых билдах движка.

_________________
Изображение
Vi Veri Veniversum Vivus Vici


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: SV_Multicast
СообщениеДобавлено: 17 мар 2014, 20:16 
Не в сети
Зарегистрирован:
09 апр 2013, 19:15
Последнее посещение:
17 июл 2023, 18:44
Сообщения: 150
Откуда: Томск-7
 Spoiler

что-то не получается)
может структура не подходит?
вроде брал с engine_sdk


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: SV_Multicast
СообщениеДобавлено: 17 мар 2014, 21:15 
Не в сети
Site Admin
Зарегистрирован:
01 июн 2010, 01:27
Последнее посещение:
18 апр 2024, 17:14
Сообщения: 6867
Код немного странный в плане циклического поиска строк, а не их использования. Но для этого случая сойдет.
В pAdress же не адрес svs, а адрес использования строки.
Чтобы получить адрес svs надо сделать
Код:
   pAdress += 13;
   g_pSvsMaxPlayers = (int*)*(size_t*)pAdress;
   g_pSvs = g_pSvsMaxPlayers - 2;
ибо
Код:
.text:01D5150D 68 54 67 E5 01                          push    offset aNameUseridUniq ; "#      name userid uniqueid frag time p"...
.text:01D51512 53                                      push    ebx             ; int
.text:01D51513 56                                      push    esi             ; int
.text:01D51514 E8 57 FD FF FF                          call    sub_1D51270
.text:01D51519 A1 68 61 13 02                          mov     eax, svs.max_clients
.text:01D5151E 8B 1D 64 61 13 02                       mov     ebx, svs.clients
А можно получить сразу svs.clients, сделав pAdress += 19;


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: SV_Multicast
СообщениеДобавлено: 17 мар 2014, 22:56 
Не в сети
Зарегистрирован:
09 апр 2013, 19:15
Последнее посещение:
17 июл 2023, 18:44
Сообщения: 150
Откуда: Томск-7
вроде получилось)

сделал так
поглядел дизассемблер и вижу что maxplayers dword_2136168, а svs dword_2136160 или на линуксе &svs[8] и svs;
0x2136168 - 0x2136160 = 8 значит смещение в минус на 8 от адреса maxplayers.

Код:
pAdress += 13;
psvs = (svs_s *)(*(size_t *)pAdress - 8);

пишет
psvs->dll_initialized = 1
psvs->maxclients = 25
psvs->maxclientslimit = 32
а clients как то странно себя ведет.

psvs->clients[index].name
ничего не пишет


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: SV_Multicast
СообщениеДобавлено: 17 мар 2014, 23:19 
Не в сети
Аватара пользователя
Зарегистрирован:
06 июн 2010, 16:53
Последнее посещение:
16 апр 2024, 16:38
Сообщения: 1143
Откуда: Владивосток
Lev писал(а):
Код немного странный в плане циклического поиска строк, а не их использования. Но для этого случая сойдет.
В pAdress же не адрес svs, а адрес использования строки.
Чтобы получить адрес svs надо сделать
Код:
   pAdress += 13;
   g_pSvsMaxPlayers = (int*)*(size_t*)pAdress;
   g_pSvs = g_pSvsMaxPlayers - 2;
ибо
Код:
.text:01D5150D 68 54 67 E5 01                          push    offset aNameUseridUniq ; "#      name userid uniqueid frag time p"...
.text:01D51512 53                                      push    ebx             ; int
.text:01D51513 56                                      push    esi             ; int
.text:01D51514 E8 57 FD FF FF                          call    sub_1D51270
.text:01D51519 A1 68 61 13 02                          mov     eax, svs.max_clients
.text:01D5151E 8B 1D 64 61 13 02                       mov     ebx, svs.clients
А можно получить сразу svs.clients, сделав pAdress += 19;
Да, тут я затупил. Уже забыл как я этот svs искал :D .

_________________
Изображение
Vi Veri Veniversum Vivus Vici


Вернуться к началу
 Профиль 
  
 Заголовок сообщения: Re: SV_Multicast
СообщениеДобавлено: 17 мар 2014, 23:25 
Не в сети
Зарегистрирован:
09 апр 2013, 19:15
Последнее посещение:
17 июл 2023, 18:44
Сообщения: 150
Откуда: Томск-7
Хотя можно и также, адрес тот же будет)
но с clients аналогично(

Код:
pAdress += 13;
svs_s *svs_addr = (svs_s *)(*(size_t **)pAdress - 2);


Вернуться к началу
 Профиль 
  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 30 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 5 часов [ Летнее время ]


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB