Просмотр полной версии : С/С++ Вопрос - Ответ
Вот если в процессе два .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
когда делаю http запрос в длл библиотеке, то он остается в строках процесса. есть ли возможность как-либо скрыть его?
kin4stat
08.01.2021, 00:44
когда делаю http запрос в длл библиотеке, то он остается в строках процесса. есть ли возможность как-либо скрыть его?
Убирай строку
Carrentine
10.01.2021, 21:26
Убирай строку
Можно шифровать строку при компиляции и дешифровать в рантайме
Вроде хук
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
)
)
;
но в хукнутой функции у тебя почему-то стоят референсы вместо просто параметров, вместо 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?
Как исправить это в 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
}
}
Можешь подробнее объяснить, если можно скриншотами, как включить тулсет и винсдк, вчера скачал студию, и вообще не понимаю че да как там
Можешь подробнее объяснить, если можно скриншотами, как включить тулсет и винсдк, вчера скачал студию, и вообще не понимаю че да как там
пкм по названию проекту - настройки. выбираешь установленый тулсет (у меня это 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
перед использованием проверь загруженость сампа
Можно поинтересоваться для чего тут ассемблер?
Можно поинтересоваться для чего тут ассемблер?
MTA-стайл - асм вместо тайпдефа
kin4stat
13.01.2021, 12:07
пкм по названию проекту - настройки. выбираешь установленый тулсет (у меня это v141), применяешь настройки. после чего выбираешь версию winsdk (у меня это 10.0.17763.0), применяешь настройки.
ПКМ по решению -> перенацелить решение
MTA-стайл - асм вместо тайпдефа
А зачем...
Ассемблером выебнуться типа?
А зачем...
Ассемблером выебнуться типа?
при чём тут это? мне просто так легче было написать, вот и всё
мне просто так легче было написать
11 строк вместо 2х
S0meTh1n69
13.01.2021, 13:39
11 строк вместо 2х
Тим, напиши пожалуйста как можно заменить эти 11 строк твоими 2
11 строк вместо 2х
дело ведь не в количестве строк 🥲
S0meTh1n69
13.01.2021, 13:43
дело ведь не в количестве строк 🥲
Я тоже не про количество, мне просто интересно как заменить это.
Тим, напиши пожалуйста как можно заменить эти 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
;
}
игра просто виснет
нельзя делать 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 а не циклически как хотелось
Игра уже не виснет, но команда отправляется только тогда когда я жму H а не циклически как хотелось
команда отправляется каждые 2.5 секунды, можешь проверить это добавлением логгированием в месте отправления команды
https://forum.antichat.xyz/attachments/27647760/
решил добавить фикс краша по адрессу 0x0072CD14 в сф плагин. заметил, что при отгрузке плагина через pfree или просто выходе из игры, то функция хука пропадает быстрее, чем сам хук снимается и игра крашится. когда я делал тоже самое в проекте с аси плагином, то всё было окей. как можно это исправить?
хук я ставлю в DLL_PROCESS_ATTACH, а снимаю в DLL_PROCESS_DETACH.
решил добавить фикс краша по адрессу 0x0072CD14 в сф плагин. заметил, что при отгрузке плагина через pfree или просто выходе из игры, то функция хука пропадает быстрее, чем сам хук снимается и игра крашится. когда я делал тоже самое в проекте с аси плагином, то всё было окей. как можно это исправить?
хук я ставлю в DLL_PROCESS_ATTACH, а снимаю в DLL_PROCESS_DETACH.
У SF плагинов есть специальный коллбек, который выполняется перед выгрузкой
Sana_Minotazaki
13.01.2021, 22:18
Как мне в сф сделать onServerMessage как в луа?
специальный коллбек
не нахожу, можешь ткнуть пальцем пожалуйста
Как мне в сф сделать 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
Пытаюсь реализовать класс с функцией, способной вызывать другие функции по адресам, но компилятор ругается:
Код:
результатом вычисления фрагмента не является функция, принимающая 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, не используя исходники, но зная оффсет в библиотеке (для чего и нужна эта функция в принципе)
Пытаюсь реализовать класс с функцией, способной вызывать другие функции по адресам, но компилятор ругается:
Код:
результатом вычисления фрагмента не является функция, принимающая 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 на вариативный шаблон с аргументами.
И у тебя скобочки в вызове лишние...
Охх как я люблю имуги,решил на плюсах пощупать имгуи,вставил рабочий код,имуги в папку с проектом,настройки для компиляции выставил.Компилирую - ошибки.Ставил старые,новые имуги,тыкал все что надо и все что не надо и в итоге пишу сюда
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
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
читаю одну книжечку по c++ и вот появился вопрос
в чем выгода работать функциям по адресу структуру, а не по ее значению? использование меньшего количества памяти?
Как можно установить trampoline hook в удаленный процесс (gta_sa.exe)?
читаю одну книжечку по c++ и вот появился вопрос
в чем выгода работать функциям по адресу структуру, а не по ее значению? использование меньшего количества памяти?
Копирование 4х байт вместо всей структуры. Это быстрее
Как можно установить trampoline hook в удаленный процесс (gta_sa.exe)?
Так же, как и в своей, но из-за раздельного адресного пространства для обработки в своем процессе надо будет слать сообщения и блокировать работу процесса игры, из-за чего работать она будет медленнее. Если dll не вариант, то лучше все на ассемблере написать
Как лучше всего обучиться программированию на Win32 API?
Как лучше всего обучиться программированию на 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"
Есть двумерный вектор, нужно узнать, входит ли в него определенная строка или нет.
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
копировать вектор векторов при передаче в функцию, потом копировать вложенный вектор при итерации по вектору векторов, потом еще и копирование строки при итерации по вектору. Красава. 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
И чем это плохо?)
Если такой вопрос задан — прости прощай разработке до тех пор, пока не будут подобные вопросы и будет интерес залезть в поисковики всемирной паутины.
Большая проблема БХ в том, что здесь есть куча людей, возомнивших себя если не Страуструпами и Торвальдсами, то программистами рангом чуть пониже
Если я задал такой вопрос, я идиот?
Ещё до того, как зайти на БХ я нашёл кучу сайтов. Элементарный пример - Microsoft Docs. А вопрос этот я задал, чтобы спросить, что могут посоветовать именно пользователи БХ. Может, это будет что-то, что я ещё не успел найти
Повторю вопрос:
Как лучше всего обучиться программированию на Win32 API?
И чем это плохо?)
Тот парень посоветовал перед каждым вектором написать std:: вместо того, чтобы написать using namespace std
kin4stat
27.01.2021, 09:49
И чем это плохо?)
Засирание неймспейса. Если это будет в h файле, то эта хуета может протянутся на весь проект
Да и вообще считается плохой практикой
Ты вот думаешь никто так нормальный не делает, но мне хватило пару примеров
Большая проблема БХ в том, что здесь есть куча людей, возомнивших себя если не Страуструпами и Торвальдсами, то программистами рангом чуть пониже
Если я задал такой вопрос, я идиот?
Ещё до того, как зайти на БХ я нашёл кучу сайтов. Элементарный пример - Microsoft Docs. А вопрос этот я задал, чтобы спросить, что могут посоветовать именно пользователи БХ. Может, это будет что-то, что я ещё не успел найти
Повторю вопрос:
Как лучше всего обучиться программированию на Win32 API?
проблема не в том что тут страуструпы одни сидят, проблема в том, что ты задал глупый вопрос, по типу «Как кушать кастрюлей»
range based цикл по ссылке уже видимо не по канону...
А еще using namespace std
Все еще 146 баллов из 10
Уже придирки. Нэймспейс - нормальная практика, кроме тебя нигде не слышал, что не рекомендуется. Какой-то ты грубый
Уже придирки. Нэймспейс - нормальная практика, кроме тебя нигде не слышал, что не рекомендуется. Какой-то ты грубый
Уведомление о переадресации (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
кроме тебя нигде не слышал, что не рекомендуется
Почему "использование пространства имен 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"
}
}
}
Мне нужно организовать файл с информацией, сформированной по секциям и подсекциям. Я выбрал 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
Уже придирки. Нэймспейс - нормальная практика, кроме тебя нигде не слышал, что не рекомендуется. Какой-то ты грубый
Тоже добавлю, к текущим ответам - using namespace std является плохой практикой по большому счету для больших проектов, хотя это не рекомендуется делать вообще где-либо, потому что делая так - вы сразу огромное количество вещей делаете предопределенными. Нет никакой гарантии, что в дальнейшем вы что-нибудь не напишете такое, что уже имеет смысл в std.
я только начал писать на c++ но при компиляции пишет что нету d3d9x.h(точно не помню, ну короче директИкс) где его скачать?
я только начал писать на c++ но при компиляции пишет что нету d3d9x.h(точно не помню, ну короче директИкс) где его скачать?
поставь DirectX SDK и поставь в настройках проектах пути до хидеров и либ
поставь DirectX SDK и поставь в настройках проектах пути до хидеров и либ
а как блять
bottom_text
30.01.2021, 02:21
https://forum.antichat.xyz/attachments/27659546/
Мудрецы, как сделать приколюху выше из луа в сф плагине? При телепорте под землёй появляюсь
upd:
LoadMapAroundPoint()
Нашёл какую-то вроде приколюху, но не понимаю как с ней работать да и та ли.
bottom_text
30.01.2021, 17:33
Как получить свои координаты?
Как получить свои координаты?
если я не ошибаюсь, то вот так. к сожаленую проверить не могу.
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
Конкретно пятый абзац.
Загрузка сцены по позиции:
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 вне лямбд?
Тупо чтобы везде придерживаться одного стиля
Ребят, меня тралит компилятор, помогите
Есть функция, чья задача, это при вызове получить аргументы, отправленные в 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, то он даже компилировать программу откажется.
Я не понимаю, что тут происходит ,_,
Ребят, меня тралит компилятор, помогите
Есть функция, чья задача, это при вызове получить аргументы, отправленные в 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), значит у тебя не мсвс
Можно ли как-то подменинить функцию хука на пустышку которая вызывает трамплин, чтобы не прервать цепочку вызовов и не поломать чужие хуки и игру?
Можно ли как-то подменинить функцию хука на пустышку которая вызывает трамплин, чтобы не прервать цепочку вызовов и не поломать чужие хуки и игру?
можно, я так и делаю в своих хуках
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)
Код там конечно не очень, но на его основе написан ракбот. Думаю для изучения принципа работы подойдет
как проиграть звук через 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);
}
}
}
попробовал проиграть звук в позиции игрока по айди через 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 не проверял
* (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
Помогите плз, если кто-то сталкивался.
Почему у меня 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е, пытался добавить их путь вручную - тоже самое
Может ли быть из-за этого вот этого и как фиксить? Пытался менять под свой билд в самом проекте - библиотеки не видит
Тебе решение проблемы написало.....
Крч, регаю команду > отправляю в неё строку ( К примеру - "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
;
}
Как перевести цвет игрока в хекс?
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
)
;
}
Застрелись.
Так то его метод быстрее стрима.
А самый быстрый вариант с 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, но все также не умеет в добавление незначащих нулей
Быстрее, но _itoa это платформозависимая функция, так еще из Си, а также она не может добавить незначащих нулей в начало
to_chars не умеет в добавление нулей в начало и конвертация в hex, а также не особо неудобен в использовании
UPD: to_chars имеет fmt, в котором можно обозначить hex, но все также не умеет в добавление незначащих нулей
А зачем тебе нули в начале? Последний раз я их использовал в 5 классе, чтобы поприкалываться над учительницей математики.
kin4stat
19.02.2021, 13:21
А зачем тебе нули в начале?
За мясом
("%06X"):format
Последний раз я их использовал в 5 классе, чтобы поприкалываться над учительницей математики.
Как минимум чтобы числа когда ты печатаешь их в лог, были друг под другом, а не в разнобой, самому же удобнее читать, ну
_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
Пытаюсь сделать окно, сквозь которое можно кликать.
Состав: 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/
Неверный тип операнда показывает. Да, 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 адреса. Можешь вызывать какой тебе удобно.
Как отправить сообщение в чат в SAMPFUNCS?
Как отправить сообщение в чат в SAMPFUNCS?
SF->getSAMP()->getPlayers()->pLocalPlayer->Say("говно");
legendabrn
06.03.2021, 18:27
как для имгуя можно использовать кириллицу без u8?
в переменной хранится текст
Код:
ImGui::Text(u8"%s", text);
пытался так, но не получалось
как для имгуя можно использовать кириллицу без 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
}
}
Как выбрать определенный пункт диалога (DIALOG_STYLE_LIST), нажать первую кнопку, ввести значение в поле диалога (DIALOG_STYLE_INPUT) и опять нажать первую кнопку? (SAMPFUNCS)
Как выбрать определенный пункт диалога (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
Спасибо.
Как переподключиться к северу?
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
в луа немножко не этот адрес используется
Это имеет большое значение? Человеку нужно было заблокировать управление игроком, функция вполне справляется с этим
Спасибо.
Как переподключиться к северу?
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 давно разобрали поищи хорошо и найдешь
От куда вы берёте адреса памяти?
Адреса Памяти (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
в луа
Добрый вечер. Как возможно реализовать перебор всех игроков в зоне стрима без использования 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
Пишу инжектор, столкнулся с проблемой
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
;
}
Как убить процесс, если он запущен по функе
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
)
;
Вроде так
это гта
Функа Argb для сампа , кинь если такое есть
kin4stat
23.03.2021, 20:06
Функа Argb для сампа , кинь если такое есть
что?
что?
Одним словом , я хочу в меню вставить полоску ргб .
Как проверить, что самп инициализирован без проверки структур?
хукнуть CNetGame::CNetGame:
псевдо код:
void
hooked_construct_cnetgame
(
.
.
.
)
{
hook_cnetgame
->
call_orig
(
.
.
.
)
;
// самп инициализирован
}
Одним словом , я хочу в меню вставить полоску ргб .
Хватит мб клоуна корчить. Нельзя нормально расписать чё те надо? Какую полоску, в каком меню, чел, ты..
Dark_Knight
23.03.2021, 21:50
Одним словом , я хочу в меню вставить полоску ргб .
Конкретнее говори.
Добавляю шрифт в 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
Надо передавать вроде полный путь и попробуй без дефолтного шрифта.
Надо передавать вроде полный путь и попробуй без дефолтного шрифта.
Я так делал. Загрузило, иконок не было, ну и естественно "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 процентов рабочий.
Всем привет. В общем нужна линия argb, как в ските.
https://forum.antichat.xyz/attachments/27697790/
Всем привет. В общем нужна линия 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х, добавь третий (и далее) вертекс с отдельным цветом для него.
Как убрать отступы?
https://forum.antichat.xyz/attachments/27698018/
Dark_Knight
24.03.2021, 23:13
Как убрать отступы?
А код ты нам показать не хочешь? и не хочешь нам сказать что ты испольуещшь? А может ты хочешь, чтобы за тебя все сделали а ты за это ничего заплатил? Хер тебе. когда задаешь какой-то тут вопрос описывай его как можно конкретней и с примерами. Чем больше инфы ТЫ даш нам, тем больше шансов, что тебе помогут.
Как можно через 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);
Доброй ночи братцы. Подскажите как можно увеличить ширину и высоту текста, вызванной
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
Неа, имгуи поддерживает рендер на текстуре
Опана. С этого момента поподробней. Я про скейл шрифта общий знаю, но вот про такое хз. Удиви всех нас)
Добрый вечер, подскажите каким способом можно извлекать из 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
хз, мб как-то и связан, 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.
Вопрос: Можно ли задать координаты ImGui::Image, если да то как.
Возможный ответ: Использовать setcursorpos?
Receiver
30.03.2021, 18:46
Вопрос: Можно ли задать координаты ImGui::Image, если да то как.
Возможный ответ: Использовать setcursorpos?
C++:
ImGui
::
SetCursorPos
(
{
X
,
Y
}
)
;
// Замени на свою позицию
ImGui
::
Image
(
.
.
.
)
;
как получить ид самп игрока через указатель на 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)
самый простой способ это использовать метод который уже есть в сампе
У меня уже мозг расплавился от этой чихарды.
Имеется старая игра 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
Покажи строку в 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/
ты явно в коде делаешь что-то не так:
А вот, едрись оно конём, хрен его знает, что я делаю не так, если ты прав!
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/
Как можно удалить искру от пули. Именно искру попадания в стену, а не трассер
Dark_Knight
02.04.2021, 22:27
Как можно удалить искру от пули. Именно искру попадания в стену, а не трассер
Надо не удалять, а не вызывать создания искры от пули. Ищешь адресс в плагин СДК(без знаний примитивного английского и логики поиска хер найдешь) и когда нужно на него ставишь ноп. Это я лишь логику работы описал. Не сам рабочий код.
Как можно удалить искру от пули. Именно искру попадания в стену, а не трассер
А может просто возьмешь сурс моего аима и отправишь пулю куда тебе надо?
Как сделать проверку на стан?
Как сделать проверку на стан?
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
тут есть
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/
[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
код репаира кара если можно
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
Есть у кого-нибудь адрес 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
как работает этот плагин? как-то очищает буфер при каждом реконнекте?
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
)
;
}
есть структура данных типа стек, нужно заполнить его целыми числами до 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)
struct stack { int data; stack* next; };
это не стек, а linked list
Что это за треш, думаю не стоит приводить в пример такую ебанутую реализацию
я ниже писал про современный метод
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
;
}
этот кал
если 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
;
}
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
;
}
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
;
}
ставить хук на диалог
ставить хук на диалог
Можешь объяснить как?
Просто это локальный диалог и в том же 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
Можешь объяснить как?
Просто это локальный диалог и в том же 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);
Как в 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
(
)
;
// код
}
Как в 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
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
;
}
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 нужно
Спасибо за помощь друголек, однако я неправильно вызываю функцию в этом коде и я не знаю как.
Ребят, может кто помочь фиксануть аимбот к ближайшей кости? У меня некоторые проблемки, черканите в лс, тк код не маленький
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)
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)
У меня есть функция:
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/
Чем открывать код .sf .
И если можно гайды/тему на БХ по написанию sf плагинов в самп.
Чем открывать код .sf .
И если можно гайды/тему на БХ по написанию sf плагинов в самп.
Информация - [SAMPFUNCS] Уроки и остальное (https://www.blast.hk/threads/23416/)
В этой теме собраны уроки и информация по работе с SF API. Уроки: Основы Dialog Hider Render RakNet Подключение ImGui ESP Aimbot Другое Информация о RakNet Интегрированная отладка Защита плагинов от переименования Видеоуроки по SF API
www.blast.hk
Чем открывать код .sf .
И если можно гайды/тему на БХ по написанию sf плагинов в самп.
Любой декомпилятор, дизассемблер. Рекомендую IDA Pro
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot