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

  #3421  
Старый 18.04.2019, 10:21
index
Новичок
Регистрация: 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 ничего об этом не сказано. Также безрезультатно гуглил в других сточниках. Можно поинтересоваться, откуда информация?
 
Ответить с цитированием

  #3422  
Старый 20.04.2019, 03:23
san0
Постоянный
Регистрация: 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
 
Ответить с цитированием

  #3423  
Старый 20.04.2019, 21:16
Cake_
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами: 4793630

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

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

  #3424  
Старый 21.04.2019, 04:48
ALF
Постоянный
Регистрация: 14.11.2017
Сообщений: 319
С нами: 4472205

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

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

Либо я дико туплю, либо это отступы между строчками и отступы самих ников, а не расположение киллиста. Покопавшись, понял, что положение киллстата зависит от игрового разрешения. Тот плагин, который я кидал, как-то подменяет это самое разрешение, но при этом остальные части (худ, чат и т.д). никак не изменяет. При выгрузке плагина, киллстат встаёт на своё место. Интересная задумка, но не могу придумать, как можно заблокировать изменение остальных элементов, чтобы двигать только киллстат. Но спасибо за помощь.
не, ты какую то хрень написал.

DWORD addrX = samp.dll + 0x6665C;

DWORD addrY = samp.dll + 0x66645;
 
Ответить с цитированием

  #3425  
Старый 21.04.2019, 20:30
checkdasound
Постоянный
Регистрация: 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
;
}


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

  #3426  
Старый 21.04.2019, 20:40
CleanLegend
Постоянный
Регистрация: 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
 
Ответить с цитированием

  #3427  
Старый 22.04.2019, 15:23
Шурик
Новичок
Регистрация: 01.12.2009
Сообщений: 0
С нами: 8654409

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

Столкнулся с такой проблемой:

- В цикле стоит проверка на зажатую клавишу (VK_LMENU), если нажата - выводит сообщение. Если же я с рабочего стола перейду в игру (через Alt + Tab), то это сообщение будет выводиться до первого нажатия на клавишу Alt. Использовал функцию SF->getGame()->isKeyDown и ImGui::IsKeyDown - результат один.

P.S. Замечу, сама игра не обрабатывают эту клавишу (ну тип персонаж не ходит на альте), а данные функции обрабатывают.

Есть ли способ решить данную проблему?
 
Ответить с цитированием

  #3428  
Старый 22.04.2019, 18:19
qojqva
Познающий
Регистрация: 18.01.2017
Сообщений: 56
С нами: 4903368

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

Можно на c++ сделать биндер для рп?
 
Ответить с цитированием

  #3429  
Старый 22.04.2019, 18:36
SiTrak
Участник форума
Регистрация: 14.01.2018
Сообщений: 192
С нами: 4384333

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

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

Можно на c++ сделать биндер для рп?
Ну да
 
Ответить с цитированием

  #3430  
Старый 22.04.2019, 18:58
qojqva
Познающий
Регистрация: 18.01.2017
Сообщений: 56
С нами: 4903368

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

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

Ну да
Почему я ни разу не видел биндер на С++?
 
Ответить с цитированием
Ответ





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


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




ANTICHAT ™ © 2001- Antichat Kft.