Перехват и эмуляция пакетов CEF (ID 220) на Arizona RP
Новые интерфейсы Arizona RP (телефон, мониторинг такси, донат, инвентарь, кастомные диалоги) работают поверх Chromium Embedded Framework (CEF) и общаются с сервером по пакету RakNet с ID 220.
addEventHandler('onReceivePacket', function(id, bitStream)
if id == 220 then
local saved = raknetBitStreamGetReadOffset(bitStream)
raknetBitStreamIgnoreBits(bitStream, 8) -- пропускаем ID пакета 220
local pType = raknetBitStreamReadInt8(bitStream)
-- Типы пакетов Arizona CEF: 17, 18, 0, 123
if pType == 17 or pType == 18 or pType == 0 or pType == 123 then
if pType == 17 then raknetBitStreamIgnoreBits(bitStream, 32) end
local len = raknetBitStreamReadInt16(bitStream)
if len and len < 0 then len = len + 65536 end
if len and len > 0 and len < 500000 then
local extra = raknetBitStreamReadInt8(bitStream)
local ok, text = pcall(raknetBitStreamReadString, bitStream, len)
if ok and text and #text > 0 then
-- Тут находится JavaScript-событие: window.executeEvent(...)
if text:find('arizonaDriver.initializeOrders') then
-- Обработка заказов такси
end
end
end
end
raknetBitStreamSetReadOffset(bitStream, saved)
end
return true
end)
local function emulationCEF(str)
local bs = raknetNewBitStream()
raknetBitStreamWriteInt8(bs, 220) -- ID пакета CEF
raknetBitStreamWriteInt8(bs, 18) -- Тип исходящего события
raknetBitStreamWriteInt16(bs, #str) -- Длина строки
raknetBitStreamWriteString(bs, str) -- Данные (например: "pickOrderWorker|4")
raknetSendBitStream(bs)
raknetDeleteBitStream(bs) -- ОБЯЗАТЕЛЬНО удалять для предотвращения утечки памяти!
end