 |
|

21.04.2021, 17:07
|
|
Познавший АНТИЧАТ
Регистрация: 01.04.2018
Сообщений: 1,710
С нами:
4272230
Репутация:
183
|
|
Сообщение от ufdhbi
Так же как и на серверный диалог, на вики есть пример на SF
Гайд - API SF | Урок 4 - RakNet
Введение RakNet — это сетевой движок, используемый в SA:MP для обмена данными между игроками и сервером. Клиент отправляет пакет серверу, сервер его обрабатывает и рассылает другим игрокам — таким образом это работает. В этом уроке я покажу, как отправлять свои пакеты и заносить в них данные...
www.blast.hk
Код:
SF->getSAMP()->registerDialogCallback(dialogCallback_t callback); // typedef void(__stdcall *dialogCallback_t)(int dialogId, int buttonId, int listItem, const char *input);
|
|
|

21.04.2021, 20:30
|
|
Познавший АНТИЧАТ
Регистрация: 18.06.2017
Сообщений: 1,632
С нами:
4686777
Репутация:
183
|
|
Сообщение от pMozze
Как в gameLoop'е исполнять свой код раз в секунду?
Пробовал такое, но похоже, что там задержка больше одной мс
C++:
Код:
void
timerUpdateHooked
(
)
{
static
bool
bIsInitialized
=
false
;
static
unsigned
int
iTickedCount
=
0
;
if
(
!
bIsInitialized
&&
SAMP
::
isInitialized
(
)
)
{
bIsInitialized
=
true
;
}
if
(
bIsInitialized
)
{
if
(
iTickedCount
>=
1000
)
{
iTickedCount
=
0
;
// ...
}
else
{
iTickedCount
++
;
}
}
(
(
void
(
__cdecl
*
)
(
)
)
g_Entry
.
m_pTimerUpdateHook
->
m_pTrampoline
)
(
)
;
}
дык геймлуп вызывается с кадрами
C++:
Код:
DWORD dwLastTick
=
GetTickCount
(
)
;
// в глобале
if
(
GetTickCount
(
)
-
dwLastTick
>=
1000
)
{
dwLastTick
=
GetTickCount
(
)
;
// код
}
|
|
|

21.04.2021, 21:04
|
|
Флудер
Регистрация: 03.08.2016
Сообщений: 2,363
С нами:
5145387
Репутация:
183
|
|
Сообщение от pMozze
Как в gameLoop'е исполнять свой код раз в секунду?
Пробовал такое, но похоже, что там задержка больше одной мс
C++:
Код:
void
timerUpdateHooked
(
)
{
static
bool
bIsInitialized
=
false
;
static
unsigned
int
iTickedCount
=
0
;
if
(
!
bIsInitialized
&&
SAMP
::
isInitialized
(
)
)
{
bIsInitialized
=
true
;
}
if
(
bIsInitialized
)
{
if
(
iTickedCount
>=
1000
)
{
iTickedCount
=
0
;
// ...
}
else
{
iTickedCount
++
;
}
}
(
(
void
(
__cdecl
*
)
(
)
)
g_Entry
.
m_pTimerUpdateHook
->
m_pTrampoline
)
(
)
;
}
или можно https://www.blast.hk/threads/10970/post-419257
|
|
|

