Вопрос Nearest entity

Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
355
Реакции[?]
24
Поинты[?]
12K
Как получить ближайшую ентити к курсору?

C_DOTAPlayer::GetNearestEntityToCursor

я пробовал смотреть в эту функцию но очень сложно и плюс я ставлю бп и нихрена не срабатывает и очень странно вродебы штука юзаемая должна быть
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
851
Реакции[?]
335
Поинты[?]
67K
Как получить ближайшую ентити к курсору?

C_DOTAPlayer::GetNearestEntityToCursor

я пробовал смотреть в эту функцию но очень сложно и плюс я ставлю бп и нихрена не срабатывает и очень странно вродебы штука юзаемая должна быть
смотря что воспринимать как "ближайшую" и по каким критериям судить(ближайшая к земле/стене которую пересекает луч курсора? ближайшая к переднему лучу курсора? ближайшая к переднему и правому лучам курсора? хитбокс которой пересекакется курсором "в большей степени"?)
можно WorldToScreenRay + RayTrace(т.е. первая попавшаяся точка мира(земля/стена) которую курсор пересекает) и потом берется сущность у которой дистанция до этой точки минимальна. сама дота когда цель выбираешь на лкм хитбоксы учитывает(старается выбрать то что ближе и при этом жирнее остальных).
можешь тупо уже готовую ентити брать у самой игры. CDOTAInput.Member<CHandle>(0x66C)
C++:
$-C              | 44:0F28C6                  | movaps xmm8,xmm6                                                       |
$-8              | 0FB64C24 50                | movzx ecx,byte ptr ss:[rsp+50]                                         |
$-3              | 884D 81                    | mov byte ptr ss:[rbp-7F],cl                                            |
$ ==>            | 44:8980 6C060000           | mov dword ptr ds:[rax+66C],r8d                                         | <-----------------
$+7              | 4C:8B35 C2066D03           | mov r14,qword ptr ds:[7FF890F70520]                                    |
$+E              | 48:837C24 58 00            | cmp qword ptr ss:[rsp+58],0                                            |
$+14             | 0F84 9A000000              | je client.7FF88D89FF04                                                 |
$+1A             | 4C:8B7424 58               | mov r14,qword ptr ss:[rsp+58]                                          |
$+1F             | 49:8BCE                    | mov rcx,r14                                                            |
$+22             | 49:8B06                    | mov rax,qword ptr ds:[r14]                                             |
$+25             | FF90 B00B0000              | call qword ptr ds:[rax+BB0]                                            |
$+2B             | 84C0                       | test al,al                                                             |
$+2D             | 74 47                      | je client.7FF88D89FEC6                                                 |
$+2F             | 49:8D8E 800A0000           | lea rcx,qword ptr ds:[r14+A80]                                         |
$+36             | 48:8B01                    | mov rax,qword ptr ds:[rcx]                                             |
$+39             | FF90 F0000000              | call qword ptr ds:[rax+F0]                                             |
$+3F             | 48:8BC8                    | mov rcx,rax                                                            |
$+42             | 48:8D15 4740E201           | lea rdx,qword ptr ds:[7FF88F6C3EE0]                                    | 00007FF88F6C3EE0:"npc_dota_unit_underlord_portal"
$+49             | E8 02BE7201                | call client.7FF88EFCBCA0                                               |
$+4E             | 85C0                       | test eax,eax                                                           |
$+50             | 74 24                      | je client.7FF88D89FEC6                                                 |
$+52             | 48:8B4D 90                 | mov rcx,qword ptr ss:[rbp-70]                                          |
$+56             | 41:0FB686 EB030000         | movzx eax,byte ptr ds:[r14+3EB]                                        |
$+5E             | 3881 EB030000              | cmp byte ptr ds:[rcx+3EB],al                                           |
$+64             | 75 10                      | jne client.7FF88D89FEC6                                                |
$+66             | 49:8B06                    | mov rax,qword ptr ds:[r14]                                             |
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
355
Реакции[?]
24
Поинты[?]
12K
смотря что воспринимать как "ближайшую" и по каким критериям судить(ближайшая к земле/стене которую пересекает луч курсора? ближайшая к переднему лучу курсора? ближайшая к переднему и правому лучам курсора? хитбокс которой пересекакется курсором "в большей степени"?)
можно WorldToScreenRay + RayTrace(т.е. первая попавшаяся точка мира(земля/стена) которую курсор пересекает) и потом берется сущность у которой дистанция до этой точки минимальна. сама дота когда цель выбираешь на лкм хитбоксы учитывает(старается выбрать то что ближе и при этом жирнее остальных).
можешь тупо уже готовую ентити брать у самой игры. CDOTAInput.Member<CHandle>(0x66C)
C++:
$-C              | 44:0F28C6                  | movaps xmm8,xmm6                                                       |
$-8              | 0FB64C24 50                | movzx ecx,byte ptr ss:[rsp+50]                                         |
$-3              | 884D 81                    | mov byte ptr ss:[rbp-7F],cl                                            |
$ ==>            | 44:8980 6C060000           | mov dword ptr ds:[rax+66C],r8d                                         | <-----------------
$+7              | 4C:8B35 C2066D03           | mov r14,qword ptr ds:[7FF890F70520]                                    |
$+E              | 48:837C24 58 00            | cmp qword ptr ss:[rsp+58],0                                            |
$+14             | 0F84 9A000000              | je client.7FF88D89FF04                                                 |
$+1A             | 4C:8B7424 58               | mov r14,qword ptr ss:[rsp+58]                                          |
$+1F             | 49:8BCE                    | mov rcx,r14                                                            |
$+22             | 49:8B06                    | mov rax,qword ptr ds:[r14]                                             |
$+25             | FF90 B00B0000              | call qword ptr ds:[rax+BB0]                                            |
$+2B             | 84C0                       | test al,al                                                             |
$+2D             | 74 47                      | je client.7FF88D89FEC6                                                 |
$+2F             | 49:8D8E 800A0000           | lea rcx,qword ptr ds:[r14+A80]                                         |
$+36             | 48:8B01                    | mov rax,qword ptr ds:[rcx]                                             |
$+39             | FF90 F0000000              | call qword ptr ds:[rax+F0]                                             |
$+3F             | 48:8BC8                    | mov rcx,rax                                                            |
$+42             | 48:8D15 4740E201           | lea rdx,qword ptr ds:[7FF88F6C3EE0]                                    | 00007FF88F6C3EE0:"npc_dota_unit_underlord_portal"
$+49             | E8 02BE7201                | call client.7FF88EFCBCA0                                               |
$+4E             | 85C0                       | test eax,eax                                                           |
$+50             | 74 24                      | je client.7FF88D89FEC6                                                 |
$+52             | 48:8B4D 90                 | mov rcx,qword ptr ss:[rbp-70]                                          |
$+56             | 41:0FB686 EB030000         | movzx eax,byte ptr ds:[r14+3EB]                                        |
$+5E             | 3881 EB030000              | cmp byte ptr ds:[rcx+3EB],al                                           |
$+64             | 75 10                      | jne client.7FF88D89FEC6                                                |
$+66             | 49:8B06                    | mov rax,qword ptr ds:[r14]                                             |
бля я смотрел в CDOTAInput::UpdateCrosshairEntityAndPosition и почемуто этого не нашел.я так понял в 0х66с лежит схендл сущности на которой торчит курсор. а можешь подсказать как получать сущность которая ближайшая к моему курсору но как бы курсор торчит в неё. или как например найти функцию способки героев, вот меня заинтересовала логика атаки героя в точку. типа стоит рядом со мной два героя Акс и Бристлблек. Я нажал "A" (AttacK) и тыкнул в точку. Как мне найти ту логику как дота определяает на какого героя нападать. Я ставил бпшку на преперордерс но оно только срабатывает только когда я даю приказ атаки в точку. типа я дал прикал атаковать в точку,мой герой идет а потом разворот на ближайшего героя к той точке.
 
