Просмотр полной версии : SAMPFUNCS | API C++
Страницы :
1
2
3
4
5
6
[
7]
8
Dark_Knight
18.06.2016, 20:11
https://docs.google.com/spreadsheets/d/1iIxEk7yR8r7ZLGiSAL4ndtz_N1k0p3Wt7TE5bei6ztU/edit#gid=1 (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2 QvMWlJeEVrN3lSOHI3WkxHaVNBTDRuZHR6X04xazBwM1d0N1RF NWJlaTZ6dFUvZWRpdCNnaWQ9MQ)
То есть иды в этом перечне просто ошибка автора? На сколько знаю для исходнящего рпц ид не нужен, а для входящих да но не для всех.
Затупил немного. Легенд уже на ошибку указал.
Woofing Giraffe
19.06.2016, 16:09
как узнать что я в определённом радиусе от пикапа?
Ну так расстояние до пикапа посчитай
DarkExorcist
20.06.2016, 15:02
Как проверить, что игрок целится?
Возможно ли переместить радар через SF?
Возможно ли переместить радар через SF?
возможно. 7 хуков кажется надо поставить
возможно. 7 хуков кажется надо поставить
Ебать :D Можешь сказать каких?)
Ебать :D Можешь сказать каких?)
Сэр, боюсь вам не стоит заниматься программированием.
Ебать :D Можешь сказать каких?)
https://prime-hack.net/threads/mc_hud-2-5.2126/ (https://www.blast.hk/redirect/aHR0cHM6Ly9wcmltZS1oYWNrLm5ldC90aHJlYWRzL21jX2h1ZC 0yLTUuMjEyNi8)
Vadim.dll
25.06.2016, 14:12
Как получить кординаты маркера на карте, который на пкм ставиться
DarkP1xel
25.06.2016, 15:33
Как получить кординаты маркера на карте, который на пкм ставиться
https://www.blast.hk/threads/10970/#post-103571
Vadim.dll
26.06.2016, 11:48
Как создать новый поток можно подробнее?
Dark_Knight
26.06.2016, 13:20
_beginthread
Vadim.dll
26.06.2016, 13:26
Спасибо
Gabriel__
26.06.2016, 21:53
#define PedSoft 0x01
#define FreezePed 0x02
#define BulletProtect 0x04
#define FireProtect 0x08
#define CollisionProtect 0x10
#define MeleeProtect 0x20
#define Unc_7bit 0x40
#define ExplosionProtect 0x80
SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped->flags = BulletProtect + MeleeProtect; //защита от пуль и ударов
SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped->vehicle->flags = CollisionProtect; //защита от столкновений (машина игрока)
Что это за флаги Unc_7bit и PedSoft ?
Когда ставишь PedSoft игрок потихоньку проваливается под текстуры.
И когда ставлю все иммунитеты игрока замораживает через ~10 секунд(блокируется управление совсем).
И как бы это глупо не звучало. И когда делаешь такой код другие флаги снимаются ? Думаю да. И как этого избежать.
C++:
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
->
flags
=
BulletProtect
+
MeleeProtect
+
CollisionProtect
+
ExplosionProtect
+
FireProtect
;
как этого избежать
+ замены на |
Unc_7bit
Должно быть Unk_7bit, это опечатка - значение данного бита мне не известно
PedSoft
игрок потихоньку проваливается под текстуры.
именно это и делает, игрок становится аморфным.
когда ставлю все иммунитеты игрока замораживает
FreezePed это не иммунитет, а заморозка игрока
Gabriel__
26.06.2016, 22:23
FreezePed это не иммунитет, а заморозка игрока
Знаю.
Сделал так.
C++:
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
->
flags
=
BULLET_PROOF
|
MELEE_PROOF
|
COLISION_PROOF
|
EXPLOSION_PROOF
|
FIRE_PROOF
;
Но все равно замораживает вообще все кнопки в игре блокирует. Во время юзания AirBreak'a. Обнуляю флаги размораживает. Че за х**** творится.
Знаю.
Сделал так.
C++:
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pLocalPlayer
->
pSAMP_Actor
->
pGTA_Ped
->
flags
=
BULLET_PROOF
|
MELEE_PROOF
|
COLISION_PROOF
|
EXPLOSION_PROOF
|
FIRE_PROOF
;
Но все равно замораживает вообще все кнопки в игре блокирует. Во время юзания AirBreak'a. Обнуляю флаги размораживает. Че за х**** творится.
проверь значения своих констант
Gabriel__
26.06.2016, 22:53
проверь значения своих констант
Все верно.
C++:
#define PEDSOFT 0x01
#define FREEZE_PED 0x02
#define BULLET_PROOF 0x04
#define FIRE_PROOF 0x08
#define COLISION_PROOF 0x10
#define MELEE_PROOF 0x20
#define Unc_7bit 0x40
#define EXPLOSION_PROOF 0x80
И еще вопрос: А как снять один из флагов ?
как снять один из флагов ?
flags ^= флаг_который_надо_снять
flags ^= флаг_который_надо_снять
хотя лучше наверно будет так:
flags &= !флаг_который_надо_снять
Ты в маске и к тебе в стрим зашел новый игрок, которого не было до момент её надевания. Как я узнаю его цвет, если сервер прислал, что у него черный цвет.
Легко. Он будет записан в структуре. В табе же он остается.
Gabriel__
27.06.2016, 12:51
Как проверить что между двумя точками или игроками нет стен или объектов. Как опкод в клео
06BD: no_obstacles_between 67@ 68@ 69@ and 287@ 288@ 289@ solid 1 car 0 actor 0 object 0 particle 0
itsLegend
27.06.2016, 14:14
GAME->GetWorld()->ProcessLineOfSight( const CVector * vecStart, const CVector * vecEnd, CColPoint ** colCollision, CEntity ** CollisionEntity, const SLineOfSightFlags flags = SLineOfSightFlags(), SLineOfSightBuildingResult* pBuildingResult = NULL )
Gabriel__
28.06.2016, 12:01
GAME->GetWorld()->ProcessLineOfSight( const CVector * vecStart, const CVector * vecEnd, CColPoint ** colCollision, CEntity ** CollisionEntity, const SLineOfSightFlags flags = SLineOfSightFlags(), SLineOfSightBuildingResult* pBuildingResult = NULL )
Понял вот что.
Код:
const CVector * vecStart - это координаты первой точки.
const CVector * vecEnd - координаты второй точки.
CColPoint ** colCollision - коллизия чего-то.
CEntity ** CollisionEntity - коллизия какой-то сущности.
const SLineOfSightFlags flags = SLineOfSightFlags() - это структура с флагами для анализа.
SLineOfSightBuildingResult* pBuildingResult = NULL - это структура которая примет результат анализа.
Все верно понял ? Покажите простой пример пожалуйста.
Vadim.dll
28.06.2016, 12:31
Как узнать свой Score адресом памяти?
Как узнать свой Score адресом памяти?
Нет определенного адреса. По крайне мере, я его не знаю. Твой Score находится в структуре PlayerPool, которая находится в структуре SAMPools, которая находится в SAMPInfo. Если юзаешь SF, то вроде так: SF->getSAMP()->getInfo()->pPools->pPlayers->LocalPlayerScore.
Нет определенного адреса. По крайне мере, я его не знаю. Твой Score находится в структуре PlayerPool, которая находится в структуре SAMPools, которая находится в SAMPInfo. Если юзаешь SF, то вроде так: SF->getSAMP()->getInfo()->pPools->pPlayers->LocalPlayerScore.
Не наебывай честный народ. Если блять в структуре хранится лвл, то какого хуя эта структура и ее елемент не могут иметь адреса? С помощью указателя можно адрес элемента получить.
Не наебывай честный народ. Если блять в структуре хранится лвл, то какого хуя эта структура и ее елемент не могут иметь адреса? С помощью указателя можно адрес элемента получить.
Можно. Но этот адрес не статический, с каждым новым запуском игры этот элемент будет на разных адресах. А он просит чтобы можно было считать как, например, HP.
Можно. Но этот адрес не статический, с каждым новым запуском игры этот элемент будет на разных адресах. А он просит чтобы можно было считать как, например, HP.
GetModuleHandle("samp.dll") + полученый адрес
NarutoUA
28.06.2016, 17:49
GetModuleHandle("samp.dll") + полученый адрес
Ну иди ищи сам, хули ты такой умный? Берешь в СЕ ищешь число попутно убивая кого-то на дм сервере
MISTER_GONWIK
28.06.2016, 18:05
Как узнать свой Score адресом памяти?
это лишь пример, на деле получать адрес samp.dll, pSAMPInfo, pSAMPPools и pPlayerPool желательно глобально
p.s. код кстати дерьмо, можно было в разы лучше
C++:
int
GetPlayerScore
(
)
{
DWORD dwSAMPAddr
=
(
DWORD
)
GetModuleHandle
(
"samp.dll"
)
;
if
(
!
dwSAMPAddr
)
return
-
1
;
DWORD
*
pSAMPInfo
=
(
DWORD
*
)
(
dwSAMPAddr
+
0x21A0F8
)
;
if
(
pSAMPInfo
==
nullptr
)
return
-
1
;
DWORD
*
pSAMPPools
=
(
DWORD
*
)
(
*
pSAMPInfo
+
0x3CD
)
;
if
(
pSAMPPools
==
nullptr
)
return
-
1
;
DWORD
*
pPlayerPool
=
(
DWORD
*
)
(
*
pSAMPPools
+
0x18
)
;
if
(
pPlayerPool
==
nullptr
)
return
-
1
;
DWORD
*
pLocalPlayerScore
=
(
DWORD
*
)
(
*
pPlayerPool
+
0x2A
)
;
if
(
pLocalPlayerScore
==
nullptr
)
return
-
1
;
return
*
pLocalPlayerScore
;
}
Ну иди ищи сам, хули ты такой умный? Берешь в СЕ ищешь число попутно убивая кого-то на дм сервере
Так мне это на*** не надо. Хули ты бесишся.
Vadim.dll
28.06.2016, 20:00
это лишь пример, на деле получать адрес samp.dll, pSAMPInfo, pSAMPPools и pPlayerPool желательно глобально
p.s. код кстати дерьмо, можно было в разы лучше
C++:
int
GetPlayerScore
(
)
{
DWORD dwSAMPAddr
=
(
DWORD
)
GetModuleHandle
(
"samp.dll"
)
;
if
(
!
dwSAMPAddr
)
return
-
1
;
DWORD
*
pSAMPInfo
=
(
DWORD
*
)
(
dwSAMPAddr
+
0x21A0F8
)
;
if
(
pSAMPInfo
==
nullptr
)
return
-
1
;
DWORD
*
pSAMPPools
=
(
DWORD
*
)
(
*
pSAMPInfo
+
0x3CD
)
;
if
(
pSAMPPools
==
nullptr
)
return
-
1
;
DWORD
*
pPlayerPool
=
(
DWORD
*
)
(
*
pSAMPPools
+
0x18
)
;
if
(
pPlayerPool
==
nullptr
)
return
-
1
;
DWORD
*
pLocalPlayerScore
=
(
DWORD
*
)
(
*
pPlayerPool
+
0x2A
)
;
if
(
pLocalPlayerScore
==
nullptr
)
return
-
1
;
return
*
pLocalPlayerScore
;
}
Спасибо!!!!!!
Vadim.dll
28.06.2016, 20:02
Как получить инфу из текстдрава?
Dark_Knight
28.06.2016, 20:44
Получить структуру текстдрава.
Как получить инфу из текстдрава?
Или рпц шовтекстдрав прочитать.
Woofing Giraffe
29.06.2016, 00:00
http://cs631322.vk.me/v631322142/2464f/K9PyCknLZbQ.jpg
В чём причина? Не могу поменять выходной каталог
Dark_Knight
29.06.2016, 02:59
Поставь русский язык. Потом скажу что сделать надо.
Vadim.dll
29.06.2016, 08:47
http://cs631322.vk.me/v631322142/2464f/K9PyCknLZbQ.jpg
В чём причина? Не могу поменять выходной каталог
У меня такая же фигня и кстати я русский язык поставил но ошибка на английском всеровно
Vadim.dll
29.06.2016, 08:51
Как поставить хук на адрес сампа?
Вот на этот допустим #define SAMP_HOOKENTER_STATECHANGE 0x12B82
Dark_Knight
29.06.2016, 12:46
У меня такая же фигня и кстати я русский язык поставил но ошибка на английском всеровно
Вот это (https://www.blast.hk/redirect/aHR0cHM6Ly95YWRpLnNrL2kvUnFlaWotdHVzc1RwYQ) дописать надо и будет все нормально. Так можно вписать вручную это. Находите "название проекта.vcxproj" и во вкладке "PropertyGroup Label="Globals" вписываешь это
"8.1"
Vadim.dll
29.06.2016, 13:48
Вот это (https://www.blast.hk/redirect/aHR0cHM6Ly95YWRpLnNrL2kvUnFlaWotdHVzc1RwYQ) дописать надо и будет все нормально. Так можно вписать вручную это. Находите "название проекта.vcxproj" и во вкладке "PropertyGroup Label="Globals" вписываешь это
"8.1"
Спасибо!
А что на счет хука?
Vadim.dll
29.06.2016, 14:00
Как получить ид текстдрава который отображен в данный момент?
А что на счет хука?
Да так же как и на любой другой адрес
Vadim.dll
29.06.2016, 15:57
А как на другой любой адрес? Я выше писал
Vadim.dll
29.06.2016, 19:02
SR_team Воот нашел твою библиотеку тут https://www.blast.hk/threads/12462/ помоему это прямо то, что мне нужно, не подскажешь как пользоваться?
Вот на этот адресс например #define SAMP_HOOKENTER_STATECHANGE 0x12B82
SR_team Воот нашел твою библиотеку тут https://www.blast.hk/threads/12462/ помоему это прямо то, что мне нужно, не подскажешь как пользоваться?
Вот на этот адресс например #define SAMP_HOOKENTER_STATECHANGE 0x12B82
Пока лучше не юзай, я потом перезалью с имправленным деструктором
Gabriel__
30.06.2016, 15:15
Объясните как пользоваться функцией ProcessLineOfSight.
Как проверить открыт ли какой-либо диалог?
---------------
Понял как сделать проверку:
C++:
if
(
SF
->
getSAMP
(
)
->
getDialog
(
)
->
DialogID
!=
0
)
{
//код
}
else
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"Диалог не открыт"
)
;
}
Но есть проблема, если открыть диалог, вызвать эту проверку, закрыть диалог и снова вызвать, он не очищает предыдущий ид диалога.
itsLegend
30.06.2016, 15:45
if (SF->getSAMP()->getDialog()->iIsActive == 1)
if (SF->getSAMP()->getDialog()->iIsActive == 1)
Хм... Спасибо, что-то я даже и не заметил этого параметра.
Еще такой вопрос, как открыть диалог скрыто? Т.е. пользователь не заметит открываемого диалога.
itsLegend
30.06.2016, 17:59
Не показывать его
Не показывать его
А можно подробней?
Столкнулся с такой проблемой, диалог открывается слишком долго и SF->getSAMP()->getDialog()->pText пытается считать текст раньше открывшегося диалога. Как можно поправить ситуацию?
А можно подробней?
Столкнулся с такой проблемой, диалог открывается слишком долго и SF->getSAMP()->getDialog()->pText пытается считать текст раньше открывшегося диалога. Как можно поправить ситуацию?
Хук поставь на rpc диалога
Хук поставь на rpc диалога
Уже поставил, осталось понять как вытащить сообщение.
C++:
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrShowDialog
)
{
stSAMPDialog sampDialog
;
params
->
bitStream
->
Read
(
sampDialog
.
wDialogID
)
;
params
->
bitStream
->
Read
(
sampDialog
.
bDialogStyle
)
;
params
->
bitStream
->
Read
(
sampDialog
.
bTitleLength
)
;
params
->
bitStream
->
Read
(
sampDialog
.
szTitle
,
sampDialog
.
bTitleLength
)
;
sampDialog
.
szTitle
[
sampDialog
.
bTitleLength
]
=
0
;
params
->
bitStream
->
Read
(
sampDialog
.
bButton1Len
)
;
params
->
bitStream
->
Read
(
sampDialog
.
szButton1
,
sampDialog
.
bButton1Len
)
;
sampDialog
.
szButton1
[
sampDialog
.
bButton1Len
]
=
0
;
params
->
bitStream
->
Read
(
sampDialog
.
bButton2Len
)
;
params
->
bitStream
->
Read
(
sampDialog
.
szButton2
,
sampDialog
.
bButton2Len
)
;
sampDialog
.
szButton2
[
sampDialog
.
bButton2Len
]
=
0
;
//stringCompressor->DecodeString(sampDialog.szInfo, 256, &bsData);
params
->
bitStream
->
Read
(
sampDialog
.
bText
)
;
params
->
bitStream
->
Read
(
sampDialog
.
szText
,
sampDialog
.
bText
)
;
sampDialog
.
szText
[
sampDialog
.
bText
]
=
0
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
sampDialog
.
szText
)
;
}
;
Нашел этот код, но выводит такой текст: "
Р№РU·ји‚ЅW·WµќWґќ
5^wЪ©Р "
itsLegend
30.06.2016, 21:30
stringCompressor->DecodeString(sampDialog.szInfo, 256, &bsData);
А это зачем закомментировал?
Отсюда и читается текст, просто упакован алгоритмом, чтобы меньше места занимала
stringCompressor->DecodeString(sampDialog.szInfo, 256, &bsData);
А это зачем закомментировал?
Отсюда и читается текст, просто упакован алгоритмом, чтобы меньше места занимала
У меня нет этого алгоритма, но сейчас как-нибудь перенесу.
У меня нет этого алгоритма, но сейчас как-нибудь перенесу.
SF->RakNet->DecodeString
Точно не помню верно или нет, но если что просто поищи, в сф он точно есть
SF->RakNet->DecodeString
Точно не помню верно или нет, но если что просто поищи, в сф он точно есть
Нашел, спасибо :)
SF->getRakNet()->DecodeString(sampDialog.szInfo, 256, &bsData);
Такая строчка получилась, но ругается на &bsData, требует BitStream *input, где взять можно?
itsLegend
30.06.2016, 22:59
Що ти такий безпомічний, тебе аж подсказывает тип что BitStream
как воспроизвести нажатие кнопок с клавиатуры
Vadim.dll
01.07.2016, 09:56
как воспроизвести нажатие кнопок с клавиатуры
Должно быть так: SF->getGame()->emulateGTAKey(GTA_KEY_1,true)
Но оно не работает лично у меня например если нужно в машину залезть то не сработает нензнаю крч какаято фигня оно наверно с чатом и диалогами работать будет может из-за того что в игре все кнопки обрабатываются через DirectKey помоему и там задержка нужна после нажатия
Никак не получается успеть выловить информацию о диалоге, не подскажете, что можно сделать?
Dark_Knight
01.07.2016, 12:34
Никак не получается успеть выловить информацию о диалоге, не подскажете, что можно сделать?
Диалог серверный? Если да, то хуком РПЦ.
Vadim.dll
01.07.2016, 12:35
А что конкретно выловить надо?
Там я баловался с диалогами всю инфу можно взять когда ты например ввел чтото и нажал ок а чтобы узнать когда диалог закрылся нужно хук на него поставить
Диалог серверный? Если да, то хуком РПЦ.
Диалог серверный, Хук конечно ловит, но мне нужна проверка id диалога, я в теле хука добавил:
C++:
--
--
code
--
--
if
(
showDialog
.
szDialogid
==
27
)
{
действие
}
Но ведь мне нужно вытаскивать информацию только в определенный момент, когда использована команда к примеру /test. Поэтому я объявил переменную к примеру int test = 0. В теле команды сделал
C++:
SF
->
.
.
.
->
Say
(
"/mn"
)
;
test
=
1
;
ну а в хуке сделал так
C++:
--
--
code
--
--
if
(
showDialog
.
szDialogid
==
27
&&
test
==
1
)
{
test
=
0
;
SF
->
.
.
.
->
AddMessage
(
color
,
showDialog
.
szInfo
)
;
}
Но он мне выводил пустое сообщение.
Vadim.dll
01.07.2016, 12:48
Это наверно из-за того что вот ты допустим открыл диалог 27 и проверка у тебя оказалась true и он выводит сообщение но она выводит пустоту потомучто ты не ввел ничего сейчас попробую попроще объяснить
первый диалог 27 test = 0 ты ввел в диалог test и хочешь чтобы при следуещем открытии диалога вывело тест
Второй раз открыл диалог 27 test = 1 проверка сбылась, но ты не ввел пока тут ничего
Какаято хрень но вроде по логике так
Это наверно из-за того что вот ты допустим открыл диалог 27 и проверка у тебя оказалась true и он выводит сообщение но она выводит пустоту потомучто ты не ввел ничего сейчас попробую попроще объяснить
первый диалог 27 test = 0 ты ввел в диалог test и хочешь чтобы при следуещем открытии диалога вывело тест
Второй раз открыл диалог 27 test = 1 проверка сбылась, но ты не ввел пока тут ничего
Какаято хрень но вроде по логике так
Мне кажется нет, вот полный код моего изобретения...
Код:
if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowDialog)
{
stSAMPDialog sampDialog;
BitStream bsData;
params->bitStream->Read(sampDialog.wDialogID);
params->bitStream->Read(sampDialog.bDialogStyle);
params->bitStream->Read(sampDialog.bTitleLength);
params->bitStream->Read(sampDialog.szTitle, sampDialog.bTitleLength);
sampDialog.szTitle[sampDialog.bTitleLength] = 0;
params->bitStream->Read(sampDialog.bButton1Len);
params->bitStream->Read(sampDialog.szButton1, sampDialog.bButton1Len);
sampDialog.szButton1[sampDialog.bButton1Len] = 0;
params->bitStream->Read(sampDialog.bButton2Len);
params->bitStream->Read(sampDialog.szButton2, sampDialog.bButton2Len);
sampDialog.szButton2[sampDialog.bButton2Len] = 0;
SF->getRakNet()->DecodeString(sampDialog.szInfo, 256, params->bitStream);
char buff[64];
sprintf(buff, "%d", sampDialog.wDialogID);
if ((statusinfo == 1) && (sampDialog.wDialogID == 74))
{
statusinfo = 0;
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "%s", buff);
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), sampDialog.szInfo);
}
};
void CALLBACK getdialogtext(std::string param)
{
statusinfo = 1;
SF->getSAMP()->getPlayers()->pLocalPlayer->Say("/mn");
}
Vadim.dll
01.07.2016, 13:53
Проще можно сделать вот тут функи есть лянь
SF->getSAMP()->getDialog()->
Dark_Knight
01.07.2016, 14:18
Проще можно сделать вот тут функи есть лянь
SF->getSAMP()->getDialog()->
Не проще.
Как задержку сделать? Sleep фризит игру.
Проще можно сделать вот тут функи есть лянь
SF->getSAMP()->getDialog()->
Все с этого и начиналось и дошло до хука.
Dark_Knight
01.07.2016, 14:29
Как задержку сделать? Sleep фризит игру.
Все с этого и начиналось и дошло до хука.
Таймер юзать. Слип нельзя юзать.
Таймер юзать. Слип нельзя юзать.
Можно пример? Я нашел другой пример, но он для mainloop был и я немного не понял как его юзать)
Dark_Knight
01.07.2016, 15:58
static DWORD timer = 0;
void mainloop(){
if(GetTickCount() - timer > 1000){ // ms
//code;
timer = GetTickCount();
}
Vadim.dll
01.07.2016, 16:52
Тогда поставить хук на OnCloseDialog и заносить каждый раз инфу в переменные
Dark_Knight
01.07.2016, 17:08
Тогда поставить хук на OnCloseDialog и заносить каждый раз инфу в переменные
Нет такого РПЦ. Есть DIALOGRESPONSE
Должно быть так: SF->getGame()->emulateGTAKey(GTA_KEY_1,true)
Но оно не работает лично у меня например если нужно в машину залезть то не сработает нензнаю крч какаято фигня оно наверно с чатом и диалогами работать будет может из-за того что в игре все кнопки обрабатываются через DirectKey помоему и там задержка нужна после нажатия
там не true, а некое значение, например для клавиши UpDown 255 - идем назад, -1 - идти вперед, 65535 - идти вперед шагом
Не могу понять в чем проблема, ид диалога определяется а проверку не проходит....
wDialogId типа WORD.
C++:
char
dialogid
[
16
]
;
sprintf
(
dialogid
,
"%d"
,
sampDialog
.
wDialogID
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"%s"
,
dialogid
)
;
if
(
dialogid
==
"74"
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
sampDialog
.
szInfo
)
;
}
Dark_Knight
02.07.2016, 02:44
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "%d", sampDialog.wDialogID);
if (sampDialog.wDialogID == 74){
SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), sampDialog.szInfo);
}
И для сравнение чаров подходит только strcmp, strcmpi. Твой сравнения подошел бы std::string
if (sampDialog.wDialogID == 74)
Что за бред, вчера сколько не пробовал так писать, отказывалось работать, сейчас снова попробовал, работает%)
Кстати я так и не понял, как открыть диалог скрытым?
Gabriel__
02.07.2016, 11:38
Почему когда юзаю свои классы в SF плагине. Плагин просто перестаёт загружаться при входе в игру пытаюсь загрузить через pload пишет "plugin not found" и еще при выходе из игры крашит. Пробую убирать конструктор снова все грузит.
В общем, такая проблема, текст в переменную записывается типа char, но мне нужно string, что делать? Искал решение в гугле, но там нашел для массива char, а у меня вычисления проходят через 33 функции и в итоге остается ссылка на переменную.
Dark_Knight
02.07.2016, 18:57
Почему когда юзаю свои классы в SF плагине. Плагин просто перестаёт загружаться при входе в игру пытаюсь загрузить через pload пишет "plugin not found" и еще при выходе из игры крашит. Пробую убирать конструктор снова все грузит.
Кривой код.
В общем, такая проблема, текст в переменную записывается типа char, но мне нужно string, что делать? Искал решение в гугле, но там нашел для массива char, а у меня вычисления проходят через 33 функции и в итоге остается ссылка на переменную.
Записываешь в чар, потом стринг.
Записываешь в чар, потом стринг.
Пробовал уже, не работает так.
Код:
не существует подходящего конструктора для преобразования из "char" в "std::basic_string, std::allocator>"
Dark_Knight
02.07.2016, 19:22
char her[32]{"ЖОПА ЖОПА ЖОПА"};
std::string str = her;
SF->Log(str.c_str());
Dark_Knight
02.07.2016, 20:51
Весь код функции давай. А вообще лучше юзать хук
Весь код функции давай. А вообще лучше юзать хук
В любой непонятной ситуации юзай хук) Появилась одна идея, сейчас попробую реализовать.
Dark_Knight
02.07.2016, 21:01
В любой непонятной ситуации юзай хук) Появилась одна идея, сейчас попробую реализовать.
Потому что так нагрузку на плагин ты снижаешь.
Gabriel__
02.07.2016, 22:06
Кривой код.
Это кривой код ? (хотя бесполезен)
main.h
C++:
.
.
.
.
.
.
#include "myclass.h"
.
.
.
.
.
.
myclass.h
C++:
class
MyClass
{
public
:
MyClass
(
int
number
)
;
~
MyClass
(
)
;
void
func1
(
)
;
void
func2
(
)
;
private
:
int
m_var
;
}
;
myclass.cpp
C++:
#include "main.h"
MyClass
::
MyClass
(
int
number
)
{
m_var
=
number
;
}
MyClass
::
~
MyClass
(
)
{
}
void
MyClass
::
func1
(
)
{
m_var
=
1
;
}
void
MyClass
::
func2
(
)
{
m_var
=
2
;
}
Пиздец, аномалия какая-то.
C++:
// Вот так работает.
// Логгирует message0.
AW
->
Log
(
"message0"
)
;
if
(
Element
==
mActive
->
Elements
[
mActive
->
Current
]
)
{
}
C++:
// А вот так не работает.
// Логгирует только message0.
AW
->
Log
(
"message0"
)
;
if
(
Element
==
mActive
->
Elements
[
mActive
->
Current
]
)
{
AW
->
Log
(
"message1"
)
;
}
Я конечно не профессионал, но попробуй сначала узнать, выполняется ли условие "Element == mActive->Elements[mActive->Current]", от этого и пляши.
Я конечно не профессионал, но попробуй сначала узнать, выполняется ли условие "Element == mActive->Elements[mActive->Current]", от этого и пляши.
Да все, разобрался уже.
itsLegend
03.07.2016, 05:13
Это кривой код ? (хотя бесполезен)
Это крашить не может. Смотри как объявляешь.
Gabriel__
03.07.2016, 10:43
Это крашить не может. Смотри как объявляешь.
Забыл сказать. Когда создаю объект своего класса вот тогда начинаются проблемы.
Хоть как объявляю даже в другой структуре.
MyClass *myclass_obj = new MyClass; // глобально в main.h ставлю extern MyClass *myclass_obj;
MyClass myclass_onj; // в структуре
itsLegend
03.07.2016, 13:39
У тебя же в конструкторе при инициализации должен быть указан int number. Как у тебя вообще скомпилировалось?
Dark_Knight
03.07.2016, 14:43
Это кривой код ? (хотя бесполезен)
Это нет. Но судя по этому
Забыл сказать. Когда создаю объект своего класса вот тогда начинаются проблемы.
Хоть как объявляю даже в другой структуре.
MyClass *myclass_obj = new MyClass; // глобально в main.h ставлю extern MyClass *myclass_obj;
MyClass myclass_onj; // в структуре
Вот тут проблемы как раз. Зачем 2 раза тебе юзать его, если ты его объявляешь глобально?
C++:
typedef
usigned
char
BYTE
;
BYTE byteSeatFlags
:
7
;
// битовое поле из структуры которое нужно прочитать
// если писать так
hook
->
bitStream
->
Read
(
psSync
.
byteSeatFlags
)
;
// то выдает еррор что отсуствует экземпляр перегруженной функции который соотвествует аргументам, я просто в битовых полях не бу-бу. Хелп.
// Как это прочитать ?
Dark_Knight
03.07.2016, 14:57
Что ты хочешь конкретно?
Gabriel__
03.07.2016, 15:59
У тебя же в конструкторе при инициализации должен быть указан int number. Как у тебя вообще скомпилировалось?
При написании поста ошибся.
Вот тут проблемы как раз. Зачем 2 раза тебе юзать его, если ты его объявляешь глобально?
Я не создавал два раза просто так написал
Dark_Knight
03.07.2016, 16:16
Ну тогда надо смотреть на весь код проекта и смотреть в нем где ошибка. Я свои классы пишу в каждом проекте и нормально все.
Что ты хочешь конкретно?
Прочитать входящую синхру пассажира.
C++:
typedef
unsigned
short
PLAYERID
;
typedef
unsigned
short
VEHICLEID
;
#pragma pack(1)
typedef
struct
_PASSENGER_SYNC_DATA
{
VEHICLEID VehicleID
;
BYTE byteSeatFlags
:
7
;
BYTE byteDriveBy
:
1
;
BYTE byteCurrentWeapon
;
BYTE bytePlayerHealth
;
BYTE bytePlayerArmour
;
WORD lrAnalog
;
WORD udAnalog
;
WORD wKeys
;
float
vecPos
[
3
]
;
}
PASSENGER_SYNC_DATA
;
////////////////////////////////////////////////////////////////////////////////////////////////////
bool
__stdcall
PacketHook
(
stRakNetHookParams
*
hook
)
{
if
(
hook
->
packetId
==
ID_PASSENGER_SYNC
)
{
PASSENGER_SYNC_DATA psSync
;
PLAYERID SenderID
;
memset
(
&
psSync
,
0
,
sizeof
(
PASSENGER_SYNC_DATA
)
)
;
hook
->
bitStream
->
IgnoreBits
(
8
)
;
hook
->
bitStream
->
Read
(
SenderID
)
;
if
(
SenderID
=
SAMP_MAX_PLAYERS
)
return
false
;
if
(
SenderID
==
targetID2
)
{
hook
->
bitStream
->
Read
(
psSync
.
VehicleID
)
;
hook
->
bitStream
->
Read
(
psSync
.
byteSeatFlags
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
245
,
184
,
0
)
,
"ID: %d | VehID: %d"
,
SenderID
,
psSync
.
VehicleID
)
;
}
}
return
true
;
}
Вот до ида транспорта я дочитать смог а дальше ерроры((
http://i.imgur.com/RFk2lmK.png
Dark_Knight
03.07.2016, 16:25
read(psSync); пробуй так читать.
read(psSync); пробуй так читать.
Так?
http://i.imgur.com/sgP7AuD.png
Dark_Knight
03.07.2016, 16:30
Только сендер ид имеет тип ворд.
Только сендер ид имеет тип ворд.
Cпасибо за помощь, разобрался.
Не работает чет. Вроде должно, заменяем функцию Present (VTable[17]) на свою и в своей вызываем оригинал. До этого в другом плагине делал так же, все работало.
C++:
DWORD dwOriginal
=
0x0
;
__declspec
(
naked
)
void
hook
(
)
{
__asm pushad
__asm pushfd
Log
(
"work"
)
;
__asm popfd
__asm popad
__asm jmp
[
dwOriginal
]
}
void
init
(
)
{
Log
(
"init"
)
;
while
(
(
*
(
IDirect3DDevice9
*
*
)
0xC97C28
)
==
nullptr
)
Sleep
(
100
)
;
IDirect3DDevice9
*
Device
=
*
(
IDirect3DDevice9
*
*
)
0xC97C28
;
Log
(
"%X"
,
Device
)
;
DWORD
*
VTable
=
(
DWORD
*
)
*
(
DWORD
*
)
Device
;
Log
(
"%X"
,
VTable
)
;
MEMORY_BASIC_INFORMATION mbi
;
VirtualQuery
(
(
LPCVOID
)
VTable
,
&
mbi
,
sizeof
(
mbi
)
)
;
VirtualProtect
(
mbi
.
BaseAddress
,
mbi
.
RegionSize
,
PAGE_READWRITE
,
&
mbi
.
Protect
)
;
Log
(
"Start hook."
)
;
dwOriginal
=
VTable
[
17
]
;
VTable
[
17
]
=
(
DWORD
)
hook
;
Log
(
"Finish hook."
)
;
VirtualProtect
(
mbi
.
BaseAddress
,
mbi
.
RegionSize
,
mbi
.
Protect
,
&
mbi
.
Protect
)
;
}
Только сендер ид имеет тип ворд.
А битстрим входящий как перезаписывать?
C++:
BitStream bs
;
bs
.
Write
(
(
BYTE
)
ID_PASSENGER_SYNC
)
;
bs
.
Write
(
SenderID
)
;
bs
.
Write
(
(
PCHAR
)
&
psSync
,
sizeof
(
PASSENGER_SYNC_DATA
)
)
;
memcpy
(
hook
->
bitStream
->
GetData
(
)
,
bs
.
GetData
(
)
,
sizeof
(
BitStream
)
)
;
А битстрим входящий как перезаписывать?
C++:
BitStream bs
;
bs
.
Write
(
(
BYTE
)
ID_PASSENGER_SYNC
)
;
bs
.
Write
(
SenderID
)
;
bs
.
Write
(
(
PCHAR
)
&
psSync
,
sizeof
(
PASSENGER_SYNC_DATA
)
)
;
memcpy
(
hook
->
bitStream
->
GetData
(
)
,
bs
.
GetData
(
)
,
sizeof
(
BitStream
)
)
;
hook->bitStream->Write(.....);
Dark_Knight
03.07.2016, 18:31
reserWriteOffset();
ignorebits(8);
write(senderID);
Write((PCHAR)&psSync, sizeof(psSync));
Не работает чет. Вроде должно, заменяем функцию Present (VTable[17]) на свою и в своей вызываем оригинал. До этого в другом плагине делал так же, все работало.
C++:
DWORD dwOriginal
=
0x0
;
__declspec
(
naked
)
void
hook
(
)
{
__asm pushad
__asm pushfd
Log
(
"work"
)
;
__asm popfd
__asm popad
__asm jmp
[
dwOriginal
]
}
void
init
(
)
{
Log
(
"init"
)
;
while
(
(
*
(
IDirect3DDevice9
*
*
)
0xC97C28
)
==
nullptr
)
Sleep
(
100
)
;
IDirect3DDevice9
*
Device
=
*
(
IDirect3DDevice9
*
*
)
0xC97C28
;
Log
(
"%X"
,
Device
)
;
DWORD
*
VTable
=
(
DWORD
*
)
*
(
DWORD
*
)
Device
;
Log
(
"%X"
,
VTable
)
;
MEMORY_BASIC_INFORMATION mbi
;
VirtualQuery
(
(
LPCVOID
)
VTable
,
&
mbi
,
sizeof
(
mbi
)
)
;
VirtualProtect
(
mbi
.
BaseAddress
,
mbi
.
RegionSize
,
PAGE_READWRITE
,
&
mbi
.
Protect
)
;
Log
(
"Start hook."
)
;
dwOriginal
=
VTable
[
17
]
;
VTable
[
17
]
=
(
DWORD
)
hook
;
Log
(
"Finish hook."
)
;
VirtualProtect
(
mbi
.
BaseAddress
,
mbi
.
RegionSize
,
mbi
.
Protect
,
&
mbi
.
Protect
)
;
}
А нахуя? В SFAPI и так есть хук на нее
А нахуя? В SFAPI и так есть хук на нее
Странно просто. Такой же код, в одном плагине работает, во втором нет.
reserWriteOffset();
ignorebits(8);
write(senderID);
Write((PCHAR)&psSync, sizeof(psSync));
Не перезаписывает оно входящий битстрим(( В итоге ничего не происходит.
C++:
hook
->
bitStream
->
ResetWritePointer
(
)
;
hook
->
bitStream
->
IgnoreBits
(
8
)
;
hook
->
bitStream
->
Write
(
SenderID
)
;
hook
->
bitStream
->
Write
(
(
PCHAR
)
&
psSync
,
sizeof
(
psSync
)
)
;
Dark_Knight
03.07.2016, 22:02
Пробуй читать ид пакета и записывать его тоже. Игнорирование прийдется убрать.
Как можно снизить вес SF плагина?
NarutoUA
04.07.2016, 01:16
Как можно снизить вес SF плагина?
UPX
UPX
Разве он подойдет для плагинов SF?
NarutoUA
04.07.2016, 01:27
Разве он подойдет для плагинов SF?
Разве принято задавать мне тупые вопросы?
barspinoff
04.07.2016, 18:23
помогите с кодом
никак не могу gui доделать - самп крашит
C++:
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
RPC_ClickTextDraw
)
{
void
*
pointer
;
char
*
text
;
WORD TextDrawID
;
char
*
settext
=
"Settings"
;
params
->
Read
(
TextDrawID
)
;
params
->
ResetReadPointer
(
)
;
stSAMP
*
samp
=
SF
->
getSAMP
(
)
->
getInfo
(
)
;
pointer
=
(
SAMP
->
pPools
->
pTextdraw
)
+
0x2400
+
4
*
TextDrawID
;
text
=
*
(
char
*
*
)
addr
;
if
(
strcmp
(
settext
,
text
)
!=
0
)
{
//...
}
}
}
Dark_Knight
04.07.2016, 20:50
Код:
params->ResetReadPointer();
params->Read(TextDrawID);
SF->Log(SF->getSAMP()->getInfo()->pPools->pTextdraw->textdraw[1]->szText);
Все остальное на*** не нужно.
как сделать тп по чекпоинтам?
Почему в ракнете сф апи есть методы WriteNormVector, WriteVector, WriteNormQuat но нету аналогов для чтения?
Если я добавлю из собейтовского их то они будут работать?
Почему в ракнете сф апи есть методы WriteNormVector, WriteVector, WriteNormQuat но нету аналогов для чтения?
Если я добавлю из собейтовского их то они будут работать?
Да, а методы чтения есть просто они не объявлены
itsLegend
05.07.2016, 07:26
Почему в ракнете сф апи есть методы WriteNormVector, WriteVector, WriteNormQuat но нету аналогов для чтения?
Если я добавлю из собейтовского их то они будут работать?
https://www.blast.hk/threads/17/page-43#post-115134
Gabriel__
06.07.2016, 12:52
Объясните же как пользоваться функцией ProcessLineOfSight(); (GAME->GetWorld()->ProcessLineOfSight();)
Dark_Knight
06.07.2016, 13:08
На юзай это
Код:
#define FUNC_IsLineOfSightClear 0x56A490
bool CFunctions::IsLineOfSightClear(CVector *vecStart, CVector *vecEnd, bool bCheckBuildings, bool bCheckVehicles, bool bCheckPeds, bool bCheckObjects, bool bCheckDummies, bool bSeeThroughStuff, bool bIgnoreSomeObjectsForCamera)
{
DWORD dwFunc = FUNC_IsLineOfSightClear;
bool bReturn = false;
__asm
{
push bIgnoreSomeObjectsForCamera
push bSeeThroughStuff
push bCheckDummies
push bCheckObjects
push bCheckPeds
push bCheckVehicles
push bCheckBuildings
push vecEnd
push vecStart
call dwFunc
mov bReturn, al
add esp, 0x24
}
return bReturn;
}
Не расскажете как этим пользоваться?
Код:
case DLL_PROCESS_ATTACH:
SF->initPlugin(mainloop, hModule);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
больше интересует
DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
А как на счет воспользоваться поиском? Если не гуглом, то хотя бы поиском по форуму? Ответ на такой вопрос уже был
Gabriel__
07.07.2016, 13:24
Как воспроизвести звук в игре ? Как опкод 018C: play_sound 1052 at 0.0 0.0 0.0 в клео.
itsLegend
07.07.2016, 14:09
В стандартном примере, который в архиве SF, найдешь
Gabriel__
07.07.2016, 15:26
В стандартном примере, который в архиве SF, найдешь
Это чтоли ?
Код:
GAME->GetAudio()->PlayBeatTrack(1052);
Это не работает, это для всякой музыки из катсцен и интерьеров.
как можно дизассемблировать плагин?
Это чтоли ?
Код:
GAME->GetAudio()->PlayBeatTrack(1052);
Это не работает, это для всякой музыки из катсцен и интерьеров.
Так, а тебе, что нужно тогда? Если я правильно догадался, то ты хочешь аудио файлы воспроизвести, для этого используй bass.dll
Gabriel__
07.07.2016, 17:28
Так, а тебе, что нужно тогда? Если я правильно догадался, то ты хочешь аудио файлы воспроизвести, для этого используй bass.dll
Мелкие звуки которые опкодом 018C в клео проигрываются (они в игровые файлах содержатся). Еще есть RPC Play sound. Но через эмуляцию стремно делать.
Dark_Knight
07.07.2016, 19:37
Мелкие звуки которые опкодом 018C в клео проигрываются (они в игровые файлах содержатся). Еще есть RPC Play sound. Но через эмуляцию стремно делать.
И что тебе мешает найти нужную функцию в Гейм АПИ?
Вопрос конечно странный, но все же, как подключить файл cpp? Я понимаю что нужно использовать #include "name.cpp", но как начинаю писать код в новом файле, появляется туча ошибок.
barspinoff
07.07.2016, 23:46
напиши в cpp #include "name.h" и впиши туда всё нужное, потом его в новом файле включи
Gabriel__
08.07.2016, 10:48
Вопрос конечно странный, но все же, как подключить файл cpp? Я понимаю что нужно использовать #include "name.cpp", но как начинаю писать код в новом файле, появляется туча ошибок.
Подключать нужно .h файлы, подключать .cpp файлы это глупо.
UPD
В .cpp добавляй тела своих функций.
В .h файлы добавляй структуры, и прототипы к своим функциям. И в самом cpp делай #include "твой h файл" и вообще не мешало бы создать файл main.h и во всех(есть исключения) cpp вписывать #include "main.h"
Не подскажите, какие параметры у RPC_ScrTextDrawSetString?
Использую:
WORD wTDId;
BYTE bLen;
char szText[256];
В итоге при считывание сообщение всегда пустое...
Как открыть чат и ввести туда текст не отправляя его? И правильно ли я ввел клавиши?
C++:
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
'LAlt'
)
&&
SF
->
getGame
(
)
->
isKeyPressed
(
'Up'
)
)
Dark_Knight
09.07.2016, 19:43
Как открыть чат и ввести туда текст не отправляя его? И правильно ли я ввел клавиши?
C++:
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
'LAlt'
)
&&
SF
->
getGame
(
)
->
isKeyPressed
(
'Up'
)
)
Не правильно все. isKeyPressed проверяет нажата была ли клавиша.
Не правильно все. isKeyPressed проверяет нажата была ли клавиша.
Ну это и имелось ввиду, я хотел уточнить конкретно по поводу названий клавиш.
И да:
Как открыть чат и ввести туда текст не отправляя его?
как адрес хукнуть
(SR_Team помоги)
Gabriel__
10.07.2016, 17:32
Учись https://www.blast.hk/threads/2370/
P.S Нет такого понятия "адрес хукнуть"
Woofing Giraffe
10.07.2016, 18:29
Не подскажите, какие параметры у RPC_ScrTextDrawSetString?
Использую:
WORD wTDId;
BYTE bLen;
char szText[256];
В итоге при считывание сообщение всегда пустое...
Тот же вопрос. Не нашел решение?
Тот же вопрос. Не нашел решение?
сними дамп рпц, будет проще разобраться
Woofing Giraffe
10.07.2016, 19:06
сними дамп рпц, будет проще разобраться
0000 0D 00 0B 00 7E 77 7E 30 7E 6E 7E 45 64 69 74 ....~w~0~n~Edit
0000 0D 00 0B 00 7E 77 7E 30 7E 6E 7E 45 64 69 74 ....~w~0~n~Edit
WORD wTexdrawID;
WORD wStrLen;
char *szStr;
WORD wTexdrawID;
WORD wStrLen;
char *szStr;
Как ты это читаешь?
Как ты это читаешь?
это из дампа видно. А еще на сайте сампа написано, что сначала идет id текстдрава, а потом текст
iAmerican
11.07.2016, 00:19
C++:
bool
CALLBACK
Present
(
CONST RECT
*
pSourceRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindowOverride
,
CONST RGNDATA
*
pDirtyRegion
)
{
if
(
SF
->
getRender
(
)
->
CanDraw
(
)
)
{
if
(
stateblock
==
nullptr
)
{
stateblock
=
new
CState
(
g_pd3dDevice
)
;
}
ImGui_ImplDX9_NewFrame
(
)
;
RenderGUI
(
)
;
stateblock
->
Save
(
)
;
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
&&
init
)
{
ImGui
::
Render
(
)
;
std
::
string s
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetPlayerName
(
0
)
;
char
buf
[
64
]
;
sprintf
(
buf
,
"%s"
,
s
)
;
pFont
->
Print
(
buf
,
D3DCOLOR_ARGB
(
255
,
255
,
255
,
0
)
,
500
,
500
,
false
)
;
SF
->
getRender
(
)
->
EndRender
(
)
;
}
stateblock
->
Restore
(
)
;
}
return
true
;
}
;
Игра виснет при старте. Как исправить?
Dark_Knight
11.07.2016, 00:28
pFont->Print(s.c_str(), D3DCOLOR_ARGB(255, 255, 255, 0), 500, 500, false);
И баг в спринт ефф. стд::стринг - это вектор байтов.
iAmerican
11.07.2016, 02:29
Можно ли изменить радиус получения игроков в стриме?
ну или как получить игрока в радиусе 5 метров
Gabriel__
11.07.2016, 08:19
Измеряй расстояние
C++:
float
GetDistanceXYZ
(
float
x1
,
float
y1
,
float
z1
,
float
x2
,
float
y2
,
float
z2
)
{
return
sqrt
(
pow
(
x2
-
x1
,
2
)
+
pow
(
y2
-
y1
,
2
)
+
pow
(
z2
-
z1
,
2
)
)
;
}
Как открыть чат и ввести туда что-либо не отправляя? Как проверить нажатия клавиш Alt и Up? Пробовал IsKeyPressed('Alt') IsKeyPressed('Up'), не работало.
Как открыть чат и ввести туда что-либо не отправляя? Как проверить нажатия клавиш Alt и Up? Пробовал IsKeyPressed('Alt') IsKeyPressed('Up'), не работало.
VK_LMENU - Left ALT
VK_UP - Up
Чат открывается в GetIput или GetChat, точно не помню. Функцию ввода данных в чат без отправки завезем в новом СФ
itsLegend
11.07.2016, 12:13
Как проверить нажатия клавиш Alt и Up? Пробовал IsKeyPressed('Alt') IsKeyPressed('Up'), не работало.
https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd375731(v=vs.85).aspx (https://www.blast.hk/redirect/aHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vcnUtcnUvbGlicm FyeS93aW5kb3dzL2Rlc2t0b3AvZGQzNzU3MzEodj12cy44NSku YXNweA)
VK_LMENU - 0xA4(это не названия, которые ты будешь пытаться вставить как параметр, вводи число)
VK_UP - 0x26
https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd375731(v=vs.85).aspx (https://www.blast.hk/redirect/aHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vcnUtcnUvbGlicm FyeS93aW5kb3dzL2Rlc2t0b3AvZGQzNzU3MzEodj12cy44NSku YXNweA)
VK_LMENU - 0xA4(это не названия, которые ты будешь пытаться вставить как параметр, вводи число)
VK_UP - 0x26
Благодарю, просто видел пример в вики, там использовалось 'H'. Вот и подумал, что остальные также вводить).
VK_LMENU - Left ALT
VK_UP - Up
Чат открывается в GetIput или GetChat, точно не помню. Функцию ввода данных в чат без отправки завезем в новом СФ
Печально, что ее нету(. Ждемс)
itsLegend
11.07.2016, 12:38
Благодарю, просто видел пример в вики, там использовалось 'H'. Вот и подумал, что остальные также вводить).
Если ты посмотришь на принимаемые параметры функцией, то byte key = 'H' будет равно 72, а byte key = 'h', то 104. Если сравнивать полученные значения в Virtual-Key Codes, то там будет подходить оба варианта, а правильный - один - 72(0x48), а 104(0x68) будет относиться к Numpad 8.
iAmerican
13.07.2016, 18:19
Можно ли как нибудь убрать баг получения Score игрока ? Что бы не нужно было открывать TAB.
Можно ли как нибудь убрать баг получения Score игрока ? Что бы не нужно было открывать TAB.
SF->getSAMP()->getInfo()->UpdateScoreAndPing();
iAmerican
13.07.2016, 19:29
SF->getSAMP()->getInfo()->UpdateScoreAndPing();
Если поставить в mainloop после init = true;
сильно нагружать будет скрипт?
Dark_Knight
13.07.2016, 19:59
Если поставить в mainloop после init = true;
сильно нагружать будет скрипт?
Перед получением поставь данных и все
Gabriel__
15.07.2016, 19:02
Почему метод GetObjectA в классе CPickup не возвращает объект ?
C++:
void
render_pickups
(
)
{
CVector pos
;
float
x
,
y
;
char
text
[
256
]
;
CPickup
*
pickup
;
CObject
*
pickup_object
;
static
stFontInfo
*
font
=
SF
->
getRender
(
)
->
CreateNewFont
(
"Arial"
,
10
,
FCR_BORDER
|
FCR_SHADOW
)
;
for
(
DWORD i
=
0
;
i
GetPickups
(
)
->
GetPickup
(
i
)
;
if
(
!
pickup
)
continue
;
pickup_object
=
pickup
->
GetObjectA
(
)
;
if
(
!
pickup_object
)
// вот тут все время срабатывает условие
continue
;
if
(
!
pickup_object
->
IsOnScreen
(
)
)
continue
;
pickup
->
GetPosition
(
&
pos
)
;
SF
->
getGame
(
)
->
convert3DCoordsToScreen
(
pos
.
fX
,
pos
.
fY
,
pos
.
fZ
,
&
x
,
&
y
)
;
sprintf_s
(
text
,
"Screen XY: %f %f"
,
x
,
y
)
;
font
->
Print
(
text
,
-
1
,
x
,
y
)
;
}
}
itsLegend
15.07.2016, 19:23
Ну во первых - в GetPickup не передается ид текстдрава в сампе.
Gabriel__
15.07.2016, 19:53
Ну во первых - в GetPickup не передается ид текстдрава в сампе.
Ты о чем ?
Woofing Giraffe
15.07.2016, 22:51
Вроде читал тут где-то что есть какой-то адрес памяти в который можно записывать определенные данные и они будут сохраняться при релоге. Или нет такого?
Вроде читал тут где-то что есть какой-то адрес памяти в который можно записывать определенные данные и они будут сохраняться при релоге. Или нет такого?
любой адрес кроме пулов
Woofing Giraffe
16.07.2016, 02:16
И еще вопрос, как удалить команду?
Хукаю сообщение через RPC_ScrClientMessage, куда можно вывести цвет сообщения, чтобы потом использовать в коде?
Woofing Giraffe
16.07.2016, 12:06
Хукаю сообщение через RPC_ScrClientMessage, куда можно вывести цвет сообщения, чтобы потом использовать в коде?
C++:
int
TextSize
;
D3DCOLOR Color
;
char
Text
[
128
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
Color
)
;
params
->
bitStream
->
Read
(
TextSize
)
;
params
->
bitStream
->
Read
(
Text
,
TextSize
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
Text
[
TextSize
]
=
'\0'
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"Color: 0x%X"
,
Color
)
;
C++:
int
TextSize
;
D3DCOLOR Color
;
char
Text
[
128
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
Color
)
;
params
->
bitStream
->
Read
(
TextSize
)
;
params
->
bitStream
->
Read
(
Text
,
TextSize
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
Text
[
TextSize
]
=
'\0'
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"Color: 0x%X"
,
Color
)
;
Тогда еще вопросик, как это дело сверить теперь? Получил такой цвет: 0x99CCAAFF
Woofing Giraffe
16.07.2016, 12:34
Тогда еще вопросик, как это дело сверить теперь? Получил такой цвет: 0x99CCAAFF
В смысле сверить?
В смысле сверить?
Ну вот этот цвет с тем, что приходит.
if ( Color == "99CCAAFF")
Типа того.
Woofing Giraffe
16.07.2016, 12:47
Ну вот этот цвет с тем, что приходит.
if ( Color == "99CCAAFF")
Типа того.
if(Color == 99CCAAFF)
{
Код
}
if(Color == 99CCAAFF)
{
Код
}
0x99CCAAFF
Woofing Giraffe
16.07.2016, 14:12
Вот я зарегистрировал команду SF->getSAMP()->registerChatCommand("testcmd", test); Как ее после некоторых действий удалить? Т.е. чтобы каллбэк test можно было вызвать с другой команды, а эта уже была неактивна?
При использовании периодически крашит, помогите исправить.
C++:
[CODE]
int
GetPlayerIdbyName
(
string Name
)
{
id
=
-
1
;
int
i
=
0
;
if
(
!
Name
.
empty
(
)
)
{
for
(
i
;
i
getSAMP
(
)
->
getPlayers
(
)
->
GetPlayerName
(
i
)
,
Name
.
c_str
(
)
)
)
{
id
=
i
;
break
;
}
}
if
(
id
>
-
1
&&
id
itsLegend
16.07.2016, 19:35
При сравнении сначала узнай, возвращает ли GetPlayerName существующую строку.
NarutoUA
16.07.2016, 19:37
проверку на isListed добавь
Нормально?
C++:
if
(
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetPlayerName
(
i
)
&&
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
)
И вопрос по чтению файла, как прочитать только первую строчку и не читать первую строчку?
Woofing Giraffe
18.07.2016, 04:18
Как поставить гоночный чекпоинт?
У меня в скрипте есть цикл, как защитить скрипт от /q и выключения из консоли?
Dark_Knight
19.07.2016, 14:02
Никак. Он автоматически завершится при выходе с /q или при pfree и pfree_all. Если тебе надо выполнить какие-то действия при завершении плагина, то юзай коллбек.
Код:
void CALLBACK pfree(){
//some code
}
void CALLBACK mainloop(){
SF->getGame()->registerGameDestructorCallback(pfree);
}
tropical5466
19.07.2016, 14:48
Что за id принимает vehicleInfoGet?
iAmerican
19.07.2016, 15:58
Как смотреть в сторону(повернуть пед) игрока ,зная его координаты?
Никак. Он автоматически завершится при выходе с /q или при pfree и pfree_all. Если тебе надо выполнить какие-то действия при завершении плагина, то юзай коллбек.
Код:
void CALLBACK pfree(){
//some code
}
void CALLBACK mainloop(){
SF->getGame()->registerGameDestructorCallback(pfree);
}
Можно ведь
C++:
case
DLL_PROCESS_DETACH
:
Заменить на
C++:
break
;
case
DLL_PROCESS_DETACH
:
Sleep
(
-
1
)
;
И скрипт не будет выгружаться вообще
хм... а вот смотрите такую вещь, у меня скрипт в основном работает в отдельном потоке, там открывается файл, и постоянно читается и изменяется, и есть задержки, можно ли как-нибудь сохранить и закрыть файл перед выгрузкой?
Woofing Giraffe
19.07.2016, 19:47
0B63: samp unregister_client_command "mycmd"
Есть аналог в СФ?
0B63: samp unregister_client_command "mycmd"
Есть аналог в СФ?
SF->getSAMP()->getInput()->UnregisterClientCommand("mycmd");
Woofing Giraffe
19.07.2016, 22:03
SF->getSAMP()->getInput()->UnregisterClientCommand("mycmd");
Ошибка C2039 UnregisterClientCommand: не является членом "stInputInfo"
Ошибка C2039 UnregisterClientCommand: не является членом "stInputInfo"
SF 5.3.2 скачай
Как плагин в энигме упаковать?
Gabriel__
20.07.2016, 18:49
Грех не вставить в API это, если нет конечно
C++:
enum
eBulletHitType
{
BULLET_HIT_TYPE_NONE
=
0
,
BULLET_HIT_TYPE_PLAYER
,
BULLET_HIT_TYPE_VEHICLE
,
BULLET_HIT_TYPE_OBJECT
,
BULLET_HIT_TYPE_PLAYER_OBJECT
}
;
Woofing Giraffe
21.07.2016, 19:34
Как загрузить модель оружия в СФ?
Как загрузить модель оружия в СФ?
через GAME->, либо из соба возьми функцию загрузки всех моделей оружия
Gabriel__
21.07.2016, 22:20
C++:
struct
SLineOfSightFlags
{
SLineOfSightFlags
(
void
)
:
bCheckBuildings
(
true
)
,
bCheckVehicles
(
true
)
,
bCheckPeds
(
true
)
,
bCheckObjects
(
true
)
,
bCheckDummies
(
true
)
,
bSeeThroughStuff
(
false
)
,
bIgnoreSomeObjectsForCamera
(
false
)
,
bShootThroughStuff
(
false
)
,
bCheckCarTires
(
false
)
{
}
bool
bCheckBuildings
;
bool
bCheckVehicles
;
bool
bCheckPeds
;
bool
bCheckObjects
;
bool
bCheckDummies
;
// Что это ?
bool
bSeeThroughStuff
;
// Что это ?
bool
bIgnoreSomeObjectsForCamera
;
// Что это ?
bool
bShootThroughStuff
;
// not used for IsLineOfSightClear [B]// Что это ?
bool
bCheckCarTires
;
}
;
bCheckDummies
Это я думаю для проверки за стримом, где мир не загружен
bSeeThroughStuff
Гугл, говорит, что это проверка на видимые вещи, возможно оба векотора координат должны быть на экране
iAmerican
22.07.2016, 23:05
Как получить указатель на статус Курсора , чето уже все перепробовал
C++:
bool
&
ActiveCursor
=
SF
->
getSAMP
(
)
->
getMisc
(
)
->
ToggleCursor
;
C++:
int
&
ActiveCursor
=
SF
->
getSAMP
(
)
->
getMisc
(
)
->
ToggleCursor
;
C++:
stMiscInfo
*
II
=
SF
->
getSAMP
(
)
->
getMisc
(
)
->
ToggleCursor
;
itsLegend
22.07.2016, 23:07
iCursorMode в той же структуре, вроде.
iAmerican
23.07.2016, 11:14
Как плагин в энигме упаковать?
Тебе так принципиально енигмой?
BlackKnigga
24.07.2016, 00:32
Гружу пустой плагин сф - нормально грузится. Добавляю немного кода - Plugin not found. Что не так?
C++:
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
init
=
true
;
}
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
9
)
)
{
std
::
string string
=
SF
->
getSAMP
(
)
->
getChat
(
)
->
GetChatInputText
(
)
;
SF
->
Log
(
string
.
c_str
(
)
)
;
}
;
}
Dark_Knight
24.07.2016, 12:39
весь код.
BlackKnigga
24.07.2016, 13:02
весь код.
Так это и есть весь код цикла mainloop. Ну если надо:
C++:
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
init
=
true
;
}
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
9
)
)
{
std
::
string string
=
SF
->
getSAMP
(
)
->
getChat
(
)
->
GetChatInputText
(
)
;
SF
->
Log
(
string
.
c_str
(
)
)
;
}
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
switch
(
dwReasonForCall
)
{
case
DLL_PROCESS_ATTACH
:
SF
->
initPlugin
(
mainloop
,
hModule
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}
Гружу пустой плагин сф - нормально грузится. Добавляю немного кода - Plugin not found. Что не так?
C++:
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
init
=
true
;
}
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
9
)
)
{
std
::
string string
=
SF
->
getSAMP
(
)
->
getChat
(
)
->
GetChatInputText
(
)
;
SF
->
Log
(
string
.
c_str
(
)
)
;
}
;
}
ты isKeyPressed вызываешь до инициализации. После условия if (!init), в конце, добавь else и в нем пиши свой код
BlackKnigga
25.07.2016, 02:11
ты isKeyPressed вызываешь до инициализации. После условия if (!init), в конце, добавь else и в нем пиши свой код
Все так же
C++:
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
init
=
true
;
}
else
{
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
9
)
&&
SF
->
getSAMP
(
)
->
getInput
(
)
->
iInputEnabled
)
{
std
::
string string
;
string
=
SF
->
getSAMP
(
)
->
getChat
(
)
->
GetChatInputText
(
)
;
char
*
msg
=
new
char
[
string
.
length
(
)
+
1
]
;
strrev
(
msg
)
;
char
*
nick
=
strtok
(
msg
,
" "
)
;
SF
->
Log
(
nick
)
;
}
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
switch
(
dwReasonForCall
)
{
case
DLL_PROCESS_ATTACH
:
SF
->
initPlugin
(
mainloop
,
hModule
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}
Мб компилирую как то не правильно?
strrev(msg);
char *nick = strtok(msg, " ");
это что за еботня?
tropical5466
25.07.2016, 19:26
Все так же
C++:
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
init
=
true
;
}
else
{
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
9
)
&&
SF
->
getSAMP
(
)
->
getInput
(
)
->
iInputEnabled
)
{
std
::
string string
;
string
=
SF
->
getSAMP
(
)
->
getChat
(
)
->
GetChatInputText
(
)
;
char
*
msg
=
new
char
[
string
.
length
(
)
+
1
]
;
strrev
(
msg
)
;
char
*
nick
=
strtok
(
msg
,
" "
)
;
SF
->
Log
(
nick
)
;
}
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
switch
(
dwReasonForCall
)
{
case
DLL_PROCESS_ATTACH
:
SF
->
initPlugin
(
mainloop
,
hModule
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}
Мб компилирую как то не правильно?
Код:
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS *SF = new SAMPFUNCS();
void CALLBACK mainloop()
{
static bool init = false;
if (!init)
{
if (GAME == nullptr)
return;
if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
return;
if (!SF->getSAMP()->IsInitialized())
return;
SF->getSAMP()->getChat()->AddChatMessage( D3DCOLOR_XRGB( 0, 0xAA, 0 ), "SAMPFUNCS Plugin loaded." );
init = true;
}
if (SF->getGame()->isKeyPressed(9) && SF->getSAMP()->getInput()->iInputEnabled)
{
std::string string;
string = SF->getSAMP()->getChat()->GetChatInputText();
char *msg = new char[string.length() + 1];
strrev(msg);
char *nick = strtok(msg, " ");
SF->Log(nick);
}
}
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
switch (dwReasonForCall)
{
case DLL_PROCESS_ATTACH:
SF->initPlugin(mainloop, hModule);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
itsLegend
25.07.2016, 19:29
Все так же
Мб компилирую как то не правильно?
SAMPFUNCS.log скинь
Woofing Giraffe
27.07.2016, 02:46
Как проверить локального игрока на АФК?
Как проверить локального игрока на АФК?
SF->getGame()->isGTAMenuActive() // Через ESC
Есть 2 массива
Код:
std::vector array2;
std::vector array1;
Как узнать размер первого массива и потом ввести число (любое) во второй массив, причем номер, заносимого числа, во втором массиве (int) должен совпадать с размером первого массива? Т.е. предположим:
Код:
array1.push_back(s);
int i = array1.end();
array2.insert( i, 1);
//(Если что это не работает) )
Ну и тогда второй вопрос, если более удобный вариант записи данных, если мне нужно иметь Имя и числа, привязанные к имени, при условии, что я не знаю сколько имен будет.
Есть 2 массива
Код:
std::vector array2;
std::vector array1;
Как узнать размер первого массива и потом ввести число (любое) во второй массив, причем номер, заносимого числа, во втором массиве (int) должен совпадать с размером первого массива? Т.е. предположим:
Код:
array1.push_back(s);
int i = array1.end();
array2.insert( i, 1);
//(Если что это не работает) )
Ну и тогда второй вопрос, если более удобный вариант записи данных, если мне нужно иметь Имя и числа, привязанные к имени, при условии, что я не знаю сколько имен будет.
array1.size()
array1.size()
Пробовал, интератор не совместим с size_t
А как выполнить функцию при /q?
Woofing Giraffe
28.07.2016, 20:07
А как выполнить функцию при /q?
SF->getGame()->registerGameDestructorCallback(Destructor);
где Destructor это функция void CALLBACK без параметров
это засунуть в case DLL_PROCESS_DETACH:?
itsLegend
28.07.2016, 20:17
это засунуть в case DLL_PROCESS_DETACH:?
Куда хочешь, но чтобы вызывалось 1 раз. Можно во время проверки загруженности структур сампа или игры(перед init = true, к примеру).
Куда хочешь, но чтобы вызывалось 1 раз. Можно во время проверки загруженности структур сампа или игры(перед init = true, к примеру).
Спасибо, добавил в блок инициализации, вроде работает.
А как убрать иероглифы при записи в файл?
Gabriel__
28.07.2016, 21:15
Удаляю глобальные объекты через delete в game destructor (вот delete SF; например ) но игра крашит при выходе а через pfree все норм.
itsLegend
28.07.2016, 21:26
Какой смысл?
SAMPFUNCS вызывает деструктор во всех плагинах, вроде как.
Спасибо, добавил в блок инициализации, вроде работает.
А как убрать иероглифы при записи в файл?
Пример можна?
Какой смысл?
SAMPFUNCS вызывает деструктор во всех плагинах, вроде как.
Пример можна?
избавился от иероглифов. Записывал в файл так - fot.write(array[I], 30), заменил на fout
Gabriel__
29.07.2016, 09:55
Какой смысл?
SAMPFUNCS вызывает деструктор во всех плагинах, вроде как.
Ну а свои как удалять ?
Почему крашит?
Код:
SF->execConsoleCommand("pfree " + SF->getGame()->getPluginInfo()->getPluginName());
Gabriel__
29.07.2016, 12:31
Почему крашит?
Код:
SF->execConsoleCommand("pfree " + SF->getGame()->getPluginInfo()->getPluginName());
strcat_s юзай
NarutoUA
29.07.2016, 13:30
Нельзя самого себя выгружать из плагина
iAmerican
30.07.2016, 00:34
Как сделать постепенное исчезание ?
PHP:
pFont
-
>
Print
(
arr
[
0
]
,
D3DCOLOR_ARGB
(
255
,
255
,
255
,
0
)
,
1454
,
1000
,
false
)
;
Woofing Giraffe
30.07.2016, 00:47
Как сделать постепенное исчезание ?
PHP:
pFont
-
>
Print
(
arr
[
0
]
,
D3DCOLOR_ARGB
(
255
,
255
,
255
,
0
)
,
1454
,
1000
,
false
)
;
Параметр A в цвете уменьшай
iAmerican
30.07.2016, 02:31
Параметр A в цвете уменьшай
я шарю что его надо уменьшать , но не знаю как это реализовать.
Что бы после появления , через секунд 5 потихоньку исчезло .
я шарю что его надо уменьшать , но не знаю как это реализовать.
Что бы после появления , через секунд 5 потихоньку исчезло .
например заменить его переменной, значение которой и будешь менять
iAmerican
30.07.2016, 08:01
Ну вот накидал так , с использованием таймера. Но очень быстро пропадает, текст даже не успевает появляться .
например заменить его переменной, значение которой и будешь менять
PHP:
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
stFontInfo
*
pFont
;
bool bstarttext
=
false
;
int iA
;
DWORD
dgoiA
;
bool bgoiA
;
bool
CALLBACK
Present
(
CONST
RECT
*
pSourceRect
,
CONST
RECT
*
pDestRect
,
HWND
hDestWindowOverride
,
CONST
RGNDATA
*
pDirtyRegion
)
{
if
(
SUCCEEDED
(
SF
-
>
getRender
(
)
-
>
BeginRender
(
)
)
)
// если девайс готов к рисованию
{
if
(
!
SF
-
>
getGame
(
)
-
>
isGTAMenuActive
(
)
)
{
if
(
bstarttext
)
{
pFont
-
>
Print
(
"{87CEFA}iAmerican text invisibleeeeeeeeeeeeeeeeee"
,
D3DCOLOR_ARGB
(
iA
,
255
,
255
,
255
)
,
330
,
330
,
false
)
;
// A = 0
}
}
SF
-
>
getRender
(
)
-
>
EndRender
(
)
;
// завершаем рисование
}
;
return
true
;
// возвращаем положительный результат
}
;
void
Timers
(
)
{
if
(
bgoiA
)
{
if
(
GetTickCount
(
)
-
dgoiA
>
10
)
{
iA
=
0
;
bgoiA
=
false
;
}
}
}
void
CALLBACK
mainloop
(
)
{
static
bool init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
-
>
GetSystemState
(
)
!=
eSystemState
:
:
GS_PLAYING_GAME
)
return
;
if
(
!
SF
-
>
getSAMP
(
)
-
>
IsInitialized
(
)
)
return
;
SF
-
>
getSAMP
(
)
-
>
getChat
(
)
-
>
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
SF
-
>
getRender
(
)
-
>
registerD3DCallback
(
eDirect3DDeviceMethods
:
:
D3DMETHOD_PRESENT
,
Present
)
;
pFont
=
SF
-
>
getRender
(
)
-
>
CreateNewFont
(
"Comic Sans MS"
,
12
,
FCR_BORDER
)
;
init
=
true
;
}
Timers
(
)
;
if
(
SF
-
>
getGame
(
)
-
>
isKeyPressed
(
VK_F2
)
)
// Старт текста
{
if
(
bstarttext
)
{
bstarttext
=
false
;
}
else
{
bstarttext
=
true
;
dgoiA
=
GetTickCount
(
)
;
iA
=
255
;
bgoiA
=
true
;
}
}
}
BOOL
APIENTRY
DllMain
(
HMODULE
hModule
,
DWORD
dwReasonForCall
,
LPVOID
lpReserved
)
{
switch
(
dwReasonForCall
)
{
case
DLL_PROCESS_ATTACH
:
SF
-
>
initPlugin
(
mainloop
,
hModule
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}
Dark_Knight
30.07.2016, 15:00
10 милисекунд же.
iAmerican
30.07.2016, 16:49
10 милисекунд же.
Конечно , как бы вопрос я решил. Но все таки , как обойтись без этого ...
И сделать более плавное исчезновение текста.
PHP:
void
Timers
(
)
{
if
(
bgoiA
)
{
if
(
GetTickCount
(
)
-
dgoiA
>
1000
)
{
iA
=
200
;
}
if
(
GetTickCount
(
)
-
dgoiA
>
2000
)
{
iA
=
150
;
}
if
(
GetTickCount
(
)
-
dgoiA
>
3000
)
{
iA
=
150
;
}
if
(
GetTickCount
(
)
-
dgoiA
>
4000
)
{
iA
=
65
;
}
if
(
GetTickCount
(
)
-
dgoiA
>
5000
)
{
iA
=
0
;
bgoiA
=
false
;
}
}
}
Woofing Giraffe
30.07.2016, 16:56
Конечно , как бы вопрос я решил. Но все таки , как обойтись без этого ...
И сделать более плавное исчезновение текста.
PHP:
void
Timers
(
)
{
if
(
bgoiA
)
{
if
(
GetTickCount
(
)
-
dgoiA
>
1000
)
{
iA
=
200
;
}
if
(
GetTickCount
(
)
-
dgoiA
>
2000
)
{
iA
=
150
;
}
if
(
GetTickCount
(
)
-
dgoiA
>
3000
)
{
iA
=
150
;
}
if
(
GetTickCount
(
)
-
dgoiA
>
4000
)
{
iA
=
65
;
}
if
(
GetTickCount
(
)
-
dgoiA
>
5000
)
{
iA
=
0
;
bgoiA
=
false
;
}
}
}
Заюзай в цикле SetTimer которые каждую 1 сек будет от А отнимать к примеру 50
Gabriel__
30.07.2016, 16:58
Конечно , как бы вопрос я решил. Но все таки , как обойтись без этого ...
И сделать более плавное исчезновение текста.
1 способ. Создай переменную типа float и в главном цикле отнимай от неё сколько-то десятых или сотых (методом подбора) и потом когда нужно рисовать округляй её до целого числа.
2 способ:
C++:
DWORD tick
=
0
;
uint32 alpha
=
255
;
// mainloop
if
(
GetTickCount
(
)
>=
tick
)
{
alpha
--
;
tick
=
GetTickCount
(
)
+
100
;
}
Woofing Giraffe
30.07.2016, 23:24
Есть у кого структура RPC_ScrShowTextDraw?
Отказывается выводить сообщение при нажатии клавиш, что делать?
C++:
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
)
return
;
if
(
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
)
return
;
if
(
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
SF
->
getRakNet
(
)
->
registerRakNetCallback
(
RakNetScriptHookType
::
RAKHOOK_TYPE_INCOMING_RPC
,
incomingRPC
)
;
// регистрируем callback
init
=
true
;
}
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
VK_LMENU
)
&&
SF
->
getGame
(
)
->
isKeyPressed
(
VK_UP
)
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
}
;
}
Dark_Knight
31.07.2016, 15:19
SF->getGame()->isKeyDown(VK_LMENU)
Как заставить игрока идти/ехать на координаты?
barspinoff
04.08.2016, 02:45
народ, подскажите как читать RPC_ServerCommand, RPC_Chat принимает только слова из чата
itsLegend
04.08.2016, 03:23
Скачай RakLogger+ и глянь.
Dark_Knight
04.08.2016, 12:21
народ, подскажите как читать RPC_ServerCommand, RPC_Chat принимает только слова из чата
Так же само считывать.
barspinoff
04.08.2016, 13:44
Так же само считывать.
пробовал так же само считывать, текст пустой
пробовал так же само считывать, текст пустой
Кинь код, как ты считываешь.
barspinoff
04.08.2016, 14:56
Кинь код, как ты считываешь.
if (params->packetId == RPC_ServerCommand)
{
byte length;
char text[256];
params->bitStream->Read(length);
params->bitStream->Read(text, length);
params->bitStream->ResetReadPointer();
text[length] = 0;
MessageBox(0, text, 0, 64);
}
iAmerican
06.08.2016, 16:18
for (int gun = 23; gun
Gabriel__
06.08.2016, 16:22
[QUOTE="iAmerican"]
for (int gun = 23; gun
iAmerican
06.08.2016, 16:33
http://ru-script.3dn.ru/publ/gta_sa...heskie_adresa_struktura_weapon_dat/34-1-0-154 (https://www.blast.hk/redirect/aHR0cDovL3J1LXNjcmlwdC4zZG4ucnUvcHVibC9ndGFfc2EvZ3 RhX3NhL2lncm92YWphX3BhbWphdF9kaW5hbWljaGVza2llX2Fk cmVzYV9zdHJ1a3R1cmFfd2VhcG9uX2RhdC8zNC0xLTAtMTU0)
for (int gun = 23; gun
Как рисовать текст на игроках ? Есть получение их в зоне стрима , получение их координат.
loremi735
07.08.2016, 14:49
C++:
void
CALLBACK
cmd_show_info_player
(
std
::
string param
)
{
if
(
param
.
empty
(
)
)
return
;
int
i
=
std
::
stoi
(
param
)
;
char
buf
[
128
]
;
stRemotePlayer
*
pPlayer
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
;
if
(
!
pPlayer
)
return
;
sprintf
(
buf
,
"Nickname - %s, Ping - %d, Score - %d, isNPC - %d, AFKState - %d"
,
pPlayer
->
szPlayerName
,
pPlayer
->
iPing
,
pPlayer
->
iScore
,
pPlayer
->
iIsNPC
,
pPlayer
->
pPlayerData
->
iAFKState
==
2
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
buf
)
;
}
;
Почему-то функция выходит после if(!pPlayer).
Насколько я понимаю, что-то не так с указателем на объект класса stRemotePlayer; но i == 0, как я и указал в команде: /showinfo 0, и игрок с таким ID есть, но всё равно !pPlayer возвращает true, и из-за этого выполнение функции прекращается. Что не так?
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot