#include "pch.h"
#include "OptimizedNametags.h"

#pragma intrinsic(_ReturnAddress)

bool OptimizedNametags::shouldRedrawNametag(NameTag& nt, D3DCOLOR color, bool isAfk, const char* name) {
	bool ret = (!nt.sprite || !nt.texture || !nt.surface || !nt.renderToSurface) || nt.redraw || nt.isAfk != isAfk || nt.color != color || strcmp(nt.name, name) != 0;
	if (nt.redraw) nt.redraw = false;
	return ret;
}

bool OptimizedNametags::createElements(NameTag& nt, SIZE& textureSize)
{
	static D3DSURFACE_DESC desc;

	if (!nt.sprite || !nt.texture || !nt.surface || !nt.renderToSurface)
	{
		DX_SAFE_RELEASE(nt.sprite);
		DX_SAFE_RELEASE(nt.texture);
		DX_SAFE_RELEASE(nt.renderToSurface);
		DX_SAFE_RELEASE(nt.surface);

		/* Reserved due to some unknown reasons: nicknames sometimes gets cropped and can't be fully rendered.
		 * I have no idea why it's happening */
		textureSize.cx += 1 /*outline*/ + 48 /*reserved*/ + 1;
		textureSize.cy += 1 /*outline*/ + 4 /*AFK padding*/ + 48 /*AFK icon*/;
		if ((textureSize.cx % 2) != 0) textureSize.cx++;
		if ((textureSize.cy % 2) != 0) textureSize.cy++;

		if (FAILED(D3DXCreateSprite(mD3DDevice, &nt.sprite))) return false;
		if (FAILED(D3DXCreateTexture(mD3DDevice, textureSize.cx, textureSize.cy, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &nt.texture)))
			return false;
		if (FAILED(nt.texture->GetSurfaceLevel(0, &nt.surface))) return false;
		if (FAILED(nt.surface->GetDesc(&desc))) return false;
		if (FAILED(D3DXCreateRenderToSurface(mD3DDevice, desc.Width,
			desc.Height, desc.Format, TRUE, D3DFMT_D16, &nt.renderToSurface))) return false;
	}
	return true;
}

void __fastcall CPlayerTags__Draw(uintptr_t self, int id, CVector* playerPos, const char* szText,
	D3DCOLOR color, float fDistanceToCamera, bool bDrawStatus, int nStatus)
{
	auto& nt = gInstance.mNametags[id];

	auto& pDevice = gInstance.mD3DDevice;
	auto isAfk = bDrawStatus && nStatus == 2;

	if (gInstance.shouldRedrawNametag(nt, color, isAfk, szText))
	{
		auto textSize = sampGetMeasuredTextSize(szText);
		SIZE textureSize = textSize;
		if (!gInstance.createElements(nt, textureSize)) return;
		RECT rect{ 1, 1, textureSize.cx, textureSize.cy };

		if (SUCCEEDED(nt.renderToSurface->BeginScene(nt.surface, NULL)))
		{
			pDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0, 0, 0);
			if (SUCCEEDED(nt.sprite->Begin(D3DXSPRITE_ALPHABLEND)))
			{
				pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_BLENDFACTOR);
				nt.center = 1.f + static_cast<float>(textSize.cx) / 2.f;
				sampDrawText(nt.sprite, szText, rect, color, true);

				if (isAfk)
				{
					auto auxFont = sampGetAuxFont();

					if (auxFont)
					{
						rect.top += textSize.cy + 4;
						rect.left = static_cast<long>(nt.center / 2.6f);
						auxFont->DrawTextA(nt.sprite, "C", 1, &rect, DT_NOCLIP | DT_LEFT, D3DCOLOR_XRGB(0, 0, 0));
						rect.left += 3;
						rect.top -= 1;
						auxFont->DrawTextA(nt.sprite, "E", 1, &rect, DT_NOCLIP | DT_LEFT, -1);
					}
				}
				nt.sprite->End();

				nt.color = color;
				nt.isAfk = isAfk;
				strcpy_s(nt.name, sizeof(nt.name), szText);
			}
			nt.renderToSurface->EndScene(0);
		}
	}

	D3DXVECTOR3 TagPos{ playerPos->x, playerPos->y, playerPos->z + 0.21f + (fDistanceToCamera * 0.05f)};

	D3DVIEWPORT9 Viewport;
	pDevice->GetViewport(&Viewport);

	D3DXVECTOR3 Out;
	D3DXMATRIX matIdent;
	D3DXMatrixIdentity(&matIdent);

	D3DXVec3Project(&Out, &TagPos, &Viewport, sampGetProjectionMatrix(), sampGetViewMatrix(), &matIdent);
	Out.x -= nt.center;
	Out.x = static_cast<float>(static_cast<long>(Out.x));
	Out.y = static_cast<float>(static_cast<long>(Out.y));

	if (SUCCEEDED(nt.sprite->Begin(D3DXSPRITE_ALPHABLEND)))
	{
		nt.sprite->Draw(nt.texture, NULL, NULL, &Out, 0xFFFFFFFF);
		nt.sprite->End();
	}

	/*reinterpret_cast<void(__thiscall*)(uintptr_t, CVector * playerPos, const char* szText,
		D3DCOLOR color, float fDistanceToCamera, bool bDrawStatus, int nStatus)>(gInstance.mHooks.CPlayerTags__Draw->getHookedFunctionAddress())
		(self, playerPos, szText, color, fDistanceToCamera, bDrawStatus, nStatus);*/
}

