Вопрос Получить world-координаты курсора мыши

Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
инвертируй матрицы перемножь в обратном порядке и трансформируй 2д точку в 3д через матрицы а потом рейтрейс от near plane до far plane чтобы точную точку пересечения с моделью получить.
а если без рофлов то
Пожалуйста, авторизуйтесь для просмотра ссылки.
реверси GameUI.GetScreenWorldPosition(там габен уже за тебя рейтрейсит)
дилибы в помощь естесна
1634815954500.png
2д в привычном понимании нельзя так просто "трансформировать" в 3д. так как ты получаешь не точку а целый луч(который идет от near до far плоскостей). гдето этот луч пересекается с миром(то есть с полом, со стенкой, с головой героя, с какой-нибудь еще моделькой) (может и не пересекаться конечно, в небеса куда-нибудь если направлен или в какую-нибудь жопу). это и есть рейтрейс - точка(точка пересечения с статик/динамик моделькой) из луча. поэтому ты сначала делаешь луч из коордов экрана путем обратных трансформаций(в обратном порядке на обратные матрицы). этот луч будет сонаправлен лучу камеры и будет идти от near plane до far plane(камера не видит ближе near plane и не видит дальше far plane). и он где-нибудь что-нибудь пересечет(может не пересечь) и это будет твоя точка.
вот рисунки
1634816800300.png
1634816953800.png
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
21 Июн 2021
Сообщения
13
Реакции[?]
3
Поинты[?]
0
Liberalist, спасибо! Сложно как-то. =) Вообще у меня цель заставить героя бегать за мышью. Думал получать по таймеру координаты курсора и отправлять их PrepareUnitOrders (DOTA_UNIT_ORDER_MOVE_TO_POSITION). Не подскажешь, может мою задачу можно решить как-то по другому. Проще.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
не думаю что можно проще. оно так и делается когда ты пкм кликаешь, дота коорды мышки получает трансформирует и идет туда/атакует сущность/че-нибудь еще делает.
2д точка экрана это координаты твоей мышки.
коорды мышки судя по дилибам через VGUIInput. но чекни дллку свежую на всякий случай мб там по-другому. GameUI.GetCursorPosition
Пожалуйста, авторизуйтесь для просмотра ссылки.
1634822773800.png
 
