
18.04.2021, 19:42
|
|
Участник форума
Регистрация: 21.01.2020
Сообщений: 123
С нами:
3322808
Репутация:
78
|
|
Сообщение от KiN4StAt
Если ты не умеешь водить на механике, а только на автомате - это ты тупой, а не МКПП
зач ты оффтопишь если знаешь помоги, объясни, покажи как нужно
|
|
|

21.04.2021, 16:34
|
|
Постоянный
Регистрация: 24.06.2016
Сообщений: 912
С нами:
5202871
Репутация:
163
|
|
SF. Как отлавливать, нажатие кнопок и какой пункт выбран?
C++:
Код:
#include
#include "main.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
bool
test
=
false
;
#define color_red "AA3333"
#define color_green "33AA33"
void
CALLBACK
hMenu
(
std
::
string param
)
{
char
outMenu
[
9
]
;
sprintf
(
outMenu
,
"{%s}test"
,
test
?
color_green
:
color_red
)
;
if
(
param
==
"1"
)
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"фаст выбор тест"
)
;
else
return
SF
->
getSAMP
(
)
->
getDialog
(
)
->
ShowDialog
(
8521
,
2
,
"Title test"
,
outMenu
,
"Выбрать"
,
"Закрыть"
)
;
}
;
void
__stdcall
mainloop
(
)
{
static
bool
initialized
=
false
;
if
(
!
initialized
)
{
if
(
GAME
&&
GAME
->
GetSystemState
(
)
==
eSystemState
::
GS_PLAYING_GAME
&&
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"Debug: {008000}SUCCESS"
)
;
SF
->
getSAMP
(
)
->
registerChatCommand
(
"cout"
,
hMenu
)
;
initialized
=
true
;
}
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
return
TRUE
;
}
|
|
|

21.04.2021, 16:41
|
|
Познавший АНТИЧАТ
Регистрация: 03.02.2015
Сообщений: 1,468
С нами:
5933080
Репутация:
183
|
|
Сообщение от PanSeek
SF. Как отлавливать, нажатие кнопок и какой пункт выбран?
C++:
Код:
#include
#include "main.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
bool
test
=
false
;
#define color_red "AA3333"
#define color_green "33AA33"
void
CALLBACK
hMenu
(
std
::
string param
)
{
char
outMenu
[
9
]
;
sprintf
(
outMenu
,
"{%s}test"
,
test
?
color_green
:
color_red
)
;
if
(
param
==
"1"
)
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"фаст выбор тест"
)
;
else
return
SF
->
getSAMP
(
)
->
getDialog
(
)
->
ShowDialog
(
8521
,
2
,
"Title test"
,
outMenu
,
"Выбрать"
,
"Закрыть"
)
;
}
;
void
__stdcall
mainloop
(
)
{
static
bool
initialized
=
false
;
if
(
!
initialized
)
{
if
(
GAME
&&
GAME
->
GetSystemState
(
)
==
eSystemState
::
GS_PLAYING_GAME
&&
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"Debug: {008000}SUCCESS"
)
;
SF
->
getSAMP
(
)
->
registerChatCommand
(
"cout"
,
hMenu
)
;
initialized
=
true
;
}
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
return
TRUE
;
}
ставить хук на диалог
|
|
|

21.04.2021, 16:58
|
|
Постоянный
Регистрация: 24.06.2016
Сообщений: 912
С нами:
5202871
Репутация:
163
|
|
Сообщение от ufdhbi
ставить хук на диалог
Можешь объяснить как?
Просто это локальный диалог и в том же Lua можно было обойтись вот так:
Lua:
Код:
-- while true do
local
result
,
button
,
list
,
input
=
sampHasDialogRespond
(
3333
)
if
result
then
if
button
==
1
then
if
list
==
0
then
-- code
end
end
end
|
|
|

21.04.2021, 17:00
|
|
Познавший АНТИЧАТ
Регистрация: 03.02.2015
Сообщений: 1,468
С нами:
5933080
Репутация:
183
|
|
Сообщение от PanSeek
Можешь объяснить как?
Просто это локальный диалог и в том же Lua можно было обойтись вот так:
Lua:
Код:
-- while true do
local
result
,
button
,
list
,
input
=
sampHasDialogRespond
(
3333
)
if
result
then
if
button
==
1
then
if
list
==
0
then
-- code
end
end
end
Так же как и на серверный диалог, на вики есть пример на SF
Гайд - API SF | Урок 4 - RakNet
Введение RakNet — это сетевой движок, используемый в SA:MP для обмена данными между игроками и сервером. Клиент отправляет пакет серверу, сервер его обрабатывает и рассылает другим игрокам — таким образом это работает. В этом уроке я покажу, как отправлять свои пакеты и заносить в них данные...
www.blast.hk
|
|
|

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);
|
|
|

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 нужно
|
|
|
|
 |
|
|
Здесь присутствуют: 2 (пользователей: 0 , гостей: 2)
|
|
|
|