HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #1  
Старый 16.10.2018, 19:56
CleanLegend
Постоянный
Регистрация: 28.03.2013
Сообщений: 495
С нами: 6908018

Репутация: 213
По умолчанию

Введение

В этом уроке покажу как можно рисовать на игроках

Начало работы

Для начала нужно зарегистрировать callback present, в нем мы будем рисовать.

C++:





Код:
bool
CALLBACK Present
(
CONST RECT
*
pSourceRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindowOverride
,
CONST RGNDATA
*
pDirtyRegion
)
{
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
// если рендер готов к рисованию
{
// рисуем
SF
->
getRender
(
)
->
EndRender
(
)
;
// завершаем рисование
}
;
return
true
;
// возвращаем положительный результат
}
;


в mainloop:

C++:





Код:
SF
->
getRender
(
)
->
registerD3DCallback
(
eDirect3DDeviceMethods
::
D3DMETHOD_PRESENT
,
Present
)
;


Создаем функцию для удобства и в ней начинаем с цикла:

C++:





Код:
void
ESP
(
)
{
for
(
int
i
=
0
;
i

getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
[
i
]
!=
1
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
==
NULL
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
==
NULL
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
==
NULL
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
==
NULL
)
continue
;
// Если игрок не существует или не в зоне стрима, то пропускаем
}
}


Можно сделать проверку на зону стрима вызовом одной функции:

C++:





Код:
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
IsPlayerDefined
(
i
,
true
)
)
{
// Игрок в стриме
}


Теперь нужно получить координаты игрока, перевести их в экранные и проверить есть ли игрок на экране:

C++:





Код:
// Получаем координаты игрока
enpos
[
0
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
fOnFootPos
[
0
]
;
// X
enpos
[
1
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
fOnFootPos
[
1
]
;
// Y
enpos
[
2
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
fOnFootPos
[
2
]
;
// Z
// Переводим игровые координаты в экранные
SF
->
getGame
(
)
->
convert3DCoordsToScreen
(
enpos
[
0
]
,
enpos
[
1
]
,
enpos
[
2
]
,
&
screen
[
0
]
,
&
screen
[
1
]
)
;
// Получаем CPed
CPed
*
Ped
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
)
;
// Проверяем есть ли игрок на экране
if
(
Ped
->
IsOnScreen
(
)
)
{
// игрок на экране
}


Перейдем к рисованию, сначала с квадрата.

Для этого нужно вызвать функцию для рисования квадрата и указать экранные координаты:

C++:





Код:
SF
->
getRender
(
)
->
DrawBox
(
screen
[
0
]
,
screen
[
1
]
,
35
,
35
,
0xFF00FF00
)
;


получаем:

Цитата:
Сообщение от Спойлер  

3bP8eMd.pngCleanLegend · 16 Окт 2018 в 18:56' data-fancybox="lb-post-262618" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="/proxy.php?image=https%3A%2F%2Fi.imgur.com%2F3bP8eM d.png&hash=16bde79cd7e1ab838a9907f9e27e71b3" style="cursor: pointer;" title="3bP8eMd.png">


Рисуем линии:

C++:





Код:
SF
->
getRender
(
)
->
DrawLine
(
640
,
900
,
screen
[
0
]
,
screen
[
1
]
,
5
,
0xFF00FF00
)
;


получаем:

Цитата:
Сообщение от Спойлер  

ltcertH.pngCleanLegend · 16 Окт 2018 в 18:56' data-fancybox="lb-post-262618" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="/proxy.php?image=https%3A%2F%2Fi.imgur.com%2Fltcert H.png&hash=6600aa3330d048ac5a48f50b153a60bb" style="cursor: pointer;" title="ltcertH.png">


Рисуем текст:

C++:





Код:
char
buf
[
255
]
;
// Заполняем буфер ником и id
sprintf_s
(
buf
,
"%s[%d]"
,
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetPlayerName
(
i
)
,
i
)
;
// Рисуем текст
pFont
->
Print
(
buf
,
0xFF00FF00
,
screen
[
0
]
,
screen
[
1
]
,
false
)
;


для использования pFont нужно объявить и инициализировать его:

C++:





Код:
stFontInfo
*
pFont
;
//Затем один раз инициализируем шрифт:
pFont
=
SF
->
getRender
(
)
->
CreateNewFont
(
"Tahoma"
,
12
,
FCR_BORDER
)
;


получаем:

Цитата:
Сообщение от Спойлер  




По такому принципу можно рисовать всё что угодно.

весь код функции:

Цитата:
Сообщение от Спойлер  


C++:





Код:
void
ESP
(
)
{
float
enpos
[
3
]
;
// для координат игрока
float
screen
[
2
]
;
// для экранных координат
char
buf
[
255
]
;
// для текста
for
(
int
i
=
0
;
i

getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
[
i
]
!=
1
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
==
NULL
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
==
NULL
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
==
NULL
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
==
NULL
)
continue
;
// Если игрок не существует или не в зоне стрима, то пропускаем
// Можно сделать это одной функцией
/*if (SF->getSAMP()->getPlayers()->IsPlayerDefined(i, true))
        {
         // рисуем
        }*/
// Тут подойдут два варианта, это уже как вам будет удобнее
// Получаем координаты игрока
enpos
[
0
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
fOnFootPos
[
0
]
;
// X
enpos
[
1
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
fOnFootPos
[
1
]
;
// Y
enpos
[
2
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
fOnFootPos
[
2
]
;
// Z
// Переводим игровые координаты в экранные
SF
->
getGame
(
)
->
convert3DCoordsToScreen
(
enpos
[
0
]
,
enpos
[
1
]
,
enpos
[
2
]
,
&
screen
[
0
]
,
&
screen
[
1
]
)
;
// Получаем CPed
CPed
*
Ped
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
)
;
// Проверяем есть ли игрок на экране
if
(
Ped
->
IsOnScreen
(
)
)
{
// начинаем рисовать
// Рисуем квадрат на игроках
//    SF->getRender()->DrawBox(screen[0], screen[1], 35, 35, 0xFF00FF00);
// Рисуем линии
//SF->getRender()->DrawLine(640, 900, screen[0], screen[1], 5,0xFF00FF00);
// Заполняем буфер ником и id
sprintf_s
(
buf
,
"%s[%d]"
,
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetPlayerName
(
i
)
,
i
)
;
// Рисуем текст
pFont
->
Print
(
buf
,
0xFF00FF00
,
screen
[
0
]
,
screen
[
1
]
,
false
)
;
}
}
}


 
Ответить с цитированием

  #2  
Старый 16.10.2018, 22:52
Livarka
Участник форума
Регистрация: 27.08.2017
Сообщений: 143
С нами: 4584912

Репутация: 83
По умолчанию

Цитата:
Сообщение от CleanLegend  

Введение
В этом уроке покажу как можно рисовать на игроках

Начало работы
Для начала нужно зарегистрировать callback present, в нем мы будем рисовать.

C++:





Код:
bool
CALLBACK Present
(
CONST RECT
*
pSourceRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindowOverride
,
CONST RGNDATA
*
pDirtyRegion
)
{
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
// если рендер готов к рисованию
{
// рисуем
SF
->
getRender
(
)
->
EndRender
(
)
;
// завершаем рисование
}
;
return
true
;
// возвращаем положительный результат
}
;


в mainloop:

C++:





Код:
SF
->
getRender
(
)
->
registerD3DCallback
(
eDirect3DDeviceMethods
::
D3DMETHOD_PRESENT
,
Present
)
;


Создаем функцию для удобства и в ней начинаем с цикла:

C++:





Код:
void
ESP
(
)
{
for
(
int
i
=
0
;
i

getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
[
i
]
!=
1
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
==
NULL
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
==
NULL
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
==
NULL
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
==
NULL
)
continue
;
// Если игрок не существует или не в зоне стрима, то пропускаем
}
}


Можно сделать проверку на зону стрима вызовом одной функции:

C++:





Код:
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
IsPlayerDefined
(
i
,
true
)
)
{
// Игрок в стриме
}


Теперь нужно получить координаты игрока, перевести их в экранные и проверить есть ли игрок на экране:

C++:





Код:
// Получаем координаты игрока
enpos
[
0
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
fOnFootPos
[
0
]
;
// X
enpos
[
1
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
fOnFootPos
[
1
]
;
// Y
enpos
[
2
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
fOnFootPos
[
2
]
;
// Z
// Переводим игровые координаты в экранные
SF
->
getGame
(
)
->
convert3DCoordsToScreen
(
enpos
[
0
]
,
enpos
[
1
]
,
enpos
[
2
]
,
&
screen
[
0
]
,
&
screen
[
1
]
)
;
// Получаем CPed
CPed
*
Ped
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
)
;
// Проверяем есть ли игрок на экране
if
(
Ped
->
IsOnScreen
(
)
)
{
// игрок на экране
}


Перейдем к рисованию, сначала с квадрата.
Для этого нужно вызвать функцию для рисования квадрата и указать экранные координаты:

C++:





Код:
SF
->
getRender
(
)
->
DrawBox
(
screen
[
0
]
,
screen
[
1
]
,
35
,
35
,
0xFF00FF00
)
;


получаем:
Цитата:
Сообщение от Спойлер  

3bP8eMd.pngLivarka · 16 Окт 2018 в 21:52' data-fancybox="lb-post-262727" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="/proxy.php?image=https%3A%2F%2Fi.imgur.com%2F3bP8eM d.png&hash=16bde79cd7e1ab838a9907f9e27e71b3" style="cursor: pointer;" title="3bP8eMd.png">


Рисуем линии:

C++:





Код:
SF
->
getRender
(
)
->
DrawLine
(
640
,
900
,
screen
[
0
]
,
screen
[
1
]
,
5
,
0xFF00FF00
)
;


получаем:
Цитата:
Сообщение от Спойлер  

ltcertH.pngLivarka · 16 Окт 2018 в 21:52' data-fancybox="lb-post-262727" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="/proxy.php?image=https%3A%2F%2Fi.imgur.com%2Fltcert H.png&hash=6600aa3330d048ac5a48f50b153a60bb" style="cursor: pointer;" title="ltcertH.png">


Рисуем текст:

C++:





Код:
char
buf
[
255
]
;
// Заполняем буфер ником и id
sprintf_s
(
buf
,
"%s[%d]"
,
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetPlayerName
(
i
)
,
i
)
;
// Рисуем текст
pFont
->
Print
(
buf
,
0xFF00FF00
,
screen
[
0
]
,
screen
[
1
]
,
false
)
;


для использования pFont нужно объявить и инициализировать его:

C++:





Код:
stFontInfo
*
pFont
;
//Затем один раз инициализируем шрифт:
pFont
=
SF
->
getRender
(
)
->
CreateNewFont
(
"Tahoma"
,
12
,
FCR_BORDER
)
;


получаем:
Цитата:
Сообщение от Спойлер  

VCHsMSA.pngLivarka · 16 Окт 2018 в 21:52' data-fancybox="lb-post-262727" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="/proxy.php?image=https%3A%2F%2Fi.imgur.com%2FVCHsMS A.png&hash=09dee4000da4f5e36f3f9f9cc450ce9f" style="cursor: pointer;" title="VCHsMSA.png">


По такому принципу можно рисовать всё что угодно.
весь код функции:
Цитата:
Сообщение от Спойлер  


C++:





Код:
void
ESP
(
)
{
float
enpos
[
3
]
;
// для координат игрока
float
screen
[
2
]
;
// для экранных координат
char
buf
[
255
]
;
// для текста
for
(
int
i
=
0
;
i

getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
[
i
]
!=
1
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
==
NULL
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
==
NULL
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
==
NULL
)
continue
;
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
==
NULL
)
continue
;
// Если игрок не существует или не в зоне стрима, то пропускаем
// Можно сделать это одной функцией
/*if (SF->getSAMP()->getPlayers()->IsPlayerDefined(i, true))
        {
         // рисуем
        }*/
// Тут подойдут два варианта, это уже как вам будет удобнее
// Получаем координаты игрока
enpos
[
0
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
fOnFootPos
[
0
]
;
// X
enpos
[
1
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
fOnFootPos
[
1
]
;
// Y
enpos
[
2
]
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
fOnFootPos
[
2
]
;
// Z
// Переводим игровые координаты в экранные
SF
->
getGame
(
)
->
convert3DCoordsToScreen
(
enpos
[
0
]
,
enpos
[
1
]
,
enpos
[
2
]
,
&
screen
[
0
]
,
&
screen
[
1
]
)
;
// Получаем CPed
CPed
*
Ped
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
)
;
// Проверяем есть ли игрок на экране
if
(
Ped
->
IsOnScreen
(
)
)
{
// начинаем рисовать
// Рисуем квадрат на игроках
//    SF->getRender()->DrawBox(screen[0], screen[1], 35, 35, 0xFF00FF00);
// Рисуем линии
//SF->getRender()->DrawLine(640, 900, screen[0], screen[1], 5,0xFF00FF00);
// Заполняем буфер ником и id
sprintf_s
(
buf
,
"%s[%d]"
,
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetPlayerName
(
i
)
,
i
)
;
// Рисуем текст
pFont
->
Print
(
buf
,
0xFF00FF00
,
screen
[
0
]
,
screen
[
1
]
,
false
)
;
}
}
}


Дополни как рендер ника сделать чтобы он был равен цвету самого ника. Думаю у людей будет такой вопрос
 
Ответить с цитированием

  #3  
Старый 17.10.2018, 08:12
клешь рояль
Познавший АНТИЧАТ
Регистрация: 27.06.2017
Сообщений: 1,253
С нами: 4673046

Репутация: 168


По умолчанию

А нельзя это сделать с "if and" как в клео ?

C++:





Код:
void
ESP
(
)
{
for
(
int
i
=
0
;
i

getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
[
i
]
!=
1
)
continue
;
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
==
NULL
)
continue
;
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
==
NULL
)
continue
;
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
==
NULL
)
continue
;
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
==
NULL
)
continue
;
// Если игрок не существует или не в зоне стрима, то пропускаем
}
}
 
Ответить с цитированием

  #4  
Старый 17.10.2018, 16:36
CleanLegend
Постоянный
Регистрация: 28.03.2013
Сообщений: 495
С нами: 6908018

Репутация: 213
По умолчанию

Цитата:
Сообщение от butchers  

Дополни как рендер ника сделать чтобы он был равен цвету самого ника. Думаю у людей будет такой вопрос
C++:





Код:
pFont
->
Print
(
buf
,
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetPlayerColor
(
i
)
,
screen
[
0
]
,
screen
[
1
]
,
false
)
;


Цитата:
Сообщение от Carloson  

А нельзя это сделать с "if and" как в клео ?
Всё можно упростить, но для понимания посчитал нужным сделать так.

Будет выглядеть примерно так:

C++:





Код:
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
[
i
]
!=
1
||
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
==
NULL
||
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
==
NULL
)
continue
;
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.