PDA

Просмотр полной версии : С/С++ Вопрос - Ответ


Страницы : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [21] 22 23 24 25 26 27 28 29 30 31

LuaQ
28.12.2020, 23:29
Вот если в процессе два .dll модуля с одинаковым названием, как можно получить оба? По хэндлу все время только 1


Попробуй получить с помощью прочёсывания всех модулей. Вот пример получения всех функций.

C++:





[CODE]
#include
#include
#include
int
main
(
)
{
DWORD processId
;
std
::
cin
>>
processId
;
HANDLE hModuleSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPMODULE
,
processId
)
;
if
(
hModuleSnap
==
INVALID_HANDLE_VALUE
)
{
return
0
;
}
MODULEENTRY32 me32
;
me32
.
dwSize
=
sizeof
(
me32
)
;
if
(
Module32First
(
hModuleSnap
,
&
me32
)
)
{
std
::
cout

manukhov
28.12.2020, 23:31
[QUOTE="LuaQ"]

Попробуй получить с помощью прочёсывания всех модулей. Вот пример получения всех функций.

C++:





[CODE]
int
main
(
)
{
DWORD processId
;
std
::
cin
>>
processId
;
HANDLE hModuleSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPMODULE
,
processId
)
;
if
(
hModuleSnap
==
INVALID_HANDLE_VALUE
)
{
return
0
;
}
MODULEENTRY32 me32
;
me32
.
dwSize
=
sizeof
(
me32
)
;
if
(
Module32First
(
hModuleSnap
,
&
me32
)
)
{
std
::
cout

kin4stat
28.12.2020, 23:55
Пробовал, только один выдает. EnumProcessModules тоже пробовал


Можно через PEB(LDR_DATA) попробовать

AdCKuY_DpO4uLa
29.12.2020, 02:33
как в длл получить аргументы при запуске процесса?

kin4stat
29.12.2020, 02:35
как в длл получить аргументы при запуске процесса?


GetCommandLine

sc6ut
08.01.2021, 00:24
когда делаю http запрос в длл библиотеке, то он остается в строках процесса. есть ли возможность как-либо скрыть его?

kin4stat
08.01.2021, 00:44
когда делаю http запрос в длл библиотеке, то он остается в строках процесса. есть ли возможность как-либо скрыть его?


Убирай строку

Carrentine
10.01.2021, 21:26
Убирай строку


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

sc6ut
12.01.2021, 10:41
Вроде хук

C++:






void
CALLBACK
WndProc_hooked
(
HWND
&
hwnd
,
UINT
&
Message
,
WPARAM
&
wparam
,
LPARAM
&
lparam
)
{
switch
(
Message
)
{
case
WM_KEYUP
:
if
(
wparam
==
'9'
)
{
// ...
}
break
;
default
:
break
;
}
}
static
hook
wndproc
(
reinterpret_cast

(
0x747EB0
)
,
WndProc_hooked
)
;





я не знаю, конечно, какой хукер ты юзаешь, но в хукнутой функции у тебя почему-то стоят референсы вместо просто параметров, вместо LRESULT - void, и нет вызова оригинальной функции, поэтому игра ломается. вот тебе пример рабочего хука с помощью MinHook:

C++:






#include
#include "MinHook.h"
#pragma comment(lib, "libMinHook-x86-v120-mt.lib")
// либу выбираешь под версию тулсета и рантайм либу
WNDPROC origWndProc
=
nullptr
;
// создаём прототип для сохранения оригинального вндпрока
LRESULT __stdcall
HOOKED_WndProc
(
HWND hWnd
,
UINT uMsg
,
WPARAM wParam
,
LPARAM lParam
)
{
// твой код
return
origWndProc
(
hWnd
,
uMsg
,
wParam
,
lParam
)
;
// вызываем оригинальный вндпрок чтобы не сломать игру
}
// иницилиазируем минхук (1 раз)
MH_Initialize
(
)
;
// создаем и включаем хук
MH_CreateHook
(
reinterpret_cast

(
0x747EB0
)
,
&
HOOKED_WndProc
,
reinterpret_cast

(
&
origWndProc
)
)
;
MH_EnableHook
(
reinterpret_cast

(
0x747EB0
)
)
;

imring
12.01.2021, 14:28
но в хукнутой функции у тебя почему-то стоят референсы вместо просто параметров, вместо LRESULT - void, и нет вызова оригинальной функции, поэтому игра ломается


вот хук, который использовался - https://github.com/allwanttokissme/Yet-another-hook-library. если тип возвращаемого значения void, то будет вызываться оригинальная функция (https://github.com/allwanttokissme/Yet-another-hook-library/blob/master/hook.h#L327, https://github.com/allwanttokissme/Yet-another-hook-library/blob/master/hook.h#L342)

Sana_Minotazaki
13.01.2021, 11:03
1 - Как исправить это в Visual Studio 2019?


C:\Новая папка\SFPlugin\SFPlugin\SFPlugin.vcxproj : warning : Невозможно найти средства сборки для Visual Studio 2012 - Windows XP (v110_xp). Установите Visual Studio 2012 - Windows XP (v110_xp), чтобы выполнить сборку с использованием средств сборки Visual Studio 2012 - Windows XP (v110_xp).


2 - Как я могу отправить сообщение в чат не используя SF Api?

sc6ut
13.01.2021, 11:11
Как исправить это в Visual Studio 2019?


в настройках проекта выбери установленый тулсет и винсдк



2 - Как я могу отправить сообщение в чат не используя SF Api?


перед использованием проверь загруженость сампа

C++:






void
add_chat_message
(
DWORD dwColor
,
LPCSTR szString
,
.
.
.
)
{
va_list ap
;
char
msg
[
/* SAMP_MAX_CHAT_MESSAGE */
144
]
=
{
0
}
;
va_start
(
ap
,
szString
)
;
vsprintf_s
(
msg
,
szString
,
ap
)
;
va_end
(
ap
)
;
DWORD base
=
reinterpret_cast

(
GetModuleHandleW
(
L
"samp.dll"
)
)
;
DWORD ptr_chat_info
=
base
+
/* SAMP_PTR_CHAT_INFO */
0x21A0E4
;
DWORD ptr_function
=
base
+
/* SAMP_PTR_FUNC_ADDTOCHATWND */
0x64010
;
__asm
{
mov eax
,
dword ptr
[
ptr_chat_info
]
mov ecx
,
dword ptr
[
eax
]
push
0
push dwColor
push
0
lea eax
,
msg
push eax
push
8
call ptr_function
}
}

Sana_Minotazaki
13.01.2021, 11:33
в настройках проекта выбери установленый тулсет и винсдк

перед использованием проверь загруженость сампа

C++:






void
add_chat_message
(
DWORD dwColor
,
LPCSTR szString
,
.
.
.
)
{
va_list ap
;
char
msg
[
/* SAMP_MAX_CHAT_MESSAGE */
144
]
=
{
0
}
;
va_start
(
ap
,
szString
)
;
vsprintf_s
(
msg
,
szString
,
ap
)
;
va_end
(
ap
)
;
DWORD base
=
reinterpret_cast

(
GetModuleHandleW
(
L
"samp.dll"
)
)
;
DWORD ptr_chat_info
=
base
+
/* SAMP_PTR_CHAT_INFO */
0x21A0E4
;
DWORD ptr_function
=
base
+
/* SAMP_PTR_FUNC_ADDTOCHATWND */
0x64010
;
__asm
{
mov eax
,
dword ptr
[
ptr_chat_info
]
mov ecx
,
dword ptr
[
eax
]
push
0
push dwColor
push
0
lea eax
,
msg
push eax
push
8
call ptr_function
}
}





Можешь подробнее объяснить, если можно скриншотами, как включить тулсет и винсдк, вчера скачал студию, и вообще не понимаю че да как там

sc6ut
13.01.2021, 11:40
Можешь подробнее объяснить, если можно скриншотами, как включить тулсет и винсдк, вчера скачал студию, и вообще не понимаю че да как там


пкм по названию проекту - настройки. выбираешь установленый тулсет (у меня это v141), применяешь настройки. после чего выбираешь версию winsdk (у меня это 10.0.17763.0), применяешь настройки.




https://forum.antichat.xyz/attachments/27647401/

https://forum.antichat.xyz/attachments/27647401/

https://forum.antichat.xyz/attachments/27647401/

https://forum.antichat.xyz/attachments/27647401/

https://forum.antichat.xyz/attachments/27647401/

kin4stat
13.01.2021, 12:00
перед использованием проверь загруженость сампа


Можно поинтересоваться для чего тут ассемблер?

SR_team
13.01.2021, 12:05
Можно поинтересоваться для чего тут ассемблер?


MTA-стайл - асм вместо тайпдефа

kin4stat
13.01.2021, 12:07
пкм по названию проекту - настройки. выбираешь установленый тулсет (у меня это v141), применяешь настройки. после чего выбираешь версию winsdk (у меня это 10.0.17763.0), применяешь настройки.


ПКМ по решению -> перенацелить решение



MTA-стайл - асм вместо тайпдефа


А зачем...

Ассемблером выебнуться типа?

sc6ut
13.01.2021, 12:14
А зачем...
Ассемблером выебнуться типа?


при чём тут это? мне просто так легче было написать, вот и всё

SR_team
13.01.2021, 13:05
мне просто так легче было написать


11 строк вместо 2х

S0meTh1n69
13.01.2021, 13:39
11 строк вместо 2х


Тим, напиши пожалуйста как можно заменить эти 11 строк твоими 2

sc6ut
13.01.2021, 13:40
11 строк вместо 2х


дело ведь не в количестве строк 🥲

S0meTh1n69
13.01.2021, 13:43
дело ведь не в количестве строк 🥲


Я тоже не про количество, мне просто интересно как заменить это.

sc6ut
13.01.2021, 14:03
Тим, напиши пожалуйста как можно заменить эти 11 строк твоими 2



C++:






void
add_chat_message
(
DWORD dwColor
,
LPCSTR szString
,
.
.
.
)
{
va_list ap
;
char
msg
[
/* SAMP_MAX_CHAT_MESSAGE*/
144
]
=
{
0
}
;
va_start
(
ap
,
szString
)
;
vsprintf_s
(
msg
,
szString
,
ap
)
;
va_end
(
ap
)
;
DWORD base
=
reinterpret_cast

(
GetModuleHandleW
(
L
"samp.dll"
)
)
;
typedef
void
(
__thiscall
*
CChat__AddEntry
)
(
void
*
,
int
,
char
*
,
char
*
,
DWORD
,
DWORD
)
;
reinterpret_cast

(
base
+
/* SAMP_PTR_FUNC_ADDTOCHATWND */
0x64010
)
(
*
reinterpret_cast

(
base
+
/* SAMP_PTR_CHAT_INFO */
0x21A0E4
)
,
8
,
msg
,
0
,
dwColor
,
0
)
;
}






11 строк вместо 2х


почему 2? можно и 1 😀

Sana_Minotazaki
13.01.2021, 19:50
Почему не работает? Вроде же все норм делаю или нет? Когда нажимаю H игра просто виснет @SC6UT (https://www.blast.hk/members/406860/) @KiN4StAt (https://www.blast.hk/members/161331/) help pls

вот это:






#include
#include "main.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
void
__stdcall
mainloop
(
)
{
static
bool
initialized
=
false
;
static
bool
activated
=
false
;
if
(
!
initialized
)
{
if
(
GAME
&&
GAME
->
GetSystemState
(
)
==
eSystemState
::
GS_PLAYING_GAME
&&
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
{
initialized
=
true
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
}
}
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
'H'
)
)
{
activated
=
true
;
}
while
(
activated
)
{
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
Say
(
"/edit"
)
;
Sleep
(
2500
)
;
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
return
TRUE
;
}

sc6ut
13.01.2021, 20:03
игра просто виснет


нельзя делать Sleep в mainloop, ты останавливаешь всю игру, а не только свой плагин. так же нельзя делать while в mainloop, да и нет смысла, так как mainloop вызывается постоянно. используй if и GetTickCount (функция которая берет текущее количество пройденых милисекунд с запуска системы, 1000 милисекунд = 1 секунда), вот так:

C++:






#include "main.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
void
__stdcall
mainloop
(
)
{
static
bool
initialized
=
false
;
static
bool
activated
=
false
;
static
DWORD dwTime
=
0
;
if
(
!
initialized
)
{
if
(
GAME
&&
GAME
->
GetSystemState
(
)
==
eSystemState
::
GS_PLAYING_GAME
&&
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
{
initialized
=
true
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
}
}
else
{
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
'H'
)
)
{
// активирует и деактивирует на ту же кнопку
activated
=
!
activated
;
}
if
(
activated
&&
GetTickCount
(
)
-
dwTime
>=
/* время ожидания */
2500
)
{
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
Say
(
"/edit"
)
;
dwTime
=
GetTickCount
(
)
;
}
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
return
TRUE
;
}

Sana_Minotazaki
13.01.2021, 20:10
нельзя делать Sleep в mainloop, ты останавливаешь всю игру, а не только свой плагин. так же нельзя делать while в mainloop, да и нет смысла, так как mainloop вызывается постоянно. используй if и GetTickCount (функция которая берет текущее количество пройденых милисекунд с запуска системы, 1000 милисекунд = 1 секунда), вот так:

C++:






#include "main.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
void
__stdcall
mainloop
(
)
{
static
bool
initialized
=
false
;
static
bool
activated
=
false
;
static
DWORD dwTime
=
0
;
if
(
!
initialized
)
{
if
(
GAME
&&
GAME
->
GetSystemState
(
)
==
eSystemState
::
GS_PLAYING_GAME
&&
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
{
initialized
=
true
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
}
}
else
{
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
'H'
)
)
{
// активирует и деактивирует на ту же кнопку
activated
=
!
activated
;
}
if
(
activated
&&
GetTickCount
(
)
-
dwTime
>
/* время ожидания */
2500
)
{
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
Say
(
"/edit"
)
;
dwTime
=
GetTickCount
(
)
;
}
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
return
TRUE
;
}





Игра уже не виснет, но команда отправляется только тогда когда я жму H а не циклически как хотелось

sc6ut
13.01.2021, 20:14
Игра уже не виснет, но команда отправляется только тогда когда я жму H а не циклически как хотелось


команда отправляется каждые 2.5 секунды, можешь проверить это добавлением логгированием в месте отправления команды




https://forum.antichat.xyz/attachments/27647760/




решил добавить фикс краша по адрессу 0x0072CD14 в сф плагин. заметил, что при отгрузке плагина через pfree или просто выходе из игры, то функция хука пропадает быстрее, чем сам хук снимается и игра крашится. когда я делал тоже самое в проекте с аси плагином, то всё было окей. как можно это исправить?

хук я ставлю в DLL_PROCESS_ATTACH, а снимаю в DLL_PROCESS_DETACH.

SR_team
13.01.2021, 22:05
решил добавить фикс краша по адрессу 0x0072CD14 в сф плагин. заметил, что при отгрузке плагина через pfree или просто выходе из игры, то функция хука пропадает быстрее, чем сам хук снимается и игра крашится. когда я делал тоже самое в проекте с аси плагином, то всё было окей. как можно это исправить?
хук я ставлю в DLL_PROCESS_ATTACH, а снимаю в DLL_PROCESS_DETACH.


У SF плагинов есть специальный коллбек, который выполняется перед выгрузкой

Sana_Minotazaki
13.01.2021, 22:18
Как мне в сф сделать onServerMessage как в луа?

sc6ut
13.01.2021, 22:20
специальный коллбек


не нахожу, можешь ткнуть пальцем пожалуйста



Как мне в сф сделать onServerMessage как в луа?


регистрируешь в mainloop коллбек на приходящие rpc, читаешь данные, взаимодействуешь:

C++:






// регистрируем коллбек в mainloop
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RAKHOOK_TYPE_INCOMING_RPC
,
incomingRPC
)
;
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
// проверяем что пришло рпц сообщения в чат по id
if
(
params
->
packetId
==
RPC_ScrClientMessage
)
{
DWORD color
;
// цвет
DWORD length
;
// длинна сообщения
char
message
[
256
]
;
// сообщение
// читаем данные
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
length
)
;
params
->
bitStream
->
Read
(
message
,
length
)
;
message
[
length
]
=
'\0'
;
// ставим в конце массава NULL чтобы превратить наш массив символов в стринг
// взаимодействуем
}
return
true
;
// возвращаем true чтобы рпц принимались
}

