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

MISTER_GONWIK

Всефорумный гонщик
Всефорумный модератор
1,260
1,740
Если что то рендерить и сесть в машину на срп Посмотреть вложение 8048 ломается рендер.
Как это исправить?

На самп-рп сделали новый спидометр и сразу стала такая фигня с рендером.
0pReg сртима стоит? Если да, то проблема в нем (он может находиться в папке "core")
 

MrYurkoo

Известный
102
9
Исходя из первого и второго урока API SF, при рендринге .sf стали очень далеко прорисовываться ники игроков. Каким образом это можно убрать?
 

Sonik Mells

Известный
12
2
Есть где-то список всех функций sf api?
Не благодари!

EFtfhurmooE.jpg
 
  • Нравится
Реакции: BlackKnigga

ЯedЯuM

Malware Maker
244
304
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Почему не один из хендлеров c мта классов не срабатывает? В моем случае SetTaskSimpleBeHitHandler
Но были попытки ставить и Pre и Post WeaponFireHandler
C++:
void EventHandler( CPedSAInterface* pPedAttacker, ePedPieceTypes hitBodyPart, int hitBodySide, int weaponId )
{
    SF->getSAMP()->getChat()->AddChatMessage( D3DCOLOR_XRGB(51, 204, 255), "Event Handler!"); 
}
void WINAPI mainloop( void )
{
    static bool init = false;
    if (!init)
    {
        if (GAME == nullptr) return;
        if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME) return;
        if(!SF->getSAMP()->IsInitialized()) return;
        GAME->SetTaskSimpleBeHitHandler(EventHandler);
        init = true; 
    }
}
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,460
Почему не один из хендлеров c мта классов не срабатывает? В моем случае SetTaskSimpleBeHitHandler
Ты уверен, что он работает так, как ты думаешь?
Как по мне, нужно сначала начать действие (то бишь CreateTaskSimpleBeHit). Насчет "Pre и Post WeaponFireHandler" ничего сказать не могу.
 

ЯedЯuM

Malware Maker
244
304
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ты уверен, что он работает так, как ты думаешь?
Как по мне, нужно сначала начать действие (то бишь CreateTaskSimpleBeHit). Насчет "Pre и Post WeaponFireHandler" ничего сказать не могу.
Тогда я выбрал не совсем то что мне нужно. Есть какие то методы еще чтобы узнать в какую часть тела мне попали кроме RPC TakeDamage?
Нашел GAME->GetEventList()->CreateEventDamage но не понял как им пользоваться.
 
Последнее редактирование:

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,460
Тогда я выбрал не совсем то что мне нужно. Есть какие то методы еще чтобы узнать в какую часть тела мне попали кроме RPC TakeDamage?
Нашел GAME->GetEventList()->CreateEventDamage но не понял как им пользоваться.
Допустим так же, как и в MTA: https://github.com/multitheftauto/m.../multiplayer_sa/multiplayer_shotsync.cpp#L739
Я не знаю, насколько безопасно это использовать совместно с SAMP'ом.
Он срабатывает на всех педов, которые находятся в стриме => нужно будет проверять с локальным.
C++:
#define HOOKPOS_CEventDamage__AffectsPed                0x4B35A0

bool ProcessDamageEvent(CEventDamageSAInterface* event, CPedSAInterface* affectsPed)
{
    if (event)
    {
        SF->Log("Event!");

        CPools *pPools = GAME->GetPools();
        CPed * pPed = pPools->GetPed((DWORD *)affectsPed);
        CEntity * pInflictor = NULL;

        if (pPed)
        {
            // This creates a CEventDamageSA for us
            CEventDamage* pEvent = GAME->GetEventList()->GetEventDamage(event);
            pEvent->SetDamageReason(EDamageReason::OTHER);
            // Destroy the CEventDamageSA (so we dont get a leak)
            pEvent->Destroy();
            // Finally, return
        }
    }
    return true;
}