Начинающий
Статус
Оффлайн
Регистрация
21 Июн 2021
Сообщения
13
Реакции[?]
3
Поинты[?]
0
реверси GameUI.GetScreenWorldPosition(там габен уже за тебя рейтрейсит)
Не смог разобраться. А есть ли возможность в динамике посмотреть java-функции (брякнуть в отладчике)? Другими словами, возможно ли запустить свой java-скрипт? У меня windows 7 и Workshop Tools не запускается (пишет, что нужна 10-ка). Так что, легальный подход мне не подойдет. Тут обсуждается какой-то способ. Он еще рабочий?
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Не смог разобраться. А есть ли возможность в динамике посмотреть java-функции (брякнуть в отладчике)? Другими словами, возможно ли запустить свой java-скрипт? У меня windows 7 и Workshop Tools не запускается (пишет, что нужна 10-ка). Так что, легальный подход мне не подойдет. Тут обсуждается какой-то способ. Он еще рабочий?
да способ рабочий. -tempcontent в параметры запуска, компилишь впкшку, засовываешь ее dota 2 beta\game\dota_tempcontent\pak01_dir.vpk. в пабе не работает(обход тут есть в соседних темах поищешь если надо https://yougame.biz/threads/222259/) но в демке работает для тестов самое то. бпшки работают. в дебагере ищешь по хрефу функцию джаваскриптовую ставишь на нее бряку вызываешь из джаваскрипта и все. я так половину вещей в доте и реверсил. workshop tools забей можно без него спокойно. просто пропатчи оригинальный vxml_c файлик с соблюдением размера(если добавляешь x байт, то столько же и вырежи из файла(всякие двойные пробелы и прочую хуйню можешь вырезать спокойно)). там чек именно на размер файла.
 
Начинающий
Статус
Оффлайн
Регистрация
21 Июн 2021
Сообщения
13
Реакции[?]
3
Поинты[?]
0
Проблему решил! Прототип:

typedef bool (__fastcall* pGetScreenWorldPosition)(PVOID This /* не используется */, Dota::Vector* pVec);

Функция в IDA (доту давно не обновлял):

Код:
.text:0000000180CB49E0 48 89 5C 24 10                                               mov     [rsp-8+arg_8], rbx
.text:0000000180CB49E5 48 89 4C 24 08                                               mov     [rsp-8+arg_0], rcx
.text:0000000180CB49EA 55                                                           push    rbp
.text:0000000180CB49EB 48 8D 6C 24 80                                               lea     rbp, [rsp-80h]
.text:0000000180CB49F0 48 81 EC 80 01 00 00                                         sub     rsp, 180h
.text:0000000180CB49F7 48 8B 0D 92 02 99 02                                         mov     rcx, cs:qword_183644C90
.text:0000000180CB49FE 4C 8D 85 90 00 00 00                                         lea     r8, [rbp+80h+arg_0]
.text:0000000180CB4A05 48 8B DA                                                     mov     rbx, rdx
.text:0000000180CB4A08 48 8D 95 A0 00 00 00                                         lea     rdx, [rbp+80h+arg_10]
.text:0000000180CB4A0F 48 8B 01                                                     mov     rax, [rcx]
.text:0000000180CB4A12 FF 90 E8 01 00 00                                            call    qword ptr [rax+1E8h]
.text:0000000180CB4A18 44 8B 85 90 00 00 00                                         mov     r8d, dword ptr [rbp+80h+arg_0]
.text:0000000180CB4A1F 48 8D 44 24 40                                               lea     rax, [rsp+180h+var_140]
.text:0000000180CB4A24 8B 95 A0 00 00 00                                            mov     edx, [rbp+80h+arg_10]
.text:0000000180CB4A2A 4C 8D 4C 24 30                                               lea     r9, [rsp+180h+var_150]
.text:0000000180CB4A2F 48 89 44 24 20                                               mov     [rsp+180h+var_160], rax
.text:0000000180CB4A34 E8 F7 FB FF FF                                               call    CDOTAInput__GetWorldRayFromMousePosition
.text:0000000180CB4A39 48 8D 15 A0 0C 66 02                                         lea     rdx, qword_1833156E0
.text:0000000180CB4A40 48 8D 4C 24 30                                               lea     rcx, [rsp+180h+var_150]
.text:0000000180CB4A45 E8 D6 86 67 FF                                               call    sub_18032D120
.text:0000000180CB4A4A 84 C0                                                        test    al, al
.text:0000000180CB4A4C 0F 85 56 01 00 00                                            jnz     loc_180CB4BA8
.text:0000000180CB4A52 F3 0F 10 05 86 0C 66 02                                      movss   xmm0, dword ptr cs:qword_1833156E0
.text:0000000180CB4A5A 33 C9                                                        xor     ecx, ecx
.text:0000000180CB4A5C 0F B6 44 24 77                                               movzx   eax, [rsp+180h+var_109]
.text:0000000180CB4A61 F3 0F 11 03                                                  movss   dword ptr [rbx], xmm0
.text:0000000180CB4A65 24 F9                                                        and     al, 0F9h
.text:0000000180CB4A67 F3 0F 10 0D 75 0C 66 02                                      movss   xmm1, dword ptr cs:qword_1833156E0+4
.text:0000000180CB4A6F 0C 19                                                        or      al, 19h
.text:0000000180CB4A71 F3 0F 11 4B 04                                               movss   dword ptr [rbx+4], xmm1
.text:0000000180CB4A76 F3 0F 10 05 6A 0C 66 02                                      movss   xmm0, cs:dword_1833156E8
.text:0000000180CB4A7E 48 89 4C 24 58                                               mov     [rsp+180h+var_128], rcx
.text:0000000180CB4A83 48 89 4C 24 60                                               mov     [rsp+180h+var_120], rcx
.text:0000000180CB4A88 66 89 4C 24 70                                               mov     [rsp+180h+var_110], cx
.text:0000000180CB4A8D 48 89 4D 40                                                  mov     [rbp+80h+var_40], rcx
.text:0000000180CB4A91 48 89 4D 48                                                  mov     [rbp+80h+var_38], rcx
.text:0000000180CB4A95 48 89 4D 50                                                  mov     [rbp+80h+var_30], rcx
.text:0000000180CB4A99 89 4D 58                                                     mov     [rbp+80h+var_28], ecx
.text:0000000180CB4A9C 48 8D 4D D0                                                  lea     rcx, [rbp+80h+var_B0]
.text:0000000180CB4AA0 F3 0F 11 43 08                                               movss   dword ptr [rbx+8], xmm0
.text:0000000180CB4AA5 48 C7 44 24 68 FF FF FF FF                                   mov     [rsp+180h+var_118], 0FFFFFFFFFFFFFFFFh
.text:0000000180CB4AAE C7 44 24 72 00 00 01 00                                      mov     [rsp+180h+var_10E], 10000h
.text:0000000180CB4AB6 88 44 24 77                                                  mov     [rsp+180h+var_109], al
.text:0000000180CB4ABA C6 44 24 76 03                                               mov     [rsp+180h+var_10A], 3
.text:0000000180CB4ABF 48 C7 44 24 50 21 30 00 00                                   mov     [rsp+180h+var_130], 3021h
.text:0000000180CB4AC8 C7 45 5C 00 00 00 07                                         mov     [rbp+80h+var_24], 7000000h
.text:0000000180CB4ACF E8 AC 13 11 01                                               call    sub_181DC5E80
.text:0000000180CB4AD4 F3 0F 10 44 24 44                                            movss   xmm0, [rsp+180h+var_13C]
.text:0000000180CB4ADA 0F 57 ED                                                     xorps   xmm5, xmm5
.text:0000000180CB4ADD F3 0F 5C 44 24 34                                            subss   xmm0, dword ptr [rsp+180h+var_150+4]
.text:0000000180CB4AE3 F3 0F 10 5C 24 40                                            movss   xmm3, [rsp+180h+var_140]
.text:0000000180CB4AE9 F3 0F 10 54 24 48                                            movss   xmm2, [rsp+180h+var_138]
.text:0000000180CB4AEF F3 0F 5C 5C 24 30                                            subss   xmm3, dword ptr [rsp+180h+var_150]
.text:0000000180CB4AF5 F3 0F 5C 54 24 38                                            subss   xmm2, [rsp+180h+var_148]
.text:0000000180CB4AFB C6 45 C1 01                                                  mov     [rbp+80h+var_BF], 1
.text:0000000180CB4AFF 0F 28 E3                                                     movaps  xmm4, xmm3
.text:0000000180CB4B02 0F 14 E0                                                     unpcklps xmm4, xmm0
.text:0000000180CB4B05 0F 16 E2                                                     movlhps xmm4, xmm2
.text:0000000180CB4B08 0F 29 65 90                                                  movaps  [rbp+80h+var_F0], xmm4
.text:0000000180CB4B0C 0F 59 E4                                                     mulps   xmm4, xmm4
.text:0000000180CB4B0F 0F 28 CC                                                     movaps  xmm1, xmm4
.text:0000000180CB4B12 0F 28 C4                                                     movaps  xmm0, xmm4
.text:0000000180CB4B15 0F C6 CC AA                                                  shufps  xmm1, xmm4, 0AAh ; 'Є'
.text:0000000180CB4B19 0F C6 C4 55                                                  shufps  xmm0, xmm4, 55h ; 'U'
.text:0000000180CB4B1D 0F C6 E4 00                                                  shufps  xmm4, xmm4, 0
.text:0000000180CB4B21 0F 58 E0                                                     addps   xmm4, xmm0
.text:0000000180CB4B24 0F 58 E1                                                     addps   xmm4, xmm1
.text:0000000180CB4B27 0F 2E E5                                                     ucomiss xmm4, xmm5
.text:0000000180CB4B2A 75 04                                                        jnz     short loc_180CB4B30
.text:0000000180CB4B2C C6 45 C1 00                                                  mov     [rbp+80h+var_BF], 0
.text:0000000180CB4B30
.text:0000000180CB4B30                                              loc_180CB4B30:                          ; CODE XREF: sub_180CB49E0+14A↑j
.text:0000000180CB4B30 F3 0F 10 54 24 38                                            movss   xmm2, [rsp+180h+var_148]
.text:0000000180CB4B36 4C 8D 4D D0                                                  lea     r9, [rbp+80h+var_B0]
.text:0000000180CB4B3A F2 0F 10 5C 24 30                                            movsd   xmm3, [rsp+180h+var_150]
.text:0000000180CB4B40 4C 8D 44 24 50                                               lea     r8, [rsp+180h+var_130]
.text:0000000180CB4B45 0F 57 C0                                                     xorps   xmm0, xmm0
.text:0000000180CB4B48 0F 16 DA                                                     movlhps xmm3, xmm2
.text:0000000180CB4B4B 48 8D 55 80                                                  lea     rdx, [rbp+80h+var_100]
.text:0000000180CB4B4F 0F 29 5D 80                                                  movaps  [rbp+80h+var_100], xmm3
.text:0000000180CB4B53 0F 29 45 B0                                                  movaps  [rbp+80h+var_D0], xmm0
.text:0000000180CB4B57 C6 45 C0 01                                                  mov     [rbp+80h+var_C0], 1
.text:0000000180CB4B5B 0F 29 45 A0                                                  movaps  [rbp+80h+var_E0], xmm0
.text:0000000180CB4B5F E8 BC B0 D0 FF                                               call    sub_1809BFC20
.text:0000000180CB4B64 F3 0F 10 45 0C                                               movss   xmm0, [rbp+80h+var_74]
.text:0000000180CB4B69 0F 2F 05 E4 58 26 02                                         comiss  xmm0, cs:dword_182F1A454
.text:0000000180CB4B70 73 36                                                        jnb     short loc_180CB4BA8
.text:0000000180CB4B72 80 7D 16 00                                                  cmp     [rbp+80h+var_6A], 0
.text:0000000180CB4B76 75 30                                                        jnz     short loc_180CB4BA8
.text:0000000180CB4B78 F3 0F 10 45 DC                                               movss   xmm0, [rbp+80h+var_A4]
.text:0000000180CB4B7D B0 01                                                        mov     al, 1
.text:0000000180CB4B7F F3 0F 10 4D E0                                               movss   xmm1, [rbp+80h+var_A0]
.text:0000000180CB4B84 F3 0F 11 03                                                  movss   dword ptr [rbx], xmm0
.text:0000000180CB4B88 F3 0F 10 45 E4                                               movss   xmm0, [rbp+80h+var_9C]
.text:0000000180CB4B8D F3 0F 11 43 08                                               movss   dword ptr [rbx+8], xmm0
.text:0000000180CB4B92 F3 0F 11 4B 04                                               movss   dword ptr [rbx+4], xmm1
.text:0000000180CB4B97 48 8B 9C 24 98 01 00 00                                      mov     rbx, [rsp+180h+arg_8]
.text:0000000180CB4B9F 48 81 C4 80 01 00 00                                         add     rsp, 180h
.text:0000000180CB4BA6 5D                                                           pop     rbp
.text:0000000180CB4BA7 C3                                                           retn
.text:0000000180CB4BA8                                              ; ---------------------------------------------------------------------------
.text:0000000180CB4BA8
.text:0000000180CB4BA8                                              loc_180CB4BA8:                          ; CODE XREF: sub_180CB49E0+6C↑j
.text:0000000180CB4BA8                                                                                      ; sub_180CB49E0+190↑j ...
.text:0000000180CB4BA8 48 8B 9C 24 98 01 00 00                                      mov     rbx, [rsp+180h+arg_8]
.text:0000000180CB4BB0 32 C0                                                        xor     al, al
.text:0000000180CB4BB2 48 81 C4 80 01 00 00                                         add     rsp, 180h
.text:0000000180CB4BB9 5D                                                           pop     rbp
.text:0000000180CB4BBA C3                                                           retn
.text:0000000180CB4BBA                                              sub_180CB49E0   endp
Функцию найти можно по такому алгоритму:

1) Находим ScreenXYToWorld стандартным способом (xref на строку "ScreenXYToWorld")
2) Ищем в ScreenXYToWorld функцию GetWorldRayFromMousePosition (dylib в помощь)
3) Перебираем xref-ы на вызов GetWorldRayFromMousePosition, ищем похожую функцию (по прототипу, etc)
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Проблему решил! Прототип:

