 |
|

01.11.2019, 18:23
|
|
Познающий
Регистрация: 22.07.2015
Сообщений: 58
С нами:
5689694
Репутация:
68
|
|
Сообщение от Pakulichev
Всем привет 👋
Есть нужда в создании плагина, который бы запускался на всех последних версиях SAMP, а значит возможность написания SF плагина сразу отпадает. Собственно, в C++ я новичок, можно сказать, но всё равно попытался всё сделать сам - ничего не получилось, по итогам тестирования было установлено, что игра офигевает от происходящего и крашится. Мои цели в данный момент достаточно простые - заставить ASI плагин выводить сообщение в чат после инициализации SAMP'a.
Пожалуйста, не нужно советовать различные ASI Framework - это не то, что мне нужно. Помогите разобраться с тем, как это работает в идеале, пожалуйста.
Сообщение от Спойлер
main.cpp:
Код:
#include "main.h"
void
MainThread
(
)
{
do
{
samp
.
dwModule
=
(
DWORD
)
GetModuleHandle
(
L
"samp.dll"
)
;
}
while
(
!
samp
.
dwModule
)
;
do
{
Sleep
(
1
)
;
}
while
(
IsSampInit
(
)
!=
TRUE
)
;
Sleep
(
2500
)
;
AddChatMessage
(
"Hello world!"
)
;
}
BOOL WINAPI
DllMain
(
HINSTANCE hModule
,
DWORD dwReason
,
LPVOID lpReserved
)
{
switch
(
dwReason
)
{
case
DLL_PROCESS_ATTACH
:
{
DisableThreadLibraryCalls
(
hModule
)
;
_beginthread
(
(
_beginthread_proc_type
)
MainThread
,
NULL
,
NULL
)
;
break
;
}
}
}
main.h:
Код:
#pragma once
#include
#include
#include
#include
#include
struct
SAMPStruct
{
DWORD dwModule
;
}
samp
;
struct
SAMPOffsets
{
DWORD registerClientCommand
=
0x65AC0
;
DWORD addChatMessage
=
0x64520
;
}
offset
;
bool
IsSampInit
(
)
{
return
(
(
bool
(
__thiscall
*
)
(
)
)
(
samp
.
dwModule
+
0x9BF70
)
)
(
)
;
}
void
RegisterChatCommand
(
const
char
*
command
,
void
*
function
)
{
(
(
void
(
__thiscall
*
)
(
DWORD str
,
const
char
*
cmd
,
void
*
func
)
)
(
samp
.
dwModule
+
offset
.
registerClientCommand
)
)
(
*
(
DWORD
*
)
(
samp
.
dwModule
+
0x21A0E8
)
,
command
,
function
)
;
}
void
AddChatMessage
(
const
char
*
message
)
{
(
(
void
(
__thiscall
*
)
(
DWORD str
,
const
char
*
text
)
)
(
samp
.
dwModule
+
offset
.
addChatMessage
)
)
(
*
(
DWORD
*
)
(
samp
.
dwModule
+
0x21A0E4
)
,
message
)
;
}
Определяй версию сампа при загрузке плагина и уже после инициализируй оффсеты для конкретной версии. Пример определения посмотри в собейте, основан на проверке массива байт
|
|
|

01.11.2019, 18:30
|
|
Познавший АНТИЧАТ
Регистрация: 28.10.2017
Сообщений: 1,778
С нами:
4495573
Репутация:
183
|
|
Сообщение от Roger571
Определяй версию сампа при загрузке плагина и уже после инициализируй оффсеты для конкретной версии. Пример определения посмотри в собейте, основан на проверке массива байт
Посмотри исходный код под спойлером, там есть всё, кроме определения, но оно даже так не работает. Там явно где-то есть ошибка, но я её не вижу.
|
|
|

01.11.2019, 21:13
|
|
Познающий
Регистрация: 22.07.2015
Сообщений: 58
С нами:
5689694
Репутация:
68
|
|
Сообщение от Pakulichev
Посмотри исходный код под спойлером, там есть всё, кроме определения, но оно даже так не работает. Там явно где-то есть ошибка, но я её не вижу.
Проблема в прототипе функции.
C++:
Код:
void
AddChatMessage
(
const
char
*
message
)
{
(
(
void
(
__cdecl
*
)
(
DWORD str
,
const
char
*
text
,
.
.
.
)
)
(
samp
.
dwModule
+
offset
.
addChatMessage
)
)
(
*
(
DWORD
*
)
(
samp
.
dwModule
+
0x21A0E4
)
,
message
)
;
}
|
|
|

04.11.2019, 15:51
|
|
Постоянный
Регистрация: 24.01.2016
Сообщений: 566
С нами:
5421300
Репутация:
83
|
|
Как через .exe C++ получить уровень хп игрока? К примеру, через Read Process Memory
|
|
|

04.11.2019, 16:08
|
|
Новичок
Регистрация: 18.10.2015
Сообщений: 6
С нами:
5563739
Репутация:
0
|
|
Сообщение от mrdiimax
Как через .exe C++ получить уровень хп игрока? К примеру, через Read Process Memory
C++:
Код:
unsigned
cPED_ptr
;
float
health
;
ReadProcessMemory
(
hGTA
,
0xB6F5F0
,
&
cPED_ptr
,
4
,
0
)
;
ReadProcessMemory
(
hGTA
,
cPED_ptr
+
0x540
,
&
health
,
4
,
0
)
;
|
|
|

04.11.2019, 16:33
|
|
Постоянный
Регистрация: 24.01.2016
Сообщений: 566
С нами:
5421300
Репутация:
83
|
|
Сообщение от index
C++:
Код:
unsigned
cPED_ptr
;
float
health
;
ReadProcessMemory
(
hGTA
,
0xB6F5F0
,
&
cPED_ptr
,
4
,
0
)
;
ReadProcessMemory
(
hGTA
,
cPED_ptr
+
0x540
,
&
health
,
4
,
0
)
;
Что не так?
|
|
|

04.11.2019, 16:35
|
|
Познавший АНТИЧАТ
Регистрация: 28.10.2017
Сообщений: 1,778
С нами:
4495573
Репутация:
183
|
|
Сообщение от mrdiimax
Что не так?
Я конечно не эксперт, но мне кажется, что Sleep не стоит засовывать в цикл, и ещё ты дважды объявил hGTA, а вообще где main?
|
|
|

04.11.2019, 16:36
|
|
Участник форума
Регистрация: 19.03.2014
Сообщений: 222
С нами:
6395080
Репутация:
128
|
|
а мне кажется, что тут нет энтри поинта????????
|
|
|

04.11.2019, 16:46
|
|
Постоянный
Регистрация: 24.01.2016
Сообщений: 566
С нами:
5421300
Репутация:
83
|
|
Сообщение от Всефс
Я конечно не эксперт, но мне кажется, что Sleep не стоит засовывать в цикл, и ещё ты дважды объявил hGTA, а вообще где main?
Вроде починил, но всегда выдает единицу))
|
|
|

04.11.2019, 21:04
|
|
Познавший АНТИЧАТ
Регистрация: 28.10.2017
Сообщений: 1,778
С нами:
4495573
Репутация:
183
|
|
Сообщение от mrdiimax
Вроде починил, но всегда выдает единицу))
Попробуй читать память в цикле или поиграться с типами переменных, но мне кажется, что у тебя где-то ошибка.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|