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

  #1  
Старый 18.04.2021, 19:42
frosjkee
Участник форума
Регистрация: 21.01.2020
Сообщений: 123
С нами: 3322808

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

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

Если ты не умеешь водить на механике, а только на автомате - это ты тупой, а не МКПП
зач ты оффтопишь если знаешь помоги, объясни, покажи как нужно
 
Ответить с цитированием

  #2  
Старый 21.04.2021, 16:34
PanSeek
Постоянный
Регистрация: 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
;
}
 
Ответить с цитированием

  #3  
Старый 21.04.2021, 16:41
ufdhbi
Познавший АНТИЧАТ
Регистрация: 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
;
}

ставить хук на диалог
 
Ответить с цитированием

  #4  
Старый 21.04.2021, 16:58
PanSeek
Постоянный
Регистрация: 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
 
Ответить с цитированием

  #5  
Старый 21.04.2021, 17:00
ufdhbi
Познавший АНТИЧАТ
Регистрация: 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
 
Ответить с цитированием

  #6  
Старый 21.04.2021, 17:07
Musaigen
Познавший АНТИЧАТ
Регистрация: 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);
 
Ответить с цитированием

  #7  
Старый 24.04.2021, 18:33
PanSeek
Постоянный
Регистрация: 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
)


Насчет
Код:
std::memcpy
чуть знаю.

Также видел такую функцию в полезных сниппетах для 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()
оно равно
Код:
0x17924EE0
- если все правильно сделал. Также как я понял оно находится здесь:

C++:





Код:
//SFSAMP.h
//class SAMPFUNCS_API SFSAMP
struct
stChatInfo
*
getChat
(
void
)
;
 
Ответить с цитированием

  #8  
Старый 24.04.2021, 20:00
Musaigen
Познавший АНТИЧАТ
Регистрация: 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
;
}


Вроде бы этого достаточно.
 
Ответить с цитированием

  #9  
Старый 25.04.2021, 12:09
frosjkee
Участник форума
Регистрация: 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
;
}


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

  #10  
Старый 25.04.2021, 16:37
PanSeek
Постоянный
Регистрация: 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)
 


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




ANTICHAT ™ © 2001- Antichat Kft.