SF курд через синхру

Lepestok

Известный
Автор темы
129
171
Как реализовать курд через синхру в SF? Почему это не дает никакого результата?

это:
void __stdcall test(std::string arg) {
    bNop = !bNop;
    bTest = !bTest;
    AddChat(ColorYellow bNop ? "Start" : "Stop");
}

bool __stdcall onSendPacket(stRakNetHookParams* pRakHook) {

    if (pRakHook->packetId == ID_VEHICLE_SYNC)
        if (bNop)
            return false;

    return true;
}

void __stdcall mainloop()
{
    static bool initialized = false;

    if (bTest) {

        if (PEDSELF->GetVehicle()) {

            if (GetTickCount() - 30 > timer) {

                stInCarData incar;

                memset(&incar, 0, sizeof(stInCarData));

                incar = SF->getSAMP()->getPlayers()->pLocalPlayer->inCarData;

                if (GetDistance(incar.fPosition[0], incar.fPosition[1], incar.fPosition[2], 2422.2329101563, 1705.0350341797, 10.751810073853) < 5) {
                    PEDSELF->GetVehicle()->Teleport(2422.2329101563, 1705.0350341797, 10.751810073853);
                    bTest = false;
                    bNop = false;
                }

                CVector vec(2422.2329101563 - incar.fPosition[0], 1705.0350341797 - incar.fPosition[1], 10.751810073853 - incar.fPosition[2]);

                vec.Normalize();
               
                incar.fMoveSpeed[0] = 0.1000100107375;
                incar.fMoveSpeed[1] = 0.0130210005875;
                incar.fMoveSpeed[2] = 0.00000000195313;

                incar.fPosition[0] = incar.fPosition[0] + (vec.fX * 4.5);
                incar.fPosition[1] = incar.fPosition[1] + (vec.fY * 4.5);
                incar.fPosition[2] = incar.fPosition[2] + (vec.fZ * 4.5);

                BitStream bs;

                bs.Write((BYTE)ID_VEHICLE_SYNC);
                bs.Write((PCHAR)&incar, sizeof(stInCarData));

                SF->getRakNet()->SendPacket(&bs);

                timer = GetTickCount();
            }

        }
        else {
            AddChat(ColorYellow, "Необходимо сесть в машину!");
            bTest = false;
        }
    }

    if (!initialized)
    {
        if (GAME && GAME->GetSystemState() == eSystemState::GS_PLAYING_GAME && SF->getSAMP()->IsInitialized())
        {
            initialized = true;

            SF->getSAMP()->registerChatCommand("test", test);
            SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_OUTCOMING_PACKET, onSendPacket);
        }
    }
}

Тоже самое, но на луа. Работает как часы:
Lua:
function main()
while not isSampAvailable() do wait(100) end

sampRegisterChatCommand("test", function()
        _, x, y, z = getTargetBlipCoordinates()
        if _ then
            car = storeCarCharIsInNoSave(PLAYER_PED)
            if car then
                Nop = true
                Kaka(x, y, z, car)
            end
        end
    end)
   
end
function Kaka(x, y, z, car)
    local data = samp_create_sync_data('vehicle')
    lua_thread.create(function()
        while true do wait(30)
                    xx, yy, zz = x - data.position.x, y - data.position.y, z - data.position.z
                    vectorPlayer = vector3D(xx, yy, zz)
                    vectorPlayer:normalize()
                    data.moveSpeed.x = 0.1000100107375
                    data.moveSpeed.y = 0.0130210005875
                    data.moveSpeed.z = 0.00000000195313
                    data.position.x = data.position.x + (vectorPlayer.x * 4.5)
                    data.position.y = data.position.y + (vectorPlayer.y * 4.5)
                    data.position.z = data.position.z + (vectorPlayer.z * 4.5)
                    data.send()
                    if getDistanceBetweenCoords2d(data.position.x, data.position.y, x, y) < 5 then
                        setCarCoordinates(car, x, y, z)
                        wait(100)
                        Nop = false
                        break
                    end
        end
    end)
end
function ev.onSendVehicleSync(data)
    if Nop then return false end
end
 
Последнее редактирование:
Решение
пример с меткой
C++:
#include "main.h"

