Вопрос по PSDK + SAMP API

Vintik

Через тернии к звёздам
Автор темы
Проверенный
1,560
1,031
Не нашёл документацию ни по первому, ни по второму API.
Есть проект, в котором используется PSDK, SAMP API и imgui.

Задача: перебрать всех игроков в зоне стрима, получить ближайшего из тех, кто в машине, получить его samp (0.3.7-r3) id, вывести его id в чат.
Кажется, просто, но что-то не получается найти нужные функции (логику я сам напишу, просто укажите какие функции нужны для этого [перебор игроков, проверка в машине ли, получение по ped-у его samp id] — а лучше расскажите где вы нашли их, документации не вижу).

Задача 2: выводить актуальный id в имгуи окно, с имгуи что-то тоже примеров не нашёл. Можно пример простейшего окна имгуи (пусть со статическим текстом)?

Заранее спасибо.
 
Решение
Не нашёл документацию ни по первому, ни по второму API.
Есть проект, в котором используется PSDK, SAMP API и imgui.

Задача: перебрать всех игроков в зоне стрима, получить ближайшего из тех, кто в машине, получить его samp (0.3.7-r3) id, вывести его id в чат.
Кажется, просто, но что-то не получается найти нужные функции (логику я сам напишу, просто укажите какие функции нужны для этого [перебор игроков, проверка в машине ли, получение по ped-у его samp id] — а лучше расскажите где вы нашли их, документации не вижу).

Задача 2: выводить актуальный id в имгуи окно, с имгуи что-то тоже примеров не нашёл. Можно пример простейшего окна имгуи (пусть со статическим текстом)?

Заранее спасибо.
Перебор самповского пула игроков и...

waparabka

Известный
109
166
plugin.cpp:
uint16_t get_nearest_driver() {
  
    auto player_pool = c_netgame::get()->ref()->get_player_pool();

    if (!player_pool)
        return 65535; // invalid id

    auto my_ped = player_pool->get_local_player()->get_ped();

    if (!my_ped)
        return 65535;

    std::map<float, uint16_t> nearest;

    for (int i = 0; i < player_pool->MAX_PLAYERS; i++) {

        auto target = player_pool->get_player(i);

        if (!target || !target->does_exist())
            continue;

        auto target_ped = target->m_pPed;

        if (!target_ped)
            continue;
      
        c_vector my_position;
        my_ped->get_bone_position(8, &my_position);

        c_vector target_position;
        target_ped->get_bone_position(8, &target_position);
      
        auto distance = my_position.distance_to(target_position);

        nearest[distance] = target->m_nId;
    }

    if (nearest.empty())
        return 65535;

    return nearest.begin()->second;
}

все нужные функции есть тут: https://github.com/BlastHackNet/SAMP-API/tree/multiver/src/sampapi/0.3.7-R3-1


c_vector:
class c_vector {

public:
    float x, y, z;

    c_vector() : x(0), y(0), z(0) { }
    c_vector(float x, float y, float z) : x(x), y(y), z(z) { };


    void set(float _x, float _y, float _z) {
        x = _x;
        y = _y;
        z = _z;
    }

    float get_length_squared() const {
        return x * x + y * y + z * z;
    }

    float get_length() const {
        return std::sqrt(get_length_squared());
    }

    void normalize() {
        float len = get_length();
        x /= len;
        y /= len;
        z /= len;
    }

    float dot(const c_vector& vec) const {
        return x * vec.x + y * vec.y + z * vec.z;
    }

    c_vector cross(const c_vector& vec) const {
        return c_vector(y * vec.z - vec.y * z, z * vec.x - vec.z * x, x * vec.y - vec.x * y);
    }

    void zero_near_zero() {
        if (std::abs(x) < 0.0001f)
            x = 0;
        if (std::abs(y) < 0.0001f)
            y = 0;
        if (std::abs(z) < 0.0001f)
            z = 0;
    }

    float distance_to(const c_vector& other) const {
        float dx = other.x - x;
        float dy = other.y - y;
        float dz = other.z - z;

        return std::sqrt(dx * dx + dy * dy + dz * dz);
    }
};

P.S по желанию можешь сделать проверку на seat_index
 
  • Нравится
Реакции: whyega52, ARMOR и Vintik

ARMOR

Go Robot
Модератор
4,973
6,926
Не нашёл документацию ни по первому, ни по второму API.
Есть проект, в котором используется PSDK, SAMP API и imgui.

Задача: перебрать всех игроков в зоне стрима, получить ближайшего из тех, кто в машине, получить его samp (0.3.7-r3) id, вывести его id в чат.
Кажется, просто, но что-то не получается найти нужные функции (логику я сам напишу, просто укажите какие функции нужны для этого [перебор игроков, проверка в машине ли, получение по ped-у его samp id] — а лучше расскажите где вы нашли их, документации не вижу).

Задача 2: выводить актуальный id в имгуи окно, с имгуи что-то тоже примеров не нашёл. Можно пример простейшего окна имгуи (пусть со статическим текстом)?

Заранее спасибо.
Перебор самповского пула игроков и получение их самповского CPed ( Доработай там, а то выводит 10000 если педа в тачке вообще нет)

1736773230695.jpeg


C++:
#include "plugin.h"
#include "sampapi/CNetGame.h"
#include "sampapi/CInput.h"
#include "sampapi/CChat.h"
#include "CPed.h"

using namespace plugin;
namespace samp = sampapi::v037r3;

class Main {
public:
    static void TestPool(const char* szArg) {
        samp::CPlayerPool* pPlayerPool = samp::RefNetGame()->GetPlayerPool();

        if (pPlayerPool) {
            // Топ самп метод, поставить заоблачное значение чтобы не ебать себе мозги. Не рекомендую кароч
            float fDist{10000.f};
            sampapi::ID nPlayerID{};

            for (sampapi::ID i{}; i < 1004; i++)
            {
                if (pPlayerPool->IsConnected(i)) {

                    samp::CRemotePlayer* pPlayer = pPlayerPool->GetPlayer(i);
                    if (pPlayer && pPlayer->DoesExist()) {

                        CPed* pGamePed = (CPed*)pPlayer->m_pPed->m_pGamePed;
                        if (pGamePed && pGamePed->m_nPedFlags.bInVehicle) {
                            float fTempDist = pPlayer->m_pVehicle->GetDistanceToLocalPlayer();
                            if (fTempDist < fDist) {
                                fDist = fTempDist;
                                nPlayerID = pPlayer->m_nId;
                            }
                        }
                    }
                }
            }
           
            std::string szResult = "Ближайший игрок в транспорте: " + std::to_string(nPlayerID) + " | Дистанция: " + std::to_string(fDist);
            samp::RefChat()->AddMessage(0xFFFFFFFF, szResult.c_str());
        }
    }

    Main() {
        Events::drawingEvent += []() {
            static bool bInit{};

            if (!bInit && samp::RefNetGame()) {
                samp::RefChat()->AddMessage(-1, "Game init!");
                samp::RefInputBox()->AddCommand("testpool", TestPool);
                bInit = true;
            }
        };
    }

    ~Main() {
    };
} g_Main;