typedef bool (__fastcall* pGetScreenWorldPosition)(PVOID This /* не используется */, Dota::Vector* pVec);

Функция в IDA (доту давно не обновлял):

Код:
.text:0000000180CB49E0 48 89 5C 24 10                                               mov     [rsp-8+arg_8], rbx
.text:0000000180CB49E5 48 89 4C 24 08                                               mov     [rsp-8+arg_0], rcx
.text:0000000180CB49EA 55                                                           push    rbp
.text:0000000180CB49EB 48 8D 6C 24 80                                               lea     rbp, [rsp-80h]
.text:0000000180CB49F0 48 81 EC 80 01 00 00                                         sub     rsp, 180h
.text:0000000180CB49F7 48 8B 0D 92 02 99 02                                         mov     rcx, cs:qword_183644C90
.text:0000000180CB49FE 4C 8D 85 90 00 00 00                                         lea     r8, [rbp+80h+arg_0]
.text:0000000180CB4A05 48 8B DA                                                     mov     rbx, rdx
.text:0000000180CB4A08 48 8D 95 A0 00 00 00                                         lea     rdx, [rbp+80h+arg_10]
.text:0000000180CB4A0F 48 8B 01                                                     mov     rax, [rcx]
.text:0000000180CB4A12 FF 90 E8 01 00 00                                            call    qword ptr [rax+1E8h]
.text:0000000180CB4A18 44 8B 85 90 00 00 00                                         mov     r8d, dword ptr [rbp+80h+arg_0]
.text:0000000180CB4A1F 48 8D 44 24 40                                               lea     rax, [rsp+180h+var_140]
.text:0000000180CB4A24 8B 95 A0 00 00 00                                            mov     edx, [rbp+80h+arg_10]
.text:0000000180CB4A2A 4C 8D 4C 24 30                                               lea     r9, [rsp+180h+var_150]
.text:0000000180CB4A2F 48 89 44 24 20                                               mov     [rsp+180h+var_160], rax
.text:0000000180CB4A34 E8 F7 FB FF FF                                               call    CDOTAInput__GetWorldRayFromMousePosition
.text:0000000180CB4A39 48 8D 15 A0 0C 66 02                                         lea     rdx, qword_1833156E0
.text:0000000180CB4A40 48 8D 4C 24 30                                               lea     rcx, [rsp+180h+var_150]
.text:0000000180CB4A45 E8 D6 86 67 FF                                               call    sub_18032D120
.text:0000000180CB4A4A 84 C0                                                        test    al, al
.text:0000000180CB4A4C 0F 85 56 01 00 00                                            jnz     loc_180CB4BA8
.text:0000000180CB4A52 F3 0F 10 05 86 0C 66 02                                      movss   xmm0, dword ptr cs:qword_1833156E0
.text:0000000180CB4A5A 33 C9                                                        xor     ecx, ecx
.text:0000000180CB4A5C 0F B6 44 24 77                                               movzx   eax, [rsp+180h+var_109]
.text:0000000180CB4A61 F3 0F 11 03                                                  movss   dword ptr [rbx], xmm0
.text:0000000180CB4A65 24 F9                                                        and     al, 0F9h
.text:0000000180CB4A67 F3 0F 10 0D 75 0C 66 02                                      movss   xmm1, dword ptr cs:qword_1833156E0+4
.text:0000000180CB4A6F 0C 19                                                        or      al, 19h
.text:0000000180CB4A71 F3 0F 11 4B 04                                               movss   dword ptr [rbx+4], xmm1
.text:0000000180CB4A76 F3 0F 10 05 6A 0C 66 02                                      movss   xmm0, cs:dword_1833156E8
.text:0000000180CB4A7E 48 89 4C 24 58                                               mov     [rsp+180h+var_128], rcx
.text:0000000180CB4A83 48 89 4C 24 60                                               mov     [rsp+180h+var_120], rcx
.text:0000000180CB4A88 66 89 4C 24 70                                               mov     [rsp+180h+var_110], cx
.text:0000000180CB4A8D 48 89 4D 40                                                  mov     [rbp+80h+var_40], rcx
.text:0000000180CB4A91 48 89 4D 48                                                  mov     [rbp+80h+var_38], rcx
.text:0000000180CB4A95 48 89 4D 50                                                  mov     [rbp+80h+var_30], rcx
.text:0000000180CB4A99 89 4D 58                                                     mov     [rbp+80h+var_28], ecx
.text:0000000180CB4A9C 48 8D 4D D0                                                  lea     rcx, [rbp+80h+var_B0]
.text:0000000180CB4AA0 F3 0F 11 43 08                                               movss   dword ptr [rbx+8], xmm0
.text:0000000180CB4AA5 48 C7 44 24 68 FF FF FF FF                                   mov     [rsp+180h+var_118], 0FFFFFFFFFFFFFFFFh
.text:0000000180CB4AAE C7 44 24 72 00 00 01 00                                      mov     [rsp+180h+var_10E], 10000h
.text:0000000180CB4AB6 88 44 24 77                                                  mov     [rsp+180h+var_109], al
.text:0000000180CB4ABA C6 44 24 76 03                                               mov     [rsp+180h+var_10A], 3
.text:0000000180CB4ABF 48 C7 44 24 50 21 30 00 00                                   mov     [rsp+180h+var_130], 3021h
.text:0000000180CB4AC8 C7 45 5C 00 00 00 07                                         mov     [rbp+80h+var_24], 7000000h
.text:0000000180CB4ACF E8 AC 13 11 01                                               call    sub_181DC5E80
.text:0000000180CB4AD4 F3 0F 10 44 24 44                                            movss   xmm0, [rsp+180h+var_13C]
.text:0000000180CB4ADA 0F 57 ED                                                     xorps   xmm5, xmm5
.text:0000000180CB4ADD F3 0F 5C 44 24 34                                            subss   xmm0, dword ptr [rsp+180h+var_150+4]
.text:0000000180CB4AE3 F3 0F 10 5C 24 40                                            movss   xmm3, [rsp+180h+var_140]
.text:0000000180CB4AE9 F3 0F 10 54 24 48                                            movss   xmm2, [rsp+180h+var_138]
.text:0000000180CB4AEF F3 0F 5C 5C 24 30                                            subss   xmm3, dword ptr [rsp+180h+var_150]
.text:0000000180CB4AF5 F3 0F 5C 54 24 38                                            subss   xmm2, [rsp+180h+var_148]
.text:0000000180CB4AFB C6 45 C1 01                                                  mov     [rbp+80h+var_BF], 1
.text:0000000180CB4AFF 0F 28 E3                                                     movaps  xmm4, xmm3
.text:0000000180CB4B02 0F 14 E0                                                     unpcklps xmm4, xmm0
.text:0000000180CB4B05 0F 16 E2                                                     movlhps xmm4, xmm2
.text:0000000180CB4B08 0F 29 65 90                                                  movaps  [rbp+80h+var_F0], xmm4
.text:0000000180CB4B0C 0F 59 E4                                                     mulps   xmm4, xmm4
.text:0000000180CB4B0F 0F 28 CC                                                     movaps  xmm1, xmm4
.text:0000000180CB4B12 0F 28 C4                                                     movaps  xmm0, xmm4
.text:0000000180CB4B15 0F C6 CC AA                                                  shufps  xmm1, xmm4, 0AAh ; 'Є'
.text:0000000180CB4B19 0F C6 C4 55                                                  shufps  xmm0, xmm4, 55h ; 'U'
.text:0000000180CB4B1D 0F C6 E4 00                                                  shufps  xmm4, xmm4, 0
.text:0000000180CB4B21 0F 58 E0                                                     addps   xmm4, xmm0
.text:0000000180CB4B24 0F 58 E1                                                     addps   xmm4, xmm1
.text:0000000180CB4B27 0F 2E E5                                                     ucomiss xmm4, xmm5
.text:0000000180CB4B2A 75 04                                                        jnz     short loc_180CB4B30
.text:0000000180CB4B2C C6 45 C1 00                                                  mov     [rbp+80h+var_BF], 0
.text:0000000180CB4B30
.text:0000000180CB4B30                                              loc_180CB4B30:                          ; CODE XREF: sub_180CB49E0+14A↑j
.text:0000000180CB4B30 F3 0F 10 54 24 38                                            movss   xmm2, [rsp+180h+var_148]
.text:0000000180CB4B36 4C 8D 4D D0                                                  lea     r9, [rbp+80h+var_B0]
.text:0000000180CB4B3A F2 0F 10 5C 24 30                                            movsd   xmm3, [rsp+180h+var_150]
.text:0000000180CB4B40 4C 8D 44 24 50                                               lea     r8, [rsp+180h+var_130]
.text:0000000180CB4B45 0F 57 C0                                                     xorps   xmm0, xmm0
.text:0000000180CB4B48 0F 16 DA                                                     movlhps xmm3, xmm2
.text:0000000180CB4B4B 48 8D 55 80                                                  lea     rdx, [rbp+80h+var_100]
.text:0000000180CB4B4F 0F 29 5D 80                                                  movaps  [rbp+80h+var_100], xmm3
.text:0000000180CB4B53 0F 29 45 B0                                                  movaps  [rbp+80h+var_D0], xmm0
.text:0000000180CB4B57 C6 45 C0 01                                                  mov     [rbp+80h+var_C0], 1
.text:0000000180CB4B5B 0F 29 45 A0                                                  movaps  [rbp+80h+var_E0], xmm0
.text:0000000180CB4B5F E8 BC B0 D0 FF                                               call    sub_1809BFC20
.text:0000000180CB4B64 F3 0F 10 45 0C                                               movss   xmm0, [rbp+80h+var_74]
.text:0000000180CB4B69 0F 2F 05 E4 58 26 02                                         comiss  xmm0, cs:dword_182F1A454
.text:0000000180CB4B70 73 36                                                        jnb     short loc_180CB4BA8
.text:0000000180CB4B72 80 7D 16 00                                                  cmp     [rbp+80h+var_6A], 0
.text:0000000180CB4B76 75 30                                                        jnz     short loc_180CB4BA8
.text:0000000180CB4B78 F3 0F 10 45 DC                                               movss   xmm0, [rbp+80h+var_A4]
.text:0000000180CB4B7D B0 01                                                        mov     al, 1
.text:0000000180CB4B7F F3 0F 10 4D E0                                               movss   xmm1, [rbp+80h+var_A0]
.text:0000000180CB4B84 F3 0F 11 03                                                  movss   dword ptr [rbx], xmm0
.text:0000000180CB4B88 F3 0F 10 45 E4                                               movss   xmm0, [rbp+80h+var_9C]
.text:0000000180CB4B8D F3 0F 11 43 08                                               movss   dword ptr [rbx+8], xmm0
.text:0000000180CB4B92 F3 0F 11 4B 04                                               movss   dword ptr [rbx+4], xmm1
.text:0000000180CB4B97 48 8B 9C 24 98 01 00 00                                      mov     rbx, [rsp+180h+arg_8]
.text:0000000180CB4B9F 48 81 C4 80 01 00 00                                         add     rsp, 180h
.text:0000000180CB4BA6 5D                                                           pop     rbp
.text:0000000180CB4BA7 C3                                                           retn
.text:0000000180CB4BA8                                              ; ---------------------------------------------------------------------------
.text:0000000180CB4BA8
.text:0000000180CB4BA8                                              loc_180CB4BA8:                          ; CODE XREF: sub_180CB49E0+6C↑j
.text:0000000180CB4BA8                                                                                      ; sub_180CB49E0+190↑j ...
.text:0000000180CB4BA8 48 8B 9C 24 98 01 00 00                                      mov     rbx, [rsp+180h+arg_8]
.text:0000000180CB4BB0 32 C0                                                        xor     al, al
.text:0000000180CB4BB2 48 81 C4 80 01 00 00                                         add     rsp, 180h
.text:0000000180CB4BB9 5D                                                           pop     rbp
.text:0000000180CB4BBA C3                                                           retn
.text:0000000180CB4BBA                                              sub_180CB49E0   endp
Функцию найти можно по такому алгоритму:

