Вопрос Получить все Ped'ы в радиусе видимости

Тема в разделе "C, C++", создана пользователем SumJest, 25 мар 2018.

  1. SumJest

    SumJest Активный участник

    Регистрация:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    1
    В полезной статье на вики нашёл адреса некоторых переменных в гта. Интересуют эти:
    Смущается указатель на указатель, никак не могу понять что с этим делать. Интуитивно уже не получается. Пытаюсь взять, а получается совсем не то, что мне нужно (Текущее число элементов в пуле). Пытался найти гайды, сорсы некоторых скриптов, нашёл только клео, но там опкодом берётся значение из памяти. Интересует конкретно на языке C++.
     
  2. Тополиный.Пух

    Тополиный.Пух Постоянный участник

    Регистрация:
    13 сен 2015
    Сообщения:
    87
    Симпатии:
    40
    С переводом траблы, поход
     
  3. SumJest

    SumJest Активный участник

    Регистрация:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    1
    Сейчас чекну
     
  4. SumJest

    SumJest Активный участник

    Регистрация:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    1
            DWORD* start = (DWORD*)0xB74490;
            *start += 0x12;
            DWORD &size= *start;
            char outstring[10];
            sprintf(outstring,"%d",size);
    Правильно в таком случае? Просто не работает.
     
  5. Тополиный.Пух

    Тополиный.Пух Постоянный участник

    Регистрация:
    13 сен 2015
    Сообщения:
    87
    Симпатии:
    40
    DWORD *numOfPed = (DWORD *)(0xB74490 + 0xC);
    12 в десятичной и 12 в шестнадцатеричной это разные числа
     
    DonHomka нравится это.
  6. SumJest

    SumJest Активный участник

    Регистрация:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    1
    Думал там уже в шестнадцатеричной написано :-)
                DWORD* start = (DWORD*)0xB74490;
                DWORD *numOfPed = (DWORD *)(*start + 0xC);
                char outstring[10];
                sprintf(outstring, "%d", numOfPed);
    Что-то не то. И если как у тебя тоже не то.
     
  7. SumJest

    SumJest Активный участник

    Регистрация:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    1
    Я затупил, вывожу адрес :D. Спасибо
     
  8. SumJest

    SumJest Активный участник

    Регистрация:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    1
    Как теперь перебрать всех игроков?
    CPed* pedsList = (CPed*)(*start + 0x4);
    Получил указатель на массив, что делать дальше без понятия...
     
  9. Тополиный.Пух

    Тополиный.Пух Постоянный участник

    Регистрация:
    13 сен 2015
    Сообщения:
    87
    Симпатии:
    40
  10. Сэнд

    Проверенный

    Регистрация:
    26 авг 2015
    Сообщения:
    427
    Симпатии:
    272
    ну теоретически можно в цикле брать из массива элементы по индексу для дальнейших операций с ними
     
  11. SumJest

    SumJest Активный участник

    Регистрация:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    1
    Это я понял, а как из CPed(в случае если это пэд игрока) получить его id?
     
  12. memir

    memir Интересующийся

    Регистрация:
    21 авг 2015
    Сообщения:
    120
    Симпатии:
    64
    Никак. Id - это чисто самповская тема, и в гташных структурах ты его не найдешь
     
  13. SumJest

    SumJest Активный участник

    Регистрация:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    1
    Ясен пень, как тогда поступать? В клео это делается через хэндл, там тоже по памяти проходятся циклом.
     
  14. memir

    memir Интересующийся

    Регистрация:
    21 авг 2015
    Сообщения:
    120
    Симпатии:
    64
    Циклом по пулу игроков бегай, и у каждого игрока сверяй указатель на CPed со своим. Если совпало, то из структуры игрока забираешь id
     
  15. SumJest

    SumJest Активный участник

    Регистрация:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    1
    По всем игрокам? Не понял немного, можешь на примере показать?
     
  16. memir

    memir Интересующийся

    Регистрация:
    21 авг 2015
    Сообщения:
    120
    Симпатии:
    64
    int getSAMPPlayerIDFromGTAPed(struct actor_info *pGTAPed)
    {
        if (g_Players == NULL)
            return 0;
        if (actor_info_get(ACTOR_SELF, 0) == pGTAPed)
            return g_Players->sLocalPlayerID;
    
        int i;
        for (i = 0; i < SAMP_MAX_PLAYERS; i++)
        {
            if (g_Players->iIsListed[i] != 1)
                continue;
            if (g_Players->pRemotePlayer[i] == NULL)
                continue;
            if (g_Players->pRemotePlayer[i]->pPlayerData == NULL)
                continue;
            if (g_Players->pRemotePlayer[i]->pPlayerData->pSAMP_Actor == NULL)
                continue;
            if (g_Players->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped == NULL)
                continue;
            if (g_Players->pRemotePlayer[i]->pPlayerData->pSAMP_Actor->pGTA_Ped == pGTAPed)
                return i;
        }
    
        return ACTOR_SELF;
    }
    Из собейта
     
  17. SumJest

    SumJest Активный участник

    Регистрация:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    1
    g_Players что это за переменная? Может библиотеку надо какую подключать?
     
  18. Сэнд

    Проверенный

    Регистрация:
    26 авг 2015
    Сообщения:
    427
    Симпатии:
    272
    samp.h наверна, хз
     
  19. SumJest

    SumJest Активный участник

    Регистрация:
    10 июл 2017
    Сообщения:
    27
    Симпатии:
    1
    Тут actor_info возвращает, а в памяти хранится CPed