 |
|

18.04.2019, 10:21
|
|
Новичок
Регистрация: 18.10.2015
Сообщений: 6
С нами:
5563739
Репутация:
0
|
|
Сообщение от san0
Мне кажется, немножко детали упущены по поводу того, как это все должно использоваться.
Есть массив (обертка не подойдет) объектов Cell. Из этого массива произвольным образом выбирается элемент, и, в зависимости от типа ассоциированного с ним объекта другого класса, выполняются определенные действия. По сути, полиморфизм времени выполнения. На псевдокоде это выглядит так:
Код:
Код:
// Cell type1 fileds: index, name, doSmth11(), doSmth12()
// Cell type2 fileds: cost, group, doSmth21(), doSmth22()
Cell cellArr[N];
fill(cellArr);
a = cellArr[random(0,N-1)];
if (a.type == type1)
{
a.doSmth11();
a.doSmth12();
}
else if (a.type == type2)
{
a.doSmth21();
a.doSmth22();
}
Пример больше подходит для языков с динамической типизацией, но хотелось бы увидеть реализацию подобного на c++.
Сообщение от san0
P.S. Хотелось бы посоветовать не использовать new в современных проектах: начиная с C++20 new является deprecated. Даже в примерах выше по причине использования new была продемонстрирована утечка памяти
upd: На cppReference ничего об этом не сказано. Также безрезультатно гуглил в других сточниках. Можно поинтересоваться, откуда информация?
|
|
|

20.04.2019, 03:23
|
|
Постоянный
Регистрация: 15.12.2013
Сообщений: 412
С нами:
6530249
Репутация:
133
|
|
Сообщение от index
Хотелось бы увидеть реализацию подобного на c++
Последний из способов, наверное, наиболее благоприятный по причине низкой посадки по рантайму
Сообщение от Спойлер
C++:
Код:
#include
#include
#include
#include
#include
struct
Man1
{
unsigned
long
long
index
=
0LL
;
std
::
string name
=
"Name"
;
void
doSmth11
(
)
{
std
::
cout
index
name
cost
group
pool
;
pool
.
push_back
(
Man1
{
}
)
;
pool
.
push_back
(
Man2
{
}
)
;
for
(
auto
&&
e
:
pool
)
{
if
(
std
::
type_index
(
e
.
type
(
)
)
==
std
::
type_index
(
typeid
(
Man1
)
)
)
{
auto
restoredMan1
=
std
::
any_cast
(
e
)
;
restoredMan1
.
doSmth11
(
)
;
restoredMan1
.
doSmth12
(
)
;
}
else
if
(
e
.
type
(
)
.
hash_code
(
)
==
typeid
(
Man2
)
.
hash_code
(
)
)
{
auto
restoredMan2
=
std
::
any_cast
(
e
)
;
restoredMan2
.
doSmth21
(
)
;
restoredMan2
.
doSmth22
(
)
;
}
}
}
Сообщение от Спойлер
C++:
Код:
#include
#include
struct
ManEssential
{
virtual
void
__unused
(
void
)
{
}
;
}
;
struct
Man1
:
ManEssential
{
unsigned
long
long
index
=
0LL
;
std
::
string name
=
"Name"
;
void
doSmth11
(
)
{
std
::
cout
index
name
cost
group
pool
;
pool
.
push_back
(
new
Man2
)
;
pool
.
push_back
(
new
Man1
)
;
for
(
auto
&&
e
:
pool
)
{
if
(
auto
restoredMan1
=
dynamic_cast
(
e
)
)
{
restoredMan1
->
doSmth11
(
)
;
restoredMan1
->
doSmth12
(
)
;
}
else
if
(
auto
restoredMan2
=
dynamic_cast
(
e
)
)
{
restoredMan2
->
doSmth21
(
)
;
restoredMan2
->
doSmth22
(
)
;
}
}
}
Сообщение от Спойлер
C++:
Код:
#include
#include
struct
Man1
{
unsigned
long
long
index
=
0LL
;
std
::
string name
=
"Name"
;
void
doSmth11
(
)
{
std
::
cout
index
name
cost
group
ObjectSlicing
(
const
T
&&
man
)
:
type
(
[
=
]
{
if
constexpr
(
std
::
is_same
(
)
)
{
return
ManSubtype
::
kMan1
;
}
else
if
constexpr
(
std
::
is_same
(
)
)
{
return
ManSubtype
::
kMan2
;
}
}
(
)
)
{
}
}
;
int
main
(
)
{
std
::
vector
pool
;
pool
.
push_back
(
ObjectSlicing
(
Man1
{
}
)
)
;
pool
.
push_back
(
ObjectSlicing
(
Man2
{
}
)
)
;
for
(
auto
&&
e
:
pool
)
{
if
(
e
.
type
==
ManSubtype
::
kMan1
)
{
Man1 restoredMan1
=
e
;
restoredMan1
.
doSmth11
(
)
;
restoredMan1
.
doSmth12
(
)
;
}
else
if
(
e
.
type
==
ManSubtype
::
kMan2
)
{
Man2 restoredMan2
=
e
;
restoredMan2
.
doSmth21
(
)
;
restoredMan2
.
doSmth22
(
)
;
}
}
}
Сообщение от index
Можно поинтересоваться, откуда информация?
Первоапрельская шутка 2018 года, не воспринимайте всерьез
http://modernescpp.com/index.php/no-new-new
Сообщение от Yuan
Каким образом можно поменять расположение киллстата по вертикали?
samp.dll + 0x66655 =>
patch 5 bytes to mov eax,00000010, where 0x10 - Y offset
samp.dll + 0x66668 =>
patch 5 bytes to mov eax,00000020, where 0x20 - X offset
|
|
|

20.04.2019, 21:16
|
|
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами:
4793630
Репутация:
133
|
|
Дайте функцию бега на сф, пожалуйста не кидайте соб
|
|
|

21.04.2019, 04:48
|
|
Постоянный
Регистрация: 14.11.2017
Сообщений: 319
С нами:
4472205
Репутация:
163
|
|
Сообщение от Yuan
Либо я дико туплю, либо это отступы между строчками и отступы самих ников, а не расположение киллиста. Покопавшись, понял, что положение киллстата зависит от игрового разрешения. Тот плагин, который я кидал, как-то подменяет это самое разрешение, но при этом остальные части (худ, чат и т.д). никак не изменяет. При выгрузке плагина, киллстат встаёт на своё место. Интересная задумка, но не могу придумать, как можно заблокировать изменение остальных элементов, чтобы двигать только киллстат. Но спасибо за помощь.
не, ты какую то хрень написал.
DWORD addrX = samp.dll + 0x6665C;
DWORD addrY = samp.dll + 0x66645;
|
|
|

21.04.2019, 20:30
|
|
Постоянный
Регистрация: 12.01.2018
Сообщений: 963
С нами:
4387250
Репутация:
133
|
|
Пытаюсь переделать свой скрипт в аси формат. Все сделал, кроме нормальной эмуляции игровых клавиш. Нынешняя эмуляция работает через раз.
Сообщение от Спойлер
C++:
Код:
#include "main.h"
void
__cdecl
thread
(
void
*
pArg
)
{
while
(
true
)
{
Sleep
(
1
)
;
if
(
isKeyDown
(
0x31
)
)
{
if
(
IsCharOnFoot
(
)
)
{
SetGameKeyState
(
0x20
,
255
)
;
Sleep
(
10
)
;
SetGameKeyState
(
0x20
,
0
)
;
GTAfunc_showStyledText
(
"ON FOOT"
,
2000
,
1
)
;
}
}
if
(
isKeyDown
(
0xA0
)
)
{
if
(
IsCharInAnyCar
(
)
)
{
type
=
CurrentVehicleModelType
(
)
;
if
(
type
==
1
)
{
SetGameKeyState
(
0x20
,
255
)
;
Sleep
(
10
)
;
SetGameKeyState
(
0x20
,
0
)
;
GTAfunc_showStyledText
(
"ON BIKE"
,
2000
,
1
)
;
}
else
if
(
type
==
2
)
{
SetGameKeyState
(
0x2
,
-
128
)
;
Sleep
(
10
)
;
SetGameKeyState
(
0x2
,
0
)
;
GTAfunc_showStyledText
(
"ON MOTO"
,
2000
,
1
)
;
}
}
}
}
}
BOOL APIENTRY
DllMain
(
HINSTANCE hinstDLL
,
DWORD fdwReason
,
LPVOID lpReserved
)
{
if
(
fdwReason
==
DLL_PROCESS_ATTACH
)
{
_beginthread
(
thread
,
0
,
nullptr
)
;
return
TRUE
;
}
}
Сообщение от Спойлер
C++:
Код:
#include
#include
#include
DWORD CPed
=
0xB6F5F0
;
DWORD CPedStatus
=
0x530
;
DWORD ProcID
;
DWORD p1
;
HANDLE hProcess
;
unsigned
int
CurrentVehiclePointer
=
0xBA18FC
;
int
Model
=
0
;
int
Status
=
0
;
int
type
;
unsigned
long
temp
;
int
bike
[
3
]
=
{
481
,
509
,
510
}
;
int
moto
[
11
]
=
{
448
,
461
,
462
,
463
,
468
,
471
,
521
,
522
,
523
,
581
,
586
}
;
using
namespace
std
;
DWORD
GetProcId
(
const
char
*
procname
)
{
PROCESSENTRY32 pe
;
HANDLE hSnap
;
pe
.
dwSize
=
sizeof
(
PROCESSENTRY32
)
;
hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
NULL
)
;
if
(
Process32First
(
hSnap
,
&
pe
)
)
{
do
{
if
(
strcmp
(
pe
.
szExeFile
,
procname
)
==
0
)
break
;
}
while
(
Process32Next
(
hSnap
,
&
pe
)
)
;
}
return
pe
.
th32ProcessID
;
}
void
SetGameKeyState
(
BYTE key
,
BYTE state
)
{
p1
=
0xB73458
+
key
;
memset
(
(
void
*
)
p1
,
state
,
1
)
;
}
;
bool
isKeyDown
(
int
key
)
{
SHORT keyState
=
GetKeyState
(
key
)
;
return
(
keyState
&
0x8000
)
;
}
void
GTAfunc_showStyledText
(
const
char
*
text
,
int
time
,
int
style
)
{
(
(
void
(
__cdecl
*
)
(
const
char
*
text
,
int
time
,
int
style
)
)
(
0x0069F2B0
)
)
(
text
,
time
,
style
)
;
}
int
CurrentPedStatus
(
)
{
ProcID
=
GetProcId
(
"gta_sa.exe"
)
;
hProcess
=
OpenProcess
(
PROCESS_ALL_ACCESS
,
FALSE
,
ProcID
)
;
ReadProcessMemory
(
hProcess
,
reinterpret_cast
(
CPed
)
,
&
temp
,
sizeof
(
temp
)
,
0
)
;
CPedStatus
=
temp
+
0x530
;
ReadProcessMemory
(
hProcess
,
reinterpret_cast
(
CPedStatus
)
,
&
Status
,
sizeof
(
temp
)
,
0
)
;
return
Status
;
}
bool
IsCharInAnyCar
(
)
{
Status
=
CurrentPedStatus
(
)
;
if
(
Status
==
50
)
{
return
true
;
}
else
{
return
false
;
}
}
bool
IsCharOnFoot
(
)
{
Status
=
CurrentPedStatus
(
)
;
if
(
Status
==
1
)
{
return
true
;
}
else
{
return
false
;
}
}
int
CurrentVehicleModelType
(
)
{
unsigned
int
CurrentVehiclePointer
=
*
(
unsigned
int
*
)
0xBA18FC
;
unsigned
short
model
=
*
(
unsigned
short
*
)
(
CurrentVehiclePointer
+
34
)
;
if
(
IsCharInAnyCar
(
)
)
{
for
(
int
counter
=
0
;
counter
NULL
)
kPressingKeys
[
Key
]
.
dwStartTime
=
GetTickCount
(
)
;
return
TRUE
;
}
}
else
kPressingKeys
[
Key
]
.
bPressed
=
FALSE
;
return
FALSE
;
}
|
|
|

21.04.2019, 20:40
|
|
Постоянный
Регистрация: 28.03.2013
Сообщений: 495
С нами:
6908018
Репутация:
213
|
|
Сообщение от checkdasound
Пытаюсь переделать свой скрипт в аси формат. Все сделал, кроме нормальной эмуляции игровых клавиш. Нынешняя эмуляция работает через раз.
Сообщение от Спойлер
C++:
Код:
#include "main.h"
void
__cdecl
thread
(
void
*
pArg
)
{
while
(
true
)
{
Sleep
(
1
)
;
if
(
isKeyDown
(
0x31
)
)
{
if
(
IsCharOnFoot
(
)
)
{
SetGameKeyState
(
0x20
,
255
)
;
Sleep
(
10
)
;
SetGameKeyState
(
0x20
,
0
)
;
GTAfunc_showStyledText
(
"ON FOOT"
,
2000
,
1
)
;
}
}
if
(
isKeyDown
(
0xA0
)
)
{
if
(
IsCharInAnyCar
(
)
)
{
type
=
CurrentVehicleModelType
(
)
;
if
(
type
==
1
)
{
SetGameKeyState
(
0x20
,
255
)
;
Sleep
(
10
)
;
SetGameKeyState
(
0x20
,
0
)
;
GTAfunc_showStyledText
(
"ON BIKE"
,
2000
,
1
)
;
}
else
if
(
type
==
2
)
{
SetGameKeyState
(
0x2
,
-
128
)
;
Sleep
(
10
)
;
SetGameKeyState
(
0x2
,
0
)
;
GTAfunc_showStyledText
(
"ON MOTO"
,
2000
,
1
)
;
}
}
}
}
}
BOOL APIENTRY
DllMain
(
HINSTANCE hinstDLL
,
DWORD fdwReason
,
LPVOID lpReserved
)
{
if
(
fdwReason
==
DLL_PROCESS_ATTACH
)
{
_beginthread
(
thread
,
0
,
nullptr
)
;
return
TRUE
;
}
}
Сообщение от Спойлер
C++:
Код:
#include
#include
#include
DWORD CPed
=
0xB6F5F0
;
DWORD CPedStatus
=
0x530
;
DWORD ProcID
;
DWORD p1
;
HANDLE hProcess
;
unsigned
int
CurrentVehiclePointer
=
0xBA18FC
;
int
Model
=
0
;
int
Status
=
0
;
int
type
;
unsigned
long
temp
;
int
bike
[
3
]
=
{
481
,
509
,
510
}
;
int
moto
[
11
]
=
{
448
,
461
,
462
,
463
,
468
,
471
,
521
,
522
,
523
,
581
,
586
}
;
using
namespace
std
;
DWORD
GetProcId
(
const
char
*
procname
)
{
PROCESSENTRY32 pe
;
HANDLE hSnap
;
pe
.
dwSize
=
sizeof
(
PROCESSENTRY32
)
;
hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
NULL
)
;
if
(
Process32First
(
hSnap
,
&
pe
)
)
{
do
{
if
(
strcmp
(
pe
.
szExeFile
,
procname
)
==
0
)
break
;
}
while
(
Process32Next
(
hSnap
,
&
pe
)
)
;
}
return
pe
.
th32ProcessID
;
}
void
SetGameKeyState
(
BYTE key
,
BYTE state
)
{
p1
=
0xB73458
+
key
;
memset
(
(
void
*
)
p1
,
state
,
1
)
;
}
;
bool
isKeyDown
(
int
key
)
{
SHORT keyState
=
GetKeyState
(
key
)
;
return
(
keyState
&
0x8000
)
;
}
void
GTAfunc_showStyledText
(
const
char
*
text
,
int
time
,
int
style
)
{
(
(
void
(
__cdecl
*
)
(
const
char
*
text
,
int
time
,
int
style
)
)
(
0x0069F2B0
)
)
(
text
,
time
,
style
)
;
}
int
CurrentPedStatus
(
)
{
ProcID
=
GetProcId
(
"gta_sa.exe"
)
;
hProcess
=
OpenProcess
(
PROCESS_ALL_ACCESS
,
FALSE
,
ProcID
)
;
ReadProcessMemory
(
hProcess
,
reinterpret_cast
(
CPed
)
,
&
temp
,
sizeof
(
temp
)
,
0
)
;
CPedStatus
=
temp
+
0x530
;
ReadProcessMemory
(
hProcess
,
reinterpret_cast
(
CPedStatus
)
,
&
Status
,
sizeof
(
temp
)
,
0
)
;
return
Status
;
}
bool
IsCharInAnyCar
(
)
{
Status
=
CurrentPedStatus
(
)
;
if
(
Status
==
50
)
{
return
true
;
}
else
{
return
false
;
}
}
bool
IsCharOnFoot
(
)
{
Status
=
CurrentPedStatus
(
)
;
if
(
Status
==
1
)
{
return
true
;
}
else
{
return
false
;
}
}
int
CurrentVehicleModelType
(
)
{
unsigned
int
CurrentVehiclePointer
=
*
(
unsigned
int
*
)
0xBA18FC
;
unsigned
short
model
=
*
(
unsigned
short
*
)
(
CurrentVehiclePointer
+
34
)
;
if
(
IsCharInAnyCar
(
)
)
{
for
(
int
counter
=
0
;
counter
NULL
)
kPressingKeys
[
Key
]
.
dwStartTime
=
GetTickCount
(
)
;
return
TRUE
;
}
}
else
kPressingKeys
[
Key
]
.
bPressed
=
FALSE
;
return
FALSE
;
}
Для нормальной эмуляции клавиш нужно хукать функцию, которая отвечает за нажатие игровых клавиш. https://git.prime-hack.net/SR_team/AsiBase/src/branch/master/sys/SREvents.cpp#L432
Как вариант можешь вызывать функции SF или WinAPI. и не используй RPM и WPM в dll
|
|
|

22.04.2019, 15:23
|
|
Новичок
Регистрация: 01.12.2009
Сообщений: 0
С нами:
8654409
Репутация:
0
|
|
Столкнулся с такой проблемой:
- В цикле стоит проверка на зажатую клавишу (VK_LMENU), если нажата - выводит сообщение. Если же я с рабочего стола перейду в игру (через Alt + Tab), то это сообщение будет выводиться до первого нажатия на клавишу Alt. Использовал функцию SF->getGame()->isKeyDown и ImGui::IsKeyDown - результат один.
P.S. Замечу, сама игра не обрабатывают эту клавишу (ну тип персонаж не ходит на альте), а данные функции обрабатывают.
Есть ли способ решить данную проблему?
|
|
|

22.04.2019, 18:19
|
|
Познающий
Регистрация: 18.01.2017
Сообщений: 56
С нами:
4903368
Репутация:
58
|
|
Можно на c++ сделать биндер для рп?
|
|
|

22.04.2019, 18:36
|
|
Участник форума
Регистрация: 14.01.2018
Сообщений: 192
С нами:
4384333
Репутация:
113
|
|
Сообщение от qojqva
Можно на c++ сделать биндер для рп?
Ну да
|
|
|

22.04.2019, 18:58
|
|
Познающий
Регистрация: 18.01.2017
Сообщений: 56
С нами:
4903368
Репутация:
58
|
|
Сообщение от SiTrak
Ну да
Почему я ни разу не видел биндер на С++?
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|