ASI [Неактуален] SFSpawnFix | Фикс sampIsLocalPlayerSpawned()

#Northn

Pears Project — уже запущен!
Автор темы
Всефорумный модератор
2,656
2,541
Версия SA-MP
  1. 0.3.7-R3
Плагин исправляет опкод 0B61 (sampIsLocalPlayerSpawned()).
Нужен только для SAMP 0.3.7-R3-1!
Установка: перекинуть в корневую папку с игрой.

C++:
rtdhook_call* hook;

void __fastcall CScriptThread__SetCondResult(void* ecx, uintptr_t localPlayer, bool a3)
{
    bool ret = *reinterpret_cast<void**>(localPlayer) != nullptr // m_pPed
        && *reinterpret_cast<BOOL*>(localPlayer + 0x141)  // m_bClearedToSpawn
        && *reinterpret_cast<BOOL*>(localPlayer + 0x17B); // m_bHasSpawnInfo
    reinterpret_cast<void(__thiscall*)(void*, bool)>(hook->getHookedFunctionAddress())(ecx, ret);
}

__declspec(naked) void __fastcall CScriptThread__SetCondResult_Naked()
{
    __asm {
        mov edx, eax
        jmp CScriptThread__SetCondResult
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD fdwReason, LPVOID lpReserved)
{
    if (fdwReason == DLL_PROCESS_ATTACH)
    {
        uintptr_t handle;
        if (handle = reinterpret_cast<uintptr_t>(GetModuleHandleA("SAMPFUNCS.asi")), handle != 0)
        {
            hook = new rtdhook_call(handle + 0x866F8, &CScriptThread__SetCondResult_Naked);
            hook->install();
        }
    }
    return TRUE;
}
 

Вложения

  • SFSpawnFix.asi
    9.5 KB · Просмотры: 1,893
Последнее редактирование:

AnWu

Известный
Всефорумный модератор
4,777
5,400
опиши в чем баг, я первый раз слышу
 
  • Bug
Реакции: AugustTN
D

deleted-user-422095

Гость
опиши в чем баг, я первый раз слышу
@MISTER_GONWIK функция sampIsLocalPlayerSpawned() некорректно работает. Всегда возвращает false.
Сегодня очередной раз Аризона что-то придумала и в лаунчере изменила версию клиента сампа на R3 и тут настало время проверить SAMPFUNCS под R3.
 

Hatiko

Известный
Проверенный
1,512
628
Если будет установлен на R1, если вдруг впихивать плагин в комплект скриптов, для их работы на R3, но чел установит на стандартную сборку, где R1? Проигнорится или нельзя прям. Если нельзя, то сделай проверку на версию на всякий случай.
 

#Northn

Pears Project — уже запущен!
Автор темы
Всефорумный модератор
2,656
2,541
Если будет установлен на R1, если вдруг впихивать плагин в комплект скриптов, для их работы на R3, но чел установит на стандартную сборку, где R1? Проигнорится или нельзя прям. Если нельзя, то сделай проверку на версию на всякий случай.
крашнет
 

Dark.

Известный
1,745
778
Норм штука, фиксит много чего на лаунчере. Можно через мастерскую связаться с разрабами, возможно это добавят в лаунчер.
 
  • Ха-ха
Реакции: madrasso

Lobber

Известный
178
57
Хорошо что один из старых нерабочих опкодов SF пофиксили, молодец. Может быть руки дойдут и до 0B25: samp 2@ = get_player_health? Это было бы шикарно, ибо на данный момент приходится костылями на R3 получать хп перса :(
 

Hatiko

Известный
Проверенный
1,512
628
Хорошо что один из старых нерабочих опкодов SF пофиксили, молодец. Может быть руки дойдут и до 0B25: samp 2@ = get_player_health? Это было бы шикарно, ибо на данный момент приходится костылями на R3 получать хп перса :(
Используй рациональный аналог опкод 0226: 1@ = actor 0@ health, который корректно работает.
 

#Northn

Pears Project — уже запущен!
Автор темы
Всефорумный модератор
2,656
2,541
Используй рациональный аналог опкод 0226: 1@ = actor 0@ health, который корректно работает.
Потому что у тебя стоит плагин, который фиксит данный момент, без него самп устанавливает всем 1000хп
Хорошо что один из старых нерабочих опкодов SF пофиксили, молодец. Может быть руки дойдут и до 0B25: samp 2@ = get_player_health? Это было бы шикарно, ибо на данный момент приходится костылями на R3 получать хп перса :(
Не слышал об этой проблеме, гляну
 

Lobber

Известный
178
57
Используй рациональный аналог опкод 0226: 1@ = actor 0@ health, который корректно работает.
Единственный метод как заставить эту структуру работать на R3, это ActiveHitpoints [R1/R3], и он возвращает не идеально точное количество здоровья перса. Погрешность в +- 6 хп, если и использовать 0226: 1@ = actor 0@ health, что не допустимо в некоторых моих скриптах. Там нужна предельная точность, и такое может дать только 0B25: samp 2@ = get_player_health. Потому и написал об этом.