__declspec(naked) void CPlayerTags__Draw_Naked()
{
	__asm {
		mov     edx, edi
		jmp     CPlayerTags__Draw
	}
}

double __fastcall CEntity__GetDistanceToCamera(uintptr_t self)
{
	static void *label, *health;
	uintptr_t CEntity = 0;

	std::tie(label, health) = sampGetPedDistanceGetterReturnAddresses();
	auto retAddress = _ReturnAddress();
	if (retAddress != label && retAddress != health)
		goto ret;
	
	CEntity = *reinterpret_cast<uintptr_t*>(self + 0x40);

	if (!reinterpret_cast<bool(__thiscall*)(uintptr_t)>(0x534540)(CEntity))
		return DBL_MAX;

ret:
	return reinterpret_cast<decltype(CEntity__GetDistanceToCamera)*>(gInstance.mHooks.CEntity__GetDistanceToCamera->getTrampoline())
		(self);
}

void __fastcall CPlayerTags__OnLostDevice(void* self)
{
	for (auto& nt : gInstance.mNametags)
	{
		DX_SAFE_RELEASE(nt.sprite);
		DX_SAFE_RELEASE(nt.texture);
		DX_SAFE_RELEASE(nt.renderToSurface);
		DX_SAFE_RELEASE(nt.surface);
	}

	reinterpret_cast<decltype(CPlayerTags__OnLostDevice)*>(gInstance.mHooks.CPlayerTags__OnLostDevice->getTrampoline())
		(self);
}

можешь переписать рендер отсюда на луа?
используя следующие функции :

BlastHack — DEV_WIKI
BlastHack — DEV_WIKI
 Home
 BlastHack
Найти
 
Вы посетилиrender
 lua functions функции render рендерlua:render

Навигационное меню
Начальная страница
MoonLoader 
SAMPFUNCS
SAMP 
Список опкодов
Рисование элементов на экране
Все функции, занимающиеся отображением, рисуют элементы только на один кадр, поэтому для корректного отображения должны быть вызваны каждый кадр.

renderDrawLine
renderDrawLine(float pos1x, float pos1y, float pos2x, float pos2y, float width, uint color)
Описание
Отображает на экране линию от точки pos1x, pos1y до точки pos2x, pos2y

Аргументы
float pos1x, pos1y координаты первой точки
float pos2y, pos2y координаты второй точки
float width ширина линии
uint color цвет линии в формате ARGB

Пример использования
while true do
  renderDrawLine(100, 100, 200, 200, 2.0, 0xFFD00000) -- непрозрачный красный цвет
  wait(0) -- задержка на один кадр
end
renderDrawBox
renderDrawBox(float posX, float posY, float sizeX, float sizeY, uint color)
Описание
Рисует прямоугольник в указанных координатах с определённым размером

Аргументы
float posX, posY координаты
float sizeX, sizeY размер
uint color цвет в ARGB

Пример использования
renderDrawBox(10, 15, 200, 80, 0xAA00CC00)
renderDrawBoxWithBorder
renderDrawBoxWithBorder(float posX, float posY, float sizeX, float sizeY, uint color, float bsize, uint bcolor)
Описание
Рисует прямоугольник с границей

Аргументы
float posX, posY координаты
float sizeX, sizeY размер
uint color цвет в ARGB float bsize толщина границы
uint bcolor цвет границы в ARGB

Пример использования
renderDrawBox(10, 15, 200, 80, 0xAA00CC00, 3, 0x90000000)
renderDrawPolygon
renderDrawPolygon(float posX, float posY, float sizeX, float sizeY, int corners, float rotation, uint color)
Описание
Отображает многоугольник в указанных координатах с заданным вращением и количеством углов

Аргументы
float posX, float posY координаты центра
float sizeX, float sizeY размер
int corners количество вершин
float rotation вращение в градусах
uint color цвет фигуры в формате ARGB

Пример использования
-- пятиугольник по центру экрана
local sx, sy = getScreenResolution()
renderDrawPolygon(sx / 2, sy / 2, 150, 150, 5, 0.0, 0xFF1166AA)
renderCreateFont
DxFont font = renderCreateFont(zstring font, int height, uint flags [, uint charset])
Описание
Загружает установленный в системе шрифт по названию. Можно задать стиль шрифта и требуемую кодировку.

Аргументы
zstring font название
int height высота
uint flags флаги
uint charset кодировка

Возвращаемые значения
DxFont font шрифт

renderReleaseFont
renderReleaseFont(DxFont font)
Описание
Загруженные шрифты выгружаются автоматически сборщиком мусора, так что использование этой функции необязательно, она существует лишь для обеспечения совместимости со старыми версиями.

Аргументы
DxFont font шрифт

Пример использования
renderReleaseFont(my_font)
-- правильнее:
my_font = nil
renderFontDrawText
renderFontDrawText(DxFont font, zstring text, float posX, float posY, uint color [, bool ignoreColorTags=false])
Описание
Отображает текст на экране, используя загруженный шрифт. Поддерживает цветовые теги в формате {RRGGBB} и {AARRGGBB}, и символ переноса строки \n.

Аргументы
DxFont font шрифт
zstring text текст
float posX, posY координаты
uint color цвет в ARGB
bool ignoreColorTags=false если задано true, цветовые теги не станут обрабатываться

Пример использования
local font_flag = require('moonloader').font_flag
local my_font = renderCreateFont('Verdana', 12, font_flag.BOLD + font_flag.SHADOW)
 
function main()
  while true do
    renderFontDrawText(my_font, 'Colors:\n{FF0000}Red\n{00FF00}Green\n{0000FF}Blue\n{80FFFFFF}Transparent white', 10, 400, 0xFFFFFFFF)
    wait(0)
  end
end
renderGetFontDrawTextLength
float length = renderGetFontDrawTextLength(DxFont font, zstring text [, bool ignoreColorTags=false])
Описание
Вычисляет ширину заданного текста для загруженного шрифта и возвращает результат в пикселях.

Аргументы
DxFont font шрифт
zstring text текст
bool ignoreColorTags=false пропуск цветовых тегов

Возвращаемые значения
float length ширина в пикселях

Пример использования
local friends = {'Kalcor', 'Jacob', 'Sacky'}
local x = 10
for _, v in ipairs(friends) do
  renderFontDrawText(my_font, v, x, 300, 0xFFFFCDCD)
  x = x + 5 + renderGetFontDrawTextLength(my_font, v)
end
renderGetFontDrawHeight
float height = renderGetFontDrawHeight(DxFont font)
Описание
Возвращает высоту загруженного шрифта в пикселях

Аргументы
DxFont font шрифт

Возвращаемые значения
float height высота

renderGetFontCharIndexAt
uint index = renderGetFontCharIndexAt(DxFont font, string text, float x [, bool ignoreColorTags=false])
Описание
Возвращает индекс символа в тексте по позиции в пикселях

Аргументы
DxFont font шрифт
string text текст
float x смещение в пикселях
bool ignoreColorTags=false пропуск цветовых тегов

Возвращаемые значения
uint index индекс символа

renderGetFontCharWidth
float width = renderGetFontCharWidth(DxFont font, string char)
Описание
Получает ширину определённого символа и возвращает результат в пикселях

Аргументы
DxFont font шрифт
string char символ

Возвращаемые значения
float width ширина символа

renderLoadTextureFromFile
DxTexture texture = renderLoadTextureFromFile(zstring file)
Описание
Загружает текстуру из файла

Аргументы
zstring file путь к файлу

Возвращаемые значения
DxTexture texture текстура

renderLoadTextureFromFileInMemory
DxTexture texture = renderLoadTextureFromFileInMemory(uint pointer, uint size)
Описание
Загружает текстуру из файла в памяти процесса

Аргументы
uint pointer адрес памяти
uint size размер файла

Возвращаемые значения
DxTexture texture текстура

renderReleaseTexture
renderReleaseTexture(DxTexture texture)
Описание
Освобождает загруженную текстуру. Применять необязательно, т.к. все загруженные текстуры освобождаются сборщиком мусора. Функция оставлена для обеспечения совместимости со старыми версиями.

Аргументы
DxTexture texture текстура

Пример использования
renderReleaseTexture(texture)
-- правильнее:
texture = nil
renderDrawTexture
renderDrawTexture(DxTexture texture, float posX, float posY, float sizeX, float sizeY, float rotation, uint color)
Описание
Отображает загруженную текстуру по заданным координатам, с указанным размером и вращением

Аргументы
DxTexture texture текстура
float posX, posY координаты
float sizeX, sizeY размер
float rotation вращение
uint color цвет в ARGB

renderGetTextureStruct
uint struct = renderGetTextureStruct(DxTexture texture)
Описание
Возвращает указатель на объект IDirect3DTexture9, принадлежащий текстуре

Аргументы
DxTexture texture текстура

Возвращаемые значения
uint struct указатель

renderGetTextureSprite
uint sprite = renderGetTextureSprite(DxTexture texture)
Описание
Возвращает указатель на объект ID3DXSprite, принадлежащий текстуре

Аргументы
DxTexture texture текстура

Возвращаемые значения
uint sprite указатель

renderGetTextureSize
uint sizeX, uint sizeY = renderGetTextureSize(DxTexture texture)
Описание
Возвращает размеры изображения

Аргументы
DxTexture texture текстура

Возвращаемые значения
uint sizeX ширина
uint sizeY высота

Рендер пользовательских примитивов
При помощи следующих функций вы можете осуществить отображение фигур любой формы, натягивать на них текстуру и задавать цвет отдельно каждому углу. Минимальный набор последовательных вызовов для правильной работы:

renderBegin(prim_type)
renderColor(color)
renderVertex(x, y)
renderEnd()
renderBegin
renderBegin(int type)
Описание
Начало рисования фигуры определённым методом.
Возможные значения type:

Название	Значение	Описание
POINTLIST	1	список точек
LINELIST	2	набор линий
LINESTRIP	3	ломаная линия
TRIANGLELIST	4	набор треугольников
TRIANGLESTRIP	5	серия связанных треугольников (многоугольник)
TRIANGLEFAN	6	серия связанных треугольников с единым центром
Подробнее о каждом методе построения примитивов: MSDN

Аргументы
int type метод

renderEnd
renderEnd()
Описание
Завершение рисования фигуры

renderColor
renderColor(uint color)
Описание
Задаёт цвет. Должна быть вызвана перед добавлением вершины

Аргументы
uint color цвет в ARGB

Пример использования
renderColor(0xFFFF0000)
renderVertex(10, 100)
renderColor(0xFF0000FF)
renderVertex(200, 100)
renderVertex
renderVertex(float vX, float vY)
Описание
Добавляет вершину в фигуру по абсолютным координатам

Аргументы
float vX, float vY координаты

renderSetTexCoord
renderSetTexCoord(float posX, float posY)
Описание
Указывает, какая точка текстуры будет прикреплена к следующей вершине. Координаты точки задаются в диапазоне от '0.0' до '1.0', относительно размеров всей текстуры. Должна быть вызвана перед каждым добавлением вершины, к которой нужно прикрепить текстуру. Без вызова renderBindTexture не будет иметь эффекта

Аргументы
float posX, posY относительные координаты текстуры

Пример использования
renderColor(0xFFFFFFFF)
renderBindTexture(tex)
renderSetTexCoord(0.0, 0.0)
renderVertex(100, 100)
renderBindTexture
renderBindTexture(DxTexture texture)
Описание
Задаёт фигуре текстуру. Каждой фигуре может быть задана только одна текстура. Значение nil сбросит заданную текстуру. Эта функция должна быть использована совместно с renderSetTexCoord

Аргументы
DxTexture texture текстура

renderSetRenderState
renderSetRenderState(int state, uint value)
Описание
Устанавливает значение рендерстейта.
Подробнее о рендерстейтах: MSDN

Аргументы
int state тип
uint value новое значение

BlastHack — DEV_WIKI	
BlastHack — DEV_WIKI

cc by nc

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии:
CC Attribution-Noncommercial 4.0 International

Bootstrap template for DokuWiki Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki