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

ЯedЯuM

Malware Maker
244
304
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Помогите правильно прочесть пешую синхру, я с раксампа попробовал состряпать что-то схожее в плагине но результаты обнадеживают(
C++:
bool __stdcall PacketHook(stRakNetHookParams *hook)
{
    if (hook->packetId == ID_PLAYER_SYNC)
    {
        stOnFootData foot; ZeroMemory(&foot, sizeof(foot));
        BitStream bsPlayerSync(hook->bitStream->GetData(), hook->bitStream->GetNumberOfBitsUsed() / 8, false);
        uint16_t SenderID; bool bHasLR, bHasUD; bool bHasSurfInfo, bAnimation;
        bsPlayerSync.IgnoreBits(8);
        bsPlayerSync.Read(SenderID);
        if (SenderID == targetID)
        {
            bsPlayerSync.Read(bHasLR);
            if (bHasLR) bsPlayerSync.Read(foot.sLeftRightKeys);
            bsPlayerSync.Read(bHasUD);
            if (bHasUD) bsPlayerSync.Read(foot.sUpDownKeys);
            bsPlayerSync.Read(foot.sKeys);
            bsPlayerSync.Read((char*)foot.fPosition, sizeof(float) * 3);
            bsPlayerSync.Read((char*)foot.fQuaternion, sizeof(float) * 4);
            BYTE byteHealthArmour;
            BYTE byteHealth, byteArmour;
            BYTE byteArmTemp = 0, byteHlTemp = 0;
            bsPlayerSync.Read(byteHealthArmour);
            byteArmTemp = (byteHealthArmour & 0x0F);
            byteHlTemp = (byteHealthArmour >> 4);
            if (byteArmTemp == 0xF) byteArmour = 100;
            else if (byteArmTemp == 0) byteArmour = 0;
            else byteArmour = byteArmTemp * 7;
            if (byteHlTemp == 0xF) byteHealth = 100;
            else if (byteHlTemp == 0) byteHealth = 0;
            else byteHealth = byteHlTemp * 7;
            foot.byteHealth = byteHealth;
            foot.byteArmor = byteArmour;
            bsPlayerSync.Read(foot.byteCurrentWeapon);
            bsPlayerSync.Read(foot.byteSpecialAction);
            bsPlayerSync.Read((char*)foot.fMoveSpeed, sizeof(float) * 3);
            bsPlayerSync.Read(bHasSurfInfo);
            if (bHasSurfInfo)
            {
                bsPlayerSync.Read(foot.sSurfingVehicleID);
                bsPlayerSync.Read((char*)foot.fSurfingOffsets, sizeof(float) * 3);
            }
            else foot.sSurfingVehicleID = -1;
            bsPlayerSync.Read(bAnimation);
            if (bAnimation)
            {
                bsPlayerSync.Read(foot.sCurrentAnimationID);
                bsPlayerSync.Read(foot.sAnimFlags);
            }
            else
            {
                foot.sCurrentAnimationID = 0;
                foot.sAnimFlags = 0;
            }
            SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(245, 184, 0),
            "ID: %d | Health: %.1f | Armour: %.1f | Weapon: %d", SenderID, foot.byteHealth, foot.byteArmor, foot.byteCurrentWeapon);
        }
    }
    return true;
}
На выходе: ID: 34 | Health: 0.0 | Armour: 0.0 | Weapon: 28437720
 

SR_team

like pancake
BH Team
4,720
6,374
Но ведь когда он одевает маску, для сервера он черный и для остальных игроков тоже черный + им приходит RPC_SetPlayerColor, по идеи.
но ведь ты тоже получаешь инфу о том какой у него цвет, а т.к. он не всегда в маске, то можно тупо не принимать инфу о черном цаете для ника
 

tropical5466

Известный
28
19
Как узнать какие данные присылает RPC?
Ибо в раклоггере только это
Код:
[12:14:53.840] > [RPC Recv] RPC_ScrSetPlayerTeam[69](length: 3 bytes, 24 bits)
> dump:
0000  1E 00 01                                           ...
 

Dark_Knight

Me, me and me.
Друг
4,067
2,080
bool playerIsSpawned(void)
{
bool result = false;
if (SF->getSAMP()->getPlayers()->IsPlayerDefined(SF->getSAMP()->getPlayers()->sLocalPlayerID, true))
result = SF->getSAMP()->getPlayers()->pLocalPlayer->iIsActorAlive && !SF->getSAMP()->getPlayers()->pLocalPlayer->iIsInSpawnScreen;

return result;
};
 

SR_team

like pancake
BH Team
4,720
6,374
Ты в маске и к тебе в стрим зашел новый игрок, которого не было до момент её надевания. Как я узнаю его цвет, если сервер прислал, что у него черный цвет.
сервер информирует даже за стримом. глянь в таб, там же цветные ники
 

AWRage

Активный
642
141
но ведь ты тоже получаешь инфу о том какой у него цвет, а т.к. он не всегда в маске, то можно тупо не принимать инфу о черном цаете для ника
Я думал, он хочет чтобы для других игроков его цвет ника не изменялся.
 

ЯedЯuM

Malware Maker
244
304
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Не правильно читает рпц чат бубл( Хелп
C++:
// DWORD playerID, DWORD color, float drawDistance, DWORD expireTime, byte strLen, char[] text
DWORD playerID, color, expireTime; float drawDistance; byte strLen; char text[256];
hook->bitStream->ResetReadPointer();
hook->bitStream->Read(playerID);
hook->bitStream->Read(color);
hook->bitStream->Read(drawDistance);
hook->bitStream->Read(expireTime);
hook->bitStream->Read(strLen);
hook->bitStream->Read(text);
hook->bitStream->ResetReadPointer();
RPC_ScrChatBubble: playerID -65142 | color 65535 | expireTime -854392832 | drawDistance 0.00 | strLen 224 | text
 

Dark_Knight

Me, me and me.
Друг
4,067
2,080
Во всех РПЦ ид читать не нужно. да и считываешь не правильно.
https://sampwiki.blast.hk/wiki/SetPlayerChatBubble
 

ЯedЯuM

Malware Maker
244
304
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Во всех РПЦ ид читать не нужно. да и считываешь не правильно.
https://sampwiki.blast.hk/wiki/SetPlayerChatBubble
https://docs.google.com/spreadsheets/d/1iIxEk7yR8r7ZLGiSAL4ndtz_N1k0p3Wt7TE5bei6ztU/edit#gid=1
То есть иды в этом перечне просто ошибка автора? На сколько знаю для исходнящего рпц ид не нужен, а для входящих да но не для всех.