1) Находим ScreenXYToWorld стандартным способом (xref на строку "ScreenXYToWorld")
2) Ищем в ScreenXYToWorld функцию GetWorldRayFromMousePosition (dylib в помощь)
3) Перебираем xref-ы на вызов GetWorldRayFromMousePosition, ищем похожую функцию (по прототипу, etc)
скрины.
хреф ScreenXYToWorld
123.PNG
Внутри этой функции вызов
1234.PNG
ищем хрефы к этой функции(ctrl+r в x64dbg. предварительно открыли эту функцию в дизассемблере. ctrl+r ищет хрефы к текущей выбранной строке в дизассемблере.)
12345.PNG
чекаем все хрефы и сравниваем по размеру/содержанию с асм из поста выше

находим идентичную функцию по асм(отличительные черты - mov rcx, ...; call rax+1e8; and al; or al; xmm0; xmm1; все это есть в посте выше и в данной функции в дебагере мы видим то же самое)
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Я CreateMove хукаю, там после возврата из функции в параметрах есть координаты курсора.
ты уверен что там они есть?
там онли mousedx/mousedy, это дельта мышки за 1 кадр. то есть ты мышку двинул на 10 пикселей, там будет число 10. но это не координаты мышки, это дельта. (по крайней мере в сурс1 движке так было)
C++:
class CUserCmd
{
public:
    // For matching server and client commands for debugging
    int        command_number;
   
    // the tick the client created this command
    int        tick_count;
   
    // Player instantaneous view angles.
    QAngle    viewangles;    
    // Intended velocities
    //    forward velocity.
    float    forwardmove;  
    //  sideways velocity.
    float    sidemove;    
    //  upward velocity.
    float    upmove;        
    // Attack button states
    int        buttons;      
    // Impulse command issued.
    byte    impulse;      
    // Current weapon id
    int        weaponselect;  
    int        weaponsubtype;

    int        random_seed;    // For shared random functions
#ifdef GAME_DLL
    int        server_random_seed; // Only the server populates this seed
#endif

    short    mousedx;        // mouse accum in x from create move
    short    mousedy;        // mouse accum in y from create move

    // Client only, tracks whether we've predicted this command at least once
    bool    hasbeenpredicted;

    // Back channel to communicate IK state
#if defined( HL2_DLL ) || defined( HL2_CLIENT_DLL )
    CUtlVector< CEntityGroundContact > entitygroundcontact;
#endif

};
 
Начинающий
Статус
Оффлайн
Регистрация
18 Ноя 2021
Сообщения
3
Реакции[?]
1
Поинты[?]
0
ты уверен что там они есть?
там онли mousedx/mousedy, это дельта мышки за 1 кадр. то есть ты мышку двинул на 10 пикселей, там будет число 10. но это не координаты мышки, это дельта. (по крайней мере в сурс1 движке так было)
C++:
class CUserCmd
{
public:
    // For matching server and client commands for debugging
    int        command_number;
 
