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

Rjx13

Известный
Проверенный
224
160
как перевести координаты скина указанного игрока по id в экранные?
Код:
float enpos[3];
                float screen[2];

                switch (SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->bytePlayerState)
                {
                case PLAYER_STATE_ONFOOT:
                    enpos[0] = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->fOnFootPos[0]; // X
                    enpos[1] = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->fOnFootPos[1]; // Y
                    enpos[2] = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->fOnFootPos[2]; // Z

                    break;
                case PLAYER_STATE_DRIVER:
                    enpos[0] = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->inCarData.fPosition[0]; // X
                    enpos[1] = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->inCarData.fPosition[1]; // Y
                    enpos[2] = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->inCarData.fPosition[2]; // Z

                    break;
                case PLAYER_STATE_PASSENGER:
                    enpos[0] = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->passengerData.fPosition[0]; // X
                    enpos[1] = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->passengerData.fPosition[1]; // Y
                    enpos[2] = SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->passengerData.fPosition[2]; // Z

                    break;
                }

                SF->getGame()->convert3DCoordsToScreen(enpos[0], enpos[1], enpos[2], &screen[0], &screen[1]);
 

Musaigen

abobusnik
Проверенный
1,583
1,302
Как можно получить макс. кол-во пассажирских мест в машине, имея ее vehicle_info?
 

Aniki

🐰
Администратор
1,225
1,506
Доброй ночи. Как можно получить этот текст? (тот, что в правом нижнем углу)
Через хук на incomingRPC
C++:
bool CALLBACK incomingRPC(stRakNetHookParams *params) // определение callback-функции, которая будет вызвана, если от сервера был получен новый RPC.
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrDisplayGameText)
    {
        int style, time;
        int textLen;
        char text[128];

        params->bitStream->ResetReadPointer(); // обнуляем оффсет чтения.
        params->bitStream->Read(style);
        params->bitStream->Read(time);
        params->bitStream->Read(textLen);
        params->bitStream->Read(text, textLen); // text - собственно текст
        text[textLen] = '\0';
        params->bitStream->ResetReadPointer(); // обнуляем оффсет чтения

        SF->getSAMP()->getChat()->AddChatMessage(0xFFFFFF, "%s", text); // выводим текст в чат     
    };

    return true; // успешно завершаем обработку RPC.
};

SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_INCOMING_RPC, incomingRPC); // регистрируем в инициализации
 
  • Нравится
Реакции: #TheKot

jenekbueno

Известный
157
69
upload_2018-11-16_22-40-26.png


если передаю аргумент в строку, то вместо русских символов выводит знаки вопроса.
есть методы решения этой проблемы?
 

Rjx13

Известный
Проверенный
224
160
Как правильно читать RPC_ClientJoin? Пробывал так, но крашит:

Код:
bool CALLBACK outcomingData(stRakNetHookParams *params) {
    if (params->packetId == RPCEnumeration::RPC_ClientJoin) {
        uint version;
        byte mod;
        string name;
        uint clientChallengeResponse;
        string serial;

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(version);
        params->bitStream->Read(mod);
        params->bitStream->Read(name);
        params->bitStream->Read(clientChallengeResponse);
        params->bitStream->Read(serial);
        params->bitStream->ResetReadPointer();

    }

    return true;
}


SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_OUTCOMING_RPC, outcomingData);
 

ALF

Известный
Проверенный
320
537
Как правильно читать RPC_ClientJoin? Пробывал так, но крашит:

Код:
bool CALLBACK outcomingData(stRakNetHookParams *params) {
    if (params->packetId == RPCEnumeration::RPC_ClientJoin) {
        uint version;
        byte mod;
        string name;
        uint clientChallengeResponse;
        string serial;

        params->bitStream->ResetReadPointer();
        params->bitStream->Read(version);
        params->bitStream->Read(mod);
        params->bitStream->Read(name);
        params->bitStream->Read(clientChallengeResponse);
        params->bitStream->Read(serial);
        params->bitStream->ResetReadPointer();

    }

    return true;
}


SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_OUTCOMING_RPC, outcomingData);
C++:
bool CALLBACK outcomingData(stRakNetHookParams *params) 
{
    if (params->packetId == RPCEnumeration::RPC_ClientJoin) 
    {       
        int iVersion;
        byte byteMod;
        byte byteNameLen;
        char szNickName[32];
        uint uiChallengeResponse;
        byte byteAuthBSLen;
        char pszAuthBullshit[44];
       
        params->bitStream->ResetReadPointer();
        params->bitStream->Read(iVersion);
        params->bitStream->Read(byteMod);
        params->bitStream->Read(byteNameLen);
        params->bitStream->Read(szNickName, byteNameLen);
        params->bitStream->Read(uiChallengeResponse);
        params->bitStream->Read(byteAuthBSLen);
        params->bitStream->Read(pszAuthBullshit, byteAuthBSLen);
    }

    return true;
}
 
  • Нравится
Реакции: Rjx13

Adder

Известный
22
0
Сделал хайд смс, но хотелось бы, чтобы сообщения в чатлоге не менялись, только менялись в самой игре. При перезаписи с помощью SF->getSAMP()->getChat()->chatEntry[99].szText. Работает как нужно, но проблема в том, что SF->getSAMP()->getChat()->chatEntry[99].szText не срабатывает хуке.
C++:
bool CALLBACK incomingRPC(stRakNetHookParams *params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
    {
        uint32_t        dwStrLen, dwColor;
        char            szMsg[256];
        params->bitStream->ResetReadPointer();
        params->bitStream->Read(dwColor);
        params->bitStream->Read(dwStrLen);
        if (dwStrLen >= sizeof(szMsg))
            dwStrLen = sizeof(szMsg) - 1;
        params->bitStream->Read(szMsg, dwStrLen);
        szMsg[dwStrLen] = '\0';
        params->bitStream->ResetReadPointer();

        if (strstr(szMsg, "SMS:"))
        {
            strcpy_s(szMsg, "Hidden");
            dwStrLen = strlen(szMsg);
            params->bitStream->Write(szMsg, dwStrLen);
        }
    }
    return true;
}
 

CyberSuslik

Участник
88
12
Каким образом можно в строку чата Samp добавить свои свои данные ? Допустим, есть сообщение от сервера "Объявление: *******" Нужно добавить [Реклама] в начало каждого такого сообщения от сервера.
 

#Rin

Известный
Всефорумный модератор
1,214
1,036
Каким образом можно в строку чата Samp добавить свои свои данные ? Допустим, есть сообщение от сервера "Объявление: *******" Нужно добавить [Реклама] в начало каждого такого сообщения от сервера.
Например хук на RPC.
C++:
bool __stdcall incomingRPC(stRakNetHookParams *params)
{
    if (params->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
    {
        size_t len;
        DWORD color;
        char message[256];
        params->bitStream->ResetReadPointer();
        params->bitStream->Read(color);
        params->bitStream->Read(len);
        params->bitStream->Read(message, len);
        params->bitStream->ResetReadPointer();
        message[len] = '\0';
        // Твои действия.
    }
    return true;
}