AdCKuY_DpO4uLa
13.01.2021, 22:39
не нахожу, можешь ткнуть пальцем пожалуйста



C++:






void
__stdcall
dest
(
)
{
}
SF
->
getGame
(
)
->
registerGameDestructorCallback
(
dest
)
;
//init

ishi
14.01.2021, 01:49
Пытаюсь реализовать класс с функцией, способной вызывать другие функции по адресам, но компилятор ругается:

Код:






результатом вычисления фрагмента не является функция, принимающая 4 аргументов




Вот, что я пытался ему впарить:

C++:






class
user32
{
char
*
base_address
;
template

void
call
(
function func
,
int
a
,
const
char
*
b
,
const
char
*
c
,
long
d
)
{
func
(
a
,
b
,
c
,
d
)
(
)
;
}
public
:
user32
(
)
{
base_address
=
(
char
*
)
GetModuleHandleA
(
"user32.dll"
)
;
}
void
MessageBoxA
(
int
a
,
const
char
*
b
,
const
char
*
c
,
long
d
)
{
call
(
(
base_address
+
0x77B30
)
,
a
,
b
,
c
,
d
)
;
}
}
;




Копаясь в интернете, я понял, что можно как-то сделать, чтобы функция объявлялась как обычная статическая и перекидывала аргументы через fastcall, stdcall и т.д., типа ты её объявил в переменной, но аргументы перекинул как в статическую и всё на ок сработало, но в тех громоздких конструкциях я так и не нашёл минималистичного примера, который смог бы понять. Всё как-то слишком уж перегружено

Отчаянно нуждаюсь в помощи в понимании этого механизма

то, что я уже написал, это попытка сделать прямой вызов MessageBoxA, не используя исходники, но зная оффсет в библиотеке (для чего и нужна эта функция в принципе)

memir
14.01.2021, 04:39
Пытаюсь реализовать класс с функцией, способной вызывать другие функции по адресам, но компилятор ругается:

Код:






результатом вычисления фрагмента не является функция, принимающая 4 аргументов




Вот, что я пытался ему впарить:

C++:






class
user32
{
char
*
base_address
;
template

void
call
(
function func
,
int
a
,
const
char
*
b
,
const
char
*
c
,
long
d
)
{
func
(
a
,
b
,
c
,
d
)
(
)
;
}
public
:
user32
(
)
{
base_address
=
(
char
*
)
GetModuleHandleA
(
"user32.dll"
)
;
}
void
MessageBoxA
(
int
a
,
const
char
*
b
,
const
char
*
c
,
long
d
)
{
call
(
(
base_address
+
0x77B30
)
,
a
,
b
,
c
,
d
)
;
}
}
;




Копаясь в интернете, я понял, что можно как-то сделать, чтобы функция объявлялась как обычная статическая и перекидывала аргументы через fastcall, stdcall и т.д., типа ты её объявил в переменной, но аргументы перекинул как в статическую и всё на ок сработало, но в тех громоздких конструкциях я так и не нашёл минималистичного примера, который смог бы понять. Всё как-то слишком уж перегружено
Отчаянно нуждаюсь в помощи в понимании этого механизма

то, что я уже написал, это попытка сделать прямой вызов MessageBoxA, не используя исходники, но зная оффсет в библиотеке (для чего и нужна эта функция в принципе)






C++:






#include
class
user32
{
using
TypeMessageBoxA
=
int
(
__stdcall
*
)
(
HWND
,
LPCSTR
,
LPCSTR
,
UINT
)
;
TypeMessageBoxA messageBoxA
;
template

void
call
(
F f
,
Args
.
.
.
args
)
{
f
(
args
.
.
.
)
;
}
public
:
user32
(
)
{
auto
user32Module
=
LoadLibraryA
(
"user32.dll"
)
;
messageBoxA
=
reinterpret_cast

(
GetProcAddress
(
user32Module
,
"MessageBoxA"
)
)
;
}
void
MessageBoxA
(
HWND a
,
LPCSTR b
,
LPCSTR c
,
UINT d
)
{
call
(
messageBoxA
,
a
,
b
,
c
,
d
)
;
}
}
;
int
main
(
)
{
user32 obj
;
obj
.
MessageBoxA
(
NULL
,
"Resource not available\nDo you want to try again?"
,
"Account details"
,
MB_ICONWARNING
|
MB_CANCELTRYCONTINUE
|
MB_DEFBUTTON2
)
;
return
0
;
}





Компилятор вычисляет тип (base_address + 0x77B30) и получает char *, а затем пытается вызвать его с четырьмя аргументами. Это приводит к ошибке.

Ты должен кастить base_address + 0x77B30, в void(__stdcall *)(int a, const char* b, const char* c, long d) чтобы всё заработало.

А ещё я бы посоветовал заменить a b c d в user32::call на вариативный шаблон с аргументами.

И у тебя скобочки в вызове лишние...

nomio
15.01.2021, 20:44
Охх как я люблю имуги,решил на плюсах пощупать имгуи,вставил рабочий код,имуги в папку с проектом,настройки для компиляции выставил.Компилирую - ошибки.Ставил старые,новые имуги,тыкал все что надо и все что не надо и в итоге пишу сюда

Visual Studio 2019

Imgui последней версии(на 1.63 такая же ***ня)

Найстроки проекта для компиляции стоят нормальные,компилил без имуги и все работало

Ошибки:







Папка с имуги файлами:





Код:

C++:






#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
#include "main.h"
#include "imgui/imgui.h"
#include "imgui/imgui_impl_dx9.h"
#include "imgui/imgui_impl_win32.h"
#include
#define DIRECTINPUT_VERSION 0x0800
#include
#include
extern
LRESULT
ImGui_ImplWin32_WndProcHandler
(
HWND hWnd
,
UINT msg
,
WPARAM wParam
,
LPARAM lParam
)
;
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
void
CALLBACK
PluginFree
(
)
{
ImGui_ImplDX9_Shutdown
(
)
;
ImGui_ImplWin32_Shutdown
(
)
;
ImGui
::
DestroyContext
(
)
;
}
bool
CALLBACK
WndProcHandler
(
HWND hwd
,
UINT msg
,
WPARAM wParam
,
LPARAM lParam
)
{
ImGui_ImplWin32_WndProcHandler
(
hwd
,
msg
,
wParam
,
lParam
)
;
return
true
;
}
HRESULT CALLBACK
Reset
(
D3DPRESENT_PARAMETERS
*
pPresentationParameters
)
{
ImGui_ImplDX9_InvalidateDeviceObjects
(
)
;
return
true
;
}
bool
CALLBACK
Present
(
CONST RECT
*
pSourceRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindowOverride
,
CONST RGNDATA
*
pDirtyRegion
)
{
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
{
static
bool
menu
=
true
,
checkbox
;
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
ImGui
::
SetNextWindowSize
(
ImVec2
(
228
,
228
)
)
;
ImGui
::
Begin
(
"123"
,
&
menu
,
ImGuiWindowFlags_NoResize
|
ImGuiWindowFlags_NoCollapse
)
;
{
ImGui
::
Checkbox
(
"111"
,
&
checkbox
)
;
}
ImGui
::
End
(
)
;
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
SF
->
getRender
(
)
->
EndRender
(
)
;
}
return
true
;
}
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
ImGui
::
CreateContext
(
)
;
ImGui_ImplWin32_Init
(
GetActiveWindow
(
)
)
;
ImGui_ImplDX9_Init
(
SF
->
getRender
(
)
->
getD3DDevice
(
)
)
;
SF
->
getRender
(
)
->
registerD3DCallback
(
eDirect3DDeviceMethods
::
D3DMETHOD_PRESENT
,
Present
)
;
SF
->
getRender
(
)
->
registerD3DCallback
(
eDirect3DDeviceMethods
::
D3DMETHOD_RESET
,
Reset
)
;
SF
->
getGame
(
)
->
registerWndProcCallback
(
SFGame
::
MEDIUM_CB_PRIORITY
,
WndProcHandler
)
;
SF
->
getGame
(
)
->
registerGameDestructorCallback
(
PluginFree
)
;
init
=
true
;
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
return
TRUE
;
}

Dark_Knight
15.01.2021, 20:47
CPP файлы не закинул в проект.

Sana_Minotazaki
15.01.2021, 20:58
Не вижу функи в SF Api на проверку активности курсора как в lua sampIsCursorActive

sc6ut
15.01.2021, 21:23
sampIsCursorActive


SF->getSAMP()->getMisc()->iCursorMode == true/false

а вообще в большинстве случаев, ответ уже есть на форуме, просто стоит воспользоваться поиском 😉

Dark_Knight
16.01.2021, 01:52
SF->getSAMP()->getMisc()->iCursorMode == true/false
а вообще в большинстве случаев, ответ уже есть на форуме, просто стоит воспользоваться поиском 😉


Никаких тру/фолсе там нет. Учи матчасть.