    // the tick the client created this command
    int        tick_count;
 
    // Player instantaneous view angles.
    QAngle    viewangles;  
    // Intended velocities
    //    forward velocity.
    float    forwardmove;
    //  sideways velocity.
    float    sidemove;  
    //  upward velocity.
    float    upmove;      
    // Attack button states
    int        buttons;    
    // Impulse command issued.
    byte    impulse;    
    // Current weapon id
    int        weaponselect;
    int        weaponsubtype;

    int        random_seed;    // For shared random functions
#ifdef GAME_DLL
    int        server_random_seed; // Only the server populates this seed
#endif

    short    mousedx;        // mouse accum in x from create move
    short    mousedy;        // mouse accum in y from create move

    // Client only, tracks whether we've predicted this command at least once
    bool    hasbeenpredicted;

    // Back channel to communicate IK state
#if defined( HL2_DLL ) || defined( HL2_CLIENT_DLL )
    CUtlVector< CEntityGroundContact > entitygroundcontact;
#endif

};
Да уверен, Createmove сильно поменялся. Посмотри у lwss, CursorRay в конце структуры. Я так понимаю твоя структура из csgo. У lwss когда я последний раз тестил (пол года назад) оффсеты были неверные. Лень щас искать исходники на диске, не помню оффсет правильный. Просто поставь хук на CreateMove и в реклассе посмотри. Перейди по адресу CUserCmd и Все адреса его покажи как Vecotr3 Если в демо хиро, то узнаешь по z = 128.0 на горе(на реке 0.0).

Но это временный метод, по хорошему разобрать как работает CreateMove и этим методом определять. Потому что для хуманайзера условно не будет лишним кинуть луч в World из любой точки, а не только из текущей мышки. Плюс хук менее производительный, потому что CreateMove очень часто вызывается(чаще чем тик сервера), а информация в данный момент нам может быть и не нужна.
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Да уверен, Createmove сильно поменялся. Посмотри у lwss, CursorRay в конце структуры. Я так понимаю твоя структура из csgo. У lwss когда я последний раз тестил (пол года назад) оффсеты были неверные. Лень щас искать исходники на диске, не помню оффсет правильный. Просто поставь хук на CreateMove и в реклассе посмотри. Перейди по адресу CUserCmd и Все адреса его покажи как Vecotr3 Если в демо хиро, то узнаешь по z = 128.0 на горе(на реке 0.0).

Но это временный метод, по хорошему разобрать как работает CreateMove и этим методом определять. Потому что для хуманайзера условно не будет лишним кинуть луч в World из любой точки, а не только из текущей мышки. Плюс хук менее производительный, потому что CreateMove очень часто вызывается(чаще чем тик сервера), а информация в данный момент нам может быть и не нужна.
это из тф2 был:D
в ксго как раз таки вижу вот там есть такая хуита:
// For matching server and client commands for debugging
int command_number;

// the tick the client created this command
int tick_count;

// Player instantaneous view angles.
QAngle viewangles;
Vector aimdirection; // For pointing devices.
// Intended velocities
// forward velocity.
float forwardmove;
// sideways velocity.
float sidemove;
// upward velocity.
float upmove;
// Attack button states
int buttons;
// Impulse command issued.
byte impulse;
// Current weapon id
int weaponselect;
int weaponsubtype;

int random_seed; // For shared random functions

#ifndef CLIENT_DLL
int server_random_seed; // Only the server populates this seed
#endif

short mousedx; // mouse accum in x from create move
short mousedy; // mouse accum in y from create move

// Client only, tracks whether we've predicted this command at least once
bool hasbeenpredicted;

// Back channel to communicate IK state
#if defined( HL2_DLL ) || defined( HL2_CLIENT_DLL )
CUtlVector< CEntityGroundContact > entitygroundcontact;
#endif

#if defined ( DOTA_DLL )
CUnitOrders dota_unitorders;
#endif

#if defined ( PORTAL2 )
// Portal 2's grab code is on the client to support multiplayer
short player_held_entity;
// This one is temporary-- some server code needs to know if this trace
// went through a portal. This should go away when we move the grabcontrollers
// down to the client as well.
short held_entity_was_grabbed_through_portal;

unsigned short command_acknowledgements_pending; //so we can properly sync portal teleportation angle changes. The server tells us the last command it acknowledged, now we also tell it how many acknowledgments we're waiting on (command_number - engine->GetLastAcknowledgedCommand())
uint8 predictedPortalTeleportations; //should probably enumerate which transforms we went through if we want perfect accuracy
#endif // PORTAL2

// TrackIR
QAngle headangles;
Vector headoffset;
// TrackIR

#if defined( INFESTED_DLL ) || defined( DOTA_DLL )
Vector crosshairtrace; // world location directly beneath the player's crosshair <--- вот она собственно
#endif

#ifdef INFESTED_DLL
short crosshair_entity; // index of the entity under the player's crosshair
byte forced_action;
short sync_kill_ent;
Vector skill_dest;
short skill_dest_ent;
#endif

#if defined( KEEP_COMMAND_REPREDICTION_COUNT )
unsigned int debug_RepredictionCount;
#endif
};
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Да уверен, Createmove сильно поменялся. Посмотри у lwss, CursorRay в конце структуры. Я так понимаю твоя структура из csgo. У lwss когда я последний раз тестил (пол года назад) оффсеты были неверные. Лень щас искать исходники на диске, не помню оффсет правильный. Просто поставь хук на CreateMove и в реклассе посмотри. Перейди по адресу CUserCmd и Все адреса его покажи как Vecotr3 Если в демо хиро, то узнаешь по z = 128.0 на горе(на реке 0.0).

