Просмотр полной версии : С/С++ Вопрос - Ответ
Dark_Knight
25.12.2016, 16:36
Можно через событие WM_KEYUP в сообщениях окна.
iAmerican
25.12.2016, 20:57
Как проверить кнопку на однократное нажатие?
Желательно без огромных хуков клавиатуры.
Для работы с кнопками можно использовать метод GetAsyncKeyState(Байт_код), но с ней иногда бывают проблеммы(залипание, фантомное срабатывание иногда просто не действует), поэтому опишем свою функцию.
Прототип:
C++:
BOOL
State_Key
(
int
Key
,
DWORD dwTimeOut
)
;
Key - байт код клавиши
dwTimeOut - время до возможности повторного действия в Мсек(не совсем точное определение)
Определяем структуру.
C++:
static
struct
_Keys
{
bool
bPressed
;
DWORD dwStartTime
;
}
kPressingKeys
[
256
]
;
функа :
C++:
BOOL
State_Key
(
int
Key
,
DWORD dwTimeOut
)
{
if
(
HIWORD
(
GetKeyState
(
Key
)
)
)
{
if
(
!
kPressingKeys
[
Key
]
.
bPressed
||
(
kPressingKeys
[
Key
]
.
dwStartTime
&&
(
kPressingKeys
[
Key
]
.
dwStartTime
+
dwTimeOut
)
NULL
)
kPressingKeys
[
Key
]
.
dwStartTime
=
GetTickCount
(
)
;
return
TRUE
;
}
}
else
kPressingKeys
[
Key
]
.
bPressed
=
FALSE
;
return
FALSE
;
}
Ставишь в функе время, секунд 15 , думаю хватит.
Автор "крайслер"
Взято с zhyk.ru.
p.s. делал как то без времени , когда запаривался по поводу этого вопроса , но так как все свои сурсы проебал , не помню уже.
Кто нибудь компилил C++ для SAMPFUNCS на Ubuntu? У меня с инклудами проблема, нашел выход только поставить виртуалку и скачать VC 2012
Кто нибудь компилил C++ для SAMPFUNCS на Ubuntu? У меня с инклудами проблема, нашел выход только поставить виртуалку и скачать VC 2012
mingw, winegcc, но нет нормального ассемблера
mingw, winegcc, но нет нормального ассемблера
Понял, а через CLion кто-то пробовал компилировать? Мне как то продукты JetBrains по душе, использую их давно, VS в новинку и не совсем привычно.
Понял, а через CLion кто-то пробовал компилировать? Мне как то продукты JetBrains по душе, использую их давно, VS в новинку и не совсем привычно.
Тебе IDE нужна или компилятор?
Тебе IDE нужна или компилятор?
Ну IDE с компилятором хотелось бы, посмотрел что в СLion можно компилятор настроить, но пока буду в VS все делать, мне его достаточно
Как ввести опред. текст в текстбокс и нажать кнопку ок из стороннего консольного приложения?
https://forum.antichat.xyz/attachments/27132513/
Сделал
C++:
HWND window
=
FindWindowEx
(
NULL
,
NULL
,
NULL
,
"Channel Password"
)
;
Получаю HWND, что делать с ним дальше - хз.
Пробовал чисто протестировтаь
C++:
SendMessage
(
window
,
WM_QUIT
,
0
,
0
)
;
PostMessage
(
window
,
WM_QUIT
,
0
,
0
)
;
Ноль реакции
Ссылки на гайды приветствуются
Woofing Giraffe
01.01.2017, 00:35
Код:
wcex.hInstance = hInstance;
wcex.hIcon = (HICON) ::LoadImage(hInstance, L"icon1.ico", IMAGE_ICON, 32, 32, LR_SHARED);
Пытаюсь установить иконку для приложения. Handle получается равен нулю. Что не так то?
Вопрос назрел, если я сделаю свой чат в игре который бы сохранял сообщения в бд, и выводил их с бд в игру другим игрокам у кого стоит тот же скрипт то админы сервера как то могут это заметить?
Sire Like
04.01.2017, 20:20
Вопрос назрел, если я сделаю свой чат в игре который бы сохранял сообщения в бд, и выводил их с бд в игру другим игрокам у кого стоит тот же скрипт то админы сервера как то могут это заметить?
ну если только не скачают его сами. лол. сначала сделай
ну если только не скачают его сами. лол. сначала сделай
Чисто теоретически не вижу ничего сложного, только как в базу удаленную добавлять записи вопрос, а так все остальное сделать не сложно же
Sire Like
04.01.2017, 20:34
Чисто теоретически не вижу ничего сложного, только как в базу удаленную добавлять записи вопрос, а так все остальное сделать не сложно же
подключись к бд, запрос хуес хуяк, потом туда сюда и всё, только пздц мне кажется бд старадать будет
Dark_Knight
05.01.2017, 00:04
Чисто теоретически не вижу ничего сложного, только как в базу удаленную добавлять записи вопрос, а так все остальное сделать не сложно же
Подключение напрямую к БД, второе - через ПХП запросы. Второй вариантом можно передавать шифрованные строки и не спалить ип удаленной базы.
подключись к бд, запрос хуес хуяк, потом туда сюда и всё, только пздц мне кажется бд старадать будет
Та Че ей страдать, я же не буду в вечном цикле запросы слать, 1 запрос на новые сообщения в пару секунд, вот как выводить когда на паузе игра или свернута, будет ли работать скрипт я хз
Не подскажите адрес функции, которая тпшит игрока на землю когда он достигает z = -100? Просто найти не получается, не сильно опытен в этом, учусь пока
Спасибо, больше не нужно, нашёл
При сборке проекта streamInfo и других вылазиют ошибки, хотя sdk стоит все вроде бы норм, обьясните че к чему, я не алё :C вот скрин https://www.blast.hk/attachments/6459/
Сломал на*** ПК, покупай новый
Ха ха, как смешно, вместо того что бы помочь ты ***ню несешь бля.
помогите с ошибкой иза чего может произойти вот лог
Dark_Knight
13.01.2017, 20:49
Где ошибка?
https://forum.antichat.xyz/attachments/27134136/
Oppenhem
13.01.2017, 23:37
Как в SF API работать с метками на карте, которые на ПКМ ставить(не чекпоинты)?
Где ошибка?
ты не видешь?? то что он простроен это не значит что все норм первые 2 строки смотри в этом и проблема
Dark_Knight
14.01.2017, 15:01
ты не видешь?? то что он простроен это не значит что все норм первые 2 строки смотри в этом и проблема
Это 2 строки связанные с путем компилированого файла. Ничего страшного в них нет. Просто укажи нормально путь в настройках проекта и все. Ошибок с код тут нет.
Это 2 строки связанные с путем компилированого файла. Ничего страшного в них нет. Просто укажи нормально путь в настройках проекта и все. Ошибок с код тут нет.
это как тип где будет создаватся файл?
это как тип где будет создаватся файл?
даа,
Скачал эту папку SFPlugin, закинул в папку для проектов, студия пишет что код из более ранней версии студии, предложила обновить его. Вроде как обновила, но он что не компилировался раньше, что не компилируется сейчас.(при этом ошибок в окне вывода нет)
Изменений в проекте я не делал.
Такое поведение - норма, или что-то сделал не так?
iAmerican
17.01.2017, 00:07
Скачал эту папку SFPlugin, закинул в папку для проектов, студия пишет что код из более ранней версии студии, предложила обновить его. Вроде как обновила, но он что не компилировался раньше, что не компилируется сейчас.(при этом ошибок в окне вывода нет)
Изменений в проекте я не делал.
Такое поведение - норма, или что-то сделал не так?
Скрин хотя бы покажи или что нибудь , не чего не понятно.
Скрин хотя бы покажи или что нибудь , не чего не понятно.
После твоего сообщения я внимательнее изучил вывод сборки, и заметил что у меня ошибка при сборке - не может найти файл d3dx9.h
Осмотрел директорию, такого действительно нету. Но откуда мне его взять? Я просто скинул папку в проекты и начал компилировать - файла тупо не было при загрузке
После твоего сообщения я внимательнее изучил вывод сборки, и заметил что у меня ошибка при сборке - не может найти файл d3dx9.h
Осмотрел директорию, такого действительно нету. Но откуда мне его взять? Я просто скинул папку в проекты и начал компилировать - файла тупо не было при загрузке
Direct SDK скачай.
Direct SDK скачай.
А куда устанавливать Direct SDK?
(если надо было просто перекинуть d3dx9.h в папку с gameApi>sdk, то я так и сделал, и всё теперь работает)
А куда устанавливать Direct SDK?
(если надо было просто перекинуть d3dx9.h в папку с gameApi>sdk, то я так и сделал, и всё теперь работает)
https://www.microsoft.com/en-us/download/details.aspx?id=6812 (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS9lbi11cy9kb3dubG 9hZC9kZXRhaWxzLmFzcHg_aWQ9NjgxMg)
https://www.microsoft.com/en-us/download/details.aspx?id=6812 (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS9lbi11cy9kb3dubG 9hZC9kZXRhaWxzLmFzcHg_aWQ9NjgxMg)
Я оттуда и скачал -.-
Woofing Giraffe
17.01.2017, 17:53
Я оттуда и скачал -.-
Установить просто надо
Установить просто надо
Спасибо с:
Как сместить радар у худа, или удалить его?
Почему крашит, когда символов больше 11?
Код:
GetPrivateProfileStringA(LPCSTR(&szSection), LPCSTR(&szKey), LPCSTR(&szDefaultValue), LPSTR(&szResult), DWORD(256), LPCSTR("SAMPFUNCS\\hui.ini"));
hui.ini
Код:
allah=qwertyuiopas
NarutoUA
19.01.2017, 17:00
hui.ini
У тебя hui.ini не влазит в буффер 11 размера.
Dark_Knight
19.01.2017, 18:36
Советую для ини юзать Boost.PropertyTree. Нет зависимостей и куда удобней.
iAmerican
21.01.2017, 15:56
Советую для ини юзать Boost.PropertyTree. Нет зависимостей и куда удобней.
https://prime-hack.net/threads/cinimanager.2228/ (https://www.blast.hk/redirect/aHR0cHM6Ly9wcmltZS1oYWNrLm5ldC90aHJlYWRzL2NpbmltYW 5hZ2VyLjIyMjgv)
я думаю это куда удобнее.
Dark_Knight
21.01.2017, 16:26
Проще, но функционал мал.
https://habrahabr.ru/post/168951/ (https://www.blast.hk/redirect/aHR0cHM6Ly9oYWJyYWhhYnIucnUvcG9zdC8xNjg5NTEv)
http://www.boost.org/doc/libs/1_63_0/doc/html/property_tree.html (https://www.blast.hk/redirect/aHR0cDovL3d3dy5ib29zdC5vcmcvZG9jL2xpYnMvMV82M18wL2 RvYy9odG1sL3Byb3BlcnR5X3RyZWUuaHRtbA)
property_tree может работать сразу с ini, xml, json, info.
Как найти список всех операторов для написания .sf плагинов?
Sire Like
22.01.2017, 04:52
Как найти список всех операторов для написания .sf плагинов?
Мда, операторов, ахаххаахахахах
Мда, операторов, ахаххаахахахах
Охуительно полезный ответ. Поправь ошибку, если я не прав, и ответь по теме вопроса, если тебе есть что написать кроме стёба/флейма/флуда/ещё какой-нибудь ***ни этого рода
BlackKnigga
22.01.2017, 10:24
Охуительно полезный ответ. Поправь ошибку, если я не прав, и ответь по теме вопроса, если тебе есть что написать кроме стёба/флейма/флуда/ещё какой-нибудь ***ни этого рода
Нигде, функции sf api нигде особо не документированны. Можешь почитать гайды на бх вики.
Нигде, функции sf api нигде особо не документированны. Можешь почитать гайды на бх вики.
Спасибо и на том, значит сворачиваем поиски и ищем описание функционала в самих файлах эпи и сдк
Нет зависимостей
А boost по твоему не зависимость?
Mvc++ и ядро линукс, программа создается. Но при запуске ос возникает мерцания. Не знаете как исправить?
Dark_Knight
22.01.2017, 23:31
А boost по твоему не зависимость?
Для property_ptree не нужны либы и дллки. Я про это говорил.
Для property_ptree не нужны либы и дллки. Я про это говорил.
Ну если dll-ки проблема, то можно все в статику укатать
Sire Like
24.01.2017, 17:45
Иди учись гуглить
Dark_Knight
24.01.2017, 19:22
А ты говори конкретнее, показывай код и т.д.
Dark_Knight
24.01.2017, 19:46
Лол.
for(int = 0; i
Dark_Knight
24.01.2017, 19:53
Ну тут уже тебе гугл скажет более точно скажет.. А так цил от нуля до 1023999 с шагом 1
Dark_Knight
26.01.2017, 21:06
Как читать структуры в плюсах?
http://ideone.com/pY7Oog (https://www.blast.hk/redirect/aHR0cDovL2lkZW9uZS5jb20vcFk3T29n)
Dark_Knight
27.01.2017, 02:52
Какой вопрос такой и ответ. Точнее пиши.
iAmerican
27.01.2017, 12:26
Огромное конечно спасибо, но без пояснений в коде мне это даёт лишь готовую функцию считывания (наверное), в которой я понимаю не намного больше, чем до того как ты её скинул, в любой другой такой же функции
в собейте посмотри , если нужны структуры сампа
Woofing Giraffe
30.01.2017, 16:38
Может кто написать функцию конвертирования RGBA в ARGB?
Может кто написать функцию конвертирования RGBA в ARGB?
alpha = rgba & 0xFF;
argb = (rgba >> 8) | (alpha
timur2345678910
01.02.2017, 15:40
А сложный ли язык программирования C++? Просто я новичок в этом всём. Раньше так, скачивал Cleo да играл, особо в этом не заморачивался. Потом зашёл на BlastHack и нечего не понял. Пожалуйста, помогите мне.
А сложный ли язык программирования C++? Просто я новичок в этом всём. Раньше так, скачивал Cleo да играл, особо в этом не заморачивался. Потом зашёл на BlastHack и нечего не понял. Пожалуйста, помогите мне.
Если понятия не имеешь как все устроено, как работает SAMP, плагины, клео, то конечно тебе будет сложно. Тем более если нет опыта в программировании. Но можно быстро научиться , если хотеть и практиковать.
timur2345678910
01.02.2017, 16:52
Если понятия не имеешь как все устроено, как работает SAMP, плагины, клео, то конечно тебе будет сложно. Тем более если нет опыта в программировании. Но можно быстро научиться , если хотеть и практиковать.
А с чего тогда начать?
Dark_Knight
01.02.2017, 19:31
А с чего тогда начать?
С чтения книг и практике на консольных приложениях.
tropical5466
01.02.2017, 21:29
Как получить настоящее время добавления сообщения в чат во время афк?
Dark_Knight
01.02.2017, 21:32
Никак, если при этом ты в ескейпе.
Почему функция time() на компе (C++) и на сервере (php) возвращает разные значения (разница в ~30 секунд).
Отправляю на сервер результат time(nullptr), а на сервере в php скрипте получаю другое значение. Почему так?
time - возвращает кол-во секунд от начала эпохи unix. Должно быть одинаково на всех машинах, поправьте если не так.
itsLegend
04.02.2017, 00:04
Почему функция time() на компе (C++) и на сервере (php) возвращает разные значения (разница в ~30 секунд).
Отправляю на сервер результат time(nullptr), а на сервере в php скрипте получаю другое значение. Почему так?
time - возвращает кол-во секунд от начала эпохи unix. Должно быть одинаково на всех машинах, поправьте если не так.
Судя по всему функция time возвращает разницу между 00:00 01.01.1970 и текущей датой. Возможно даже, что unix время зависит от выставленного времени на устройстве.
Вот сейчас открыл все найденные сервисы для получения текущего timestamp - различие от 3 до 15 секунд. В компиляторах онлайн отставание в 180 секунд.
В C++ (локально) time зависит от текущей даты на компьютере.
Так что делаем выводы сами.
Судя по всему функция time возвращает разницу между 00:00 01.01.1970 и текущей датой. Возможно даже, что unix время зависит от выставленного времени на устройстве.
Вот сейчас открыл все найденные сервисы для получения текущего timestamp - различие от 3 до 15 секунд. В компиляторах онлайн отставание в 180 секунд.
В C++ (локально) time зависит от текущей даты на компьютере.
Так что делаем выводы сами.
Спасибо за ответ. Буду придумывать другую систему.
Dark_Knight
04.02.2017, 16:15
Что тебе надо?
Что тебе надо?
Я хотел синхронизировать сообщения в чате таймстампом, но видимо придется придумать другую систему, либо отправлять таймстамп с сервера, как подсказал Тим.
у меня такой вопрос:
почему все нормально компилируется и плагины .asi и .sf
и RakSamp и собейт а конечный файл не появляется в папке bin
Dark_Knight
07.02.2017, 13:08
И что при этом пишет?
И что при этом пишет?
в том то и дело ничего все нормально компилирует ток файл готовый не появляется в папке bin
лан устанавливаю VS 2017 RC ее попробую мож там быстрее разберусь )
barspinoff
08.02.2017, 22:06
Как отправлять RPC в собейте?
Jack_Savage
23.02.2017, 00:49
Вот нашел функцию:
C++:
int
GetActorAnim
(
DWORD ActorID
)
{
if
(
CallSCM
(
&
is_valid_actor_handle
,
ActorID
)
)
{
int
i
;
while
(
!
CallSCM
(
&
is_actor_performing_anim
,
ActorID
,
i
)
)
{
i
++
;
}
return
i
;
}
return
0
;
}
CallSCM я так понимаю вызов опкода.
А какого ?
Потом нашел is_actor_performing_anim - 0611, "is" в него передают int и string. Каким образом в той функции визывается int ?
Или она не рабочия ?
BlackKnigga
23.02.2017, 00:54
Вот нашел функцию:
C++:
int
GetActorAnim
(
DWORD ActorID
)
{
if
(
CallSCM
(
&
is_valid_actor_handle
,
ActorID
)
)
{
int
i
;
while
(
!
CallSCM
(
&
is_actor_performing_anim
,
ActorID
,
i
)
)
{
i
++
;
}
return
i
;
}
return
0
;
}
CallSCM я так понимаю вызов опкода.
А какого ?
Потом нашел is_actor_performing_anim - 0611, "is" в него передают int и string. Каким образом в той функции визывается int ?
Или она не рабочия ?
Эта функция перебирает все анимки, пока не дойдет до той, что ты сейчас юзаешь. Только вот в опкоде юзается название анимации, а тут похоже ид.
Jack_Savage
23.02.2017, 01:03
Эта функция перебирает все анимки, пока не дойдет до той, что ты сейчас юзаешь. Только вот в опкоде юзается название анимации, а тут похоже ид.
То что она перебирает и вернет id я то понял... А вот что за магический опкод не понял)
BlackKnigga
23.02.2017, 01:23
То что она перебирает и вернет id я то понял... А вот что за магический опкод не понял)
Проверяет юзает ли такой то актер такую то анимку
Jack_Savage
23.02.2017, 01:27
Проверяет юзает ли такой то актер такую то анимку
Та я это понимаю.... Я не понимаю как... Как Карл тут юзается опкод с входным параметром String но в него передается int.
Может есть опкод который делает тоже то 0611 только не по названию а по ID ?
Код:
[CODE]
while (mEntry.szModule != "samp.dll")
{
if (mEntry.szModule != "samp.dll")
{
cout
нУ почему оно НЕ ПЕРЕБИрАЕТ проклятые модули, а просто спамит ОДНИМ б1234 И ТЕМ ЖЕ?!
хелп, я уже подгораю
наверное, неправильно сохраняю следующий модуль, или ещё что
помогииите, котята :С
Dark_Knight
25.02.2017, 04:40
http://pastebin.com/7XLrsHHr (https://www.blast.hk/redirect/aHR0cDovL3Bhc3RlYmluLmNvbS83WExyc0hIcg)
http://pastebin.com/7XLrsHHr (https://www.blast.hk/redirect/aHR0cDovL3Bhc3RlYmluLmNvbS83WExyc0hIcg)
while (Process32Next(processesSnapshot, &processInfo))
Как будет работать этот цикл?
Тут нет условия, что должно заставить цикл остановиться?
Или я что-то не понимаю?
Dark_Knight
25.02.2017, 14:53
Я тебе дал рабочую вещь. Юзай и не парся.
Цикл будет работать пока Process32Next будет возвращать истину.
Ребят, есть проблема при включении аирбрейка собейт не держит Z координату, т.е. если спуститься под землю он будет медленно падать вниз.
C++:
void
func_air_brake
(
)
{
static
float
orig_pos
[
3
]
;
static
float
fall_speed_mult
;
static
int
vkl
=
0
;
actor_info
*
info
=
g_SAMP
->
getPlayers
(
)
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
;
if
(
isKeyPressed
(
VK_RSHIFT
)
)
menu
.
air_brake
^=
1
;
if
(
menu
.
air_brake
)
{
vect3_copy
(
&
info
->
base
.
matrix
[
4
*
3
]
,
orig_pos
)
;
fall_speed_mult
=
1.0f
;
vkl
=
1
;
}
if
(
!
menu
.
air_brake
&&
vkl
)
{
toggleSAMPCursor
(
0
)
;
TOGGLECURSOR
(
1
)
;
TOGGLECURSOR
(
0
)
;
vkl
=
0
;
}
if
(
menu
.
air_brake
)
{
float
*
matrix
=
info
->
base
.
matrix
;
// if there's no parachute
if
(
g_SAMP
->
getPlayers
(
)
->
pLocalPlayer
->
byteCurrentWeapon
!=
46
)
{
vect3_copy
(
orig_pos
,
&
info
->
base
.
matrix
[
4
*
3
]
)
;
vect3_zero
(
info
->
speed
)
;
SetIsStanding
(
1
)
;
float
d
[
4
]
=
{
0.0f
,
0.0f
,
0.0f
,
0.0002f
}
;
if
(
isKeyDown
(
'W'
)
)
d
[
0
]
+=
1.0f
;
if
(
isKeyDown
(
'S'
)
)
d
[
0
]
-=
1.0f
;
if
(
isKeyDown
(
'A'
)
)
d
[
1
]
+=
1.0f
;
if
(
isKeyDown
(
'D'
)
)
d
[
1
]
-=
1.0f
;
if
(
isKeyDown
(
VK_UP
)
)
d
[
2
]
+=
1.0f
;
if
(
isKeyDown
(
VK_DOWN
)
)
d
[
2
]
-=
1.0f
;
if
(
!
vect3_near_zero
(
d
)
)
{
float
vect
[
4
]
=
{
-
d
[
1
]
,
d
[
0
]
,
d
[
2
]
,
0.0f
}
;
float
out
[
4
]
;
/* out = matrix * norm(d) */
vect3_normalize
(
vect
,
vect
)
;
matrix_vect4_mult
(
matrix
,
vect
,
out
)
;
matrix
[
4
*
3
+
0
]
+=
out
[
0
]
*
d
[
3
]
;
matrix
[
4
*
3
+
1
]
+=
out
[
1
]
*
d
[
3
]
;
matrix
[
4
*
3
+
2
]
+=
out
[
2
]
*
d
[
3
]
;
}
}
vect3_copy
(
&
matrix
[
4
*
3
]
,
orig_pos
)
;
}
}
Jack_Savage
27.02.2017, 17:21
C++:
typedef
struct
RpClump
RpClump
;
typedef
RpClump
*
(
*
RpClumpCallback
)
(
RpClump
*
clump
,
void
*
data
)
;
struct
RwObject
{
unsigned
char
type
;
unsigned
char
subtype
;
unsigned
char
flags
;
unsigned
char
privateFlags
;
void
*
parent
;
// should be RwFrame with RpClump
}
;
struct
RwListEntry
{
RwListEntry
*
next
,
*
prev
;
}
;
struct
RwList
{
RwListEntry root
;
}
;
struct
RpClump
{
// RenderWare (plugin) Clump (used by GTA)
RwObject object
;
RwList atomics
;
RwList lights
;
RwList cameras
;
RwListEntry globalClumps
;
RpClumpCallback callback
;
}
;
list
m_Associations
;
CAnimBlendAssociation
*
GetAnimBlendAssociation
(
CAnimBlendAssociationSAInterface
*
pInterface
)
{
if
(
pInterface
)
{
list
::
iterator iter
=
m_Associations
.
begin
(
)
;
for
(
;
iter
!=
m_Associations
.
end
(
)
;
iter
++
)
{
if
(
(
*
iter
)
->
GetInterface
(
)
==
pInterface
)
{
return
*
iter
;
}
}
CAnimBlendAssociation
*
pAssociation
=
new
CAnimBlendAssociationSA
(
pInterface
)
;
m_Associations
.
push_back
(
pAssociation
)
;
return
pAssociation
;
}
return
NULL
;
}
CAnimBlendAssociation
*
RpAnimBlendClumpGetFirstAssociation
(
RpClump
*
pClump
)
{
if
(
!
pClump
)
return
NULL
;
CAnimBlendAssociationSAInterface
*
pInterface
;
DWORD dwFunc
=
FUNC_RpAnimBlendClumpGetFirstAssociation
;
_asm
{
push pClump
call dwFunc
mov pInterface
,
eax
add esp
,
0x4
}
return
GetAnimBlendAssociation
(
pInterface
)
;
}
Ну вот нашел код для получения анимации.
Только затык, как получить RpClump ?
Там где взял есть функция которая возвращает значение переменной.
А вот кто этой переменной присваивает значение не нашел
Ребят, есть проблема при включении аирбрейка собейт не держит Z координату, т.е. если спуститься под землю он будет медленно падать вниз.
C++:
void
func_air_brake
(
)
{
static
float
orig_pos
[
3
]
;
static
float
fall_speed_mult
;
static
int
vkl
=
0
;
actor_info
*
info
=
g_SAMP
->
getPlayers
(
)
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
;
if
(
isKeyPressed
(
VK_RSHIFT
)
)
menu
.
air_brake
^=
1
;
if
(
menu
.
air_brake
)
{
vect3_copy
(
&
info
->
base
.
matrix
[
4
*
3
]
,
orig_pos
)
;
fall_speed_mult
=
1.0f
;
vkl
=
1
;
}
if
(
!
menu
.
air_brake
&&
vkl
)
{
toggleSAMPCursor
(
0
)
;
TOGGLECURSOR
(
1
)
;
TOGGLECURSOR
(
0
)
;
vkl
=
0
;
}
if
(
menu
.
air_brake
)
{
float
*
matrix
=
info
->
base
.
matrix
;
// if there's no parachute
if
(
g_SAMP
->
getPlayers
(
)
->
pLocalPlayer
->
byteCurrentWeapon
!=
46
)
{
vect3_copy
(
orig_pos
,
&
info
->
base
.
matrix
[
4
*
3
]
)
;
vect3_zero
(
info
->
speed
)
;
SetIsStanding
(
1
)
;
float
d
[
4
]
=
{
0.0f
,
0.0f
,
0.0f
,
0.0002f
}
;
if
(
isKeyDown
(
'W'
)
)
d
[
0
]
+=
1.0f
;
if
(
isKeyDown
(
'S'
)
)
d
[
0
]
-=
1.0f
;
if
(
isKeyDown
(
'A'
)
)
d
[
1
]
+=
1.0f
;
if
(
isKeyDown
(
'D'
)
)
d
[
1
]
-=
1.0f
;
if
(
isKeyDown
(
VK_UP
)
)
d
[
2
]
+=
1.0f
;
if
(
isKeyDown
(
VK_DOWN
)
)
d
[
2
]
-=
1.0f
;
if
(
!
vect3_near_zero
(
d
)
)
{
float
vect
[
4
]
=
{
-
d
[
1
]
,
d
[
0
]
,
d
[
2
]
,
0.0f
}
;
float
out
[
4
]
;
/* out = matrix * norm(d) */
vect3_normalize
(
vect
,
vect
)
;
matrix_vect4_mult
(
matrix
,
vect
,
out
)
;
matrix
[
4
*
3
+
0
]
+=
out
[
0
]
*
d
[
3
]
;
matrix
[
4
*
3
+
1
]
+=
out
[
1
]
*
d
[
3
]
;
matrix
[
4
*
3
+
2
]
+=
out
[
2
]
*
d
[
3
]
;
}
}
vect3_copy
(
&
matrix
[
4
*
3
]
,
orig_pos
)
;
}
}
GTAfunc_LockActor(true);
Почему не работает таймер?
https://pp.userapi.com/c637124/v637124232/3916a/l_z1Ii8gLDQ.jpg
Вместо (TIMERPROC)TimerProc делал &TimerProc - результат такой же.
Или как еще можно сделать постоянное выполнение опред. кода в dll, кроме потока с бесконечным циклом, т.к. при использовании такого потока проседает много фпс
BlackKnigga
08.03.2017, 14:32
Или как еще можно сделать постоянное выполнение опред. кода в dll, кроме потока с бесконечным циклом, т.к. при использовании такого потока проседает много фпс
WndProc
itsLegend
08.03.2017, 15:03
Почему не работает таймер?
l_z1Ii8gLDQ.jpgitsLegend · 8 Мар 2017 в 14:03' data-fancybox="lb-post-139568" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="/proxy.php?image=https%3A%2F%2Fpp.userapi.com%2Fc63 7124%2Fv637124232%2F3916a%2Fl_z1Ii8gLDQ.jpg&hash=8ecff658cef9f24b76951d6aacf82f49" style="cursor: pointer;" title="l_z1Ii8gLDQ.jpg">
https://pp.userapi.com/c637124/v637124232/3916a/l_z1Ii8gLDQ.jpg
Вместо (TIMERPROC)TimerProc делал &TimerProc - результат такой же.
Для того, чтобы работали таймеры, нужно будет обрабатывать очередь сообщений.
C++:
MSG msg
;
while
(
GetMessage
(
&
msg
,
NULL
,
0
,
0
)
)
{
TranslateMessage
(
&
msg
)
;
DispatchMessage
(
&
msg
)
;
}
Или как еще можно сделать постоянное выполнение опред. кода в dll, кроме потока с бесконечным циклом, т.к. при использовании такого потока проседает много фпс
Чтобы фпс не проседало, используй Sleep с задержкой ~100
Добрый день. Хотел спросить, какую версию VS нужно скачать, для программирования под самп? Чтобы стабильно без ошибок. (с ссылкой желательно)
Возможно не в той теме спрашиваю.
Как написать бота, который будет работать без запуска GTA? Есть какие-то готовые средства?
MISTER_GONWIK
13.03.2017, 14:03
Возможно не в той теме спрашиваю.
Как написать бота, который будет работать без запуска GTA? Есть какие-то готовые средства?
раксамп (RakSAMP)
раксамп (RakSAMP)
Есть какой-нибудь мануал к нему? Что и где менять, чтобы бота написать.
MISTER_GONWIK
13.03.2017, 15:00
Есть какой-нибудь мануал к нему? Что и где менять, чтобы бота написать.
нет, сам думай
Есть какой-нибудь мануал к нему? Что и где менять, чтобы бота написать.
Мануал? Нет. Всякие там мануалы только по павну могут быть.
Скачал исходники RakSAMP, компилирую, запускаю. И у меня не отображается диалог для ввода пароля. Функция обратного вызова зарегистрирована:
C++:
pRakClient
->
RegisterAsRemoteProcedureCall
(
&
RPC_ScrDialogBox
,
ScrDialogBox
)
;
В функции ScrDialogBox поставил точки останова, но они не срабатывают, значит эта функция просто не вызывается. В чем может быть проблема?
UPD: Сегодня пока отлаживал запустил RakSAMP и копался в коде. Примерно через минуты две внезапно вылез диалог. Ввел в него пароль, сразу вылез следующий диалог с вводом почты, а затем с ником пригласившего игрока. Это было на Advance. Выключил, запустил снова. Диалоги сразу же приходят, без проблем. Попробовал на Diamond, диалоги не идут. Ещё на одном сервере попробовал, тоже не идут, хотя ждал их долго. Почему так происходит?
Да, забыл уточнить, все сообщения в чате нормально приходят, только диалоги почему-то не приходят.
написал я esp for csgo, писал с надеждой ноу вак банед, в итоге двоих похоронил, и *** с ним. вопрос вот в чем, писал я как бы асинхронно, без хука директа, тобишь dll не инжектил, а читал адреса и рендерил в topmost. итак, меня вак палил когда я читал адреса или же вак палил палил то что перед окошком его игры есть другое прозрачное окошко(topmost). есть еще третий для отбитых как я вариант, может вак чекает все активные процессы и их процедуры, и при подозрении банит?
@#ripper (https://www.blast.hk/members/61605/)
Зачем для есп вообще что-либо рисовать, когда в кс го есть родной glow?
По поводу вака:
Насчет RPM - не могу ответить точно, но находил инфу, что у вольво может быть драйвер, который будет палить RPM. Даже тут, пару страниц назад, фип что-то подобное писал.
Окошко перед окошком , по моему, отлетает сразу, т.к. есть еще шадоуплей, фрапс, бандикам, овервульф, рк и еще куча всего разного.
Подозрительные процессы и процедуры - тут хз, скорей будет выкидывать в случае детектирования чего-то ОЧЕНЬ распространенного ( у меня вылетает из мм каток, если запущен чит энжин (даже не подключенный к кс:го). При этом никакого бана, просто пишет "нестабильное соединение с VAC".
Из собственного небольшого опыта: вак на много тупее, чем кажется. Не стоит бояться интернал-читов, пиши длл, инжекти в процесс и все будет нормально. Сам уже несколько месяцев так играю (самописные инжектор + сам чит). Никакого бана. И фпс, если юзать таймер WinAPI / хук окна, а не потоки, практически не проседает (в отличие от RPM).
пс сор, изменил пост, сразу не с компа писал
буду-буду пробовать, надеюсь с dll будет все пучком
Есть массив, содержащий hex .dll файла.
https://pp.userapi.com/c639722/v639722232/10361/JQBUxgFP-1I.jpg
Эту .dll можно как-нибудь заинжектить в игру? Заменить адрес файла указателем на этот массив в функции инжекта не прокатывает :D
C++:
bool
inject
(
DWORD pID
,
char
*
path
)
{
path
=
cHexCode
;
HANDLE proc_handle
;
LPVOID RemoteString
;
LPVOID LoadLibAddy
;
if
(
pID
==
0
)
return
false
;
proc_handle
=
OpenProcess
(
PROCESS_ALL_ACCESS
,
false
,
pID
)
;
if
(
proc_handle
==
0
)
return
false
;
LoadLibAddy
=
GetProcAddress
(
GetModuleHandle
(
"kernel32.dll"
)
,
"LoadLibraryA"
)
;
RemoteString
=
VirtualAllocEx
(
proc_handle
,
NULL
,
strlen
(
path
)
,
MEM_RESERVE
|
MEM_COMMIT
,
PAGE_READWRITE
)
;
WriteProcessMemory
(
proc_handle
,
RemoteString
,
path
,
strlen
(
path
)
,
NULL
)
;
//запись DLL в память игры
CreateRemoteThread
(
proc_handle
,
NULL
,
NULL
,
(
LPTHREAD_START_ROUTINE
)
LoadLibAddy
,
RemoteString
,
NULL
,
NULL
)
;
CloseHandle
(
proc_handle
)
;
return
true
;
}
Есть массив, содержащий hex .dll файла.
https://pp.userapi.com/c639722/v639722232/10361/JQBUxgFP-1I.jpg
Эту .dll можно как-нибудь заинжектить в игру? Заменить адрес файла указателем на этот массив в функции инжекта не прокатывает :D
C++:
bool
inject
(
DWORD pID
,
char
*
path
)
{
path
=
cHexCode
;
HANDLE proc_handle
;
LPVOID RemoteString
;
LPVOID LoadLibAddy
;
if
(
pID
==
0
)
return
false
;
proc_handle
=
OpenProcess
(
PROCESS_ALL_ACCESS
,
false
,
pID
)
;
if
(
proc_handle
==
0
)
return
false
;
LoadLibAddy
=
GetProcAddress
(
GetModuleHandle
(
"kernel32.dll"
)
,
"LoadLibraryA"
)
;
RemoteString
=
VirtualAllocEx
(
proc_handle
,
NULL
,
strlen
(
path
)
,
MEM_RESERVE
|
MEM_COMMIT
,
PAGE_READWRITE
)
;
WriteProcessMemory
(
proc_handle
,
RemoteString
,
path
,
strlen
(
path
)
,
NULL
)
;
//запись DLL в память игры
CreateRemoteThread
(
proc_handle
,
NULL
,
NULL
,
(
LPTHREAD_START_ROUTINE
)
LoadLibAddy
,
RemoteString
,
NULL
,
NULL
)
;
CloseHandle
(
proc_handle
)
;
return
true
;
}
Можно, но чую, что ты ***ню затеял, так что ни подсказки, ни готового кода (который есть) ты не получишь
NarutoUA
20.03.2017, 10:20
Можно, но чую, что ты ***ню затеял, так что ни подсказки, ни готового кода (который есть) ты не получишь
По скрину понял что там стиллер? Жостко.
По скрину понял что там стиллер? Жостко.
по скрину понял, что файл не правильно в массив записан и работать при инжекте не будет. А мысли о стилере растут из самого вопроса
Всего лишь вх от гейбена и других умников прячу
NarutoUA
20.03.2017, 10:57
Да придумали же инжекторы которые без драйверов не спалить.
MemoryLoadLibrary смотрел? Я сам не использовал, только читал про него, но вроде делает как раз то что тебе необходимо
За что отвечает ID_TIMESTAMP в PacketEnumeration?
RakNet 4-ой версии совместим с SAMPом? Скачал отсюда https://github.com/OculusVR/RakNet, пытаюсь подключиться к серверу (для тестов использовал сервер RakSAMP), но он не подключается, выдает ID_CONNECTION_ATTEMPT_FAILED, а сервер говорит: [WARNING] Invalid checksum.
Это из-за разных версий или я просто неправильно подключаюсь?
Вообще я мог бы и на более ранних версиях писать, но в 4-ой сделали возможность писать на шарпе, что для меня очень удобно.
NarutoUA
21.03.2017, 19:49
RakNet 4-ой версии совместим с SAMPом? Скачал отсюда https://github.com/OculusVR/RakNet, пытаюсь подключиться к серверу (для тестов использовал сервер RakSAMP), но он не подключается, выдает ID_CONNECTION_ATTEMPT_FAILED, а сервер говорит: [WARNING] Invalid checksum.
Это из-за разных версий или я просто неправильно подключаюсь?
Вообще я мог бы и на более ранних версиях писать, но в 4-ой сделали возможность писать на шарпе, что для меня очень удобно.
В сампе старый и очень модифицированный ракнет. Тут или делать враппер старого ракнета или фиксить новый смотря на старый.
livarka1337
21.03.2017, 23:17
Для просмотра скрытого содержимого вы должны войти (https://www.blast.hk/login/) или зарегистрироваться (https://www.blast.hk/login/register).
А на*** поток под такое создавать? И на*** хайд ставить, вроде это не тот код который заслуживает хайд
livarka1337
22.03.2017, 16:52
А на*** поток под такое создавать? И на*** хайд ставить, вроде это не тот код который заслуживает хайд
просто хочу чтоб не все видели)
мне посоветовали поток
Ну как бы если делать поток, то надо изменить принцип.
А вообще можно и без дополнительного потока, при помощи таймера. Можешь поискать, тут точно должны быть примеры.
Dark_Knight
22.03.2017, 17:56
просто хочу чтоб не все видели)
мне посоветовали поток
Билять, топориками тебя надо на курдючное сало пустить.
Код:
static DWORD time = 0;
void afk_flood()
{
if (cheat_state->_generic.aflood){
if (GetTickCount() - time > 1050)
{
say("/unloading");
time = GetTickCount();
}
}
}
livarka1337
22.03.2017, 20:33
Билять, топориками тебя надо на курдючное сало пустить.
Код:
static DWORD time = 0;
void afk_flood()
{
if (cheat_state->_generic.aflood){
if (GetTickCount() - time > 1050)
{
say("/unloading");
time = GetTickCount();
}
}
}
и типо оно в афк флудить будет разве?)
Dark_Knight
22.03.2017, 22:33
Все от типа запуска ГТА зависит. Даже, если бы ты на поток вынес, то оно не работало бы.
iAmerican
23.03.2017, 10:45
Как сделать стремление к числу? К примеру , у меня в переменной сохраненное число 1 , в новых данных уже идёт число 32.
Надо что бы перезапись была сразу не на 32 , а постепенно от 1 до 32 прошло.
т.е. 1.2.3.4.5.6. и т.д. до 32.
Думаю как то с помощью цикла , только вот сообразить не могу(
MISTER_GONWIK
23.03.2017, 12:06
Как сделать стремление к числу? К примеру , у меня в переменной сохраненное число 1 , в новых данных уже идёт число 32.
Надо что бы перезапись была сразу не на 32 , а постепенно от 1 до 32 прошло.
т.е. 1.2.3.4.5.6. и т.д. до 32.
Думаю как то с помощью цикла , только вот сообразить не могу(
C++:
[CODE]
for
(
int
j
=
1
;
j
В уроке по raknet фильтрация пакетов идёт по названию
Код:
params->packetId == PacketEnumeration::ID_PLAYER_SYNC
Можно ли указать вместо названия пакета его ид, в такой форме? (в уроке такой вариант не рассматривается, а мне так привычнее)
C:
params
->
packetId
==
78
itsLegend
25.03.2017, 16:41
Так и сравнивай
C:
params
->
packetId
==
78
Dark_Knight
25.03.2017, 16:44
В уроке по raknet фильтрация пакетов идёт по названию
Код:
params->packetId == PacketEnumeration::ID_PLAYER_SYNC
Можно ли указать вместо названия пакета его ид, в такой форме? (в уроке такой вариант не рассматривается, а мне так привычнее)
C:
params
->
packetId
==
78
Лучше указывай так, как в уроке ибо чтение кода будет куда проще.
Тщетно, братцы, бытие. Мало того что дллки пишутся, оказывается, совсем не как экзешники,так ещё и ошибки оккупировали.
И самое обидное, что первая ошибка на строку вызвавшую её не указывает. Не знаю почему, но мне кажется что если я даже напрягу мозг и переводу описание ошибки, всё равно не смогу исправить. Так что прошу у Вас помощи, господа по мастерству превосходящие.
n/a
Насчёт третьей строки ошибки - вовсе без понятия. Делал всё по уроку, но почему-то студия ругается ._.
Тоже самое, что я делал вчера на клео. Должно срабатывать на входящий RPC, и если это SetPlayerMapIcon, слизать инфу и вывести в чат.
n/a
itsLegend
25.03.2017, 18:12
Колбэк iRPC нужно вставлять перед её применением (до mainloop, в твоём случае), либо объявить в .h.
Dark_Knight
25.03.2017, 18:58
Можно в том же файле обьявить, но обязательно перед
Код:
[CODE]
void Her();
void main(){
Her();
}
void Her(){
int i = 0;
std::cout
Ещё вопрос возник. Не создаст ли утечку памяти то что при вызове коллбека создаются переменные, но не освобождаются?
Или они не будут выделять память заново, а просто перезапишутся?
itsLegend
25.03.2017, 21:09
Не создаст.
Переменная, объявленная внутри функции/цикла/..., автоматически уничтожается вместе с выходом из тела функции/цикла.
Если ты будешь использовать что-то вроде char* p = new char;, то это может повлечь утечку.
Как определить корневую папку процесса, в котором загружена dll, если функция определения в этой самой dll?
itsLegend
25.03.2017, 23:53
GetModuleFileName пробовал?
Dark_Knight
26.03.2017, 13:21
GetCurrentDirectory - получает путь откуда был запущен процесс.
Dark_Knight
26.03.2017, 15:56
Ты это в длл используешь или в ехе?
Dark_Knight
26.03.2017, 16:15
Эта та функция, которая тебе нужна. Поверь.
Dark_Knight
26.03.2017, 17:23
Крч, похоже не удастся мне без костылей получить директорию. Буду через снапшоты и имена процессов искать саньку, и получать её папку.
И где же тут костыль?
C:
[CODE]
#include
#include
void
main
(
)
{
char
path
[
MAX_PATH
]
GetCurrentDirectory
(
MAX_PATH
,
path
)
;
std
::
cout
C:
bool CALLBACK
iRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
56
)
{
byte iNumber
;
float
iX
;
float
iY
;
float
iZ
;
byte iI
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
iNumber
)
;
params
->
bitStream
->
Read
(
iX
)
;
params
->
bitStream
->
Read
(
iY
)
;
params
->
bitStream
->
Read
(
iZ
)
;
params
->
bitStream
->
Read
(
iI
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
WriteFile
(
miD
,
iNumber
,
sizeof
(
iNumber
)
,
sometrash
,
NULL
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
444444
,
"%d %f %f %f %d"
,
iNumber
,
iX
,
iY
,
iZ
,
iI
)
;
Должно записывать порядковый номер иконки в стриме, но записывает абракадабру, которая даже не отображается в окне ввода (не могу её прикрепить)
Что не так?
C:
bool CALLBACK
iRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
56
)
{
byte iNumber
;
float
iX
;
float
iY
;
float
iZ
;
byte iI
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
iNumber
)
;
params
->
bitStream
->
Read
(
iX
)
;
params
->
bitStream
->
Read
(
iY
)
;
params
->
bitStream
->
Read
(
iZ
)
;
params
->
bitStream
->
Read
(
iI
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
WriteFile
(
miD
,
iNumber
,
sizeof
(
iNumber
)
,
sometrash
,
NULL
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
444444
,
"%d %f %f %f %d"
,
iNumber
,
iX
,
iY
,
iZ
,
iI
)
;
Должно записывать порядковый номер иконки в стриме, но записывает абракадабру, которая даже не отображается в окне ввода (не могу её прикрепить)
Что не так?
Считывать нужно следующее: BYTE iconID, float x, float y, float z, BYTE markerType, DWORD color, BYTE style. В таком же порядке.
Считывать нужно следующее: BYTE iconID, float x, float y, float z, BYTE markerType, DWORD color, BYTE style. В таком же порядке.
чувак, я считал всё что мне нужно и сделал это правильно. На сайте сампа я нашёл пример пакета и логично подобрал форму заполнения. В чат всё выводит корректно, проблема с записью, которая не работает.
itsLegend
27.03.2017, 15:10
Используй fstream
BlackKnigga
28.03.2017, 16:44
RPC_ClientMessage
if (strstr(szMsg, "Текст")) как сделать проверку на цвет этого текста
{
say("blast.hk");
}
У этого рпц первый параметр цвет, dword
Почему RegisterConsoleCommand в SF не принимает bool callback?
itsLegend
29.03.2017, 20:46
А зачем ему принимать bool?
А зачем ему принимать bool?
А какой тип оно вообще принимает?
BlackKnigga
29.03.2017, 21:53
А какой тип оно вообще принимает?
void
Dark_Knight
29.03.2017, 21:54
А какой тип оно вообще принимает?
typedef void(__stdcall *CommandProc) (std::string params);
void
воид же не возвращает никаких значений, как передавать параметры тогда?
itsLegend
30.03.2017, 15:27
Какие параметры?
Если б SF нужны были бы данные от колбэка, то функция была бы не void.
BlackKnigga
30.03.2017, 15:45
воид же не возвращает никаких значений, как передавать параметры тогда?
Так и передавать:
C++:
void
CALLBACK
cmd
(
std
::
string params
)
Передаются ли какие-нибудь параметры в исходящий RPC_RequestClass?
BlackKnigga
01.04.2017, 10:49
Передаются ли какие-нибудь параметры в исходящий RPC_RequestClass?
Нет
livarka1337
02.04.2017, 21:29
как вызвать нужный мне патч в собе? хотел бы сделать в меню
типо
void patch()
{
вызываю нужный патч
}
BlackKnigga
02.04.2017, 22:26
как вызвать нужный мне патч в собе? хотел бы сделать в меню
типо
void patch()
{
вызываю нужный патч
}
Какой еще патч? Ноп что ли?
livarka1337
03.04.2017, 08:11
Какой еще патч? Ноп что ли?
Допустим disable (dl) distance limit
как вызвать нужный мне патч в собе? хотел бы сделать в меню
типо
void patch()
{
вызываю нужный патч
}
в меню и так есть такое
Как получить id пикапа, если находишься в другом виртуальном мире? Я захожу в любой интерьер и меня перекидывает в другой виртуальный мир, но сам я остаюсь на месте, так как отклоняю пакеты с перемещением и сменой интерьера. После этого пикапы становятся не видны. Я все ещё могу их отловить через onCreatePickup, но не все, некоторые не появляются .
itsLegend
03.04.2017, 18:05
Как получить id пикапа, если находишься в другом виртуальном мире?.
Определить пикап из другого вирт. мира нельзя
Определить пикап из другого вирт. мира нельзя
А поднять его перебором id можно?
Dark_Knight
03.04.2017, 18:28
А поднять его перебором id можно?
А ты уверен, что он будет существовать и для пикапа не стоит проверка на вирт. мир?
А ты уверен, что он будет существовать и для пикапа не стоит проверка на вирт. мир?
Не уверен. Ну ладно, значит никак.
Есть ещё вопрос. Как сервер определяет, что я встал на маркер? С пикапом понятно, я отправляю пакет с его id. А вот исходящих пакетов с маркерами я в списке пакетов (который в events.lua) не нашел.
itsLegend
03.04.2017, 19:11
Это значит то, что сервер проверяет твою позицию с позицией маркера в определенном радиусе.
NarutoUA
04.04.2017, 02:15
что нужно сделать что-бы выстрел пуль не были видны при отправке пуль
визуально выстрел пули не видны, а если смотреть со стороны то выстрел пули видны
float vect3_null[3] = { 0.0f, 0.0f, 0.0f };
g_RakClient->SendFakeBulletSyncData(&self->base.matrix[12], vect3_null, &self->base.matrix[12], 0, -1);
void RakClient::SendFakeBulletSyncData(float aimHit[3], float bodyPos[3], float hitPos[3], BYTE hitType, uint16_t id)
{
stBulletData bSync;
ZeroMemory(&bSync, sizeof(bSync));
BitStream bsBulletSync;
bSync.fOrigin[0] = aimHit[0];
bSync.fOrigin[1] = aimHit[1];
bSync.fOrigin[2] = aimHit[2];
bSync.fCenter[0] = bodyPos[0];
bSync.fCenter[1] = bodyPos[1];
bSync.fCenter[2] = bodyPos[2];
bSync.fTarget[0] = hitPos[0];
bSync.fTarget[1] = hitPos[1];
bSync.fTarget[2] = hitPos[2];
bSync.byteType = hitType;
bSync.sTargetID = id;
bSync.byteWeaponID = g_Players->pLocalPlayer->byteCurrentWeapon;
bsBulletSync.Write((BYTE)ID_BULLET_SYNC);
bsBulletSync.Write((PCHAR)&bSync, sizeof(stBulletData));
g_RakClient->Send(&bsBulletSync, HIGH_PRIORITY, UNRELIABLE_SEQUENCED, 0);
}
А ты думаешь, что пули с твоего компьютера летят прямо в другой комп?
Как в C++ использовать скрипты на Lua? Погуглил, все советуют разное, кто-то LuaBridge, кто-то swig. Что все-таки лучше использовать?
Dark_Knight
05.04.2017, 12:55
Как в C++ использовать скрипты на Lua? Погуглил, все советуют разное, кто-то LuaBridge, кто-то swig. Что все-таки лучше использовать?
Собственно назревает вопрос. Нахуя?
Собственно назревает вопрос. Нахуя?
Есть класс описывающий игрока. Игроков много, каждый должен выполнять разные задачи. Удобнее это сделать, через скриптовый язык. У каждого игрока должен быть свой скрипт на Lua. Вызов определенных методов игрока должен вызывать соответствующие коллбэки в Lua. И наоборот, вызов определенных функций в Lua, должен вызывать методы в классе. Так я смогу легко прописать логику каждому игроку.
Есть класс описывающий игрока. Игроков много, каждый должен выполнять разные задачи. Удобнее это сделать, через скриптовый язык. У каждого игрока должен быть свой скрипт на Lua. Вызов определенных методов игрока должен вызывать соответствующие коллбэки в Lua. И наоборот, вызов определенных функций в Lua, должен вызывать методы в классе. Так я смогу легко прописать логику каждому игроку.
я так и не понял, зачем вызывать колбеки в луа, если можно вызывать их в плюсах
я так и не понял, зачем вызывать колбеки в луа, если можно вызывать их в плюсах
Затем, что у меня много различных поведений для игроков. Каждый из них должен по разному реагировать на вызов колбека. Если я буду вызывать колбэки в луа, то у меня будет один универсальный класс для всех игроков, и у каждого игрока будет свой особый скрипт. Если же все писать в плюсах, то в каждом колбэке придется пихать код для всех типов игроков. Что-то типа switch(тип игрока) и 100 кейсов для каждого типа. И так в каждом колбеке. Лютый говнокод получится.
Как в C++ использовать скрипты на Lua? Погуглил, все советуют разное, кто-то LuaBridge, кто-то swig. Что все-таки лучше использовать?
sol2 (https://github.com/ThePhD/sol2) - очень годный враппер, используется в муне
Указатели и их переменные выглядят вот так:
C:
int
dpId
;
byte dS
;
TCHAR title
;
TCHAR descr
;
TCHAR b1
;
TCHAR b2
;
int
*
dpIdP
=
&
dpId
;
byte
*
dSP
=
&
dS
;
TCHAR
*
titleP
=
&
title
;
TCHAR
*
descrP
=
&
descr
;
TCHAR
*
b1P
=
&
b1
;
TCHAR
*
b2P
=
&
b2
;
Вот так выглядит функция, которая использует один из указателей:
C:
bool CALLBACK
OP
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
61
)
{
params
->
bitStream
->
Read
(
*
dpIdP
)
;
params
->
bitStream
->
Read
(
*
dSP
)
;
params
->
bitStream
->
Read
(
*
titleP
)
;
params
->
bitStream
->
Read
(
*
descrP
)
;
params
->
bitStream
->
Read
(
*
b1P
)
;
params
->
bitStream
->
Read
(
*
b2P
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
444444
,
*
dpIdP
)
;
}
}
Вот так выглядит ошибка:
Код:
невозможно преобразовать аргумент 2 из "int" в "const char *"
Как вывести в чат сообщение через bool callback (хук), используя указатель на переменную вместо переменной?
Примечательно то, что если выводить не указатель а саму переменную, вывод будет нормальный не смотря на то что он не const char, однако в случае с указателем как раз на это ссылается студия.
И главный вопрос. В чём конкретно я ошибся?
BlackKnigga
09.04.2017, 10:03
Указатели и их переменные выглядят вот так:
C:
int
dpId
;
byte dS
;
TCHAR title
;
TCHAR descr
;
TCHAR b1
;
TCHAR b2
;
int
*
dpIdP
=
&
dpId
;
byte
*
dSP
=
&
dS
;
TCHAR
*
titleP
=
&
title
;
TCHAR
*
descrP
=
&
descr
;
TCHAR
*
b1P
=
&
b1
;
TCHAR
*
b2P
=
&
b2
;
Вот так выглядит функция, которая использует один из указателей:
C:
bool CALLBACK
OP
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
61
)
{
params
->
bitStream
->
Read
(
*
dpIdP
)
;
params
->
bitStream
->
Read
(
*
dSP
)
;
params
->
bitStream
->
Read
(
*
titleP
)
;
params
->
bitStream
->
Read
(
*
descrP
)
;
params
->
bitStream
->
Read
(
*
b1P
)
;
params
->
bitStream
->
Read
(
*
b2P
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
444444
,
*
dpIdP
)
;
}
}
Вот так выглядит ошибка:
Код:
невозможно преобразовать аргумент 2 из "int" в "const char *"
Как вывести в чат сообщение через bool callback (хук), используя указатель на переменную вместо переменной?
Примечательно то, что если выводить не указатель а саму переменную, вывод будет нормальный не смотря на то что он не const char, однако в случае с указателем как раз на это ссылается студия.
И главный вопрос. В чём конкретно я ошибся?
А зачем все это извращение?
А зачем все это извращение?
Хороший вопрос :D
Да вот хотел на шести переменных организовать весь плагин, перезаписывая их. Ну, интереса ради, получится ли такое сделать
BlackKnigga
09.04.2017, 11:41
Так юзай обычные, зачем указатели?
Dark_Knight
09.04.2017, 21:34
Хороший вопрос :D
Да вот хотел на шести переменных организовать весь плагин, перезаписывая их. Ну, интереса ради, получится ли такое сделать
Опиши задачу.
Опиши задачу.
Дело такое: решил попробовать написать плагин, который будет работать с памятью, которая не будет очищаться при каждом выходе из функции. Для этого я создал переменные и указатели на них.
Суть самого плагина: нужно при получении showDialog считать все его данные, а заодно вывести на экран чтобы убедиться что всё считало верно, и записало это всё дело в текстовый документ.
Но я не могу проверить валидность данных прямо в игре, т.к. addChatMessage не принимает в качестве строки разыменованный указатель.
BlackKnigga
09.04.2017, 22:17
Дело такое: решил попробовать написать плагин, который будет работать с памятью, которая не будет очищаться при каждом выходе из функции. Для этого я создал переменные и указатели на них.
Суть самого плагина: нужно при получении showDialog считать все его данные, а заодно вывести на экран чтобы убедиться что всё считало верно, и записало это всё дело в текстовый документ.
Но я не могу проверить валидность данных прямо в игре, т.к. addChatMessage не принимает в качестве строки разыменованный указатель.
Ну так зачем тебе указатели? Обычные глобальные юзай
Ну так зачем тебе указатели? Обычные глобальные юзай
научи так делать :D
BlackKnigga
10.04.2017, 15:41
научи так делать :D
Перед main объявляй переменные и будут они работать во всех функциях
который будет работать с памятью, которая не будет очищаться при каждом выходе из функции.
можешь еще обьявить перемненые как static
В параметре keys (не left/right || up/down) синхры onfoot отправляются эти коды клавиш?
MISTER_GONWIK
14.04.2017, 16:24
В параметре keys (не left/right || up/down) синхры onfoot отправляются эти коды клавиш?
гуглить запрещено наверно
https://sampwiki.blast.hk/wiki/Keys
Как реализовать xor из клео в c++?
В клео было очень удобно, переключать с 0 на 1 и т.д.
Гуглил, но куда не зайди, там xor не в роли логического переключателя - он сравнивает, и ничего больше не делает ._.
@I0000M (https://www.blast.hk/members/129413/)
C++:
kek
=
!
kek
;
BlackKnigga
14.04.2017, 21:03
Как реализовать xor из клео в c++?
В клео было очень удобно, переключать с 0 на 1 и т.д.
Гуглил, но куда не зайди, там xor не в роли логического переключателя - он сравнивает, и ничего больше не делает ._.
C++:
boolVar
=
!
boolVar
iAmerican
14.04.2017, 21:20
Вообщем есть DLL'ка, моя. Хочу написать софтину к ней , что бы можно было в компилированной DLL'ке менять. 2 переменных и строку одну. (Не во время того как она работает, а вообще.)
DLL'ка моя. Т.е. все сурсы от нее есть. Софтину думаю надо exe. Но впринципе и без разницы какого формата , главное что бы менять можно было.
Подскажите в какую сторону копать хотя бы.
@iAmerican (https://www.blast.hk/members/18641/), если не во время выполнения, то можно кое что сделать
Мб костыль, но ты можешь считать ее как массив байт и изменять нужные тебе, предварительно высчитав их адреса, после чего сохранять и инжектить уже измененную.
ну это ток при условии, что она не будет загружена во время изменения
Как сделать рендеренную сампфанксом текстуру кликабельной?
BlackKnigga
15.04.2017, 00:18
Как сделать рендеренную сампфанксом текстуру кликабельной?
По клику мыши проверять координаты курсора и если они в области текстуры - делать нужное действие.
По клику мыши проверять координаты курсора и если они в области текстуры - делать нужное действие.
Звучит как костыль. Х)
Спасибо.
NarutoUA
15.04.2017, 00:20
Звучит как костыль. Х)
Спасибо.
Это и есть правильное решение, а не костыль.
На этом скрине (https://www.blast.hk/redirect/aHR0cDovL2kxMi5waXhzLnJ1L3N0b3JhZ2UvMi83LzIvMTExMX BuZ185MTI5Mzc0XzI1ODk4MjcyLnBuZw) изображён лог RakLogger'а, и меня интересует каким образом сосчитать, сколько бит нужно пропустить в пакете, чтобы считать "LD_SPAC:white". Подсобите что ли, может формула какая есть
itsLegend
17.04.2017, 00:09
536 бит.
Слева (0040) указано смещение в шестнадцатеричной системе.
До "L" три символа => 43.
43 => 67 (десятичная)
67 * 8 = 536
Но это не применимо ко всем пакетам, особенно к тем у которых несколько строк. Там придется считать/читать данные полностью.
536 бит.
Слева (0040) указано смещение в шестнадцатеричной системе.
До "L" три символа => 43.
43 => 67 (десятичная)
67 * 8 = 536
Но это не применимо ко всем пакетам, особенно к тем у которых несколько строк. Там придется считать/читать данные полностью.
Спасибо, сохраню-ка я это.
А вот насчёт считывания всего пакета, я примерно так и думал, когда заметил что один и тот же рпц со строчкой иногда выдаёт разный размер данных, разброс битов примерно +-20
А можно как-то автоматизировать пропуск битов? Ну допустим изначально пройтись по стандартному оффсету, и пропускать результат через коллбек-функцию с заготовками возможного текста, и если нет совпадений - отступать по одному биту назад, повторая пока функция не найдёт ожидаемый результат, либо пока биты не кончатся.
Меня просто волнует такая ситуация, что это (как мне кажется) полностью сожрёт фпс, а то и игру крашнет, поскольку текстдравов приходит очень много, и каждый обрабатывать - весьма затратно по ресурсам, с учётом того что там банальный перебор, и сколько он времени займёт неизвестно никому
@I0000M
Не знаю, как можно реализовать то, что тебе нужно наиболее оптимальным способом, но касаемо твоей фразы про фпс - не надо параноить, комп работает гораздо быстрее, чем тебе кажется, а электроны "бегают" в полупроводниках в твоем процессоре со скоростью света, к тому же это не такое уж сложное вычисление
@I0000M
Не надо параноить, комп работает гораздо быстрее, чем тебе кажется, а электроны "бегают" в полупроводниках в твоем процессоре со скоростью света
Ну, представь что разброс будет стандартный - 20 бит, и придётся на эти 20 бит поочерёдно сместиться назад и каждый раз проверять больше 1к вариантов содержимого, и всё это пока пакет висит на "рекейве" ._.
Уверен что это не нагрузит сильно?
Спасибо, сохраню-ка я это.
А вот насчёт считывания всего пакета, я примерно так и думал, когда заметил что один и тот же рпц со строчкой иногда выдаёт разный размер данных, разброс битов примерно +-20
А можно как-то автоматизировать пропуск битов? Ну допустим изначально пройтись по стандартному оффсету, и пропускать результат через коллбек-функцию с заготовками возможного текста, и если нет совпадений - отступать по одному биту назад, повторая пока функция не найдёт ожидаемый результат, либо пока биты не кончатся.
Меня просто волнует такая ситуация, что это (как мне кажется) полностью сожрёт фпс, а то и игру крашнет, поскольку текстдравов приходит очень много, и каждый обрабатывать - весьма затратно по ресурсам, с учётом того что там банальный перебор, и сколько он времени займёт неизвестно никому
в сампе почти во всех пакетах перед самой строкой пишется её длина
в сампе почти во всех пакетах перед самой строкой пишется её длина
Так понимаю, это тип uint?
Попробую считать. Может получится.
Dark_Knight
18.04.2017, 17:04
Так понимаю, это тип uint?
Попробую считать. Может получится.
Иногда и байт может быть
Dark_Knight
21.04.2017, 12:14
Давай свой код. Ничего там не теряется.
Код:
[CODE]
char buffer[1024];
strcpy(buffer, "ТА ПІШОВ ТИ НАХУЙ");
std::string str(buffer);
std::cout
[QUOTE="Dark_Knight"]
Давай свой код. Ничего там не теряется.
Код:
[CODE]
char buffer[1024];
strcpy(buffer, "ТА ПІШОВ ТИ НАХУЙ");
std::string str(buffer);
std::cout
Dark_Knight
21.04.2017, 12:49
можно просто игнорировать тех, кто тебя чем-то раздражает, но конечно ты решишь что лучше показать свою нетерпимость. мудак
Я тебя попросил код, чтобы помочь. Написал код примера по приколу, а ты как маленькая девочка, все принял близко к сердцу. Так что давай свой код, который у тебя криво работает и будет разбираться.
Dark_Knight
21.04.2017, 23:50
Вообще, читаю РПЦ со строками не так. Так что я даже смотреть туда не буду.
Вот тебе рабочий вариант c ракнета.
https://github.com/P3ti/RakSAMP/blo...8803c14df486d48fe/client/src/netrpc.cpp#L1093 (https://github.com/P3ti/RakSAMP/blob/c5ddb3c79dbf974471bb5088803c14df486d48fe/client/src/netrpc.cpp#L1093)
Структура TEXT_DRAW_TRANSMIT
https://github.com/P3ti/RakSAMP/blob/c5ddb3c79dbf974471bb5088803c14df486d48fe/common/common.h#L203
В каком типе данных можно хранить цвет сообщений из чата?
MISTER_GONWIK
22.04.2017, 13:32
В каком типе данных можно хранить цвет сообщений из чата?
D3DCOLOR
D3DCOLOR
Блин, я не знал что это формат, прям удивил меня ._.
Спасибо!
MISTER_GONWIK
22.04.2017, 13:35
Блин, я не знал что это формат, прям удивил меня ._.
Спасибо!
какой формат? :scratch:
какой формат? :scratch:
Спецификатор типа -.-
Придираешься.
Немножко оффтоп, но всё же
Как в 13й студии включить показ времени, затраченного на сборку проекта?
И ещё. Как сделать так, чтобы выводило время, затраченное на выполнение коллбека? (ну, тип, начался отсчёт как он начнёт работать, и по возврату выдало время)
p.s. Гоголь не особо прошарен, всякая всячина по студии вылезла, но конкретно моего вопроса не выдало
BlackKnigga
22.04.2017, 14:09
Немножко оффтоп, но всё же
Как в 13й студии включить показ времени, затраченного на сборку проекта?
p.s. Гоголь не особо прошарен, всякая всячина по студии вылезла, но конкретно моего вопроса не выдало
Tools -> Options -> Projects and Solutions -> VC++ Project Settings -> Build Timing
Нашел в гугле с первого запроса. Проверяй
Tools -> Options -> Projects and Solutions -> VC++ Project Settings -> Build Timing
Нашел в гугле с первого запроса. Проверяй
Верю на слово, я же не чекаю каждую страницу, а читаю превьюхи
Пытаюсь сделать хук на входящие сообщения, проблема старая - не могу нормально считать строки. Думал проблема в том что буффер значительно больше строки, решил вычесть отступ в два байта (согласно логу рэклоггера) из общего размера пакета, чтобы получить размер строки, которая там будет находиться (ею кончается пакет, как я понял)
Но мне не разрешает выставлять переменную в качестве размера другой переменной.
Если же поставить как раньше - размер в 144 байта, будет выводиться пустая строка в чат
Сил уже нет никаких с этими строками воевать, скажите что я не так делаю-то, фыр
C++:
bool
CALLBACK
irpc
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
101
)
{
params
->
bitStream
->
ResetReadPointer
(
)
;
int
qwe
=
params
->
bitStream
->
GetNumberOfBitsUsed
(
)
;
int
qq
=
(
qwe
-
16
)
;
params
->
bitStream
->
IgnoreBits
(
16
)
;
int
ww
=
BITS_TO_BYTES
(
qq
)
;
char
ttt
[
ww
]
;
params
->
bitStream
->
Read
(
ttt
)
;
std
::
string
str
(
ttt
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
555555
,
"%s"
,
ttt
)
;
//byte packId;
//params->bitStream->Read(packId);
//D3DCOLOR color;
//params->bitStream->Read(color);
}
return
true
;
}
MISTER_GONWIK
22.04.2017, 15:10
Пытаюсь сделать хук на входящие сообщения, проблема старая - не могу нормально считать строки. Думал проблема в том что буффер значительно больше строки, решил вычесть отступ в два байта (согласно логу рэклоггера) из общего размера пакета, чтобы получить размер строки, которая там будет находиться (ею кончается пакет, как я понял)
Но мне не разрешает выставлять переменную в качестве размера другой переменной.
Если же поставить как раньше - размер в 144 байта, будет выводиться пустая строка в чат
Сил уже нет никаких с этими строками воевать, скажите что я не так делаю-то, фыр
C++:
bool
CALLBACK
irpc
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
101
)
{
params
->
bitStream
->
ResetReadPointer
(
)
;
int
qwe
=
params
->
bitStream
->
GetNumberOfBitsUsed
(
)
;
int
qq
=
(
qwe
-
16
)
;
params
->
bitStream
->
IgnoreBits
(
16
)
;
int
ww
=
BITS_TO_BYTES
(
qq
)
;
char
ttt
[
ww
]
;
params
->
bitStream
->
Read
(
ttt
)
;
std
::
string
str
(
ttt
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
555555
,
"%s"
,
ttt
)
;
//byte packId;
//params->bitStream->Read(packId);
//D3DCOLOR color;
//params->bitStream->Read(color);
}
return
true
;
}
C++:
D3DCOLOR color
=
-
1
;
int
length
=
0
;
char
message
[
256
]
{
0
}
;
param
->
bitStream
->
Read
(
color
)
;
param
->
bitStream
->
Read
(
length
)
;
param
->
bitStream
->
Read
(
message
,
length
)
;
C++:
D3DCOLOR color
=
-
1
;
int
length
=
0
;
char
message
[
256
]
{
0
}
;
param
->
bitStream
->
Read
(
color
)
;
param
->
bitStream
->
Read
(
length
)
;
param
->
bitStream
->
Read
(
message
,
length
)
;
Ну, согласно логгеру, там негде поместиться цвету и длине, серьёзно
Вот так выглядит лог сообщения в чат, когда я отправляю единицу:
Код:
[13:52:27.700] > [RPC Recv] RPC_Chat[101](length: 4 bytes, 32 bits)
> dump:
0000 00 00 01 31 ...1
Или первые два байта это цвет, а третий - длина?
Ответь пожалуйста, очень важно, я хочу наконец разобраться в теме
Dark_Knight
22.04.2017, 15:21
Пытаюсь сделать хук на входящие сообщения, проблема старая - не могу нормально считать строки. Думал проблема в том что буффер значительно больше строки, решил вычесть отступ в два байта (согласно логу рэклоггера) из общего размера пакета, чтобы получить размер строки, которая там будет находиться (ею кончается пакет, как я понял)
Но мне не разрешает выставлять переменную в качестве размера другой переменной.
Если же поставить как раньше - размер в 144 байта, будет выводиться пустая строка в чат
Сил уже нет никаких с этими строками воевать, скажите что я не так делаю-то, фыр
C++:
bool
CALLBACK
irpc
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
101
)
{
params
->
bitStream
->
ResetReadPointer
(
)
;
int
qwe
=
params
->
bitStream
->
GetNumberOfBitsUsed
(
)
;
int
qq
=
(
qwe
-
16
)
;
params
->
bitStream
->
IgnoreBits
(
16
)
;
int
ww
=
BITS_TO_BYTES
(
qq
)
;
char
ttt
[
ww
]
;
params
->
bitStream
->
Read
(
ttt
)
;
std
::
string
str
(
ttt
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
555555
,
"%s"
,
ttt
)
;
//byte packId;
//params->bitStream->Read(packId);
//D3DCOLOR color;
//params->bitStream->Read(color);
}
return
true
;
}
Первое. Не надо юзать иды при чтении РПЦ. Большинство просто не помнят все иды на изусть и не удобно так читать. Юзай значение с eNum.
Второе. Код вообще не правильный. Если irpc это входящие РПЦ, то если мне память не изменяет, то он только исходящий, но может быть и входящим тоже. Прочекаешь
Третье. Вот тебе страница со структурами РПЦ. https://docs.google.com/spreadsheets/d/1iIxEk7yR8r7ZLGiSAL4ndtz_N1k0p3Wt7TE5bei6ztU/edit#gid=1 (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2 QvMWlJeEVrN3lSOHI3WkxHaVNBTDRuZHR6X04xazBwM1d0N1RF NWJlaTZ6dFUvZWRpdCNnaWQ9MQ)
Четвертое. Вот тебе рабочий код и пример как вообще строки надо читать.
Код:
if (params->packetId == RPCEnumeration::RPC_ServerCommand) {
DWORD len;
char command[256];
BitStream *bs = params->bitStream;
bs->ResetReadPointer();
bs->Read(len);
bs->Read(command, len);
command[len] = '\0';
}
MISTER_GONWIK
22.04.2017, 15:23
Ну, согласно логгеру, там негде поместиться цвету и длине, серьёзно
Вот так выглядит лог сообщения в чат, когда я отправляю единицу:
Код:
[13:52:27.700] > [RPC Recv] RPC_Chat[101](length: 4 bytes, 32 bits)
> dump:
0000 00 00 01 31 ...1
Или первые два байта это цвет, а третий - длина?
Ответь пожалуйста, очень важно, я хочу наконец разобраться в теме
ты чёт какой-то левый рпс ловишь, так-то над эт:
C++:
if
(
param
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
// id: 93
{
.
.
}
p.s. возможно у тебя старый раклоггер
Второе. Код вообще не правильный. Если irpc это входящие РПЦ, то если мне память не изменяет, то он только исходящий, но может быть и входящим тоже. Прочекаешь
В собейтовом .ini смотрел, он там одновременно и входящий и исходящий, ид и название идентичны
За справочку и пример огромное спасибо.
p.s. возможно у тебя старый раклоггер
отсюда логгер качал, тот что для 0.3.7
Dark_Knight
22.04.2017, 15:26
ты чёт какой-то левый рпс ловишь, так-то над эт:
p.s. возможно у тебя старый раклоггер
Если он ловит входящие сообщения от сервера, то РПЦ не правильный. Если только сообщения, которые он отправил в чат без команды, то верный ид. Для исходящих команд другой РПЦ.
MISTER_GONWIK
22.04.2017, 15:26
и на будущее,
C++:
.
.
->
ResetReadPointer
(
)
;
уже не нужно использовать
Если он ловит входящие сообщения от сервера, то РПЦ не правильный. Если только сообщения, которые он отправил в чат без команды, то верный ид. Для исходящих команд другой РПЦ.
если чё, то
https://puu.sh/vsqRR/81b81a276c.png
именно
C++:
RPC_ScrClientMessage
нужен для этого
Dark_Knight
22.04.2017, 15:28
и на будущее,
C++:
.
.
->
ResetReadPointer
(
)
;
уже не нужно использовать
Хз. Я привык юзать на всякий пожарный. Хотя надо в СФ глянуть как оно там)
MISTER_GONWIK
22.04.2017, 15:29
Хз. Я привык юзать на всякий пожарный. Хотя надо в СФ глянуть как оно там)
в сфе это уже давно исправлено, он сам сбивает
У меня вопрос. Таким образом я могу преобразовать чар в строку для одной конкретной функции, чтобы не выделять переменную?
Если нет, то что я делаю таким образом?
SF->getSAMP()->getChat()->AddChatMessage(555555, "%s", string(command))
MISTER_GONWIK
23.04.2017, 13:51
У меня вопрос. Таким образом я могу преобразовать чар в строку для одной конкретной функции, чтобы не выделять переменную?
Если нет, то что я делаю таким образом?
SF->getSAMP()->getChat()->AddChatMessage(555555, "%s", string(command))
C++:
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
555555
,
"%s"
,
string
(
command
)
.
c_str
(
)
)
В уроке по рендеру через SF API показывали работу с рендером directX (как я понял), и у меня вот вопрос возник: это для какой версии dx?
И ещё. Если я разберусь в сдк, например, 12-го dx, смогу ли я через SF рендерить на нём, используя его SDK?
MISTER_GONWIK
26.04.2017, 13:47
В уроке по рендеру через SF API показывали работу с рендером directX (как я понял), и у меня вот вопрос возник: это для какой версии dx?
И ещё. Если я разберусь в сдк, например, 12-го dx, смогу ли я через SF рендерить на нём, используя его SDK?
directx 9, нет
Как создать поток, если необходимый для CWinThread header просто ломает код и создаёт ошибки, а std:thread не хочет работать, аргументируя тем, что "thread не является членом std"?
itsLegend
26.04.2017, 21:29
#include
Dark_Knight
26.04.2017, 22:27
Как создать поток, если необходимый для CWinThread header просто ломает код и создаёт ошибки, а std:thread не хочет работать, аргументируя тем, что "thread не является членом std"?
Только, если тебе нужно в потоке менять данные которые ты передаешь, то надо передавать ссылки через std::ref.
C++:
ofstream
fout
(
"yiffme"
,
ios
::
app
)
;
Объявить это дело глобально при помощи extern не удаётся, в связи с чем вопрос: каким образом объявить fout внутри функции глобальной переменной?
Dark_Knight
27.04.2017, 14:56
Создавай указатель.
Создавай указатель.
C++:
extern
int
*
ptr
=
&
fout
;
выдаёт
Код:
1>main.cpp(53): error C2205: ptr: невозможно инициализировать внешние переменные с областью видимости блока
Последние три слова мне вообще ничего не говорят ._.
гугл тоже не смог мне помочь. Всё плохо.
Dark_Knight
27.04.2017, 15:32
Не так надо.
Пример
C:
в main
.
h
extern
int
*
ptr
;
в main
.
cpp
int
*
ptr
=
nullptr
;
void
main
(
)
{
if
(
!
ptr
)
ptr
=
new
int
;
}
BlackKnigga
27.04.2017, 15:42
У меня такой штуки в "решении" нету. Её создать надо?
Да, и включить в main.cpp
в main.cpp:
C++:
int
*
ptr
=
nullptr
;
в main.h:
C++:
extern
int
*
ptr
;
В void callback mainloop:
C++:
*
ptr
=
&
fout
;
Ошибка:
Код:
error C2440: =: невозможно преобразовать "std::ofstream *" в "int"
BlackKnigga
27.04.2017, 16:01
в main.cpp:
C++:
int
*
ptr
=
nullptr
;
в main.h:
C++:
extern
int
*
ptr
;
В void callback mainloop:
C++:
*
ptr
=
&
fout
;
Ошибка:
Код:
error C2440: =: невозможно преобразовать "std::ofstream *" в "int"
Так ты объявляй ofstream, а не int
Так ты объявляй ofstream, а не int
main.h
Код:
extern ofstream *ptr;
main.cpp
C++:
ofstream
*
ptr
=
nullptr
;
void callback mainloop
C++:
*
ptr
=
&
fout
;
ошибки:
Код:
1>main.cpp(17): error C2371: ptr: переопределение; различные базовые типы
1> c:\users\snezh\documents\visual studio 2013\projects\aa\sfplugin\qwe\main.h(1): см. объявление "ptr"
1>main.cpp(53): error C2440: =: невозможно преобразовать "std::ofstream *" в "int"
1> Не существует контекста, в котором такое преобразование возможно
1>
MISTER_GONWIK
27.04.2017, 16:18
C++:
ofstream
fout
(
"yiffme"
,
ios
::
app
)
;
Объявить это дело глобально при помощи extern не удаётся, в связи с чем вопрос: каким образом объявить fout внутри функции глобальной переменной?
C++:
// main.cpp
ofstream
fout
(
"yiffme"
,
ios
::
app
)
;
// main.h
extern
ofstream fout
;
невозможно преобразовать "std::ofstream *" в "int"
int a = reinterpret_cast(&fout);
int a = reinterpret_cast(&fout);
Это ведь можно использовать как сам fout, ссылаясь на него? Так примерно:
*a
Dark_Knight
27.04.2017, 17:17
Какая у тебя задача вообще ? А то щас настроеш код из говна и палок и потом хер разберешься почему у тебя крашит.
Какая у тебя задача вообще ? А то щас настроеш код из говна и палок и потом хер разберешься почему у тебя крашит.
Отлично сказано.
Да вот я хотел поставить условие на проверку существования файла для логов, и открывать файл создавая указатель для записи, в зависимости от его наличия - есть файл, пишем с конца . Нет файла - создаём заново. Вот. И поскольку заполнение лога идёт через хук, мне требуется создать указатель на файл, (fout) в mainloop, чтобы он был доступен коллбеку irpc, вот код если не понятно:
C++:
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
#include "SFAPI\SFRakNet.h"
#include
#include
#include
#include
#include
#include "qwe\main.h"
#pragma comment(lib, "shlwapi.lib")
using
namespace
std
;
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
int
*
a
=
nullptr
;
bool
CALLBACK
irpc
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
// id: 93 thanks for MISTER_GONWIK
{
D3DCOLOR color
=
-
1
;
int
length
=
0
;
char
message
[
144
]
{
0
}
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
length
)
;
params
->
bitStream
->
Read
(
message
,
length
)
;
//sss[len] = '\0';
if
(
strcmp
(
string
(
message
)
.
c_str
(
)
,
" "
)
==
0
)
return
false
;
else
{
//SF->getSAMP()->getChat()->AddChatMessage(555555, "%s", string(message).c_str());
//fout
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
init
=
true
;
char
meow
[
MAX_PATH
]
;
GetCurrentDirectory
(
sizeof
(
meow
)
,
meow
)
;
if
(
PathFileExists
(
strcat
(
meow
,
"/yiffme"
)
)
)
{
ofstream
fout
(
"yiffme"
,
ios
::
app
)
;
*
a
=
reinterpret_cast
(
&
fout
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
555555
,
"file exist"
)
;
}
else
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
555555
,
"file doesnt exist"
)
;
fout
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
irpc
)
;
}
}
MISTER_GONWIK
27.04.2017, 19:21
Отлично сказано.
Да вот я хотел поставить условие на проверку существования файла для логов, и открывать файл создавая указатель для записи, в зависимости от его наличия - есть файл, пишем с конца . Нет файла - создаём заново. Вот. И поскольку заполнение лога идёт через хук, мне требуется создать указатель на файл, (fout) в mainloop, чтобы он был доступен коллбеку irpc, вот код если не понятно:
C++:
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
#include "SFAPI\SFRakNet.h"
#include
#include
#include
#include
#include
#include "qwe\main.h"
#pragma comment(lib, "shlwapi.lib")
using
namespace
std
;
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
int
*
a
=
nullptr
;
bool
CALLBACK
irpc
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
// id: 93 thanks for MISTER_GONWIK
{
D3DCOLOR color
=
-
1
;
int
length
=
0
;
char
message
[
144
]
{
0
}
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
length
)
;
params
->
bitStream
->
Read
(
message
,
length
)
;
//sss[len] = '\0';
if
(
strcmp
(
string
(
message
)
.
c_str
(
)
,
" "
)
==
0
)
return
false
;
else
{
//SF->getSAMP()->getChat()->AddChatMessage(555555, "%s", string(message).c_str());
//fout
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
init
=
true
;
char
meow
[
MAX_PATH
]
;
GetCurrentDirectory
(
sizeof
(
meow
)
,
meow
)
;
if
(
PathFileExists
(
strcat
(
meow
,
"/yiffme"
)
)
)
{
ofstream
fout
(
"yiffme"
,
ios
::
app
)
;
*
a
=
reinterpret_cast
(
&
fout
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
555555
,
"file exist"
)
;
}
else
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
555555
,
"file doesnt exist"
)
;
fout
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
irpc
)
;
}
}
Это лишь пример накидал, но не пользуйся такими дерьмовыми функциями как:
C++:
GetCurrentDirectory
(
.
.
)
,
PathFileExists
(
.
.
)
и т
.
д
.
займись изучением чего-то более классного и функционального
C++:
[CODE]
// после всех инклудов
#include
namespace
fs
=
std
::
experimental
::
filesystem
;
// самой первой функцией
std
::
ofstream
&
log
(
)
{
static
std
::
ofstream logFile
;
if
(
logFile
.
is_open
(
)
==
false
)
{
fs
::
path workDirectoryPath
=
fs
::
current_path
(
)
/
"SAMPFUNCS"
/
"Meow"
;
if
(
!
fs
::
exists
(
workDirectoryPath
)
)
fs
::
create_directories
(
workDirectoryPath
)
;
fs
::
path logFilePath
=
workDirectoryPath
/
"yiffme.fr"
;
bool
fileExists
=
fs
::
exists
(
logFilePath
)
;
logFile
.
open
(
logFilePath
.
string
(
)
,
std
::
ios
::
app
)
;
if
(
fileExists
==
true
)
logFile
ну и mainloop в твоём случае должен выглядеть вот так:
C++:
[CODE]
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
incomingRPC
)
;
log
(
)
а irpc
C++:
[CODE]
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
// id: 93 thanks for MISTER_GONWIK
{
D3DCOLOR color
=
-
1
;
int
length
=
0
;
char
message
[
144
]
{
0
}
;
params
->
bitStream
->
Read
(
color
)
;
params
->
bitStream
->
Read
(
length
)
;
params
->
bitStream
->
Read
(
message
,
length
)
;
if
(
!
strcmp
(
message
,
" "
)
)
return
false
;
log
(
)
Запустил через RakSAMP три бота на advance. Примерно через 10 минут двух ботов телепортировал к себе администратор, а ещё через минуту забанил всех трех за использование "песочницы".
Как он определил, что я использую "песочницу"? Скорее всего посмотрел, что одинаковые ip, но как тогда можно обмануть админов? Можно сделать, чтобы боты двигались, но администратор может телепортировать в любую точку и бот тупо может забежать в стену.
MISTER_GONWIK
28.04.2017, 09:26
Запустил через RakSAMP три бота на advance. Примерно через 10 минут двух ботов телепортировал к себе администратор, а ещё через минуту забанил всех трех за использование "песочницы".
Как он определил, что я использую "песочницу"? Скорее всего посмотрел, что одинаковые ip, но как тогда можно обмануть админов? Можно сделать, чтобы боты двигались, но администратор может телепортировать в любую точку и бот тупо может забежать в стену.
проще сказать, что никак.
проще сказать, что никак.
А если не проще? Я не ищу легких путей.
MISTER_GONWIK
28.04.2017, 10:08
А если не проще? Я не ищу легких путей.
для тебя это невозможно, хочешь чтоб бот бегал как человек, пиши систему путей, но учти, у тебя нет никакой карты коллизии
для тебя это невозможно, хочешь чтоб бот бегал как человек, пиши систему путей, но учти, у тебя нет никакой карты коллизии
Такая система мне нужна в случае, если админ уже телепортировал меня. А что если просто не доходить до этого? Скорее всего он вычисляет меня по ip (если есть ещё варианты, скажи), значит если будут разные ip, то все будет нормально. Разные ip можно получить используя прокси, но я не знаю, поддерживает ли RakSAMP или хотя бы RakNet прокси.
MISTER_GONWIK
28.04.2017, 10:44
Такая система мне нужна в случае, если админ уже телепортировал меня. А что если просто не доходить до этого? Скорее всего он вычисляет меня по ip (если есть ещё варианты, скажи), значит если будут разные ip, то все будет нормально. Разные ip можно получить используя прокси, но я не знаю, поддерживает ли RakSAMP или хотя бы RakNet прокси.
1. обычный раксамп не поддерживает работу через прокси, но сделать можно, как это сделать, думай сам.
2. я не админ на сервере, так что могут сказать лишь предположительно, что есть команда, по которой отображаются текущие онлайн аккаунты с одного ип (как ты и подумал), для раксампа нужны прокси UDP, их ты не найдёшь, только если с помощью программ hotspot shield и прочих.
3. сомневаюсь что всё это спасёт тебя от банов, ведь они всё равно палятся (я про ботов)
ведь они всё равно палятся
Как они палятся? Я могу заставить бота бегать между точками, с анимацией бега, его все равно спалят?
GetCurrentDirectory(..), PathFileExists(..)
А чем плохи конкретно эти функции?
займись изучением чего-то более классного и функционального
Я делаю так, как в клео привык - составляю на бумажке примерный "план" проекта, расписывая все нужные функции, а затем разбиваю эти функции на другие функции, без которых предыдущие реализовать не получится, и просто ввожу желаемые действия функций в поиск, не забывая указывать site:microsoft.com. Так я и нахожу нужные функции, а насколько они хороши мне судить как-то рановато, мне ведь даже не каждую из них применить-то удаётся, сам толком ничего не умею Х)
Но конечно спасибо за совет, расширять кругозор точно не будет лишним
MISTER_GONWIK
28.04.2017, 13:13
А чем плохи конкретно эти функции?
Я делаю так, как в клео привык - составляю на бумажке примерный "план" проекта, расписывая все нужные функции, а затем разбиваю эти функции на другие функции, без которых предыдущие реализовать не получится, и просто ввожу желаемые действия функций в поиск, не забывая указывать site:microsoft.com. Так я и нахожу нужные функции, а насколько они хороши мне судить как-то рановато, мне ведь даже не каждую из них применить-то удаётся, сам толком ничего не умею Х)
Но конечно спасибо за совет, расширять кругозор точно не будет лишним
они устарели, я б сказал, что они больше С, а то что я скинул - С++
у std:: очень хороший функционал, изучай его
MISTER_GONWIK
28.04.2017, 13:19
Как они палятся? Я могу заставить бота бегать между точками, с анимацией бега, его все равно спалят?
ответ очень прост, боты не способны действовать как люди, их действия повторяются, они очень примитивные и т.д.
они устарели, я б сказал, что они больше С, а то что я скинул - С++
у std:: очень хороший функционал, изучай его
Немного оффтопа.
Слыхал я, си в разработке игр популярен, и тесно связан с ассемблером. Это правда?
#include
namespace fs = std::experimental::filesystem;
вот такую ошибку выдаёт:
1>main.cpp(17): error C3083: experimental: символ слева от "::" должен представлять тип
1>main.cpp(17): error C2039: filesystem: не является членом "std"
1>main.cpp(17): error C2878: filesystem: пространство имен или класс с таким именем не существует
Немного оффтопа.
Слыхал я, си в разработке игр популярен, и тесно связан с ассемблером. Это правда?
тесно связан с ассемблером - да. но в разработке игр чистый си очень не популярен, в разработке игр очень популярен c++. если не считать всякую early access ***ню в стиме и инди игры, то большинство написано именно на c++.
вот такую ошибку выдаёт:
1>main.cpp(17): error C3083: experimental: символ слева от "::" должен представлять тип
1>main.cpp(17): error C2039: filesystem: не является членом "std"
1>main.cpp(17): error C2878: filesystem: пространство имен или класс с таким именем не существует
filesystem появился в VS 2015.
iAmerican
29.04.2017, 23:09
Что гуглить что бы узнать об..
Например в SF->Log()
Можно делать так SF->Log("Текст")
А можно и так SF->Log("%s",string)
Как это реализуется ?
Смотрел в собейтике , но чё то там непонятно как то.
DarkP1xel
29.04.2017, 23:55
Это переменное число параметров для функции. Подробнее: http://www.c-cpp.ru/content/vastart-vaend-vaarg (https://www.blast.hk/redirect/aHR0cDovL3d3dy5jLWNwcC5ydS9jb250ZW50L3Zhc3RhcnQtdm FlbmQtdmFhcmc)
Можно как-нибудь сделать так, чтобы когда что-то попытается сделать запись по определённому адресу, предотвратить эту запись и обработать, и уже потом либо "разрешить" (просто сделать то, что что-то хотело), либо забыть и ничего не записывать? (да, это я пытаюсь хук придумать)
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot