- 94
- 35
chat_emoji
смайлы и иконки чата Arizona RP в mimgui
смайлы и иконки чата Arizona RP в mimgui
Библиотека, чтобы рисовать в своих mimgui-окнах те же смайлы и иконки, что показывает чат Arizona RP. Всё вытащено из
_chat.asi.Всего 1584 картинки. Из них 1354 идут ровно в том же порядке, что и в панели смайлов чата, плюс 230 скрытых: они в панель не попали, но в игре рисуются. Это ленты и плашки под ники, короны VIP, крылья уровней, значки лавок и недвижимости, телефоны, деньги, оружие, плашки «ВИП ЧАТ», «АДМИН», «РЕКЛАМА».
Почему нельзя просто подключить шрифт
Первое, что приходит в голову: скормить
seguiemj.ttf в AddFontFromFileTTF. Не сработает, причём по двум независимым причинам.mimgui собран со
stb_truetype, а он рисует только контуры и ничего не знает про цветные глифы COLR/CPAL. Так устроены и Segoe UI Emoji, и шрифт иконок Arizona: базовый контур у них часто пустой, вся картинка лежит в цветных слоях. Получишь пустые прямоугольники.Вторая причина добивает:
ImWchar в mimgui шестнадцатибитный, а смайлы живут выше U+FFFF. Такие коды в него физически не влезают.Поэтому всё заранее растеризовано в один PNG-атлас. В игре он грузится текстурой D3D9 (пул MANAGED, device reset переживает) и рисуется через
imgui.Image.Установка
Код:
moonloader/lib/chat_emoji.lua
moonloader/resource/chat_emoji/chat_emoji.png
moonloader/resource/chat_emoji/chat_emoji_atlas.lua
Папок
lib и resource/chat_emoji может не быть, создай сам. Пути жёстко зашиты, модуль ищет файлы именно там.Быстрый старт
Lua:
local imgui = require 'mimgui'
local emoji = require 'chat_emoji'
imgui.OnInitialize(function()
local ok, err = emoji.load()
if not ok then print(err) end
end)
-- дальше в отрисовке окна:
emoji.image('smiley', 24) -- просто картинка
if emoji.button('arz', 32) then end -- кнопка
emoji.text('hello :u1f603: bye :u1f44b:') -- текст с подстановкой
local picked = emoji.picker('grid', 24, 300)
if picked then sampSendChat(emoji.encode(picked)) end
Не забудь
emoji.unload() в onScriptTerminate, иначе текстура утечёт.API
| функция | что делает |
|---|---|
emoji.load([dir]) | загрузить атлас, вернёт true либо false, ошибка |
emoji.unload() | освободить текстуру |
emoji.get(key) | запись по имени, коду, токену или самой записи |
emoji.encode(key) | токен :uXXXX: для отправки в чат |
emoji.parse(str) | разбор строки на куски текста и смайлы |
emoji.image(key, size) | нарисовать картинкой |
emoji.width(key, size) | какую ширину займёт при высоте size |
emoji.button(key, size, [id]) | кнопка, true при нажатии |
emoji.text(str, [size]) | текст с подстановкой токенов |
emoji.picker(id, [size], [height]) | панель выбора, вернёт запись либо nil |
Поля:
emoji.list (все записи по порядку), emoji.byName, emoji.byCp, emoji.categories, emoji.strings (подписи панели, можно переопределить).Искать можно по имени, коду и синонимам.
emoji.get(':)') найдёт улыбку, emoji.get('<3') найдёт сердце. В панели поиск тоже понимает синонимы.Размер
Задаётся при каждой отрисовке, ничем не зафиксирован. Аргумент это высота в пикселях, ширина считается сама.
Lua:
emoji.image('arz', 16)
emoji.image('arz', mySlider[0]) -- хоть каждый кадр разный
Ячейка атласа 40 px, поэтому до 40 картинка идеальна, до 64 разницы почти не видно, дальше начинает мылить. Нужен крупнее, пересобери с
--cell 64.Широкие иконки. Плашки вроде «ВИП ЧАТ» или BUY бывают в несколько раз шире своей высоты. В атласе такие занимают несколько ячеек подряд, число лежит в
e.cells, и все функции рисуют с этим соотношением. Отдельно думать об этом не надо, но если считаешь раскладку руками, бери ширину через emoji.width(), а не size.Масштаб у всех иконок общий, так что при одном
size мелкий значок останется мелким, а крупный крупным, как в самом чате.Как вставить смайл в чат
Чат кодирует смайлы токеном
:uXXXX:, где XXXX это шестнадцатеричный код.
Lua:
sampSendChat('привет ' .. emoji.encode('smiley')) -- уйдёт как ':u1f603:'
Токен из цифр и латиницы, перекодировать его в cp1251 не нужно.
Сборка под себя
В архиве лежит
rebuild.bat. Двойной клик, и он сам найдёт Python, поставит Pillow, найдёт _chat.asi рядом с игрой, распакует из него шрифты и списки, найдёт твой seguiemj.ttf и соберёт атлас.
Код:
rebuild.bat --asi "C:\...\bin\arizona\_chat.asi"
rebuild.bat --emoji "C:\Windows\Fonts\seguiemj.ttf"
Python нужен только для сборки. В игре он не нужен, там работает готовый PNG.
Что учесть
- MoonLoader запускает каждый скрипт в своей Lua-машине. Подключишь библиотеку в трёх скриптах, будет три копии текстуры, по 16 МБ видеопамяти каждая. Пара скриптов нормально, десяток уже перебор.
- Иконки из второго шрифта (группа «Скрытые: интерфейс (big_icons)») в чат токеном, скорее всего, не вставятся: текст чата рисуется другим шрифтом. В своих окнах они работают нормально.
- Файлы модуля и описания атласа целиком в ASCII, названия категорий записаны escape-последовательностями. Пересохранять их можно в любой кодировке, ничего не сломается.
Исходники
GitHub