sampSetCursorMode (https://blast.hk/wiki/lua:sampsetcursormode)

Устанавливает режим курсора SAMP

blast.hk

tinkoir
16.01.2021, 12:35
читаю одну книжечку по c++ и вот появился вопрос

в чем выгода работать функциям по адресу структуру, а не по ее значению? использование меньшего количества памяти?

dekname
16.01.2021, 14:26
Как можно установить trampoline hook в удаленный процесс (gta_sa.exe)?

SR_team
21.01.2021, 09:27
читаю одну книжечку по c++ и вот появился вопрос
в чем выгода работать функциям по адресу структуру, а не по ее значению? использование меньшего количества памяти?


Копирование 4х байт вместо всей структуры. Это быстрее



Как можно установить trampoline hook в удаленный процесс (gta_sa.exe)?


Так же, как и в своей, но из-за раздельного адресного пространства для обработки в своем процессе надо будет слать сообщения и блокировать работу процесса игры, из-за чего работать она будет медленнее. Если dll не вариант, то лучше все на ассемблере написать

Compich
24.01.2021, 15:19
Как лучше всего обучиться программированию на Win32 API?

#Northn
24.01.2021, 16:59
Как лучше всего обучиться программированию на Win32 API?


Если такой вопрос задан — прости прощай разработке до тех пор, пока не будут подобные вопросы и будет интерес залезть в поисковики всемирной паутины.

checkdasound
27.01.2021, 00:29
Есть двумерный вектор, нужно узнать, входит ли в него определенная строка или нет.

C++:






std
::
string str
=
"asd"
;
std
::
vector
>
vec
;




В обычном векторе использовал find, думаю, для двумерного тоже надо использовать это, только не могу допереть как именно.

kin4stat
27.01.2021, 00:31
Есть двумерный вектор, нужно узнать, входит ли в него определенная строка или нет.

C++:






string str
=
"asd"
;
std
::
vector
>
vec
;




В обычном векторе использовал find, думаю, для двумерного тоже надо использовать find, только не могу допереть как.



C++:






for
(
auto
&
i
:
vec
)
{
if
(
auto
fnd
=
i
.
find
(
string
)
;
fnd
!=
i
.
end
(
)
)
{
// Ну типа тут твой код окда
}
}

checkdasound
27.01.2021, 00:41
C++:






for
(
auto
&
i
:
vec
)
{
if
(
auto
fnd
=
i
.
find
(
string
)
;
fnd
!=
i
.
end
(
)
)
{
// Ну типа тут твой код окда
}
}





на i.find ругается:

Ошибка E0135 class "std::vector>" не содержит члена "find"

Vintik
27.01.2021, 00:44
Есть двумерный вектор, нужно узнать, входит ли в него определенная строка или нет.

C++:






std
::
string str
=
"asd"
;
std
::
vector
>
vec
;




В обычном векторе использовал find, думаю, для двумерного тоже надо использовать это, только не могу допереть как именно.


Ну если вариант "в лоб", то можно:

C++:






bool
isStringInVector
(
vector
>
yourVector
,
string yourString
)
{
for
(
vector

w
:
yourVector
)
{
for
(
string y
:
w
)
{
if
(
y
==
yourString
)
{
return
true
;
}
}
}
return
false
;
}




В твоём случае перед всеми словами vector и string допиши std::

kin4stat
27.01.2021, 00:46
Ну если вариант "в лоб", то можно:

C++:






bool
isStringInVector
(
vector
>
v
)
{
for
(
vector

int
w
:
v
)
{
for
(
string y
:
w
)
{
if
(
y
==
"твоя строка"
)
{
return
true
;
}
}
}
return
false
;
}





копировать вектор векторов при передаче в функцию, потом копировать вложенный вектор при итерации по вектору векторов, потом еще и копирование строки при итерации по вектору. Красава. 146 динамических аллокаций из 10

Vintik
27.01.2021, 00:48
копировать вектор векторов при передаче в функцию, потом копировать вложенный вектор при итерации по вектору векторов, потом еще и копирование строки при итерации по вектору. Красава. 146 динамических аллокаций из 10


Понятно... По факту.

C++:





[CODE]
bool
isStringInVector
(
vector
>
&
yourVector
,
string
&
yourString
)
{
for
(
int
w
=
0
;
w



Устраивает?

kin4stat
27.01.2021, 00:49
[QUOTE="Vintik"]

Понятно... По факту.

C++:





[CODE]
bool
isStringInVector
(
vector
>
&
yourVector
,
string
&
yourString
)
{
for
(
int
w
=
0
;
w

kin4stat
27.01.2021, 00:56
на i.find ругается:
Ошибка E0135 class "std::vector>" не содержит члена "find"


тоды попробуй вот так:

C++:






#include
#include
for
(
auto
&
i
:
vec
)
{
if
(
auto
fnd
=
std
::
find
(
i
.
begin
(
)
,
i
.
end
(
)
,
str
)
;
fnd
!=
std
::
end
(
i
)
)
{
// Ну типа тут твой код окда
}
}

Dark_Knight
27.01.2021, 04:14
А еще using namespace std


И чем это плохо?)

Compich
27.01.2021, 09:17
Если такой вопрос задан — прости прощай разработке до тех пор, пока не будут подобные вопросы и будет интерес залезть в поисковики всемирной паутины.


Большая проблема БХ в том, что здесь есть куча людей, возомнивших себя если не Страуструпами и Торвальдсами, то программистами рангом чуть пониже

Если я задал такой вопрос, я идиот?

Ещё до того, как зайти на БХ я нашёл кучу сайтов. Элементарный пример - Microsoft Docs. А вопрос этот я задал, чтобы спросить, что могут посоветовать именно пользователи БХ. Может, это будет что-то, что я ещё не успел найти

Повторю вопрос:

Как лучше всего обучиться программированию на Win32 API?

Compich
27.01.2021, 09:17
И чем это плохо?)


Тот парень посоветовал перед каждым вектором написать std:: вместо того, чтобы написать using namespace std

kin4stat
27.01.2021, 09:49
И чем это плохо?)


Засирание неймспейса. Если это будет в h файле, то эта хуета может протянутся на весь проект

Да и вообще считается плохой практикой

Ты вот думаешь никто так нормальный не делает, но мне хватило пару примеров



Большая проблема БХ в том, что здесь есть куча людей, возомнивших себя если не Страуструпами и Торвальдсами, то программистами рангом чуть пониже
Если я задал такой вопрос, я идиот?
Ещё до того, как зайти на БХ я нашёл кучу сайтов. Элементарный пример - Microsoft Docs. А вопрос этот я задал, чтобы спросить, что могут посоветовать именно пользователи БХ. Может, это будет что-то, что я ещё не успел найти
Повторю вопрос:
Как лучше всего обучиться программированию на Win32 API?


проблема не в том что тут страуструпы одни сидят, проблема в том, что ты задал глупый вопрос, по типу «Как кушать кастрюлей»

Vintik
27.01.2021, 13:47
range based цикл по ссылке уже видимо не по канону...
А еще using namespace std
Все еще 146 баллов из 10


Уже придирки. Нэймспейс - нормальная практика, кроме тебя нигде не слышал, что не рекомендуется. Какой-то ты грубый

#Northn
27.01.2021, 14:05
Уже придирки. Нэймспейс - нормальная практика, кроме тебя нигде не слышал, что не рекомендуется. Какой-то ты грубый





Уведомление о переадресации (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9hbXAvcy93d3cuZ2Vla3 Nmb3JnZWVrcy5vcmcvdXNpbmctbmFtZXNwYWNlLXN0ZC1jb25z aWRlcmVkLWJhZC1wcmFjdGljZS9hbXAv)

www.google.com


What's the problem with "using namespace std;"? (https://www.blast.hk/redirect/aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMT Q1MjcyMS93aHktaXMtdXNpbmctbmFtZXNwYWNlLXN0ZC1jb25z aWRlcmVkLWJhZC1wcmFjdGljZQ)

I have heard using namespace std; is wrong, and that I should use std::cout and std::cin directly instead. Why is this? Does it risk declaring variables that share the same name as something in the...

stackoverflow.com

sc6ut
27.01.2021, 14:13
кроме тебя нигде не слышал, что не рекомендуется



Почему "использование пространства имен std;" считается плохой практикой? - CodeRoad (https://www.blast.hk/redirect/aHR0cHM6Ly9jb2Rlcm9hZC5ydS8xNDUyNzIxLyVEMCU5RiVEMC VCRSVEMSU4NyVEMCVCNSVEMCVCQyVEMSU4My11c2luZy1uYW1l c3BhY2Utc3RkLSVEMSU4MSVEMSU4NyVEMCVCOCVEMSU4MiVEMC VCMCVEMCVCNSVEMSU4MiVEMSU4MSVEMSU4Ri0lRDAlQkYlRDAl QkIlRDAlQkUlRDElODUlRDAlQkUlRDAlQjktJUQwJUJGJUQxJT gwJUQwJUIwJUQwJUJBJUQxJTgyJUQwJUI4JUQwJUJBJUQwJUJF JUQwJUI5)

Рассмотрим две библиотеки, называемые Foo и Bar: using namespace foo; using namespace bar; Все работает отлично, и вы можете вызвать Blah() из Foo и Quux() из Bar без проблем. Но однажды вы...

coderoad.ru

Dark_Knight
27.01.2021, 14:53
Засирание неймспейса. Если это будет в h файле, то эта хуета может протянутся на весь проект
Да и вообще считается плохой практикой







Уведомление о переадресации (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9hbXAvcy93d3cuZ2Vla3 Nmb3JnZWVrcy5vcmcvdXNpbmctbmFtZXNwYWNlLXN0ZC1jb25z aWRlcmVkLWJhZC1wcmFjdGljZS9hbXAv)

www.google.com


What's the problem with "using namespace std;"? (https://www.blast.hk/redirect/aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMT Q1MjcyMS93aHktaXMtdXNpbmctbmFtZXNwYWNlLXN0ZC1jb25z aWRlcmVkLWJhZC1wcmFjdGljZQ)

I have heard using namespace std; is wrong, and that I should use std::cout and std::cin directly instead. Why is this? Does it risk declaring variables that share the same name as something in the...

stackoverflow.com



Хех. В целом я с этим согласен, но на этапе разработки я обычно сразу using namespace std использую, чтобы было проще писать и не прописать using std::string, std::vector и т.д. каждый раз, когда я добавляю какой-то елемент с STL. Потом когда результат работы программа работает нормально и её поведение работы меня устраивает, то уже прописывю все юзинги, которые мне нужны и все.

PS: Еще есть такой грех как использование авто где только можно в коде программы :D

checkdasound
28.01.2021, 19:28
Мне нужно организовать файл с информацией, сформированной по секциям и подсекциям. Я выбрал JSON, а для работы с ним выбрал библиотеку nlohmann/json.



Не уверен, что структуру правильно составил, первый раз работаю с этим форматом.

Мне нужно будет вынести информацию только для конкретного сервера, например server1.

Тоесть вынести все группы конкретного сервера и их содержимое в двумерный массив, std::vector> groupColors.

groupColors = j["server1"], вот как это сделать? (j - это nlohmann::json)

JSON:






{
"server1"
:
{
"group1"
:
{
"color1"
:
"FFАААА"
,
"color2"
:
"FFAAFF"
,
"color2"
:
"FFFFFF"
}
,
"group2"
:
{
"color1"
:
"FFАААА"
,
"color2"
:
"FFFFFF"
}
}
,
"server2"
:
{
"group1"
:
{
"color1"
:
"FFАААА"
,
"color2"
:
"FFFFFF"
}
,
"group2"
:
{
"color1"
:
"FFАААА"
,
"color2"
:
"FFFFFF"
}
}
}

SR_team
28.01.2021, 21:20
Мне нужно организовать файл с информацией, сформированной по секциям и подсекциям. Я выбрал JSON, а для работы с ним выбрал библиотеку nlohmann/json.



Не уверен, что структуру правильно составил, первый раз работаю с этим форматом.

Мне нужно будет вынести информацию только для конкретного сервера, например server1.

Тоесть вынести все группы конкретного сервера и их содержимое в двумерный массив, std::vector> groupColors.

groupColors = j["server1"], вот как это сделать? (j - это nlohmann::json)

JSON:






{
"server1"
:
{
"group1"
:
{
"color1"
:
"FFАААА"
,
"color2"
:
"FFAAFF"
,
"color2"
:
"FFFFFF"
}
,
"group2"
:
{
"color1"
:
"FFАААА"
,
"color2"
:
"FFFFFF"
}
}
,
"server2"
:
{
"group1"
:
{
"color1"
:
"FFАААА"
,
"color2"
:
"FFFFFF"
}
,
"group2"
:
{
"color1"
:
"FFАААА"
,
"color2"
:
"FFFFFF"
}
}
}









GitHub - nlohmann/json: JSON for Modern C++ (https://github.com/nlohmann/json#json-as-first-class-data-type)

JSON for Modern C++. Contribute to nlohmann/json development by creating an account on GitHub.

github.com

Hatrig
29.01.2021, 16:39
Уже придирки. Нэймспейс - нормальная практика, кроме тебя нигде не слышал, что не рекомендуется. Какой-то ты грубый



Тоже добавлю, к текущим ответам - using namespace std является плохой практикой по большому счету для больших проектов, хотя это не рекомендуется делать вообще где-либо, потому что делая так - вы сразу огромное количество вещей делаете предопределенными. Нет никакой гарантии, что в дальнейшем вы что-нибудь не напишете такое, что уже имеет смысл в std.

корбус
29.01.2021, 23:57
я только начал писать на c++ но при компиляции пишет что нету d3d9x.h(точно не помню, ну короче директИкс) где его скачать?

RazorRw
30.01.2021, 00:00
я только начал писать на c++ но при компиляции пишет что нету d3d9x.h(точно не помню, ну короче директИкс) где его скачать?


поставь DirectX SDK и поставь в настройках проектах пути до хидеров и либ

корбус
30.01.2021, 01:51
поставь DirectX SDK и поставь в настройках проектах пути до хидеров и либ


а как блять

bottom_text
30.01.2021, 02:21
https://forum.antichat.xyz/attachments/27659546/

Мудрецы, как сделать приколюху выше из луа в сф плагине? При телепорте под землёй появляюсь

upd:

LoadMapAroundPoint()

Нашёл какую-то вроде приколюху, но не понимаю как с ней работать да и та ли.

bottom_text
30.01.2021, 17:33
Как получить свои координаты?

sc6ut
30.01.2021, 20:39
Как получить свои координаты?


если я не ошибаюсь, то вот так. к сожаленую проверить не могу.

C++:






DWORD CPed
=
*
reinterpret_cast

(
0xB6F5F0
)
;
if
(
CPed
!=
NULL
)
{
DWORD CPed_stPos
=
*
reinterpret_cast

(
CPed
+
0x14
)
;
float
CPed_X
=
*
reinterpret_cast

(
CPed_stPos
+
0x30
)
;
float
CPed_Y
=
*
reinterpret_cast

(
CPed_stPos
+
0x34
)
;
float
CPed_Z
=
*
reinterpret_cast

(
CPed_stPos
+
0x38
)
;
}

DarkP1xel
31.01.2021, 10:25
Мудрецы, как сделать приколюху выше из луа в сф плагине? При телепорте под землёй появляюсь



Загрузка сцены по позиции:






auto
cStreaming
::
loadScene
(
const
class
cVector3D
*
pPos
)
->
void
{
reinterpret_cast

(
0x40EB70
)
(
pPos
)
;
return
;
}




Загрузка коллизии сцены по позиции:






auto
cStreaming
::
loadSceneCollision
(
const
class
cVector3D
*
pPos
)
->
void
{
reinterpret_cast

(
0x40ED80
)
(
pPos
)
;
return
;
}






а как блять



Where is the DirectX SDK? - Win32 apps (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG 93cy93aW4zMi9kaXJlY3R4LXNkay0tYXVndXN0LTIwMDktI3Vz aW5nLWRpcmVjdHgtc2RrLXByb2plY3RzLXdpdGgtdmlzdWFsLX N0dWRpbw)

Describes the DirectX SDK's inclusion in the Windows SDK and provides a list of technologies and tools that are now included in the Windows SDK.

docs.microsoft.com


Гуглится по переменной среды DXSDK_DIR

Конкретно пятый абзац.

SR_team
31.01.2021, 10:36
Загрузка сцены по позиции:






auto
cStreaming
::
loadScene
(
const
class
cVector3D
*
pPos
)
->
void
{
reinterpret_cast

(
0x40EB70
)
(
pPos
)
;
return
;
}




Загрузка коллизии сцены по позиции:






auto
cStreaming
::
loadSceneCollision
(
const
class
cVector3D
*
pPos
)
->
void
{
reinterpret_cast

(
0x40ED80
)
(
pPos
)
;
return
;
}




Where is the DirectX SDK? - Win32 apps (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG 93cy93aW4zMi9kaXJlY3R4LXNkay0tYXVndXN0LTIwMDktI3Vz aW5nLWRpcmVjdHgtc2RrLXByb2plY3RzLXdpdGgtdmlzdWFsLX N0dWRpbw)

Describes the DirectX SDK's inclusion in the Windows SDK and provides a list of technologies and tools that are now included in the Windows SDK.

docs.microsoft.com


Гуглится по переменной среды DXSDK_DIR
Конкретно пятый абзац.


Зачем использовать auto ... -> type вне лямбд?

DarkP1xel
31.01.2021, 10:37
Зачем использовать auto ... -> type вне лямбд?


Тупо чтобы везде придерживаться одного стиля

ishi
04.02.2021, 17:25
Ребят, меня тралит компилятор, помогите

Есть функция, чья задача, это при вызове получить аргументы, отправленные в MessageBoxA, и позволить их изменить

Эта функция корректно отображает аргументы, т.е. всё перехватывается

C++:






__declspec
(
naked
)
void
_stdcall
printSomeShit
(
int
a
,
char
*
b
,
char
*
c
,
int
d
)
{
char
bb
[
256
]
;
char
cc
[
256
]
;
printf
(
"\n"
)
;
std
::
cin
>>
bb
;
b
=
bb
;
printf
(
"\n"
)
;
std
::
cin
>>
cc
;
c
=
cc
;
printf
(
"\n%d || %s || %s || %d"
,
a
,
b
,
c
,
d
)
;
_asm ret
;
}




Однако же попытки присваивания не меняют значение аргументов, хотя если в отладчике студии свапнуть адреса, то всё сработает

Я решил посмотреть, что делает в этом случае компилятор, и вот:

https://forum.antichat.xyz/attachments/27663261/

То-есть, он вообще ничего не делает. Он буквально проигнорировал b = bb и не прописал ей инструкций. В смысле? Почему?

Если же попытаться написать &b == &bb, то он даже компилировать программу откажется.

Я не понимаю, что тут происходит ,_,

#Northn
04.02.2021, 18:34
Ребят, меня тралит компилятор, помогите

Есть функция, чья задача, это при вызове получить аргументы, отправленные в MessageBoxA, и позволить их изменить
Эта функция корректно отображает аргументы, т.е. всё перехватывается

C++:






__declspec
(
naked
)
void
_stdcall
printSomeShit
(
int
a
,
char
*
b
,
char
*
c
,
int
d
)
{
char
bb
[
256
]
;
char
cc
[
256
]
;
printf
(
"\n"
)
;
std
::
cin
>>
bb
;
b
=
bb
;
printf
(
"\n"
)
;
std
::
cin
>>
cc
;
c
=
cc
;
printf
(
"\n%d || %s || %s || %d"
,
a
,
b
,
c
,
d
)
;
_asm ret
;
}




Однако же попытки присваивания не меняют значение аргументов, хотя если в отладчике студии свапнуть адреса, то всё сработает
Я решил посмотреть, что делает в этом случае компилятор, и вот:

То-есть, он вообще ничего не делает. Он буквально проигнорировал b = bb и не прописал ей инструкций. В смысле? Почему?

Если же попытаться написать &b == &bb, то он даже компилировать программу откажется.
Я не понимаю, что тут происходит ,_,


ну у тебя как минимум __declspec(naked) а ты объявляешь переменные внутри функции

прибавь к ним static (static char) и проверь, как себя поведёт

мсвс запрещает вообще внутри функций объявлять переменные (не static), значит у тебя не мсвс

sc6ut
10.02.2021, 18:35
Можно ли как-то подменинить функцию хука на пустышку которая вызывает трамплин, чтобы не прервать цепочку вызовов и не поломать чужие хуки и игру?

SR_team
10.02.2021, 18:49
Можно ли как-то подменинить функцию хука на пустышку которая вызывает трамплин, чтобы не прервать цепочку вызовов и не поломать чужие хуки и игру?


можно, я так и делаю в своих хуках

ISYS Tools
10.02.2021, 20:31
Здравствуйте, прошу прощения за оффтоп, это самая близкая по смыслу тема. Хочу сделать что-то типа ракбота, только для другой цели. Есть ли на C#/C/C++ библиотека, позволяющая имитировать клиент сампа и заходить в него?)

kin4stat
10.02.2021, 20:34
Здравствуйте, прошу прощения за оффтоп, это самая близкая по смыслу тема. Хочу сделать что-то типа ракбота, только для другой цели. Есть ли на C#/C/C++ библиотека, позволяющая имитировать клиент сампа и заходить в него?)


RakSAMP (https://github.com/YashasSamaga/RakSAMP)

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

sc6ut
12.02.2021, 17:38
как проиграть звук через bass.lib в определенной позиции?

frosjkee
12.02.2021, 23:55
Не могу изменить значение, не понимаю

Код:






void functions()
{
if (Mouse_Fix)
{
float x;
float y;
ReadProcessMemory(handle, (PBYTE*)0xB6EC1C, &x, 4, 0);
ReadProcessMemory(handle, (PBYTE*)0xB6EC18, &y, 4, 0);
{
WriteProcessMemory(handle, (LPVOID)0xB6EC18, &x, 4, 0);
}
}
}

sc6ut
14.02.2021, 12:09
попробовал проиграть звук в позиции игрока по айди через bass.lib, но не работает, то есть звук проигрывается, но не в позиции игрока. может кто-то знает как исправить?

C++:






float
*
pos
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetOnFootData
(
wPlayerID
)
->
fPosition
;
BASS_ChannelSet3DAttributes
(
stream
,
BASS_3DMODE_NORMAL
,
0.0f
,
0.0f
,
-
1
,
-
1
,
-
1
)
;
BASS_Apply3D
(
)
;
BASS_ChannelSet3DPosition
(
stream
,
new
BASS_3DVECTOR
(
pos
[
0
]
,
pos
[
1
]
,
pos
[
2
]
)
,
NULL
,
NULL
)
;
BASS_Apply3D
(
)
;
BASS_ChannelPlay
(
stream
,
TRUE
)
;

Dark_Knight
14.02.2021, 12:29
Первые 2 вызова не нужны тебе и для расчетов тебе надо юзать еще вот эту функцию насколько я понял. Посмотри как реализованно в samp voice еще

BASS Documentation (https://www.blast.hk/redirect/aHR0cDovL3d3dy51bjRzZWVuLmNvbS9kb2MvI2Jhc3MvQkFTU1 9TZXQzREZhY3RvcnMuaHRtbA)

kin4stat
16.02.2021, 00:06
попробовал проиграть звук в позиции игрока по айди через bass.lib, но не работает, то есть звук проигрывается, но не в позиции игрока. может кто-то знает как исправить?

C++:






float
*
pos
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetOnFootData
(
wPlayerID
)
->
fPosition
;
BASS_ChannelSet3DAttributes
(
stream
,
BASS_3DMODE_NORMAL
,
0.0f
,
0.0f
,
-
1
,
-
1
,
-
1
)
;
BASS_Apply3D
(
)
;
BASS_ChannelSet3DPosition
(
stream
,
new
BASS_3DVECTOR
(
pos
[
0
]
,
pos
[
1
]
,
pos
[
2
]
)
,
NULL
,
NULL
)
;
BASS_Apply3D
(
)
;
BASS_ChannelPlay
(
stream
,
TRUE
)
;






C++:






BASS_Set3DPosition
(
ListenerPosition
,
0
,
0
,
0
)
;
// Установка позиции слушателя
BASS_ChannelSet3DPosition
(
channel
,
&
Pos
,
NULL
,
NULL
)
;
// Установка позиции Канала
BASS_Apply3D
(
)
;

frosjkee
16.02.2021, 03:23
*(DWORD*)((g_dwSAMP_Addr + 0x215AC8)

Carcols.dat samp.dll(0.3.7) - 0x215AC8 адрес не для всех версий, на р3 какой может у кого есть

AdCKuY_DpO4uLa
17.02.2021, 01:23
*(DWORD*)((g_dwSAMP_Addr + 0x215AC8)
Carcols.dat samp.dll(0.3.7) - 0x215AC8 адрес не для всех версий, на р3 какой может у кого есть


samp.dll+0x1169B0 не проверял

Stickey
17.02.2021, 02:01
* (DWORD *) ((g_dwSAMP_Addr + 0x215AC8)
Carcols.dat samp.dll (0.3.7) - 0x215AC8 address not for all versions, which one can have on p3


g_dwSAMP_Addr + 0x26AD28

tor1
17.02.2021, 20:53
Помогите плз, если кто-то сталкивался.

Почему у меня SFPlugin проекте не видит стандартные библиотеки, точнее пишет cant open в error listе, пытался добавить их путь вручную - тоже самое

Может ли быть из-за этого вот этого и как фиксить? Пытался менять под свой билд в самом проекте - библиотеки не видит

1613580710521.pngtor1 · 17 Фев 2021 в 19:53' data-fancybox="lb-post-672760" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/86661/" style="cursor: pointer;" title="1613580710521.png">
https://forum.antichat.xyz/attachments/27672760/

kin4stat
17.02.2021, 20:54
Помогите плз, если кто-то сталкивался.
Почему у меня SFPlugin проекте не видит стандартные библиотеки, точнее пишет cant open в error listе, пытался добавить их путь вручную - тоже самое
Может ли быть из-за этого вот этого и как фиксить? Пытался менять под свой билд в самом проекте - библиотеки не видит


Тебе решение проблемы написало.....

Fomikus
18.02.2021, 23:23
Крч, регаю команду > отправляю в неё строку ( К примеру - "423 758" )

Как получить 2 числа в 2 переменные?

С первым все просто, второе - хз.

regex отказывается хавать. (Ну тут скорее всего я кривой)

AdCKuY_DpO4uLa
18.02.2021, 23:46
C++:






#include
void
__stdcall
cmd
(
std
::
string params
)
{
std
::
stringstream
p
(
params
)
;
int
a
=
0
,
b
=
0
;
p
>>
a
>>
b
;
}

Fomikus
19.02.2021, 05:08
Как перевести цвет игрока в хекс?

Lua:






--Lua
color
=
(
"%06X"
)
:
format
(
bit
.
band
(
sampGetPlayerColor
(
id
)
,
0xFFFFFF
)
)

checkdasound
19.02.2021, 05:31
Как перевести цвет игрока в хекс?

Lua:






--Lua
color
=
(
"%06X"
)
:
format
(
bit
.
band
(
sampGetPlayerColor
(
id
)
,
0xFFFFFF
)
)





если тебе нужно цвет игрока цифрами перевести в 0x..., то это dec to hex.

C++:






std
::
string
DecimalToHeximal
(
int
dec
)
{
char
hex
[
20
]
;
_itoa
(
dec
,
hex
,
16
)
;
return
hex
;
}

kin4stat
19.02.2021, 09:37
если тебе нужно цвет игрока цифрами перевести в 0x..., то это dec to hex.

C++:






std
::
string
DecimalToHeximal
(
int
dec
)
{
char
hex
[
20
]
;
_itoa
(
dec
,
hex
,
16
)
;
return
hex
;
}





Застрелись.

C++:






std
::
string
IntToHexString
(
unsigned
int
digit
)
{
std
::
stringstream Hex
;
Hex



Либо на C++20:

C++:





[CODE]
inline
std
::
string
IntToHexString
(
unsigned
int
digit
)
{
return
std
::
format
(
"{:08X}"
,
digit
)
;
}

SR_team
19.02.2021, 12:12
Застрелись.


Так то его метод быстрее стрима.

А самый быстрый вариант с to_chars/from_chsrs https://en.cppreference.com/w/cpp/utility/to_chars (https://www.blast.hk/redirect/aHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL3V0aW xpdHkvdG9fY2hhcnM)

kin4stat
19.02.2021, 12:51
Так то его метод быстрее стрима.

А самый быстрый вариант с to_chars/from_chsrs https://en.cppreference.com/w/cpp/utility/to_chars (https://www.blast.hk/redirect/aHR0cHM6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL3V0aW xpdHkvdG9fY2hhcnM)


Быстрее, но _itoa это платформозависимая функция, так еще из Си, а также она не может добавить незначащих нулей в начало

to_chars не умеет в добавление нулей в начало и конвертация в hex, а также не особо неудобен в использовании

UPD: to_chars имеет fmt, в котором можно обозначить hex, но все также не умеет в добавление незначащих нулей

Vintik
19.02.2021, 13:15
Быстрее, но _itoa это платформозависимая функция, так еще из Си, а также она не может добавить незначащих нулей в начало
to_chars не умеет в добавление нулей в начало и конвертация в hex, а также не особо неудобен в использовании
UPD: to_chars имеет fmt, в котором можно обозначить hex, но все также не умеет в добавление незначащих нулей


А зачем тебе нули в начале? Последний раз я их использовал в 5 классе, чтобы поприкалываться над учительницей математики.

kin4stat
19.02.2021, 13:21
А зачем тебе нули в начале?


За мясом



("%06X"):format





Последний раз я их использовал в 5 классе, чтобы поприкалываться над учительницей математики.


Как минимум чтобы числа когда ты печатаешь их в лог, были друг под другом, а не в разнобой, самому же удобнее читать, ну

SR_team
19.02.2021, 13:36
_itoa это платформозависимая функция


есть itoa, которая не платформозависимая



не умеет в добавление нулей в начало


а они нужны?



и конвертация в hex


умеет

UPD: Да, заметил, нули ему нужны. Энивей, sprintf возможно будет быстрее стримов, т.к. там нахер не нужные локали

kin4stat
19.02.2021, 14:59
есть itoa, которая не платформозависимая

а они нужны?

умеет

UPD: Да, заметил, нули ему нужны. Энивей, sprintf возможно будет быстрее стримов, т.к. там нахер не нужные локали


Так printf тянет локали ведь

P.S. В своем решение я хотел показать «более плюсовый» метод

Dark_Knight
20.02.2021, 00:17
Застрелись.

C++:





[CODE]
std
::
string
IntToHexString
(
unsigned
int
digit
)
{
std
::
stringstream Hex
;
Hex
1613765960848.pngDark_Knight · 19 Фев 2021 в 23:17' data-fancybox="lb-post-674298" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/86915/" style="cursor: pointer;" title="1613765960848.png">
https://forum.antichat.xyz/attachments/27674298/

[/COLOR]

kin4stat
20.02.2021, 01:32
Я бы еще std::setfill('0') завез в первый вариант







Ну, вдруг оно само там додумается ;D

ishi
20.02.2021, 18:35
Пытаюсь сделать окно, сквозь которое можно кликать.

Состав: imgui на opengl + прозрачное, безрамочное окно windows

Проблема в перенаправлении кликов; на примере рабочего стола, я могу кликнуть на ярлык и выделить его, но через раз окно /оверлея/ получает buttondown без buttonup (согласно spy++ прицепленному к моему окну) и левый клик залипает. При этом, физически он отпущен. Полагаю, я создал мешанину из сигналов, но весь день убил -- понять не могу, что делаю не так

Так же пробовал return 0 вместо обработки вообще любых сигналов, при курсоре не наведённом на имгуи окно (именно имгуи, а не его hwnd), но тогда клики просто не проходят (даже без залипания, просто теряется способность кликать насквозь)

Привязка окна, которое будет за imgui окном, осуществляется так:

C++:






if
(
ImGui
::
IsItemActive
(
)
)
{
lmb_ignore
=
true
;
hwnd_target
=
WindowFromPoint
(
cpos
)
;
GetWindowTextW
(
hwnd_target
,
temp_wchar
,
256
)
;
str
(
temp_wchar
,
256
,
tied_window_text
,
256
)
;
}
else
lmb_ignore
=
false
;




WndProc моего окна:




C++:





[CODE]
if
(
!
(
target_cursor
.
x
>=
overlayWindow
[
1
]
-
10
&&
target_cursor
.
x
=
overlayWindow
[
3
]
-
10
&&
target_cursor
.
y

BASS_DEVSOFTWARE
20.02.2021, 18:35
Assembler // TASM

Вопрос такой: функция 2Ah возвращает дату.

Всё срабатывает, кроме года, возвращает 07E5 ибо dw т.к. db не пропускает. В чём может быть причина?

Код:






title Date (work.asm)

.model small
.stack 100h
.data

dayOfWeek db ?
day db ?
month db ?
year dw ? ; error if " year db ? "

.code
main proc
mov ax,@data
mov ds,ax

mov ah,2Ah
int 21h

mov year,cx ; *
mov month,dh
mov day,dl
mov dayOfWeek,al

; Завершаем
mov ax,4C00h
int 21h
main endp
end main

Gunborg Johansson
20.02.2021, 18:49
Почему месяц, день и день недели в десятичном формате, а год в таком?


dayOfWeek db ?

day db ?

month db ?

year dw ? ; *

BASS_DEVSOFTWARE
20.02.2021, 18:51
dayOfWeek db ?
day db ?
month db ?
year dw ? ; *


Screenshot_7.pngBASS_DEVSOFTWARE · 20 Фев 2021 в 17:51' data-fancybox="lb-post-674758" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/87001/" style="cursor: pointer;" title="Screenshot_7.png">
https://forum.antichat.xyz/attachments/27674758/

Gunborg Johansson
20.02.2021, 18:54
db is a byte, dw is a dword. I don't know why the bytes in your code return a value in decimal, it's strange

BASS_DEVSOFTWARE
20.02.2021, 19:31
https://forum.antichat.xyz/attachments/27674790/

Неверный тип операнда показывает. Да, 4 символа не влезают в db, но и другие директивы не пропускает же.

kin4stat
24.02.2021, 17:50
Здравствуйте.....можно ли найти сигнатуру которую оставляет модуль в процессе (длл аимчик), если в нем нет никакого текста...Перебирать все подряд?


попробуй эти байты:

https://forum.antichat.xyz/attachments/27677881/

SR_team
24.02.2021, 18:38
Неверный тип операнда показывает. Да, 4 символа не влезают в db, но и другие директивы не пропускает же.


У тебя year 1 байт, а cx 2 байта. Попробуй использовать cl

AdCKuY_DpO4uLa
02.03.2021, 22:37
Может есть у кого-нибудь адрес RakPeer::Send для 0.3.7-R1? Можете дать?

Receiver
03.03.2021, 08:48
Может есть у кого-нибудь адрес RakPeer::Send для 0.3.7-R1? Можете дать?


CRakPeer::Send(BitStream, ...) - 0x307F0

CRakPeer::Send2(char* data...) - 0x307A0

Это перегруженная функция, поэтому 2 адреса. Можешь вызывать какой тебе удобно.

Compich
05.03.2021, 17:51
Как отправить сообщение в чат в SAMPFUNCS?

sc6ut
05.03.2021, 18:36
Как отправить сообщение в чат в SAMPFUNCS?




SF->getSAMP()->getPlayers()->pLocalPlayer->Say("говно");

legendabrn
06.03.2021, 18:27
как для имгуя можно использовать кириллицу без u8?

в переменной хранится текст

Код:






ImGui::Text(u8"%s", text);




пытался так, но не получалось

sc6ut
06.03.2021, 19:12
как для имгуя можно использовать кириллицу без u8?
в переменной хранится текст

Код:






ImGui::Text(u8"%s", text);




пытался так, но не получалось


чтобы использовать переменную text в imgui, тебе надо сначало пеконвертировать её из cp1251 в utf8. вот функция, что делает это к примеру:

C++:






std
::
string
CP1251_to_UTF8
(
const
char
*
str
)
{
std
::
string res
;
int
result_u
,
result_c
;
result_u
=
MultiByteToWideChar
(
1251
,
0
,
str
,
-
1
,
0
,
0
)
;
if
(
!
result_u
)
{
return
0
;
}
wchar_t
*
ures
=
new
wchar_t
[
result_u
]
;
if
(
!
MultiByteToWideChar
(
1251
,
0
,
str
,
-
1
,
ures
,
result_u
)
)
{
delete
[
]
ures
;
return
0
;
}
result_c
=
WideCharToMultiByte
(
65001
,
0
,
ures
,
-
1
,
0
,
0
,
0
,
0
)
;
if
(
!
result_c
)
{
delete
[
]
ures
;
return
0
;
}
char
*
cres
=
new
char
[
result_c
]
;
if
(
!
WideCharToMultiByte
(
65001
,
0
,
ures
,
-
1
,
cres
,
result_c
,
0
,
0
)
)
{
delete
[
]
cres
;
return
0
;
}
delete
[
]
ures
;
res
.
append
(
cres
)
;
delete
[
]
cres
;
return
res
;
}

legendabrn
07.03.2021, 13:37
блокировка управления игроком (lockPlayerControl - lua), для плюсов есть адрес?

AdCKuY_DpO4uLa
07.03.2021, 14:08
C++:






void
GTAfunc_TogglePlayerControllable
(
bool
bToggle
)
{
DWORD func
=
0x56E870
;
float
fTen
=
10.0f
;
_asm
{
mov ecx
,
0x00B7CD98
push fTen
push bToggle
call func
}
}

Compich
08.03.2021, 23:47
Как выбрать определенный пункт диалога (DIALOG_STYLE_LIST), нажать первую кнопку, ввести значение в поле диалога (DIALOG_STYLE_INPUT) и опять нажать первую кнопку? (SAMPFUNCS)

sc6ut
09.03.2021, 00:04
Как выбрать определенный пункт диалога (DIALOG_STYLE_LIST), нажать первую кнопку, ввести значение в поле диалога (DIALOG_STYLE_INPUT) и опять нажать первую кнопку? (SAMPFUNCS)


для начала узнаешь айди обоих диалогов

предположим ты узнал и айди первого равен 2011, а айди второго - 2012

C++:






// затем, вставляешь код функцию которая отправляет ответ диалогу
void
send_dialog_responce
(
unsigned
short
id
,
unsigned
char
responce
,
unsigned
short
list_item
,
const
char
*
text
)
{
BitStream bs
;
bs
.
ResetWritePointer
(
)
;
bs
.
Write
(
id
)
;
bs
.
Write
(
responce
)
;
bs
.
Write
(
list_item
)
;
bs
.
Write
(
static_cast

(
strlen
(
text
)
)
)
;
bs
.
Write
(
text
,
strlen
(
text
)
)
;
SF
->
getRakNet
(
)
->
SendRPC
(
RPC_DialogResponse
,
&
bs
)
;
}
// создаешь переменную отвечающую за этап работы плагина, у нее будет значение 1 или 2
static
uint8_t
stage
=
1
;
// регистрируешь колбэк на приходящии RPC в mainloop
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RAKHOOK_TYPE_INCOMING_RPC
,
incomingRPC
)
;
bool
__stdcall
incomingRPC
(
stRakNetHookParams
*
params
)
{
// проверяем айди RPC
if
(
params
->
packetId
==
RPC_ScrShowDialog
)
{
// читаем данные диалога, нам нужен только айди
uint16_t
dialogID
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
dialogID
)
;
// проверяем айди диалога и этап
if
(
dialogID
==
/* айди первого диалога */
2011
&&
stage
==
1
)
{
// меняешь этап на 2
stage
=
2
;
// отправляешь нажатие 1 кнопки
send_dialog_responce
(
dialogID
,
1
,
0
,
""
)
;
// по желанию отключаешь показ диалога
return
false
;
}
else
if
(
dialogID
==
/* айди второго диалога */
2012
&&
stage
==
2
)
{
// меняешь этап на 1
stage
=
1
;
// отправляешь нажатие 1 кнопки и нужный текст, к примеру "test"
send_dialog_responce
(
dialogID
,
1
,
0
,
"test"
)
;
// по желанию отключаешь показ диалога
return
false
;
}
}
return
true
;
}

bottom_text
10.03.2021, 23:18
Где можно посмотреть, какую информацию содержит каждый из RPC/пакетов?


https://github.com/BrunoBM16/samp-packet-list/wiki

kin4stat
10.03.2021, 23:18
https://github.com/BrunoBM16/samp-packet-list/wiki


говно.

bottom_text
10.03.2021, 23:19
говно.


Критикуешь - предлагай

kin4stat
10.03.2021, 23:19
Критикуешь - предлагай


samp.dll reverse

Compich
10.03.2021, 23:21
Спасибо.

Как переподключиться к северу?

#Northn
10.03.2021, 23:27
samp.dll reverse


Samp.lua check sources

legendabrn
11.03.2021, 16:54
C++:






void
GTAfunc_TogglePlayerControllable
(
bool
bToggle
)
{
DWORD func
=
0x56E870
;
float
fTen
=
10.0f
;
_asm
{
mov ecx
,
0x00B7CD98
push fTen
push bToggle
call func
}
}





в луа немножко не этот адрес используется

AdCKuY_DpO4uLa
11.03.2021, 17:52
в луа немножко не этот адрес используется


Это имеет большое значение? Человеку нужно было заблокировать управление игроком, функция вполне справляется с этим

sc6ut
12.03.2021, 10:02
Спасибо.
Как переподключиться к северу?


https://www.blast.hk/threads/15380/ - тут есть исходник реконнекта, можешь глянуть.

EclipsedFlow
13.03.2021, 21:18
Как получить моего персонажа, в луа например 1 или PLAYER_PED?

AdCKuY_DpO4uLa
13.03.2021, 21:21
Как получить моего персонажа, в луа например 1 или PLAYER_PED?


Смотря какое апи, если через адреса, то указатель на локального педа - 0xB6F5F0

Если это SAMPFUNCS, то PEDSELF->

А если plugin SDK, то FindPlayerPed()->

EclipsedFlow
13.03.2021, 21:48
Смотря какое апи, если через адреса, то указатель на локального педа - 0xB6F5F0
Если это SAMPFUNCS, то PEDSELF->
А если plugin SDK, то FindPlayerPed()->



C++:






stRemotePlayer
*
pPlayer
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
PEDSELF
]
;




Так получаеться?

AdCKuY_DpO4uLa
13.03.2021, 21:49
C++:






stRemotePlayer
*
pPlayer
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
PEDSELF
]
;




Так получаеться?


pLocalPlayer

и структура другая

EclipsedFlow
13.03.2021, 21:51
pLocalPlayer
и структура другая


E0020 идентификатор "pLocalPlayer" не определен

AdCKuY_DpO4uLa
13.03.2021, 21:54
E0020 идентификатор "pLocalPlayer" не определен



https://forum.antichat.xyz/attachments/27690589/

C++:






stLocalPlayer
*
pPlayer
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
;

EclipsedFlow
13.03.2021, 22:01
C++:






stLocalPlayer
*
pPlayer
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
;






C++:






if
(
active
)
{
int
car
;
stLocalPlayer
*
pPlayer
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
;
if
(
!
pPlayer
)
return
;
car
=
pPlayer
->
pPlayerData
->
sVehicleID
;
if
(
!
car
)
return
;
}
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка
(
активно
)
E0135
class
"stLocalPlayer"
не содержит члена
"pPlayerData"
SFPlugin

AdCKuY_DpO4uLa
13.03.2021, 22:04
C++:






if
(
active
)
{
unsigned
__int16 car
;
stLocalPlayer
*
pPlayer
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
;
if
(
pPlayer
==
nullptr
)
return
;
car
=
pPlayer
->
sCurrentVehicleID
;
//if (!car) return;//лишнее, т.к. ид машины может быть 0, лучше сделать проверку на то, что игрок в машине
}

kin4stat
13.03.2021, 22:25
Код:






//if (!car) return;//лишнее, т.к. ид машины может быть 0, лучше сделать проверку на то, что игрок в машине





там проверку на 65535 надо сделать (0xFFFF)

EclipsedFlow
13.03.2021, 22:51
Как проверить сидит локальный игрок в машине или нет?

kin4stat
13.03.2021, 22:51
Как проверить сидит локальный игрок в машине или нет?




*reinterpret_cast(0xBA18FC) != nullptr

EclipsedFlow
13.03.2021, 22:57
*reinterpret_cast(0xBA18FC) != nullptr



От куда вы берёте адреса памяти?

DarkP1xel
13.03.2021, 22:58
От куда вы берёте адреса памяти?


gtasa давно разобрали поищи хорошо и найдешь

Vintik
13.03.2021, 23:01
От куда вы берёте адреса памяти?



Адреса Памяти (SA) — GTAModding.ru (https://www.blast.hk/redirect/aHR0cDovL2d0YW1vZGRpbmcucnUvd2lraS8lRDAlOTAlRDAlQj QlRDElODAlRDAlQjUlRDElODElRDAlQjBfJUQwJTlGJUQwJUIw JUQwJUJDJUQxJThGJUQxJTgyJUQwJUI4XyhTQSkjLkQwLkExLk QwLkJGLkQwLkI4LkQxLjgxLkQwLkJFLkQwLkJBXy5EMS44MS5E MS44Mi5EMC5CMC5EMS44Mi5EMC5COC5EMS44Ny5EMC5CRC5EMS 44Qi5EMS44NV8uRDAuQjAuRDAuQjQuRDEuODAuRDAuQjUuRDEu ODEuRDAuQkUuRDAuQjI)

gtamodding.ru

EclipsedFlow
15.03.2021, 10:39
Как перекрасить текст в ImGui?

kin4stat
15.03.2021, 12:13
Как перекрасить текст в ImGui?


TextColored

EclipsedFlow
15.03.2021, 19:11
Кто-то может дать исходник какого-то бота на SF?

Dark_Knight
17.03.2021, 02:47
знает кто функцию которая отвечает за создание chat bubble?


Эмулируй РПЦ как вариант



Кто-то может дать исходник какого-то бота на SF?


Зареженных гвоздей не хочешь?

frosjkee
18.03.2021, 09:41
Почему самп возвращает dword значение ?

как называется функция которая делает машины в игре квадратными

kin4stat
18.03.2021, 09:42
Почему самп возвращает dword значение ?
как называется функция которая делает машины в игре квадратными


Чиво чиво

Shaoron321
18.03.2021, 11:16
Что надо сделать, чтобы этого не было ?




1616051780881.pngShaoron321 · 18 Мар 2021 в 10:16' data-fancybox="lb-post-693478" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/89820/" style="cursor: pointer;" title="1616051780881.png">
https://forum.antichat.xyz/attachments/27693478/
1616051760209.pngShaoron321 · 18 Мар 2021 в 10:16' data-fancybox="lb-post-693478" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/89819/" style="cursor: pointer;" title="1616051760209.png">
https://forum.antichat.xyz/attachments/27693478/

kin4stat
18.03.2021, 12:20
Что надо сделать, чтобы этого не было ?


Общие -> версия windows (выбираешь свой winsdk)

Инструменты сборки -> выбираешь свои

frosjkee
18.03.2021, 12:41
Чиво чиво


if (taim)

{

*(DWORD*)(0xB70153) = timeset;

}

Игра возвращает значение, не могу изменить время в игре, покажите пример пожалуйста

Shaoron321
18.03.2021, 12:48
Вроде все сработало, спасибо. Теперь вопрос: почему этот скрипт не работает в игре?) Это из уроков взято





https://forum.antichat.xyz/attachments/27693512/

checkdasound
18.03.2021, 14:52
if (taim)
{
*(DWORD*)(0xB70153) = timeset;
}

Игра возвращает значение, не могу изменить время в игре, покажите пример пожалуйста


Чтобы закрепить определенное время суток, тебе надо в цикле проверять на соответствие рез-тат чтения адреса и переменную timeset. Если не равны - пиши timeset в адрес. Если установить только один раз, то работать не будет.

kin4stat
18.03.2021, 14:53
Чтобы закрепить определенное время суток, тебе надо в цикле проверять на соответствие рез-тат чтения адреса и переменную timeset. Если не равны - пиши timeset в адрес. Если установить только один раз, то работать не будет.


А можно просто запретить сампу его менять

bottom_text
19.03.2021, 18:58
Добрый вечер. Как возможно реализовать перебор всех игроков в зоне стрима без использования SF? По типу

Lua:






for
k
,
v
in
ipairs
(
getAllChars
(
)
)
do
-- something
end




в луа

imring
19.03.2021, 19:47
Добрый вечер. Как возможно реализовать перебор всех игроков в зоне стрима без использования SF? По типу

Lua:






for
k
,
v
in
ipairs
(
getAllChars
(
)
)
do
-- something
end




в луа


с использованием plugin-sdk: https://github.com/DK22Pac/plugin-sdk/blob/master/plugin_sa/game_sa/CPools.h#L28

пример: https://github.com/THE-FYP/MoonAdditions/blob/master/src/lua_general.cpp#L441

waffelo
21.03.2021, 16:34
Пишу инжектор, столкнулся с проблемой

getprocid:






DWORD
GetProcId
(
const
char
*
procName
)
{
DWORD procId
=
0
;
HANDLE hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
0
)
;
if
(
hSnap
!=
INVALID_HANDLE_VALUE
)
{
PROCESSENTRY32 procEntry
;
procEntry
.
dwSize
=
sizeof
(
procEntry
)
;
if
(
Process32First
(
hSnap
,
&
procEntry
)
)
{
do
{
if
(
!
_stricmp
(
procEntry
.
szExeFile
,
procName
)
)
{
procId
=
procEntry
.
th32ProcessID
;
break
;
}
}
while
(
Process32Next
(
hSnap
,
&
procEntry
)
)
;
}
}
CloseHandle
(
hSnap
)
;
return
procId
;
}




Я понимаю, что char нужно изменять параметр procname, и передавать его wcscmp(), но после того как я делаю появляется другая ошибка

kin4stat
21.03.2021, 16:45
Пишу инжектор, столкнулся с проблемой

getprocid:






DWORD
GetProcId
(
const
char
*
procName
)
{
DWORD procId
=
0
;
HANDLE hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
0
)
;
if
(
hSnap
!=
INVALID_HANDLE_VALUE
)
{
PROCESSENTRY32 procEntry
;
procEntry
.
dwSize
=
sizeof
(
procEntry
)
;
if
(
Process32First
(
hSnap
,
&
procEntry
)
)
{
do
{
if
(
!
_stricmp
(
procEntry
.
szExeFile
,
procName
)
)
{
procId
=
procEntry
.
th32ProcessID
;
break
;
}
}
while
(
Process32Next
(
hSnap
,
&
procEntry
)
)
;
}
}
CloseHandle
(
hSnap
)
;
return
procId
;
}




Я понимаю, что char нужно изменять параметр procname, и передавать его wcscmp(), но после того как я делаю появляется другая ошибка



C++:






DWORD
GetProcId
(
std
::
wstring_view procName
)
{
DWORD procId
=
0
;
HANDLE hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
0
)
;
if
(
hSnap
!=
INVALID_HANDLE_VALUE
)
{
PROCESSENTRY32 procEntry
;
procEntry
.
dwSize
=
sizeof
(
procEntry
)
;
if
(
Process32First
(
hSnap
,
&
procEntry
)
)
{
do
{
if
(
procEntry
.
szExeFile
==
procName
)
{
procId
=
procEntry
.
th32ProcessID
;
break
;
}
}
while
(
Process32Next
(
hSnap
,
&
procEntry
)
)
;
}
}
CloseHandle
(
hSnap
)
;
return
procId
;
}

waffelo
22.03.2021, 22:54
Как убить процесс, если он запущен по функе

C++:






DWORD
GetProcId
(
std
::
string procname
)
{
PROCESSENTRY32 pe
;
HANDLE hSnap
;
pe
.
dwSize
=
sizeof
(
PROCESSENTRY32
)
;
hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
NULL
)
;
if
(
Process32First
(
hSnap
,
&
pe
)
)
{
do
{
if
(
std
::
wstring
(
pe
.
szExeFile
)
==
std
::
wstring
(
procname
.
begin
(
)
,
procname
.
end
(
)
)
)
break
;
}
while
(
Process32Next
(
hSnap
,
&
pe
)
)
;
}
return
pe
.
th32ProcessID
;
}

kin4stat
22.03.2021, 22:59
Как убить процесс, если он запущен по функе

C++:






DWORD
GetProcId
(
std
::
string procname
)
{
PROCESSENTRY32 pe
;
HANDLE hSnap
;
pe
.
dwSize
=
sizeof
(
PROCESSENTRY32
)
;
hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
NULL
)
;
if
(
Process32First
(
hSnap
,
&
pe
)
)
{
do
{
if
(
std
::
wstring
(
pe
.
szExeFile
)
==
std
::
wstring
(
procname
.
begin
(
)
,
procname
.
end
(
)
)
)
break
;
}
while
(
Process32Next
(
hSnap
,
&
pe
)
)
;
}
return
pe
.
th32ProcessID
;
}





Эта функция получается ID процесса, а не создает его

Да и выше же кидали нормальный вариант, зачем ты вызываешь 2 конструктора строки в цикле?

к тому же этот код работать нормально не будет

bottom_text
23.03.2021, 19:57
Как проверить, что самп инициализирован без проверки структур?



C++:






while
(
*
(
DWORD
*
)
0xC8D4C0
!=
9
)
Sleep
(
100
)
;




Вроде так

kin4stat
23.03.2021, 20:03
C++:






while
(
*
(
DWORD
*
)
0xC8D4C0
!=
9
)
Sleep
(
100
)
;




Вроде так


это гта

waffelo
23.03.2021, 20:05
Функа Argb для сампа , кинь если такое есть

kin4stat
23.03.2021, 20:06
Функа Argb для сампа , кинь если такое есть


что?

waffelo
23.03.2021, 20:15
что?


Одним словом , я хочу в меню вставить полоску ргб .

imring
23.03.2021, 20:16
Как проверить, что самп инициализирован без проверки структур?


хукнуть CNetGame::CNetGame:

псевдо код:






void
hooked_construct_cnetgame
(
.
.
.
)
{
hook_cnetgame
->
call_orig
(
.
.
.
)
;
// самп инициализирован
}

Vintik
23.03.2021, 20:17
Одним словом , я хочу в меню вставить полоску ргб .


Хватит мб клоуна корчить. Нельзя нормально расписать чё те надо? Какую полоску, в каком меню, чел, ты..

Dark_Knight
23.03.2021, 21:50
Одним словом , я хочу в меню вставить полоску ргб .


Конкретнее говори.

PanSeek
24.03.2021, 00:20
Добавляю шрифт в SF проект, не получается, крашит.

C++:






//Init
io
.
Fonts
->
AddFontDefault
(
)
;
ImFontConfig config
;
config
.
MergeMode
=
true
;
config
.
GlyphMinAdvanceX
=
13.0f
;
static
const
ImWchar icon_ranges
[
]
=
{
ICON_MIN_FA
,
ICON_MAX_FA
,
0
}
;
io
.
Fonts
->
AddFontFromFileTTF
(
"fonts/fa-solid-900.ttf"
,
13.0f
,
&
config
,
icon_ranges
)
;




Шрифты установлены и в саму папку проекта (../fonts/fa-solid-900.ttf).

Dark_Knight
24.03.2021, 00:29
Надо передавать вроде полный путь и попробуй без дефолтного шрифта.

PanSeek
24.03.2021, 00:36
Надо передавать вроде полный путь и попробуй без дефолтного шрифта.


Я так делал. Загрузило, иконок не было, ну и естественно "u8" не работал.

Dark_Knight
24.03.2021, 00:45
C++:






ImFontConfig _config
;
static
const
ImWchar icons_ranges
[
]
=
{
0xf000
,
0xf3ff
,
0
}
;
_config
.
MergeMode
=
false
;
str
=
string
(
buffer
)
+
"\\Fonts\\consolab.ttf"
;
fs
::
path path
=
fs
::
current_path
(
)
/
"SAMPFUNCS"
/
"All in one"
/
"Kill Informer"
;
io
.
Fonts
->
AddFontFromFileTTF
(
str
.
c_str
(
)
,
16
,
&
_config
,
io
.
Fonts
->
GetGlyphRangesCyrillic
(
)
)
;
vector

v
=
{
"FA 5 Brands"
,
"FA 5 Regular"
,
"FA 5 Solid"
}
;
for
(
const
auto
&
it
:
v
)
{
_config
.
MergeMode
=
true
;
str
=
path
.
string
(
)
+
"\\"
+
it
+
".otf"
;
io
.
Fonts
->
AddFontFromFileTTF
(
str
.
c_str
(
)
,
20
,
&
_config
,
icons_ranges
)
;
}




Для примера. Код 100 процентов рабочий.

waffelo
24.03.2021, 16:04
Всем привет. В общем нужна линия argb, как в ските.





https://forum.antichat.xyz/attachments/27697790/

SR_team
24.03.2021, 16:13
Всем привет. В общем нужна линия argb, как в ските.



Files · thin · Prime-Hack / SAMP / Plugins / Templates / AsiBase · GitLab (https://gitlab.com/prime-hack/samp/plugins/templates/AsiBase/-/blob/thin/d3d9/d3drender.cpp#L1029)

GitLab.com

gitlab.com


Что бы была градиентной, добавь второй цвет перед вторым вертексом, что бы была из нескольких цветов, а не из 2х, добавь третий (и далее) вертекс с отдельным цветом для него.

waffelo
24.03.2021, 20:49
Как убрать отступы?
https://forum.antichat.xyz/attachments/27698018/

Dark_Knight
24.03.2021, 23:13
Как убрать отступы?


А код ты нам показать не хочешь? и не хочешь нам сказать что ты испольуещшь? А может ты хочешь, чтобы за тебя все сделали а ты за это ничего заплатил? Хер тебе. когда задаешь какой-то тут вопрос описывай его как можно конкретней и с примерами. Чем больше инфы ТЫ даш нам, тем больше шансов, что тебе помогут.

dekname
24.03.2021, 23:24
Как можно через sampfuncs/asi достать стандартные координаты камеры на санта мария?

kin4stat
24.03.2021, 23:38
Как можно через sampfuncs/asi достать стандартные координаты камеры на санта мария?



https://forum.antichat.xyz/attachments/27698166/

Musaigen
25.03.2021, 00:30
Как убрать отступы?




ImGui::GetStyle().WindowPadding = ImVec2(0.F, 0.F);

waffelo
26.03.2021, 03:49
Доброй ночи братцы. Подскажите как можно увеличить ширину и высоту текста, вызванной

C++:






if
(
ImGui
::
BeginMenuBar
(
)
)
ImGui
::
TextUnformatted
(
"Load"
)
,
ImGui
::
EndMenuBar
(
)
;




Как можно конвертировать rgb в ImVec4

AdCKuY_DpO4uLa
26.03.2021, 13:15
ImVec4(r,g,b,alpha);

?

Dark_Knight
27.03.2021, 02:30
Доброй ночи братцы. Подскажите как можно увеличить ширину и высоту текста, вызванной

C++:






if
(
ImGui
::
BeginMenuBar
(
)
)
ImGui
::
TextUnformatted
(
"Load"
)
,
ImGui
::
EndMenuBar
(
)
;





Ширину никак. Советую собрать и покурить демо версию имгуи. Скачать можно его с офф. репозитория. Собрать там вообще легко.

kin4stat
27.03.2021, 02:31
Ширину никак.


можно зарендерить на текстуру и потом растянуть ее

AdCKuY_DpO4uLa
27.03.2021, 15:53
Как поставить хук на входящие RPC? Такой код крашит

C++:






void
HandleRPCPacketFunc
(
unsigned
char
id
,
RPCParameters
*
rpcParams
,
void
(
*
callback
)
(
RPCParameters
*
)
)
{
if
(
rpcParams
!=
nullptr
&&
rpcParams
->
numberOfBitsOfData
>=
8
)
{
switch
(
id
)
{
case
93
:
{
pSAMP
->
addMessageToChat
(
-
1
,
"chat msg"
)
;
break
;
}
}
}
callback
(
rpcParams
)
;
}
uint8_t
_declspec
(
naked
)
hook_handle_rpc_packet
(
void
)
{
static
RPCParameters
*
pRPCParams
=
nullptr
;
static
RPCNode_
*
pRPCNode
=
nullptr
;
static
DWORD dwTmp
=
0
;
__asm pushad
;
__asm mov pRPCParams
,
eax
;
__asm mov pRPCNode
,
edi
;
HandleRPCPacketFunc
(
pRPCNode
->
uniqueIdentifier
,
pRPCParams
,
pRPCNode
->
staticFunctionPointer
)
;
dwTmp
=
pSAMP
->
g_SAMPAddr
(
)
+
0x37443
;
__asm popad
;
__asm add esp
,
4
// overwritten code
__asm jmp dwTmp
;
}
Memory
::
CreateJump
(
(
BYTE
*
)
(
pSAMP
->
g_SAMPAddr
(
)
+
0xFF5701
)
,
(
DWORD
)
&
hook_handle_rpc_packet
,
6U
)
;




CreateJump:

C++:






void
Memory
::
CreateJump
(
BYTE
*
pAddress
,
DWORD dwJumpTo
,
DWORD dwLen
)
{
DWORD dwOldProtect
,
dwBkup
,
dwRelAddr
;
VirtualProtect
(
pAddress
,
dwLen
,
PAGE_EXECUTE_READWRITE
,
&
dwOldProtect
)
;
dwRelAddr
=
(
DWORD
)
(
dwJumpTo
-
(
DWORD
)
pAddress
)
-
5
;
*
pAddress
=
0xE9
;
*
(
(
DWORD
*
)
(
pAddress
+
0x1
)
)
=
dwRelAddr
;
for
(
DWORD x
=
0x5
;
x



Уже разобрался. Инициализация такая:

C++:





[CODE]
BYTE
*
bytes
=
(
BYTE
*
)
"\xFF\x57\x01"
;
Memory
::
memcmp_safe
(
(
uint8_t
*
)
pSAMP
->
g_SAMPAddr
(
)
+
0x3743D
,
bytes
,
3
)
;
Memory
::
CreateJump
(
(
BYTE
*
)
(
pSAMP
->
g_SAMPAddr
(
)
+
0x3743D
)
,
(
DWORD
)
&
hook_handle_rpc_packet
,
6U
)
;

Dark_Knight
27.03.2021, 21:07
можно зарендерить на текстуру и потом растянуть ее


Это да, но тогда надо шрифт в текстуру конвертить. В целом, так в большинстве игр используется, но был вопрос задан о шрифте чистом.

kin4stat
27.03.2021, 21:20
Это да, но тогда надо шрифт в текстуру конвертить.


Неа, имгуи поддерживает рендер на текстуре

Dark_Knight
27.03.2021, 21:25
Неа, имгуи поддерживает рендер на текстуре


Опана. С этого момента поподробней. Я про скейл шрифта общий знаю, но вот про такое хз. Удиви всех нас)

waffelo
28.03.2021, 21:20
Добрый вечер, подскажите каким способом можно извлекать из pe файла ресурсы, к примеру dll и дропать её в temp файлы

AdCKuY_DpO4uLa
29.03.2021, 18:54
как получить ид самп игрока через указатель на CPed? использую plugin sdk

AdCKuY_DpO4uLa
29.03.2021, 19:12
хз, мб как-то и связан, CPed же можно по иду получить

C++:






CPed
*
ped
=
CPools
::
GetPed
(
pSAMP
->
getPlayers
(
)
->
pRemotePlayer
[
playerID
]
->
pPlayerData
->
pSAMP_Actor
->
ulGTAEntityHandle
)
;

kin4stat
29.03.2021, 19:13
хз, мб как-то и связан, CPed же можно по иду получить

C++:






CPed
*
ped
=
CPools
::
GetPed
(
pSAMP
->
getPlayers
(
)
->
pRemotePlayer
[
playerID
]
->
pPlayerData
->
pSAMP_Actor
->
ulGTAEntityHandle
)
;





потому что самп хранит эту информацию

Гта про самп вообще не знает, просто работает в обычном для себя режиме

Musaigen
29.03.2021, 19:15
хз, мб как-то и связан, CPed же можно по иду получить

C++:






CPed
*
ped
=
CPools
::
GetPed
(
pSAMP
->
getPlayers
(
)
->
pRemotePlayer
[
playerID
]
->
pPlayerData
->
pSAMP_Actor
->
ulGTAEntityHandle
)
;





pSAMPPed или как его там и есть CPed

sc6ut
29.03.2021, 19:33
хз, мб как-то и связан, CPed же можно по иду получить

C++:






CPed
*
ped
=
CPools
::
GetPed
(
pSAMP
->
getPlayers
(
)
->
pRemotePlayer
[
playerID
]
->
pPlayerData
->
pSAMP_Actor
->
ulGTAEntityHandle
)
;





можешь перебрать всех педов и проверять соотвествие =D

AdCKuY_DpO4uLa
29.03.2021, 20:19
Мб кому-то пригодится. Спасибо всем за ответы

C++:






unsigned
__int16 stPlayerPool
::
GetPlayerIDFromCPed
(
CPed
*
pPed
)
{
if
(
pPed
==
FindPlayerPed
(
)
)
return
pSAMP
->
getPlayers
(
)
->
sLocalPlayerID
;
for
(
unsigned
__int16 i
=
0
;
i
!=
SAMP_MAX_PLAYERS
;
i
++
)
{
if
(
!
pSAMP
->
getPlayers
(
)
->
IsPlayerStreamed
(
i
)
)
continue
;
if
(
pPed
==
(
CPed
*
)
pSAMP
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
)
return
i
;
}
return
0xFFFF
;
}

Receiver
30.03.2021, 15:32
https://forum.antichat.xyz/attachments/27702178/

1617107531863.pngReceiver · 30 Мар 2021 в 14:32' data-fancybox="lb-post-702178" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/91332/" style="cursor: pointer;" title="1617107531863.png">
https://forum.antichat.xyz/attachments/27702178/

Проходит несколько педов и выдаёт access violation на target_position.

waffelo
30.03.2021, 16:01
Вопрос: Можно ли задать координаты ImGui::Image, если да то как.

Возможный ответ: Использовать setcursorpos?

Receiver
30.03.2021, 18:46
Вопрос: Можно ли задать координаты ImGui::Image, если да то как.
Возможный ответ: Использовать setcursorpos?



C++:






ImGui
::
SetCursorPos
(
{
X
,
Y
}
)
;
// Замени на свою позицию
ImGui
::
Image
(
.
.
.
)
;

LUCHARE
31.03.2021, 03:54
как получить ид самп игрока через указатель на CPed? использую plugin sdk


SAMP-API/CPlayerPool.h at multiver · BlastHackNet/SAMP-API · GitHub (https://github.com/BlastHackNet/SAMP-API/blob/multiver/include/sampapi/0.3.7-R1/CPlayerPool.h#L48)

SAMP-API/CPlayerPool.cpp at multiver · BlastHackNet/SAMP-API · GitHub (https://github.com/BlastHackNet/SAMP-API/blob/multiver/src/sampapi/0.3.7-R1/CPlayerPool.cpp#L47)

самый простой способ это использовать метод который уже есть в сампе

ishi
31.03.2021, 19:52
У меня уже мозг расплавился от этой чихарды.

Имеется старая игра warzone2100, где по указателю хранится строка

https://forum.antichat.xyz/attachments/27703366/

Это однобайтовая кодировка, но лишь cheat engine выводит её нормально

Читая её как char*, я получаю козяблики

Выводя её через opengl рендер, вижу тоже самое, что и через MessageBoxA

CharToOem и наоборот -- никак не помогают прочитать эту чёртову строку.

Нагуглил функцию "определения кодировки", и по её показаниям, это не ascii и не ut8




C++:






enum
DetectedCoding
{
ASCII
,
UTF8
,
OTHER
}
;
DetectedCoding
DetectEncoding
(
const
std
::
string
&
s
)
{
const
char
*
cs
=
s
.
c_str
(
)
;
DetectedCoding d
=
ASCII
;
while
(
*
cs
)
{
unsigned
char
b
=
(
unsigned
char
)
*
(
cs
++
)
;
if
(
b
&
0x80
)
{
// not a plain ASCII character
// if the string is already UTF8 encoded, then it must conform to a multibyte sequence standard. Let's verify it
if
(
b





Это совершенно точно НЕ мой косяк при чтении, потому что все указатели проверяются, и чтение происходит, лишь когда курсор наведён на иконку элемента, обладающего строкой по нужному оффсету:

C++:





[CODE]
int
*
ptr
=
(
int
*
)
(
(
char
*
)
GetModuleHandleA
(
0
)
+
0x9C4EE0
)
;
int
lastnumber
=
0
;
int
*
elid2
=
0
;
char
*
buff2
=
0
;
bool
checkptr
(
)
{
if
(
*
ptr
==
0
)
return
0
;
elid2
=
(
int
*
)
(
*
ptr
+
8
)
;
if
(
*
elid2
)
{
buff2
=
(
char
*
)
(
*
ptr
+
0xD4
)
;
if
(
*
(
int
*
)
elid2
>=
IDSTAT_START
)
if
(
*
(
int
*
)
elid2



Отчаянно прошу помощи! Нихрена нагуглить не смог, все мне известные способы конвертации -- тоже не работают! Ужасно!

kin4stat
31.03.2021, 20:30
У меня уже мозг расплавился от этой чихарды.

Имеется старая игра warzone2100, где по указателю хранится строка

Это однобайтовая кодировка, но лишь cheat engine выводит её нормально

Читая её как char*, я получаю козяблики
Выводя её через opengl рендер, вижу тоже самое, что и через MessageBoxA

CharToOem и наоборот -- никак не помогают прочитать эту чёртову строку.

Нагуглил функцию "определения кодировки", и по её показаниям, это не ascii и не ut8
[QUOTE="Спойлер"]


C++:






enum
DetectedCoding
{
ASCII
,
UTF8
,
OTHER
}
;
DetectedCoding
DetectEncoding
(
const
std
::
string
&
s
)
{
const
char
*
cs
=
s
.
c_str
(
)
;
DetectedCoding d
=
ASCII
;
while
(
*
cs
)
{
unsigned
char
b
=
(
unsigned
char
)
*
(
cs
++
)
;
if
(
b
&
0x80
)
{
// not a plain ASCII character
// if the string is already UTF8 encoded, then it must conform to a multibyte sequence standard. Let's verify it
if
(
b





Это совершенно точно НЕ мой косяк при чтении, потому что все указатели проверяются, и чтение происходит, лишь когда курсор наведён на иконку элемента, обладающего строкой по нужному оффсету:

C++:





[CODE]
int
*
ptr
=
(
int
*
)
(
(
char
*
)
GetModuleHandleA
(
0
)
+
0x9C4EE0
)
;
int
lastnumber
=
0
;
int
*
elid2
=
0
;
char
*
buff2
=
0
;
bool
checkptr
(
)
{
if
(
*
ptr
==
0
)
return
0
;
elid2
=
(
int
*
)
(
*
ptr
+
8
)
;
if
(
*
elid2
)
{
buff2
=
(
char
*
)
(
*
ptr
+
0xD4
)
;
if
(
*
(
int
*
)
elid2
>=
IDSTAT_START
)
if
(
*
(
int
*
)
elid2

ishi
31.03.2021, 23:40
Покажи строку в hex виде в hex view у cheatengine


Вот, например:

Код:






46 75 65 6C 20 49 6E 6A 65 63 74 69 6F 6E 20 45 6E 67 69 6E 65 20 4D 6B 33 0A 43 6F 73 74 3A 20 31 35 30 00 6F 00 75 00 6E 00




Код:






Fuel Injection Engine Mk3
Cost: 150

kin4stat
31.03.2021, 23:43
Вот, например:

Код:






46 75 65 6C 20 49 6E 6A 65 63 74 69 6F 6E 20 45 6E 67 69 6E 65 20 4D 6B 33 0A 43 6F 73 74 3A 20 31 35 30 00 6F 00 75 00 6E 00




Код:






Fuel Injection Engine Mk3
Cost: 150





ты явно в коде делаешь что-то не так:

1617219774434.pngkin4stat · 31 Мар 2021 в 22:43' data-fancybox="lb-post-703607" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/91536/" style="cursor: pointer;" title="1617219774434.png">
https://forum.antichat.xyz/attachments/27703607/

ishi
01.04.2021, 09:57
ты явно в коде делаешь что-то не так:


А вот, едрись оно конём, хрен его знает, что я делаю не так, если ты прав!




https://forum.antichat.xyz/attachments/27703755/






C++:






BOOL __stdcall PHook
::
hkSwapBuffers
(
_In_ HDC hdc
)
{
if
(
!
init
)
{
//MessageBox(NULL, "1", "2", MB_OK);
init
=
true
;
}
HWND hwnd
=
GetForegroundWindow
(
)
;
if
(
hwnd
&&
checkptr
(
)
)
{
POINT cur
;
GetCursorPos
(
&
cur
)
;
ScreenToClient
(
hwnd
,
&
cur
)
;
PHook
::
SetupOrtho
(
)
;
glShadeModel
(
GL_SMOOTH
)
;
/*glBegin(GL_QUADS);
glColor4f(1.0F, 0.0F, 0.5F, 0.5F);
glVertex2f(cur.x + 50, cur.y + 30);
glVertex2f(cur.x + 250.0, cur.y + 30);
glVertex2f(cur.x + 250.0, cur.y + 250.0);
glVertex2f(cur.x + 50, cur.y + 250.0);
glEnd();*/
glColor4f
(
0.5F
,
7.0F
,
0.1F
,
1.0F
)
;
wglUseFontBitmaps
(
hdc
,
0
,
256
,
1000
)
;
glRasterPos2f
(
cur
.
x
+
30.0
,
cur
.
y
+
65.0
)
;
glListBase
(
1000
)
;
/*int screen[2];
glGetIntegerv(GL_VIEWPORT, screen);*/
char
totxt
[
256
]
;
char
totxt2
[
256
]
;
memset
(
totxt
,
0
,
256
)
;
OemToCharA
(
buff2
,
totxt
)
;
CharToOemA
(
buff2
,
totxt2
)
;
glCallLists
(
10
,
GL_UNSIGNED_BYTE
,
totxt
)
;
glRasterPos2f
(
cur
.
x
+
30.0
,
cur
.
y
+
80.0
)
;
glCallLists
(
20
,
GL_UNSIGNED_BYTE
,
buff2
)
;
glRasterPos2f
(
cur
.
x
+
30.0
,
cur
.
y
+
95.0
)
;
glCallLists
(
20
,
GL_UNSIGNED_BYTE
,
totxt2
)
;
glFlush
(
)
;
glDeleteLists
(
1000
,
256
)
;
PHook
::
Restore
(
)
;
}
return
oSwapBuffers
(
hdc
)
;
}







Как видно, я вывожу сразу три варианта: и оригинал, и два вида перекодирования. И все три идентичны, и выводится какая-то кракозябра. Чёрт-те знает, что происходит. У меня уже даже идей нет, я вообще всё перепробовал, что в голову приходило.

ЧУВАК, ТЫ ТАКАЯ КИСА, СПАСИБО!

ТЫ МЕНЯ НАТОЛКНУЛ НА НЕСКОЛЬКО НОВЫХ ИДЕЙ ДЛЯ ПРОВЕРКИ, И Я ЗАМЕТИЛ, ЧТО ЗАБЫЛ ВСЕГО ОДИН УРОВЕНЬ УКАЗАТЕЛЯ РАЗЫМЕНОВАТЬ

buff2 это не char*, а char**, едрёна мать, и я всё это время думал, что проблема где-то в другом месте. Капец пиздец.

В ЛЮБОМ СЛУЧАЕ СПАСИБО, БОЖЕ, КАК ЭТО КРУТО




https://forum.antichat.xyz/attachments/27703755/

Krisp
01.04.2021, 16:29
Как можно удалить искру от пули. Именно искру попадания в стену, а не трассер

Dark_Knight
02.04.2021, 22:27
Как можно удалить искру от пули. Именно искру попадания в стену, а не трассер


Надо не удалять, а не вызывать создания искры от пули. Ищешь адресс в плагин СДК(без знаний примитивного английского и логики поиска хер найдешь) и когда нужно на него ставишь ноп. Это я лишь логику работы описал. Не сам рабочий код.

SR_team
02.04.2021, 22:35
Как можно удалить искру от пули. Именно искру попадания в стену, а не трассер


А может просто возьмешь сурс моего аима и отправишь пулю куда тебе надо?

DS.
03.04.2021, 13:56
Как сделать проверку на стан?

RazorRw
03.04.2021, 14:01
Как сделать проверку на стан?



AntiStun/AntiStun/dllmain.cpp at master · kin4stat/AntiStun (https://github.com/KiN4StAt/AntiStun/blob/master/AntiStun/dllmain.cpp)

Contribute to kin4stat/AntiStun development by creating an account on GitHub.

github.com


тут есть

imring
05.04.2021, 23:46
memset(*reinterpret_cast(0x74872D), 0x90, 9);




memset(reinterpret_cast(0x74872D), 0x90, 9);

AdCKuY_DpO4uLa
08.04.2021, 19:47
C++:






char
*
p
=
new
char
[
128
]
;
strcat
(
p
,
"123123123123123123123123123123123123"
)
;
printf
(
"%s\n"
,
p
)
;
delete
[
]
p
;
printf
(
"%s\n"
,
p
)
;
p
=
nullptr
;




почему p не чистится после delete[] p; ?

если гуглить динамические массивы, то по первой же ссылке будет:

C++:





[CODE]
int
num
;
// размер массива
cout
>
num
;
// получение от пользователя размера массива
int
*
p_darr
=
new
int
[
num
]
;
// Выделение памяти для массива
for
(
int
i
=
0
;
i



https://forum.antichat.xyz/attachments/27709735/

SR_team
08.04.2021, 19:56
[QUOTE="AdCKuY_DpO4uLa"]

C++:






char
*
p
=
new
char
[
128
]
;
strcat
(
p
,
"123123123123123123123123123123123123"
)
;
printf
(
"%s\n"
,
p
)
;
delete
[
]
p
;
printf
(
"%s\n"
,
p
)
;
p
=
nullptr
;




почему p не чистится после delete[] p; ?
если гуглить динамические массивы, то по первой же ссылке будет:

C++:





[CODE]
int
num
;
// размер массива
cout
>
num
;
// получение от пользователя размера массива
int
*
p_darr
=
new
int
[
num
]
;
// Выделение памяти для массива
for
(
int
i
=
0
;
i

DS.
10.04.2021, 00:12
код репаира кара если можно

kin4stat
10.04.2021, 00:15
код репаира кара если можно



mtasa-blue/Client/game_sa/CVehicleSA.cpp at 5c9b50fa4c7ef0592cf3338dd8f5fc87660b3c06 · multitheftauto/mtasa-blue (https://github.com/multitheftauto/mtasa-blue/blob/5c9b50fa4c7ef0592cf3338dd8f5fc87660b3c06/Client/game_sa/CVehicleSA.cpp#L1552)

Multi Theft Auto is a game engine that turns Grand Theft Auto: San Andreas into networked multiplayer. - multitheftauto/mtasa-blue

github.com


mtasa-blue/Client/game_sa/CVehicleSA.h at 5c9b50fa4c7ef0592cf3338dd8f5fc87660b3c06 · multitheftauto/mtasa-blue (https://github.com/multitheftauto/mtasa-blue/blob/5c9b50fa4c7ef0592cf3338dd8f5fc87660b3c06/Client/game_sa/CVehicleSA.h#L404)

Multi Theft Auto is a game engine that turns Grand Theft Auto: San Andreas into networked multiplayer. - multitheftauto/mtasa-blue

github.com

SR_team
13.04.2021, 16:55
Есть у кого-нибудь адрес onfoot рейтов для r3 сампа? Нашел в собейте, но в апи лучара нету


ну так перенеси из собейта. В чем твоя проблема?

Lil Xean
14.04.2021, 13:04
есть структура данных типа стек, нужно заполнить его целыми числами до n-го, вывести, вырезать чётные элементы, и опять вывести.

не смог найти годных статей, потому обращаюсь сюда, был бы благодарен за помощь.

C++:






struct
stack
{
int
data
;
stack
*
next
;
}
;

repugnantbytheway
14.04.2021, 15:08
Reset remove building count (https://www.blast.hk/threads/18967/)

Убирает краш, связанный с переполнением буфера RPC_ScrRemoveBuildingForPlayer, при частых переподключениях.

www.blast.hk


как работает этот плагин? как-то очищает буфер при каждом реконнекте?

Cake_
14.04.2021, 18:15
Reset remove building count (https://www.blast.hk/threads/18967/)

Убирает краш, связанный с переполнением буфера RPC_ScrRemoveBuildingForPlayer, при частых переподключениях.

www.blast.hk


как работает этот плагин? как-то очищает буфер при каждом реконнекте?






C:






void
__cdecl __noreturn
patch
(
)
{
HMODULE sampaddr
;
// esi
DWORD prot
;
// [esp-8h] [ebp-20h]
DWORD flOldProtect
;
// [esp+Ch] [ebp-Ch] BYREF
DWORD flNewProtect
;
// [esp+10h] [ebp-8h] BYREF
for
(
sampaddr
=
GetModuleHandleA
(
"samp.dll"
)
;
!
sampaddr
;
sampaddr
=
GetModuleHandleA
(
"samp.dll"
)
)
Sleep
(
1000u
)
;
VirtualProtect
(
(
LPVOID
)
0x7BA917
,
0xDu
,
0x40u
,
&
flOldProtect
)
;
MEMORY
[
0x7BA917
]
=
'%\x83'
;
MEMORY
[
0x7BA919
]
=
sampaddr
+
'\x04\xEEV'
;
MEMORY
[
0x7BA91D
]
=
'\xC5\x8E\x8B\0'
;
MEMORY
[
0x7BA921
]
=
'\x03'
;
MEMORY
[
0x7BA923
]
=
'\0'
;
VirtualProtect
(
(
LPVOID
)
0x7BA917
,
2u
,
flOldProtect
,
0
)
;
VirtualProtect
(
(
LPVOID
)
0x7BA924
,
5u
,
0x40u
,
&
flNewProtect
)
;
MEMORY
[
0x7BA925
]
=
(
char
*
)
sampaddr
+
0xFF84F80E
;
MEMORY
[
0x7BA924
]
=
'\xE9'
;
VirtualProtect
(
(
LPVOID
)
0x7BA924
,
5u
,
flNewProtect
,
0
)
;
VirtualProtect
(
(
char
*
)
sampaddr
+
0xA131
,
6u
,
0x40u
,
&
flNewProtect
)
;
prot
=
flNewProtect
;
*
(
(
_BYTE
*
)
sampaddr
+
0xA131
)
=
'\xE9'
;
*
(
_DWORD
*
)
(
(
char
*
)
sampaddr
+
0xA132
)
=
0x7BA912
-
(
(
_DWORD
)
sampaddr
+
0xA131
)
;
*
(
(
_BYTE
*
)
sampaddr
+
0xA136
)
=
'\x90'
;
VirtualProtect
(
(
char
*
)
sampaddr
+
0xA131
,
6u
,
prot
,
0
)
;
FreeLibraryAndExitThread
(
hLibModule
,
0
)
;
}

Cake_
14.04.2021, 19:05
есть структура данных типа стек, нужно заполнить его целыми числами до n-го, вывести, вырезать чётные элементы, и опять вывести.
не смог найти годных статей, потому обращаюсь сюда, был бы благодарен за помощь.

C++:






struct
stack
{
int
data
;
stack
*
next
;
}
;






stack imp:





[CODE]
#include
using
namespace
std
;
#define MAX 10
class
Stack
{
int
top
;
public
:
int
a
[
MAX
]
;
Stack
(
)
{
top
=
-
1
;
}
bool
push
(
int
x
)
;
int
pop
(
)
;
int
peek
(
)
;
bool
isEmpty
(
)
;
}
;
bool
Stack
::
push
(
int
x
)
{
if
(
top
>=
(
MAX
-
1
)
)
{
return
false
;
}
else
{
a
[
++
top
]
=
x
;
cout



чтобы не мучать голову со своим классом стака(если не требуется создавать его самому) - то используй std::stack (https://www.blast.hk/redirect/aHR0cDovL3d3dy5jcGx1c3BsdXMuY29tL3JlZmVyZW5jZS9zdG Fjay9zdGFjay9zdGFjay8)

sc6ut
14.04.2021, 19:33
struct stack { int data; stack* next; };


это не стек, а linked list

Cake_
14.04.2021, 21:28
Что это за треш, думаю не стоит приводить в пример такую ебанутую реализацию


я ниже писал про современный метод

upd:

C++:





[CODE]
#include
#include
const
int
CONST_MAX_SIZE
=
10
;
int
main
(
)
{
std
::
stack

stackInst
;
std
::
stack

stackBuffer
;
for
(
size_t i
=
0
;
i

frosjkee
18.04.2021, 12:53
Я не понимаю как использовать sampapi, пожалуйста кто шарит за этот кал покажите будет выглядеть готовое решение, чтобы понять как с этим работать



C:






[
/
B
]
{
Sleep
(
1
)
;
}
sampapi
::
v037r3
::
RefNetGame
(
)
->
m_pSettings
->
m_bNoNametagsBehindWalls
=
true
;
}

sc6ut
18.04.2021, 15:31
этот кал


если SAMP API это кал, зачем его юзать?

frosjkee
18.04.2021, 16:12
если SAMP API это кал, зачем его юзать?


Нет другого апи



Если тебе нужно включить отображение ников через стены, то нужно ставить false


Вы можете исправить код ?

он имеет ошибку

kin4stat
18.04.2021, 19:39
этот кал


Если ты не умеешь водить на механике, а только на автомате - это ты тупой, а не МКПП

frosjkee
18.04.2021, 19:42
Если ты не умеешь водить на механике, а только на автомате - это ты тупой, а не МКПП


зач ты оффтопишь если знаешь помоги, объясни, покажи как нужно

Dark_Knight
18.04.2021, 20:00
если SAMP API это кал, зачем его юзать?


Затем что ты придурок.



Я не понимаю как использовать sampapi, пожалуйста кто шарит за этот кал покажите будет выглядеть готовое решение, чтобы понять как с этим работать



C:






[
/
B
]
{
Sleep
(
1
)
;
}
sampapi
::
v037r3
::
RefNetGame
(
)
->
m_pSettings
->
m_bNoNametagsBehindWalls
=
true
;
}







Нахера ты юзаешь sleep? Кидай весь код нам. Поможем.

frosjkee
18.04.2021, 20:21
Затем что ты придурок.

Нахера ты юзаешь sleep? Кидай весь код нам. Поможем.


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



C:






[
/
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
;
}

PanSeek
21.04.2021, 16:34
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
;
}

ufdhbi
21.04.2021, 16:41
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
;
}





ставить хук на диалог

PanSeek
21.04.2021, 16:58
ставить хук на диалог


Можешь объяснить как?

Просто это локальный диалог и в том же 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

ufdhbi
21.04.2021, 17:00
Можешь объяснить как?
Просто это локальный диалог и в том же 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 (https://www.blast.hk/threads/23413/)

Введение RakNet — это сетевой движок, используемый в SA:MP для обмена данными между игроками и сервером. Клиент отправляет пакет серверу, сервер его обрабатывает и рассылает другим игрокам — таким образом это работает. В этом уроке я покажу, как отправлять свои пакеты и заносить в них данные...

www.blast.hk

Musaigen
21.04.2021, 17:07
Так же как и на серверный диалог, на вики есть пример на SF

Гайд - API SF | Урок 4 - RakNet (https://www.blast.hk/threads/23413/)

Введение 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);

Rei
21.04.2021, 20:30
Как в 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
(
)
;
// код
}

imring
21.04.2021, 21:04
Как в 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

PanSeek
24.04.2021, 18:33
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
)
;

Musaigen
24.04.2021, 20:00
Также видел такую функцию в полезных сниппетах для 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
}






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






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




Вроде бы этого достаточно.

frosjkee
25.04.2021, 12:09
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
;
}

PanSeek
25.04.2021, 16:37
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 нужно

kin4stat
25.04.2021, 17:06
В C++ я конечно не силен, но что-то мне подсказывает, что тут можно не использовать поток.


из DllMain WNDPROC хук не поставишь, если аси лоадером подргужать, к тому моменту окно игры еще не создано

frosjkee
25.04.2021, 18:55
В 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 нужно





Спасибо за помощь друголек, однако я неправильно вызываю функцию в этом коде и я не знаю как.

Krisp
26.04.2021, 23:20
Ребят, может кто помочь фиксануть аимбот к ближайшей кости? У меня некоторые проблемки, черканите в лс, тк код не маленький

bottom_text
26.04.2021, 23:27
Как включить и выключить нормально такой курсор для ImGui окна без plugin sdk? Код kin4stat'a отсюда (https://www.blast.hk/threads/64950/) не выключает его

https://forum.antichat.xyz/attachments/27726558/

AdCKuY_DpO4uLa
27.04.2021, 00:05
Создал проект через plugin sdk, не вызывается

Events::gameProcessEvent += [] {

//...

};

Dark_Knight
27.04.2021, 00:09
Создал проект через plugin sdk, не вызывается
Events::gameProcessEvent += [] {
//...
};


В сампе он не работает. Спасибо калхую за это.

AdCKuY_DpO4uLa
27.04.2021, 01:17
Как включить и выключить нормально такой курсор для ImGui окна без plugin sdk? Код kin4stat'a отсюда (https://www.blast.hk/threads/64950/) не выключает его



C++:






//enable
pSAMP
->
toggleSAMPCursor
(
1
)
;
ImGui
::
GetIO
(
)
.
MouseDrawCursor
=
1
;
ImGui
::
GetIO
(
)
.
ConfigFlags
&=
~
ImGuiConfigFlags_NoMouseCursorChange
;
//disable
pSAMP
->
toggleSAMPCursor
(
0
)
;
ImGui
::
GetIO
(
)
.
MouseDrawCursor
=
0
;
ImGui
::
GetIO
(
)
.
ConfigFlags
|=
ImGuiConfigFlags_NoMouseCursorChange
;




toggleSAMPCursor (https://github.com/grimesfive/overlight_fork/blob/1617a1b1c6ded2235d357720f8561c5ab9e8611d/samp.cpp#L846)

PanSeek
27.04.2021, 13:51
SF. Как получить с радара определенную иконку? ID иконок - https://www.mta-resource.ru/wiki/article/id/13 (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cubXRhLXJlc291cmNlLnJ1L3dpa2kvYXJ0aW NsZS9pZC8xMw)

Пробовал вот так:

GAME->GetRadar()->GetMarker(RADAR_SPRITE_MAP_HERE);

и вот так

GAME->GetRadar()->GetMarker(2);


При взаимодействии иконки, он работал с иконками других игроков/транспорта которые возле меня.

Если я правильно понял, то я получаю не иконки, а маркеры (я думал что одно и тоже). Как я понял мне нужны спрайты, а их получить не могу, только SetSprite есть.

Musaigen
27.04.2021, 16:01
спрайты


Возможно это: https://github.com/DK22Pac/plugin-s...d8af6f150f09/plugin_sa/game_sa/CRadar.cpp#L22 (https://github.com/DK22Pac/plugin-sdk/blob/7a6816fcb352153dcdb67679c6dcd8af6f150f09/plugin_sa/game_sa/CRadar.cpp#L22)

Krisp
28.04.2021, 18:57
У меня есть функция:

GetAimingPlayer:






void
CAimbot
::
GetAimingPlayer
(
)
{
iTargetPlayer
=
-
1
;
float
fNearestDistance
=
9999.0f
;
// тут шлак бесполезный, смотри с нижнего комментария
if
(
g_Config
.
g_Aimbot
.
bAimbot
||
g_Config
.
g_Aimbot
.
bSmooth
||
g_Config
.
g_Aimbot
.
bSilent
||
g_Config
.
g_Aimbot
.
bProAim
)
{
CVector vecCamera
,
vecOrigin
,
vecTarget
;
Utils
::
getBonePosition
(
FindPlayerPed
(
)
,
BONE_RIGHTWRIST
,
&
vecOrigin
)
;
TheCamera
.
Find3rdPersonCamTargetVector
(
100.f
,
vecOrigin
,
&
vecCamera
,
&
vecTarget
)
;
for
(
int
i
=
0
;
i

isPlayerStreamed
(
i
)
)
continue
;
CPed
*
pPed
=
CPools
::
GetPed
(
pSAMP
->
getPlayers
(
)
->
pRemotePlayer
[
I
]
->
pPlayerData
->
pSAMP_Actor
->
ulGTAEntityHandle
)
;
if
(
!
pPed
||
!
pPed
->
IsAlive
(
)
)
continue
;
if
(
g_Config
.
g_Aimbot
.
bTeamProtect
&&
pSAMP
->
getPlayerColor
(
i
)
==
pSAMP
->
getPlayerColor
(
pSAMP
->
getPlayers
(
)
->
sLocalPlayerID
)
)
continue
;
if
(
!
g_Config
.
g_Aimbot
.
bIgnoreEverything
)
{
if
(
g_Config
.
g_Aimbot
.
bIgnoreAFK
&&
pSAMP
->
getPlayers
(
)
->
pRemotePlayer
[
I
]
->
pPlayerData
->
iAFKState
==
2
)
continue
;
float
fTargetDistance
=
Math
::
vect3_dist
(
&
pSAMP
->
getPlayers
(
)
->
pRemotePlayer
[
I
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
->
base
.
matrix
[
12
]
,
&
pSAMP
->
getPlayers
(
)
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
->
base
.
matrix
[
12
]
)
;
if
(
!
g_Config
.
g_Aimbot
.
bIgnoreMaxDistance
&&
fTargetDistance
>
fWeaponRange
[
pSAMP
->
getPlayers
(
)
->
pLocalPlayer
->
byteCurrentWeapon
]
)
continue
;
}
// Сам захват кости начинается отсюда
for
(
auto
iBone
:
iBoneList
)
{
CVector vecBone
,
vecBoneScreen
;
Utils
::
getBonePosition
(
pPed
,
(
ePedBones
)
iBone
,
&
vecBone
)
;
Utils
::
CalcScreenCoors
(
&
vecBone
,
&
vecBoneScreen
)
;
if
(
vecBoneScreen
.
z
=
(
float
)
g_Config
.
g_Aimbot
.
iAimbotConfig
[
pSAMP
->
getPlayers
(
)
->
pLocalPlayer
->
byteCurrentWeapon
]
[
CRANGE
]
*
1.5f
)
continue
;
if
(
!
g_Config
.
g_Aimbot
.
bIgnoreEverything
&&
!
g_Config
.
g_Aimbot
.
bLockThroughObjects
&&
!
CWorld
::
GetIsLineOfSightClear
(
vecCamera
,
vecBone
,
true
,
true
,
false
,
true
,
true
,
true
,
false
)
)
continue
;
if
(
fCentreDistance



Вот содержимое iBoneList[]:

C++:





[CODE]
static
int
iBoneList
[
]
{
BONE_PELVIS1
,
BONE_PELVIS
,
BONE_SPINE1
,
BONE_UPPERTORSO
,
BONE_NECK
,
BONE_HEAD2
,
BONE_HEAD1
,
BONE_HEAD
,
BONE_RIGHTUPPERTORSO
,
BONE_RIGHTSHOULDER
,
BONE_RIGHTELBOW
,
BONE_LEFTUPPERTORSO
,
BONE_LEFTSHOULDER
,
BONE_LEFTELBOW
,
BONE_LEFTHIP
,
BONE_LEFTKNEE
,
BONE_RIGHTHIP
,
BONE_RIGHTKNEE
,
}
;




И сама проблема в том, что при большом CRANGE - рендже аимбота, если первые 2-3 кости iBoneList[] в радиусе, то аим будет захватывать их, хотя по логике должен захватить ближайшую, подскажите пожалуйста, как это исправить :З

При маленьком все нормально захватывает.

Если нужно, то вот код Math::vect2_dist:

C++:






static
float
vect2_dist
(
CVector
*
point1
,
CVector
*
point2
)
{
return
sqrt
(
pow
(
point1
->
x
-
point2
->
x
,
2
)
+
pow
(
point1
->
y
-
point2
->
y
,
2
)
)
;
}




Код взят отсюда -> https://www.blast.hk/threads/63079/

K_E_N_T
29.04.2021, 15:24
Чем открывать код .sf .

И если можно гайды/тему на БХ по написанию sf плагинов в самп.

vbg
29.04.2021, 15:55
Чем открывать код .sf .
И если можно гайды/тему на БХ по написанию sf плагинов в самп.



Информация - [SAMPFUNCS] Уроки и остальное (https://www.blast.hk/threads/23416/)

В этой теме собраны уроки и информация по работе с SF API. Уроки: Основы Dialog Hider Render RakNet Подключение ImGui ESP Aimbot Другое Информация о RakNet Интегрированная отладка Защита плагинов от переименования Видеоуроки по SF API

www.blast.hk

memir
30.04.2021, 14:04
Чем открывать код .sf .
И если можно гайды/тему на БХ по написанию sf плагинов в самп.


Любой декомпилятор, дизассемблер. Рекомендую IDA Pro