Просмотр полной версии : С/С++ Вопрос - Ответ
iAmerican
30.06.2019, 14:04
https://prnt.sc/o8k60k (https://www.blast.hk/redirect/aHR0cHM6Ly9wcm50LnNjL284azYwaw) как только поставил сразу ошибки и не компилит
Ошибки покажи , ты кинул просто варнинг
vania3450
30.06.2019, 15:31
Ошибки покажи , ты кинул просто варнинг
Решил проблему,но все равно спасибо)
$continue$
30.06.2019, 22:02
Есть pool vehicle, как можно узнать модель машины, по иду в пуле?
vania3450
01.07.2019, 01:05
у меня есть исходник который создает plugin для сервера, но создает его в dll формате, как можно закомпилить его в so для Linux сервера?
у меня есть исходник который создает plugin для сервера, но создает его в dll формате, как можно закомпилить его в so для Linux сервера?
компилировать в линуксе
vania3450
01.07.2019, 14:14
компилировать в линуксе
На винде вообще никак ?
На винде вообще никак ?
http://qaru.site/questions/83458/how-to-compile-for-windows-on-linux-with-gccg (https://www.blast.hk/redirect/aHR0cDovL3FhcnUuc2l0ZS9xdWVzdGlvbnMvODM0NTgvaG93LX RvLWNvbXBpbGUtZm9yLXdpbmRvd3Mtb24tbGludXgtd2l0aC1n Y2Nn)
vania3450
01.07.2019, 14:33
http://qaru.site/questions/83458/how-to-compile-for-windows-on-linux-with-gccg (https://www.blast.hk/redirect/aHR0cDovL3FhcnUuc2l0ZS9xdWVzdGlvbnMvODM0NTgvaG93LX RvLWNvbXBpbGUtZm9yLXdpbmRvd3Mtb24tbGludXgtd2l0aC1n Y2Nn)
Тут же наоборот для винды с системы линукс,не?
Тут же наоборот для винды с системы линукс,не?
чет я не то прочитал, гугл глупый. Поищи инфу в гугле. 100 % найдешь решение
Roger571
02.07.2019, 10:19
у меня есть исходник который создает plugin для сервера, но создает его в dll формате, как можно закомпилить его в so для Linux сервера?
Для меня самым простым и быстрым решением оказалось просто установить виртуалку и компилировать уже в ней.
Но если интересно, то можешь почитать, вот (https://www.blast.hk/redirect/aHR0cHM6Ly90b3N0ZXIucnUvcS80NzIyMzk) и еще (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cubGludXgub3JnLnJ1L2ZvcnVtL2RldmVsb3 BtZW50LzY3NTE2MTU)
vania3450
02.07.2019, 11:02
Для меня самым простым и быстрым решением оказалось просто установить виртуалку и компилировать уже в ней.
Но если интересно, то можешь почитать, вот (https://www.blast.hk/redirect/aHR0cHM6Ly90b3N0ZXIucnUvcS80NzIyMzk) и еще (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cubGludXgub3JnLnJ1L2ZvcnVtL2RldmVsb3 BtZW50LzY3NTE2MTU)
Хорошо, а как через линукс компилить если поставлю на виртуалку, не скажешь?
дарова, подскажите почему я не отослать пост запрос, ответ от сайта есть а данные пост почему-то не отправляются
C++:
const
char
*
MyNet
::
SendPost
(
const
char
*
file
,
char
*
data
)
{
char
szReq
[
1024
]
=
""
,
szBuffer
[
1025
]
;
DWORD dwByteRead
=
0
;
BOOL bRead
;
if
(
mainBuf
!=
nullptr
)
mainBuf
[
0
]
=
'\0'
;
hHttpRequest
=
HttpOpenRequest
(
hHttpSession
,
"POST"
,
file
,
0
,
0
,
0
,
INTERNET_FLAG_RELOAD
,
0
)
;
if
(
hHttpRequest
!=
NULL
)
{
LPCSTR header
;
header
=
"Accept: */*"
;
HttpAddRequestHeaders
(
hHttpRequest
,
header
,
strlen
(
header
)
,
HTTP_ADDREQ_FLAG_ADD
)
;
header
=
"Content-Type: application/json"
;
HttpAddRequestHeaders
(
hHttpRequest
,
header
,
strlen
(
header
)
,
HTTP_ADDREQ_FLAG_ADD
)
;
HttpSendRequest
(
hHttpRequest
,
NULL
,
0
,
data
,
strlen
(
data
)
)
;
while
(
true
)
{
bRead
=
InternetReadFile
(
hHttpRequest
,
szBuffer
,
sizeof
(
szBuffer
)
-
1
,
&
dwByteRead
)
;
if
(
bRead
==
FALSE
||
dwByteRead
==
0
)
break
;
szBuffer
[
dwByteRead
]
=
'\0'
;
AddToString
(
&
mainBuf
,
szBuffer
)
;
}
MessageBox
(
GetForegroundWindow
(
)
,
mainBuf
,
"Rab"
,
MB_OK
)
;
}
return
mainBuf
;
}
Хорошо, а как через линукс компилить если поставлю на виртуалку, не скажешь?
sudo apt install build-essential - установит всё что надо
g++ -o test test.cpp - компиляция. test - имя выходного файла, test.cpp - имя компилируемого файла
дарова, подскажите почему я не отослать пост запрос, ответ от сайта есть а данные пост почему-то не отправляются
C++:
const
char
*
MyNet
::
SendPost
(
const
char
*
file
,
char
*
data
)
{
char
szReq
[
1024
]
=
""
,
szBuffer
[
1025
]
;
DWORD dwByteRead
=
0
;
BOOL bRead
;
if
(
mainBuf
!=
nullptr
)
mainBuf
[
0
]
=
'\0'
;
hHttpRequest
=
HttpOpenRequest
(
hHttpSession
,
"POST"
,
file
,
0
,
0
,
0
,
INTERNET_FLAG_RELOAD
,
0
)
;
if
(
hHttpRequest
!=
NULL
)
{
LPCSTR header
;
header
=
"Accept: */*"
;
HttpAddRequestHeaders
(
hHttpRequest
,
header
,
strlen
(
header
)
,
HTTP_ADDREQ_FLAG_ADD
)
;
header
=
"Content-Type: application/json"
;
HttpAddRequestHeaders
(
hHttpRequest
,
header
,
strlen
(
header
)
,
HTTP_ADDREQ_FLAG_ADD
)
;
HttpSendRequest
(
hHttpRequest
,
NULL
,
0
,
data
,
strlen
(
data
)
)
;
while
(
true
)
{
bRead
=
InternetReadFile
(
hHttpRequest
,
szBuffer
,
sizeof
(
szBuffer
)
-
1
,
&
dwByteRead
)
;
if
(
bRead
==
FALSE
||
dwByteRead
==
0
)
break
;
szBuffer
[
dwByteRead
]
=
'\0'
;
AddToString
(
&
mainBuf
,
szBuffer
)
;
}
MessageBox
(
GetForegroundWindow
(
)
,
mainBuf
,
"Rab"
,
MB_OK
)
;
}
return
mainBuf
;
}
Код:
Content-Type: application/json
замени на
Код:
Content-Type: application/x-www-form-urlencoded
Roger571
02.07.2019, 16:24
Хорошо, а как через линукс компилить если поставлю на виртуалку, не скажешь?
Самым простым для тебя будет установка IDE.
Установи CodeBlocks, вот инструкция (https://www.blast.hk/redirect/aHR0cHM6Ly9taWNyby1waS5ydS8lRDElODMlRDElODElRDElOD IlRDAlQjAlRDAlQkQlRDAlQkUlRDAlQjIlRDAlQkElRDAlQjAt JUQwJUJEJUQwJUIwJUQxJTgxJUQxJTgyJUQxJTgwJUQwJUJFJU QwJUI5JUQwJUJBJUQwJUIwLWNvZGVibG9ja3MtdWJ1bnR1Lw) о его установке, где все подробно расписано и дан пример создания проекта.
Только при создании проекта выбирай не "Console application", а "Shared library". Затем добавляешь файлы своего плагина и компилируешь.
В настройках проекта можешь указать желаемое имя выходного файла.
zMViToS_
02.07.2019, 23:45
Есть мобильный клиент самп. Базируется на 0.3.7, в самом клиенте не реализовано оружие, ходьба, приседания и урон с оружия, так же тюнинг. Как реализовать?
Есть мобильный клиент самп. Базируется на 0.3.7, в самом клиенте не реализовано оружие, ходьба, приседания и урон с оружия, так же тюнинг. Как реализовать?
как я знаю, сервер там 0.3.7, а получается, что достаточно научить клиент принимать и отправлять нужные пакеты.
не думаю, что если ты задаёшь такой вопрос, то ты сможешь это реализовать.
ты можешь посмотреть как уже реализовано там что то и делать по аналогии с этим.
есть два объекта, каждый из них расположен на своей позиции, нужно повернуть объект в сторону другого объекта в трёхмерном пространстве.
я прогуливал школу, вот и туповат чуть-чуть, дайте пожалуйста формулу как можно это высчитать
object one[x y z]
object two[x y z]
как мне высчитать ротацию по всем трём координатам?
semenrbt
06.07.2019, 11:30
есть два объекта, каждый из них расположен на своей позиции, нужно повернуть объект в сторону другого объекта в трёхмерном пространстве.
я прогуливал школу, вот и туповат чуть-чуть, дайте пожалуйста формулу как можно это высчитать
object one[x y z]
object two[x y z]
как мне высчитать ротацию по всем трём координатам?
а как узнать куда смотрит твой обьект =)
есть два объекта, каждый из них расположен на своей позиции, нужно повернуть объект в сторону другого объекта в трёхмерном пространстве.
я прогуливал школу, вот и туповат чуть-чуть, дайте пожалуйста формулу как можно это высчитать
object one[x y z]
object two[x y z]
как мне высчитать ротацию по всем трём координатам?
Ну по x и y вот, но это походу не то
C++:
// pos позиция обекта к которому нужно повернутся
// posTo сам обект
float
angle
=
atan2
(
(
pos
[
0
]
-
posTo
[
0
]
)
,
(
posTo
[
1
]
-
pos
[
1
]
)
)
+
M_PI
;
Ну по x и y вот, но это походу не то
C++:
// pos позиция обекта к которому нужно повернутся
// posTo сам обект
float
angle
=
atan2
(
(
pos
[
0
]
-
posTo
[
0
]
)
,
(
posTo
[
1
]
-
pos
[
1
]
)
)
+
M_PI
;
это не то
это всё не то.
объясняю понятней, вот функция которая создаёт объект, ротация там меняется по трём переменным(вектор, x, y, z)
C++:
BOOL
Create
(
WORD nId
,
int
nModel
,
CVector position
,
CVector rotation
,
float
fDrawDistance
)
{
return
(
(
BOOL
(
__thiscall
*
)
(
stObjectPool
*
,
WORD
,
int
,
CVector
,
CVector
,
float
)
)
(
SF
->
getSAMP
(
)
->
getSAMPAddr
(
)
+
0xF470
)
)
(
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pObject
,
nId
,
nModel
,
position
,
rotation
,
fDrawDistance
)
;
}
у меня есть координаты моего созданного объекта и координаты того вокруг чего он должен вращаться.
вопрос, как мне из этих двух координат высчитать ротация и повернуть объект в сторону моих координат?
это всё не то.
объясняю понятней, вот функция которая создаёт объект, ротация там меняется по трём переменным(вектор, x, y, z)
C++:
BOOL
Create
(
WORD nId
,
int
nModel
,
CVector position
,
CVector rotation
,
float
fDrawDistance
)
{
return
(
(
BOOL
(
__thiscall
*
)
(
stObjectPool
*
,
WORD
,
int
,
CVector
,
CVector
,
float
)
)
(
SF
->
getSAMP
(
)
->
getSAMPAddr
(
)
+
0xF470
)
)
(
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pObject
,
nId
,
nModel
,
position
,
rotation
,
fDrawDistance
)
;
}
у меня есть координаты моего созданного объекта и координаты того вокруг чего он должен вращаться.
вопрос, как мне из этих двух координат высчитать ротация и повернуть объект в сторону моих координат?
Смотри тебе нужно вот это Кватеринион (https://www.blast.hk/redirect/aHR0cHM6Ly9hcGktMmQzZC1jYWQuY29tL2V1bGVyX2FuZ2xlc1 9xdWF0ZXJuaW9ucy8), но я это еще в школе не проходил поэтому хз
Подскажите, если кто-нибудь знает, как работает это (https://blast.hk/threads/18967/)? Какие адреса чистит, где их можно узнать итд.
Roger571
06.07.2019, 14:32
это всё не то.
Не особо понимаю с похмелья что тебе требуется в итоге, но попробуй
Вычисляешь угол между объектами с помощью atan2 и переводишь в кватернион.
C++:
void
QuaternionFromAngle
(
float
*
fQuaternion
,
float
fAngle
)
{
fAngle
=
DEGTORAD
(
fAngle
)
;
float
fMatrix
[
3
]
[
3
]
,
c
=
cos
(
fAngle
)
,
s
=
sin
(
fAngle
)
;
// QuaternionRotateZ
fMatrix
[
0
]
[
0
]
=
c
;
fMatrix
[
0
]
[
1
]
=
s
;
fMatrix
[
0
]
[
2
]
=
0.0
;
fMatrix
[
1
]
[
0
]
=
-
s
;
fMatrix
[
1
]
[
1
]
=
c
;
fMatrix
[
1
]
[
2
]
=
0.0
;
fMatrix
[
2
]
[
0
]
=
0.0
;
fMatrix
[
2
]
[
1
]
=
0.0
;
fMatrix
[
2
]
[
2
]
=
1.0
;
// GetQuaternionFromMatrix
fQuaternion
[
0
]
=
sqrt
(
Max
(
(
float
)
0
,
1.0f
+
fMatrix
[
0
]
[
0
]
+
fMatrix
[
1
]
[
1
]
+
fMatrix
[
2
]
[
2
]
)
)
*
0.5f
;
fQuaternion
[
1
]
=
sqrt
(
Max
(
(
float
)
0
,
1.0f
+
fMatrix
[
0
]
[
0
]
-
fMatrix
[
1
]
[
1
]
-
fMatrix
[
2
]
[
2
]
)
)
*
0.5f
;
fQuaternion
[
2
]
=
sqrt
(
Max
(
(
float
)
0
,
1.0f
-
fMatrix
[
0
]
[
0
]
+
fMatrix
[
1
]
[
1
]
-
fMatrix
[
2
]
[
2
]
)
)
*
0.5f
;
fQuaternion
[
3
]
=
sqrt
(
Max
(
(
float
)
0
,
1.0f
-
fMatrix
[
0
]
[
0
]
-
fMatrix
[
1
]
[
1
]
+
fMatrix
[
2
]
[
2
]
)
)
*
0.5f
;
fQuaternion
[
1
]
=
static_cast
(
_copysign
(
fQuaternion
[
1
]
,
fMatrix
[
2
]
[
1
]
-
fMatrix
[
1
]
[
2
]
)
)
;
fQuaternion
[
2
]
=
static_cast
(
_copysign
(
fQuaternion
[
2
]
,
fMatrix
[
0
]
[
2
]
-
fMatrix
[
2
]
[
0
]
)
)
;
fQuaternion
[
3
]
=
static_cast
(
_copysign
(
fQuaternion
[
3
]
,
fMatrix
[
1
]
[
0
]
-
fMatrix
[
0
]
[
1
]
)
)
;
}
Пробуй, вроде должно работать
Есть функция для поиска последовательности строчных символов:
C++:
[CODE]
int
findstring
(
void
*
where_
,
char
*
what
,
int
whereSize
)
{
void
*
temp
=
malloc
(
strlen
(
what
)
+
1
)
;
int
iterator
=
0
;
char
*
yo
=
new
char
[
strlen
(
what
)
+
1
]
;
yo
=
(
char
*
)
temp
;
char
*
tempptr
=
static_cast
(
where_
)
;
while
(
iterator
Она копирует из области поиска по n байт длиною равной длине искомого, добавляет на конец 0 и сравнивает. И так, пока не кончится буфер.
Однако, я её раз 10 наверное прогнал по циклу вызвов с одинаковыми параметрами, и примерно 33-39 из 100 вызовов она возвращает ошибку(-1). Лично я тут не вижу ошибки в логике, но результат говорит об обратном.
Помогите понять, где косяк, плиз.
rraggerr
06.07.2019, 17:19
[QUOTE="ishi"]
Есть функция для поиска последовательности строчных символов:
C++:
[CODE]
int
findstring
(
void
*
where_
,
char
*
what
,
int
whereSize
)
{
void
*
temp
=
malloc
(
strlen
(
what
)
+
1
)
;
int
iterator
=
0
;
char
*
yo
=
new
char
[
strlen
(
what
)
+
1
]
;
yo
=
(
char
*
)
temp
;
char
*
tempptr
=
static_cast
(
where_
)
;
while
(
iterator
Lua:
#
include
"stdafx.h"
#
include
#
include
#
include
#
define REGISTER_CLIENT_COMMAND
0x65AC0
#
define ADD_CHAT_MESSAGE
0x64520
#
define pChat
0x21A0E4
#
define pInput
0x21A0E8
#
define memory_info
0x8A5A80
DWORD dwSamp
;
void
AddChatMessage
(
const char
*
msg
)
{
(
(
void
(
__thiscall
*
)
(
DWORD str
,
const char
*
text
)
)
(
dwSamp
+
ADD_CHAT_MESSAGE
)
)
(
*
(
DWORD
*
)
(
dwSamp
+
pChat
)
,
msg
)
;
}
bool
isInit
(
)
{
return
(
(
bool
(
__thiscall
*
)
(
)
)
(
dwSamp
+
0x9BF70
)
)
(
)
;
}
void
AddClientCommand
(
const char
*
cmd
,
void
*
func
)
{
(
(
void
(
__thiscall
*
)
(
DWORD str
,
const char
*
cmd
,
void
*
func
)
)
(
dwSamp
+
REGISTER_CLIENT_COMMAND
)
)
(
*
(
DWORD
*
)
(
dwSamp
+
pInput
)
,
cmd
,
func
)
;
}
void
core
(
)
{
char buf
[
40
]
;
sprintf_s
(
buf
,
"%u"
,
*
(
DWORD
*
)
(
dwSamp
+
memory_info
)
)
;
AddChatMessage
(
buf
)
;
}
void
attach
(
)
{
dwSamp
=
(
DWORD
)
GetModuleHandle
(
L
"samp.dll"
)
;
while
(
!dwSamp
)
{
dwSamp
=
(
DWORD
)
GetModuleHandle
(
L
"samp.dll"
)
;
Sleep
(
30
)
;
}
dwSamp
=
(
DWORD
)
GetModuleHandle
(
L
"samp.dll"
)
;
AddClientCommand
(
"getmem"
,
core
)
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD ul_reason_for_call
,
LPVOID lpReserved
)
{
if
(
ul_reason_for_call
==
DLL_PROCESS_ATTACH
)
_beginthread
(
(
_beginthread_proc_type
)
attach
,
NULL
,
NULL
)
;
return
TRUE
;
}
Крашит игру. в MoonLoader'e проверял вызов AddChatMessage, всё работало. AddChatMessage и AddClientMessage -
это методы класса.
Подскажите, если кто-нибудь знает, как работает это (https://blast.hk/threads/18967/)? Какие адреса чистит, где их можно узнать итд.
обычный игнор входящего RPC_SCRREMOVEBUILDINGFORPLAYER
это проверка на то что "слово" есть в строчке "какое то слово" ?
Не совсем. Это для поиска в буфере, содержимое которого может не соответствовать строчному типу: на конце может не быть нуля, а сами символы могут не соответствовать кодировке искомого. Короче говоря: поиск в бинарном файле.
чем strstr не устраивает?
Не хочет искать дальше первого \0
-raymond-
06.07.2019, 19:51
как сделать альтернативу keyhook_keycombo_pressed из собейта в сф?
Обновляю запрос.
[QUOTE="Спойлер"]
[COLOR="#363940"]
[QUOTE="ishi"]
Есть функция для поиска последовательности строчных символов:
C++:
[CODE]
int
findstring
(
void
*
where_
,
char
*
what
,
int
whereSize
)
{
void
*
temp
=
malloc
(
strlen
(
what
)
+
1
)
;
int
iterator
=
0
;
char
*
yo
=
new
char
[
strlen
(
what
)
+
1
]
;
yo
=
(
char
*
)
temp
;
char
*
tempptr
=
static_cast
(
where_
)
;
while
(
iterator
C++:
[CODE]
int
findstring
(
void
*
where_
,
char
*
what
,
int
whereSize
)
{
void
*
temp
=
malloc
(
strlen
(
what
)
+
1
)
;
int
iterator
=
0
;
char
*
yo
=
static_cast
(
temp
)
+
strlen
(
what
)
+
1
;
char
*
tempptr
=
static_cast
(
where_
)
;
while
(
iterator
Теперь из десяти запусков по 100 вызовов, 8-9 запусков идут без ошибок, а конкретно: ошибка вылетает первые
[QUOTE="ishi"]
Обновляю запрос.
В yo была утечка, исправив слепил это:
C++:
[CODE]
int
findstring
(
void
*
where_
,
char
*
what
,
int
whereSize
)
{
void
*
temp
=
malloc
(
strlen
(
what
)
+
1
)
;
int
iterator
=
0
;
char
*
yo
=
static_cast
(
temp
)
+
strlen
(
what
)
+
1
;
char
*
tempptr
=
static_cast
(
where_
)
;
while
(
iterator
[QUOTE="ishi"]
Обновляю запрос.
В yo была утечка, исправив слепил это:
C++:
int
findstring
(
void
*
where_
,
char
*
what
,
int
whereSize
)
{
void
*
temp
=
malloc
(
strlen
(
what
)
+
1
)
;
int
iterator
=
0
;
char
*
yo
=
static_cast
(
temp
)
+
strlen
(
what
)
+
1
;
char
*
tempptr
=
static_cast
(
where_
)
;
while
(
iterator
C++:
[CODE]
char
*
yo
=
static_cast
(
temp
)
+
strlen
(
what
)
+
1
;
+ 1 не нужен, так ты будешь получать указатель на конец строки + 1, а это не только может приводить к неправильному результату функции, но и изменять данные в чужой выделенной памяти и приводить к сбою программы
C++:
[CODE]
while
(
iterator
Тут должен быть оператор
C++:
[CODE]
int
findstring
(
void
*
where_
,
char
*
what
,
int
whereSize
)
{
void
*
temp
=
malloc
(
strlen
(
what
)
+
1
)
;
int
iterator
=
0
;
char
*
yo
=
static_cast
(
temp
)
+
strlen
(
what
)
;
char
*
tempptr
=
static_cast
(
where_
)
;
while
(
iterator
И вообще, можно было бы реализовать функцию и без промежуточного буфера temp, не знаю зачем ты это сделал.
Или вовсе использовать strstr, раз уже используешь strcmp.
C++:
[CODE]
int
findstring
(
const
char
*
str1
,
const
char
*
str2
)
{
int
str1_len
=
strlen
(
str1
)
;
int
str2_len
=
strlen
(
str2
)
;
for
(
int
i
=
0
;
i
enziweee
06.07.2019, 23:34
в общем проблема, пытаюсь отрендерить линию от головы до пуза, в итоге линия строится нормально только на первого попавшегося в радиусе стрима актера, на остальных выходит кривота, как исправлять?
C++:
for
(
int
i
=
0
;
i
GetPlayerPool
(
)
;
CRemotePlayer
*
pRemote
;
if
(
pPlayerPool
->
GetPlayer
(
i
)
)
{
pRemote
=
pPlayerPool
->
GetPlayer
(
i
)
;
if
(
pRemote
->
m_pPed
)
{
SAMP
::
CPed
*
pRemotePed
=
pRemote
->
m_pPed
;
// Handle REMOTE Player
SAMP
::
CPed
*
pLocalPed
=
SAMP
::
pGame
->
m_pPlayerPed
;
// Handle LOCAL Player
if
(
!
pRemotePed
->
IsDead
(
)
||
!
pLocalPed
->
IsDead
(
)
)
{
SAMP
::
CVector pRemoteFirstBoneVector
;
pRemotePed
->
GetBonePosition
(
BONE_HEAD
,
&
pRemoteFirstBoneVector
)
;
SAMP
::
CVector pRemoteSecondBoneVector
;
pRemotePed
->
GetBonePosition
(
BONE_SPINE1
,
&
pRemoteSecondBoneVector
)
;
D3DXVECTOR3 pRemoteFirstBoneDX
;
pRemoteFirstBoneDX
.
x
=
pRemoteFirstBoneVector
.
x
;
pRemoteFirstBoneDX
.
y
=
pRemoteFirstBoneVector
.
y
;
pRemoteFirstBoneDX
.
z
=
pRemoteFirstBoneVector
.
z
;
D3DXVECTOR3 pRemoteSecondBoneDX
;
pRemoteSecondBoneDX
.
x
=
pRemoteSecondBoneVector
.
x
;
pRemoteSecondBoneDX
.
y
=
pRemoteSecondBoneVector
.
y
;
pRemoteSecondBoneDX
.
z
=
pRemoteSecondBoneVector
.
z
;
D3DXVECTOR3 firstCalculated
;
D3DXVECTOR3 secondCalculated
;
CalcScreenCoors
(
&
pRemoteFirstBoneDX
,
&
firstCalculated
)
;
CalcScreenCoors
(
&
pRemoteSecondBoneDX
,
&
secondCalculated
)
;
draw
.
Line
(
firstCalculated
.
x
,
firstCalculated
.
y
,
secondCalculated
.
x
,
secondCalculated
.
y
,
D3DCOLOR_ARGB
(
255
,
255
,
255
,
255
)
)
;
//draw.Text(screenPosEx.x, screenPosEx.y, nickname, fontColor, false, TextAlignment::kCenter);
}
}
}
}
Eu-xFuZUfxU.jpgenziweee · 6 Июл 2019 в 22:34' data-fancybox="lb-post-364267" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="/proxy.php?image=https%3A%2F%2Fpp.userapi.com%2Fc85 1432%2Fv851432882%2F163f36%2FEu-xFuZUfxU.jpg&hash=708997e6c7b872a49ea3b1d80d772300" style="cursor: pointer;" title="Eu-xFuZUfxU.jpg">
https://pp.userapi.com/c851432/v851432882/163f36/Eu-xFuZUfxU.jpg
rraggerr
06.07.2019, 23:54
в общем проблема, пытаюсь отрендерить линию от головы до пуза, в итоге линия строится нормально только на первого попавшегося в радиусе стрима актера, на остальных выходит кривота, как исправлять?
C++:
for
(
int
i
=
0
;
i
GetPlayerPool
(
)
;
CRemotePlayer
*
pRemote
;
if
(
pPlayerPool
->
GetPlayer
(
i
)
)
{
pRemote
=
pPlayerPool
->
GetPlayer
(
i
)
;
if
(
pRemote
->
m_pPed
)
{
SAMP
::
CPed
*
pRemotePed
=
pRemote
->
m_pPed
;
// Handle REMOTE Player
SAMP
::
CPed
*
pLocalPed
=
SAMP
::
pGame
->
m_pPlayerPed
;
// Handle LOCAL Player
if
(
!
pRemotePed
->
IsDead
(
)
||
!
pLocalPed
->
IsDead
(
)
)
{
SAMP
::
CVector pRemoteFirstBoneVector
;
pRemotePed
->
GetBonePosition
(
BONE_HEAD
,
&
pRemoteFirstBoneVector
)
;
SAMP
::
CVector pRemoteSecondBoneVector
;
pRemotePed
->
GetBonePosition
(
BONE_SPINE1
,
&
pRemoteSecondBoneVector
)
;
D3DXVECTOR3 pRemoteFirstBoneDX
;
pRemoteFirstBoneDX
.
x
=
pRemoteFirstBoneVector
.
x
;
pRemoteFirstBoneDX
.
y
=
pRemoteFirstBoneVector
.
y
;
pRemoteFirstBoneDX
.
z
=
pRemoteFirstBoneVector
.
z
;
D3DXVECTOR3 pRemoteSecondBoneDX
;
pRemoteSecondBoneDX
.
x
=
pRemoteSecondBoneVector
.
x
;
pRemoteSecondBoneDX
.
y
=
pRemoteSecondBoneVector
.
y
;
pRemoteSecondBoneDX
.
z
=
pRemoteSecondBoneVector
.
z
;
D3DXVECTOR3 firstCalculated
;
D3DXVECTOR3 secondCalculated
;
CalcScreenCoors
(
&
pRemoteFirstBoneDX
,
&
firstCalculated
)
;
CalcScreenCoors
(
&
pRemoteSecondBoneDX
,
&
secondCalculated
)
;
draw
.
Line
(
firstCalculated
.
x
,
firstCalculated
.
y
,
secondCalculated
.
x
,
secondCalculated
.
y
,
D3DCOLOR_ARGB
(
255
,
255
,
255
,
255
)
)
;
//draw.Text(screenPosEx.x, screenPosEx.y, nickname, fontColor, false, TextAlignment::kCenter);
}
}
}
}
Eu-xFuZUfxU.jpgrraggerr · 6 Июл 2019 в 22:54' data-fancybox="lb-post-364276" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="/proxy.php?image=https%3A%2F%2Fpp.userapi.com%2Fc85 1432%2Fv851432882%2F163f36%2FEu-xFuZUfxU.jpg&hash=708997e6c7b872a49ea3b1d80d772300" style="cursor: pointer;" title="Eu-xFuZUfxU.jpg">
https://pp.userapi.com/c851432/v851432882/163f36/Eu-xFuZUfxU.jpg
попробуй добавить проверку на
if (CalcScreenCoors)
и на
GetBonePosition
и еще у тебя ошибки, кароче на
C++:
if
(
pLocalPed
->
IsDead
(
)
)
return
;
for
(
int
i
=
0
;
i
GetPlayerPool
(
)
;
CRemotePlayer
*
pRemote
;
if
(
pPlayerPool
&&
pPlayerPool
->
GetPlayer
(
i
)
)
{
pRemote
=
pPlayerPool
->
GetPlayer
(
i
)
;
if
(
pRemote
->
m_pPed
)
{
SAMP
::
CPed
*
pRemotePed
=
pRemote
->
m_pPed
;
// Handle REMOTE Player
SAMP
::
CPed
*
pLocalPed
=
SAMP
::
pGame
->
m_pPlayerPed
;
// Handle LOCAL Player
if
(
pRemotePed
&&
pLocalPed
&&
!
pRemotePed
->
IsDead
(
)
)
{
SAMP
::
CVector pRemoteFirstBoneVector
;
if
(
!
pRemotePed
->
GetBonePosition
(
BONE_HEAD
,
&
pRemoteFirstBoneVector
)
)
continue
;
SAMP
::
CVector pRemoteSecondBoneVector
;
if
(
!
pRemotePed
->
GetBonePosition
(
BONE_SPINE1
,
&
pRemoteSecondBoneVector
)
)
continue
;
D3DXVECTOR3 pRemoteFirstBoneDX
;
pRemoteFirstBoneDX
.
x
=
pRemoteFirstBoneVector
.
x
;
pRemoteFirstBoneDX
.
y
=
pRemoteFirstBoneVector
.
y
;
pRemoteFirstBoneDX
.
z
=
pRemoteFirstBoneVector
.
z
;
D3DXVECTOR3 pRemoteSecondBoneDX
;
pRemoteSecondBoneDX
.
x
=
pRemoteSecondBoneVector
.
x
;
pRemoteSecondBoneDX
.
y
=
pRemoteSecondBoneVector
.
y
;
pRemoteSecondBoneDX
.
z
=
pRemoteSecondBoneVector
.
z
;
D3DXVECTOR3 firstCalculated
;
D3DXVECTOR3 secondCalculated
;
if
(
!
CalcScreenCoors
(
&
pRemoteFirstBoneDX
,
&
firstCalculated
)
)
continue
;
if
(
CalcScreenCoors
(
&
pRemoteSecondBoneDX
,
&
secondCalculated
)
)
continue
;
draw
.
Line
(
firstCalculated
.
x
,
firstCalculated
.
y
,
secondCalculated
.
x
,
secondCalculated
.
y
,
D3DCOLOR_ARGB
(
255
,
255
,
255
,
255
)
)
;
//draw.Text(screenPosEx.x, screenPosEx.y, nickname, fontColor, false, TextAlignment::kCenter);
}
}
}
}
enziweee
06.07.2019, 23:58
попробуй добавить проверку на
if (CalcScreenCoors)
и на
GetBonePosition
каким образом................
rraggerr
07.07.2019, 00:01
каким образом................
скопируй код и вставь, я не ебу что у тебя там за сдк, явно не сампфункс
enziweee
07.07.2019, 00:10
скопируй код и вставь, я не ебу что у тебя там за сдк, явно не сампфункс
лучара сдк
https://pp.userapi.com/c849528/v849528443/1c2b3b/YgD18WcOiuQ.jpg
C++:
// Возникает ошибка
string data
;
CHAR szBuffer
[
1024
]
;
strcpy
(
szBuffer
,
"{\"hash\":\"475d03f623908a13b6d8171221119a77\"}"
)
;
data
+=
szBuffer
;
// Не возникает ошибка
string data
;
CHAR szBuffer
[
1024
]
;
strcpy
(
szBuffer
,
"TEST"
)
;
data
+=
szBuffer
;
Хелп
https://pp.userapi.com/c849528/v849528443/1c2b3b/YgD18WcOiuQ.jpg
C++:
// Возникает ошибка
string data
;
CHAR szBuffer
[
1024
]
;
strcpy
(
szBuffer
,
"{\"hash\":\"475d03f623908a13b6d8171221119a77\"}"
)
;
data
+=
szBuffer
;
// Не возникает ошибка
string data
;
CHAR szBuffer
[
1024
]
;
strcpy
(
szBuffer
,
"TEST"
)
;
data
+=
szBuffer
;
Хелп
Попробуй заменить CHAR на char
все норм робит
https://forum.antichat.xyz/attachments/27364446/
Попробуй заменить CHAR на char
все норм робит
Разницы никакой, ошибка также останется (проверено уже давно).
https://pp.userapi.com/c849228/v849228443/1de51f/LszezczgoVE.jpg
Какой толк проверять компиляцию если ошибка появляется при запуске? Скомпилировать и я могу...
Разницы никакой, ошибка также останется (проверено уже давно).
https://pp.userapi.com/c849228/v849228443/1de51f/LszezczgoVE.jpg
Какой толк проверять компиляцию если ошибка появляется при запуске? Скомпилировать и я могу...
Оно скомпилировалось и выполнилось и вывело строку
Оно скомпилировалось и выполнилось и вывело строку
Уже всё, решил проблему
+ 1 не нужен, так ты будешь получать указатель на конец строки + 1, а это не только может приводить к неправильному результату функции, но и изменять данные в чужой выделенной памяти и приводить к сбою программы
И вообще, можно было бы реализовать функцию и без промежуточного буфера temp
В моём случае, строка может быть слеплена с другими символами, и если скопировав её не оградить нулём, strcmp может принять следующий символ за её продолжение, и выдать 1 вместо 0, даже если константа меньшего размера, что с одной стороны и логично, ведь он выдаёт 1, а значит первое больше, но с другой стороны мне этого совершенно не нужно, и хватит сравнения того числа символов, что получено как искомая строка.
Как раз для ограждения и нужен yo, как указатель на конец. У меня не вполне адекватно себя ведёт преобразование памяти ptrTo*, потому вместо инкремента имеющегося адреса я создал указатель. Мб я криворукий, но так хотя бы ошибки доступа мозг не выносят.
temp как раз служит хранилищем для строки, без доп буфера я не нашёл способ оградить байты нулём и сравнить с искомой строкой, ну а без нуля шо - описал выше.
strstr
Он не ищет дальше первого нуля. В моём случае пришлось бы обрабатывать каждый ноль, а это геморрой, на мой взгляд
[QUOTE="_Vine_"]
Тут должен быть оператор
[QUOTE="ishi"]
[QUOTE="Спойлер"]
[COLOR="#363940"]
Обновляю запрос.
В yo была утечка, исправив слепил это:
C++:
[CODE]
int
findstring
(
void
*
where_
,
char
*
what
,
int
whereSize
)
{
void
*
temp
=
malloc
(
strlen
(
what
)
+
1
)
;
int
iterator
=
0
;
char
*
yo
=
static_cast
(
temp
)
+
strlen
(
what
)
+
1
;
char
*
tempptr
=
static_cast
(
where_
)
;
while
(
iterator
Теперь из десяти запусков по 100 вызовов, 8-9 запусков идут без ошибок, а конкретно: ошибка вылетает первые
-raymond-
07.07.2019, 20:17
как перезаписать строку времени в /timestamp?
CatKnight
08.07.2019, 16:06
Как можно при помощи СФ заблокировать камеру свою (т.е. чтобы нельзя было ей вращать вокруг персонажа)?
почему при втором запросе вылетает игра?
C++:
void
AddToString
(
char
*
*
myStr
,
const
char
*
sourse
)
{
char
*
newStr
;
if
(
*
myStr
!=
nullptr
)
{
if
(
sizeof
(
*
myStr
)
>=
strlen
(
*
myStr
)
+
strlen
(
sourse
)
+
1
)
{
strcat
(
*
myStr
,
sourse
)
;
return
;
}
else
{
newStr
=
new
char
[
strlen
(
*
myStr
)
+
strlen
(
sourse
)
+
1
]
;
strcpy
(
newStr
,
*
myStr
)
;
strcat
(
newStr
,
sourse
)
;
delete
[
]
*
myStr
;
}
}
else
{
newStr
=
new
char
[
strlen
(
sourse
)
+
1
]
;
strcpy
(
newStr
,
sourse
)
;
}
*
myStr
=
newStr
;
}
const
char
*
SendPost
(
const
char
*
site
,
const
char
*
file
,
char
*
data
,
char
*
*
mainBuf
,
bool
*
isError
)
{
if
(
*
mainBuf
==
nullptr
)
AddToString
(
mainBuf
,
""
)
;
HINTERNET hSession
=
InternetOpenA
(
"Test"
,
INTERNET_OPEN_TYPE_PRECONFIG
,
NULL
,
NULL
,
0
)
;
if
(
hSession
!=
NULL
)
{
HINTERNET hConnect
=
InternetConnectA
(
hSession
,
site
,
INTERNET_DEFAULT_HTTP_PORT
,
NULL
,
NULL
,
INTERNET_SERVICE_HTTP
,
0
,
1
)
;
if
(
hConnect
!=
NULL
)
{
HINTERNET hHttpRequest
=
HttpOpenRequestA
(
hConnect
,
"POST"
,
file
,
NULL
,
NULL
,
0
,
0
,
1
)
;
if
(
hHttpRequest
!=
NULL
)
{
char
szReq
[
1024
]
=
""
,
szBuffer
[
1025
]
;
DWORD dwByteRead
=
0
;
BOOL bRead
;
if
(
*
mainBuf
!=
nullptr
)
mainBuf
[
0
]
=
'\0'
;
LPCSTR header
;
header
=
"Accept: *\/*"
;
HttpAddRequestHeadersA
(
hHttpRequest
,
header
,
strlen
(
header
)
,
HTTP_ADDREQ_FLAG_ADD
)
;
header
=
"Content-Type: application/x-www-form-urlencoded"
;
HttpAddRequestHeadersA
(
hHttpRequest
,
header
,
strlen
(
header
)
,
HTTP_ADDREQ_FLAG_ADD
)
;
if
(
HttpSendRequestA
(
hHttpRequest
,
NULL
,
0
,
data
,
strlen
(
data
)
)
)
{
while
(
true
)
{
bRead
=
InternetReadFile
(
hHttpRequest
,
szBuffer
,
sizeof
(
szBuffer
)
-
1
,
&
dwByteRead
)
;
if
(
bRead
==
FALSE
||
dwByteRead
==
0
)
break
;
szBuffer
[
dwByteRead
]
=
'\0'
;
AddToString
(
mainBuf
,
szBuffer
)
;
}
if
(
isError
!=
nullptr
)
*
isError
=
false
;
}
else
if
(
isError
!=
nullptr
)
*
isError
=
true
;
}
else
if
(
isError
!=
nullptr
)
*
isError
=
true
;
InternetCloseHandle
(
hHttpRequest
)
;
}
else
if
(
isError
!=
nullptr
)
*
isError
=
true
;
InternetCloseHandle
(
hConnect
)
;
}
else
if
(
isError
!=
nullptr
)
*
isError
=
true
;
InternetCloseHandle
(
hSession
)
;
return
*
mainBuf
;
}
sizeof(*myStr)
Скорее всего проблема в том, что здесь всегда будет результат 4 (8) при компиляции в x32 (x64).
Лучше используй std::string.
Скорее всего проблема в том, что здесь всегда будет результат 4 (8) при компиляции в x32 (x64).
Лучше используй std::string.
Спасибо, я попробовал оно не вызывает ошибки но теперь буду знать чо как, вылет так и остался если коннект к несуществующему серверу или который не работает, мне нужно как то узнать что коннект идет к не существущему серверу, а оно мне сразу вылет
Спасибо, я попробовал оно не вызывает ошибки но теперь буду знать чо как, вылет так и остался если коннект к несуществующему серверу или который не работает, мне нужно как то узнать что коннект идет к не существущему серверу, а оно мне сразу вылет
Используй отладчик при возникновении проблем.
Гайд - Интегрированная отладка asi/sf/dll плагинов в игре с помощью Visual Studio (https://blast.hk/threads/20320/)
прив Многие ли из вас знают, что с помощью Visual Studio можно отлаживать плагины прямо в игре и что делается это очень просто? Нет, блять, нихуя вы не знаете! Но я вас научу. Берём студию и проект своего плагина, идём в конфигурацию проекта на страницу "Debugging" (Отладка) и ставим такие...
blast.hk
Используй отладчик при возникновении проблем.
Гайд - Интегрированная отладка asi/sf/dll плагинов в игре с помощью Visual Studio (https://blast.hk/threads/20320/)
прив Многие ли из вас знают, что с помощью Visual Studio можно отлаживать плагины прямо в игре и что делается это очень просто? Нет, блять, нихуя вы не знаете! Но я вас научу. Берём студию и проект своего плагина, идём в конфигурацию проекта на страницу "Debugging" (Отладка) и ставим такие...
blast.hk
Затупил, проблема была именно в sizeof(*myStr) . Чотко
При компиляции вот такие ошибки, как можно починить?
https://forum.antichat.xyz/attachments/27366453/
При компиляции вот такие ошибки, как можно починить?
Установи DirectX SDK (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS9lbi11cy9kb3dubG 9hZC9kZXRhaWxzLmFzcHg_aWQ9NjgxMg)
Установи DirectX SDK (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS9lbi11cy9kb3dubG 9hZC9kZXRhaWxzLmFzcHg_aWQ9NjgxMg)
Поставил,комп релонул, но проблема осталась
https://forum.antichat.xyz/attachments/27366513/
Поставил,комп релонул, но проблема осталась
Надо указать Windows SDK в свойствах проекта
Что делать если вот такая ошибка, я предлагаю выкинуть комп в окно но моя вторая личность против
https://forum.antichat.xyz/attachments/27366709/
код прикрепи где рисуешь
C++:
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
{
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
static
bool
bAimbot
;
ImGui
::
Begin
(
"Test"
,
NULL
,
ImVec2
(
300
,
-
1
)
,
1
,
ImGuiWindowFlags_NoCollapse
|
ImGuiWindowFlags_NoSavedSettings
|
ImGuiWindowFlags_NoResize
)
;
ImGui
::
Checkbox
(
"Aimbot"
,
&
bAimbot
)
;
ImGui
::
End
;
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
SF
->
getRender
(
)
->
EndRender
(
)
;
}
C++:
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
{
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
static
bool
bAimbot
;
ImGui
::
Begin
(
"Test"
,
NULL
,
ImVec2
(
300
,
-
1
)
,
1
,
ImGuiWindowFlags_NoCollapse
|
ImGuiWindowFlags_NoSavedSettings
|
ImGuiWindowFlags_NoResize
)
;
ImGui
::
Checkbox
(
"Aimbot"
,
&
bAimbot
)
;
ImGui
::
End
;
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
SF
->
getRender
(
)
->
EndRender
(
)
;
}
C++:
bool
window
=
false
;
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
{
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
if
(
window
)
{
ImGui
::
Begin
(
u8
""
,
&
activew
,
ImVec2
(
305
,
160
)
,
0.8f
)
;
{
}
ImGui
::
End
(
)
;
}
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
SF
->
getRender
(
)
->
EndRender
(
)
;
}
У меня вот так всё норм работает
C++:
bool
window
=
false
;
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
{
ImGui_ImplDX9_NewFrame
(
)
;
ImGui_ImplWin32_NewFrame
(
)
;
ImGui
::
NewFrame
(
)
;
if
(
window
)
{
ImGui
::
Begin
(
u8
""
,
&
activew
,
ImVec2
(
305
,
160
)
,
0.8f
)
;
{
}
ImGui
::
End
(
)
;
}
ImGui
::
EndFrame
(
)
;
ImGui
::
Render
(
)
;
ImGui_ImplDX9_RenderDrawData
(
ImGui
::
GetDrawData
(
)
)
;
SF
->
getRender
(
)
->
EndRender
(
)
;
}
У меня вот так всё норм работает
Я чес хз что было не так, вставил твой код все заработало, спс
как это из луа превратить в сф
Lua:
sampIsLocalPlayerSpawned
(
)
Vadim.dll
10.07.2019, 23:22
Почему эта херня крашиииит? Адреса все правильные, проверял. Где-то ошибка в определении функции? Перепробовал уже все что можно
C++:
typedef
void
(
__stdcall
*
_PrintChatMsg
)
(
DWORD chat_info
,
wchar_t
*
message
)
;
void
mainThread
(
PVOID
)
{
MessageBoxW
(
NULL
,
L
"WAIT"
,
L
"WAIT"
,
MB_OK
)
;
DWORD dwSamp
=
(
DWORD
)
GetModuleHandle
(
L
"samp.dll"
)
;
_PrintChatMsg print_char_msg
=
(
_PrintChatMsg
)
(
dwSamp
+
0x64520
)
;
DWORD chat_info
=
(
DWORD
)
(
dwSamp
+
0x21A0E4
)
;
print_char_msg
(
chat_info
,
(
wchar_t
*
)
L
"Hello world!"
)
;
}
Почему эта херня крашиииит? Адреса все правильные, проверял. Где-то ошибка в определении функции? Перепробовал уже все что можно
C++:
typedef
void
(
__stdcall
*
_PrintChatMsg
)
(
DWORD chat_info
,
wchar_t
*
message
)
;
void
mainThread
(
PVOID
)
{
MessageBoxW
(
NULL
,
L
"WAIT"
,
L
"WAIT"
,
MB_OK
)
;
DWORD dwSamp
=
(
DWORD
)
GetModuleHandle
(
L
"samp.dll"
)
;
_PrintChatMsg print_char_msg
=
(
_PrintChatMsg
)
(
dwSamp
+
0x64520
)
;
DWORD chat_info
=
(
DWORD
)
(
dwSamp
+
0x21A0E4
)
;
print_char_msg
(
chat_info
,
(
wchar_t
*
)
L
"Hello world!"
)
;
}
1. Второй аргумент функции имеет тип
char *
, а не
wchar_t *
.
2. В какой кодировке идет компиляция? Есть подозрение, что компилируешь с набором символов ANSI. В этом случае макрос GetModuleHandle заменяется на функцию GetModuleHandleA, принимает твою Юникод-строку, возвращает NULL и далее идет попытка вызова функции по адресу NULL + 0x64520 с ошибкой доступа.
Vadim.dll
11.07.2019, 00:48
1. Второй аргумент функции имеет тип
char *
, а не
wchar_t *
.
2. В какой кодировке идет компиляция? Есть подозрение, что компилируешь с набором символов ANSI. В этом случае макрос GetModuleHandle заменяется на функцию GetModuleHandleA, принимает твою Юникод-строку, возвращает NULL и далее идет попытка вызова функции по адресу NULL + 0x64520 с ошибкой доступа.
Пробовал с char - не помогает, Компилирую с набором символов Юникод, написал же выше, что адреса проверил, все правильно
Почему эта херня крашиииит? Адреса все правильные, проверял. Где-то ошибка в определении функции? Перепробовал уже все что можно
C++:
typedef
void
(
__stdcall
*
_PrintChatMsg
)
(
DWORD chat_info
,
wchar_t
*
message
)
;
void
mainThread
(
PVOID
)
{
MessageBoxW
(
NULL
,
L
"WAIT"
,
L
"WAIT"
,
MB_OK
)
;
DWORD dwSamp
=
(
DWORD
)
GetModuleHandle
(
L
"samp.dll"
)
;
_PrintChatMsg print_char_msg
=
(
_PrintChatMsg
)
(
dwSamp
+
0x64520
)
;
DWORD chat_info
=
(
DWORD
)
(
dwSamp
+
0x21A0E4
)
;
print_char_msg
(
chat_info
,
(
wchar_t
*
)
L
"Hello world!"
)
;
}
Эта функция имеет переменное количество аргументов
Сделай такой прототип функции
C++:
typedef
void
(
__stdcall
*
_PrintChatMsg
)
(
DWORD chat_info
,
const
char
*
message
,
.
.
.
)
;
Эта функция имеет переменное количество аргументов
Сделай такой прототип функции
C++:
typedef
void
(
__stdcall
*
_PrintChatMsg
)
(
DWORD chat_info
,
const
char
*
message
,
.
.
.
)
;
stdcall
переменное количество аргументов
фигню говоришь
Почему эта херня крашиииит? Адреса все правильные, проверял. Где-то ошибка в определении функции? Перепробовал уже все что можно
C++:
typedef
void
(
__stdcall
*
_PrintChatMsg
)
(
DWORD chat_info
,
wchar_t
*
message
)
;
void
mainThread
(
PVOID
)
{
MessageBoxW
(
NULL
,
L
"WAIT"
,
L
"WAIT"
,
MB_OK
)
;
DWORD dwSamp
=
(
DWORD
)
GetModuleHandle
(
L
"samp.dll"
)
;
_PrintChatMsg print_char_msg
=
(
_PrintChatMsg
)
(
dwSamp
+
0x64520
)
;
DWORD chat_info
=
(
DWORD
)
(
dwSamp
+
0x21A0E4
)
;
print_char_msg
(
chat_info
,
(
wchar_t
*
)
L
"Hello world!"
)
;
}
у тя прототип не правильный. а ещё ты берешь не указатель на структуру чата, а указатель на указатель на структуру чата. исправляй
Vadim.dll
11.07.2019, 12:22
фигню говоришь
у тя прототип не правильный. а ещё ты берешь не указатель на структуру чата, а указатель на указатель на структуру чата. исправляй
Точно! Теперь заработало, спасибо!
Как в ImGui можно сделать чтобы при измении размеров круг и трикутник не выходил за грани темно зеленого квадрата, а обрезался на грани
https://forum.antichat.xyz/attachments/27366949/
А что это за элементы ? Дай код
Вот
C++:
#define RGBA_TO_FLOAT(r,g,b,a) (float)r/255.0f, (float)g/255.0f, (float)b/255.0f, (float)a/255.0f
void
PlayerItem
(
const
char
*
str_id
,
bool
*
online
=
nullptr
,
bool
*
spectate
=
nullptr
)
{
ImVec2 p
=
ImGui
::
GetCursorScreenPos
(
)
;
ImDrawList
*
draw_list
=
ImGui
::
GetWindowDrawList
(
)
;
float
height
=
ImGui
::
GetFrameHeight
(
)
+
0.001
;
float
width
=
ImGui
::
GetWindowContentRegionWidth
(
)
+
0.001
-
height
/
2
;
p
.
x
+=
height
/
2
;
ImGui
::
InvisibleButton
(
str_id
,
ImVec2
(
width
,
height
)
)
;
ImGuiContext
&
g
=
*
GImGui
;
float
t
=
ImGui
::
IsItemHovered
(
)
?
1.0f
:
0.0f
;
float
ANIM_SPEED
=
0.00001f
;
if
(
g
.
LastActiveId
==
g
.
CurrentWindow
->
GetID
(
str_id
)
)
{
float
t_anim
=
ImSaturate
(
g
.
LastActiveIdTimer
/
ANIM_SPEED
)
;
t
=
ImGui
::
IsItemHovered
(
)
?
(
t_anim
)
:
(
1.0f
-
t_anim
)
;
}
ImU32 col_bg
;
const
ImVec2 text_size
=
CalcTextSize
(
str_id
)
;
col_bg
=
ImGui
::
GetColorU32
(
ImLerp
(
ImVec4
(
RGBA_TO_FLOAT
(
19
,
26
,
19
,
255
)
)
,
ImVec4
(
RGBA_TO_FLOAT
(
15
,
40
,
15
,
255
)
)
,
t
)
)
;
draw_list
->
AddRectFilled
(
p
,
ImVec2
(
p
.
x
+
width
,
p
.
y
+
height
)
,
col_bg
,
height
*
0.2f
)
;
RenderTextClipped
(
ImVec2
(
p
.
x
+
height
/
2
,
p
.
y
+
(
height
-
text_size
.
y
)
/
2
)
,
ImVec2
(
p
.
x
+
width
-
height
-
height
/
4
,
p
.
y
+
height
/
2
+
height
/
4
)
,
str_id
,
(
const
char
*
)
0
,
&
text_size
)
;
if
(
online
!=
nullptr
)
{
draw_list
->
AddCircleFilled
(
ImVec2
(
p
.
x
+
width
-
height
/
2
,
p
.
y
+
height
/
2
)
,
height
/
4
,
ImGui
::
GetColorU32
(
*
online
?
ImVec4
(
RGBA_TO_FLOAT
(
2
,
114
,
6
,
255
)
)
:
ImVec4
(
RGBA_TO_FLOAT
(
184
,
19
,
19
,
255
)
)
)
)
;
}
if
(
spectate
!=
nullptr
&&
*
spectate
)
{
draw_list
->
AddTriangleFilled
(
ImVec2
(
p
.
x
+
width
-
height
-
height
/
4
,
p
.
y
+
height
/
2
+
height
/
4
)
,
ImVec2
(
p
.
x
+
width
-
height
,
p
.
y
+
height
/
2
-
height
/
4
)
,
ImVec2
(
p
.
x
+
width
-
height
+
height
/
4
,
p
.
y
+
height
/
2
+
height
/
4
)
,
ImGui
::
GetColorU32
(
ImVec4
(
RGBA_TO_FLOAT
(
224
,
217
,
15
,
255
)
)
)
)
;
}
}
Как можно проверить подключение к серверу?
Vadim.dll
13.07.2019, 15:42
Где находится функция, которая обрабатывает RPC в samp.dll R1 или любой другой версии? Мне бы хотя бы наводку, как ее искать
Jack_Savage
13.07.2019, 16:52
0x3A6A0 - 0.3.7 R3 (вроде тут обработка RPC)
Почему ошибка где-то в вот в этих строках
C++:
typedef
HRESULT
(
WINAPI
*
_EndScene
)
(
IDirect3DDevice9
*
)
;
//прототип
typedef
HRESULT
(
WINAPI
*
_Reset
)
(
IDirect3DDevice9
*
,
D3DPRESENT_PARAMETERS
*
)
;
// они в разных файлах
typedef
void
(
*
_MyEndScene
)
(
IDirect3DDevice9
*
)
;
typedef
void
(
*
_MyReset
)
(
IDirect3DDevice9
*
,
D3DPRESENT_PARAMETERS
*
)
;
Ошибка
https://forum.antichat.xyz/attachments/27368524/
____
Прикрепил исходник
_
Пофиксил
C#:
namespace
RakNet
{
class
Program
{
static
void
Main
(
string
[
]
args
)
{
RakClientNET
rakNet
=
new
RakClientNET
(
)
;
Console
.
Title
=
"RakNet"
;
Console
.
WriteLine
(
"RakNet Started..."
)
;
Console
.
ReadKey
(
)
;
}
}
}
Вылезает вот такая вот ошибка:
https://forum.antichat.xyz/attachments/27368630/
(C# если шо)
может и тут есть люди которые шарят в C#
Musaigen
14.07.2019, 21:21
Есть функция для конвертации игровых координат в экранные в собе?
Неадекватная сова
14.07.2019, 21:30
Есть функция для конвертации игровых координат в экранные в собе?
Посиди потыкай. Авось оно
Код:
\src\game_sa\CHudSA.cpp - CHudSA::CalcScreenCoors (Line 130)
\src\proxyIDirect3DDevice9.cpp - CalcScreenCoors (Line 97)
\src\proxyIDirect3DDevice9.cpp - CalcWorldCoors (Line 122)
Musaigen
14.07.2019, 21:34
Посиди потыкай. Авось оно
Код:
\src\game_sa\CHudSA.cpp - CHudSA::CalcScreenCoors (Line 130)
\src\proxyIDirect3DDevice9.cpp - CalcScreenCoors (Line 97)
\src\proxyIDirect3DDevice9.cpp - CalcWorldCoors (Line 122)
Не, нужно как в sf
SF->getGame()->convertGameCoordsToWindow
Почему возникают эти ошибки?
https://forum.antichat.xyz/attachments/27368762/
везде где я использую имгуи сверху файла я прописал
C++:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
CleanLegend
15.07.2019, 00:00
Не, нужно как в sf
SF->getGame()->convertGameCoordsToWindow
Он тебе всё верно скинул
Почему возникают эти ошибки?
везде где я использую имгуи сверху файла я прописал
C++:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
Не правильно подключил инклуды, посмотри примеры тут:
imgui/examples/example_win32_directx9/main.cpp at master · ocornut/imgui (https://github.com/ocornut/imgui/blob/master/examples/example_win32_directx9/main.cpp)
Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies - ocornut/imgui
github.com
Исходник - ASI Плагин с подключенным ImGui v1.72(WIP) (https://blast.hk/threads/36077/)
Собственно, кто то должен был это сделать, ну и вот. Имеется полная выгрузка, хукер - VMT, не самый лучший хукер. Код вроде как красивый, и соответствует стандартам C++ 2017. Создавался на VS2019, с последними обновлениями. https://github.com/rraggerr/asi_imgui Желательно удалять...
blast.hk
Он тебе всё верно скинул
Не правильно подключил инклуды, посмотри примеры тут:
imgui/examples/example_win32_directx9/main.cpp at master · ocornut/imgui (https://github.com/ocornut/imgui/blob/master/examples/example_win32_directx9/main.cpp)
Dear ImGui: Bloat-free Graphical User interface for C++ with minimal dependencies - ocornut/imgui
github.com
Исходник - ASI Плагин с подключенным ImGui v1.72(WIP) (https://blast.hk/threads/36077/)
Собственно, кто то должен был это сделать, ну и вот. Имеется полная выгрузка, хукер - VMT, не самый лучший хукер. Код вроде как красивый, и соответствует стандартам C++ 2017. Создавался на VS2019, с последними обновлениями. https://github.com/rraggerr/asi_imgui Желательно удалять...
blast.hk
я сравнил в роде все правильно
C++:
#pragma once
#ifndef _STDLLPROGECT_H_
#define _STDLLPROGECT_H_
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
#include
#include "stPlugin.h"
#include "../Hook/d3dhook.h"
#include
#include
#include "../ImGui/imgui.h"
#include "../ImGui/imgui_impl_win32.h"
#include "../ImGui/imgui_impl_dx9.h"
#include "../ImGui/imgui_stdlib.h"
#include "../ImGui/imgui_internal.h"
typedef
void
(
_MyEndScene
)
(
IDirect3DDevice9
*
)
;
typedef
void
(
_MyReset
)
(
IDirect3DDevice9
*
,
D3DPRESENT_PARAMETERS
*
)
;
class
stDLLProject
{
// helpThread
BOOL threadState
=
TRUE
;
HANDLE mainThread
;
// mainThread
LONG PrevWndFunc
=
NULL
;
Plugin
*
pPlug
=
nullptr
;
// D3D9 Hook
static
_EndScene
*
oEndScene
;
static
_Reset
*
oReset
;
static
_MyEndScene
*
endScene
;
static
_MyReset
*
reset
;
static
HRESULT WINAPI
myReset
(
IDirect3DDevice9
*
m_pDevice
,
D3DPRESENT_PARAMETERS
*
pPresentationParameters
)
;
static
HRESULT WINAPI
myEndScene
(
IDirect3DDevice9
*
m_pDevice
)
;
public
:
// SAMP window
HWND m_pGameWindow
=
NULL
;
// D3D9
IDirect3DDevice9
*
device
=
nullptr
;
stDLLProject
(
_beginthread_proc_type func
)
;
// Initialization only in ather thread
void
Init
(
const
uint32_t
&
timeout
=
100
)
;
void
InitHookGameDestructor
(
void
(
__stdcall destructor
)
(
void
)
)
;
void
InitD3D9
(
)
;
void
InitD3D9hook
(
_MyEndScene
*
eendScene
,
_MyReset
*
rreset
)
;
void
InitSAMPWindow
(
const
uint32_t
&
timeout
=
100
)
;
void
InitImGUI
(
)
;
void
InitilizingPlugin
(
)
;
Plugin
*
GetPlugin
(
)
const
;
BOOL
GetThreadState
(
)
const
;
~
stDLLProject
(
)
;
}
;
#endif
// _STDLLPROGECT_H_
d3dhook.h
C++:
#pragma once
#ifndef _D3DHOOK_H_
#define _D3DHOOK_H_
#include
#include
#define DIRECTINPUT_VERSION 0x0800
#include
typedef
HRESULT
(
WINAPI _EndScene
)
(
IDirect3DDevice9
*
)
;
typedef
HRESULT
(
WINAPI _Reset
)
(
IDirect3DDevice9
*
,
D3DPRESENT_PARAMETERS
*
)
;
void
InitHook
(
IDirect3DDevice9
*
device
,
_EndScene
*
myEndScene
,
_Reset
*
myReset
,
_EndScene
*
*
_endScene
,
_Reset
*
*
_reset
)
;
#endif
// _D3DHOOK_H_
я сравнил в роде все правильно
C++:
#pragma once
#ifndef _STDLLPROGECT_H_
#define _STDLLPROGECT_H_
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS 1
#include
#include "stPlugin.h"
#include "../Hook/d3dhook.h"
#include
#include
#include "../ImGui/imgui.h"
#include "../ImGui/imgui_impl_win32.h"
#include "../ImGui/imgui_impl_dx9.h"
#include "../ImGui/imgui_stdlib.h"
#include "../ImGui/imgui_internal.h"
typedef
void
(
_MyEndScene
)
(
IDirect3DDevice9
*
)
;
typedef
void
(
_MyReset
)
(
IDirect3DDevice9
*
,
D3DPRESENT_PARAMETERS
*
)
;
class
stDLLProject
{
// helpThread
BOOL threadState
=
TRUE
;
HANDLE mainThread
;
// mainThread
LONG PrevWndFunc
=
NULL
;
Plugin
*
pPlug
=
nullptr
;
// D3D9 Hook
static
_EndScene
*
oEndScene
;
static
_Reset
*
oReset
;
static
_MyEndScene
*
endScene
;
static
_MyReset
*
reset
;
static
HRESULT WINAPI
myReset
(
IDirect3DDevice9
*
m_pDevice
,
D3DPRESENT_PARAMETERS
*
pPresentationParameters
)
;
static
HRESULT WINAPI
myEndScene
(
IDirect3DDevice9
*
m_pDevice
)
;
public
:
// SAMP window
HWND m_pGameWindow
=
NULL
;
// D3D9
IDirect3DDevice9
*
device
=
nullptr
;
stDLLProject
(
_beginthread_proc_type func
)
;
// Initialization only in ather thread
void
Init
(
const
uint32_t
&
timeout
=
100
)
;
void
InitHookGameDestructor
(
void
(
__stdcall destructor
)
(
void
)
)
;
void
InitD3D9
(
)
;
void
InitD3D9hook
(
_MyEndScene
*
eendScene
,
_MyReset
*
rreset
)
;
void
InitSAMPWindow
(
const
uint32_t
&
timeout
=
100
)
;
void
InitImGUI
(
)
;
void
InitilizingPlugin
(
)
;
Plugin
*
GetPlugin
(
)
const
;
BOOL
GetThreadState
(
)
const
;
~
stDLLProject
(
)
;
}
;
#endif
// _STDLLPROGECT_H_
d3dhook.h
C++:
#pragma once
#ifndef _D3DHOOK_H_
#define _D3DHOOK_H_
#include
#include
#define DIRECTINPUT_VERSION 0x0800
#include
typedef
HRESULT
(
WINAPI _EndScene
)
(
IDirect3DDevice9
*
)
;
typedef
HRESULT
(
WINAPI _Reset
)
(
IDirect3DDevice9
*
,
D3DPRESENT_PARAMETERS
*
)
;
void
InitHook
(
IDirect3DDevice9
*
device
,
_EndScene
*
myEndScene
,
_Reset
*
myReset
,
_EndScene
*
*
_endScene
,
_Reset
*
*
_reset
)
;
#endif
// _D3DHOOK_H_
Не добавил .cpp файлы имгуи в проект
Ку, может кто-то знает, как выглядят эти функи на с++
applyForceToCar
setCarRotationVelocity
addToCarRotationVelocity
Почему при попытке использовать имгуи все летит сюда
https://forum.antichat.xyz/attachments/27369749/
Инициализация
C++:
ImGui
::
CreateContext
(
)
;
ImGui_ImplWin32_Init
(
GetActiveWindow
(
)
)
;
ImGui_ImplDX9_Init
(
*
(
IDirect3DDevice9
*
*
)
0xC97C28
)
;
Почему при попытке использовать имгуи все летит сюда
Инициализация
C++:
ImGui
::
CreateContext
(
)
;
ImGui_ImplWin32_Init
(
GetActiveWindow
(
)
)
;
ImGui_ImplDX9_Init
(
*
(
IDirect3DDevice9
*
*
)
0xC97C28
)
;
Решено Ошибка после подключения imgui (https://blast.hk/threads/37241/#post-364899)
День добрый. Подключил к своему плагину ImGui. Всё работает, но есть одна проблема. Когда на этапе загрузки игры свернуть окно (или выбрать другое окно), то выскакивает следующая ошибка, и игру крашит. Замечал, что у того же мунлоадера или других плагинов с этим всё нормально. Где я сделал...
blast.hk
Как можно выгрузить аsi, и снять хуки которые я поставил через собейтовский клас CDetour
Вот как я снимаю хуки, но хз правильно ли
C++:
bool
RemoveSAMPHook
(
uint32_t
dwFuncOffset
,
void
*
origFunc
,
int
iType
,
int
iSize
)
{
if
(
GetModuleHandle
(
"samp.dll"
)
==
NULL
)
return
false
;
uint32_t
g_dwSAMP_Addr
=
(
uint32_t
)
GetModuleHandle
(
"samp.dll"
)
;
CDetour api
;
return
api
.
Remove
(
(
uint8_t
*
)
(
(
uint32_t
)
g_dwSAMP_Addr
)
+
dwFuncOffset
,
(
uint8_t
*
)
origFunc
,
iType
,
iSize
)
;
}
RemoveSAMPHook
(
SAMP_HOOKENTER_CNETGAME_DESTR
,
oDestrFuncs
[
0
]
,
3
,
5
)
RemoveSAMPHook
(
SAMP_HOOKENTER_CNETGAME_DESTR2
,
oDestrFuncs
[
1
]
,
3
,
5
)
И еще, что я делаю не так, что при инициализации окна сампа то FindWindowA возвращает всегда NULL
C++:
while
(
m_pGameWindow
==
NULL
)
{
m_pGameWindow
=
FindWindowA
(
NULL
,
"GTA:SA:MP"
)
;
Sleep
(
timeout
)
;
}
Musaigen
18.07.2019, 23:39
Есть файл test.h, есть папка game, в ней файл test.cpp, вопрос, как сделать так чтобы я могу инклуднуть файл test.h в test.cpp именно вот так
#include
?
Есть файл test.h, есть папка game, в ней файл test.cpp, вопрос, как сделать так чтобы я могу инклуднуть файл test.h в test.cpp именно вот так
#include
?
Чтобы именно так - они должны лежать в одной директории. В твоем случае можно заинклудить так:
#include
Upd: подзабыл. Парень ниже описал верный способ без "..\".
Есть файл test.h, есть папка game, в ней файл test.cpp, вопрос, как сделать так чтобы я могу инклуднуть файл test.h в test.cpp именно вот так
#include
?
Свойства проекта > Каталоги VC++ > Каталоги включения. Добавляешь путь до папки где лежит test.h
Musaigen
19.07.2019, 23:40
Из-за чего raknet хук может выдавать значение 0 при чтении структуры stOnFootData(также при чтении вообще любых структур)
RakNetHook:
bool
OnReceivePacket
(
Packet
*
p
)
{
if
(
p
->
data
==
nullptr
||
p
->
length
==
0
)
return
true
;
if
(
p
->
data
[
0
]
==
ID_PLAYER_SYNC
)
{
BitStream
bs
(
p
->
data
,
p
->
length
,
false
)
;
uint16_t
playerID
=
uint16_t
(
-
1
)
;
stOnFootData data
{
0
}
;
bs
.
ResetReadPointer
(
)
;
bs
.
IgnoreBits
(
8
)
;
bs
.
Read
(
playerID
)
;
bs
.
Read
(
(
PCHAR
)
&
data
,
sizeof
(
stOnFootData
)
)
;
// Дальше происходит форматирование и вывод.
}
}
Пытаюсь вывести айди(playerID) и позицию игрока(data.fPosition)
ID - высвечивается нормально, как положено.
Позиция игрока - выводится как 0
Конфликтов между собейтом или другими плагинами/скриптами нет.
CleanLegend
20.07.2019, 00:22
Из-за чего raknet хук может выдавать значение 0 при чтении структуры stOnFootData(также при чтении вообще любых структур)
RakNetHook:
bool
OnReceivePacket
(
Packet
*
p
)
{
if
(
p
->
data
==
nullptr
||
p
->
length
==
0
)
return
true
;
if
(
p
->
data
[
0
]
==
ID_PLAYER_SYNC
)
{
BitStream
bs
(
p
->
data
,
p
->
length
,
false
)
;
uint16_t
playerID
=
uint16_t
(
-
1
)
;
stOnFootData data
{
0
}
;
bs
.
ResetReadPointer
(
)
;
bs
.
IgnoreBits
(
8
)
;
bs
.
Read
(
playerID
)
;
bs
.
Read
(
(
PCHAR
)
&
data
,
sizeof
(
stOnFootData
)
)
;
// Дальше происходит форматирование и вывод.
}
}
Пытаюсь вывести айди(playerID) и позицию игрока(data.fPosition)
ID - высвечивается нормально, как положено.
Позиция игрока - выводится как 0
Конфликтов между собейтом или другими плагинами/скриптами нет.
Чтение получаемого пакета PlayerSync и VehicleSync происходит по другому. Вроде в ракботе есть полный пример, вот не полный - https://gitlab.com/RcKoid/mod-s0beit-overlight/blob/master/src/Hooked RakNet/HookedRakClient.cpp#L98 (https://gitlab.com/RcKoid/mod-s0beit-overlight/blob/master/src/Hooked%20RakNet/HookedRakClient.cpp#L98)
Как можно точно конвертировать координаты текстдрава которые приходят с сервер на расширение моего монитора
Я делаю вот так но на мониторе отображается не точно(+- 5 пикс) с текстдравом который принял самп
C++:
x
=
(
dMaxX
/
640.
)
*
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
playerTextdraw
[
i
]
->
fX
;
y
=
(
dMaxY
/
448.
)
*
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
playerTextdraw
[
i
]
->
fY
;
SF
->
getRender
(
)
->
DrawBox
(
x
,
y
,
5
,
5
,
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
playerTextdraw
[
i
]
->
dwBoxColor
)
;
C++:
POINT
get_screen_resolution
(
)
{
POINT pos
;
pos
.
x
=
*
(
int
*
)
0xC9C040
;
pos
.
y
=
*
(
int
*
)
0xC9C044
;
return
pos
;
}
Расширение екрана я знаю, просто с сервера приходит размещение текстдрава в float для расширения 640x448
я конвертирую для своего расширения, но выходит не точное значение
Расширение екрана я знаю, просто с сервера приходит размещение текстдрава в float для расширения 640x448
я конвертирую для своего расширения, но выходит не точное значение
Проще самому прибавить допустим 5 пикселей, похожий баг был с получением координат радара
Проще самому прибавить допустим 5 пикселей, похожий баг был с получением координат радара
Как можно узнать высоту текстдрава textdraw->fBoxSizeY не подходит по причине того что данные не корректные
textdraw->fBoxSizeX вертает большее значение за textdraw->fX // корректно
textdraw->fBoxSizeY вертает меньшее значение за textdraw->fY // из под коня
// почему так?
эта зеленая черточка на скрине должна быть равна высоте текстдрава сытости, но это не так
https://forum.antichat.xyz/attachments/27372418/
--------------------------------------------
Решено
Musaigen
21.07.2019, 19:38
Как получить свой CPed?
При вызове так
pGameInterface->GetPools()->GetPed((DWORD*)pPlayers->pLocalPlayer->pSAMP_Actor->pGTA_Ped);
происходит краш.
При вызове так
pGameInterface->GetPools()->GetPedFromRef(pGameInterface->GetPools()->GetPedRef((DWORD*)pPlayers->pLocalPlayer->pSAMP_Actor->pGTA_Ped))
также краш.
pGTA_Ped валидный
zMViToS_
22.07.2019, 20:44
Всем привет, это снова я по поводу SAMP Mobile. Научил клиент отсылать и принимать RPC пакеты. Теперь оружие видно локально в руках, у другого игрока и с пк. Теперь столкнулся с проблемой. Суть RPC_PlayerGiveTakeDamage заполнен, но урон по игроку не проходит. Как возможно решить данную ситуацию?
zMViToS_
22.07.2019, 22:46
Как заполнил покажи
C++:
void
PlayerGiveTakeDamage
(
RPCParameters
*
rpcParams
)
{
Log
(
"RPC: PlayerGiveTakeDamage"
)
;
unsigned
char
*
Data
=
reinterpret_cast
(
rpcParams
->
input
)
;
int
iBitLength
=
rpcParams
->
numberOfBitsOfData
;
RakNet
::
BitStream
bsData
(
(
unsigned
char
*
)
Data
,
(
iBitLength
/
8
)
+
1
,
false
)
;
bool
flag
;
uint16_t
playerId
;
float
Damage
;
uint32_t
weaponid
;
uint32_t
bodypart
;
bsData
.
Read
(
flag
)
;
bsData
.
Read
(
playerId
)
;
bsData
.
Read
(
Damage
)
;
bsData
.
Read
(
weaponid
)
;
bsData
.
Read
(
bodypart
)
;
if
(
flag
)
{
Log
(
"> PlayerGiveTakeDamage (%d, %f, %d, %d)"
,
playerId
,
Damage
,
weaponid
,
bodypart
)
;
}
else
{
Log
(
"> PlayerGiveTakeDamage (%d, %f, %d, %d)"
,
playerId
,
Damage
,
weaponid
,
bodypart
)
;
}
pNetGame
->
GetRakClient
(
)
->
RPC
(
&
RPC_PlayerGiveTakeDamage
,
&
bsData
,
HIGH_PRIORITY
,
RELIABLE_SEQUENCED
,
0
,
false
,
UNASSIGNED_NETWORK_ID
,
NULL
)
;
}
как можно конвертирать textdrawLetterHeight в пиксели
https://forum.antichat.xyz/attachments/27373423/
Вот, sizex это пиксели от левого края, а LetterY что-то непонятное, не пиксели, как мне можно конвертировать LetterY(высоту) в пиксели?
checkdasound
24.07.2019, 01:13
Как получить свой CPed?
При вызове так
pGameInterface->GetPools()->GetPed((DWORD*)pPlayers->pLocalPlayer->pSAMP_Actor->pGTA_Ped);
происходит краш.
При вызове так
pGameInterface->GetPools()->GetPedFromRef(pGameInterface->GetPools()->GetPedRef((DWORD*)pPlayers->pLocalPlayer->pSAMP_Actor->pGTA_Ped))
также краш.
pGTA_Ped валидный
Если в sf api, то PEDSELF, если нет, то по адресу 0xB6F5F0.
777qwerty777
24.07.2019, 17:24
Как в sf api ускорить анимацию?
здрсте всем привет всем! у меня тут встал вопросик, как сделать окно подтверждения на имгуи?
пример: нажимаю на буттон "здарова" и выходит имгуи окошечко и там текст "вы уверены?" и 2 кнопки "да" и "нет"
здрсте всем привет всем! у меня тут встал вопросик, как сделать окно подтверждения на имгуи?
пример: нажимаю на буттон "здарова" и выходит имгуи окошечко и там текст "вы уверены?" и 2 кнопки "да" и "нет"
C++:
if
(
ImGui
::
Button
(
"Modal"
)
)
ImGui
::
OpenPopup
(
"Modal window"
)
;
if
(
ImGui
::
BeginPopupModal
(
"Modal window"
)
)
{
ImGui
::
Text
(
"Hello dsjfhds fhjs hfj dshfj hds"
)
;
if
(
ImGui
::
Button
(
"Close"
)
)
ImGui
::
CloseCurrentPopup
(
)
;
ImGui
::
EndPopup
(
)
;
}
Подскажите, за что отвечает функция samp.dll+0x30B30 (0.3.7r1)?
Подскажите, за что отвечает функция samp.dll+0x30B30 (0.3.7r1)?
Хз у него такой же вопрос
Народ подскажите что за адрес и для чего он нужен
GetModuleHandle("samp.dll") + 0x30B30
Хз у него такой же вопрос
Я видел :) Но, всё-таки, 3 года прошло.
===
Подскажите, за что отвечает функция samp.dll+0x30B30 (0.3.7r1)?
У меня с ней проблема. Судя по сигнатуре (могу ошибаться) - это
bool __thiscall RakClient::RPC(void *this, int* uniqueID, BitStream *bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, bool shiftTimestamp );
, IDA дает такой листинг псевдокода:
C++:
char
__thiscall
sub_10030B30
(
char
*
this
,
int
a2
,
int
a3
,
int
a4
,
int
a5
,
int
a6
,
int
a7
)
{
int
v7
;
// eax
char
result
;
// al
v7
=
*
(
_DWORD
*
)
(
this
-
0xAAA
)
;
if
(
v7
)
result
=
sub_10036C30
(
a2
,
a3
,
a4
,
a5
,
a6
,
*
(
_DWORD
*
)
(
v7
+
1
)
,
*
(
_WORD
*
)
(
v7
+
5
)
,
0
,
a7
,
dword_100EC770
,
dword_100EC774
,
0
)
;
else
result
=
0
;
return
result
;
}
Тоже самое в asm:
.text:10030B30 sub_10030B30 proc near ; DATA XREF: .rdata:100D534C↓o
.text:10030B30
.text:10030B30 arg_0 = dword ptr 4
.text:10030B30 arg_4 = dword ptr 8
.text:10030B30 arg_8 = dword ptr 0Ch
.text:10030B30 arg_C = dword ptr 10h
.text:10030B30 arg_10 = dword ptr 14h
.text:10030B30 arg_14 = dword ptr 18h
.text:10030B30
.text:10030B30 mov eax, [ecx-0AAAh]
.text:10030B36 test eax, eax
.text:10030B38 push esi
.text:10030B39 jnz short loc_10030B41
.text:10030B3B xor al, al
.text:10030B3D pop esi
.text:10030B3E retn 18h
.text:10030B41 ; ---------------------------------------------------------------------------
.text:10030B41
.text:10030B41 loc_10030B41: ; CODE XREF: sub_10030B30+9↑j
.text:10030B41 mov edx, dword_100EC774
.text:10030B47 push 0
.text:10030B49 push edx
.text:10030B4A mov edx, dword_100EC770
.text:10030B50 push edx
.text:10030B51 mov edx, [esp+10h+arg_14]
.text:10030B55 push edx
.text:10030B56 push 0
.text:10030B58 sub esp, 8
.text:10030B5B inc eax
.text:10030B5C mov esi, [eax] ; Ошибка доступа
.text:10030B5E mov ax, [eax+4]
.text:10030B62 mov edx, esp
.text:10030B64 mov [edx], esi
.text:10030B66 mov [edx+4], ax
.text:10030B6A mov edx, [esp+20h+arg_10]
.text:10030B6E mov eax, [esp+20h+arg_C]
.text:10030B72 push edx
.text:10030B73 mov edx, [esp+24h+arg_8]
.text:10030B77 push eax
.text:10030B78 mov eax, [esp+28h+arg_4]
.text:10030B7C push edx
.text:10030B7D mov edx, [esp+2Ch+arg_0]
.text:10030B81 push eax
.text:10030B82 push edx
.text:10030B83 add ecx, 0FFFFF222h
.text:10030B89 call sub_10036C30
.text:10030B8E pop esi
.text:10030B8F retn 18h
.text:10030B8F sub_10030B30 endp
При попытке использовать ее, передав в качестве this
[ [ dwSAMP + SAMP_INFO_OFFSET ] + SAMP_RAKCLIENT_INTERFACE ]
игру крашит. В 6 строчке переменной v7 присваевается значение по адресу
this - 0xAAA
(в каких вообще случаях бывает отрицательный сдвиг от this?), и в 14 строке получаю ошибку доступа. Может, функция не та?
barspinoff
25.07.2019, 23:35
Я видел :) Но, всё-таки, 3 года прошло.
===
У меня с ней проблема. Судя по сигнатуре (могу ошибаться) - это
bool __thiscall RakClient::RPC(void *this, int* uniqueID, BitStream *bitStream, PacketPriority priority, PacketReliability reliability, char orderingChannel, bool shiftTimestamp );
, IDA дает такой листинг псевдокода:
C++:
char
__thiscall
sub_10030B30
(
char
*
this
,
int
a2
,
int
a3
,
int
a4
,
int
a5
,
int
a6
,
int
a7
)
{
int
v7
;
// eax
char
result
;
// al
v7
=
*
(
_DWORD
*
)
(
this
-
0xAAA
)
;
if
(
v7
)
result
=
sub_10036C30
(
a2
,
a3
,
a4
,
a5
,
a6
,
*
(
_DWORD
*
)
(
v7
+
1
)
,
*
(
_WORD
*
)
(
v7
+
5
)
,
0
,
a7
,
dword_100EC770
,
dword_100EC774
,
0
)
;
else
result
=
0
;
return
result
;
}
Тоже самое в asm:
.text:10030B30 sub_10030B30 proc near ; DATA XREF: .rdata:100D534C↓o
.text:10030B30
.text:10030B30 arg_0 = dword ptr 4
.text:10030B30 arg_4 = dword ptr 8
.text:10030B30 arg_8 = dword ptr 0Ch
.text:10030B30 arg_C = dword ptr 10h
.text:10030B30 arg_10 = dword ptr 14h
.text:10030B30 arg_14 = dword ptr 18h
.text:10030B30
.text:10030B30 mov eax, [ecx-0AAAh]
.text:10030B36 test eax, eax
.text:10030B38 push esi
.text:10030B39 jnz short loc_10030B41
.text:10030B3B xor al, al
.text:10030B3D pop esi
.text:10030B3E retn 18h
.text:10030B41 ; ---------------------------------------------------------------------------
.text:10030B41
.text:10030B41 loc_10030B41: ; CODE XREF: sub_10030B30+9↑j
.text:10030B41 mov edx, dword_100EC774
.text:10030B47 push 0
.text:10030B49 push edx
.text:10030B4A mov edx, dword_100EC770
.text:10030B50 push edx
.text:10030B51 mov edx, [esp+10h+arg_14]
.text:10030B55 push edx
.text:10030B56 push 0
.text:10030B58 sub esp, 8
.text:10030B5B inc eax
.text:10030B5C mov esi, [eax] ; Ошибка доступа
.text:10030B5E mov ax, [eax+4]
.text:10030B62 mov edx, esp
.text:10030B64 mov [edx], esi
.text:10030B66 mov [edx+4], ax
.text:10030B6A mov edx, [esp+20h+arg_10]
.text:10030B6E mov eax, [esp+20h+arg_C]
.text:10030B72 push edx
.text:10030B73 mov edx, [esp+24h+arg_8]
.text:10030B77 push eax
.text:10030B78 mov eax, [esp+28h+arg_4]
.text:10030B7C push edx
.text:10030B7D mov edx, [esp+2Ch+arg_0]
.text:10030B81 push eax
.text:10030B82 push edx
.text:10030B83 add ecx, 0FFFFF222h
.text:10030B89 call sub_10036C30
.text:10030B8E pop esi
.text:10030B8F retn 18h
.text:10030B8F sub_10030B30 endp
При попытке использовать ее, передав в качестве this
[ [ dwSAMP + SAMP_INFO_OFFSET ] + SAMP_RAKCLIENT_INTERFACE ]
игру крашит. В 6 строчке переменной v7 присваевается значение по адресу
this - 0xAAA
(в каких вообще случаях бывает отрицательный сдвиг от this?), и в 14 строке получаю ошибку доступа. Может, функция не та?
Это RPC, принимает 6 параметров (7 для thiscall). Чтобы функция работала, нужно поместить указатель на RakClientInterface в регистр ecx, или передать в виде параметра функции типа thiscall
Чтобы функция работала, нужно поместить указатель на RakClientInterface в регистр ecx, или передать в виде параметра функции типа thiscall
Я же описал, что проблема не в передаче параметров, а в самом адресе. Ошибка происходит на инструкции
mov esi, [eax]
при попстке доступа к неаллоцированной памяти.
Ставил брейк, смотрел регистры когда игра сама пользовалась этой функцией, в ecx был было значение, которое можно найти по адресу
[ [ dwSAMP + SAMP_INFO_OFFSET ] + SAMP_RAKCLIENT_INTERFACE ] + XXX
, где XXX - всегда небольшое смещение меняющееся при перезапуске игры. Странно это...
UPD: Разобрался. У меня стоит плагин, который подменяет значение указателя pRakClientInterface в структуре stSAMP на своё.
Musaigen
26.07.2019, 20:35
Как в собейте проверить то, что игрок заспавнен?
Неадекватная сова
26.07.2019, 20:38
Как в собейте проверить то, что игрок заспавнен?
В структуре stLocalPlayer проверять iIsActive
C++:
if
(
iIsActive
!=
1
)
{
//Заспавнен
}
Musaigen
28.07.2019, 20:07
как можно сделать свой рендер поверх другого?
CleanLegend
28.07.2019, 20:21
как можно сделать свой рендер поверх другого?
просто рисовать после него
C++:
GAME
->
GetWorld
(
)
->
ProcessLineOfSight
Подскажите, что это за параметры, и за что они отвечают?
C++:
CColPoint
*
*
colCollision
,
CEntity
*
*
CollisionEntity
Вообщем вопрос. Видел не которые имгуи которые не видны на shadow play, как можно это сделать?
Неадекватная сова
30.07.2019, 14:00
Вообщем вопрос. Видел не которые имгуи которые не видны на shadow play, как можно это сделать?
Вроде как https://blast.hk/threads/32712/#post-323606
_=Gigant=_
30.07.2019, 23:01
does someone have address for chat input toggle on ?
does someone have address for chat input toggle on ?
C++:
[CODE]
#define SAMP_CHAT_INPUT_INFO_OFFSET 0x21A0E8
// pointer to pointer to structure stInputInfo
struct
stInputBox
{
void
*
pUnknown
;
uint8_t
bIsChatboxOpen
;
//
6 line?
Есть ли у кого-то адрес функции DialogResponse как в sf но том уже готовый хук а мне только адрес функи?
CatKnight
31.07.2019, 22:24
Подскажите, как использовать курсор с имгуи? Не могу разобраться.
Подскажите, как использовать курсор с имгуи? Не могу разобраться.
Подробнее, курсор использовать в своих елементах, или просто информацию о курсоре, изменения позиции курсора, включение выключения видимости курсора?
_=Gigant=_
31.07.2019, 22:49
Подскажите, как использовать курсор с имгуи? Не могу разобраться.
C++:
bool
bShowImGui_Menu
;
static
int
mouse_imgui_menu
=
2
;
if
(
bShowImGui_Menu
)
//if menu is ON -> ImGui::Begin("##ImGuiMenu", &bShowImGui_Menu....
{
mouse_imgui_menu
=
0
;
toggleSAMPCursor
(
1
)
;
keyhook.cpp)
if
(
ImGui_ImplWin32_WndProcHandler
(
wnd
,
umsg
,
wparam
,
lparam
)
)
return
true
;
CatKnight
31.07.2019, 23:07
Подробнее, курсор использовать в своих елементах, или просто информацию о курсоре, изменения позиции курсора, включение выключения видимости курсора?
Видимость и возможность использовать обычный системный курсор в имгуи элементах. Что-то вроде imgui.showCursor в луа.
C++:
bool
bShowImGui_Menu
;
static
int
mouse_imgui_menu
=
2
;
if
(
bShowImGui_Menu
)
//if menu is ON -> ImGui::Begin("##ImGuiMenu", &bShowImGui_Menu....
{
mouse_imgui_menu
=
0
;
toggleSAMPCursor
(
1
)
;
keyhook.cpp)
if
(
ImGui_ImplWin32_WndProcHandler
(
wnd
,
umsg
,
wparam
,
lparam
)
)
return
true
;
Спасибо. Но хотелось бы реализацию с системным курсором из Windows.
Видимость и возможность использовать обычный системный курсор в имгуи элементах. Что-то вроде imgui.showCursor в луа.
Спасибо. Но хотелось бы реализацию с системным курсором из Windows.
Нету отдельного курсора в имгуи, есть один курсор
Musaigen
04.08.2019, 18:35
Какая будет нагрузка на процессор, если в потоке будет Sleep(0)?
Какая будет нагрузка на процессор, если в потоке будет Sleep(0)?
Я хз зачем это тебе но вот, бери, замерял в цикле с Sleep(0) и без, циклы выполнялся по 10000000 раз
C++:
[CODE]
#include
#include
#include
#include
int
main
(
)
{
size_t count
=
10000000
;
auto
start
=
std
::
chrono
::
system_clock
::
now
(
)
;
for
(
size_t i
=
0
;
i
elapsed_seconds
=
end
-
start
;
std
::
cout
https://forum.antichat.xyz/attachments/27380200/
Какая будет нагрузка на процессор, если в потоке будет Sleep(0)?
Нулевое значение аргумента в Sleep заставляет поток отказаться от оставшейся части его временного интервала в пользу любого другого потока, который готов к запуску. Если других потоков, готовых к выполнению нет, функция немедленно возвращается, и поток продолжает выполнение.*
* На некоторых версиях Windows поведение может немного отличаться.
** Подробнее (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG 93cy93aW4zMi9hcGkvc3luY2hhcGkvbmYtc3luY2hhcGktc2xl ZXA), можешь еще википедию почитать.
Я хз зачем это тебе но вот, бери, замерял в цикле с Sleep(0) и без, циклы выполнялся по 10000000 раз
C++:
[CODE]
#include
#include
#include
#include
int
main
(
)
{
size_t count
=
10000000
;
auto
start
=
std
::
chrono
::
system_clock
::
now
(
)
;
for
(
size_t i
=
0
;
i
elapsed_seconds
=
end
-
start
;
std
::
cout
Нагрузка на процессор и время исполнения кода, не одно и тоже. К тому же мы не знаем какие оптимизации произвел компилятор в твоем случае.
Я хз зачем это тебе но вот, бери, замерял в цикле с Sleep(0) и без, циклы выполнялся по 10000000 раз
C++:
[CODE]
#include
#include
#include
#include
int
main
(
)
{
size_t count
=
10000000
;
auto
start
=
std
::
chrono
::
system_clock
::
now
(
)
;
for
(
size_t i
=
0
;
i
elapsed_seconds
=
end
-
start
;
std
::
cout
зачем это всё если есть отладчик?
CatKnight
05.08.2019, 14:16
Объясните, пожалуйста, как в wndproc заблокировать сообщение для окна, но оставить его для плагина своего? Сейчас использую хук wndprochandler, который изначально идёт в проекте sf plugin. Подходит он для этого же?
Пытаюсь пропустить диалог с помощью кода ниже. Диалог пропускается, но перестают работать серверные команды. Сообщения в чат отправляются, но серверные команды не срабатывают ( Данную проблему заметил только на Evolve, на СРП он пропускает диалог и серверные команды работают ) Также пробовал закрывать диалог через SF->getSAMP()->getDialog()->Close(1); ( Проблема та же, диалог закрывается, команды серверные не работают)
Код:
if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog) {
WORD DialogID;
BYTE style, caplen, button1_len, button2_len;
char caption[255], button1[25], button2[25], info[0x1000];
params->bitStream->ResetReadPointer();
params->bitStream->Read(DialogID);
params->bitStream->Read(style);
params->bitStream->Read(caplen);
params->bitStream->Read(caption, caplen);
caption[caplen] = '\0';
params->bitStream->Read(button1_len);
params->bitStream->Read(button1, button1_len);
button1[button1_len] = '\0';
params->bitStream->Read(button2_len);
params->bitStream->Read(button2, button2_len);
button2[button2_len] = '\0';
SF->getRakNet()->DecodeString(info, 0x1000, params->bitStream);
if (DialogID == 0) return false;
}
Также пробовал закрывать диалог через SF->getSAMP()->getDialog()->Close(1);
офкос ты не закроешь диалог, который ещё не получил от сервера. закрывай после хука.
Roger571
05.08.2019, 21:19
@Adder (https://www.blast.hk/members/11531/) это для того, чтобы не сбивали диалоги командами и прочее, нужно просто отправлять ответ на диалог
C++:
void
SendDialogResponse
(
WORD wDialogID
,
BYTE bButtonID
,
WORD wListBoxItem
=
65535
,
char
*
szInputResp
=
""
)
{
BitStream bsSend
;
BYTE respLen
=
static_cast
(
strlen
(
szInputResp
)
)
;
bsSend
.
ResetWritePointer
(
)
;
bsSend
.
Write
(
wDialogID
)
;
bsSend
.
Write
(
bButtonID
)
;
bsSend
.
Write
(
wListBoxItem
)
;
bsSend
.
Write
(
respLen
)
;
bsSend
.
Write
(
szInputResp
,
respLen
)
;
SAMP
->
RPC
(
RPC_DialogResponse
,
&
bsSend
,
HIGH_PRIORITY
,
RELIABLE_ORDERED
,
NULL
,
false
)
;
}
SendDialogResponse
(
0
,
0
)
;
// 0 - id диалога
Приветствую, при попытке декодить стринг с диалога всё время крашется игра. Если закоментить строку с компресором, не крашит
Код:
case RPC_ShowDialog:
{
if (cheat_state->_generic.cheat_panic_enabled)
break;
WORD DialogID;
BYTE style, caplen, button1_len, button2_len, button = 1;
char caption[255], button1[25], button2[25], info[256];
BitStream bsData(rpcParams->input, rpcParams->numberOfBitsOfData / 8, false);
bsData.ResetReadPointer();
bsData.Read(DialogID);
bsData.Read(style);
bsData.Read(caplen);
bsData.Read(caption, caplen);
caption[caplen] = '\0';
bsData.Read(button1_len);
bsData.Read(button1, button1_len);
button1[button1_len] = '\0';
bsData.Read(button2_len);
bsData.Read(button2, button2_len);
button2[button2_len] = '\0';
stringCompressor->DecodeString(info, 256, &bsData);
break;
}
info, 0x1000, &bsData
Это в аргументы DecodeString
Пробовал так, всё равно эффект тот же
Пробовал так, всё равно эффект тот же
потому что вместо этого надо читать длину строки и использовать ее в декодировании
Roger571
06.08.2019, 16:52
@Adder (https://www.blast.hk/members/11531/), для использования stringCompressor'а его нужно инициализировать, ну и ессна читать длину строки, как сказал тим
C++:
// при первом запуске или при инициализации RakClient
StringCompressor
::
AddReference
(
)
;
StringTable
::
AddReference
(
)
;
BASS_DEVSOFTWARE
07.08.2019, 11:11
При компиляции плагина получаю следующую строку:
1>e:\samp\sampfuncs sdk\sf plugin template\sfplugin\sfapi\SFRender.h(5): fatal error C1083: Cannot open include file: 'd3dx9.h': No such file or
Где взять d3dx9.h?
При компиляции плагина получаю следующую строку:
1>e:\samp\sampfuncs sdk\sf plugin template\sfplugin\sfapi\SFRender.h(5): fatal error C1083: Cannot open include file: 'd3dx9.h': No such file or
Где взять d3dx9.h?
Требуется установка DirectX SDK (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS9lbi11cy9kb3dubG 9hZC9kZXRhaWxzLmFzcHg_aWQ9NjgxMg)
BASS_DEVSOFTWARE
07.08.2019, 14:43
Решение:
https://forum.antichat.xyz/attachments/27381501/
_=Gigant=_
07.08.2019, 15:31
Решение:
problem can occur if you create c++ project before directx sdk is installed, so if u didn't, restart your computer to apply sdk changes then create new project with All Platforms, config - release, but if u are using x86 target machine the platform should be win32
есть ли что похожее ImGui::BeginPopupModal но без залежности к окну имгуи?
как реализована эта функция?
C++:
bool
SFSAMP
::
registerChatCommand
(
std
::
string command
,
CommandProc callback
)
как реализована эта функция?
C++:
bool
SFSAMP
::
registerChatCommand
(
std
::
string command
,
CommandProc callback
)
BlastHackNet/mod_s0beit_sa-1 (https://github.com/BlastHackNet/mod_s0beit_sa-1/blob/master/src/samp.cpp#L602)
Multi-purpose cheat tool for GTA San Andreas and SA:MP - BlastHackNet/mod_s0beit_sa-1
github.com
CatKnight
08.08.2019, 14:31
Кто-нибудь сталкивался с подобным? В какой-то момент перестал полностью выгружаться плагин. Не важно, как я его заполню, он всё равно полностью не выгружается. DLL_PROCESS_DETACH не вызывается при выгрузке (но вызывается, когда полностью из игры выходишь ), при этом все команды освобождаются, но сам плагин как бы подключён, но SF его уже не видит, и когда снова пытаешься выгрузить плагин, в консоли пишет, что такой плагин не найден. Есть решение?
Вот обычный пример:
main.cpp:
#include
#include "main.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
void
__stdcall
mainloop
(
)
{
static
bool
initialized
=
false
;
if
(
!
initialized
)
{
if
(
GAME
&&
GAME
->
GetSystemState
(
)
==
eSystemState
::
GS_PLAYING_GAME
&&
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
{
initialized
=
true
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
104
,
255
,
192
)
,
"@@@"
)
;
}
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
{
SF
->
initPlugin
(
mainloop
,
hModule
)
;
// ...
}
if
(
dwReasonForCall
==
DLL_PROCESS_DETACH
)
{
// ...
}
return
TRUE
;
}
Кто-нибудь сталкивался с подобным? В какой-то момент перестал полностью выгружаться плагин. Не важно, как я его заполню, он всё равно полностью не выгружается. DLL_PROCESS_DETACH не вызывается при выгрузке (но вызывается, когда полностью из игры выходишь ), при этом все команды освобождаются, но сам плагин как бы подключён, но SF его уже не видит, и когда снова пытаешься выгрузить плагин, в консоли пишет, что такой плагин не найден. Есть решение?
Вот обычный пример:
main.cpp:
#include
#include "main.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
void
__stdcall
mainloop
(
)
{
static
bool
initialized
=
false
;
if
(
!
initialized
)
{
if
(
GAME
&&
GAME
->
GetSystemState
(
)
==
eSystemState
::
GS_PLAYING_GAME
&&
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
{
initialized
=
true
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
104
,
255
,
192
)
,
"@@@"
)
;
}
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
{
SF
->
initPlugin
(
mainloop
,
hModule
)
;
// ...
}
if
(
dwReasonForCall
==
DLL_PROCESS_DETACH
)
{
// ...
}
return
TRUE
;
}
Привет, сталкивался с похожей проблемой и мне помогало лишь полная замена проекта на стандартный сфовский от urshadow
CatKnight
08.08.2019, 14:57
Привет, сталкивался с похожей проблемой и мне помогало лишь полная замена проекта на стандартный сфовский от urshadow
Это звучит смешно, но просто переименовав плагин с "SFPlugin" на любое другое название, он стал нормально выгружается/загружается . Пробовал как проект из 5.3.3, так и 5.4.1, и везде не выгружался полностью с дефолтным названием. Ладно, спасибо.
Как получить данную иконку и использовать ее?
https://forum.antichat.xyz/attachments/27382231/
Как получить данную иконку и использовать ее?
fontawesome
В сампфунксе для изменения текстдрава, можно использовать данные две функции:
Код:
SF->getSAMP()->getInfo()->pPools->pTextdraw->Delete();
SF->getSAMP()->getInfo()->pPools->pTextdraw->Create();
А как можно перезаписать текстдрав в собейте. Если можно пример. Спасибо
Как по мне это гавно метод. Лучше в хуке на рпк менять
Пробовал в хуке вот так:
Код:
if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowTextDraw)
{
stTextDrawTransmit txd;
WORD txdID, cTextLen; char cText[800];
params->bitStream->ResetReadPointer();
params->bitStream->Read(txdID);
params->bitStream->Read((PCHAR)&txd, sizeof(stTextDrawTransmit));
params->bitStream->Read(cTextLen);
params->bitStream->Read(cText, cTextLen);
params->bitStream->ResetReadPointer();
cText[cTextLen] = '\0';
if (txdID == 6) {
params->bitStream->ResetWritePointer();
params->bitStream->Write(txdID);
params->bitStream->Write((PCHAR)&txd, sizeof(stTextDrawTransmit));
strcpy_s(cText, "Test");
params->bitStream->Write(cText, strlen(cText));
}
return true;
}
Видно я не правильно перезаписываю, потому что в чат выбивает вот это: Warning: ignoring large TextDraw size=25940
Пробовал в хуке вот так:
Код:
if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowTextDraw)
{
stTextDrawTransmit txd;
WORD txdID, cTextLen; char cText[800];
params->bitStream->ResetReadPointer();
params->bitStream->Read(txdID);
params->bitStream->Read((PCHAR)&txd, sizeof(stTextDrawTransmit));
params->bitStream->Read(cTextLen);
params->bitStream->Read(cText, cTextLen);
params->bitStream->ResetReadPointer();
cText[cTextLen] = '\0';
if (txdID == 6) {
params->bitStream->ResetWritePointer();
params->bitStream->Write(txdID);
params->bitStream->Write((PCHAR)&txd, sizeof(stTextDrawTransmit));
strcpy_s(cText, "Test");
params->bitStream->Write(cText, strlen(cText));
}
return true;
}
Видно я не правильно перезаписываю, потому что в чат выбивает вот это: Warning: ignoring large TextDraw size=25940
Вот так надо
C++:
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrShowTextDraw
)
{
WORD wTextID
,
cTextLen
;
stTextDrawTransmit data
;
char
cText
[
65535
]
;
BitStream
*
bsData
=
params
->
bitStream
;
bsData
->
Read
(
wTextID
)
;
bsData
->
Read
(
(
PCHAR
)
&
data
,
sizeof
(
stTextDrawTransmit
)
)
;
bsData
->
Read
(
cTextLen
)
;
bsData
->
Read
(
cText
,
cTextLen
)
;
cText
[
cTextLen
]
=
'\0'
;
stTextDrawTransmit MyTD
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
GetTransmit
(
125
,
MyTD
)
;
MyTD
.
fBoxHeight
=
0.249999
;
MyTD
.
fLetterWidth
=
0.300000
;
MyTD
.
dwBoxColor
=
-
16776961
;
MyTD
.
byteShadow
=
0
;
MyTD
.
byteOutline
=
-
1
;
MyTD
.
dwBackgroundColor
=
-
1
;
MyTD
.
byteStyle
=
2
;
MyTD
.
byteProportional
=
1
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Delete
(
125
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Create
(
125
,
&
MyTD
,
"DIAMOND"
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Delete
(
126
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Delete
(
127
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Delete
(
128
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Delete
(
129
)
;
}
;
return
true
;
}
;
Вот так надо
C++:
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrShowTextDraw
)
{
WORD wTextID
,
cTextLen
;
stTextDrawTransmit data
;
char
cText
[
65535
]
;
BitStream
*
bsData
=
params
->
bitStream
;
bsData
->
Read
(
wTextID
)
;
bsData
->
Read
(
(
PCHAR
)
&
data
,
sizeof
(
stTextDrawTransmit
)
)
;
bsData
->
Read
(
cTextLen
)
;
bsData
->
Read
(
cText
,
cTextLen
)
;
cText
[
cTextLen
]
=
'\0'
;
stTextDrawTransmit MyTD
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
GetTransmit
(
125
,
MyTD
)
;
MyTD
.
fBoxHeight
=
0.249999
;
MyTD
.
fLetterWidth
=
0.300000
;
MyTD
.
dwBoxColor
=
-
16776961
;
MyTD
.
byteShadow
=
0
;
MyTD
.
byteOutline
=
-
1
;
MyTD
.
dwBackgroundColor
=
-
1
;
MyTD
.
byteStyle
=
2
;
MyTD
.
byteProportional
=
1
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Delete
(
125
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Create
(
125
,
&
MyTD
,
"DIAMOND"
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Delete
(
126
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Delete
(
127
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Delete
(
128
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Delete
(
129
)
;
}
;
return
true
;
}
;
Такой метод я пробовал, да он работает. Но вопрос как также сделать в собе, т.к. там нет функций pPools->pTextdraw->Delete() и pPools->pTextdraw->Create()
Roger571
10.08.2019, 19:04
Такой метод я пробовал, да он работает. Но вопрос как также сделать в собе, т.к. там нет функций pPools->pTextdraw->Delete() и pPools->pTextdraw->Create()
Есть несколько путей решения данной проблемы.
Первый - реализовать класс textdraw (обертку над пулом). Можно взять реализацию из SAMPAPI, благо он опенсурс.
Но если тебе нужны лишь эти две функции, то смысла тянуть весь класс в проект не особо вижу.
Второй - просто добавить эти две функции.
C++:
stTextdraw
*
CreateTextDraw
(
int
nId
,
stTextDrawTransmit
*
pTransmit
,
const
char
*
szText
)
{
return
(
(
stTextdraw
*
(
__thiscall
*
)
(
stTextdrawPool
*
,
int
,
stTextDrawTransmit
*
,
const
char
*
)
)
(
g_dwSAMP_Addr
+
0x1AE20
)
)
(
g_SAMP
->
pPools
->
pTextdraw
,
nId
,
pTransmit
,
szText
)
;
}
void
DeleteTextDraw
(
uint16_t
nId
)
{
(
(
void
(
__thiscall
*
)
(
stTextdrawPool
*
,
uint16_t
)
)
(
g_dwSAMP_Addr
+
0x1AD00
)
)
(
g_SAMP
->
pPools
->
pTextdraw
,
nId
)
;
}
Не факт, что работает - проверь. У самого нет возможности проверить.
Есть несколько путей решения данной проблемы.
Первый - реализовать класс textdraw (обертку над пулом). Можно взять реализацию из SAMPAPI, благо он опенсурс.
Но если тебе нужны лишь эти две функции, то смысла тянуть весь класс в проект не особо вижу.
Второй - просто добавить эти две функции.
C++:
stTextdraw
*
CreateTextDraw
(
int
nId
,
stTextDrawTransmit
*
pTransmit
,
const
char
*
szText
)
{
return
(
(
stTextdraw
*
(
__thiscall
*
)
(
stTextdrawPool
*
,
int
,
stTextDrawTransmit
*
,
const
char
*
)
)
(
g_dwSAMP_Addr
+
0x1AE20
)
)
(
g_SAMP
->
pPools
->
pTextdraw
,
nId
,
pTransmit
,
szText
)
;
}
void
DeleteTextDraw
(
uint16_t
nId
)
{
(
(
void
(
__thiscall
*
)
(
stTextdrawPool
*
,
uint16_t
)
)
(
g_dwSAMP_Addr
+
0x1AD00
)
)
(
g_SAMP
->
pPools
->
pTextdraw
,
nId
)
;
}
Не факт, что работает - проверь. У самого нет возможности проверить.
Не знал, что он в открытом доступе есть. Теперь буду знать.
И перезаписать получилось, я что-то тупанул и забыл длину записать. Поэтому нормально не перезаписывало.
За функции спасибо
Всем привет, пытаюсь поставит хук на самповскую функцию SAMP_FUNC_SENDCMD 0x65C60
ставлю через https://blast.hk/threads/30412/
C++:
DWORD Trampoline
=
0x0
;
byte prologue
[
6
]
;
void
UserHook
(
void
*
_this
,
char
*
message
)
{
MessageBoxA
(
NULL
,
message
,
"sadasd"
,
NULL
)
;
__asm jmp Trampoline
}
// устанавливаю
DWORD Addr
=
SF
->
getSAMP
(
)
->
getSAMPAddr
(
)
+
SAMP_FUNC_SENDCMD
;
Trampoline
=
MakeJump
(
Addr
,
(
DWORD
)
&
UserHook
,
prologue
,
6
)
;
но при вызове команды происходит краш
вот скрины с енжина
до
https://forum.antichat.xyz/attachments/27383314/
и после установки
https://forum.antichat.xyz/attachments/27383314/
по моему выглядит красиво, но все же я где-то проебался
пробовал и с __stdcall функцию UserHook, и брал размер пролога 8 вместо 6 тоже не помогло, что я делаю не так?
Roger571
11.08.2019, 22:41
Скорее я тупой и не вижу очевидного.
Возникла проблема с получением имени сетевого адаптера и я в душе не чаю, что не так и в какой магической кодировке оно находится.
Самое интересное, описание в нормальном виде. У обоих тип char*, ес шо.
Вот, сообсна, код.
C++:
PIP_ADAPTER_INFO pAdapter
=
pAdapterInfo
;
while
(
pAdapter
)
{
Log
(
"Adapter Name: %s %s\n"
,
pAdapter
->
AdapterName
,
pAdapter
->
Description
)
;
Log
(
"IP Address: %s\n"
,
pAdapter
->
IpAddressList
.
IpAddress
.
String
)
;
pAdapter
=
pAdapter
->
Next
;
}
Вот лог:
{D387BCE2-FD49-4AFA-AA49-E7634ED15008} Intel(R) Ethernet Connection (2) I219-V
А теперь главный вопрос, как привести имя адаптера в человеческий вид?
Скорее я тупой и не вижу очевидного.
Возникла проблема с получением имени сетевого адаптера и я в душе не чаю, что не так и в какой магической кодировке оно находится.
Самое интересное, описание в нормальном виде. У обоих тип char*, ес шо.
Вот, сообсна, код.
C++:
PIP_ADAPTER_INFO pAdapter
=
pAdapterInfo
;
while
(
pAdapter
)
{
Log
(
"Adapter Name: %s %s\n"
,
pAdapter
->
AdapterName
,
pAdapter
->
Description
)
;
Log
(
"IP Address: %s\n"
,
pAdapter
->
IpAddressList
.
IpAddress
.
String
)
;
pAdapter
=
pAdapter
->
Next
;
}
Вот лог:
А теперь главный вопрос, как привести имя адаптера в человеческий вид?
вот тут должно быть то, что тебе нужно https://books.google.com.ua/books?i...oECAgQAQ#v=onepage&q=имя адаптера c++&f=false (https://www.blast.hk/redirect/aHR0cHM6Ly9ib29rcy5nb29nbGUuY29tLnVhL2Jvb2tzP2lkPU 55dVpyM1k2M1V3QyZwZz1QQTI0NSZscGc9UEEyNDUmZHE9JUQw JUI4JUQwJUJDJUQxJThGKyVEMCVCMCVEMCVCNCVEMCVCMCVEMC VCRiVEMSU4MiVEMCVCNSVEMSU4MCVEMCVCMCtjJTJCJTJCJnNv dXJjZT1ibCZvdHM9VmFja2h4MkxuNCZzaWc9QUNmVTNVMUZUR0 VxX2RNaWFpbzA4XzNWdG04QjhQZkZGZyZobD1ydSZzYT1YJnZl ZD0yYWhVS0V3akw3dnlDdnZ2akFoWHBzNHNLSFQ1akNXb1E2QU V3Qm5vRUNBZ1FBUSN2PW9uZXBhZ2UmcT0lRDAlQjglRDAlQkMl RDElOEYlMjAlRDAlQjAlRDAlQjQlRDAlQjAlRDAlQkYlRDElOD IlRDAlQjUlRDElODAlRDAlQjAlMjBjJTJCJTJCJmY9ZmFsc2U)
Roger571
11.08.2019, 23:04
вот тут должно быть то, что тебе нужно
Оно то есть, да и в других примерах работы с этой библиотекой у людей все нормально и имя адаптера выводится в читаемом формате.
Если интересно, можешь попробовать у себя
C++:
#pragma comment (lib, "Iphlpapi.lib")
#include "Windows.h"
#include "stdio.h"
#include "iphlpapi.h"
int
main
(
)
{
IP_ADAPTER_INFO
*
pAdapterInfo
;
ULONG ulOutBufLen
;
DWORD dwRetVal
;
pAdapterInfo
=
(
IP_ADAPTER_INFO
*
)
malloc
(
sizeof
(
IP_ADAPTER_INFO
)
)
;
ulOutBufLen
=
sizeof
(
IP_ADAPTER_INFO
)
;
if
(
GetAdaptersInfo
(
pAdapterInfo
,
&
ulOutBufLen
)
!=
ERROR_SUCCESS
)
{
free
(
pAdapterInfo
)
;
pAdapterInfo
=
(
IP_ADAPTER_INFO
*
)
malloc
(
ulOutBufLen
)
;
}
if
(
(
dwRetVal
=
GetAdaptersInfo
(
pAdapterInfo
,
&
ulOutBufLen
)
)
!=
ERROR_SUCCESS
)
{
free
(
pAdapterInfo
)
;
}
PIP_ADAPTER_INFO pAdapter
=
pAdapterInfo
;
while
(
pAdapter
)
{
printf
(
"Adapter Name: %s %s\n"
,
pAdapter
->
AdapterName
,
pAdapter
->
Description
)
;
printf
(
"IP Address: %s\n"
,
pAdapter
->
IpAddressList
.
IpAddress
.
String
)
;
pAdapter
=
pAdapter
->
Next
;
}
if
(
pAdapterInfo
)
free
(
pAdapterInfo
)
;
system
(
"pause"
)
;
return
0
;
}
Оно то есть, да и в других примерах работы с этой библиотекой у людей все нормально и имя адаптера выводится в читаемом формате.
Если интересно, можешь попробовать у себя
C++:
#pragma comment (lib, "Iphlpapi.lib")
#include "Windows.h"
#include "stdio.h"
#include "iphlpapi.h"
int
main
(
)
{
IP_ADAPTER_INFO
*
pAdapterInfo
;
ULONG ulOutBufLen
;
DWORD dwRetVal
;
pAdapterInfo
=
(
IP_ADAPTER_INFO
*
)
malloc
(
sizeof
(
IP_ADAPTER_INFO
)
)
;
ulOutBufLen
=
sizeof
(
IP_ADAPTER_INFO
)
;
if
(
GetAdaptersInfo
(
pAdapterInfo
,
&
ulOutBufLen
)
!=
ERROR_SUCCESS
)
{
free
(
pAdapterInfo
)
;
pAdapterInfo
=
(
IP_ADAPTER_INFO
*
)
malloc
(
ulOutBufLen
)
;
}
if
(
(
dwRetVal
=
GetAdaptersInfo
(
pAdapterInfo
,
&
ulOutBufLen
)
)
!=
ERROR_SUCCESS
)
{
free
(
pAdapterInfo
)
;
}
PIP_ADAPTER_INFO pAdapter
=
pAdapterInfo
;
while
(
pAdapter
)
{
printf
(
"Adapter Name: %s %s\n"
,
pAdapter
->
AdapterName
,
pAdapter
->
Description
)
;
printf
(
"IP Address: %s\n"
,
pAdapter
->
IpAddressList
.
IpAddress
.
String
)
;
pAdapter
=
pAdapter
->
Next
;
}
if
(
pAdapterInfo
)
free
(
pAdapterInfo
)
;
system
(
"pause"
)
;
return
0
;
}
В примере вроде похожее имя адаптера?
https://forum.antichat.xyz/attachments/27383329/
https://forum.antichat.xyz/attachments/27383332/
Всем привет, пытаюсь поставит хук на самповскую функцию SAMP_FUNC_SENDCMD 0x65C60
ставлю через https://blast.hk/threads/30412/
C++:
DWORD Trampoline
=
0x0
;
byte prologue
[
6
]
;
void
UserHook
(
void
*
_this
,
char
*
message
)
{
MessageBoxA
(
NULL
,
message
,
"sadasd"
,
NULL
)
;
__asm jmp Trampoline
}
// устанавливаю
DWORD Addr
=
SF
->
getSAMP
(
)
->
getSAMPAddr
(
)
+
SAMP_FUNC_SENDCMD
;
Trampoline
=
MakeJump
(
Addr
,
(
DWORD
)
&
UserHook
,
prologue
,
6
)
;
но при вызове команды происходит краш
вот скрины с енжина
до
и после установки
по моему выглядит красиво, но все же я где-то проебался
пробовал и с __stdcall функцию UserHook, и брал размер пролога 8 вместо 6 тоже не помогло, что я делаю не так?
Крашит т.к. функция __thiscall + хук будет затирать инструкцию mov
https://blast.hk/threads/781/post-359737
Всем привет, пытаюсь поставит хук на самповскую функцию SAMP_FUNC_SENDCMD 0x65C60
ставлю через https://blast.hk/threads/30412/
C++:
DWORD Trampoline
=
0x0
;
byte prologue
[
6
]
;
void
UserHook
(
void
*
_this
,
char
*
message
)
{
MessageBoxA
(
NULL
,
message
,
"sadasd"
,
NULL
)
;
__asm jmp Trampoline
}
// устанавливаю
DWORD Addr
=
SF
->
getSAMP
(
)
->
getSAMPAddr
(
)
+
SAMP_FUNC_SENDCMD
;
Trampoline
=
MakeJump
(
Addr
,
(
DWORD
)
&
UserHook
,
prologue
,
6
)
;
но при вызове команды происходит краш
вот скрины с енжина
до
и после установки
по моему выглядит красиво, но все же я где-то проебался
пробовал и с __stdcall функцию UserHook, и брал размер пролога 8 вместо 6 тоже не помогло, что я делаю не так?
Сделай через call (0xE8)
C++:
void
_stdcall
hook
(
const
char
*
text
)
{
addBlueText
(
text
)
}
void
_declspec
(
naked
)
change
(
)
{
__asm
{
push
[
esp
+
8
]
call hook
mov eax
,
fs
:
[
0
]
ret
}
}
У меня так все работало
Roger571
11.08.2019, 23:42
В примере вроде похожее имя адаптера?
Да, был невнимателен.
В общем, если кому вдруг пригодится, на новых системах нужно использовать GetAdaptersAddresses(), который содержит поле FriendlyName. Он то и содержит читаемое имя адаптера. Источник (https://www.blast.hk/redirect/aHR0cHM6Ly9zb2NpYWwubXNkbi5taWNyb3NvZnQuY29tL0Zvcn Vtcy92c3R1ZGlvL2VuLVVTLzkxNDMxYWE1LWVmYTUtNDA5Ny04 NjU4LTA5OTE2M2Q0ODQ0Zi9ob3ctdG8tbWF0Y2gtcXVvdGxvY2 FsLWFyZWEtY29ubmVjdGlvbnF1b3Qtd2l0aC1uZXR3b3JrLWFk YXB0ZXItbmFtZS1yZXRyaWV2ZWQtZnJvbT9mb3J1bT12Y2dlbm VyYWw).
Рабочий код:
C++:
#include
#include
#include
#include
int
main
(
)
{
PIP_ADAPTER_ADDRESSES pAdapterAdresses
=
NULL
;
ULONG ulOutBufLen
=
0x1000
;
DWORD dwRetVal
;
char
buff
[
0x10
]
,
adapterName
[
0x20
]
,
desc
[
0x20
]
;
pAdapterAdresses
=
(
IP_ADAPTER_ADDRESSES
*
)
malloc
(
ulOutBufLen
)
;
ulOutBufLen
=
sizeof
(
IP_ADAPTER_INFO
)
;
if
(
GetAdaptersAddresses
(
AF_INET
,
GAA_FLAG_INCLUDE_PREFIX
,
NULL
,
pAdapterAdresses
,
&
ulOutBufLen
)
!=
ERROR_SUCCESS
)
{
free
(
pAdapterAdresses
)
;
pAdapterAdresses
=
(
IP_ADAPTER_ADDRESSES
*
)
malloc
(
ulOutBufLen
)
;
}
if
(
(
dwRetVal
=
GetAdaptersAddresses
(
AF_INET
,
GAA_FLAG_INCLUDE_PREFIX
,
NULL
,
pAdapterAdresses
,
&
ulOutBufLen
)
)
!=
ERROR_SUCCESS
)
{
free
(
pAdapterAdresses
)
;
}
PIP_ADAPTER_ADDRESSES pAdapter
=
pAdapterAdresses
;
while
(
pAdapter
)
{
wcstombs
(
adapterName
,
pAdapter
->
FriendlyName
,
wcslen
(
pAdapter
->
FriendlyName
)
)
;
wcstombs
(
desc
,
pAdapter
->
Description
,
wcslen
(
pAdapter
->
Description
)
)
;
printf
(
"Adapter Name: %s %s\n"
,
adapterName
,
desc
)
;
if
(
pAdapter
->
FirstUnicastAddress
->
Address
.
lpSockaddr
->
sa_family
==
AF_INET
)
{
sockaddr_in
*
sa_in
=
(
sockaddr_in
*
)
pAdapter
->
FirstUnicastAddress
->
Address
.
lpSockaddr
;
printf
(
"IP Address: %s\n"
,
inet_ntop
(
AF_INET
,
&
(
sa_in
->
sin_addr
)
,
buff
,
0x10
)
)
;
}
pAdapter
=
pAdapter
->
Next
;
}
if
(
pAdapterAdresses
)
free
(
pAdapterAdresses
)
;
system
(
"pause"
)
;
return
0
;
}
Это описание сетевого адаптера, указывается имя железа.
Всем привет, пытаюсь поставит хук на самповскую функцию SAMP_FUNC_SENDCMD 0x65C60
ставлю через https://blast.hk/threads/30412/
C++:
DWORD Trampoline
=
0x0
;
byte prologue
[
6
]
;
void
UserHook
(
void
*
_this
,
char
*
message
)
{
MessageBoxA
(
NULL
,
message
,
"sadasd"
,
NULL
)
;
__asm jmp Trampoline
}
// устанавливаю
DWORD Addr
=
SF
->
getSAMP
(
)
->
getSAMPAddr
(
)
+
SAMP_FUNC_SENDCMD
;
Trampoline
=
MakeJump
(
Addr
,
(
DWORD
)
&
UserHook
,
prologue
,
6
)
;
но при вызове команды происходит краш
вот скрины с енжина
до
и после установки
по моему выглядит красиво, но все же я где-то проебался
пробовал и с __stdcall функцию UserHook, и брал размер пролога 8 вместо 6 тоже не помогло, что я делаю не так?
как то трудно всё.
в сф без этого всего можно ставить хуки
C++:
DWORD hk_address
;
void
__declspec
(
naked
)
hook
(
)
{
static
DWORD jmp_address
=
hk_address
+
6
;
__asm
{
mov eax
,
fs
:
[
00000000
]
pushad
pushfd
}
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"hooked!"
)
;
__asm
{
popfd
popad
jmp jmp_address
}
}
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
;
hk_address
=
SF
->
getSAMP
(
)
->
getSAMPAddr
(
)
+
0x65C60
;
SF
->
getGame
(
)
->
createHook
(
reinterpret_cast
(
hk_address
)
,
hook
,
DETOUR_TYPE_JMP
,
6
)
;
init
=
true
;
}
}
как то трудно всё.
в сф без этого всего можно ставить хуки
C++:
DWORD hk_address
;
void
__declspec
(
naked
)
hook
(
)
{
static
DWORD jmp_address
=
hk_address
+
6
;
__asm
{
mov eax
,
fs
:
[
00000000
]
pushad
pushfd
}
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"hooked!"
)
;
__asm
{
popfd
popad
jmp jmp_address
}
}
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
;
hk_address
=
SF
->
getSAMP
(
)
->
getSAMPAddr
(
)
+
0x65C60
;
SF
->
getGame
(
)
->
createHook
(
reinterpret_cast
(
hk_address
)
,
hook
,
DETOUR_TYPE_JMP
,
6
)
;
init
=
true
;
}
}
Можно пример хука без сф?
Можно пример хука без сф?
тоже самое всё, ниже функа
кстати, можно использовать для call хука если заменить 0xE9 на 0xE8
C++:
[CODE]
void
CreateJmpHook
(
BYTE
*
pAddress
,
DWORD dwJumpTo
,
size_t size
=
5
)
{
if
(
size
(
pAddress
+
0x1
)
=
dwJumpTo
-
reinterpret_cast
(
pAddress
)
-
0x5
;
for
(
size_t i
=
0x5
;
i
Как можно взять параметры которые передавались в функцию которую хукнули?
И где они хранятся, в коком регистре?
Как можно взять параметры которые передавались в функцию которую хукнули?
И где они хранятся, в коком регистре?
Исходник - Ищем функции в CE (https://blast.hk/threads/34908/)
Есть тут замечательная тема с инжектом в функции от могайки: https://blast.hk/threads/2370/#post-27225 Все в ней хорошо, только не рассказывается как искать функции и параметры к ним. Сейчас покажу как перехватывать сообщения, введенные нами в чат. Значит для начала запускаем ЖТА и логинимся на...
blast.hk
Как можно взять параметры которые передавались в функцию которую хукнули?
И где они хранятся, в коком регистре?
Зависит от соглашения о вызове.
Например: _cdecl - в стеке, __thiscall - первый аргумент в регистре ecx и остальные в стеке, _stdcall - в стеке.
__thiscall обычно используется в методах класса.
Пример:
C++:
__asm
{
push ebp
// сохраняем значение регистра ebp в стеке
mov ebp
,
esp
push
[
ebp
+
4
+
8
]
// передаем второй аргумент
push
[
ebp
+
4
+
4
]
// передаём первый аргумент
call hook
// функция должна быть _stdcall
pop ebp
// воостанавливаем значение регистра ebp из стека
}
Зависит от соглашения о вызове.
Например: _cdecl - в стеке, __thiscall - первый аргумент в регистре ecx и остальные в стеке, _stdcall - в стеке.
__thiscall обычно используется в методах класса.
Пример:
C++:
__asm
{
push ebp
// сохраняем значение регистра ebp в стеке
mov ebp
,
esp
push
[
ebp
+
4
+
8
]
// передаем второй аргумент
push
[
ebp
+
4
+
4
]
// передаём первый аргумент
call hook
// функция должна быть _stdcall
pop ebp
// воостанавливаем значение регистра ebp из стека
}
а что хранится в регистре ebp, или обязательно сохранять все регистры через pushad, или можно только ebp?
а что хранится в регистре ebp, или обязательно сохранять все регистры через pushad, или можно только ebp?
ebp удобней т.к он не меняется в отличии от esp, pushad сохраняет 32 битные регистры в стеке
ebp удобней т.к он не меняется в отличии от esp, pushad сохраняет 32 битные регистры в стеке
А почему мы добавляем к регистру esp если esp это вершина куда еще вверх?
А почему мы добавляем к регистру esp если esp это вершина куда еще вверх?
При push стек уменьшается на 4, а аргументы передаются через push
0xNull_Dll
13.08.2019, 20:06
Парни, кто-нибудь знает оффсет на клавиши? Конкретно - на WASD. Типа, чтобы можно было записать в какой-то адресс 255 - нажалась кнопка, к примеру, W. 0 = "отжалась" (press / release)
P.S Не функцию. Именно оффсет
1 Не могу начать писать плагины SAMPFUNCS.
Установил Visual Studio, распаковал проект SFPlugin и открыл. Вот ошибка, ни как не могу понять с чем связана ошибка и как его исправить.
Код:
1>------ Перестроение всех файлов начато: проект: FirstSF, Конфигурация: Release Win32 ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Mi crosoft.CppBuild.targets(379,5): error MSB8020: The build tools for Visual Studio 2012 - Windows XP (Platform Toolset = 'v110_xp') cannot be found. To build using the v110_xp build tools, please install Visual Studio 2012 - Windows XP build tools. Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".
1>Сборка проекта "SFPlugin.vcxproj" завершена с ошибкой.
========== Перестроение всех проектов: успешно: 0, с ошибками: 1, пропущено: 0 ==========
1 Не могу начать писать плагины SAMPFUNCS.
Установил Visual Studio, распаковал проект SFPlugin и открыл. Вот ошибка, ни как не могу понять с чем связана ошибка и как его исправить.
Код:
1>------ Перестроение всех файлов начато: проект: FirstSF, Конфигурация: Release Win32 ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Mi crosoft.CppBuild.targets(379,5): error MSB8020: The build tools for Visual Studio 2012 - Windows XP (Platform Toolset = 'v110_xp') cannot be found. To build using the v110_xp build tools, please install Visual Studio 2012 - Windows XP build tools. Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".
1>Сборка проекта "SFPlugin.vcxproj" завершена с ошибкой.
========== Перестроение всех проектов: успешно: 0, с ошибками: 1, пропущено: 0 ==========
Я решил проблему. Мне помог человек из Stack Overflow. Вот ссылка на вопрос и ответ. https://ru.stackoverflow.com/questions/1013544/visual-studio-2019-error-msb8020/1013659#1013659 (https://www.blast.hk/redirect/aHR0cHM6Ly9ydS5zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbn MvMTAxMzU0NC92aXN1YWwtc3R1ZGlvLTIwMTktZXJyb3ItbXNi ODAyMC8xMDEzNjU5IzEwMTM2NTk)
1 Не могу начать писать плагины SAMPFUNCS.
Установил Visual Studio, распаковал проект SFPlugin и открыл. Вот ошибка, ни как не могу понять с чем связана ошибка и как его исправить.
Код:
1>------ Перестроение всех файлов начато: проект: FirstSF, Конфигурация: Release Win32 ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Mi crosoft.CppBuild.targets(379,5): error MSB8020: The build tools for Visual Studio 2012 - Windows XP (Platform Toolset = 'v110_xp') cannot be found. To build using the v110_xp build tools, please install Visual Studio 2012 - Windows XP build tools. Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".
1>Сборка проекта "SFPlugin.vcxproj" завершена с ошибкой.
========== Перестроение всех проектов: успешно: 0, с ошибками: 1, пропущено: 0 ==========
достаточно просто прочитать что там написано
Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".
Здарова, сделал я структуру для хука, но она почему-то не ставит хук, хотя просто функция работала нормально, как можно решить?
C++:
struct
Hook
{
DWORD addr
=
NULL
;
byte
*
data
=
nullptr
;
size_t size
=
NULL
;
Hook
(
const
DWORD
&
addr
,
const
DWORD
&
func
,
const
size_t
&
size
=
5
)
{
this
->
data
=
new
byte
[
size
]
;
this
->
size
=
size
;
this
->
addr
=
addr
;
DWORD dwProt
=
PAGE_EXECUTE_READWRITE
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
&
dwProt
)
;
memcpy
(
data
,
(
void
*
)
addr
,
size
)
;
memset
(
(
void
*
)
(
addr
-
4
)
,
0x90
,
size
-
4
)
;
*
(
byte
*
)
(
addr
)
=
0xE9
;
// jmp
*
(
unsigned
int
*
)
(
addr
+
1
)
=
func
-
(
addr
+
5
)
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
NULL
)
;
}
~
Hook
(
)
{
if
(
data
!=
nullptr
)
{
DWORD dwProt
=
PAGE_EXECUTE_READWRITE
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
&
dwProt
)
;
memcpy
(
(
void
*
)
addr
,
data
,
size
)
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
NULL
)
;
delete
[
]
data
;
}
}
}
;
@Stiopko (https://www.blast.hk/members/185191/), код, реализующий перенаправление из функции в другое место хоть и говноплоховат, но свою задачу выполняет (не поленился, проверил дебагером).
Возможно, ты создал объект Hook на стеке, в результате чего после выхода из области видимости, автоматически вызвался деструктор. Попробуй создавать его на куче через new
У меня появился другой вопрос. Вот я отлавливаю пакеты.
Вот по этому уроку у меня получилось это сделать https://blast.hk/wiki/tutorials:api_lesson_raknet
Я понимаю как он отлавливает пакеты и как читает. (Конечно есть некоторые вопросы, но походу разберусь).
Я не понимаю одного. Зачем нужны 2 вида отправка пакетов Pacet и RPC ? Что, когда нужно использовать ?
В интернете я ничего не нашел по этому вопросу. Пожалуйста, если вы знаете ответ, или знаете источник где этот ответ есть скажите мне!
У меня появился другой вопрос. Вот я отлавливаю пакеты.
Вот по этому уроку у меня получилось это сделать https://blast.hk/wiki/tutorials:api_lesson_raknet
Я понимаю как он отлавливает пакеты и как читает. (Конечно есть некоторые вопросы, но походу разберусь).
Я не понимаю одного. Зачем нужны 2 вида отправка пакетов Pacet и RPC ? Что, когда нужно использовать ?
В интернете я ничего не нашел по этому вопросу. Пожалуйста, если вы знаете ответ, или знаете источник где этот ответ есть скажите мне!
рпк и пакеты это разные вещи. рпк отправляются / приходят в момент какого-то события например сервер показал нам диалог в этот момент нам приходит ShowDialog - ID: 61. а пакеты же используются для того чтобы отправлять информацию серверу об твоём хп / позиции / положении твоей камеры / являешься ли ты наблюдателем / отправка BULLET SYNC(в момент стрельбы) пример, когда мы двигаемся отправляется он фут дата (ID_PLAYER_SYNC), оно отправляется даже когда персонаж не двигается(отправляется с меньшей частотой)
update: https://github.com/BrunoBM16/samp-packet-list/wiki/RPC-List тут можешь глянуть инфу об всех пакетах / rpc
@Stiopko (https://www.blast.hk/members/185191/), код, реализующий перенаправление из функции в другое место хоть и говноплоховат, но свою задачу выполняет (не поленился, проверил дебагером).
Возможно, ты создал объект Hook на стеке, в результате чего после выхода из области видимости, автоматически вызвался деструктор. Попробуй создавать его на куче через new
а что в коде говно, хочу узнать чтоби в будущем писать меньше говна
upd: нашел ошибку там вместо memset((void*)(addr - 4), 0x90, size-4);
нужно memset((void*)(addr + 4), 0x90, size-4);
@Stiopko (https://www.blast.hk/members/185191/)
Возможно, ты создал объект Hook на стеке, в результате чего после выхода из области видимости, автоматически вызвался деструктор. Попробуй создавать его на куче через new
upd: не знал что такое может быть, я просто его в вектор записываю, попробую указатель записывать
upd: все работает, спасибо
Здарова, сделал я структуру для хука, но она почему-то не ставит хук, хотя просто функция работала нормально, как можно решить?
C++:
struct
Hook
{
DWORD addr
=
NULL
;
byte
*
data
=
nullptr
;
size_t size
=
NULL
;
Hook
(
const
DWORD
&
addr
,
const
DWORD
&
func
,
const
size_t
&
size
=
5
)
{
this
->
data
=
new
byte
[
size
]
;
this
->
size
=
size
;
this
->
addr
=
addr
;
DWORD dwProt
=
PAGE_EXECUTE_READWRITE
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
&
dwProt
)
;
memcpy
(
data
,
(
void
*
)
addr
,
size
)
;
memset
(
(
void
*
)
(
addr
-
4
)
,
0x90
,
size
-
4
)
;
*
(
byte
*
)
(
addr
)
=
0xE9
;
// jmp
*
(
unsigned
int
*
)
(
addr
+
1
)
=
func
-
(
addr
+
5
)
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
NULL
)
;
}
~
Hook
(
)
{
if
(
data
!=
nullptr
)
{
DWORD dwProt
=
PAGE_EXECUTE_READWRITE
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
&
dwProt
)
;
memcpy
(
(
void
*
)
addr
,
data
,
size
)
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
NULL
)
;
delete
[
]
data
;
}
}
}
;
C++:
[CODE]
void
injectCall
(
char
*
mainaddrress
,
char
*
target
,
size_t bytes
=
5
)
{
DWORD protection
=
PAGE_READWRITE
;
VirtualProtect
(
mainaddrress
,
bytes
,
protection
,
&
protection
)
;
*
mainaddrress
=
0xE8
;
*
reinterpret_cast
(
mainaddrress
+
1
)
=
reinterpret_cast
(
target
)
-
(
reinterpret_cast
(
mainaddrress
)
+
5
)
;
for
(
size_t i
=
5
;
i
(
mainaddrress
+
1
)
=
reinterpret_cast
(
target
)
-
(
reinterpret_cast
(
mainaddrress
)
+
5
)
;
for
(
size_t i
=
5
;
i
а что в коде говно, хочу узнать чтоби в будущем писать меньше говна
не предусмотрена возможность вызова оригинальной функции
не предусмотрена возможность установки более одного хука на функцию
не сохранены значения регистров
не предусмотрена возможность вызова оригинальной функции
не предусмотрена возможность установки более одного хука на функцию
не сохранены значения регистров
не предусмотрена возможность установки более одного хука на функцию
Будит)
Только, что закончил
C++:
struct
Hook
{
DWORD addr
=
NULL
;
byte
*
data
=
nullptr
;
size_t size
=
NULL
;
DWORD trampoline
=
NULL
;
size_t addBytesSize
=
NULL
;
Hook
(
const
DWORD
&
addr
,
const
DWORD
&
func
,
const
char
*
addBytes
,
const
size_t
&
addBytesSize
,
const
size_t
&
size
=
5
)
{
// addBytes для пуша аргументов функции func
this
->
data
=
new
byte
[
size
]
;
this
->
size
=
size
;
this
->
addr
=
addr
;
this
->
addBytesSize
=
addBytesSize
;
DWORD dwProt
=
PAGE_EXECUTE_READWRITE
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
&
dwProt
)
;
memcpy
(
data
,
(
void
*
)
addr
,
size
)
;
trampoline
=
(
DWORD
)
VirtualAlloc
(
0
,
addBytesSize
+
size
+
12
,
MEM_COMMIT
|
MEM_RESERVE
,
PAGE_EXECUTE_READWRITE
)
;
// pushad / addBytes / call func / popad / замененные байты / джамп назад
*
(
byte
*
)
trampoline
=
0x60
;
// pushad
memcpy
(
(
void
*
)
(
trampoline
+
1
)
,
addBytes
,
addBytesSize
)
;
// addBytes
*
(
byte
*
)
(
trampoline
+
addBytesSize
+
1
)
=
0xE8
;
//call
*
(
size_t
*
)
(
trampoline
+
addBytesSize
+
2
)
=
func
-
(
trampoline
+
addBytesSize
+
6
)
;
// func
*
(
byte
*
)
(
trampoline
+
addBytesSize
+
6
)
=
0x61
;
// popad
memcpy
(
(
void
*
)
(
trampoline
+
addBytesSize
+
7
)
,
data
,
size
)
;
// замененные байты
*
(
byte
*
)
(
trampoline
+
addBytesSize
+
size
+
7
)
=
0xE9
;
// jmp
*
(
size_t
*
)
(
trampoline
+
addBytesSize
+
size
+
8
)
=
addr
+
5
-
(
trampoline
+
addBytesSize
+
size
+
12
)
;
// jmp to
memset
(
(
void
*
)
(
addr
+
4
)
,
0x90
,
size
-
4
)
;
*
(
byte
*
)
(
addr
)
=
0xE9
;
// jmp
*
(
unsigned
int
*
)
(
addr
+
1
)
=
trampoline
-
(
addr
+
5
)
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
NULL
)
;
}
~
Hook
(
)
{
if
(
data
!=
nullptr
)
{
DWORD dwProt
=
PAGE_EXECUTE_READWRITE
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
&
dwProt
)
;
memcpy
(
(
void
*
)
addr
,
data
,
size
)
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
NULL
)
;
memset
(
(
void
*
)
trampoline
,
NULL
,
addBytesSize
+
size
+
12
)
;
VirtualFree
(
(
void
*
)
trampoline
,
addBytesSize
+
size
+
12
,
MEM_RELEASE
)
;
delete
[
]
data
;
}
}
}
;
Ты используешь jmp, вместо ret
где, я не понил?
Есть ли у кого-то адрес функции которая вызывается когда в чате нажимают ентер? Мне просто нужно заменить текст, я искал в СЕ, всегда когда я заменял текст было уже поздно и плагин узнавал что его вызывают
-----------------------
Решено, если кому надо вот по этому адресу 0x65DB4 делаем хук там сохраняем регистры , потом lea ebp,[esi+000014E5] и все в ebp адрес нашей строки далее пушим в стек и вызываем функу
рпк и пакеты это разные вещи. рпк отправляются / приходят в момент какого-то события например сервер показал нам диалог в этот момент нам приходит ShowDialog - ID: 61. а пакеты же используются для того чтобы отправлять информацию серверу об твоём хп / позиции / положении твоей камеры / являешься ли ты наблюдателем / отправка BULLET SYNC(в момент стрельбы) пример, когда мы двигаемся отправляется он фут дата (ID_PLAYER_SYNC), оно отправляется даже когда персонаж не двигается(отправляется с меньшей частотой)
update: https://github.com/BrunoBM16/samp-packet-list/wiki/RPC-List тут можешь глянуть инфу об всех пакетах / rpc
Здравствуйте. Это опять я :)
Ссылку которую вы отправили, там кажется некоторые устарели (или я что то не понял, вообщем иногда данные не правильно берутся). Как мне понять это самому по RPC ? Ну например я перехватил RPC которую отправил клиент -> сервер. Как мне его прочитать ? Есть ли какой либо способ сделать так, что бы я мог определять параметры пакета ?
Здравствуйте. Это опять я :)
Ссылку которую вы отправили, там кажется некоторые устарели (или я что то не понял, вообщем иногда данные не правильно берутся). Как мне понять это самому по RPC ? Ну например я перехватил RPC которую отправил клиент -> сервер. Как мне его прочитать ? Есть ли какой либо способ сделать так, что бы я мог определять параметры пакета ?
Софт - RakLogger+ (0.3.7) (https://blast.hk/threads/7303/)
RakLogger+ by FYP BLASTHACK.NET Сниффер RakNet-трафика для SA-MP. Функционал: Логирование в файл входящих/исходящих пакетов и RPC. Получение списка зарегистрированных RPC. Вывод данных на экран. Сохранение в формате JSON. Гибкая настройка. Описание настроек Секция "settings" - основные...
blast.hk
Здравствуйте. Это опять я :)
Ссылку которую вы отправили, там кажется некоторые устарели (или я что то не понял, вообщем иногда данные не правильно берутся). Как мне понять это самому по RPC ? Ну например я перехватил RPC которую отправил клиент -> сервер. Как мне его прочитать ? Есть ли какой либо способ сделать так, что бы я мог определять параметры пакета ?
Нечего там не устарело. Читать битсрим нужно строго в той последовательности которой они иницилизированы на гитхабе.
enziweee
18.08.2019, 10:57
hi
как правильно настроить проект так, чтобы не оставалось всяких следов в памяти связанных с твоей учетной записью, самой студией и тд
и еще, имгуи тоже оставляет следы, как исправить?
https://forum.antichat.xyz/attachments/27386343/
hi
как правильно настроить проект так, чтобы не оставалось всяких следов в памяти связанных с твоей учетной записью, самой студией и тд
и еще, имгуи тоже оставляет следы, как исправить?
Нечего там не устарело. Читать битсрим нужно строго в той последовательности которой они иницилизированы на гитхабе.
Значит я где то ошибаюсь, но вот где ? Я хочу вывести текст команды в чат (Например /s Hello world!). У меня получилось это с помощью RakLogger+, который мне посоветовали с верху. Но я все ровно хочу узнать где я ошибся.
Вот мой код:
Внутри блока switch (pacetId):
case
RPC_ServerCommand
:
UINT32 length
;
byte endCommandText
;
char
commandText
[
50
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
length
)
;
params
->
bitStream
->
Read
(
commandText
,
endCommandText
)
;
commandText
[
endCommandText
]
=
'\0'
;
params
->
bitStream
->
ResetReadPointer
(
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
230
,
46
,
46
)
,
"Lenght - %d, Command - %s"
,
length
,
commandText
)
;
break
;
Ввод: /s Крик
Вывод: Lenght - 7, Command -
Lenght правильный, но Command все время пустой. Иногда, выходит не понятные буквы. И если повторить команду то он опять будет пустым. Вообщем я не смог отловить в каких случаях он выводит не понятные буквы.
Значит я где то ошибаюсь, но вот где ? Я хочу вывести текст команды в чат (Например /s Hello world!). У меня получилось это с помощью RakLogger+, который мне посоветовали с верху. Но я все ровно хочу узнать где я ошибся.
Вот мой код:
Внутри блока switch (pacetId):
case
RPC_ServerCommand
:
UINT32 length
;
byte endCommandText
;
char
commandText
[
50
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
length
)
;
params
->
bitStream
->
Read
(
commandText
,
endCommandText
)
;
commandText
[
endCommandText
]
=
'\0'
;
params
->
bitStream
->
ResetReadPointer
(
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
230
,
46
,
46
)
,
"Lenght - %d, Command - %s"
,
length
,
commandText
)
;
break
;
Ввод: /s Крик
Вывод: Lenght - 7, Command -
Lenght правильный, но Command все время пустой. Иногда, выходит не понятные буквы. И если повторить команду то он опять будет пустым. Вообщем я не смог отловить в каких случаях он выводит не понятные буквы.
удали переменную endcomandtext и замени ее использование на переменную length
params->bitStream->Read(commandText, endCommandText); commandText[endCommandText] = '\0';
В обоих строках замени endCommandText на длину строки , ты бля сам видишь как ты читаешь ? От куда ты вообще взял endcommand text? Parameters: UINT32 length, char[] commandtext
traceattack
19.08.2019, 00:07
Как задать позицию машины относительно себя самой? Допустим Y += 2 и чтобы она сдвинулась вперед на 2 метра
Как задать позицию машины относительно себя самой? Допустим Y += 2 и чтобы она сдвинулась вперед на 2 метра
Получаешь координаты автомобиля .
CVector vp = *PEDSELF->Vehicle->getpos();
Потом PEDSELF->Vehicle->Teleport (vp.fX, vp.fY + 5.0, vp.fZ) ;
Пишу с телефона, но принцип ты понял думаю . Завтра могу написать нормальный код
traceattack
19.08.2019, 00:22
Получаешь координаты автомобиля .
CVector vp = *PEDSELF->Vehicle->getpos();
Потом PEDSELF->Vehicle->Teleport (vp.fX, vp.fY + 5.0, vp.fZ) ;
Пишу с телефона, но принцип ты понял думаю . Завтра могу написать нормальный код
А если мне надо в хуке инкар синхры задать?
Принцип такой же?
Здравствуйте,можно ли imgui подключить на c#?
Здравствуйте,можно ли imgui подключить на c#?
GitHub - zwcloud/ImGui: Immediate Mode GUI for C# (https://github.com/zwcloud/ImGui)
Immediate Mode GUI for C#. Contribute to zwcloud/ImGui development by creating an account on GitHub.
github.com
Нашел
C++:
bool
IsOnScreen
(
DWORD OBJECT
)
{
DWORD dwFunc
=
FUNC_IsVisible
;
DWORD dwThis
=
(
DWORD
)
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pObject
->
object
[
OBJECT
]
->
pGTAEntity
;
bool
bReturn
=
false
;
_asm
{
mov ecx
,
dwThis
call dwFunc
mov bReturn
,
al
}
return
bReturn
;
}
это всё есть в GAME
Refraktor
24.08.2019, 20:10
Sobeit стандартный, 1 ошибка. Кто знает что это?
Код:
E2484 определенный пользователем литеральный суффикс не соответствует предыдущему "__DATE__"
https://forum.antichat.xyz/attachments/27389740/
Sobeit стандартный, 1 ошибка. Кто знает что это?
Код:
E2484 определенный пользователем литеральный суффикс не соответствует предыдущему "__DATE__"
оно всё равно должно компилироваться
Refraktor
24.08.2019, 20:14
оно всё равно должно компилироваться
Компилируется без ошибок, но всё равно интересно.
Receiver
28.08.2019, 18:25
Крашит игру после выхода через /q из-за ImGUI.
PluginFree:
void
CALLBACK
PluginFree
(
)
{
ImGui_ImplDX9_Shutdown
(
)
;
ImGui_ImplWin32_Shutdown
(
)
;
ImGui
::
DestroyContext
(
)
;
}
DllMain:
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
if
(
dwReasonForCall
==
DLL_PROCESS_DETACH
)
PluginFree
(
)
;
return
TRUE
;
}
main():
SF
->
getGame
(
)
->
registerGameDestructorCallback
(
PluginFree
)
;
Неадекватная сова
28.08.2019, 18:27
Крашит игру после выхода через /q из-за ImGUI.
PluginFree:
void
CALLBACK
PluginFree
(
)
{
ImGui_ImplDX9_Shutdown
(
)
;
ImGui_ImplWin32_Shutdown
(
)
;
ImGui
::
DestroyContext
(
)
;
}
DllMain:
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
if
(
dwReasonForCall
==
DLL_PROCESS_DETACH
)
PluginFree
(
)
;
return
TRUE
;
}
main():
SF
->
getGame
(
)
->
registerGameDestructorCallback
(
PluginFree
)
;
Попробуй в конце функции PluginFree добавить:
C++:
TerminateProcess
(
OpenProcess
(
PROCESS_ALL_ACCESS
,
FALSE
,
GetCurrentProcessId
(
)
)
,
0
)
;
Крашит игру после выхода через /q из-за ImGUI.
PluginFree:
void
CALLBACK
PluginFree
(
)
{
ImGui_ImplDX9_Shutdown
(
)
;
ImGui_ImplWin32_Shutdown
(
)
;
ImGui
::
DestroyContext
(
)
;
}
DllMain:
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
if
(
dwReasonForCall
==
DLL_PROCESS_DETACH
)
PluginFree
(
)
;
return
TRUE
;
}
main():
SF
->
getGame
(
)
->
registerGameDestructorCallback
(
PluginFree
)
;
удали registerGameDestructorCallback, DLL_PROCESS_DETACH достаточно
Receiver
28.08.2019, 18:30
удали registerGameDestructorCallback, DLL_PROCESS_DETACH достаточно
Попробуй в конце функции PluginFree добавить:
C++:
TerminateProcess
(
OpenProcess
(
PROCESS_ALL_ACCESS
,
FALSE
,
GetCurrentProcessId
(
)
)
,
0
)
;
Спасибо, оба варианта работают.
TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId()), 0);
а вот так делать не советую, это может плохо кончиться
Receiver
28.08.2019, 20:15
Возможно ли и как воспроизвести звук из файла в игре?
Неадекватная сова
28.08.2019, 20:16
Возможно ли и как воспроизвести звук из файла в игре?
Информация - Работа с BASS Lib (https://blast.hk/threads/34405/)
Для начала, 1 раз при запуске нашей длл, инициализируем: BASS_Init( -1/* device */ , 44100/* frequency */ , BASS_DEVICE_3D /* flags */, 0 /* hwnd */ , NULL /* guid */ ); И при выгрузке из игры выгружаем библиотеку: BASS_Free( ); Чтобы проиграть звуковой файл по пути делаем следующее auto...
blast.hk
Receiver
29.08.2019, 11:04
как получить координаты автомобиля
Неадекватная сова
29.08.2019, 11:15
как получить координаты автомобиля
C++:
bool
getCarCoordinates
(
D3DVECTOR
&
vector
,
int
carID
)
{
if
(
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pVehicle
->
iIsListed
[
carID
]
)
{
vector
.
x
=
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pVehicle
->
pGTA_Vehicle
[
carID
]
->
base
.
matrix
[
4
*
3
]
;
vector
.
y
=
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pVehicle
->
pGTA_Vehicle
[
carID
]
->
base
.
matrix
[
4
*
3
+
1
]
;
vector
.
z
=
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pVehicle
->
pGTA_Vehicle
[
carID
]
->
base
.
matrix
[
4
*
3
+
2
]
;
return
true
;
}
return
false
;
}
Использование:
C++:
D3DVECTOR carPos
;
if
(
getCarCoordinates
(
carPos
,
ИД_Машины
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"XYZ: %f | %f | %f"
,
carPos
.
x
,
carPos
.
y
,
carPos
.
z
)
;
}
Receiver
29.08.2019, 11:54
как добавить новый элемент в imgui listbox я еблан
не выходит у меня с массивами ничего))
как добавить новый элемент в imgui listbox я еблан
не выходит у меня с массивами ничего))
Receiver
29.08.2019, 13:43
а если массив уже создан
а если массив уже создан
дать код потому что я не совсем ванга и не способен понять каким чудом ты создал массив
Receiver
29.08.2019, 14:03
дать код потому что я не совсем ванга и не способен понять каким чудом ты создал массив
const char * items[] = {"xui"};
можно из main добавить в этот список что-то?
const char * items[] = {"xui"};
можно из main добавить в этот список что-то?
используй std::vector
iAmerican
29.08.2019, 18:27
const char * items[] = {"xui"};
можно из main добавить в этот список что-то?
используй std::vector
Redirecting to https://edw.is/ (https://www.blast.hk/redirect/aHR0cHM6Ly9lbGlhc2RhbGVyLmdpdGh1Yi5pby91c2luZy1pbW d1aS13aXRoLXNmbWwtcHQyLw)
eliasdaler.github.io
Можете, подсказать, пожалуйста, как вызывать окна в С++? Заранее спасибо
Можете, подсказать, пожалуйста, как вызывать окна в С++? Заранее спасибо
MessageBox
MessageBox
именно построенные мною, а не месаджбокс
именно построенные мною, а не месаджбокс
можешь создать ресурс типа диалог и накидать на него элементы
можешь создать ресурс типа диалог и накидать на него элементы
как вызвать именно его?
Receiver
07.09.2019, 09:15
как можно сделать мигание иконки GTA SA при свернутой игре
Неадекватная сова
07.09.2019, 09:17
как можно сделать мигание иконки GTA SA при свернутой игре
FlashWindow function (winuser.h) - Win32 apps (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvd2luZG 93cy93aW4zMi9hcGkvd2ludXNlci9uZi13aW51c2VyLWZsYXNo d2luZG93)
Flashes the specified window one time. It does not change the active state of the window.
docs.microsoft.com
Receiver
08.09.2019, 15:34
зависает игра при BASS_Free();
https://forum.antichat.xyz/attachments/27396008/
зависает игра при BASS_Free();
Убери вообще выгрузку этой либы... Без выгрузки все норм и так
Receiver
08.09.2019, 22:25
как отловить запрос по ссылке, как в антистиллере даркпикселя
@RECEIVER (https://www.blast.hk/members/92818/) перехватить функцию, обрабатывающую запросы и обработать кейс с необходимым?
Receiver
10.09.2019, 13:52
@RECEIVER (https://www.blast.hk/members/92818/) перехватить функцию, обрабатывающую запросы и обработать кейс с необходимым?
как перехватит функцию с lua?)))
iAmerican
10.09.2019, 20:30
как перехватит функцию с lua?)))
Исходник - Гайд - Lua jmp hook (https://blast.hk/threads/39138/)
Написал код для установки 5-и байтового jmp хука. Переводить в библиотеку не вижу смысла, так что нужно просто скопировать его. upd:или вижу... если хочется вариант с либой - https://www.blast.hk/threads/55743/ Хуки при завершении скрипта сами снимутся --HOOKS local hook = {hooks = {}}...
blast.hk
Походу не так тебя понял , но на всякий случай оставлю.
______________
Ребят, как вот так сделать?
Если нажму на "гроза", то выполнится функция
Нажму на "Туман", выполнится функция
Нажму на "Ясное небо", выполнится функция
И т.д
C++:
void
CALLBACK
DialogCallback
(
int
dialogId
,
int
buttonId
,
int
listItem
,
const
char
*
input
)
{
if
(
dialogId
==
777
&&
listItem
==
1
&&
buttonId
==
1
)
{
// action
}
}
// mainloop
SF
->
getSAMP
(
)
->
registerDialogCallback
(
DialogCallback
)
;
SF
->
getSAMP
(
)
->
getDialog
(
)
->
ShowDialog
(
777
,
DIALOG_STYLE_LIST
,
"Смена погоды"
,
"Гроза\nСолнечно\n..."
,
"Сменить"
,
"Отмена"
)
;
Receiver
15.09.2019, 17:22
C++:
HINTERNET open
=
InternetOpen
(
TEXT
(
"gettingAnswer"
)
,
INTERNET_OPEN_TYPE_PRECONFIG
,
NULL
,
NULL
,
0
)
;
if
(
open
!=
NULL
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}InternetOpen"
)
;
HINTERNET connect
=
InternetConnect
(
open
,
TEXT
(
"website"
)
,
INTERNET_DEFAULT_HTTP_PORT
,
NULL
,
NULL
,
INTERNET_SERVICE_HTTP
,
0
,
1u
)
;
if
(
connect
!=
NULL
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}InternetConnect"
)
;
HINTERNET request
=
HttpOpenRequest
(
connect
,
TEXT
(
"GET"
)
,
TEXT
(
"keys.txt"
)
,
NULL
,
NULL
,
0
,
INTERNET_FLAG_RELOAD
,
1
)
;
if
(
request
!=
NULL
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}HttpOpenRequest"
)
;
char
szData
[
1024
]
=
""
;
DWORD dwBytesRead
;
BOOL read
=
InternetReadFile
(
request
,
szData
,
sizeof
(
szData
)
,
&
dwBytesRead
)
;
if
(
read
==
TRUE
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}InternetReadFile"
)
;
DWORD serial
;
GetVolumeInformationA
(
NULL
,
NULL
,
NULL
,
&
serial
,
NULL
,
NULL
,
NULL
,
NULL
)
;
char
zhopka
[
64
]
;
sprintf
(
zhopka
,
"%d"
,
serial
)
;
SF
->
LogConsole
(
szData
)
;
if
(
!
strstr
(
szData
,
zhopka
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}У вас нет лицензии! Ваш код: {808080}[%d]{ffffff}."
,
zhopka
)
;
}
else
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}У вас есть лицензия."
)
;
}
}
}
::
InternetCloseHandle
(
request
)
;
}
::
InternetCloseHandle
(
connect
)
;
}
::
InternetCloseHandle
(
open
)
;
Все AddChatMessage в чат прилетают, но запрос не отправляется и print выводит это >
C++:
HINTERNET open
=
InternetOpen
(
TEXT
(
"gettingAnswer"
)
,
INTERNET_OPEN_TYPE_PRECONFIG
,
NULL
,
NULL
,
0
)
;
if
(
open
!=
NULL
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}InternetOpen"
)
;
HINTERNET connect
=
InternetConnect
(
open
,
TEXT
(
"website"
)
,
INTERNET_DEFAULT_HTTP_PORT
,
NULL
,
NULL
,
INTERNET_SERVICE_HTTP
,
0
,
1u
)
;
if
(
connect
!=
NULL
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}InternetConnect"
)
;
HINTERNET request
=
HttpOpenRequest
(
connect
,
TEXT
(
"GET"
)
,
TEXT
(
"keys.txt"
)
,
NULL
,
NULL
,
0
,
INTERNET_FLAG_RELOAD
,
1
)
;
if
(
request
!=
NULL
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}HttpOpenRequest"
)
;
char
szData
[
1024
]
=
""
;
DWORD dwBytesRead
;
BOOL read
=
InternetReadFile
(
request
,
szData
,
sizeof
(
szData
)
,
&
dwBytesRead
)
;
if
(
read
==
TRUE
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}InternetReadFile"
)
;
DWORD serial
;
GetVolumeInformationA
(
NULL
,
NULL
,
NULL
,
&
serial
,
NULL
,
NULL
,
NULL
,
NULL
)
;
char
zhopka
[
64
]
;
sprintf
(
zhopka
,
"%d"
,
serial
)
;
SF
->
LogConsole
(
szData
)
;
if
(
!
strstr
(
szData
,
zhopka
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}У вас нет лицензии! Ваш код: {808080}[%d]{ffffff}."
,
zhopka
)
;
}
else
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}У вас есть лицензия."
)
;
}
}
}
::
InternetCloseHandle
(
request
)
;
}
::
InternetCloseHandle
(
connect
)
;
}
::
InternetCloseHandle
(
open
)
;
Все AddChatMessage в чат прилетают, но запрос не отправляется и print выводит это >
Про функу HttpSendRequest забыл.
какая же залупа, простите
Receiver
15.09.2019, 18:06
какая же залупа, простите
делаю так же как в тп у астапа
Про функу HttpSendRequest забыл.
C++:
HINTERNET open
=
InternetOpen
(
TEXT
(
"gettingAnswer"
)
,
INTERNET_OPEN_TYPE_PRECONFIG
,
NULL
,
NULL
,
0
)
;
if
(
open
!=
NULL
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}InternetOpen"
)
;
HINTERNET connect
=
InternetConnect
(
open
,
TEXT
(
"website"
)
,
INTERNET_DEFAULT_HTTP_PORT
,
NULL
,
NULL
,
INTERNET_SERVICE_HTTP
,
0
,
1u
)
;
if
(
connect
!=
NULL
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}InternetConnect"
)
;
HINTERNET request
=
HttpOpenRequest
(
connect
,
TEXT
(
"GET"
)
,
TEXT
(
"keys.txt"
)
,
NULL
,
NULL
,
0
,
INTERNET_FLAG_RELOAD
,
1
)
;
if
(
request
!=
NULL
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}HttpOpenRequest"
)
;
BOOL send
=
HttpSendRequest
(
request
,
NULL
,
0
,
NULL
,
0
)
;
if
(
send
==
TRUE
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}HttpSendRequest"
)
;
char
szData
[
1024
]
;
DWORD dwBytesRead
;
BOOL read
=
InternetReadFile
(
request
,
szData
,
sizeof
(
szData
)
-
1
,
&
dwBytesRead
)
;
if
(
read
!=
FALSE
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}InternetReadFile"
)
;
DWORD serial
;
GetVolumeInformationA
(
NULL
,
NULL
,
NULL
,
&
serial
,
NULL
,
NULL
,
NULL
,
NULL
)
;
char
zhopka
[
64
]
;
sprintf
(
zhopka
,
"%d"
,
serial
)
;
SF
->
LogConsole
(
szData
)
;
if
(
!
strstr
(
szData
,
zhopka
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}У вас нет лицензии! Ваш код: {808080}[%d]{ffffff}."
,
zhopka
)
;
}
else
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
128
,
128
,
128
)
,
"[crack_me.sf]: {ffffff}У вас есть лицензия."
)
;
}
}
}
}
::
InternetCloseHandle
(
request
)
;
}
::
InternetCloseHandle
(
connect
)
;
}
::
InternetCloseHandle
(
open
)
;
дальше HttpOpenRequest не идёт
Receiver
15.09.2019, 18:46
https://blast.hk/threads/24280/ попробуй это
ne работает, на HttpOpenRequest останавливается
ne работает, на HttpOpenRequest останавливается
Антистилер стоит?
twixjr12s
20.09.2019, 15:17
SF->getGame()->isKeyPressed не работает в диалоге, шо делать если надо получить нажатие клавиш в диалоге
SF->getGame()->isKeyPressed не работает в диалоге, шо делать если надо получить нажатие клавиш в диалоге
GetAsyncKeyState
twixjr12s
20.09.2019, 16:42
GetAsyncKeyState
как можно сделать чтобы только 1 раз, при нажатии писало - SF->getSAMP()->getChat()->AddChatMessage(-1, "нажата клавиша %d", g);
как можно сделать чтобы только 1 раз, при нажатии писало - SF->getSAMP()->getChat()->AddChatMessage(-1, "нажата клавиша %d", g);
C++:
if
(
GetAsyncKeyState
(
0x39
)
)
{
//Code
while
(
GetAsyncKeyState
(
0x39
)
)
Sleep
(
100
)
;
}
twixjr12s
21.09.2019, 12:23
C++:
if
(
GetAsyncKeyState
(
0x39
)
)
{
//Code
while
(
GetAsyncKeyState
(
0x39
)
)
Sleep
(
100
)
;
}
ахуенный фикс, писать Sleep в main
Как сделать реконнект без краша?
-raymond-
22.09.2019, 08:24
Как сделать реконнект без краша?
хукаешь входящие rpc, если ид rpc == RPC_RemoveBuildingForPlayer, ставишь проверку, если удалено уже 1000 объектов то возвращаешь false
twixjr12s
22.09.2019, 17:25
isKeyPressed не работает с диалогом, а GetAsyncKeyState флудит при зажатии клавиши, какие ещё есть?
-raymond-
23.09.2019, 15:35
isKeyPressed не работает с диалогом, а GetAsyncKeyState флудит при зажатии клавиши, какие ещё есть?
можно поставить задержку на срабатывание GetAsyncKeyState, либо хукнуть wndprochandler
twixjr12s
23.09.2019, 15:43
можно поставить задержку на срабатывание GetAsyncKeyState, либо хукнуть wndprochandler
задержку в мейне ставить, окда?
задержку в мейне ставить, окда?
поток или таймер, окда?
twixjr12s
23.09.2019, 16:03
поток или таймер, окда?
можно пример, окда?
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot