Другое SAMPFUNCS | API C++

|| NN - NoName ||

Известный
1,049
635
1) Чтобы создать поток, мне его просто создать createThread? или в SF API есть какая та функция для потока, чтобы в нём юзать while
2) Как получить координаты локального персонажа? И в дальнейшем же их заменить.
 

PanSeek

t.me/dailypanseek
Всефорумный модератор
908
1,775
1) Чтобы создать поток, мне его просто создать createThread? или в SF API есть какая та функция для потока, чтобы в нём юзать while
2) Как получить координаты локального персонажа? И в дальнейшем же их заменить.
1) Отдельный поток?
Просто можно делать и вот так:
C++:
void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            initialized = true;
        }
    }
    else
    {
        // code
    }
}
Будет работать все время пока загружен плагин и работает игра (грубо говоря как while (true)).
 

|| NN - NoName ||

Известный
1,049
635
1) Отдельный поток?
Просто можно делать и вот так:
C++:
void __stdcall mainloop()
{
    static bool initialized = false;
    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            initialized = true;
        }
    }
    else
    {
        // code
    }
}
Будет работать все время пока загружен плагин и работает игра (грубо говоря как while (true)).
а на второй вопрос, можно узнать ответ? А то пол форума переискал
 

N08I40K

Известный
224
107
Как узнать нету ли между двух координат каких-либо объектов?
---------------------------
Нашёл.
---------------------------
Скоро напишу пример, если кому то понадобится
---------------------------
(Я в C++ не очень, так что простите за мои косяки в коде, если они есть. Но всё вроде исправно работает)
Получается, если между камерой и нужным игроком есть какой либо объект/здание (НЕ машины, просвечивающие объекты (решётка и т.д), игроки), то выражение "okay" будет равно true, если нет false.
Грубо говоря если ты видишь игрока то false, нет значит true.

C++:
int iPlayer = 1;
if (SF->getSAMP()->getPlayers()->IsPlayerDefined(iPlayer, true)) {

    stRemotePlayer* pl = SF->getSAMP()->getPlayers()->pRemotePlayer[iPlayer]; // нужный игрок
    CVector* plPos = &CVector(pl->pPlayerData->fOnFootPos[0], pl->pPlayerData->fOnFootPos[1], pl->pPlayerData->fOnFootPos[2]); // создание вектора позиции игрока
    CVector* camPos = GAME->GetCamera()->GetCam(GAME->GetCamera()->GetActiveCam())->GetSource(); // получения вектора позиции камеры
    CColPoint** colPoint = NULL; // точка соприкосновения с объектом (если условие равно true)
    CEntity** entity = NULL; // Указатель на энтити в месте соприкосновения (если условие равно true)
    SLineOfSightFlags flags = SLineOfSightFlags(); // условия просчёта

    // Если столкновение c:
    flags.bCheckBuildings = true; // Строениями (гташные пол, дома и т.д)
    flags.bCheckCarTires = false; // Хз что это
    flags.bCheckDummies = false; // тоже хз
    flags.bCheckObjects = true; // Объектами (я так понял самповскими)
    flags.bCheckPeds = false; // Педами (Игроками. Лучше false если проверка идёт между игроками, иначе "okay" всегда будет true, из-за того что "луч" будет врезаться в самого игрока)
    flags.bCheckVehicles = false; // Машинами
    flags.bIgnoreSomeObjectsForCamera = false; // Так и не понял что это
    flags.bSeeThroughStuff = false; // C "просвечивающимися" объектами (решётками и т.д)
    flags.bShootThroughStuff = true; // С объектами которые можно прострелить

    bool okay = GAME->GetWorld()->ProcessLineOfSight(plPos, camPos, colPoint, entity, flags); // Сама проверка
    if (okay) {
        SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 255, 0), "+");
    } else {
        SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(255, 0, 0), "-");
    }
}
 
Последнее редактирование модератором:

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,744
4,809
Как узнать нету ли между двух координат каких-либо объектов?
---------------------------
Нашёл.
---------------------------
Скоро напишу пример, если кому то понадобится
---------------------------
(Я в C++ не очень, так что простите за мои косяки в коде, если они есть. Но всё вроде исправно работает)
Получается, если между камерой и нужным игроком есть какой либо объект/здание (НЕ машины, просвечивающие объекты (решётка и т.д), игроки), то выражение "okay" будет равно true, если нет false.
Грубо говоря если ты видишь игрока то false, нет значит true.

