ASI Прочее LightScreenshot

kin4stat

mq-team
Автор темы
Всефорумный модератор
2,730
4,710
Версия SA-MP
  1. Любая
Нечего было делать, и @DarkP1xel предложил мне сделать функцию как у него в проекте. Хз почему никто раньше не додумался сделать такую штуку отдельно. Уменьшает размер скриншота примерно в 5 раз, без потери качества. Совместимо вроде со всеми версиями сампа, т.к. идет поиск по памяти.
Не убирает фриз при скриншоте.
Сверху без плагина, снизу с плагином
1600989523190.png


Search Pattern: \x8B\x54\x24\x10\x8D\x4C\x24\x1C\x51\x53\x52\x6A\x03\x50
R3 - samp.dll + 0x74FBA
R1 - samp.dll + 0x710CA
*(uint8_t*)addr = 0x1
 

Вложения

  • LightScreen.asi
    8.5 KB · Просмотры: 170
Последнее редактирование:

ALF

Известный
Проверенный
320
537
 

nohopestage

Известный
120
62
На размер похуй, сделайте скрины без фризов. Да, они есть, но ни одного без багов не нашел еще.
 

kizn

О КУ)))
Всефорумный модератор
2,405
2,057
На размер похуй, сделайте скрины без фризов. Да, они есть, но ни одного без багов не нашел еще.
Screenshot.asi от @MISTER_GONWIK, не видел там багов, только когда стоял кривой аси лоадер - игра делала скрин, а не этот плагин
 
  • Нравится
Реакции: Hristot и nohopestage

kin4stat

mq-team
Автор темы
Всефорумный модератор
2,730
4,710
C++:
#include <Windows.h>
#include <psapi.h>
#include <cstdint>

std::uintptr_t findAddress(HMODULE hModule, const char* mem_tofind, size_t strSize) {
    MODULEINFO moduleInfo;
    std::uintptr_t dmMdl = reinterpret_cast<std::uintptr_t>(hModule);
    GetModuleInformation(GetCurrentProcess(), hModule, &moduleInfo, sizeof(moduleInfo));
    for (auto i = dmMdl; i < moduleInfo.SizeOfImage + dmMdl - 1 - strSize; i+= strSize) {
        if (memcmp(reinterpret_cast<void*>(i), mem_tofind, strSize) == 0) {
            return i;
        }
    }
    return 0;
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID) {
    if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
        auto dwSAMP = reinterpret_cast<std::uintptr_t>(GetModuleHandleA("samp.dll"));
        if (dwSAMP) {
            auto ntheader = reinterpret_cast<IMAGE_NT_HEADERS*>(dwSAMP + reinterpret_cast<IMAGE_DOS_HEADER*>(dwSAMP)->e_lfanew);
            auto ep = ntheader->OptionalHeader.AddressOfEntryPoint;
            switch (ep) {
            case 0x31DF13: {
                *reinterpret_cast<std::uint8_t>(dwSAMP + 0x710CA) = 1;
                break;
            }
            case 0xCC4D0: {
                *reinterpret_cast<std::uint8_t>(dwSAMP + 0x74FBA) = 1;
                break;
            }
            default:
            {
                auto pattern = "\x8B\x54\x24\x10\x8D\x4C\x24\x1C\x51\x53\x52\x6A\x03\x50"
                auto ptr = findAddress(reinterpret_cast<HMODULE>(dwSAMP), pattern, sizeof(pattern) - 1);
                if (ptr) {
                    *reinterpret_cast<std::uint8_t>(ptr + sizeof(pattern) - 2) = 1;
                }
            }
            }
        }
    }
}