
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
)
;
}
Определяй версию сампа при загрузке плагина и уже после инициализируй оффсеты для конкретной версии. Пример определения посмотри в собейте, основан на проверке массива байт
|
|
|
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|