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

  #4101  
Старый 01.11.2019, 18:23
Roger571
Познающий
Регистрация: 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
)
;
}


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

  #4102  
Старый 01.11.2019, 18:30
ImPasha
Познавший АНТИЧАТ
Регистрация: 28.10.2017
Сообщений: 1,778
С нами: 4495573

Репутация: 183


По умолчанию

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

Определяй версию сампа при загрузке плагина и уже после инициализируй оффсеты для конкретной версии. Пример определения посмотри в собейте, основан на проверке массива байт
Посмотри исходный код под спойлером, там есть всё, кроме определения, но оно даже так не работает. Там явно где-то есть ошибка, но я её не вижу.
 
Ответить с цитированием

  #4103  
Старый 01.11.2019, 21:13
Roger571
Познающий
Регистрация: 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
)
;
}
 
Ответить с цитированием

  #4104  
Старый 04.11.2019, 15:51
mrdiimax
Постоянный
Регистрация: 24.01.2016
Сообщений: 566
С нами: 5421300

Репутация: 83


По умолчанию

Как через .exe C++ получить уровень хп игрока? К примеру, через Read Process Memory
 
Ответить с цитированием

  #4105  
Старый 04.11.2019, 16:08
index
Новичок
Регистрация: 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
)
;
 
Ответить с цитированием

  #4106  
Старый 04.11.2019, 16:33
mrdiimax
Постоянный
Регистрация: 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
)
;

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

  #4107  
Старый 04.11.2019, 16:35
ImPasha
Познавший АНТИЧАТ
Регистрация: 28.10.2017
Сообщений: 1,778
С нами: 4495573

Репутация: 183


По умолчанию

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

Что не так?
Я конечно не эксперт, но мне кажется, что Sleep не стоит засовывать в цикл, и ещё ты дважды объявил hGTA, а вообще где main?
 
Ответить с цитированием

  #4108  
Старый 04.11.2019, 16:36
p1cador
Участник форума
Регистрация: 19.03.2014
Сообщений: 222
С нами: 6395080

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

а мне кажется, что тут нет энтри поинта????????
 
Ответить с цитированием

  #4109  
Старый 04.11.2019, 16:46
mrdiimax
Постоянный
Регистрация: 24.01.2016
Сообщений: 566
С нами: 5421300

Репутация: 83


По умолчанию

Цитата:
Сообщение от Всефс  

Я конечно не эксперт, но мне кажется, что Sleep не стоит засовывать в цикл, и ещё ты дважды объявил hGTA, а вообще где main?
Вроде починил, но всегда выдает единицу))
 
Ответить с цитированием

  #4110  
Старый 04.11.2019, 21:04
ImPasha
Познавший АНТИЧАТ
Регистрация: 28.10.2017
Сообщений: 1,778
С нами: 4495573

Репутация: 183


По умолчанию

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

Вроде починил, но всегда выдает единицу))
Попробуй читать память в цикле или поиграться с типами переменных, но мне кажется, что у тебя где-то ошибка.
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


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




ANTICHAT ™ © 2001- Antichat Kft.

×

Внести депозит

Введите сумму USDT:

Принимается только USDT TRC20. Fake/Flash USDT не засчитывается.

×

Вывести депозит

Сумма USDT:

Ваш USDT TRC20 кошелек:

Заявка будет отправлена администратору.