C++:
int iPlayer = 1;
if (SF->getSAMP()->getPlayers()->IsPlayerDefined(iPlayer, true)) {

    stRemotePlayer* pl = SF->getSAMP()->getPlayers()->pRemotePlayer[iPlayer]; // нужный игрок
    CVector* plPos = &CVector(pl->pPlayerData->fOnFootPos[0], pl->pPlayerData->fOnFootPos[1], pl->pPlayerData->fOnFootPos[2]); // создание вектора позиции игрока
    CVector* camPos = GAME->GetCamera()->GetCam(GAME->GetCamera()->GetActiveCam())->GetSource(); // получения вектора позиции камеры
    CColPoint** colPoint = NULL; // точка соприкосновения с объектом (если условие равно true)
    CEntity** entity = NULL; // Указатель на энтити в месте соприкосновения (если условие равно true)
    SLineOfSightFlags flags = SLineOfSightFlags(); // условия просчёта

    // Если столкновение c:
    flags.bCheckBuildings = true; // Строениями (гташные пол, дома и т.д)
    flags.bCheckCarTires = false; // Хз что это
    flags.bCheckDummies = false; // тоже хз
    flags.bCheckObjects = true; // Объектами (я так понял самповскими)
    flags.bCheckPeds = false; // Педами (Игроками. Лучше false если проверка идёт между игроками, иначе "okay" всегда будет true, из-за того что "луч" будет врезаться в самого игрока)
    flags.bCheckVehicles = false; // Машинами
    flags.bIgnoreSomeObjectsForCamera = false; // Так и не понял что это
    flags.bSeeThroughStuff = false; // C "просвечивающимися" объектами (решётками и т.д)
    flags.bShootThroughStuff = true; // С объектами которые можно прострелить

    bool okay = GAME->GetWorld()->ProcessLineOfSight(plPos, camPos, colPoint, entity, flags); // Сама проверка
    if (okay) {
        SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 255, 0), "+");
    } else {
        SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(255, 0, 0), "-");
    }
}
Разве что вместо
C++:
CColPoint** colPoint = NULL; // точка соприкосновения с объектом (если условие равно true)
CEntity** entity = NULL; // Указатель на энтити в месте соприкосновения (если условие равно true)
Нужно делать вот так:
C++:
CColPoint* colPoint = nullptr; // точка соприкосновения с объектом (если условие равно true)
CEntity* entity = nullptr; // Указатель на энтити в месте соприкосновения (если условие равно true)
И вызов соответственно заменить на такой:
C++:
GAME->GetWorld()->ProcessLineOfSight(plPos, camPos, &colPoint, &entity, flags); // Сама проверка
colPoint при этом будет указателем на точку прикосновения, у которой можно получить нормаль, координаты коллизии, etc.
entity будет указателем на CEntity с которым произошло «столкновение»
 
  • Нравится
Реакции: PanSeek и N08I40K

Dark_Knight

Me, me and me.
Друг
4,081
2,099
Код старый, но суть поймешь надеюсь.
C++:
struct stShowDialog{
    WORD ID;
    byte Style;
    byte _t, _b1, _b2;
    string Title, Button1, Button2, Text;
    stShowDialog() {
        ID = 0;
        Style = _t = _b1 = _b2 = 0;
    }
};


stShowDialog rpcDialog;
bs->Read(rpcDialog.ID);
        bs->Read(rpcDialog.Style);
        bs->Read(rpcDialog._t);
        rpcDialog.Title.resize((size_t)rpcDialog._t, '\0');
        bs->Read((PCHAR)rpcDialog.Title.data(), (size_t)rpcDialog._t);
        bs->Read(rpcDialog._b1);
        rpcDialog.Button1.resize((size_t)rpcDialog._b1, '\0');
        bs->Read((PCHAR)rpcDialog.Button1.data(), (size_t)rpcDialog._b1);
        bs->Read(rpcDialog._b2);
        rpcDialog.Button2.resize((size_t)rpcDialog._b2, '\0');
        bs->Read((PCHAR)rpcDialog.Button2.data(), (size_t)rpcDialog._b2);
        rpcDialog.Text.resize(4096, '\0');
        SF->getRakNet()->DecodeString((PCHAR)rpcDialog.Text.data(), 4096, bs);
        rpcDialog.Text = rpcDialog.Text.substr(0, rpcDialog.Text.find('\0'));
 

[w0te]

Потрачен
771
492
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
1>main.cpp(7): error C2065: VEHICLE_POINTER_SELF: необъявленный идентификатор
1>main.cpp(8): error C2065: Vehicle: необъявленный идентификатор
1>main.cpp(8): error C2227: выражение слева от "->GetDamageManager" должно указывать на тип класса, структуры или объединения либо на универсальный тип
1> main.cpp(8): note: тип: unknown-type
1>main.cpp(8): error C2227: выражение слева от "->SetWheelStatus" должно указывать на тип класса, структуры или объединения либо на универсальный тип
WM-Screenshots-20211105025937.png

что не так?
 

AdCKuY_DpO4uLa

Адский дрочер
Друг
316
672
1>main.cpp(7): error C2065: VEHICLE_POINTER_SELF: необъявленный идентификатор
1>main.cpp(8): error C2065: Vehicle: необъявленный идентификатор
1>main.cpp(8): error C2227: выражение слева от "->GetDamageManager" должно указывать на тип класса, структуры или объединения либо на универсальный тип
1> main.cpp(8): note: тип: unknown-type
1>main.cpp(8): error C2227: выражение слева от "->SetWheelStatus" должно указывать на тип класса, структуры или объединения либо на универсальный тип
Посмотреть вложение 120871
что не так?
C++:
if (PEDSELF && PEDSELF->GetVehicle() && PEDSELF->GetVehicle()->GetDamageManager()) {
    CVehicle *veh = PEDSELF->GetVehicle();
    veh->GetDamageManager()->SetWheelStatus(eWheels::FRONT_RIGHT_WHEEL, 1);
}
 
  • Нравится
Реакции: [w0te]

|Gumus|

Известный
9
1
Есть ли документация с описанием методов SAMPFUNCS API? На Wiki blasthack нашёл только описание опкодов.