1) Отдельный поток?1) Чтобы создать поток, мне его просто создать createThread? или в SF API есть какая та функция для потока, чтобы в нём юзать while
2) Как получить координаты локального персонажа? И в дальнейшем же их заменить.
void __stdcall mainloop()
{
static bool initialized = false;
if (!initialized)
{
if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
{
initialized = true;
}
}
else
{
// code
}
}
а на второй вопрос, можно узнать ответ? А то пол форума переискал1) Отдельный поток?
Просто можно делать и вот так:
Будет работать все время пока загружен плагин и работает игра (грубо говоря как while (true)).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 } }
Нет такогоfloat heading = PEDSELF->GetHeading();
Я кажись перепутал с псдк. Попробуй float heading = PEDSELF->GetCurrentRotation();Нет такого
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++ не очень, так что простите за мои косяки в коде, если они есть. Но всё вроде исправно работает)
Получается, если между камерой и нужным игроком есть какой либо объект/здание (НЕ машины, просвечивающие объекты (решётка и т.д), игроки), то выражение "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), "-"); } }
CColPoint** colPoint = NULL; // точка соприкосновения с объектом (если условие равно true)
CEntity** entity = NULL; // Указатель на энтити в месте соприкосновения (если условие равно true)
CColPoint* colPoint = nullptr; // точка соприкосновения с объектом (если условие равно true)
CEntity* entity = nullptr; // Указатель на энтити в месте соприкосновения (если условие равно true)
GAME->GetWorld()->ProcessLineOfSight(plPos, camPos, &colPoint, &entity, flags); // Сама проверка
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'));
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
что не так?
if (PEDSELF && PEDSELF->GetVehicle() && PEDSELF->GetVehicle()->GetDamageManager()) {
CVehicle *veh = PEDSELF->GetVehicle();
veh->GetDamageManager()->SetWheelStatus(eWheels::FRONT_RIGHT_WHEEL, 1);
}