Исходник chat_emoji: смайлы и иконки чата Arizona RP в mimgui (1584 штуки)

e11evated

Участник
Автор темы
94
35
chat_emoji
смайлы и иконки чата Arizona RP в mimgui




Библиотека, чтобы рисовать в своих mimgui-окнах те же смайлы и иконки, что показывает чат Arizona RP. Всё вытащено из _chat.asi.

Всего 1584 картинки. Из них 1354 идут ровно в том же порядке, что и в панели смайлов чата, плюс 230 скрытых: они в панель не попали, но в игре рисуются. Это ленты и плашки под ники, короны VIP, крылья уровней, значки лавок и недвижимости, телефоны, деньги, оружие, плашки «ВИП ЧАТ», «АДМИН», «РЕКЛАМА».

image.png




Почему нельзя просто подключить шрифт

Первое, что приходит в голову: скормить 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
 
  • Нравится
Реакции: MLycoris

вайега52

cache miss
Модератор
3,060
3,292
MoonLoader запускает каждый скрипт в своей Lua-машине. Подключишь библиотеку в трёх скриптах, будет три копии текстуры, по 16 МБ видеопамяти каждая. Пара скриптов нормально, десяток уже перебор
подход с import в мунлоадере, либо DLL библиотека со шрифтами должны помочь в этом)
 
  • Нравится
Реакции: e11evated