CPedSAInterface* affectsPed = 0;
CEventDamageSAInterface* event = 0;
void _declspec(naked) HOOK_CEventDamage__AffectsPed()
{
    /*
    004B35A0   83EC 0C          SUB ESP,0C
    004B35A3   56               PUSH ESI
    004B35A4   8BF1             MOV ESI,ECX
    */

    _asm
    {
        push    esi

        mov     esi, [esp + 8]
        mov     affectsPed, esi // store the ped
        mov     event, ecx // store the event pointer

        pop     esi

        pushad
    }

    if (ProcessDamageEvent(event, affectsPed))
    {
        // they want the damage to happen!
        _asm
        {
            popad

            sub     esp, 0xC        // replacement code
            push    esi
            mov     esi, ecx

            mov     ecx, HOOKPOS_CEventDamage__AffectsPed
            add     ecx, 6
            jmp     ecx
        }
    }
    else
    {
        // they want the player to escape unscathed

        _asm
        {
            popad
            xor     eax, eax
            retn    4 // return from the function
        }
    }
}


void CALLBACK mainloop()
{
    static bool init = false;
    if (!init)
    {
        if (GAME == nullptr)
            return;
        if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
            return;

        // HookInstall ( HOOKPOS_CEventDamage__AffectsPed, (DWORD)HOOK_CEventDamage__AffectsPed, 6 );
        SF->getGame()->createHook((void*)HOOKPOS_CEventDamage__AffectsPed, HOOK_CEventDamage__AffectsPed, DETOUR_TYPE_JMP, 6);

        SF->Log("Plugin initiliazed!");

        init = true;
    }
}
 
  • Нравится
Реакции: Ya Zaregalsya

ЯedЯuM

Malware Maker
244
304
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Допустим так же, как и в MTA: https://github.com/multitheftauto/m.../multiplayer_sa/multiplayer_shotsync.cpp#L739
Я не знаю, насколько безопасно это использовать совместно с SAMP'ом.
Он срабатывает на всех педов, которые находятся в стриме => нужно будет проверять с локальным.
C++:
#define HOOKPOS_CEventDamage__AffectsPed                0x4B35A0

bool ProcessDamageEvent(CEventDamageSAInterface* event, CPedSAInterface* affectsPed)
{
    if (event)
    {
        SF->Log("Event!");

        CPools *pPools = GAME->GetPools();
        CPed * pPed = pPools->GetPed((DWORD *)affectsPed);
        CEntity * pInflictor = NULL;

        if (pPed)
        {
            // This creates a CEventDamageSA for us
            CEventDamage* pEvent = GAME->GetEventList()->GetEventDamage(event);
            pEvent->SetDamageReason(EDamageReason::OTHER);
            // Destroy the CEventDamageSA (so we dont get a leak)
            pEvent->Destroy();
            // Finally, return
        }
    }
    return true;
}

CPedSAInterface* affectsPed = 0;
CEventDamageSAInterface* event = 0;
void _declspec(naked) HOOK_CEventDamage__AffectsPed()
{
    /*
    004B35A0   83EC 0C          SUB ESP,0C
    004B35A3   56               PUSH ESI
    004B35A4   8BF1             MOV ESI,ECX
    */

    _asm
    {
        push    esi

        mov     esi, [esp + 8]
        mov     affectsPed, esi // store the ped
        mov     event, ecx // store the event pointer

        pop     esi

        pushad
    }

    if (ProcessDamageEvent(event, affectsPed))
    {
        // they want the damage to happen!
        _asm
        {
            popad

            sub     esp, 0xC        // replacement code
            push    esi
            mov     esi, ecx

            mov     ecx, HOOKPOS_CEventDamage__AffectsPed
            add     ecx, 6
            jmp     ecx
        }
    }
    else
    {
        // they want the player to escape unscathed

        _asm
        {
            popad
            xor     eax, eax
            retn    4 // return from the function
        }
    }
}


void CALLBACK mainloop()
{
    static bool init = false;
    if (!init)
    {
        if (GAME == nullptr)
            return;
        if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
            return;

        // HookInstall ( HOOKPOS_CEventDamage__AffectsPed, (DWORD)HOOK_CEventDamage__AffectsPed, 6 );
        SF->getGame()->createHook((void*)HOOKPOS_CEventDamage__AffectsPed, HOOK_CEventDamage__AffectsPed, DETOUR_TYPE_JMP, 6);

        SF->Log("Plugin initiliazed!");

        init = true;
    }
}
Спасибо огромное работает! Если не затруднит подскажи как проверить что CPed равен моему локальному, просто сравнить указатели?
 

ЯedЯuM

Malware Maker
244
304
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,460
Еще такую дичь заметил, что хук срабатывает словно 3 раза. Вот вывело дебуг месседж столько же всего за один выстрел.
Я так же как и ты - не знаю как оно работает)0
 
  • Нравится
Реакции: ЯedЯuM