-
Автор темы
- #1
Здрасьте!
Это вторая часть по созданию топ хака для CS:GO. В этой части мы сделаем такую фичу как ESP Line.
Думаю, что вы это видели в старых читах). Но для начала нам надо подготовиться. А именно решить следующий вопрос: Как бл*ть получить координаты игрока в 2D? Ведь позиция игрока на экране задается тремя координатами (x, y, z), а нам из этого надо получить (x, y).
Но не ссыте мои хорошие, для этого добрые разработчики 3D игр создали такую шнягу как видовая матрица (для гениев или любознательных вот ссылка на хабр:
Но, матрица, конечно, хорошо, однако что с ней делать спросите вы. А для этого еще более добрые дядечки создали специальный метод который имеет название World2Screen, который переводит с помощью видовой матрицы координаты из 3D мира в 2D.
Сам метод перевода я залил на пастбин, чтобы вы не ныли (
А теперь, после получения всего инструментария мы начинаем кодить.
А вот и все. Если возникли вопросы, то посмотрите еще видос.
А на этом все. Ставь +rep если понравился урок)
Это вторая часть по созданию топ хака для CS:GO. В этой части мы сделаем такую фичу как ESP Line.
Думаю, что вы это видели в старых читах). Но для начала нам надо подготовиться. А именно решить следующий вопрос: Как бл*ть получить координаты игрока в 2D? Ведь позиция игрока на экране задается тремя координатами (x, y, z), а нам из этого надо получить (x, y).
Но не ссыте мои хорошие, для этого добрые разработчики 3D игр создали такую шнягу как видовая матрица (для гениев или любознательных вот ссылка на хабр:
Пожалуйста, авторизуйтесь для просмотра ссылки.
). Но, матрица, конечно, хорошо, однако что с ней делать спросите вы. А для этого еще более добрые дядечки создали специальный метод который имеет название World2Screen, который переводит с помощью видовой матрицы координаты из 3D мира в 2D.
Сам метод перевода я залил на пастбин, чтобы вы не ныли (
Пожалуйста, авторизуйтесь для просмотра ссылки.
). Там еще есть структура ScreenVector для этого метода (матрица и оверлей у нас тип уже в коде).А теперь, после получения всего инструментария мы начинаем кодить.
Для начала объявим глобальные переменные
Код:
private static OverlayWindow window;//Оверлей
private static Matrix4x4 VMatrix = Matrix4x4.Identity;//Наша видовая матрица
private static int bClient;//сюда мы залулим адрес либы client.dll
private static int espFont = -1;//сюда шрифт для еспшки
private static int redBrush = -1;//красная кисть
private static int yellowBrush = -1;//желтая кисть
private static Memory mem;//класс для чтения и записи
Теперь напишем функцию для инициализации наших переменных
Код:
static bool GetDll()
{
try
{
Process csgo = Process.GetProcessesByName("csgo")[0];
foreach (ProcessModule module in csgo.Modules)
{
if (module.ModuleName == "client.dll")
bClient = (int) module.BaseAddress;
}
window = new OverlayWindow(csgo.MainWindowHandle);
redBrush = window.Graphics.CreateBrush(Color.Red);
yellowBrush = window.Graphics.CreateBrush(Color.Yellow);
espFont = window.Graphics.CreateFont("Tamoha", 12);
mem = new Memory("csgo");
return true;
}
catch
{
return false;
}
}
Отлично, теперь бежим в наш обработчик рисования (1 часть) и получаем информацию о нашем локальном игроке
Код:
int playerBase = mem.Read<int>(bClient + Offsets.m_localplayer);
nt localTeam = mem.Read<int>(playerBase + Offsets.m_iTeamNum);
int localHp = mem.Read<int>(playerBase + Offsets.m_iHealth);
bool localDormant = mem.Read<bool>(playerBase + Offsets.m_bDormant);
if(localDormant || localHp == 0)
continue;
VMatrix = mem.Read<Matrix4x4>(bClient + Offsets.m_dwViewMatrix);//получаем видовую матрицу
Если все прошло пучком, то в цикле получения информации об окружении (кто курит тот поймет) получаем информацию о каждом игроке по отдельности (это просто цикл от 0 до 64)
Код:
int entityBase = mem.Read<int>(bClient + Offsets.m_dwEntityList + (i - 1)*0x10);
int entityHp = mem.Read<int>(entityBase + Offsets.m_iHealth);
int entityTeam = mem.Read<int>(entityBase + Offsets.m_iTeamNum);
bool entityDormant = mem.Read<bool>(entityBase + Offsets.m_bDormant);
if(entityDormant || entityTeam == localTeam || entityHp == 0)
continue;
Vector3 entityPos = mem.Read<Vector3>(entityBase + Offsets.m_vecOrigin);
После получения информации мы переводим позицию игрока в 2D и рисуем по этим координатам линию (начало - внизу и посередине экрана, конец - позиция игрока в 2D)
+ рисуем здоровье игрока (позиция игрока в 2D) и радуемся топ читу)
+ рисуем здоровье игрока (позиция игрока в 2D) и радуемся топ читу)
Код:
ScreenVector sv = WorldToScreen(entityPos.X, entityPos.Y, entityPos.Z);
if (!sv.Result)
continue;
int ex = (int) sv.X;
int ey = (int) sv.Y;
int sx = window.Width/2;
int sy = window.Height;
window.Graphics.DrawLine(sx, sy, ex, ey, 2, redBrush);
window.Graphics.DrawText(entityHp.ToString(), espFont, yellowBrush, ex, ey);
А вот и все. Если возникли вопросы, то посмотрите еще видос.
А на этом все. Ставь +rep если понравился урок)