Заказ Получение информации о текстдраве

moreveal

Известный
Автор темы
Проверенный
774
427
Хотел бы как-то получать изображение всех текстдравов в определенной области экрана, чтобы не было перекрывающих его диалоговых окон и т.п. (мне нужны только прямоугольники, поэтому предпочтительнее на выходе получать строку с их координатами и размерами для полотна текстдравов в 640х448)

Не могу самостоятельно рисовать текстдрав по пришедшим пакетам, поскольку хуй поймёшь когда там оффсеты, а когда абсолютные корды, и какого именно угла (левого или правого), как точно рассчитывать ширину по letterY (в документации сказано что если делить на 0.135 можно получить ширину, соответствующую реальному размеру, но в действительности ширина сильно меньше настоящей: в конечном итоге пришел к числу 0.109, но и тогда размер несколько отличается)

Короче, способ достижения не важен, можете просто рассказать как получить адекватную инфу о прямоугольнике по пришедшему RPC - такой вариант тоже устроит

Связь: t.me/moreveal
 

moreveal

Известный
Автор темы
Проверенный
774
427
все текстдравы рисуются от левого верхнего угла прямоугольника с разрешением 640х480, а потом уже адаптируются под разрешение экрана

я ведь изучал все это: далеко не все, зависит от установленного alignment; к тому же на сайте даже с разрешением точно определиться не могут:
1678273028025.png

1678273056480.png

пришел к тому, что размер является смещением от начальных координат в том случае, если шрифт текстдрава >= 4 или у него выравнивание по левому краю; в доках пишут, что при центральном выравнивании координаты размера вообще меняются местами, накатал такой код:
C++:
// textdraw - структура, импортируемая с коллбека samp events из луашника

if (flags.alignCenter)
    std::swap(textdraw.lineWidth, textdraw.lineHeight);

const bool isOffsets = textdraw.style >= 4 || flags.alignLeft;
if (!isOffsets) {
    // Приведение абсолютных координат длины к смещению
    textdraw.lineWidth -= textdraw.position.x;
}
if (flags.box && textdraw.lineHeight < 2) { // Тут странное условие, поскольку не знаю когда именно ширина высчитывается по letterHeight
    textdraw.lineHeight = textdraw.letterHeight / 0.109f; // Взятое из ниоткуда число, методом тыка
}
else if (!isOffsets) { // Если ширина и так нормальная, и координаты не являются смещением
    // Приведение абсолютных координат ширины к смещению
    textdraw.lineHeight -= textdraw.position.y;
}

// Обработка отрицательных смещений, чтобы стартовая позиция съезжала влево, а оффсет становился положительным
if (textdraw.lineWidth < 0) {
    textdraw.lineWidth *= -1;
    textdraw.position.x -= textdraw.lineWidth;
}
if (textdraw.lineHeight < 0) {
    textdraw.lineHeight *= -1;
    textdraw.position.y -= textdraw.lineHeight;
}

// Потом просто округляю эти значения и возвращаю результат

по идее код работает корректно, но не на всех серверах, поэтому и создал тему
Lua:
-- Первый сервер, на котором алгоритм прорабатывает нормально
-- style, flags [ box, left align, center align, right align, proportional ], position, line width/height
style: 4 | flags: 10010 | [236.02862548828;120.62797546387][159.44137573242x56.997974395752]
style: 4 | flags: 10010 | [239.02862548828;123.62797546387][153.44137573242x50.997974395752]
style: 0 | flags: 10011 | [268.57061767578;129.23629760742][240.52862548828x0]
style: 4 | flags: 10010 | [262.57061767578;133.23629760742][-16.0419921875x12.154537200928]
style: 4 | flags: 10010 | [262.57061767578;152.23629760742][-16.0419921875x9.3090744018555]
style: 0 | flags: 10011 | [298.95889282227;129.23629760742][271.41690063477x0]
style: 4 | flags: 10010 | [298.95889282227;134.23629760742][-19.5419921875x11.154537200928]
style: 4 | flags: 10010 | [290.95889282227;152.23629760742][-19.5419921875x9.3090744018555]
style: 0 | flags: 10011 | [329.34716796875;129.23629760742][302.30517578125x0]
style: 4 | flags: 10010 | [330.84588623047;134.23629760742][-21.290086746216x11.154537200928]
style: 4 | flags: 10010 | [326.84588623047;152.71081542969][-19.538181304932x10.258111953735]
style: 0 | flags: 10011 | [359.73544311523;129.23629760742][333.19345092773x0]
style: 4 | flags: 10010 | [352.33703613281;134.63470458984][-19.143581390381x39.165828704834]
style: 0 | flags: 10011 | [390.12371826172;129.23629760742][364.08172607422x0]
style: 4 | flags: 10010 | [385.58938598633;135.50175476074][-16.973306655884x25.778163909912]

-- Результат работы алгоритма (эти значения полностью корректны и при воспроизведении через тот же фотошоп, можно увидеть что все ок)
[236;121][159x57]
[239;124][153x51]
[241;129][28x40]
[247;133][16x12]
[247;152][16x9]
[271;129][28x39]
[279;134][20x11]
[271;152][20x9]
[302;129][27x39]
[310;134][21x11]
[307;153][20x10]
[333;129][27x39]
[333;135][19x39]
[364;129][26x41]
[369;136][17x26]

-- Второй сервер: алгоритм, по всей видимости, также прорабатывает нормально, т.к. при внешнем сравнении входных и выходных данных все ок
style: 1 | flags: 10011 | [220;120][380x0]
style: 1 | flags: 10011 | [225;125][375x0]
style: 1 | flags: 11001 | [240;130][30x25]
style: 1 | flags: 10001 | [250;155][225x0]
style: 1 | flags: 10001 | [250;130][230x0]
style: 1 | flags: 11001 | [270;130][30x25]
style: 1 | flags: 10001 | [265;137][275x0]
style: 1 | flags: 11001 | [300;130][30x25]
style: 1 | flags: 10001 | [295;137][305x0]
style: 1 | flags: 11001 | [330;130][30x25]
style: 1 | flags: 10001 | [340;155][320x0]
style: 1 | flags: 10001 | [340;137][320x0]
style: 1 | flags: 11001 | [360;130][30x25]
style: 1 | flags: 10001 | [355;137][365x0]

-- Результат (при проверке через фотошоп, видно, что некоторые элементы съезжают, имеют другой размер, да и в принципе мало что имеют общего с тем, что на экране)
[220;120][160x60]
[225;125][150x50]
[240;130][30x25]
[225;155][25x17]
[230;130][20x17]
[270;130][30x25]
[265;137][10x28]
[300;130][30x25]
[295;137][10x28]
[330;130][30x25]
[320;155][20x7]
[320;137][20x7]
[360;130][30x25]
[355;137][10x28]
 
  • Нравится
Реакции: copypaste_scripter