SAMPFUNCS *SF = new SAMPFUNCS();

CVector orig, pos;
bool check;
int dist{5}, delay{30};

void InCarSync(float x, float y, float z)
{
    stInCarData data{};
    data = SF->getSAMP()->getPlayers()->pLocalPlayer->inCarData;
    data.fPosition[0] = x;
    data.fPosition[1] = y;
    data.fPosition[2] = z;
    BitStream bs;
    bs.Write(static_cast<BYTE>(ID_VEHICLE_SYNC));
    bs.Write(reinterpret_cast<PCHAR>(&data), sizeof(stInCarData));
    SF->getRakNet()->SendPacket(&bs);
}

CVector mark() {
    CVector marker;
    for (int i = 0; i < (0xAF * 0x28); i += 0x28) {
        if (*reinterpret_cast<short*>(0xBA873D + i) == 4611) {
            marker = *reinterpret_cast<CVector*>(0xBA86F8 + 0x28 + i)...

al3x_

Известный
130
1,035
пример с меткой
C++:
#include "main.h"

SAMPFUNCS *SF = new SAMPFUNCS();

CVector orig, pos;
bool check;
int dist{5}, delay{30};

void InCarSync(float x, float y, float z)
{
    stInCarData data{};
    data = SF->getSAMP()->getPlayers()->pLocalPlayer->inCarData;
    data.fPosition[0] = x;
    data.fPosition[1] = y;
    data.fPosition[2] = z;
    BitStream bs;
    bs.Write(static_cast<BYTE>(ID_VEHICLE_SYNC));
    bs.Write(reinterpret_cast<PCHAR>(&data), sizeof(stInCarData));
    SF->getRakNet()->SendPacket(&bs);
}

CVector mark() {
    CVector marker;
    for (int i = 0; i < (0xAF * 0x28); i += 0x28) {
        if (*reinterpret_cast<short*>(0xBA873D + i) == 4611) {
            marker = *reinterpret_cast<CVector*>(0xBA86F8 + 0x28 + i);
            reinterpret_cast<void(__cdecl*)(CVector*)>(0x40ED80)(&marker);
            marker.fZ = GAME->GetWorld()->FindGroundZForPosition(marker.fX, marker.fY);
        }
    }
    return marker;
}

void CALLBACK cmd(std::string) {
    if (!PEDSELF->GetVehicle() || *reinterpret_cast<int*>(0xBA6774) == 0) return;
    orig = *PEDSELF->GetVehicle()->GetPosition();
    pos = mark();
    check = !check;
    SF->getSAMP()->getChat()->AddChatMessage(-1, check ? "on" : "off");
}

bool CALLBACK outcomingData(stRakNetHookParams *params) {
    if (params->packetId == PacketEnumeration::ID_VEHICLE_SYNC && check) return false;
    return true;
}

void CALLBACK mainloop() {  
    static bool init{};
    if (!init) {
        if (GAME == nullptr || GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME || !SF->getSAMP()->IsInitialized()) return;
        SF->getSAMP()->registerChatCommand("coord", cmd);
        SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_OUTCOMING_PACKET, outcomingData);
        init = true;
    }
    if (check) {
        if (PEDSELF->GetVehicle()) {
            static DWORD time{};
            if (GetTickCount() - delay > time) {              
                CVector bet = pos - orig;
                if (bet.Length() <= dist) {
                    PEDSELF->GetVehicle()->Teleport(pos.fX, pos.fY, pos.fZ + 1.f);
                    SF->getSAMP()->getChat()->AddChatMessage(-1, "success");
                    check = false;
                }
                else {
                    bet.Normalize();
                    orig.fX += bet.fX * dist;
                    orig.fY += bet.fY * dist;
                    orig.fZ += bet.fZ * dist;
                    InCarSync(orig.fX, orig.fY, orig.fZ);
                    time = GetTickCount();
                }
            }
        }
        else {      
            SF->getSAMP()->getChat()->AddChatMessage(-1, "off");
            check = false;
        }
    }
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID) {
    if (fdwReason == DLL_PROCESS_ATTACH) SF->initPlugin(mainloop, hinstDLL);
    return TRUE;
}
 
Последнее редактирование: