
06.07.2019, 20:50
|
|
Постоянный
Регистрация: 17.01.2014
Сообщений: 493
С нами:
6483143
Репутация:
93
|
|
Обновляю запрос.
[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 запусков идут без ошибок, а конкретно: ошибка вылетает первые
|
|
|

06.07.2019, 21:46
|
|
Постоянный
Регистрация: 14.11.2017
Сообщений: 319
С нами:
4472205
Репутация:
163
|
|
[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
|
|
|

06.07.2019, 21:56
|
|
Участник форума
Регистрация: 06.01.2016
Сообщений: 154
С нами:
5447649
Репутация:
28
|
|
[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
C++:
Код:
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
|
|
|

07.07.2019, 15:46
|
|
Постоянный
Регистрация: 17.01.2014
Сообщений: 493
С нами:
6483143
Репутация:
93
|
|
Сообщение от _Vine_
+ 1 не нужен, так ты будешь получать указатель на конец строки + 1, а это не только может приводить к неправильному результату функции, но и изменять данные в чужой выделенной памяти и приводить к сбою программы
Сообщение от _Vine_
И вообще, можно было бы реализовать функцию и без промежуточного буфера temp
В моём случае, строка может быть слеплена с другими символами, и если скопировав её не оградить нулём, strcmp может принять следующий символ за её продолжение, и выдать 1 вместо 0, даже если константа меньшего размера, что с одной стороны и логично, ведь он выдаёт 1, а значит первое больше, но с другой стороны мне этого совершенно не нужно, и хватит сравнения того числа символов, что получено как искомая строка.
Как раз для ограждения и нужен yo, как указатель на конец. У меня не вполне адекватно себя ведёт преобразование памяти ptrTo*, потому вместо инкремента имеющегося адреса я создал указатель. Мб я криворукий, но так хотя бы ошибки доступа мозг не выносят.
temp как раз служит хранилищем для строки, без доп буфера я не нашёл способ оградить байты нулём и сравнить с искомой строкой, ну а без нуля шо - описал выше.
Сообщение от _Vine_
strstr
Он не ищет дальше первого нуля. В моём случае пришлось бы обрабатывать каждый ноль, а это геморрой, на мой взгляд
[QUOTE="_Vine_"]
Тут должен быть оператор
|
|
|

07.07.2019, 19:51
|
|
Постоянный
Регистрация: 17.01.2014
Сообщений: 493
С нами:
6483143
Репутация:
93
|
|
[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 запусков идут без ошибок, а конкретно: ошибка вылетает первые
|
|
|

06.07.2019, 17:35
|
|
Познавший АНТИЧАТ
Регистрация: 22.02.2017
Сообщений: 1,474
С нами:
4852492
Репутация:
88
|
|
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 -
это методы класса.
|
|
|

06.07.2019, 19:51
|
|
Участник форума
Регистрация: 17.12.2017
Сообщений: 110
С нами:
4423953
Репутация:
68
|
|
как сделать альтернативу keyhook_keycombo_pressed из собейта в сф?
|
|
|

06.07.2019, 23:34
|
|
Новичок
Регистрация: 13.10.2017
Сообщений: 28
С нами:
4516996
Репутация:
13
|
|
в общем проблема, пытаюсь отрендерить линию от головы до пуза, в итоге линия строится нормально только на первого попавшегося в радиусе стрима актера, на остальных выходит кривота, как исправлять?
Сообщение от Спойлер
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">

|
|
|

06.07.2019, 23:54
|
|
Познавший АНТИЧАТ
Регистрация: 16.03.2017
Сообщений: 1,626
С нами:
4821087
Репутация:
133
|
|
Сообщение от enziweee
в общем проблема, пытаюсь отрендерить линию от головы до пуза, в итоге линия строится нормально только на первого попавшегося в радиусе стрима актера, на остальных выходит кривота, как исправлять?
Сообщение от Спойлер
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">

попробуй добавить проверку на
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);
}
}
}
}
|
|
|

06.07.2019, 23:58
|
|
Новичок
Регистрация: 13.10.2017
Сообщений: 28
С нами:
4516996
Репутация:
13
|
|
Сообщение от B3JlOM_}I{OTTbI
попробуй добавить проверку на
if (CalcScreenCoors)
и на
GetBonePosition
каким образом................
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|