Но это временный метод, по хорошему разобрать как работает CreateMove и этим методом определять. Потому что для хуманайзера условно не будет лишним кинуть луч в World из любой точки, а не только из текущей мышки. Плюс хук менее производительный, потому что CreateMove очень часто вызывается(чаще чем тик сервера), а информация в данный момент нам может быть и не нужна.
полазал в чит енджине от 128 до 0 сканил(и камеру туда сюда перемещал сначала на 128 высоту потом на 0(речку)) по кд чтобы этот луч найти в памяти. нашел, хвбпшки сделал, нашел оффсет rsi+0x39cc, чекнул че лежит в rsi, там CDOTAInput. поискал в дилибе че интересного есть из функций CDOTAInput, увидел UpdateCrosshairEntityAndPosition почекал вроде оно(в коде функции movzx r12d, dl. то есть dl = bool. вызывается xor edx, edx; lea rcx, g_Input; call xxx. значит два аргумента(ну всмысле первый аргумент это this так что это как бы не аргумент но не суть) и один из них bool. совпадает с сигнатурой).
кароче в CDOTAInput лежит этот вектор, оттуда он в CUserCmd летит. в CDOTAInput он обновляется функцией CDOTAInput::UpdateCrosshairEntityAndPosition(bool)
она вызывает C_DOTAPlayer::GetCursorPositionAtTime(float) потом CDOTAInput::GetWorldRayFromMousePosition(int,int,Vector *,Vector *) потом CDOTAInput::FindWorld(Vector const&,Vector const&,Vector*)
 
Начинающий
Статус
Оффлайн
Регистрация
18 Ноя 2021
Сообщения
3
Реакции[?]
1
Поинты[?]
0
полазал в чит енджине от 128 до 0 сканил(и камеру туда сюда перемещал сначала на 128 высоту потом на 0(речку)) по кд чтобы этот луч найти в памяти. нашел, хвбпшки сделал, нашел оффсет rsi+0x39cc, чекнул че лежит в rsi, там CDOTAInput. поискал в дилибе че интересного есть из функций CDOTAInput, увидел UpdateCrosshairEntityAndPosition почекал вроде оно(в коде функции movzx r12d, dl. то есть dl = bool. вызывается xor edx, edx; lea rcx, g_Input; call xxx. значит два аргумента(ну всмысле первый аргумент это this так что это как бы не аргумент но не суть) и один из них bool. совпадает с сигнатурой).
кароче в CDOTAInput лежит этот вектор, оттуда он в CUserCmd летит. в CDOTAInput он обновляется функцией CDOTAInput::UpdateCrosshairEntityAndPosition(bool)
она вызывает C_DOTAPlayer::GetCursorPositionAtTime(float) потом CDOTAInput::GetWorldRayFromMousePosition(int,int,Vector *,Vector *) потом CDOTAInput::FindWorld(Vector const&,Vector const&,Vector*)
Лайк!!

Если ей нужен World, получается как ты и писал выше. Проводит луч к миру. А я предполагал, что она внутри юзает что то вроде ScreenToWorld из исходников cs-go.


вопрос не по теме. Как думаешь, получится на macos запустить старые билды доты 16 года для которых есть dylibы ? В steamdb есть эти версии, но они подозрительно маловаты. К сожалению у меня нет мака, покупал один раз даже аренду на пару часов через тим вивер, чтобы попробовать подебажить, но не вышло. Нужно много конфигов добавить. Скорее всего наиболее верный вариант скачать актуальную доту и уже в ней заменять библиотеки.

Еще проблема что ни под мак ни под линукс человеческого дебагера нет(даже не представляю как lwss все это раскопал через gdb), но думаю можно через иду попробовать дебажить
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
Лайк!!

Если ей нужен World, получается как ты и писал выше. Проводит луч к миру. А я предполагал, что она внутри юзает что то вроде ScreenToWorld из исходников cs-go.


вопрос не по теме. Как думаешь, получится на macos запустить старые билды доты 16 года для которых есть dylibы ? В steamdb есть эти версии, но они подозрительно маловаты. К сожалению у меня нет мака, покупал один раз даже аренду на пару часов через тим вивер, чтобы попробовать подебажить, но не вышло. Нужно много конфигов добавить. Скорее всего наиболее верный вариант скачать актуальную доту и уже в ней заменять библиотеки.

Еще проблема что ни под мак ни под линукс человеческого дебагера нет(даже не представляю как lwss все это раскопал через gdb), но думаю можно через иду попробовать дебажить
ScreenToWorld он везде одинаковый - луч от nearz до farz(то есть луч в пределах фрустума просмотра) который проходит через коорды мыши с последующим рейтрейсом.
а смысл запускать старые билды? если в новых билдах код с момента дилибов не изменился, то ты его запросто найдешь. если он изменился - тогда и смысл от дилибов минимальный так как все новое. единственное чего нет в дилибах - это хрефов на виртуальные вызовы(так как они через вмт вызываются), а так там инфы достаточно чтобы ничего не дебажить. еще раз: если ты что-то увидел в дилибах но не до конца понимаешь - найди это в современной длл и подебажь уже там. если в длл все изменилось, тогда и смысла 0 от дилиба в данном случае. ну подебажишь ты старый дилиб и поймешь как че делалось несколько лет назад, а толку то если щас уже все изменилось?
а так, ну да, наверно можно запустить. если дота на маке ваще запускается без стима. на винде например да(ну просто ехешник без открытого стима запускаешь, тебе потом просто пишет нет соединения и тд и тп а так демо работает). но опять же смысла не вижу.
а так через иду да можешь попробовать подебажить. я конечно на других ОС не дебажил, но пробовал одну игруху старую в иде дебажить на винде(другие дебагеры чето крашили мне игру я хуй забил с иды просто начал дебажить она не крашила. как и встроенный дебагер винды но он параша ваще), говнецо конечно но покатит если других вариантов нет.
 
Начинающий
Статус
Оффлайн
Регистрация
18 Ноя 2021
Сообщения
3
Реакции[?]
1
Поинты[?]
0
ScreenToWorld он везде одинаковый - луч от nearz до farz(то есть луч в пределах фрустума просмотра) который проходит через коорды мыши с последующим рейтрейсом.
а смысл запускать старые билды? если в новых билдах код с момента дилибов не изменился, то ты его запросто найдешь. если он изменился - тогда и смысл от дилибов минимальный так как все новое. единственное чего нет в дилибах - это хрефов на виртуальные вызовы(так как они через вмт вызываются), а так там инфы достаточно чтобы ничего не дебажить. еще раз: если ты что-то увидел в дилибах но не до конца понимаешь - найди это в современной длл и подебажь уже там. если в длл все изменилось, тогда и смысла 0 от дилиба в данном случае. ну подебажишь ты старый дилиб и поймешь как че делалось несколько лет назад, а толку то если щас уже все изменилось?
а так, ну да, наверно можно запустить. если дота на маке ваще запускается без стима. на винде например да(ну просто ехешник без открытого стима запускаешь, тебе потом просто пишет нет соединения и тд и тп а так демо работает). но опять же смысла не вижу.
а так через иду да можешь попробовать подебажить. я конечно на других ОС не дебажил, но пробовал одну игруху старую в иде дебажить на винде(другие дебагеры чето крашили мне игру я хуй забил с иды просто начал дебажить она не крашила. как и встроенный дебагер винды но он параша ваще), говнецо конечно но покатит если других вариантов нет.
На линуксе без стима не работает, даже с манипуляциями разными крашит после загрузки в меню. НО это не проблема я думаю. Есть же старая soruce1 dota, которую щас через стим запускают на винде. Можно будет так же попробовать подставить старую доту вместо новой в стиме.

Зачем это нужно ? С дебагом проще понять как работает поиск путей, очень важная функция для скриптов, чтобы построить траекторию или преследования противника. Например летит в тебя стан лины по области, нужно чтобы скрипат выходил из него кратчайшим путем, а ты стоишь в крипах. Можно рассчитать примитивным способом, с твоими предположениями о механике доты, но 1/10 случаев это будет работать неправильно.

Вообще поиск путей в доте работает на сервере, но можно переиспользовать функции локальной игры с ботами, которые лежат в server.dll
Либо не переиспользовать, а понять принцып работы и реализовать свои.

Там хранится список всех препятствий, динамические(крипы, герои) и статические(по типу деревьев). Сначала строится приблизительный путь с помощью алгоритма A*, которому похуй на препятствия, потом строится уже более точный Алгоритм, который и динамтческие объекты учитывает.
Как пишет разработчик valve на реддит, они какой то свой алгоритм разработали умный для окончательной траектории пути, называется WallTracing. Вот понять как он работает достаточно сложно глядя на огромные функции в декомпайлере иды. без дебага с символами тут не обойтись.


Я видел в старых API Ensage что то подобное, не знаю как это работало, я его не застал.
В остальных читах в API этого нет.
Arting Добрый день, есть ли у вас поиск путей в чите ? Если да, почему не высуните в js ?
 
Последнее редактирование:
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
779
Реакции[?]
331
Поинты[?]
63K
На линуксе без стима не работает, даже с манипуляциями разными крашит после загрузки в меню. НО это не проблема я думаю. Есть же старая soruce1 dota, которую щас через стим запускают на винде. Можно будет так же попробовать подставить старую доту вместо новой в стиме.

Зачем это нужно ? С дебагом проще понять как работает поиск путей, очень важная функция для скриптов, чтобы построить траекторию или преследования противника. Например летит в тебя стан лины по области, нужно чтобы скрипат выходил из него кратчайшим путем, а ты стоишь в крипах. Можно рассчитать примитивным способом, с твоими предположениями о механике доты, но 1/10 случаев это будет работать неправильно.

Вообще поиск путей в доте работает на сервере, но можно переиспользовать функции локальной игры с ботами, которые лежат в server.dll
Либо не переиспользовать, а понять принцып работы и реализовать свои.

Там хранится список всех препятствий, динамические(крипы, герои) и статические(по типу деревьев). Сначала строится приблизительный путь с помощью алгоритма A*, которому похуй на препятствия, потом строится уже более точный Алгоритм, который и динамтческие объекты учитывает.
Как пишет разработчик valve на реддит, они какой то свой алгоритм разработали умный для окончательной траектории пути, называется WallTracing. Вот понять как он работает достаточно сложно глядя на огромные функции в декомпайлере иды. без дебага с символами тут не обойтись.


Я видел в старых API Ensage что то подобное, не знаю как это работало, я его не застал.
В остальных читах в API этого нет.
Arting Добрый день, есть ли у вас поиск путей в чите ? Если да, почему не высуните в js ?
ну да, я тоже про систему навигации задумывался(правда дальше мыслей не уходило).
система навигации во всех сурс играх есть, попробуй в других играх почекай слитые сурсы там и прочую хуйню. уже хотя бы что-то будет какоето базовое понимание.
вон в доте чето интересное лежит в CreateInterface.
Module navsystem.dll
NavSystem001 -> CNavSystem
но опять же не забывай что в дилибе одно а в длл может быть уже совсем другое. пореверсишь ты там, а потом придешь в длл а там мб все изменилось.
ну а так на тебе пару ссылок поищи там че-нибудь(это слитые полу-сурсы)
Пожалуйста, авторизуйтесь для просмотра ссылки.
ксго
Пожалуйста, авторизуйтесь для просмотра ссылки.
тф2
ну если без стима не работает то тебе пизда получается - если стим тебя не пустит(а он тебя не пустит на старом билде. наверное. не тестил) то ты и потестить нихуя не сможешь. или мб все-таки есть способ без стима запустить. а на крайняк можно эмулировать. хуков там наставить на всяких стим апи(тока ты заебешься наверно) и пусть дота думает что ты со стима.
ну а так да, пореверси server.dll. он не должен особо от матчмейкинга отличаться - поиск путей он и в демке работает(ну твой герой же обходит деревья и прочую хуиту), значит он в сервер.длл и лежит.
ну и в сервере еще лежит какаято гейм мувмент хуита
Module server.dll
Source2ServerConfig001 -> CDOTAGameConfiguration
GameMovement001 -> CDOTAGameMovement
Source2GameDirector001 -> CDOTAHLTVDirector
Source2GameClients001 -> CSource2GameClients
Source2GameEntities001 -> CSource2GameEntities
Source2Server001 -> CSource2Server
Source2ServerSerializers002 -> CSource2ServerSerializers
EntitySubclassUtilsV001 -> CServerEntitySubclassUtils
 
Сверху Снизу