24.04.2021, 18:33
|
|
Постоянный
Регистрация: 24.06.2016
Сообщений: 912
С нами:
5202871
Репутация:
163
|
|
SF. Как правильно работать с памятью игры (видел гайды, но видимо что-то не то было либо я не понял), вот к примеру как это перевести в C++ из Lua
Lua:
Код:
local
mem
=
require
'memory'
--
mem
.
fill
(
sampGetChatInfoPtr
(
)
+
306
,
0x0
,
25200
)
mem
.
write
(
sampGetChatInfoPtr
(
)
+
306
,
25562
,
4
,
0x0
)
mem
.
write
(
sampGetChatInfoPtr
(
)
+
0x63DA
,
1
,
1
)
Насчет
чуть знаю.
Также видел такую функцию в полезных сниппетах для C++
C++:
Код:
void
WriteMemory
(
void
*
address
,
void
*
bytes
,
int
byteSize
)
{
DWORD NewProtection
;
VirtualProtect
(
address
,
byteSize
,
PAGE_EXECUTE_READWRITE
,
&
NewProtection
)
;
std
::
memcpy
(
address
,
bytes
,
byteSize
)
;
VirtualProtect
(
address
,
byteSize
,
NewProtection
,
&
NewProtection
)
;
}
Но где-то принимается более 3-х аргументов.
Получил
Код:
sampGetChatInfoPtr()
оно равно
- если все правильно сделал. Также как я понял оно находится здесь:
C++:
Код:
//SFSAMP.h
//class SAMPFUNCS_API SFSAMP
struct
stChatInfo
*
getChat
(
void
)
;
|
|
|

24.04.2021, 20:00
|
|
Познавший АНТИЧАТ
Регистрация: 01.04.2018
Сообщений: 1,710
С нами:
4272230
Репутация:
183
|
|
Сообщение от PanSeek
Также видел такую функцию в полезных сниппетах для C++
C++:
Код:
template
void
WriteMemory
(
void
*
address
,
T value
)
{
DWORD protect
;
VirtualProtect
(
address
,
sizeof
(
T
)
,
PAGE_EXECUTE_READWRITE
,
&
protect
)
;
*
reinterpret_cast
(
address
)
=
value
;
VirtualProtect
(
address
,
sizeof
(
T
)
,
protect
,
&
protect
)
;
// вместо &protect можно и nullptr
}
Сообщение от PanSeek
mem.fill(sampGetChatInfoPtr() + 306, 0x0, 25200)
C++:
Код:
void
MemoryFill
(
void
*
address
,
int
value
,
unsigned
int
size
)
{
DWORD protect
;
VirtualProtect
(
address
,
size
,
PAGE_EXECUTE_READWRITE
,
&
protect
)
;
memset
(
address
,
value
,
size
)
;
VirtualProtect
(
address
,
size
,
protect
,
&
protect
)
;
}
Сообщение от PanSeek
SF. Как правильно работать с памятью игры (видел гайды, но видимо что-то не то было либо я не понял), вот к примеру как это перевести в C++ из Lua
Lua:
Код:
local
mem
=
require
'memory'
--
mem
.
fill
(
sampGetChatInfoPtr
(
)
+
306
,
0x0
,
25200
)
mem
.
write
(
sampGetChatInfoPtr
(
)
+
306
,
25562
,
4
,
0x0
)
mem
.
write
(
sampGetChatInfoPtr
(
)
+
0x63DA
,
1
,
1
)
C++:
Код:
void
ClearChat
(
)
{
stChatInfo
*
chat
=
SF
->
getSAMP
(
)
->
getChat
(
)
;
MemoryFill
(
&
chat
->
chatEntry
,
0
,
sizeof
(
stChatEntry
)
*
100
)
;
chat
->
m_iRedraw
=
1
;
}
Вроде бы этого достаточно.
|
|
|

25.04.2021, 12:09
|
|
Участник форума
Регистрация: 21.01.2020
Сообщений: 123
С нами:
3322808
Репутация:
78
|
|
sampapi покежьте как правильно использовать
Lua:
Код:
[
/
B
]
#
include
"main.h"
void __cdecl
DLLProject
(
void
*
pArg
)
{
while
(
true
)
{
Sleep
(
1
)
;
if
(
GetAsyncKeyState
(
VK_END
)
)
{
while
(
GetAsyncKeyState
(
VK_END
)
)
{
Sleep
(
1
)
;
}
sampapi
::
v037r3
::
RefNetGame
(
)
-
>
m_pSettings
-
>
m_bNoNametagsBehindWalls
=
false
;
}
}
}
BOOL WINAPI
DllMain
(
_In_ HINSTANCE hinstDLL
,
_In_ DWORD fdwReason
,
_In_ PVOID lpvReserved
)
{
if
(
fdwReason
==
DLL_PROCESS_ATTACH
)
_beginthread
(
DLLProject
,
NULL
,
nullptr
)
;
return
TRUE
;
}
|
|
|