Начинающий
Статус
Оффлайн
Регистрация
30 Мар 2020
Сообщения
355
Реакции[?]
24
Поинты[?]
12K
CDOTAInput + 0x5D4 тоже вроде имеет коорды курсора inworld вроде как
 
Участник
Статус
Оффлайн
Регистрация
23 Май 2019
Сообщения
851
Реакции[?]
335
Поинты[?]
67K
бля я смотрел в CDOTAInput::UpdateCrosshairEntityAndPosition и почемуто этого не нашел.я так понял в 0х66с лежит схендл сущности на которой торчит курсор. а можешь подсказать как получать сущность которая ближайшая к моему курсору но как бы курсор торчит в неё. или как например найти функцию способки героев, вот меня заинтересовала логика атаки героя в точку. типа стоит рядом со мной два героя Акс и Бристлблек. Я нажал "A" (AttacK) и тыкнул в точку. Как мне найти ту логику как дота определяает на какого героя нападать. Я ставил бпшку на преперордерс но оно только срабатывает только когда я даю приказ атаки в точку. типа я дал прикал атаковать в точку,мой герой идет а потом разворот на ближайшего героя к той точке.
ордеры на сервере а не на клиенте обрабатываются. ну наверно просто берёт ближайшую сущность(т.е. у которой минимальная дистанция среди всех сущностей) к точке земли/стены которую курсор пересекает(WorldToScreenRay + RayTrace). впринципе приказ в эту точку и отдаётся(там же 3д точки в приказе а не 2д)
 
Сверху Снизу