SA:MP Lua Arizona DonateSearch

Willy4ka

вилличка
Автор темы
Модератор
634
1,004
Версия SA-MP
  1. Другая
Скрипт добавляет в донат строку поиска
1753630688029.png
 

Вложения

  • DonateSearch.lua
    5 KB · Просмотры: 20
Последнее редактирование:

MrCreepTon

Неизвестный
Всефорумный модератор
2,304
5,254
не скрывает заблокированные лимитки
Скорее всего у каждой карточки примерно такая структура div-ов (от родителя к детям):
  • Flex контейнер
  • Опциоально Overlay с position absolute (хуйня с замочком)
  • Содержимое карточки
По идее чекать у флекс-карточки наличие этого оверлея и если есть то навешивать style display: none на флекс карточку.
Флекс умный и сам остальную работу красиво сделает.

Еще можешь event listener input навесить, тогда не будет нужды в lua_thread-ах скорее всего. Главное на всякий при скрытии оверлея вызывай removeEventListener чтоб память не срать
 
  • Нравится
Реакции: Willy4ka

Willy4ka

вилличка
Автор темы
Модератор
634
1,004
По идее чекать у флекс-карточки наличие этого оверлея и если есть то навешивать style display: none на флекс карточку.
я пробывал, оно не помогает
1753674203068.png

1753674240130.png

(от родителя к детям):
  • Flex контейнер
  • Опциоально Overlay с position absolute (хуйня с замочком)
  • Содержимое карточки
блокировка в самом низу находится
1753674591004.png

прикрепил архив со страницей доната
 

Вложения

  • donate.rar
    3.9 KB · Просмотры: 10

MrCreepTon

Неизвестный
Всефорумный модератор
2,304
5,254
я пробывал, оно не помогает
Посмотреть вложение 275178
Посмотреть вложение 275179

блокировка в самом низу находится
Посмотреть вложение 275181
прикрепил архив со страницей доната
Потыкал дебаггером, обнаружил, что этот первый элемент в дом дереве просто обновляется раз в секунду. И потому стиль слетает.
Сперва подумал, что дело в каком-то таймере или интервале. Но ничего не обнаружилось.
Потом я заметил, что в браузер в цикле поступает некая инструкция извне:
JavaScript:
window.executeEvent('event.donateShop.updateProduct', `[{"key": 473,"category": 7,"blockedType": 1,"blockedReason": "Продажа завершена! Все было распродано!"}]`);
Начал пытаться хукать это входящее событие по аналогии как это предлагает arizona-events:
Lua:
function onReceivePacket(id, bs, priority, reliability, orderingChannel)
    if id == 220 then
        raknetBitStreamIgnoreBits(bs, 8)
        local unk = raknetBitStreamReadInt8(bs)
        if unk == 17 then
            raknetBitStreamIgnoreBits(bs, 32)
            local length = raknetBitStreamReadInt16()
            local encoded = raknetBitStreamReadInt8()
            local str = ''
            if encoded then
                str = raknetBitStreamDecodeString(bs, length)
            else
                str = raknetBitStreamReadString(bs, length)
            end
            print(str)
        end
    end
end
Но мне отдавало length 0 и encoded 0. На этом я понял, что пока я без аксов +12 и скина тун тун сахуна я дальше не разберусь, потому оставил попытки. Но может эти мысли к чему-то да приведут :) Энивей спасибо за головоломку.

Бонусом чуть отрефакторил JS код, вряд ли юзер экспиреанс сильно изменится, но читать теперь чуточку комфортнее)

Lua:
function onSendPacket(id, bs, priority, reliability, orderingChannel)
    if id == 220 then
        raknetBitStreamIgnoreBits(bs, 8)
        if raknetBitStreamReadInt8(bs) == 18 then
            local strlen = raknetBitStreamReadInt16(bs)
            local str = raknetBitStreamReadString(bs, strlen)
            if str:find("donateShop.selectCategory|%d+") then
                addSearch()
            end
        end
    end
end

function addSearch()
    evalanon[[
    const selectorsToQuery = ['.donate-shop-grid__item', '.donate-shop-carousel__item'];
    let rawItems = [];
    let items = [];

    const collectRawItems = () => {
        selectorsToQuery.forEach((selector, _) => {
            const elements = Array.from(document.querySelectorAll(selector));
            rawItems = rawItems.concat(elements);
        });
    }

    const validateItem = (item) => {
        const names = item.querySelectorAll('.donate-shop-product__name');
        let itemName = '';
        names.forEach((el, _) => {
            itemName = itemName.concat(el.textContent, ' ');
        });
        items.push(
            {
                name: itemName,
                element: item
            }
        );
    }

    const validateItems = () => {
        rawItems.forEach((rawItem, _) => {
            validateItem(rawItem);
        });
    }

    const createSearchInput = (className) => {
        const input = document.createElement('input');
        const s = input.style;
        s.border = 'none';
        s.borderRadius = '5px';
        s.background = '#00000090';
        s.color = '#fff';
        s.height = '5vh';
        s.width = '100%';
        s.padding = '10px 20px';
        s.boxSizing = 'border-box';
        s.fontSize = '18px';
        s.marginBottom = '1vh';
        input.className = className;
        return input;
    }

    const recalculatePaddingsOfDonateContent = (content) => {
        const shopContent = document.querySelector(".donate-shop__content").computedStyleMap().get("margin-top").toString();
        const shopCoins = document.querySelector(".donate-shop__coins").computedStyleMap().get('top').toString();
        const c = `calc(${shopCoins} - 3vh)`;
        const n = `calc(${shopContent} - 7vh)`;
        document.querySelector(".donate-shop__content").style.marginTop = n;
        document.querySelector(".donate-shop__coins").style.top = c;
    }

    const filterItems = (filter) => {
        for (const item of items) {
            item.element.style.display = 'flex';
            if (filter.length == 0) {
                continue;
            }
            if (item.name.toLowerCase().includes(filter.toLowerCase())) {
                continue;
            }
            item.element.style.display = 'none';
        }
    }

    const onSearchUpdate = (e) => {
        const filter = e.target.value;
        filterItems(filter);
    }

    const insertOrUpdateSearch = (root, className) => {
        const oldInput = root.querySelector(`.${className}`);
        if (oldInput) {
            oldInput.removeEventListener('input', onSearchUpdate);
            oldInput.remove();
        } else {
            recalculatePaddingsOfDonateContent(root);
        }
        const input = createSearchInput(className);
        input.addEventListener('input', onSearchUpdate);
        root.insertAdjacentElement('afterbegin', input);
    }

    const onLoad = () => {
        collectRawItems();
        validateItems();

        const donateContent = document.querySelector('.donate-shop__content');
        if (!donateContent) {
            return;
        }
        insertOrUpdateSearch(donateContent, 'donate-shop__search-input');
    }

    onLoad();
]]
end

function evalanon(code)
    evalcef(("(() => {%s})()"):format(code))
end

function evalcef(code, encoded)
    encoded = encoded or 0
    local bs = raknetNewBitStream();
    raknetBitStreamWriteInt8(bs, 17);
    raknetBitStreamWriteInt32(bs, 0);
    raknetBitStreamWriteInt16(bs, #code);
    raknetBitStreamWriteInt8(bs, encoded);
    raknetBitStreamWriteString(bs, code);
    raknetEmulPacketReceiveBitStream(220, bs);
    raknetDeleteBitStream(bs);
end
 
  • Нравится
Реакции: Willy4ka

Willy4ka

вилличка
Автор темы
Модератор
634
1,004
Начал пытаться хукать это входящее событие по аналогии как это предлагает arizona-events:
вот если что мой скрипт для чтения цеф ивентов

Lua:
function onReceivePacket(id, bs)
    if id == 220 then
        raknetBitStreamReadInt8(bs);
        if raknetBitStreamReadInt8(bs) == 17 then
            raknetBitStreamReadInt32(bs)
            local length = raknetBitStreamReadInt16(bs)
            local encoded = raknetBitStreamReadInt8(bs)
            if length > 0 then
                local text = (encoded ~= 0) and raknetBitStreamDecodeString(bs, length + encoded) or raknetBitStreamReadString(bs, length)
                local event, data = text:match('window%.executeEvent%(\'(.+)\',%s*`%[(.+)%]`%);');
                print("Receive", text)
            end
        end
    end
end

function onSendPacket(id, bs, priority, reliability, orderingChannel)
    if id == 220 then
        raknetBitStreamReadInt8(bs)
        if raknetBitStreamReadInt8(bs) == 18 then
            local strlen = raknetBitStreamReadInt16(bs)
            local str = raknetBitStreamReadString(bs, strlen)
            print("Send", str)
        end
    end
end
 

Похожие темы