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

_Vine_

Активный
154
57
Какая альтернатива этому опкоду из клео в SF API?
CLEO:
00C2:   sphere_onscreen 3@ 4@ 5@ radius 10.0

А так же, хотелось бы узнать, возможно использовать функцию ниже из SF API в ASI скриптах?
C++:
SF->loadPlugin("./SAMPFUNCS/123.sf");

И последний, третий вопрос)
Как выгрузить текущий плагин из игры?
Есть функция SF->unloadPlugin();, но она работает на все плагины, кроме того плагина из которого вызываеться эта функция. Тоесть этой функцией не получиться выгрузить текущий плагин из игры.

Кто знает - помогите, пожалуйста ;D
Буду ну оочень благодарен =)
 
Последнее редактирование:

ALF

Известный
Проверенный
320
537
А так же, хотелось бы узнать, возможно использовать функцию ниже из SF API в ASI скриптах?
C++:
SF->loadPlugin("./SAMPFUNCS/123.sf");
C++:
GetProcAddress(LoadLibrary("SAMPFUNCS.asi"), "?loadPlugin@SAMPFUNCS@@QAEXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z");
 

_Vine_

Активный
154
57
А где указывать путь к плагину который нужно будет загрузить в игру?
 

Vandal™

Известный
55
4
Какая альтернатива этому опкоду из клео в SF API?
00C2: sphere_onscreen 3@ 4@ 5@ radius 10.0
Вот как вариант:
C++:
void CalcScreenCoors(D3DXVECTOR3 *vecWorld, D3DXVECTOR3 *vecScreen)
{
    /** C++-ifyed function 0x71DA00, formerly called by CHudSA::CalcScreenCoors **/
    // Get the static view matrix as D3DXMATRIX
    D3DXMATRIX    m((float *)( 0xB6FA2C ));

    // Get the static virtual screen (x,y)-sizes
    DWORD        *dwLenX = (DWORD *)( 0xC17044 );
    DWORD        *dwLenY = (DWORD *)( 0xC17048 );

    //DWORD *dwLenZ = (DWORD*)(0xC1704C);
    //double aspectRatio = (*dwLenX) / (*dwLenY);
    // Do a transformation
    vecScreen->x = ( vecWorld->z * m._31 ) + ( vecWorld->y * m._21 ) + ( vecWorld->x * m._11 ) + m._41;
    vecScreen->y = ( vecWorld->z * m._32 ) + ( vecWorld->y * m._22 ) + ( vecWorld->x * m._12 ) + m._42;
    vecScreen->z = ( vecWorld->z * m._33 ) + ( vecWorld->y * m._23 ) + ( vecWorld->x * m._13 ) + m._43;

    // Get the correct screen coordinates
    double    fRecip = ( double )1.0 / vecScreen->z;    //(vecScreen->z - (*dwLenZ));
    vecScreen->x *= (float)( fRecip * ( *dwLenX ) );
    vecScreen->y *= (float)( fRecip * ( *dwLenY ) );
}

Пример:
C++:
for(int i = 0; i < SAMP_MAX_PICKUPS; i++)
{
    if(!SF->getSAMP()->getInfo()->pPools->pPickup->IsPickupExists(i)) continue;
    D3DXVECTOR3 scPos;
    if(GetDistance(D3DXVECTOR3(SF->getSAMP()->getInfo()->pPools->pPickup->pickup[i].fPosition), D3DXVECTOR3(PEDSELF->GetPosition()->fX, PEDSELF->GetPosition()->fY, PEDSELF->GetPosition()->fZ)) > 350) continue;
    // первый параметр - это твои 3@ 4@ 5@
    CalcScreenCoors(&D3DXVECTOR3(SF->getSAMP()->getInfo()->pPools->pPickup->pickup[i].fPosition), &scPos);
    if(scPos[2] > 0.01f) // radius
    {
        char szMsg[16];
        sprintf(szMsg, "pid: %i\n%.0f m.", i, GetDistance(D3DXVECTOR3(SF->getSAMP()->getInfo()->pPools->pPickup->pickup[i].fPosition), D3DXVECTOR3(PEDSELF->GetPosition()->fX, PEDSELF->GetPosition()->fY, PEDSELF->GetPosition()->fZ)));
        pFont->Print(szMsg, 0xFFCECECE, scPos.x, scPos.y, false);
    }
}
 

Vandal™

Известный
55
4
Как выгрузить текущий плагин из игры?
Есть функция SF->unloadPlugin();, но она работает на все плагины, кроме того плагина из которого вызываеться эта функция. Тоесть этой функцией не получиться выгрузить текущий плагин из игры.
pfree [название плагина] - в консоль SF.
 

_Vine_

Активный
154
57
Спасибо большое за альтернативу опкоду, но на счет pfree, я не это имел в виду.
Мне нужно что бы скрипт сам деактивировался при заданный условиях, а не что бы я его деактивировал. Проще говоря, я делаю привязку по железу, а вот деактивацию не знаю как сделать, уже с готовой проверкой ключа. Вообщем нужна замена опкода end_custom_thread в SF API.
 

BlackKnigga

Известный
BH Team
922
445
Спасибо большое за альтернативу опкоду, но на счет pfree, я не это имел в виду.
Мне нужно что бы скрипт сам деактивировался при заданный условиях, а не что бы я его деактивировал. Проще говоря, я делаю привязку по железу, а вот деактивацию не знаю как сделать, уже с готовой проверкой ключа. Вообщем нужна замена опкода end_custom_thread в SF API.
Не выгружай, а просто уводи в беск. цикл
 

Blood

Известный
45
1
Как можно реализовать чтобы при каждом убийстве врага, выводился рендер.
+1 KILL по типу этого, догадки есть, как сделать, но не совсем понятно, как узнать, что я убил игрока
 

iAmerican

Известный
Друг
615
257
Как можно реализовать чтобы при каждом убийстве врага, выводился рендер.
+1 KILL по типу этого, догадки есть, как сделать, но не совсем понятно, как узнать, что я убил игрока

Примерно так. Доделаешь до ума сам

C++:
char chAttack[256];

bool CALLBACK incomingRPC(stRakNetHookParams *params) {
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrDeathMessage)
    {
        WORD killerid;
        WORD playerid;
        BYTE reason;

        params->bitStream->Read(killerid);
        params->bitStream->Read(playerid);
        params->bitStream->Read(reason);

        if (killerid = SF->getSAMP()->getPlayers()->sLocalPlayerID) {
    
sprintf(chAttack, " Ты убил игрока %s(%i)", SF->getSAMP()->getPlayers()->GetPlayerName(playerid), playerid);
        }
    }

    return true;
};

bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride, CONST RGNDATA *pDirtyRegion)
{
    if (SUCCEEDED(SF->getRender()->BeginRender()))
    {
        if (!SF->getGame()->isGTAMenuActive())
        {
            pFontMenu->Print(chAttack, -1, 500, 500, false);
        }
        SF->getRender()->EndRender();
    };
    return true;
};

// В mainloop до init = true;

SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC);
 

Karbun

Участник
112
3
Как прочитать RPC_ScrSetPlayerDrunkLevel? RakLogger выдаёт это:
Код:
> [RPC Recv] RPC_ScrSetPlayerDrunkLevel[35](length: 4 bytes, 32 bits)
> dump:
0000  D0 07 00 00
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Как прочитать RPC_ScrSetPlayerDrunkLevel? RakLogger выдаёт это:
Код:
> [RPC Recv] RPC_ScrSetPlayerDrunkLevel[35](length: 4 bytes, 32 bits)
> dump:
0000  D0 07 00 00
По всей видимости это и есть дринк левел. Тип шорт. Мб ансайнед шорт. Я х.з.
SAMP.Lua/events.lua at master · THE-FYP/SAMP.Lua · GitHub(https://github.com/THE-FYP/SAMP.Lua/blob/master/samp/events.lua#L81)
 
  • Нравится
Реакции: Karbun

Karbun

Участник
112
3
Как прочитать RPC_ScrCreate3DTextLabel? Пробовал вот так, но что-то не получается :(

C++:
bool CALLBACK ScrCreate3DTextLabel(stRakNetHookParams *params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrCreate3DTextLabel)
    {
        WORD id;
        DWORD color;
        int attachedPlayerId, attachedVehicleId;
        float distance;
        byte LOS;
        char text[256];
        float pos[3];

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(id);
        params->bitStream->Read(color);
        params->bitStream->Read(pos);
        params->bitStream->Read(distance);
        params->bitStream->Read(LOS);
        params->bitStream->Read(attachedPlayerId);
        params->bitStream->Read(attachedVehicleId);
        SF->getRakNet()->DecodeString(text, 256, params->bitStream);
    }
    return true;
}
 

BlackKnigga

Известный
BH Team
922
445
Ты передаешь значения переменных, а надо указатель передавать.
Нет, там передача параметров по ссылке
Как прочитать RPC_ScrCreate3DTextLabel? Пробовал вот так, но что-то не получается :(

C++:
bool CALLBACK ScrCreate3DTextLabel(stRakNetHookParams *params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrCreate3DTextLabel)
    {
        WORD id;
        DWORD color;
        int attachedPlayerId, attachedVehicleId;
        float distance;
        byte LOS;
        char text[256];
        float pos[3];

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(id);
        params->bitStream->Read(color);
        params->bitStream->Read(pos);
        params->bitStream->Read(distance);
        params->bitStream->Read(LOS);
        params->bitStream->Read(attachedPlayerId);
        params->bitStream->Read(attachedVehicleId);
        SF->getRakNet()->DecodeString(text, 256, params->bitStream);
    }
    return true;
}
AttachedPlayerID и AttachedVehicleID по 2 байта - WORD
 
  • Нравится
Реакции: Karbun