25.04.2021, 16:37
|
|
Постоянный
Регистрация: 24.06.2016
Сообщений: 912
С нами:
5202871
Репутация:
163
|
|
Сообщение от frosjkee
sampapi покежьте как правильно использовать
Lua:
Код:
[
/
B
]
#
include
"main.h"
void __cdecl
DLLProject
(
void
*
pArg
)
{
while
(
true
)
{
Sleep
(
1
)
;
if
(
GetAsyncKeyState
(
VK_END
)
)
{
while
(
GetAsyncKeyState
(
VK_END
)
)
{
Sleep
(
1
)
;
}
sampapi
::
v037r3
::
RefNetGame
(
)
-
>
m_pSettings
-
>
m_bNoNametagsBehindWalls
=
false
;
}
}
}
BOOL WINAPI
DllMain
(
_In_ HINSTANCE hinstDLL
,
_In_ DWORD fdwReason
,
_In_ PVOID lpvReserved
)
{
if
(
fdwReason
==
DLL_PROCESS_ATTACH
)
_beginthread
(
DLLProject
,
NULL
,
nullptr
)
;
return
TRUE
;
}
В C++ я конечно не силен, но что-то мне подсказывает, что тут можно не использовать поток.
C++:
Код:
LRESULT CALLBACK
WindowProc
(
HWND hwnd
,
UINT uMsg
,
WPARAM wParam
,
LPARAM lParam
)
{
switch
(
uMsg
)
{
case
WM_KEYUP
:
{
switch
(
wParam
)
{
case
VK_END
:
{
sampapi
::
v037r3
::
RefNetGame
(
)
->
m_pSettings
->
m_bNoNametagsBehindWalls
=
false
;
break
;
}
}
}
}
return
CallWindowProcA
(
WNDPROC
(
DLLProject
.
PrevWndFunc
)
,
hwnd
,
uMsg
,
wParam
,
lParam
)
;
}
//WinAPI. Перерегистрировать WindowProc нужно
|
|
|

25.04.2021, 17:06
|
|
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами:
4483143
Репутация:
183
|
|
Сообщение от PanSeek
В C++ я конечно не силен, но что-то мне подсказывает, что тут можно не использовать поток.
из DllMain WNDPROC хук не поставишь, если аси лоадером подргужать, к тому моменту окно игры еще не создано
|
|
|

25.04.2021, 18:55
|
|
Участник форума
Регистрация: 21.01.2020
Сообщений: 123
С нами:
3322808
Репутация:
78
|
|
Сообщение от PanSeek
В C++ я конечно не силен, но что-то мне подсказывает, что тут можно не использовать поток.
C++:
Код:
LRESULT CALLBACK
WindowProc
(
HWND hwnd
,
UINT uMsg
,
WPARAM wParam
,
LPARAM lParam
)
{
switch
(
uMsg
)
{
case
WM_KEYUP
:
{
switch
(
wParam
)
{
case
VK_END
:
{
sampapi
::
v037r3
::
RefNetGame
(
)
->
m_pSettings
->
m_bNoNametagsBehindWalls
=
false
;
break
;
}
}
}
}
return
CallWindowProcA
(
WNDPROC
(
DLLProject
.
PrevWndFunc
)
,
hwnd
,
uMsg
,
wParam
,
lParam
)
;
}
//WinAPI. Перерегистрировать WindowProc нужно
Спасибо за помощь друголек, однако я неправильно вызываю функцию в этом коде и я не знаю как.
|
|
|

26.04.2021, 23:20
|
|
Новичок
Регистрация: 03.11.2018
Сообщений: 23
С нами:
3961687
Репутация:
3
|
|
Ребят, может кто помочь фиксануть аимбот к ближайшей кости? У меня некоторые проблемки, черканите в лс, тк код не маленький
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|