Просмотр полной версии : С/С++ Вопрос - Ответ
Можно как-нибудь сделать так, чтобы когда что-то попытается сделать запись по определённому адресу, предотвратить эту запись и обработать, и уже потом либо "разрешить" (просто сделать то, что что-то хотело), либо забыть и ничего не записывать? (да, это я пытаюсь хук придумать)
ставить хуки на обращения к этому участку памяти. единственная альтернатива этому - использовать отладочные средства, что крайне нежелательно.
NarutoUA
01.05.2017, 20:38
Ставить защиту на запись и ловить исключения, еще дополнительно хук на VirtualProtect и ловить там адреса.
Чем отличается 12-ти битная и 16-ти битная матрицы, и зачем существует вторая? (первая похожа на простую координатную систему, вроде всё понятно)
C++:
struct
RwV3d
{
// 12-byte
float
x
,
y
,
z
;
}
;
C++:
}
;
struct
RwMatrix
{
// 16-byte padded
RwV3d right
;
// 0
unsigned
int
flags
;
// 12
RwV3d up
;
// 16
unsigned
int
pad1
;
// 28
RwV3d at
;
// 32
unsigned
int
pad2
;
// 44
RwV3d pos
;
// 48
unsigned
int
pad3
;
// 60
}
;
1. Как создать функцию подмены пакета в программе с помощью чекбокса?
P.S Я хочу создать чит на браузерную игру. Коды я достал из WPE PRO, хочу перенести на свою программу - как это сделать?
16-ти битная матрицы, и зачем существует вторая?
https://ru.wikipedia.org/wiki/Кватернион (https://www.blast.hk/redirect/aHR0cHM6Ly9ydS53aWtpcGVkaWEub3JnL3dpa2kvJUQwJTlBJU QwJUIyJUQwJUIwJUQxJTgyJUQwJUI1JUQxJTgwJUQwJUJEJUQw JUI4JUQwJUJFJUQwJUJE)
Что в этой функции подразумевается под "iResourceID"? (первый аргумент, второй - цвет)
C++:
SF
->
getRender
(
)
->
LoadTextureFromResource
(
)
И нужно ли указывать какое-то существующее значение, или это только для нумерации и можно ввести своё?
itsLegend
07.05.2017, 00:56
iResourceID - ид ресурса, который уже находится в проекте.
Оригинальное название функции - D3DXCreateTextureFromResource(), по нему поищи примеры в гугле.
iResourceID - ид ресурса, который уже находится в проекте.
Оригинальное название функции - D3DXCreateTextureFromResource(), по нему поищи примеры в гугле.
то-есть это не файл самой гта са, он не ограничен ресурсами игры?
itsLegend
07.05.2017, 00:59
Не ограничен.
https://msdn.microsoft.com/ru-ru/library/7zxb70x7.aspx (https://www.blast.hk/redirect/aHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vcnUtcnUvbGlicm FyeS83enhiNzB4Ny5hc3B4)
Что делает данная функция?
SF->getRender()->TexCoord(float x, float y)
MISTER_GONWIK
07.05.2017, 11:55
Что делает данная функция?
SF->getRender()->TexCoord(float x, float y)
устанавливает текстуре позицию
устанавливает текстуре позицию
на экране?
Можно как-нибудь одновременно и выдать return в колбеке, и вызвать из него же другую функцию? (без ретарна виснет)
MISTER_GONWIK
08.05.2017, 00:05
Можно как-нибудь одновременно и выдать return в колбеке, и вызвать из него же другую функцию? (без ретарна виснет)
почему бы не вызывать функцию и после return?
Rony1337
08.05.2017, 01:12
Как прямо на лету подменить OpcodeHandler, и заинжектить свой "scm" без CLEO?
DarkP1xel
08.05.2017, 01:39
Как
если задаешь такие вопросы значит сам прекрасно должен знать ответ
хукай
почему бы не вызывать функцию и после return?
Допустим я поставлю вызов после ретарна, разве возврат не завершает работу колбека?
BlackKnigga
08.05.2017, 02:45
Допустим я поставлю вызов после ретарна, разве возврат не завершает работу колбека?
Завершает. Он имел ввиду поставить вызов после вызова функции из которой return'ишься.
C++:
bool
meow
=
false
;
C++:
while
(
meow
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
555555
,
" "
)
;
}
Почему от такого условия крашит плагин?
в клео такое работало, там оно работало как while meow==1
iAmerican
09.05.2017, 13:22
C++:
bool
meow
=
false
;
C++:
while
(
meow
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
555555
,
" "
)
;
}
Почему от такого условия крашит плагин?
в клео такое работало, там оно работало как while meow==1
sf не любит while . for используй.
либо поток отдельный создавай. Для while
sf не любит while . for используй.
либо поток отдельный создавай. Для while
да вот дело в том, что функция в которой должен быть цикл запускается как раз в отдельном потоке ._.
Dark_Knight
09.05.2017, 13:48
Вайл замени на иф и будет тебе оно нормально работать в mainloop'e. Я же тебе вчера пример давал.
Rony1337
09.05.2017, 15:28
Щас бы 2 цикла запустить, без sleep() и жаловатся почему оно жрёт 99% CPU и крашится.
К тому же наверняка перед отправкой сообщений в сампе есть какой то буфер сообщений, которые еще в очереди на отправку серверу, он просто напросто переполняется и поэтому крашится.
DarkP1xel
09.05.2017, 15:58
Почему от такого условия крашит плагин?
не знаю что у тебя там крашится, но цикл не сделает даже одной итерации
sf не любит while
чо
не знаю что у тебя там крашится, но цикл не сделает даже одной итерации
чо
Почему не сделает, не подскажешь?
DarkP1xel
09.05.2017, 16:02
Почему не сделает, не подскажешь?
потому что условие цикла изначально ложно (false)
Rony1337
09.05.2017, 16:02
Почему не сделает, не подскажешь?
потому что у тебя булево в false, мозг включи
потому что условие цикла изначально ложно (false)
Ой :D
Я просто забыл указать колбек, который её переключает:
C++:
void
CALLBACK
qwe
(
std
::
string params
)
{
meow
=
!
meow
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
555555
,
"%d"
,
meow
)
;
std
::
thread
qwe
(
qqqwe
)
;
qwe
.
join
(
)
;
return
;
}
Вот только почему-то, не смотря на то что цикл в отдельном потоке, всё равно крашит при попытке его завести,, без цикла же итерация проходит нормально
Нет предположений, в чём ошибся?
DarkP1xel
09.05.2017, 16:07
не юзай потоки, лучше SetTimer заюзай
Rony1337
09.05.2017, 16:09
не юзай потоки, лучше SetTimer заюзай
А если ему синхронно надо?
itsLegend
09.05.2017, 16:19
qwe.join();
qwe.detach();
Где можно глянуть стили для шрифтов создаваемых функой ниже?
C++:
pFont
=
SF
->
getRender
(
)
->
CreateNewFont
(
"Tahoma"
,
12
,
FCR_BORDER
)
;
BlackKnigga
14.05.2017, 22:44
Где можно глянуть стили для шрифтов создаваемых функой ниже?
C++:
pFont
=
SF
->
getRender
(
)
->
CreateNewFont
(
"Tahoma"
,
12
,
FCR_BORDER
)
;
https://www.blast.hk/wiki/tutorials:sf_render
Как добавить в строку цифры?
Пробовал как в клео (0C15: strcat destination 5@ source 3@)
C++:
strcat
(
sstring
,
last
)
;
Но мне выдаёт, что так нельзя, инт не является константой чар, и совмещать отказывается ._.
itsLegend
15.05.2017, 00:38
Так в чём проблема? int в char с помощью любой функции, которое предоставляет такой функционал и используешь strcat.
А можно ещё заюзать класс string и сделать такое:
C++:
std
::
string mystr
=
"test"
;
mystr
+=
std
::
to_string
(
2360
)
;
Так в чём проблема? int в char с помощью любой функции, которое предоставляет такой функционал и используешь strcat.
А можно ещё заюзать класс string и сделать такое:
C++:
std
::
string mystr
=
"test"
;
mystr
+=
std
::
to_string
(
2360
)
;
немножечко не то, я не так выразился. У меня "строка" - это char, я его преобразую конкретно в строку уже в конце, а вот сейчас мне надо инт уместить в чар-строку (не знаю как правильно называется, не кусайся пожалуйста)
и кстати твой вариант выдаёт ошибку, отсутствует оператор "+=" сооветствующий операндам char[144] std::to_string
itsLegend
15.05.2017, 00:42
Ну раз ты всё таки используешь хейдер string, то можешь заюзать ту же функцию std::to_string и выполнить .c_str()
Колхоз, но и твои намерения тоже мне не понятны.
Ну раз ты всё таки используешь хейдер string, то можешь заюзать ту же функцию std::to_string и выполнить .c_str()
Колхоз, но и твои намерения тоже мне не понятны.
я строчку для рендера sf готовлю, хотел как в клео просто выделить память и накидать туда в перемешку строк и цифр, а потом уже рендерить. вот
C++:
using
namespace
std
;
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
stFontInfo
*
pFont
;
bool
meow
=
false
;
char
sstring
[
144
]
;
C++:
bool
CALLBACK
oPack
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
207
)
{
params
->
bitStream
->
IgnoreBits
(
449
)
;
int
last
;
memset
(
sstring
,
0
,
sizeof
(
sstring
)
)
;
sstring
+=
std
::
to_string
(
last
)
;
//strcat(sstring, );
//strcat(sstring,last
SF
->
getRender
(
)
->
registerD3DCallback
(
eDirect3DDeviceMethods
::
D3DMETHOD_PRESENT
,
Present
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
555555
,
"%d"
,
meow
)
;
return
true
;
}
return
true
;
}
itsLegend
15.05.2017, 00:52
Колбэк регистрируется 1 раз. Ты его регаешь точно не 1 раз.
Насчет строки:
C++:
strcat
(
sstring
,
std
::
to_string
(
last
)
.
c_str
(
)
)
;
Колбэк регистрируется 1 раз. Ты его регаешь точно не 1 раз.
Насчет строки:
C++:
strcat
(
sstring
,
std
::
to_string
(
last
)
.
c_str
(
)
)
;
а как тогда сделать, чтоб текст рисовался заново при каждом срабатывании ракнет колбека?
itsLegend
15.05.2017, 01:00
Ну ты же не зря используешь переменную meow
Я пробовал дайрект иксов колбек поставить в отдельный поток, кстати, но мне выдало ошибку.
пробовал вызывать колбек дайрект икса как обычную функу, но мне писало "мало аргументов", а я не знаю как их заполнять
Другой идеи не пришло
Я пробовал дайрект иксов колбек поставить в отдельный поток, кстати, но мне выдало ошибку.
пробовал вызывать колбек дайрект икса как обычную функу, но мне писало "мало аргументов", а я не знаю как их заполнять
Другой идеи не пришло
а уроки на вики читать пробовал?
itsLegend
15.05.2017, 01:10
После загрузки плагина, один раз и никогда больше. Колбэк будет вызываться каждый раз при обновлении фрейма.
А вообще: tutorials:api_lesson_render (https://www.blast.hk/wiki/tutorials:api_lesson_render)
NarutoUA
15.05.2017, 01:10
Зачем? Я лучше сначала задам свои тупые вопросы на форуме.
а уроки на вики читать пробовал?
Го сигналы и слоты как в Qt, вместо коллбеков?
Го сигналы и слоты как в Qt, вместо коллбеков?
зачем? чтобы бедолаги вообще ничего не понимали?
а уроки на вики читать пробовал?
да сделал бы я даже это, не читая уроки?
По сф уроков критически мало, по обрывкам много не выучишь
upd если конечно имелись в виду уроки по созданию функций для собейтов - увольте, я не дорос ещё до этого, я не смогу интерпретировать сам, мне бы хоть с эпи научиться работать сперва, делая лишь некоторые части механизма самостоятельно
да сделал бы я даже это, не читая уроки?
По сф уроков критически мало, по обрывкам много не выучишь
т.е. не читал, да? а вот если бы читал, мысли "дайрект иксов колбек поставить в отдельный поток" (хз как это перефразировать) даже не возникло бы.
мало уроков, знаю, и пользы от них столь же мало, но они дают хотя бы какие-то базовые знания.
т.е. не читал, да? а вот если бы читал, мысли "дайрект иксов колбек поставить в отдельный поток" (хз как это перефразировать) даже не возникло бы.
мало уроков, знаю, и пользы от них столь же мало, но они дают хотя бы какие-то базовые знания.
К сожалению, когда у меня не получается, и я не имею никакого варианта сделать иначе, я начинаю изобретать - и пробую всё, что придёт в голову, потому что лучшего варианта попросту нет - на форуме стараюсь задавать вопросы по-минимуму, потому что меня тут часто не упустят возможности тыкнуть мордой в то что я что-то не знаю .-.
зачем? чтобы бедолаги вообще ничего не понимали?
А что собственно сложного?
connect(КлассИсточник, &КлассИсточник::МетодСигнал , КлассПолучатель, &КлассПолучатель::МетодСлот );
А что собственно сложного?
connect(КлассИсточник, &КлассИсточник::МетодСигнал , КлассПолучатель, &КлассПолучатель::МетодСлот );
C Qt 5 можно даже так: connect(КлассИсточник, &КлассИсточник::МетодСигнал , Коллбек);
iAmerican
16.05.2017, 20:58
Как перевести файл .wav в массив байт и вопсроизвести его?
RakSAMP не подключается к серверу, пока я не открою SAMP и не нажму на этот сервер в списке серверов, тогда RakSAMP сразу подключается. Из-за чего такое происходит? Может перед тем, как подключаться, нужно отправить какой-то запрос на количество игроков?
RakSAMP не подключается к серверу, пока я не открою SAMP и не нажму на этот сервер в списке серверов, тогда RakSAMP сразу подключается. Из-за чего такое происходит? Может перед тем, как подключаться, нужно отправить какой-то запрос на количество игроков?
это нубозащита СРП. Я писал реконнект, который ее обходит. Можешь взять код из него (Цпп)
Mr.Jonathan
18.05.2017, 14:26
Как узнать ид игрока на которого ты навелся?
SF->getSAMP()->getPlayers()->pLocalPlayer->sTargetPlayerID
Выдает 4рех значное число
Jack_Savage
21.05.2017, 16:14
Решил я тут сделать что то типу миссий для одиночки.
Посмотрел на модели пикапов и понял что агтунг (они все с SAMP.ide)
Вопрос такой: Как через C++ (asi) заставить игру грузить еще архив моделей ?
Типу как в сампе реализована загрузка SAMP.ide
Dark_Knight
21.05.2017, 16:54
Решил я тут сделать что то типу миссий для одиночки.
Посмотрел на модели пикапов и понял что агтунг (они все с SAMP.ide)
Вопрос такой: Как через C++ (asi) заставить игру грузить еще архив моделей ?
Типу как в сампе реализована загрузка SAMP.ide
Код:
# Usable object IDs are:
# * 18631 to 19999 (1369 total) reserved for SAMP.IDE
# * 11682 to 12799 (1118 total) reserved for SAMP.IDE
# * 15065 to 15999 (935 total) reserved for CUSTOM.IDE
Все иды до 15064 используются игрой. Советую идти на gtaforums.com
Jack_Savage
21.05.2017, 17:17
Код:
# Usable object IDs are:
# * 18631 to 19999 (1369 total) reserved for SAMP.IDE
# * 11682 to 12799 (1118 total) reserved for SAMP.IDE
# * 15065 to 15999 (935 total) reserved for CUSTOM.IDE
Все иды до 15064 используются игрой. Советую идти на gtaforums.com
Там англичани. И они не очень отвечают
Jack_Savage
21.05.2017, 17:50
Ошибся не SAMP.idl а SAMP.img
Когда сервер устанавливает игроку анимацию, он посылает RPC ApplyAnimation в котором есть animLib и animName. Игрок в свою очередь сообщает серверу о своей анимации посылая пакет PlayerSyncData и указывая в нем CurrentAnimationID.
Вопрос: как связаны эти 2 вида анимаций? Клиент как-то преобразует текстовые animLib и animName в численный CurrentAnimationID? Или это вообще разные анимации, которые не связаны друг с другом?
Dark_Knight
21.05.2017, 20:29
Это одно и тоже. У каждой анимации есть имя и айди.
Как получить все данные из пакета ApplyAnimation? В RakSAMP,е функции обработки этого пакета нет. Попробовал сделать порядок считывания данных как в events.lua.
C++:
WORD playerId
;
BYTE animLibLenght
;
char
animLib
[
257
]
;
BYTE animNameLenght
;
char
animName
[
257
]
;
float
delta
;
bool
loop
,
lockX
,
lockY
,
freeze
;
WORD time
;
bsData
.
Read
(
playerId
)
;
bsData
.
Read
(
animLibLenght
)
;
bsData
.
Read
(
animLib
,
animLibLenght
)
;
animLib
[
animLibLenght
]
=
'\0'
;
bsData
.
Read
(
animNameLenght
)
;
bsData
.
Read
(
animName
,
animNameLenght
)
;
animName
[
animNameLenght
]
=
'\0'
;
bsData
.
Read
(
delta
)
;
bsData
.
Read
(
loop
)
;
bsData
.
Read
(
lockX
)
;
bsData
.
Read
(
lockY
)
;
bsData
.
Read
(
freeze
)
;
bsData
.
Read
(
time
)
;
В итоге все нормально считывается, кроме четырех булевых значений: loop, lockX, lockY, freeze. Они считываются неправильно, причем они все одновременно либо true, либо false. Если вместо четырех считываний bool сделать одно BYTE, то по первым 4 битам этого байта можно определить значения, но тогда неправильно считывается time. По идее можно все четыре булевых значения и время записать в один int, а потом его разобрать по битам, но это неудобно. Может есть вариант проще или я что-то не правильно делаю?
Dark_Knight
22.05.2017, 18:34
Все там есть.
https://github.com/P3ti/RakSAMP/blob/master/client/src/netgame.cpp#L101
Все там есть.
https://github.com/P3ti/RakSAMP/blob/master/client/src/netgame.cpp#L101
Это получение пакетов синхронизации других игроков, а мне нужен пакет RPC_ScrApplyAnimation, который посылает сервер конкретно мне.
Dark_Knight
22.05.2017, 19:07
Удали чтения ида. Все входящие РПЦ только для тебя будут работать.
Удали чтения ида. Все входящие РПЦ только для тебя будут работать.
PlayerSync это не РПЦ, это просто пакет. Сервер посылает мне только пакеты других игроков, тех которые находятся рядом со мной. Пакеты с моей синхронизацией сервер мне не посылает, да и зачем ему посылать мне обратно тот пакет, который я ему только что отправил.
Dark_Knight
22.05.2017, 19:33
Йобанный врот билять. PlayerSync только есть ид анимации и её флаг. Ни названия анимки, ни библиотеки, где эта анимация хранится.
Йобанный врот билять. PlayerSync только есть ид анимации и её флаг. Ни названия анимки, ни библиотеки, где эта анимация хранится.
Я знаю, что есть в PlayerSync. Я же говорю, я не могу получить свой PlayerSync. Я его должен САМ заполнить и отправить серверу. И отправлять примерно раз в 40мс. Единственный способ узнать какую анимацию мне присвоил сервер, это получить РПЦ.
BlackKnigga
22.05.2017, 19:55
Я знаю, что есть в PlayerSync. Я же говорю, я не могу получить свой PlayerSync. Я его должен САМ заполнить и отправить серверу. И отправлять примерно раз в 40мс. Единственный способ узнать какую анимацию мне присвоил сервер, это получить РПЦ.
Можешь хукать свой исходящий player_sync
Можешь хукать свой исходящий player_sync
Я все это делаю в RakSAMP,е, я сам должен заполнять свой PlayerSync, если я его не заполню данными о своей анимации (которые я должен получить из РПЦ), то просто отправлю нулевой ид анимации.
BlackKnigga
22.05.2017, 20:38
Я все это делаю в RakSAMP,е, я сам должен заполнять свой PlayerSync, если я его не заполню данными о своей анимации (которые я должен получить из РПЦ), то просто отправлю нулевой ид анимации.
Lua:
INCOMING_RPCS
[
RPC
.
APPLYANIMATION
]
=
{
'onApplyPlayerAnimation'
,
{
playerId
=
'int16'
}
,
{
animLib
=
'string8'
}
,
{
animName
=
'string8'
}
,
{
loop
=
'bool'
}
,
{
lockX
=
'bool'
}
,
{
lockY
=
'bool'
}
,
{
freeze
=
'bool'
}
,
{
time
=
'int32'
}
}
Из samp.lua
Lua:
INCOMING_RPCS
[
RPC
.
APPLYANIMATION
]
=
{
'onApplyPlayerAnimation'
,
{
playerId
=
'int16'
}
,
{
animLib
=
'string8'
}
,
{
animName
=
'string8'
}
,
{
loop
=
'bool'
}
,
{
lockX
=
'bool'
}
,
{
lockY
=
'bool'
}
,
{
freeze
=
'bool'
}
,
{
time
=
'int32'
}
}
Из samp.lua
Я в первом посте написал, что взял структуру пакета из samp.lua, но у меня неправильно считываются булевы параметры.
Как получить все данные из пакета ApplyAnimation? В RakSAMP,е функции обработки этого пакета нет. Попробовал сделать порядок считывания данных как в events.lua.
В итоге все нормально считывается, кроме четырех булевых значений: loop, lockX, lockY, freeze. Они считываются неправильно, причем они все одновременно либо true, либо false. Если вместо четырех считываний bool сделать одно BYTE, то по первым 4 битам этого байта можно определить значения, но тогда неправильно считывается time. По идее можно все четыре булевых значения и время записать в один int, а потом его разобрать по битам, но это неудобно. Может есть вариант проще или я что-то не правильно делаю?
Нашел решение проблемы, оказалось что у BitStream есть метод ReadBit, который считывает ровно один бит и записывает его в bool. Вот рабочий код.
C++:
WORD playerId
;
BYTE animLibLenght
;
char
animLib
[
257
]
;
BYTE animNameLenght
;
char
animName
[
257
]
;
float
delta
;
bool
loop
,
lockX
,
lockY
,
freeze
;
WORD time
;
bsData
.
Read
(
playerId
)
;
bsData
.
Read
(
animLibLenght
)
;
bsData
.
Read
(
animLib
,
animLibLenght
)
;
animLib
[
animLibLenght
]
=
'\0'
;
bsData
.
Read
(
animNameLenght
)
;
bsData
.
Read
(
animName
,
animNameLenght
)
;
animName
[
animNameLenght
]
=
'\0'
;
bsData
.
Read
(
delta
)
;
loop
=
bsData
.
ReadBit
(
)
;
lockX
=
bsData
.
ReadBit
(
)
;
lockY
=
bsData
.
ReadBit
(
)
;
freeze
=
bsData
.
ReadBit
(
)
;
bsData
.
Read
(
time
)
;
MrYurkoo
23.05.2017, 23:47
Может кто-нибудь подсказать код для SAMP'a, который отвечает за выключение NameTag'ов над головой персонажа?
пытаюсь использовать указатель на строку вместо самой строки, но не работает - игра крашит
как исправить?
C++:
bool
CALLBACK
Present
(
CONST RECT
*
pSourceRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindowOverride
,
CONST RGNDATA
*
pDirtyRegion
)
{
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
{
char
sstring
;
char
*
pointer1
=
&
sstring
;
strcat
(
pointer1
,
"wtf "
)
;
//int watafakerNumbaVan = rand();
//int secondMistaHellwin = rand();
//printf(pointerToStringForRenderBlenderBenderSender blamberflambermbermbermbermber, "%d", watafakerNumbaVan);
//printf(pointerToStringForRenderBlenderBenderSender blamberflambermbermbermbermber, "%d", secondMistaHellwin);
pFont
->
Print
(
pointer1
,
D3DCOLOR_ARGB
(
117
,
0
,
92
,
0
)
,
700
,
0
,
false
)
;
SF
->
getRender
(
)
->
EndRender
(
)
;
}
;
return
true
;
}
;
itsLegend
25.05.2017, 01:52
Ну во первых - char может хранить только 1 символ.
Ну во первых - char может хранить только 1 символ.
а char[144] создаст таблицу в которой будет 144 ячейки, или переменную на 144 байта?
itsLegend
25.05.2017, 02:00
Массив создаст размером 144 байта
Массив создаст размером 144 байта
грустно. Спасибо.
Dark_Knight
25.05.2017, 13:50
Советую юзать std::string
Код:
std::string str = "wtf";
pFont->Print(str.c_str(), D3DCOLOR_ARGB(117, 0, 92, 0), 700, 0);
Советую юзать std::string
Код:
std::string str = "wtf";
pFont->Print(str.c_str(), D3DCOLOR_ARGB(117, 0, 92, 0), 700, 0);
раз уж ты тут, подскажешь как добавить в строку цифры, без преобразования цифр в строку и слияния ячеек?
Dark_Knight
25.05.2017, 14:48
DWORD i = 123456;
std::string str = std::to_string(i);
Как сделать unregister колбека dx? (в эпи почему-то только регистрация)
BlackKnigga
26.05.2017, 15:20
Как сделать unregister колбека dx? (в эпи почему-то только регистрация)
Просто делай из него return, когда он не нужен
Dark_Knight
26.05.2017, 15:47
Как сделать unregister колбека dx? (в эпи почему-то только регистрация)
Опять ты ***ню придумываешь. Зачем тебе их дерегистрировать в момент работы плагина, если можно добавить булевую проверку на рисование?
Опять ты ***ню придумываешь. Зачем тебе их дерегистрировать в момент работы плагина, если можно добавить булевую проверку на рисование?
Ну зачем ругаться? Мне интересно, можно ли вообще функцию выгрузить, чтоб она не кушала ресурсы напрасно :С
Dark_Knight
26.05.2017, 16:10
Не придумывай велосипед и юзай булевую переменную.
Как сместить указатель в строке в студии 13-го года?
мне выдаёт в поиске либо как смещать в консоли, либо структурные указатели
itsLegend
27.05.2017, 00:39
Что за строка и причём тут версия студии?
Что за строка и причём тут версия студии?
был ранее случай, когда гонщик кинул пример, а функции которые там использованы, доступны только в 15-й (или 17-й?), и в общем мне не были доступны ни нужные хейдеры, ни сами функции. Вот и уточняю теперь, на всякий.
Так как смещать указатель?
BlackKnigga
27.05.2017, 00:45
Так как смещать указатель?
Прибавить у нему оффсет
Похоже, я просто неправильно выразил мысль.
В общем, мне надо считать строку с определённого символа, но не зная этот символ - а лишь его позицию, и найти функцию считывания по указателю (как и настройку указателя) мне не удалось
наверное, имеет смысл отметить, что это не битстрим, а обычный массив char
itsLegend
27.05.2017, 00:59
Берешь да прибавляешь.
C++:
char
text
[
]
=
"some_text"
;
const
int
charPos
=
5
;
char
*
p
=
text
+
charPos
;
Берешь да прибавляешь.
C++:
char
text
[
]
=
"some_text"
;
const
int
charPos
=
5
;
char
*
p
=
text
+
charPos
;
серьёзно? И считав через P по твоему коду я смогу считать строку с определённой позиции?
itsLegend
27.05.2017, 01:01
Просто вывести. Как тебе угодно.
http://cpp.sh/4shxp (https://www.blast.hk/redirect/aHR0cDovL2NwcC5zaC80c2h4cA)
Есть ли способ вывести несколько строк через present в dx, не создавая дополнительных колбеков?
И ещё, сколь сильно может повлиять на фпс рендер каждой буквы через отдельный колбек, и разумно ли так делать?
Jack_Savage
27.05.2017, 12:41
Есть ли способ вывести несколько строк через present в dx, не создавая дополнительных колбеков?
И ещё, сколь сильно может повлиять на фпс рендер каждой буквы через отдельный колбек, и разумно ли так делать?
present d3d хука ?
Jack_Savage
27.05.2017, 12:43
да
C++:
D3DCOLOR fontColor
=
D3DCOLOR_ARGB
(
255
,
255
,
0
,
0
)
;
RECT rct
;
//Font
rct
.
left
=
20
;
rct
.
right
=
1680
;
rct
.
top
=
20
;
rct
.
bottom
=
rct
.
top
+
200
;
char
text
[
255
]
;
sprintf
(
text
,
"Деньги: %i\nСтатус меню: %i"
,
*
(
int
*
)
0xB7CE50
,
menu
)
;
m_font
->
DrawTextA
(
NULL
,
text
,
-
1
,
&
rct
,
0
,
fontColor
)
;
Ну так можно несколько строк вывести... Или тебе надо в разных местах ?
iAmerican
27.05.2017, 13:08
Есть ли способ вывести несколько строк через present в dx, не создавая дополнительных колбеков?
И ещё, сколь сильно может повлиять на фпс рендер каждой буквы через отдельный колбек, и разумно ли так делать?
Зачем тебе вообще создавать ещё калбеки? Можно в 1 колбеке сколько хочешь строк выводить.
C++:
D3DCOLOR fontColor
=
D3DCOLOR_ARGB
(
255
,
255
,
0
,
0
)
;
RECT rct
;
//Font
rct
.
left
=
20
;
rct
.
right
=
1680
;
rct
.
top
=
20
;
rct
.
bottom
=
rct
.
top
+
200
;
char
text
[
255
]
;
sprintf
(
text
,
"Деньги: %i\nСтатус меню: %i"
,
*
(
int
*
)
0xB7CE50
,
menu
)
;
m_font
->
DrawTextA
(
NULL
,
text
,
-
1
,
&
rct
,
0
,
fontColor
)
;
Ну так можно несколько строк вывести... Или тебе надо в разных местах ?
да, проблема как раз в том, что нужны разные координаты, потому просто форматировать под задачу одну строку я не могу
да, проблема как раз в том, что нужны разные координаты, потому просто форматировать под задачу одну строку я не могу
C++:
void
Print
(
int
X
,
int
Y
,
D3DCOLOR color
,
LPCSTR text
,
.
.
.
)
{
va_list ap
;
char
str
[
1024
]
;
va_start
(
ap
,
text
)
;
vsprintf_s
(
str
,
text
,
ap
)
;
va_end
(
ap
)
;
D3DPRESENT_PARAMETERS
*
D3DPParams
=
(
D3DPRESENT_PARAMETERS
*
)
0xC9C040
;
RECT rct
;
rct
.
left
=
X
;
rct
.
right
=
D3DPParams
->
BackBufferWidth
-
X
;
rct
.
top
=
Y
;
rct
.
bottom
=
D3DPParams
->
BackBufferHeight
-
Y
;
m_font
->
DrawTextA
(
NULL
,
str
,
-
1
,
&
rct
,
0
,
color
)
;
}
Вызывать так:
C++:
Print
(
20
,
20
,
D3DCOLOR_ARGB
(
255
,
255
,
0
,
0
)
,
"Деньги: %i\nСтатус меню: %i"
,
*
(
int
*
)
0xB7CE50
,
menu
)
;
Woofing Giraffe
27.05.2017, 16:53
Как сделать запрос в Google и сохранить результат в файл?
Jack_Savage
27.05.2017, 16:56
Как сделать запрос в Google и сохранить результат в файл?
Если надо сохранять лог файл то...
Можно вот как то так.
C++:
void
Log
(
std
::
string text
)
{
FILE
*
fichier
=
fopen
(
"debug.txt"
,
"a"
)
;
if
(
fichier
==
0
)
fichier
=
fopen
(
"debug.txt"
,
"w"
)
;
time_t currentTime
;
struct
tm
*
localTime
;
time
(
&
currentTime
)
;
localTime
=
localtime
(
&
currentTime
)
;
char
printe
[
300
]
;
sprintf
(
printe
,
"[%i:%i:%i]: %s"
,
localTime
->
tm_hour
,
localTime
->
tm_min
,
localTime
->
tm_sec
,
text
.
c_str
(
)
)
;
fwrite
(
printe
,
strlen
(
printe
)
,
1
,
fichier
)
;
fputs
(
"\r\n"
,
fichier
)
;
fclose
(
fichier
)
;
}
Как сделать запрос в Google и сохранить результат в файл?
Самый простой через UrlDownloadToFile, но можно заморочиться и сделать через WiniNet, с помощью которого можно даже с api работать
Woofing Giraffe
27.05.2017, 17:07
Самый простой через UrlDownloadToFile, но можно заморочиться и сделать через WiniNet, с помощью которого можно даже с api работать
Уже пробывал так, URLDownloadToFile(NULL, _T("https://www.google.ru/#q=example (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cuZ29vZ2xlLnJ1LyNxPWV4YW1wbGU)"), _T("D:\\example.html"), 0, NULL);
Но в файл сохраняет только главную страницу гугла, без запроса.
----------------------------------
Решил проблему. Кодировку в конце ссылки надо ставить)
Как установить переменную в качестве значения для выделения памяти?
Пробовал добавить constexpr, пробовал объявить через указатель, пробовал объявить через new, во всех случаях пишет что значение должно быть известно на момент компиляции, но значение - это всего-лишь ширина экрана, и она не может выдать ошибку, функция слишком примитивна ._.
Тем не менее, компилятор всеми силами мне препятствует.
используй new без constexpr.
Для развития: constexpr - указывает компилятору, что выполнить данную функцию или посчитать что-то надо на этапе компиляции, что бы после запуска программа восспользовалась готовым значением, а не тратила время на расчеты
iAmerican
28.05.2017, 13:11
convertScreenCoordsTo3D поделитесь функцией пожалуйста , а то найти не могу.
сразу ещё вопросик , как я знаю , там есть при переводе , переменная для указания глубины , как эта глубина вообще работает?
convertScreenCoordsTo3D поделитесь функцией пожалуйста , а то найти не могу.
сразу ещё вопросик , как я знаю , там есть при переводе , переменная для указания глубины , как эта глубина вообще работает?
представь, что камера за игроком - физический объект и то что видит игрок это одна из ее граний. Когда мы конвертируем координаты из 2д в 3д, мы берем точку в 3д мире рядом с камерой и эта точка для игрока на экране видна там же, где и 2д точка. Но эта точка может быть как в сантиметре от камеры, так и в километре (размер точки тут мы не учитываем). О том на каком расстояние от камеры будет точка определяется этой самой переменной depth, которую ты обозвал глубиной. Саму функцию можешь вытащить из соба, она в ClickWarp должна быть.
Jack_Savage
28.05.2017, 15:50
convertScreenCoordsTo3D поделитесь функцией пожалуйста , а то найти не могу.
сразу ещё вопросик , как я знаю , там есть при переводе , переменная для указания глубины , как эта глубина вообще работает?
Если надо то вот вам...
C++:
#define ADDR_MENU 0xBA67A4
void
CalcScreenCoors
(
CVector
*
vecWorld
,
CVector
*
vecScreen
)
{
D3DXMATRIX
m
(
(
float
*
)
(
0xB6FA2C
)
)
;
DWORD
*
dwLenX
=
(
DWORD
*
)
(
0xC17044
)
;
DWORD
*
dwLenY
=
(
DWORD
*
)
(
0xC17048
)
;
vecScreen
->
fX
=
vecWorld
->
fZ
*
m
.
_31
+
vecWorld
->
fY
*
m
.
_21
+
vecWorld
->
fX
*
m
.
_11
+
m
.
_41
;
vecScreen
->
fY
=
vecWorld
->
fZ
*
m
.
_32
+
vecWorld
->
fY
*
m
.
_22
+
vecWorld
->
fX
*
m
.
_12
+
m
.
_42
;
vecScreen
->
fZ
=
vecWorld
->
fZ
*
m
.
_33
+
vecWorld
->
fY
*
m
.
_23
+
vecWorld
->
fX
*
m
.
_13
+
m
.
_43
;
float
fRecip
=
1.0f
/
vecScreen
->
fZ
;
vecScreen
->
fX
*=
fRecip
*
(
*
dwLenX
)
;
vecScreen
->
fY
*=
fRecip
*
(
*
dwLenY
)
;
}
void
DrawTextB
(
int
uiLeft
,
int
uiTop
,
int
uiRight
,
int
uiBottom
,
unsigned
long
ulColor
,
const
char
*
szText
,
float
fScaleX
,
float
fScaleY
,
unsigned
long
ulFormat
,
LPD3DXFONT pDXFont
)
{
if
(
pDXFont
)
{
uiLeft
=
unsigned
int
(
(
float
)
uiLeft
*
(
1.0f
/
fScaleX
)
)
;
uiTop
=
unsigned
int
(
(
float
)
uiTop
*
(
1.0f
/
fScaleY
)
)
;
uiRight
=
unsigned
int
(
(
float
)
uiRight
*
(
1.0f
/
fScaleX
)
)
;
uiBottom
=
unsigned
int
(
(
float
)
uiBottom
*
(
1.0f
/
fScaleY
)
)
;
RECT rect
;
SetRect
(
&
rect
,
uiLeft
,
uiTop
,
uiRight
,
uiBottom
)
;
m_font
->
DrawTextA
(
NULL
,
szText
,
-
1
,
&
rect
,
ulFormat
,
ulColor
)
;
}
}
//Sprite *sp = new Sprite(200, 200, D3DCOLOR_ARGB(255, 255, 255, 255));
HRESULT D3DHook
::
Present
(
CONST RECT
*
pSourceRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindowOverride
,
CONST RGNDATA
*
pDirtyRegion
)
{
D3DCOLOR fontColor
=
D3DCOLOR_ARGB
(
255
,
255
,
0
,
0
)
;
CVector vecScreenPosition
;
float
*
position
=
(
*
(
DWORD
*
)
0xB6F5F0
)
?
(
float
*
)
(
*
(
DWORD
*
)
(
*
(
DWORD
*
)
0xB6F5F0
+
0x14
)
+
0x30
)
:
NULL
;
if
(
position
!=
NULL
)
{
CalcScreenCoors
(
new
CVector
(
position
[
0
]
,
position
[
1
]
,
position
[
2
]
+
1.3f
)
,
&
vecScreenPosition
)
;
}
int
iScreenPosX
=
static_cast
(
vecScreenPosition
.
fX
)
;
int
iScreenPosY
=
static_cast
(
vecScreenPosition
.
fY
)
;
if
(
*
(
PBYTE
)
ADDR_MENU
==
0
)
//В меню рендерить не будет, можно убрать если у вас по другому.
{
DrawTextB
(
iScreenPosX
,
iScreenPosY
,
iScreenPosX
,
iScreenPosY
,
D3DCOLOR_ARGB
(
255
,
255
,
255
,
255
)
,
"LocalPed"
,
1.0f
,
1.0f
,
DT_NOCLIP
|
DT_CENTER
,
m_font
)
;
}
return
origIDirect3DDevice9
->
Present
(
pSourceRect
,
pDestRect
,
hDestWindowOverride
,
pDirtyRegion
)
;
}
C++:
#ifndef __CVector_H
#define __CVector_H
#ifdef WIN32
#include
#endif
#include
#define FLOAT_EPSILON 0.0001f
/**
* CVector Structure used to store a 3D vertex.
*/
class
CVector
{
public
:
float
fX
,
fY
,
fZ
;
CVector
(
)
{
this
->
fX
=
0
;
this
->
fY
=
0
;
this
->
fZ
=
0
;
}
;
CVector
(
float
fX
,
float
fY
,
float
fZ
)
{
this
->
fX
=
fX
;
this
->
fY
=
fY
;
this
->
fZ
=
fZ
;
}
float
Normalize
(
void
)
{
float
t
=
sqrt
(
fX
*
fX
+
fY
*
fY
+
fZ
*
fZ
)
;
if
(
t
>
FLOAT_EPSILON
)
{
float
fRcpt
=
1
/
t
;
fX
*=
fRcpt
;
fY
*=
fRcpt
;
fZ
*=
fRcpt
;
}
else
t
=
0
;
return
t
;
}
float
Length
(
void
)
const
{
return
sqrt
(
(
fX
*
fX
)
+
(
fY
*
fY
)
+
(
fZ
*
fZ
)
)
;
}
float
LengthSquared
(
void
)
const
{
return
(
fX
*
fX
)
+
(
fY
*
fY
)
+
(
fZ
*
fZ
)
;
}
float
DotProduct
(
const
CVector
*
param
)
const
{
return
fX
*
param
->
fX
+
fY
*
param
->
fY
+
fZ
*
param
->
fZ
;
}
void
CrossProduct
(
const
CVector
*
param
)
{
float
_fX
=
fX
,
_fY
=
fY
,
_fZ
=
fZ
;
fX
=
_fY
*
param
->
fZ
-
param
->
fY
*
_fZ
;
fY
=
_fZ
*
param
->
fX
-
param
->
fZ
*
_fX
;
fZ
=
_fX
*
param
->
fY
-
param
->
fX
*
_fY
;
}
// Return a perpendicular direction
CVector
GetOtherAxis
(
void
)
const
{
CVector vecResult
;
if
(
std
::
abs
(
fX
)
>
std
::
abs
(
fY
)
)
vecResult
=
CVector
(
fZ
,
0
,
-
fX
)
;
else
vecResult
=
CVector
(
0
,
-
fZ
,
fY
)
;
vecResult
.
Normalize
(
)
;
return
vecResult
;
}
CVector
operator
+
(
const
CVector
&
vecRight
)
const
{
return
CVector
(
fX
+
vecRight
.
fX
,
fY
+
vecRight
.
fY
,
fZ
+
vecRight
.
fZ
)
;
}
CVector
operator
-
(
const
CVector
&
vecRight
)
const
{
return
CVector
(
fX
-
vecRight
.
fX
,
fY
-
vecRight
.
fY
,
fZ
-
vecRight
.
fZ
)
;
}
CVector
operator
*
(
const
CVector
&
vecRight
)
const
{
return
CVector
(
fX
*
vecRight
.
fX
,
fY
*
vecRight
.
fY
,
fZ
*
vecRight
.
fZ
)
;
}
CVector
operator
*
(
float
fRight
)
const
{
return
CVector
(
fX
*
fRight
,
fY
*
fRight
,
fZ
*
fRight
)
;
}
CVector
operator
/
(
const
CVector
&
vecRight
)
const
{
return
CVector
(
fX
/
vecRight
.
fX
,
fY
/
vecRight
.
fY
,
fZ
/
vecRight
.
fZ
)
;
}
CVector
operator
/
(
float
fRight
)
const
{
float
fRcpValue
=
1
/
fRight
;
return
CVector
(
fX
*
fRcpValue
,
fY
*
fRcpValue
,
fZ
*
fRcpValue
)
;
}
CVector
operator
-
(
)
const
{
return
CVector
(
-
fX
,
-
fY
,
-
fZ
)
;
}
void
operator
+=
(
float
fRight
)
{
fX
+=
fRight
;
fY
+=
fRight
;
fZ
+=
fRight
;
}
void
operator
+=
(
const
CVector
&
vecRight
)
{
fX
+=
vecRight
.
fX
;
fY
+=
vecRight
.
fY
;
fZ
+=
vecRight
.
fZ
;
}
void
operator
-=
(
float
fRight
)
{
fX
-=
fRight
;
fY
-=
fRight
;
fZ
-=
fRight
;
}
void
operator
-=
(
const
CVector
&
vecRight
)
{
fX
-=
vecRight
.
fX
;
fY
-=
vecRight
.
fY
;
fZ
-=
vecRight
.
fZ
;
}
void
operator
*=
(
float
fRight
)
{
fX
*=
fRight
;
fY
*=
fRight
;
fZ
*=
fRight
;
}
void
operator
*=
(
const
CVector
&
vecRight
)
{
fX
*=
vecRight
.
fX
;
fY
*=
vecRight
.
fY
;
fZ
*=
vecRight
.
fZ
;
}
void
operator
/=
(
float
fRight
)
{
float
fRcpValue
=
1
/
fRight
;
fX
*=
fRcpValue
;
fY
*=
fRcpValue
;
fZ
*=
fRcpValue
;
}
void
operator
/=
(
const
CVector
&
vecRight
)
{
fX
/=
vecRight
.
fX
;
fY
/=
vecRight
.
fY
;
fZ
/=
vecRight
.
fZ
;
}
bool
operator
==
(
const
CVector
&
param
)
const
{
return
(
(
fabs
(
fX
-
param
.
fX
)
=
FLOAT_EPSILON
)
||
(
fabs
(
fY
-
param
.
fY
)
>=
FLOAT_EPSILON
)
||
(
fabs
(
fZ
-
param
.
fZ
)
>=
FLOAT_EPSILON
)
)
;
}
}
;
#endif
Dark_Knight
28.05.2017, 16:29
Потому, что если есть А значит должен быть и Б. Он же скриптер, который пишет на С++. Что ты от него хочешь. Он даже во функцию передает указатель на d3dfont, но использует глобальную переменную.
Jack_Savage
28.05.2017, 16:41
почему B?
Потому что
#define DrawText DrawTextA есть
Следовательно и функция DrawTextA
Ну я подумал а почему бы не присобачить B)
Потому что
#define DrawText DrawTextA есть
Следовательно и функция DrawTextA
Ну я подумал а почему бы не присобачить B)
A = ANSI. это для разграничения типов строк, есть ещё W = Wide char, юникод.
Jack_Savage
28.05.2017, 16:57
A = ANSI. это для разграничения типов строк, есть ещё W = Wide char, юникод.
Про то что есть W знал. А вот про то что у них кодировка разная не знал. Спасибки :3
мяу
Крашит, но не при первой итерации. Однако, если убрать ppts и заменить его на sstring, то крашей не будет. Почему один и тот же механизм работает по-разному с указателем, и без?
так же я пробовал закомментировать добавление цифр к nocis и два условия склеенных, думал в них проблема - но нет. Краши без них не прекратились.
itsLegend
28.05.2017, 18:58
У тебя размер sstring равен 144, но ты пытаешься получить доступ к 146 элементу. И вообще, странное объявление ppts. И потом ещё забыл освобождать память выделенную через new, что приведет к утечке.
http://cpp.sh/3mkpg (https://www.blast.hk/redirect/aHR0cDovL2NwcC5zaC8zbWtwZw)
(размер указателя (char*) зависит от битности программы).
Dark_Knight
28.05.2017, 19:12
Это что ты опять такое пытаешься сделать? Может есть вариант проще, чем этот.
У тебя размер sstring равен 144, но ты пытаешься получить доступ к 146 элементу. И вообще, странное объявление ppts. И потом ещё забыл освобождать память выделенную через new, что приведет к утечке.
http://cpp.sh/3mkpg (https://www.blast.hk/redirect/aHR0cDovL2NwcC5zaC8zbWtwZw)
(размер указателя (char*) зависит от битности системы).
создавая второй и разного объёма, я проверял, получится ли сделать динамическую память, т.к. объявить через char name[size] массив с неопределённым изначально объёмом не получится. С этим я всё сделал как задумал.
забыл освобождать память выделенную через new, что приведет к утечке.
а вот за это спасибо, не знал.
(размер указателя (char*) зависит от битности системы).
у меня 64-ая, если вдруг что
Это что ты опять такое пытаешься сделать? Может есть вариант проще, чем этот.
хочу сделать строку размером под ширину экрана, но никак не получалось нормально создать динамический массив, он то не читался, то выдавал нули, то я его по ошибке приводил в виде адреса, а не указателя.
BlackKnigga
28.05.2017, 19:30
динамический массив
std::string
itsLegend
28.05.2017, 19:32
у меня 64-ая, если вдруг что
Я привел пример с sizeof(char*) к тому, что ты используешь memset, но очищается там первые 4/8 байт, а не сам размер массива.
Потому что
#define DrawText DrawTextA есть
Следовательно и функция DrawTextA
Ну я подумал а почему бы не присобачить B)
Сижу рофлю, хотя примерно такой ответ я и ождал увидеть.
Dark_Knight
28.05.2017, 19:34
хочу сделать строку размером под ширину экрана, но никак не получалось нормально создать динамический массив, он то не читался, то выдавал нули, то я его по ошибке приводил в виде адреса, а не указателя.
Опиши, что ты конкретно хочешь. Если ты хочешь, чтобы текст не было больше ширины экрана, то это полная ***ня.
Опиши, что ты конкретно хочешь. Если ты хочешь, чтобы текст не было больше ширины экрана, то это полная ***ня.
не, я хотел создать бегущую строку, где символы выходя за экран будут появляться с другой его стороны, но проблема была в том, что надо как-то просчитать, что символы реально ушли за экран - и я каким-то чудом надумал как это сделать, но мне нужна была строка размером с ширину экрана, чтобы было удобно её двигать - путём перемещения позиции символов в строке, чтобы не напрягать лишний раз графику (когда посмотрел пример СР_тима, пришёл к выводу, что мне требуется вывести на разных местах лишь по одной из двух координат, и всё это можно решить без дополнительного рендера, просто сделав часть экрана - строкой)
Dark_Knight
28.05.2017, 19:45
Ты хочешь сделать бегущую строку с указанием количества символов для отображения и со скоростью смещения отображения символа в милисекундах?
Ты хочешь сделать бегущую строку с указанием количества символов для отображения и со скоростью смещения отображения символа в милисекундах?
Примерно так. То что ты видишь на примере: попытка сделать именно бегающий текст, который основан был бы на двух рендерах, но поскольку я лишь начал создавать широкую строку, ещё не изменил принцип работы - так что да, я буду переделывать так, чтобы символы раз в какое-то время (или не обязательно время, что-нибудь ещё может возьму за систему исчисления), символы приближались к концу строки, а последний символ перемещался в начало
Jack_Savage
28.05.2017, 20:54
Сижу рофлю, хотя примерно такой ответ я и ождал увидеть.
Ну а что)
Нормальное название же... И так компилятору до лампочки оно. Хоть sddrbgtggei будет...
Jack_Savage
28.05.2017, 21:48
Передача float через ракнет (не samp).
Внимание вопрос: Почему RakNet передает вместо флоат какой то бред ?
http://i.imgur.com/k796NSe.png?1
C++:
enum
GameMessages
{
ID_DATA
=
ID_USER_PACKET_ENUM
+
1
,
OUT_SEND_SYNC
,
}
;
client
float
*
position
=
(
*
(
DWORD
*
)
0xB6F5F0
)
?
(
float
*
)
(
*
(
DWORD
*
)
(
*
(
DWORD
*
)
0xB6F5F0
+
0x14
)
+
0x30
)
:
NULL
;
RakNet
::
BitStream bsOut
;
bsOut
.
Write
(
(
RakNet
::
MessageID
)
OUT_SEND_SYNC
)
;
bsOut
.
Write
(
position
[
0
]
)
;
bsOut
.
Write
(
position
[
1
]
)
;
bsOut
.
Write
(
position
[
2
]
)
;
peerInterface
->
Send
(
&
bsOut
,
HIGH_PRIORITY
,
RELIABLE_ORDERED
,
0
,
server
,
false
)
;
Debug
(
"sendPacket"
)
;
server
void
PlayerSync
(
RakNet
::
Packet
*
packet
)
{
Player
*
p
=
players
->
FindByNetID
(
packet
->
systemAddress
)
;
if
(
p
!=
NULL
)
{
RakNet
::
BitStream
bsIn
(
packet
->
data
,
packet
->
length
,
false
)
;
float
x
,
y
,
z
;
bsIn
.
Read
(
x
)
;
bsIn
.
Read
(
y
)
;
bsIn
.
Read
(
z
)
;
printf
(
"MAIN::PlayerSync %f, %f, %f\n"
,
x
,
y
,
z
)
;
}
}
Что за фигня ?
ты уверен что там всё правильно?
у меня так бывало, когда я ошибался с адресом на пару байт. и считывал по кускам два значения, которые в итоге выдавали какую-то ересь
Jack_Savage
28.05.2017, 22:06
ты уверен что там всё правильно?
у меня так бывало, когда я ошибался с адресом на пару байт. и считывал по кускам два значения, которые в итоге выдавали какую-то ересь
float *position = (*(DWORD *)0xB6F5F0) ? (float *)(*(DWORD *)(*(DWORD *)0xB6F5F0 + 0x14) + 0x30) : NULL;
Если ты про это то оно работает и если на клиенте выводить его значение то все нормально
float *position = (*(DWORD *)0xB6F5F0) ? (float *)(*(DWORD *)(*(DWORD *)0xB6F5F0 + 0x14) + 0x30) : NULL;
Если ты про это то оно работает и если на клиенте выводить его значение то все нормально
не могу ничем помочь, отбой. :scratch:
float *position = (*(DWORD *)0xB6F5F0) ? (float *)(*(DWORD *)(*(DWORD *)0xB6F5F0 + 0x14) + 0x30) : NULL;
это чтение данных из памяти, ты использщуешь адреса для игры. В RakNet другие адреса. Да и вообще в RakNet они не нужны
Jack_Savage
28.05.2017, 22:21
это чтение данных из памяти, ты использщуешь адреса для игры. В RakNet другие адреса. Да и вообще в RakNet они не нужны
Я это приложыл чтобы ясно было что за position...
Мне координаты из воздуха брать что ли...
Я отправляю float, принимаю float уже какой то не такой как надо...
itsLegend
28.05.2017, 22:25
Ты уверен, что в packet->data хранится только 12 байт, а не 13?
Jack_Savage
28.05.2017, 22:33
Ты уверен, что в packet->data хранится только 12 байт, а не 13?
А это при чем тут?
А это при чем тут?
К тому, что первый байт, возможно, есть ID пакета.
Jack_Savage
28.05.2017, 23:09
К тому, что первый байт, возможно, есть ID пакета.
bsIn.IgnoreBytes(sizeof(RakNet::MessageID));
Исправил. Спасибо большое :3
Можно как-нибудь выполнить объявление переменной для конкретной функции, не переобъявляя с каждой итерацией функции, и не делая глобальной? (и если кто будет отвечать, то заодно напишите, пожалуйста, окажет ли подобная "подгонка" положительное влияние на производительность, или это лишь усложнит задачу компу)
И ещё один вопрос назрел, пока писал. Я вот так "упрощаю" работу процессору (наверное, так выполнение должно быть быстрее)
C++:
char
*
PTS
;
char
*
ppts
=
new
char
(
sstring
[
144
]
)
;
unsigned
__int16 nocis
,
scrx1
,
screex
=
0
;
unsigned
char
red
,
green
,
blue
=
rand
(
)
;
и вот когда я пытаюсь так же объединить указатели на символьные массивы, как обычные переменные - мне выдаёт ошибку. Можно как-нибудь "упростить" объявление указателей, сгруппировать что ли для пущей производительности?
Можно как-нибудь выполнить объявление переменной для конкретной функции, не переобъявляя с каждой итерацией функции, и не делая глобальной?
Один вопрос, для чего?
Читаю твои сообщения и не понимаю тебя... Зачем изобретать какую то дичь, если до тебя уже всё придумали?
Один вопрос, для чего?
Читаю твои сообщения и не понимаю тебя... Зачем изобретать какую то дичь, если до тебя уже всё придумали?
Если бы до меня придумали всё, не существовало бы ошибки в коде, которую не смог бы исправить компилятор, анализируя контекст. Если тебе нечего мне сказать по делу - пройди мимо, обоим будет лучше.
@Снежок (https://www.blast.hk/members/16709/), static
C++:
short
PTC
=
0
;
PTCs
=
ppts
+
PTC
;
Почему так крашит уже через пару итераций?
C++:
short
PTC
=
1
;
PTCs
=
ppts
+
PTC
;
Вопреки тому, что так не крашит вовсе
это указатель на символ в строчке, если шо
Dark_Knight
30.05.2017, 14:43
Выход за пределы.
Выход за пределы.
Можно более нубским языком? :D
И ещё.
C++:
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
stFontInfo
*
pFont
;
unsigned
short
scrx
=
GetSystemMetrics
(
SM_CXSCREEN
)
;
char
sstring
[
1
]
;
char
qwe
[
1
]
;
short
int
PTC
=
scrx
;
char
*
ppts
=
new
char
(
sstring
[
scrx
]
)
;
char
*
ptqwe
=
new
char
(
qwe
[
scrx
]
)
;
unsigned
__int16 nocis
;
unsigned
char
red
,
green
,
blue
;
char
*
PTCs
;
bool
CALLBACK
Present
(
CONST RECT
*
pSourceRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindowOverride
,
CONST RGNDATA
*
pDirtyRegion
)
{
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
{
memset
(
ptqwe
,
0
,
strlen
(
ptqwe
)
)
;
memset
(
ppts
,
0
,
strlen
(
ppts
)
)
;
PTC
-=
1
;
PTCs
=
ppts
+
PTC
;
strcat
(
PTCs
,
"Число символов в строке: "
)
;
nocis
=
_scprintf
(
PTCs
)
;
itoa
(
nocis
,
ptqwe
,
10
)
;
strcat
(
PTCs
,
ptqwe
)
;
//SF->getSAMP()->getChat()->AddChatMessage(555555, "%s", ppts);
red
=
rand
(
)
;
green
=
rand
(
)
;
blue
=
rand
(
)
;
pFont
->
Print
(
PTCs
,
D3DCOLOR_ARGB
(
255
,
red
,
green
,
blue
)
,
0
,
500
,
false
)
;
SF
->
getRender
(
)
->
EndRender
(
)
;
}
;
return
true
;
}
;
с данным кодом через четверть минуты игры происходит нечто странное (https://www.blast.hk/redirect/aHR0cDovL2kxMi5waXhzLnJ1L3N0b3JhZ2UvMy8xLzIvNDQxMX BuZ181MTI5MTIyXzI2MzU1MzEyLnBuZw), что удалось разглядеть, лишь записав - после этого игра крашит.
Примечательно, что я не делал так, чтоб строка вообще клеилась, не то что уж заполняла себя своими копиями
Как такое происходит?
Jack_Savage
30.05.2017, 17:40
Можно более нубским языком? :D
И ещё.
C++:
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
stFontInfo
*
pFont
;
unsigned
short
scrx
=
GetSystemMetrics
(
SM_CXSCREEN
)
;
char
sstring
[
1
]
;
char
qwe
[
1
]
;
short
int
PTC
=
scrx
;
char
*
ppts
=
new
char
(
sstring
[
scrx
]
)
;
char
*
ptqwe
=
new
char
(
qwe
[
scrx
]
)
;
unsigned
__int16 nocis
;
unsigned
char
red
,
green
,
blue
;
char
*
PTCs
;
bool
CALLBACK
Present
(
CONST RECT
*
pSourceRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindowOverride
,
CONST RGNDATA
*
pDirtyRegion
)
{
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
{
memset
(
ptqwe
,
0
,
strlen
(
ptqwe
)
)
;
memset
(
ppts
,
0
,
strlen
(
ppts
)
)
;
PTC
-=
1
;
PTCs
=
ppts
+
PTC
;
strcat
(
PTCs
,
"Число символов в строке: "
)
;
nocis
=
_scprintf
(
PTCs
)
;
itoa
(
nocis
,
ptqwe
,
10
)
;
strcat
(
PTCs
,
ptqwe
)
;
//SF->getSAMP()->getChat()->AddChatMessage(555555, "%s", ppts);
red
=
rand
(
)
;
green
=
rand
(
)
;
blue
=
rand
(
)
;
pFont
->
Print
(
PTCs
,
D3DCOLOR_ARGB
(
255
,
red
,
green
,
blue
)
,
0
,
500
,
false
)
;
SF
->
getRender
(
)
->
EndRender
(
)
;
}
;
return
true
;
}
;
с данным кодом через четверть минуты игры происходит нечто странное (https://www.blast.hk/redirect/aHR0cDovL2kxMi5waXhzLnJ1L3N0b3JhZ2UvMy8xLzIvNDQxMX BuZ181MTI5MTIyXzI2MzU1MzEyLnBuZw), что удалось разглядеть, лишь записав - после этого игра крашит.
Примечательно, что я не делал так, чтоб строка вообще клеилась, не то что уж заполняла себя своими копиями
Как такое происходит?
что оно должно сделать?
что оно должно сделать?
это не важно, функция не дописана же х)
Меня интересует, что приводит к тому шо строка себя клонирует и забивает буффер
DarkP1xel
30.05.2017, 20:20
К тому что хрень пойми, что ты сделал вообще.
Gabriel__
31.05.2017, 14:51
Как считать вводимые символы с консоли но так чтобы они в ней не отобразились. Ввёл в консоль слово hello оно считалось в переменную и отобразилось в консоли. Как убрать этот побочный эффект ?
C++:
int
main
(
)
{
while
(
true
)
{
std
::
string str
;
std
::
getline
(
std
::
cin
,
str
)
;
}
return
0
;
}
iAmerican
31.05.2017, 15:35
Как осуществить поиск подстроки в строке , без учета регистра?
C++:
if
(
_stricmp
(
"XYZ -2-2-2"
,
"xYZ"
)
!=
NULL
)
{
Log
(
"Нашлось"
)
;
}
Пробовал вот так , но не работает.
Dark_Knight
31.05.2017, 15:59
Как осуществить поиск подстроки в строке , без учета регистра?
C++:
if
(
_stricmp
(
"XYZ -2-2-2"
,
"xYZ"
)
!=
NULL
)
{
Log
(
"Нашлось"
)
;
}
Пробовал вот так , но не работает.
Когда вы уже научитесь юзать std::string? -_-
Код:
[CODE]
#include
#include
#include
#include
#include
using namespace std;
void main() {
setlocale(LC_ALL, "Russian");
std::string text = "Вася Пупкин", str = "ВАСЯ ПУПКИН";
(text == str) ? cout
Нубо-вопрос подъехал. Что лучше использовать: string или char? А то наткнулся на статейку о том, что char жрёт меньше памяти и быстрее "обрабатывается".
Dark_Knight
31.05.2017, 17:44
Стринг точно удобней, да и выиграешь ты там мало, так что смысла заморачиватся нет.
Предположим, что в d3dx есть такая структура:
C++:
typedef
struct
D3DXVECTOR3
{
FLOAT x
;
FLOAT y
;
FLOAT z
;
}
D3DXVECTOR3
,
*
LPD3DXVECTOR3
;
И я попытался её заполнить:
C++:
struct
D3DXVECTOR
{
FLOAT x
=
Matrx
,
y
=
Matry
,
z
=
Matrz
+
10
;
}
;
Но при попытке её объявить, указав D3DXVECTOR мне пишет что "использование имени типа не допускается", а если я пытаюсь между таблицей и D3DXVECTOR вписать название для таблицы, выдаёт ошибку, типа быть его там не должно.
Вопрос: каким образом заполнять данную структуру, и указывать её в качестве блока данных? (т.к если не по d3xvector, у меня и идей нет как указывать)
Dark_Knight
31.05.2017, 22:29
Ну ты и нуб.
Код:
D3DXVECTOR3 vec(1, 2, 3);
Jack_Savage
03.06.2017, 23:20
Как можно создавать переменную во время работы программы ?
Типу написал в консоль create и она создалась.
При этом чтобы потом как то обратится можно было и чтобы их можно было создавать пока оператива не кончится
BlackKnigga
03.06.2017, 23:28
Как можно создавать переменную во время работы программы ?
Типу написал в консоль create и она создалась.
При этом чтобы потом как то обратится можно было и чтобы их можно было создавать пока оператива не кончится
new
Jack_Savage
03.06.2017, 23:37
new
И чем это поможет ? Мне надо создавать переменную во время выполнения. Их может быть хоть 1000.
Пользователь сам ее создает командой.
По сути мне надо чтобы программа исполняла код из файла и создавала переменную когда надо
Dark_Knight
04.06.2017, 11:56
Зачем тебе это? Вектора может тебе подойдут?
Структура буллет синк, которую кидал бэтмэн:
Дело в том, что входящий BULLET_SYNC имеет измененую структуру
Слегка. Там нужно читать первые 2 байта читать ид игрока. Дальше уже все тоже самое.
по ней я пытаюсь считать, собсна, структуру:
C++:
[CODE]
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
206
)
{
//byte pID;
uint8_t
byteType
;
byte issuerID
;
uint16_t
sTargetID
;
float
fOrigin
[
3
]
;
float
fTarget
[
3
]
;
float
fCenter
[
3
]
;
uint8_t
byteWeaponID
;
//params->bitStream->Read(pID);
int
btsused
=
params
->
bitStream
->
GetNumberOfBytesUsed
(
)
;
fout
bitStream
->
Read
(
byteType
)
;
params
->
bitStream
->
Read
(
issuerID
)
;
params
->
bitStream
->
Read
(
sTargetID
)
;
params
->
bitStream
->
Read
(
fOrigin
)
;
params
->
bitStream
->
Read
(
fTarget
)
;
params
->
bitStream
->
Read
(
fCenter
)
;
params
->
bitStream
->
Read
(
byteWeaponID
)
;
fout
выдаёт фырню:
issuer: ___256___Њ
from: -8.11872e-025___4.60597e+009___6.28182e+028
to: -1.039e-020___4.31363e-014___0
center: -3.7107e+019___-5.91414e
вопрос: чем заболели координаты, что в них эти плюсы появились, и как их правильно читать-то?
Dark_Knight
06.06.2017, 01:29
Потому что ты читаешь какую-то ***ню, а точнее issuerID. Что это вообще такое?
Код:
if (params->packetId == PacketEnumeration::ID_BULLET_SYNC) {
BitStream *bs = params->bitStream;
stBulletData data;
byte packetID;
WORD pID;
bs->ResetReadPointer();
bs->Read(packetID);
if (in)
bs->Read(pID);
bs->Read((PCHAR)&data, sizeof(stBulletData));
}
Потому что ты читаешь какую-то ***ню, а точнее issuerID. Что это вообще такое?
Код:
if (params->packetId == PacketEnumeration::ID_BULLET_SYNC) {
BitStream *bs = params->bitStream;
stBulletData data;
byte packetID;
WORD pID;
bs->ResetReadPointer();
bs->Read(packetID);
if (in)
bs->Read(pID);
bs->Read((PCHAR)&data, sizeof(stBulletData));
}
Там нужно читать первые 2 байта читать ид игрока. Дальше уже все тоже самое.
однако я пробовал без них, и это не спасло систему
@Снежок (https://www.blast.hk/members/16709/) есть чудовищный говноцикл, если не умеешь оффсеты считать в битстримах, мне в свое время он очень помог
Код:
[CODE]
for (uint16_t i(0); i
после его выполнения идешь в чатлог и ищешь более-менее похожие значения, получаешь их оффсет))))))0
я предупреждал, что говнокод, но работает)
Dark_Knight
06.06.2017, 01:48
однако я пробовал без них, и это не спасло систему
Я тебе дал рабочий вариант. Юзай.
@p1cador (https://www.blast.hk/members/20413/), @Dark_Knight (https://www.blast.hk/members/34/), спасибо большое. Очень помогли.
Кстати, насчёт переборщика - огромное спасибо, только у меня уже есть настроенный вывод в текстовый документ - просто сменю вывод с чата на файлик, и буду пользоваться х)
У меня не редко возникают проблемы с этими вычислениями, давно нуждался в такой штуке
DarkP1xel
06.06.2017, 07:33
[QUOTE="p1cador"]
@Снежок (https://www.blast.hk/members/16709/) есть чудовищный говноцикл, если не умеешь оффсеты считать в битстримах, мне в свое время он очень помог
Код:
[CODE]
for (uint16_t i(0); i
Dark_Knight
06.06.2017, 11:33
Кстати, нельзя читать массив сразу в хуке. Надо каждый элемент читать отдельно.
Кто нибудь сравнивал hash суммы? Есть примеры?
Dark_Knight
07.06.2017, 22:35
Хеш сумма - это же строка, если мне память не изменяет.
Jack_Savage
09.06.2017, 15:22
Как присобачить CEF к gta sa ?
Пытаюсь уже 6-й день засунуть cef в GTA SA но что то не получается.
Вот как заставить CEF рендерится в окне игры, обрабатывать нажатия на кнопки (на страничке), и тд ?
(Из МТА стибзить не могу потому что не понимаю как оно его там рендерит)
Dark_Knight
09.06.2017, 18:31
Как присобачить CEF к gta sa ?
Пытаюсь уже 6-й день засунуть cef в GTA SA но что то не получается.
Вот как заставить CEF рендерится в окне игры, обрабатывать нажатия на кнопки (на страничке), и тд ?
(Из МТА стибзить не могу потому что не понимаю как оно его там рендерит)
А может за тебя еще и сходить в туалет посрать?
Jack_Savage
09.06.2017, 18:42
А может за тебя еще и сходить в туалет посрать?
Ну он в МТА очень не понятно сделан...
А инфы про цеф в инете нет почти.
Ана русском вообще нет кажысь.
Dark_Knight
09.06.2017, 19:28
Я надеюсь, ты хоть смотрел в каком месте происходит вызов иницилизации цефа?
Jack_Savage
09.06.2017, 22:24
Я надеюсь, ты хоть смотрел в каком месте происходит вызов иницилизации цефа?
В МТА я так и не понял. В CefSimplе в WinMain.
Roger571
12.06.2017, 01:59
Как пофиксить в собейте краш, после включения кастомного чата?
NarutoUA
12.06.2017, 09:00
В МТА я так и не понял. В CefSimplе в WinMain.
попробуй Awesomium, в гугле есть инфа как подключить его к дх9
Jack_Savage
12.06.2017, 17:38
попробуй Awesomium, в гугле есть инфа как подключить его к дх9
Хм... Как раз вчера его подкрутил)
Но все равно большое спасибо :3
вообщем, решил обмазаться говном и попробовать начать писать сф-плагины
для начала я решил скачать студию, но поскольку мой компьютер засран (*** пойми где он засран, скорее в папке WINDOWS) файлами MS VS, я не могу установить заново MS VS и скачал аналог студии code::blocks
короче студия мне понравилась, она очень мало весит и всё такое.... скачал я основу сф плагина и для начала тупо хотел скомпилировать плагин, дабы понять, скомпилится или нет
но нет! выдает мне компилятор ссаную ошибку:
https://pp.userapi.com/c836330/v836330490/414c6/HimWwWL45HA.jpg
и я подумал: может студия всё-таки ***ня и проще сменить винду и установить MS VS заново? но так как саша ленивый и ему пиздецки лень после установки винды ставить весь софт назад, я взял и переместил SAMPFUNCS_API.h в корень сф плагина и попытался еще разок скомпилировать, но удача снова ко мне обернулась жопой и выдала мне ошибку
PuV89TKNSbY.jpgsаnеk · 12 Июн 2017 в 20:17' data-fancybox="lb-post-148274" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="/proxy.php?image=https%3A%2F%2Fpp.userapi.com%2Fc83 6330%2Fv836330490%2F414ce%2FPuV89TKNSbY.jpg&hash=c07b7c8f32ff96e4b9279ff5f1f3e544" style="cursor: pointer;" title="PuV89TKNSbY.jpg">
https://pp.userapi.com/c836330/v836330490/414ce/PuV89TKNSbY.jpg
я сидел и думал, то ли в плагине чего-то не хватает, то ли я долбоёб
но тут мне подсказал один хороший 4ел0ве4ик, что нужно установить directX sdk и тогда всё будет охуенно! сможешь писать *****тые плагины! я недолго думая скачал и установил этот ссаный сдк, но ошибка никуда не делась!
- хлопцы, что я делаю не так? спс за внимание!
itsLegend
12.06.2017, 21:31
Комп перезагрузи после установи dx sdk
code::blocks
Visual Studio "берет" эти файлы из системной переменной DXSDK_DIR
Очевидно, code::blocks не видит/ты не настроил его таким образом.
Проверить, куда установился DXSDK - в проводнике вместо пути вставить %DXSDK_DIR%
Ну и добавить в настройках codeblocks этот путь + /Include/ - для дополнительный заголовочных файлов(ну или как-то так)
и этот путь + /Lib/x86 - для библиотек
Dark_Knight
12.06.2017, 22:05
Используй ВС и не парся.
iAmerican
16.06.2017, 03:21
Как сделать цикл по клавишам? Нужно что бы по нажатию клавиш 0-9 , выполнялись действия.
Вот так вот , не получилось
C++:
for
(
int
i
=
0
;
i
Log
(
"%i"
,
Key
)
;
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
Key
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"%i"
,
Key
)
;
}
}
itsLegend
16.06.2017, 04:34
C++:
byte Key
=
0x30
+
i
;
Jack_Savage
16.06.2017, 10:20
Как вызвать функцию в нужном потоке ?
Есть WindowProc и его же вызывает поток GTA SA.
И есть еще поток созданный через _beginthreadex.
Можно как то вызвать функцию из WindowProc но чтобы ее код выполнился в созданном потоке (_beginthreadex ).
Каким образом diamond блокирует подключение с raksamp,и как обойти это?
Jack_Savage
23.06.2017, 14:14
KoKa(ev)"]
Каким образом diamond блокирует подключение с raksamp,и как обойти это?
Есть вероятность что есть проверка на клик из лаунчера самп...
Можешь кликнуть на сервер в лаунчере и сразу зайти через raksamp
как преобразовать 3д координаты в экранные? (без эпи)
и ещё, как узнать что 3д координаты находятся в пределах экрана?(без эпи)
itsLegend
23.06.2017, 15:38
как преобразовать 3д координаты в экранные? (без эпи)
и ещё, как узнать что 3д координаты находятся в пределах экрана?(без эпи)
https://github.com/BlastHackNet/mod_s0beit_sa/blob/master/src/proxyIDirect3DDevice9.cpp#L97
vecScreen.z
Как обрабатывать сообщения чата? Я имею в виду, как изменить сообщение, которое появляется в чате, прежде чем он это сделает?
iAmerican
24.06.2017, 15:33
Как обрабатывать сообщения чата? Я имею в виду, как изменить сообщение, которое появляется в чате, прежде чем он это сделает?
Ставишь хук на RPC_ScrClientMessage. В нём добавляешь проверку , на необходимые тебе сообщения.
Если сообщение пришло возвращаешь return false; и выводишь своё сообщение.
C++:
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
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
;
if
(
strstr
(
message
,
"Какое то сообщение пришло"
)
!=
NULL
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
">> Какое то сообщение отредактировано"
)
;
return
false
;
}
return
true
;
}
;
в mainloop , до init = true;
C++:
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
incomingRPC
)
;
Ставишь хук на RPC_ScrClientMessage. В нём добавляешь проверку , на необходимые тебе сообщения.
Если сообщение пришло возвращаешь return false; и выводишь своё сообщение.
C++:
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrClientMessage
)
{
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
;
if
(
strstr
(
message
,
"Какое то сообщение пришло"
)
!=
NULL
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
">> Какое то сообщение отредактировано"
)
;
return
false
;
}
return
true
;
}
;
в mainloop , до init = true;
C++:
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
incomingRPC
)
;
Большое спасибо
Делаю ползунок. И не могу составить формулу.
Данный код .
// maxsize , максимальное значение для ползунка , не длинна.
....
Т.Е. Допустим будет максимальное значение 1 , значит 0 будет в начале линии , 1 будет в конце уже.
макс. значение 300 , 0 в начале линии , 300 в конце..
Ну думаю понятно это .
// var , переменная в которую будет записываться значение ползунка.
C++:
bool
SlideInt
(
std
::
string text
,
int
maxsize
,
int
&
var
)
{
static
int
iPoligonX
=
(
(
var
/
280
)
*
maxsize
)
;
// Положение ползунка на линии. Тут и не могу составить нормальную формулу.
SF
->
getRender
(
)
->
DrawLine
(
0
,
900
,
280
,
900
,
2
,
-
1
)
;
// Сама линия
SF
->
getRender
(
)
->
DrawPolygon
(
iPoligonX
,
900
,
10
,
10
,
0
,
20
,
D3DCOLOR_ARGB
(
155
,
0
,
0
,
255
)
)
;
// Ползунок
}
Много вас таких, не способных сделать ползунок.
C++:
void
CNode
::
DrawScrollBarVertical
(
int
so_V
,
int
so_H
)
{
int
fullScroll
=
_size
.
y
-
4
;
float
rollerSize
=
(
float
)
_size
.
y
/
(
(
float
)
_scrollSizeVertical
)
*
(
float
)
fullScroll
;
float
rollerOffset
=
(
float
)
_size
.
y
/
(
(
float
)
_scrollSizeVertical
)
*
(
float
)
_scrollOffsetVertical
;
_draw
->
D3DBox
(
_pos
.
x
+
_size
.
x
-
so_H
,
_pos
.
y
-
so_V
,
6
,
_size
.
y
,
_scrollFrame
)
;
_draw
->
D3DBox
(
_pos
.
x
+
_size
.
x
+
2
-
so_H
,
(
_pos
.
y
+
2
)
-
so_V
,
2
,
fullScroll
,
_scrollMat
)
;
_draw
->
D3DBox
(
_pos
.
x
+
_size
.
x
+
2
-
so_H
,
(
_pos
.
y
+
2
+
rollerOffset
)
-
so_V
,
2
,
rollerSize
,
_scrollRoller
)
;
}
void
CNode
::
DrawScrollBarHorizontal
(
int
so_V
,
int
so_H
)
{
float
rollerSize
=
(
float
)
_size
.
x
/
(
(
float
)
_scrollSizeHorizontal
)
*
(
float
)
_size
.
x
;
float
rollerOffset
=
(
float
)
_size
.
x
/
(
(
float
)
_scrollSizeHorizontal
)
*
(
float
)
_scrollOffsetHorizontal
;
_draw
->
D3DBox
(
_pos
.
x
-
so_H
,
(
_pos
.
y
+
_size
.
y
)
-
so_V
,
_size
.
x
+
6
,
6
,
_scrollFrame
)
;
_draw
->
D3DBox
(
_pos
.
x
+
3
-
so_H
,
(
_pos
.
y
+
_size
.
y
+
2
)
-
so_V
,
_size
.
x
,
2
,
_scrollMat
)
;
_draw
->
D3DBox
(
_pos
.
x
+
3
+
rollerOffset
-
so_H
,
(
_pos
.
y
+
_size
.
y
+
2
)
-
so_V
,
rollerSize
,
2
,
_scrollRoller
)
;
}
so_V и so_H тебе не нужны скорее всего - можешь их просто удалить или передавать нули.
Прокрутка:
C++:
switch
(
uMsg
)
{
case
WM_MOUSEWHEEL
:
if
(
GET_WHEEL_DELTA_WPARAM
(
wParam
)
_scrollSizeVertical
)
_scrollOffsetVertical
=
_scrollSizeVertical
-
_size
.
y
;
}
else
{
_scrollOffsetVertical
-=
_scrollStep
;
if
(
_scrollOffsetVertical
_scrollSizeVertical
)
_scrollOffsetVertical
=
_scrollSizeVertical
-
_size
.
y
;
return
false
;
case
VK_LEFT
:
_scrollOffsetHorizontal
-=
_scrollStep
;
if
(
_scrollOffsetHorizontal
_scrollSizeHorizontal
)
_scrollOffsetHorizontal
=
_scrollSizeHorizontal
-
_size
.
x
;
return
false
;
case
VK_PRIOR
:
_scrollOffsetVertical
=
0
;
return
false
;
case
VK_NEXT
:
_scrollOffsetVertical
=
_scrollSizeVertical
-
_size
.
y
;
return
false
;
case
VK_HOME
:
_scrollOffsetHorizontal
=
0
;
return
false
;
case
VK_END
:
_scrollOffsetHorizontal
=
_scrollSizeHorizontal
-
_size
.
x
;
return
false
;
default
:
break
;
}
break
;
default
:
break
;
}
Размер скролла у меня указывается в пикселях, но можно притянуть и строки.
iAmerican
26.06.2017, 13:04
Много вас таких, не способных сделать ползунок.
C++:
void
CNode
::
DrawScrollBarVertical
(
int
so_V
,
int
so_H
)
{
int
fullScroll
=
_size
.
y
-
4
;
float
rollerSize
=
(
float
)
_size
.
y
/
(
(
float
)
_scrollSizeVertical
)
*
(
float
)
fullScroll
;
float
rollerOffset
=
(
float
)
_size
.
y
/
(
(
float
)
_scrollSizeVertical
)
*
(
float
)
_scrollOffsetVertical
;
_draw
->
D3DBox
(
_pos
.
x
+
_size
.
x
-
so_H
,
_pos
.
y
-
so_V
,
6
,
_size
.
y
,
_scrollFrame
)
;
_draw
->
D3DBox
(
_pos
.
x
+
_size
.
x
+
2
-
so_H
,
(
_pos
.
y
+
2
)
-
so_V
,
2
,
fullScroll
,
_scrollMat
)
;
_draw
->
D3DBox
(
_pos
.
x
+
_size
.
x
+
2
-
so_H
,
(
_pos
.
y
+
2
+
rollerOffset
)
-
so_V
,
2
,
rollerSize
,
_scrollRoller
)
;
}
void
CNode
::
DrawScrollBarHorizontal
(
int
so_V
,
int
so_H
)
{
float
rollerSize
=
(
float
)
_size
.
x
/
(
(
float
)
_scrollSizeHorizontal
)
*
(
float
)
_size
.
x
;
float
rollerOffset
=
(
float
)
_size
.
x
/
(
(
float
)
_scrollSizeHorizontal
)
*
(
float
)
_scrollOffsetHorizontal
;
_draw
->
D3DBox
(
_pos
.
x
-
so_H
,
(
_pos
.
y
+
_size
.
y
)
-
so_V
,
_size
.
x
+
6
,
6
,
_scrollFrame
)
;
_draw
->
D3DBox
(
_pos
.
x
+
3
-
so_H
,
(
_pos
.
y
+
_size
.
y
+
2
)
-
so_V
,
_size
.
x
,
2
,
_scrollMat
)
;
_draw
->
D3DBox
(
_pos
.
x
+
3
+
rollerOffset
-
so_H
,
(
_pos
.
y
+
_size
.
y
+
2
)
-
so_V
,
rollerSize
,
2
,
_scrollRoller
)
;
}
so_V и so_H тебе не нужны скорее всего - можешь их просто удалить или передавать нули.
Прокрутка:
C++:
switch
(
uMsg
)
{
case
WM_MOUSEWHEEL
:
if
(
GET_WHEEL_DELTA_WPARAM
(
wParam
)
_scrollSizeVertical
)
_scrollOffsetVertical
=
_scrollSizeVertical
-
_size
.
y
;
}
else
{
_scrollOffsetVertical
-=
_scrollStep
;
if
(
_scrollOffsetVertical
_scrollSizeVertical
)
_scrollOffsetVertical
=
_scrollSizeVertical
-
_size
.
y
;
return
false
;
case
VK_LEFT
:
_scrollOffsetHorizontal
-=
_scrollStep
;
if
(
_scrollOffsetHorizontal
_scrollSizeHorizontal
)
_scrollOffsetHorizontal
=
_scrollSizeHorizontal
-
_size
.
x
;
return
false
;
case
VK_PRIOR
:
_scrollOffsetVertical
=
0
;
return
false
;
case
VK_NEXT
:
_scrollOffsetVertical
=
_scrollSizeVertical
-
_size
.
y
;
return
false
;
case
VK_HOME
:
_scrollOffsetHorizontal
=
0
;
return
false
;
case
VK_END
:
_scrollOffsetHorizontal
=
_scrollSizeHorizontal
-
_size
.
x
;
return
false
;
default
:
break
;
}
break
;
default
:
break
;
}
Размер скролла у меня указывается в пикселях, но можно притянуть и строки.
Благодарю , но оказывается , было вроде как все правильно , просто ползнунок оставался на том же месте , пока до него не дотронешься...
medvedko
26.06.2017, 13:11
Как загрузить и отрисовать текстуру с помощью SFAPI? К примеру Дигла. Спасибо.
iAmerican
26.06.2017, 13:14
Как загрузить и отрисовать текстуру с помощью SFAPI? К примеру Дигла. Спасибо.
А в чем проблема то?
В VS нажимаешь Добавить-> Новый объект -> Файл ресурсов .rc
Открываешь его дабл кликом, если он сам не открылся.
Добавляешь ресурс вот так
http://dl4.joxi.net/drive/2017/06/21/0019/1640/1300072/72/d753f5e4aa.png
В окошке нажимаешь импорт, выбираешь картинку где-угодно и пишешь тип ресурса RCDATA
Далее просто открыть эту папку(RCDATA) в этом же "окошке" и посмотреть/поменять id ресурса: по умолчанию это IDR_RCDATA1, 2 итд
К примеру, я изменил имя на IDR_LANDSCAPE
Ну и аналогично тому, как и происходит рендер с файла, объявить callback и переменные. Загрузить так (даже никаких макросов на преобразование в LPTSTR не нужно):
pTexture = SF->getRender()->LoadTextureFromResource(IDR_LANDSCAPE, -1);
Результат очевиден:
http://dl3.joxi.net/drive/2017/06/21/0019/1640/1300072/72/3486a93e8d.png
medvedko
26.06.2017, 13:29
А нельзя ли это завязать не на ресурсах проекта, а на внутриигровых текстурах? Да бы вызывать его по иду.
Как сделать кнопку (и вещи, когда я ее нажимаю)?
DarkP1xel
27.06.2017, 17:48
Как сделать кнопку (и вещи, когда я ее нажимаю)?
Какую кнопку, какие вещи?
Sonik Mells
27.06.2017, 20:02
Показываю своё меню на рендере (SF), мышь показываю путем SF->getSAMP()->getMisc()->ToggleCursor(true);, вопрос! Как отловить нажатие ESC, дабы скрыть курсор с меню моим, блокируя показ игрового меню?
Dark_Knight
27.06.2017, 20:31
SF->getGame()-isActiveMenu()
Sonik Mells
27.06.2017, 23:58
SF->getGame()-isActiveMenu()
Но это открытое меню! Мне требуется, не допускать его открытия.
MISTER_GONWIK
28.06.2017, 00:28
Показываю своё меню на рендере (SF), мышь показываю путем SF->getSAMP()->getMisc()->ToggleCursor(true);, вопрос! Как отловить нажатие ESC, дабы скрыть курсор с меню моим, блокируя показ игрового меню?
wndproc хукани и там обрывай
Как получить адрес символьного массива? (через & не хочет, ошибка)
Roger571
28.06.2017, 14:06
help me
Пытаюсь подменить дополнительные цвета SAMPа на свои, но все хорошо до какого-то момента.
Начинаю подменять с адреса 0xB4E67C 128 цветов, примерно так:
C++:
[CODE]
int
iPoint
=
0xB4E67C
;
for
(
int
i
=
0
;
i
Если попробовать инициализировать это во время загрузки - краш по адресу 0x004C74B8
Если попробовать во время игры, варнинги в чат и затем краш. Тоже самое, если заставить игру загружать кастомный carcols.dat
С установленным антикрашем, варнинги в чат летят, но при этом цвета работают правильно
Так же путем экспериментов выяснил, что если в blue подставить число большее 235, все заработает. При этом цвета подменяются правильно и без краша, если не подменять больше 53.
UPD
Остальные цвета нормально прописываются после коннекта/полного подключения samp.dll
UPD2
Работает без крашей только для уже созданных авто, при создании новых авто появяются варнинги по адресу 4C74E1
Sonik Mells
29.06.2017, 02:45
wndproc хукани и там обрывай
Все работает, но мне глобальные нажатия на... не нужны. А локальные(для нашего процесса) не получается осуществить.
C++:
HHOOK keyboardHook
;
LRESULT CALLBACK
KeyboardProc
(
int
nCode
,
WPARAM wParam
,
LPARAM lParam
)
{
if
(
wParam
==
WM_KEYDOWN
&&
nCode
==
HC_ACTION
)
{
PKBDLLHOOKSTRUCT key
=
(
PKBDLLHOOKSTRUCT
)
lParam
;
printf
(
"key: %i\n"
,
key
->
vkCode
)
;
}
return
CallNextHookEx
(
keyboardHook
,
nCode
,
wParam
,
lParam
)
;
}
int
main
(
)
{
keyboardHook
=
SetWindowsHookEx
(
WH_KEYBOARD_LL
,
KeyboardProc
,
NULL
,
NULL
)
;
return
0
;
}
Можно с проверкой if(GAME->IsInForeground()), но что то меня такой вариант не привлекает.
MISTER_GONWIK
29.06.2017, 07:44
Все работает, но мне глобальные нажатия на... не нужны. А локальные(для нашего процесса) не получается осуществить.
C++:
HHOOK keyboardHook
;
LRESULT CALLBACK
KeyboardProc
(
int
nCode
,
WPARAM wParam
,
LPARAM lParam
)
{
if
(
wParam
==
WM_KEYDOWN
&&
nCode
==
HC_ACTION
)
{
PKBDLLHOOKSTRUCT key
=
(
PKBDLLHOOKSTRUCT
)
lParam
;
printf
(
"key: %i\n"
,
key
->
vkCode
)
;
}
return
CallNextHookEx
(
keyboardHook
,
nCode
,
wParam
,
lParam
)
;
}
int
main
(
)
{
keyboardHook
=
SetWindowsHookEx
(
WH_KEYBOARD_LL
,
KeyboardProc
,
NULL
,
NULL
)
;
return
0
;
}
Можно с проверкой if(GAME->IsInForeground()), но что то меня такой вариант не привлекает.
У сфа есть свой хук, его и используй
Sonik Mells
29.06.2017, 10:47
У сфа есть свой хук, его и используй
Видел SF->getGame()->createHook(), но не разобрался с ней! Не сложно помочь?
Видел SF->getGame()->createHook(), но не разобрался с ней! Не сложно помочь?
SF->registerWndProc(...) вроде
Dark_Knight
29.06.2017, 11:19
SF->registerWndProc(...) вроде
SF->getGame()
Sonik Mells
29.06.2017, 11:30
SF->getGame()
Я уже нашел и сделал все) почти все)
C++:
if
(
uMsg
==
WM_KEYDOWN
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
80
,
0xEA
,
100
)
,
"out: %i"
,
wParam
)
;
}
SF
->
getGame
(
)
->
registerWndProcCallback
(
SFGame
::
WndProcCallbackPriority
::
HIGH_CB_PRIORITY
,
WndProc
)
;
Теперь вопрос, а как LMENU(LAlt) отловить? не выводит его.
И какой HIGH_CB_...правильней использовать?
Пока, только так придумал
C++:
bool
CALLBACK
SendPacket
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ID_PLAYER_SYNC
)
{
stOnFootData data
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
IgnoreBits
(
8
)
;
params
->
bitStream
->
Read
(
(
PCHAR
)
&
data
,
sizeof
(
data
)
)
;
if
(
data
.
sKeys
==
1024
)
{
return
true
;
}
}
return
true
;
}
Alfinity
30.06.2017, 13:24
Теперь вопрос, а как LMENU(LAlt) отловить? не выводит его.
в mainloop
C++:
if
(
SF
->
getGame
(
)
->
isKeyDown
(
18
)
)
{
//something
}
C++:
[CODE]
for
(
int
i
=
dstart
;
i
делая шаг по байту, проходит память модуля, и должно записывать данные в массив, но почему-то записываются лишь первые 4 и последние 2
http://i12.pixs.ru/storage/0/9/0/13png_7019242_26741090.png (https://www.blast.hk/redirect/aHR0cDovL3BpeHMucnUvc2hvd2ltYWdlLzEzcG5nXzcwMTkyND JfMjY3NDEwOTAucG5n)
по логике, должно проходить по одному байту, и записывать данные, смещая их с начала в конец (или наоборот, не важно), т.к. записывает одно и тоже,с разностью в один конечный/начальный байт, но пишет не в каждый, и это меня убивает - не могу исправить, вот и всё. Знает кто, в чём ошибка? ._.
upd вместо 14 байт, я пробовал ставить sizeof(snzh) (т.к. это адрес массива), но результат не менялся
itsLegend
02.07.2017, 22:24
Хз чё ты делаешь, но strcmp для сравнивания строк, а не байт. Если всё таки нужно сравнивать строки, то в каждую записывай \0 в конец.
Хз чё ты делаешь, но strcmp для сравнивания строк, а не байт. Если всё таки нужно сравнивать строки, то в каждую записывай \0 в конец.
Вообще у меня проблема не в сравнении, а в том что записывает не во весь массив, но в первые 4 и последние 2 байта
(кстати насчёт нуля, в массиве в конце ноль есть, просто лапы из попы и я обрезал скрин так, что один байт потерялся)
itsLegend
03.07.2017, 00:22
Ты получаешь ссылку на переменную i, а не адрес, хранимый в ней.
Преобразовывай к LPCVOID.
Ты получаешь ссылку на переменную i, а не адрес, хранимый в ней.
Преобразовывай к LPCVOID.
(void*)i - так?
itsLegend
03.07.2017, 01:23
(LPCVOID)i или (const void*)i, желательно.
(LPCVOID)i или (const void*)i, желательно.
ещё вопрос.
насколько я знаю, что имеет приставку lpc - это указатели.
так чем отличаются void*, и LPCVOID?
itsLegend
03.07.2017, 01:30
LPCVOID
https://msdn.microsoft.com/en-us/library/dn363584.aspx (https://www.blast.hk/redirect/aHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicm FyeS9kbjM2MzU4NC5hc3B4)
https://stackoverflow.com/questions/5547131/c-question-const-void-vs-void (https://www.blast.hk/redirect/aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNT U0NzEzMS9jLXF1ZXN0aW9uLWNvbnN0LXZvaWQtdnMtdm9pZA)
https://msdn.microsoft.com/en-us/library/dn363584.aspx (https://www.blast.hk/redirect/aHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicm FyeS9kbjM2MzU4NC5hc3B4)
https://stackoverflow.com/questions/5547131/c-question-const-void-vs-void (https://www.blast.hk/redirect/aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNT U0NzEzMS9jLXF1ZXN0aW9uLWNvbnN0LXZvaWQtdnMtdm9pZA)
понятно. значит C в этом указателе означает что он константный. Спасибо, всё понял! Мур тебе
Cer20124
07.07.2017, 17:51
Проблема такова сделал я скиллбот ( Ну как сделал нашел src :crazy: ). Сделан он с помощю keybd_event
Вот весь код:
Код:
[CODE]
void cheat_handle_skillbot()
{
if (cheat_state->actor.skillbot == 1)
{
static DWORD dwTime = GetTickCount();
static int action = 0;
if (cheat_state->actor.skillbot == 1 && dwTime actor.skillbot == 1 && dwTime
Проблема в том что кнопка не нажимается
C++:
[CODE]
void
cheat_handle_skillbot
(
)
{
static
DWORD dwTime
=
GetTickCount
(
)
;
static
int
action
=
0
;
if
(
cheat_state
->
actor
.
skillbot
==
1
&&
dwTime
actor
.
skillbot
==
0
&&
dwTime
Cer20124
07.07.2017, 18:20
[QUOTE="return"]
C++:
[CODE]
void
cheat_handle_skillbot
(
)
{
static
DWORD dwTime
=
GetTickCount
(
)
;
static
int
action
=
0
;
if
(
cheat_state
->
actor
.
skillbot
==
1
&&
dwTime
actor
.
skillbot
==
0
&&
dwTime
Можно попробовать убрать таймер. Оружие всё равно не будет стрелять быстрей чем дефолт.
C++:
void
cheat_handle_skillbot
(
)
{
static
int
action
=
0
;
if
(
cheat_state
->
actor
.
skillbot
==
1
&&
action
==
0
)
{
keybd_event
(
VK_CONTROL
,
0
,
0
,
0
)
;
action
=
1
;
}
if
(
cheat_state
->
actor
.
skillbot
==
0
&&
action
==
1
)
{
keybd_event
(
VK_CONTROL
,
0
,
KEYEVENTF_KEYUP
,
0
)
;
action
=
0
;
}
}
Cer20124
07.07.2017, 18:29
Можно попробовать убрать таймер. Оружие всё равно не будет стрелять быстрей чем дефолт.
C++:
void
cheat_handle_skillbot
(
)
{
static
int
action
=
0
;
if
(
cheat_state
->
actor
.
skillbot
==
1
&&
action
==
0
)
{
keybd_event
(
VK_CONTROL
,
0
,
0
,
0
)
;
action
=
1
;
}
if
(
cheat_state
->
actor
.
skillbot
==
0
&&
action
==
1
)
{
keybd_event
(
VK_CONTROL
,
0
,
KEYEVENTF_KEYUP
,
0
)
;
action
=
0
;
}
}
он все ровно не жмет кнопку
он все ровно не жмет кнопку
у меня всё жмёт
Cer20124
07.07.2017, 18:33
у меня всё жмёт
А там ни каких библиотек подключать не надо?
Cer20124
07.07.2017, 18:40
User32.lib
Код:
#pragma comment (lib, "User32.lib")
та же фигня
блин пишу тот же код в чистом консольном проекте все работает, а тут нет. Что делать?
Как правильно парсить строки через sscanf?
Допустим есть
C++:
char
buff
[
150
]
,
arr1
[
50
]
,
arr2
[
50
]
,
arr3
[
50
]
;
strcpy
(
buff
,
"qq;qqept;pituh"
)
;
sscanf
(
buff
,
"%49[^;]%49[^;]%49[^;]"
,
arr1
,
arr2
,
arr3
)
;
Но почему то неправильно считывает:hunter:
Sonik Mells
09.07.2017, 20:02
Как правильно парсить строки через sscanf?
C++:
char
buff
[
150
]
,
arr1
[
50
]
,
arr2
[
50
]
,
arr3
[
50
]
;
strcpy
(
buff
,
"qq;qqept;pituh"
)
;
sscanf
(
buff
,
"%[^;];%[^;];%[^;]"
,
arr1
,
arr2
,
arr3
)
;
kawa operand
13.07.2017, 20:04
Подскажите синтаксис
0AA6: call_method $Destroy struct $CarStruct num_params 0 pop 0
В С++
BlackKnigga
13.07.2017, 20:13
structura.metod()
structura::method()
By https://www.blast.hk/threads/10/
kawa operand
13.07.2017, 21:42
structura.metod()
structura::method()
By https://www.blast.hk/threads/10/
Структура не является пространством имен
BlackKnigga
13.07.2017, 22:06
Структура не является пространством имен
Значит structura.metod()
kawa operand
13.07.2017, 22:16
Значит structura.metod()
Так тоже не работает
BlackKnigga
13.07.2017, 22:21
Так тоже не работает
Ты как делаешь то?
kawa operand
13.07.2017, 22:48
Ты как делаешь то?
HMODULE SAMPBASE = GetModuleHandle("samp.dll");
int structure = (int)SAMPBASE + 0x21A0F8;
structure = *(DWORD*)structure;
structure += 0x3CD;
structure = *(DWORD*)structure;
structure += 0x18;
structure = *(DWORD*)structure;
structure += 0x22;
structure = *(DWORD*)structure;
// SF->getSAMP()->getChat()->AddChatMessage(RGB(0x77, 0x77, 0x77), "%X", structure);
int method = (int)SAMPBASE + 0x3ad0;
И это нужно отправить, но я хз как
NarutoUA
13.07.2017, 23:17
Структура не является пространством имен
Ну ващет в структуры можно пихать статик методы и вызывать их так.
BlackKnigga
13.07.2017, 23:36
HMODULE SAMPBASE = GetModuleHandle("samp.dll");
int structure = (int)SAMPBASE + 0x21A0F8;
structure = *(DWORD*)structure;
structure += 0x3CD;
structure = *(DWORD*)structure;
structure += 0x18;
structure = *(DWORD*)structure;
structure += 0x22;
structure = *(DWORD*)structure;
// SF->getSAMP()->getChat()->AddChatMessage(RGB(0x77, 0x77, 0x77), "%X", structure);
int method = (int)SAMPBASE + 0x3ad0;
И это нужно отправить, но я хз как
Погугли вызов thiscall функций
kawa operand
13.07.2017, 23:38
Ты как делаешь то?
Ну ващет в структуры можно пихать статик методы и вызывать их так.
Приведите пример, Наруто-сама
NarutoUA
13.07.2017, 23:43
Приведите пример, Наруто-сама
C++:
struct
Example
{
static
void
Foo
(
)
{
printf
(
"HelloWorld"
)
;
}
}
;
Example
::
Foo
(
)
;
Example obj
;
obj
::
Foo
(
)
;
kawa operand
13.07.2017, 23:48
C++:
struct
Example
{
static
void
Foo
(
)
{
printf
(
"HelloWorld"
)
;
}
}
;
Example
::
Foo
(
)
;
Example obj
;
obj
::
Foo
(
)
;
Не совсем понимаю как использовать это с моим кодом
NarutoUA
13.07.2017, 23:50
Не совсем понимаю как использовать это с моим кодом
Открой собейт и посмотри как там
C++:
const
char
procName
[
]
=
"launcher.exe"
;
C++:
DWORD PID
=
processIdPlease
(
procName
)
;
C++:
WORD
processIdPlease
(
const
char
*
__processName
)
выдаёт ошибку c2660, функция не принимает аргумент, при том что красным не подсвечено. Как передать символьный массив в функцию?
C++:
const
char
procName
[
]
=
"launcher.exe"
;
C++:
DWORD PID
=
processIdPlease
(
procName
)
;
C++:
WORD
processIdPlease
(
const
char
*
__processName
)
выдаёт ошибку c2660, функция не принимает аргумент, при том что красным не подсвечено. Как передать символьный массив в функцию?
в этом коде всё верно
Помогите с хуком на трассер пуль. Ср тим делал такую шнягу как HOOKS ну вообщем я попробовал по его видеоуроку разработки буллет конфига и позаимствовал хук на BULLET_TO - что я хочу? Перезаписывать все трассеры пулек в свою сторону.
Не суть вообщем, почему то во время выстрела я получаю краш(
C++:
#include "HOOKS.h"
CHOOKS
*
Hook
=
new
CHOOKS
(
)
;
#define ADDR_BULLET_TO 0x007238B4
DWORD dwBullet_addr
,
jaddr1
;
CVector BulletEnd
;
// В хуке исходящей буллет синхры читаю коорды с fTarget
BulletEnd
=
*
(
CVector
*
)
bullet
.
fTarget
+
*
(
CVector
*
)
bullet
.
fCenter
;
// так если byteType != 1
BulletEnd
=
*
(
CVector
*
)
bullet
.
fTarget
;
// так если пули летели бы в чела
void
_declspec
(
naked
)
BulletHOOK
(
)
{
__asm
{
pushad
pushfd
mov dwBullet_addr
,
esi
}
*
(
CVector
*
)
dwBullet_addr
=
BulletEnd
;
__asm
{
popfd
popad
jmp jAddr1
}
}
// в моем mainloop`e
jAddr1
=
Hook
->
CreateHOOK
(
ADDR_BULLET_TO
,
(
DWORD
)
BulletHOOK
,
Jump
,
8
)
;
// в моем деструкторе
delete
Hook
;
Petr_Sergeevich
18.07.2017, 20:17
Извините, пожалуйста, за глупые вопросы, но..
1. Какая среда используется для разработки .sf плагинов?
2. Порекомендуйте компилятор для своих говнокодов. (MS Visual Studio не тянет железо)
А вот этот вопрос задаю не потому, что не знаю, а потому, что интересно..
1. Каким образом вы изучали C++? По каким источникам, книгам? Где практиковались?
Dark_Knight
18.07.2017, 20:25
Помогите с хуком на трассер пуль. Ср тим делал такую шнягу как HOOKS ну вообщем я попробовал по его видеоуроку разработки буллет конфига и позаимствовал хук на BULLET_TO - что я хочу? Перезаписывать все трассеры пулек в свою сторону.
Не суть вообщем, почему то во время выстрела я получаю краш(
Что ты конкретно хочешь? Может проще будет через перезапись пакета.
Извините, пожалуйста, за глупые вопросы, но..
1. Какая среда используется для разработки .sf плагинов?
2. Порекомендуйте компилятор для своих говнокодов. (MS Visual Studio не тянет железо)
А вот этот вопрос задаю не потому, что не знаю, а потому, что интересно..
1. Каким образом вы изучали C++? По каким источникам, книгам? Где практиковались?
Проект настроен под ВС 2013(на счет 2013 не уверен).
пробуй кодеблок, но придется с настройкой поебатся.
Гугл, мсдн.
Что ты конкретно хочешь? Может проще будет через перезапись пакета.
Не будет. Потому что я хочу перезаписать трассер пули чисто на стороне клиента - мне для видеосъемок нужно чтобы не палили что я в стенку хуячу с аимами. Я ж то свой трейсер переместить хочу а не вражеский / или наоборот врагу на синхре.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot