Просмотр полной версии : SAMPFUNCS | API C++
Страницы :
1
2
3
4
5
6
7
[
8]
Woofing Giraffe
07.08.2016, 14:52
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, и из-за этого выполнение функции прекращается. Что не так?
ты это не на свой ид юзаешь?
loremi735
07.08.2016, 15:41
ты это не на свой ид юзаешь?
Ок, попробовал на других игроках и работает. Благодарю
Как работать с CHandlingEntry
Код:
for (int i = 0; i GetPools()->GetVehicle(i)) {
continue;
}
CHandlingEntry *entry = GAME->GetPools()->GetVehicle(i)->GetHandlingData();
entry->SetABS(true);
}
моментально крашит игру при вызове любого метода этого класса.:help:
Dark_Knight
08.08.2016, 09:38
После получение CHandlingEntry делай проверку на валидность
Код:
if(entry){
entry->SetABS(true);
} else {
SF->Log("CHandlingEntry empty");
}
После получение CHandlingEntry делай проверку на валидность
Код:
if(entry){
entry->SetABS(true);
} else {
SF->Log("CHandlingEntry empty");
}
Они все пустые или я что-то не так делаю
Не путай SAMP ID авто и GTA ID (Handle).
C++:
if
(
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pVehicle
->
iIsListed
[
i
]
)
GAME
->
GetPools
(
)
->
GetVehicle
(
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pVehicle
->
GetCarHandleFromSAMPCarID
(
i
)
)
;
iAmerican
08.08.2016, 15:40
PHP:
void
CALLBACK
textflood
(
std
:
:
string param
)
{
if
(
param
.
empty
(
)
)
return
;
char b
[
64
]
;
sscanf
(
param
.
c_str
(
)
,
"%s"
,
&
b
)
;
SF
-
>
Log
(
" %s"
,
b
)
;
}
;
Если вводить текст например blast hack.
Будет выводиться только blast. Как его заставить что бы полностью брал текст?
Dark_Knight
08.08.2016, 15:43
param юзай.
Woofing Giraffe
08.08.2016, 18:04
PHP:
void
CALLBACK
textflood
(
std
:
:
string param
)
{
if
(
param
.
empty
(
)
)
return
;
char b
[
64
]
;
sscanf
(
param
.
c_str
(
)
,
"%s"
,
&
b
)
;
SF
-
>
Log
(
" %s"
,
b
)
;
}
;
Если вводить текст например blast hack.
Будет выводиться только blast. Как его заставить что бы полностью брал текст?
Либо полностью выводи param, либо регулярное выражение заюзай (например sscanf(param.c_str(), "%[a-zA-Z]", b);)
itsLegend
08.08.2016, 20:33
либо регулярное выражение заюзай (например sscanf(param.c_str(), "%[a-zA-Z]", b);)
Тот же результат будет. Пробел то не учитываешь
скрипторы, а используя SF API можно зарендерить надпись, развернутую на 90 градусов?
itsLegend
09.08.2016, 21:31
скрипторы, а используя SF API можно зарендерить надпись, развернутую на 90 градусов?
stFontInfo :: Print там есть rect. Возможно оно))
UPD: Нет, не оно(
stFontInfo :: Print там есть rect. Возможно оно))
я уже с этим химичил, оно не отвечает за разворот текста.
максимум, что можно сделать, - обрезать его
NarutoUA
09.08.2016, 21:40
Нельзя через стандартные методы SF API
скрипторы, а используя SF API можно зарендерить надпись, развернутую на 90 градусов?
Может поможет.
http://www.gamedev.net/topic/604061-d3d9-rotating-text/ (https://www.blast.hk/redirect/aHR0cDovL3d3dy5nYW1lZGV2Lm5ldC90b3BpYy82MDQwNjEtZD NkOS1yb3RhdGluZy10ZXh0Lw)
Woofing Giraffe
11.08.2016, 19:32
Как получить длину строки в пикселях?
NarutoUA
11.08.2016, 19:45
гугли ID3DXSprite DT_CALCRECT
Dark_Knight
11.08.2016, 21:28
Как получить длину строки в пикселях?
stFontInfo::DrawLength
Woofing Giraffe
12.08.2016, 02:07
Можно как то получить текущий шрифт и его размер?
Dark_Knight
12.08.2016, 02:23
В переменной у тебя же хранится информация.
Код:
struct API stFontInfo
{
char m_szFontName[32];
int m_fontHeight;
}
Woofing Giraffe
12.08.2016, 02:28
В переменной у тебя же хранится информация.
Код:
struct API stFontInfo
{
char m_szFontName[32];
int m_fontHeight;
}
Ты меня немного не понял. Мне нужен шрифт и размер самповский (т.е. чата)
Ты меня немного не понял. Мне нужен шрифт и размер самповский (т.е. чата)
https://msdn.microsoft.com/en-us/library/windows/desktop/bb173964(v=vs.85).aspx (https://www.blast.hk/redirect/aHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicm FyeS93aW5kb3dzL2Rlc2t0b3AvYmIxNzM5NjQodj12cy44NSku YXNweA)
Woofing Giraffe
12.08.2016, 04:11
https://msdn.microsoft.com/en-us/library/windows/desktop/bb173964(v=vs.85).aspx (https://www.blast.hk/redirect/aHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicm FyeS93aW5kb3dzL2Rlc2t0b3AvYmIxNzM5NjQodj12cy44NSku YXNweA)
Можешь дать пример как правильно его использовать? Не особо понял
Dark_Knight
12.08.2016, 12:59
Ты меня немного не понял. Мне нужен шрифт и размер самповский (т.е. чата)
Считай с samp.cfg, но там размер по другому рассчитывается.
Можешь дать пример как правильно его использовать? Не особо понял
В desc будут все настройки шрифта, высота, качество, название и т.д.
C++:
D3DXFONT_DESC desc
;
.
.
.
->
D3DXFont
->
GetDesc
(
&
desc
)
;
C++:
if
(
std
::
regex_match
(
s
,
matched
,
std
::
regex
(
"SMS:\\s*(\\d*).*\\sОтправитель:\\s([\\w]*)\\s\\[т\\.\\d*]"
)
)
)
Крашит как доходит до сюда, что можно сделать?
Dark_Knight
13.08.2016, 13:00
try{
if (std::regex_match(s, matched, std::regex("SMS:\\s*(\\d*).*\\sОтправитель:\\s([\\w]*)\\s\\[т\\.\\d*]")))
}
catch (const std::exception& e){
SF->Log(e.what());
}
Такой вопрос, а как лучше сканить параметры при вводе команды, если я не знаю столько их? Мне нужно разделить игроков на команды с разными именами, к примеру ввожу /squad 100(радиус) 4(кол-во команд) name name name name, name - имя команды.
Dark_Knight
13.08.2016, 13:49
Через 2 регулярки можно попробовать. Сначала сканиуре на радиус и количество. Что после количество записываешь в новую переменную, а потом уже это переменную сканируешь на количество команд.
Как можно получить всех игроков в радиусе?
Dark_Knight
15.08.2016, 12:54
Перебором через пул игроков в стриме, а потом уже и на радиус проверять.
Никак не могу найти этот пул.
Woofing Giraffe
15.08.2016, 17:53
Никак не могу найти этот пул.
Код:
[CODE]
double GetDistantion(double x1, double y1, double z1, double x2, double y2, double z2)
{
return sqrt((pow(x1 - x2), 2) + pow(y1 - y2, 2) + pow(z1 - z2, 2));
}
for (int i = 0; i getSAMP()->getPlayers()->IsPlayerDefined(i, false) && GetDistantion(PEDSELF->GetPosition()->fX,
PEDSELF->GetPosition()->fY,
PEDSELF->GetPosition()->fZ,
SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->fOnFootPos[0],
SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->fOnFootPos[1],
SF->getSAMP()->getPlayers()->pRemotePlayer[i]->pPlayerData->fOnFootPos[2])
Вот тебе пример кода
Ну у меня примерно также.
C++:
int
plid
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
sLocalPlayerID
;
float
px
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
plid
]
->
pPlayerData
->
fOnFootPos
[
0
]
;
float
py
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
plid
]
->
pPlayerData
->
fOnFootPos
[
1
]
;
float
pz
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
plid
]
->
pPlayerData
->
fOnFootPos
[
2
]
;
radius
=
radius
*
radius
;
for
(
int
i
=
0
;
i
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
i
]
->
pPlayerData
;
float
rx
=
pPlayerData
->
fOnFootPos
[
0
]
;
float
ry
=
pPlayerData
->
fOnFootPos
[
1
]
;
float
rz
=
pPlayerData
->
fOnFootPos
[
2
]
;
float
dist
=
pow
(
(
rx
-
px
)
,
2
)
+
pow
(
(
ry
-
py
)
,
2
)
+
pow
(
(
rz
-
pz
)
,
2
)
;
if
(
radius
>=
dist
)
{
ids
.
push_back
(
i
)
;
}
}
Про PEDSELF не знал)
GetCurrentDir(path, 256);
Проверь, что она возвращает. Возможно там уже есть на конце \
Проверь, что она возвращает. Возможно там уже есть на конце \
0, уже все исправил
аналог можно? 009A: 2@ = create_actor_pedtype 4 model #MALE01 (https://www.blast.hk/redirect/aHR0cHM6Ly92ay5jb20vZmVlZD9zZWN0aW9uPXNlYXJjaCZxPS UyM01BTEUwMQ) at 0.0 0.0 0.0
Как повернуть персонажа?
PEDSELF->SetCurrentRotation
в радианах
PEDSELF->SetCurrentRotation
в радианах
Вай спасибо большое
AxewCool
19.08.2016, 11:07
А это единственный гайд по написанию SF плагинов?
Nintendo
19.08.2016, 16:56
мб знает кто адрес анти-стана и килл листа.
Gabriel__
19.08.2016, 17:09
мб знает кто адрес анти-стана и килл листа.
Вот антистан
C++:
uint8_t
*
flags
=
&
ainfo
->
pedFlags
[
12
]
;
// ainfo - actor_info
*
flags
|=
0x4
;
// включить
*
flags
&=
~
0x4
;
// выключить
А возможно ли скрыть серверный textdraw?
Woofing Giraffe
20.08.2016, 19:26
А возможно ли скрыть серверный textdraw?
Хукаешь показ текстдрава и возвращаешь false
Хукаешь показ текстдрава и возвращаешь false
а случаем нету примера хука?
Woofing Giraffe
20.08.2016, 19:42
а случаем нету примера хука?
У меня есть пример, но он хукает только ID и текст.
C++:
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrShowTextDraw
)
{
WORD TID
,
TLen
;
char
Text
[
128
]
;
params
->
bitStream
->
Read
(
TID
)
;
params
->
bitStream
->
IgnoreBits
(
504
)
;
// struct
params
->
bitStream
->
Read
(
TLen
)
;
params
->
bitStream
->
Read
(
Text
,
TLen
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
Text
[
TLen
]
=
'\0'
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"%i || %s"
,
TID
,
Text
)
;
}
А еще вопросик, он срабатывает только тогда, когда появляется текстдрав или постоянно?
Woofing Giraffe
20.08.2016, 20:08
А еще вопросик, он срабатывает только тогда, когда появляется текстдрав или постоянно?
Только когда появляется тексдрав. Есть еще RPC изменения текстдрава и скрытия, которые тоже можно хукнуть. Структура здесь: https://docs.google.com/spreadsheets/d/1iIxEk7yR8r7ZLGiSAL4ndtz_N1k0p3Wt7TE5bei6ztU/edit#gid=1 (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2 QvMWlJeEVrN3lSOHI3WkxHaVNBTDRuZHR6X04xazBwM1d0N1RF NWJlaTZ6dFUvZWRpdCNnaWQ9MQ)
tropical5466
21.08.2016, 12:07
У меня есть пример, но он хукает только ID и текст.
C++:
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrShowTextDraw
)
{
WORD TID
,
TLen
;
char
Text
[
128
]
;
params
->
bitStream
->
Read
(
TID
)
;
params
->
bitStream
->
IgnoreBits
(
504
)
;
// struct
params
->
bitStream
->
Read
(
TLen
)
;
params
->
bitStream
->
Read
(
Text
,
TLen
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
Text
[
TLen
]
=
'\0'
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"%i || %s"
,
TID
,
Text
)
;
}
Можно же сделать так
C++:
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrShowTextDraw
)
{
WORD TID
,
TLen
;
char
Text
[
128
]
;
params
->
bitStream
->
Read
(
TID
)
;
params
->
bitStream
->
IgnoreBits
(
504
)
;
// struct
params
->
bitStream
->
Read
(
TLen
)
;
params
->
bitStream
->
Read
(
Text
,
TLen
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
Text
[
TLen
]
=
'\0'
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"%i || %s"
,
TID
,
Text
)
;
return
false
;
}
Woofing Giraffe
21.08.2016, 13:20
Можно же сделать так
C++:
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrShowTextDraw
)
{
WORD TID
,
TLen
;
char
Text
[
128
]
;
params
->
bitStream
->
Read
(
TID
)
;
params
->
bitStream
->
IgnoreBits
(
504
)
;
// struct
params
->
bitStream
->
Read
(
TLen
)
;
params
->
bitStream
->
Read
(
Text
,
TLen
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
Text
[
TLen
]
=
'\0'
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"%i || %s"
,
TID
,
Text
)
;
return
false
;
}
Тогда ты показ всех текстдравов запретишь
iAmerican
21.08.2016, 13:25
PHP:
if
(
params
-
>
packetId
==
ScriptRPCEnumeration
:
:
RPC_ScrShowTextDraw
)
{
WORD
TID
,
TLen
;
char Text
[
128
]
;
params
-
>
bitStream
-
>
Read
(
TID
)
;
params
-
>
bitStream
-
>
IgnoreBits
(
504
)
;
// struct
params
-
>
bitStream
-
>
Read
(
TLen
)
;
params
-
>
bitStream
-
>
Read
(
Text
,
TLen
)
;
params
-
>
bitStream
-
>
ResetReadPointer
(
)
;
Text
[
TLen
]
=
'\0'
;
SF
-
>
getSAMP
(
)
-
>
getChat
(
)
-
>
AddChatMessage
(
-
1
,
"%i || %s"
,
TID
,
Text
)
;
if
(
TID
==
1
)
{
// Если знаешь ид текстдрава
return
false
;
}
}
iAmerican
22.08.2016, 02:15
Это я неправильно что - то делаю? или в СФ проблема?
C++:
SF
->
Log
(
"%d %d"
,
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pServerInfo
->
ulIP
,
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pServerInfo
->
usPort
)
;
получаю:
Код:
552 1
Это я неправильно что - то делаю? или в СФ проблема?
C++:
SF
->
Log
(
"%d %d"
,
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pServerInfo
->
ulIP
,
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pServerInfo
->
usPort
)
;
получаю:
Код:
552 1
IP это char *, вроде.
NarutoUA
22.08.2016, 04:21
Насчёт порта не знаю, но айпи надо преобразовать в строку (ulIP - число типа 0xAABBCCDD (AA,BB,CC,DD числа из диапазона [0..255] ну типа айпи 255.255.255.255)
Насчёт порта не знаю, но айпи надо преобразовать в строку (ulIP - число типа 0xAABBCCDD (AA,BB,CC,DD числа из диапазона [0..255] ну типа айпи 255.255.255.255)
Хочешь сказать, что 552 это IP 0.0.2.40 ?
Хочешь сказать, что 552 это IP 0.0.2.40 ?
0x00000228
da
iAmerican
22.08.2016, 13:10
IP это char *, вроде.
Нет
Насчёт порта не знаю, но айпи надо преобразовать в строку (ulIP - число типа 0xAABBCCDD (AA,BB,CC,DD числа из диапазона [0..255] ну типа айпи 255.255.255.255)
Сложна че то. Добыл сам из памяти.
Нет
Сложна че то. Добыл сам из памяти.
В сф ващет есть указатель на строковый ip
Nintendo
22.08.2016, 22:28
как убрать звук крови
Woofing Giraffe
23.08.2016, 20:25
Как сделать горизонтальную табуляцию? Например у меня в диалоге есть 2 строки
Какой-то текст |
Еще один текст |
Как мне сделать чтобы обе | были наравне?
Как сделать горизонтальную табуляцию? Например у меня в диалоге есть 2 строки
Какой-то текст |
Еще один текст |
Как мне сделать чтобы обе | были наравне?
выравнивай по пикселям при рендере
Woofing Giraffe
26.08.2016, 01:29
выравнивай по пикселям при рендере
У меня это в тексте диалога... Пытался пробелами, но получается криво, через \t тоже хрень
--- Сообщение обновлено ---
Не у кого идей нету?
MISTER_GONWIK
26.08.2016, 01:35
У меня это в тексте диалога... Пытался пробелами, но получается криво, через \t тоже хрень
--- Сообщение обновлено ---
Не у кого идей нету?
только через \t
У меня это в тексте диалога... Пытался пробелами, но получается криво, через \t тоже хрень
--- Сообщение обновлено ---
Не у кого идей нету?
Определи самую длинную строку, получи её ширину в пикселях, возьми получение значение+Х текста получишь Х для линии, сделай линию вниз.
Woofing Giraffe
28.08.2016, 21:45
Чем отличаются знаки форматирования %d и %i?
iAmerican
29.08.2016, 19:12
Чем отличаются знаки форматирования %d и %i?
нечем , имеют разницу только при вводе scanf()
Visual Studio 2015 подойдет?
DarkP1xel
02.09.2016, 12:57
Да.
DarkExorcist
05.09.2016, 17:53
как узнать, что ты убил игрока?
Woofing Giraffe
05.09.2016, 19:56
как узнать, что ты убил игрока?
RPC_ScrDeathMessage хукай
Почему RPC_GiveTakeDamage выдаёт неверный дамаг? К примеру, наноситься урон 5, но RPC_GiveTakeDamage отображает 1.
Dark_Knight
06.09.2016, 21:39
Потому что сервер сам свои значения может снимать. Ты хоть верно читаешь?
Потому что сервер сам свои значения может снимать. Ты хоть верно читаешь?
Код:
if (params->packetId == RPCEnumeration::RPC_GiveTakeDamage)
{
bool giveTake;
WORD playerID;
float amount;
DWORD weaponID;
params->bitStream->ResetReadPointer();
params->bitStream->Read(giveTake);
params->bitStream->Read(playerID);
params->bitStream->Read(amount);
params->bitStream->Read(weaponID);
params->bitStream->ResetReadPointer();
}
Например, удары кулаком наносят 6 урона, но отображает либо 1, либо 3, либо 6. Рандомно крч. Чё за фигня?. :D
Dark_Knight
07.09.2016, 01:04
bool type;
WORD playerID;
float damage;
int gun, bodyID;
params->bitStream->ResetReadPointer();
params->bitStream->Read(type);
params->bitStream->Read(playerID);
params->bitStream->Read(damage);
params->bitStream->Read(gun);
params->bitStream->Read(bodyID);
Можно ли как-то выбрать нужный пункт в диалоге не прибегая к использованию эмуляции нажатия клавиши?
Можно ли как-то выбрать нужный пункт в диалоге не прибегая к использованию эмуляции нажатия клавиши?
Возможно. Через RPC
Возможно. Через RPC
А примера не будет?
Здрасти.
Код:
for (int m = 0; m getSAMP()->getChat()->AddChatMessage(-1, "One: %d, Two: %d, Three: %s", typeOne, typeTwo, typeThree[n]);
}
}
}
}
Почему крашит? Нужно вывести текст из массива typeThree. (код для примера)
Здрасти.
Код:
for (int m = 0; m getSAMP()->getChat()->AddChatMessage(-1, "One: %d, Two: %d, Three: %s", typeOne, typeTwo, typeThree[n]);
}
}
}
}
Почему крашит? Нужно вывести текст из массива typeThree. (код для примера)
ты странный. ты в цикле ищешь число, которое совпадает с числом записаным в уже существующую переменную. Зачем???
ты странный. ты в цикле ищешь число, которое совпадает с числом записаным в уже существующую переменную. Зачем???
Да бля, сонный с выебаными мозгами писал. Исправил:
Код:
for (int m = 0; m getSAMP()->getChat()->AddChatMessage(-1, "One: %d, Two: %d, Three: %d, Four: %s", typeOne, typeTwo, typeThree, typeFour[n]);
}
}
}
}
Нужно вывести текст из массива typeFour, меня какого-то фига крашит.
Исправил
тебе меня не обмануть.
тебе меня не обмануть.
SF->getSAMP()->getChat()->AddChatMessage(-1, "One: %d, Two: %d, Three: %d, Four: %s", typeOne, typeTwo, typeThree, typeFour[n]);
Nintendo
22.09.2016, 16:46
как нарисовать 3д текст? над головой
iAmerican
22.09.2016, 18:47
как нарисовать 3д текст? над головой
Ну я делал запарным методом.
Получал координаты кости головы.
Потом была формула которая в зависимости от того на какой дистанции игрок , прибавляла число к координате головы.
Ну как то так , думаю можно и проще . Код если нужен , в лс пиши.
MISTER_GONWIK
22.09.2016, 18:53
как нарисовать 3д текст? над головой
SF->getSAMP()->getInfo()->pPools->pText3D->Create3DText(..);
Nintendo
22.09.2016, 21:58
Не рендрится нихуя.
PHP:
bool
CALLBACK
outcomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
-
>
packetId
==
RPCEnumeration
:
:
RPC_GiveTakeDamage
)
if
(
lol
==
true
)
{
params
-
>
bitStream
-
>
Read
(
bGiveOrTake
)
;
params
-
>
bitStream
-
>
Read
(
iPlayerID
)
;
params
-
>
bitStream
-
>
Read
(
fAmmount
)
;
params
-
>
bitStream
-
>
Read
(
iWeaponID
)
;
params
-
>
bitStream
-
>
Read
(
iBodyPart
)
;
if
(
!
bGiveOrTake
)
{
SF
-
>
getSAMP
(
)
-
>
getChat
(
)
-
>
AddChatMessage
(
D3DCOLOR_XRGB
(
245
,
184
,
0
)
,
"{006400}Попал по: %d | Нанес: %.f | Оружие: %d | Часть тела: %d "
,
iPlayerID
,
fAmmount
,
iWeaponID
,
iBodyPart
)
;
sprintf
(
buf
,
"{006400}/ - %.2f / "
,
fAmmount
)
;
rTimer
=
GetTickCount
(
)
+
2000
;
}
else
{
SF
-
>
getSAMP
(
)
-
>
getChat
(
)
-
>
AddChatMessage
(
D3DCOLOR_XRGB
(
245
,
184
,
0
)
,
"{8b0000}Урон от: %d | Нанес по мне: %.f | Оружие: %d | Часть тела: %d "
,
iPlayerID
,
fAmmount
,
iWeaponID
,
iBodyPart
)
;
}
}
;
return
true
;
}
;
bool
CALLBACK
Present
(
CONST
RECT
*
pSourceRect
,
CONST
RECT
*
pDestRect
,
HWND
hDestWindowOverride
,
CONST
RGNDATA
*
pDirtyRegion
)
{
if
(
SUCCEEDED
(
SF
-
>
getRender
(
)
-
>
BeginRender
(
)
)
)
if
(
rTimer
>=
GetTickCount
(
)
)
{
float sx
,
sy
;
SF
-
>
getGame
(
)
-
>
convert3DCoordsToScreen
(
SF
-
>
getSAMP
(
)
-
>
getPlayers
(
)
-
>
GetOnFootData
(
iPlayerID
)
-
>
fPosition
[
0
]
,
SF
-
>
getSAMP
(
)
-
>
getPlayers
(
)
-
>
GetOnFootData
(
iPlayerID
)
-
>
fPosition
[
1
]
,
SF
-
>
getSAMP
(
)
-
>
getPlayers
(
)
-
>
GetOnFootData
(
iPlayerID
)
-
>
fPosition
[
2
]
+
1
,
&
sx
,
&
sy
)
;
pFont
-
>
Print
(
buf
,
sx
,
sy
,
false
)
;
SF
-
>
getRender
(
)
-
>
EndRender
(
)
;
}
;
return
true
;
}
;
Dark_Knight
22.09.2016, 22:06
А ты зарегистрировал все коллбеки?
Nintendo
22.09.2016, 22:13
А ты зарегистрировал все коллбеки?
PHP:
SF
-
>
getRakNet
(
)
-
>
registerRakNetCallback
(
RakNetScriptHookType
:
:
RAKHOOK_TYPE_OUTCOMING_RPC
,
outcomingRPC
)
;
pFont
=
SF
-
>
getRender
(
)
-
>
CreateNewFont
(
"Tahoma"
,
5
,
FCR_BORDER
)
;
SF
-
>
getRender
(
)
-
>
registerD3DCallback
(
eDirect3DDeviceMethods
:
:
D3DMETHOD_PRESENT
,
Present
)
;
SF
-
>
getSAMP
(
)
-
>
registerChatCommand
(
"dinf"
,
testt
)
;
iAmerican
23.09.2016, 16:45
Уверен что таймер работает как надо?
Nintendo
23.09.2016, 17:08
Уверен что таймер работает как надо?
Вроде как
Woofing Giraffe
23.09.2016, 18:53
Мож ты 5-ый размер не видишь просто?
MISTER_GONWIK
24.09.2016, 11:45
Не рендрится нихуя.
PHP:
bool
CALLBACK
outcomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
-
>
packetId
==
RPCEnumeration
:
:
RPC_GiveTakeDamage
)
if
(
lol
==
true
)
{
params
-
>
bitStream
-
>
Read
(
bGiveOrTake
)
;
params
-
>
bitStream
-
>
Read
(
iPlayerID
)
;
params
-
>
bitStream
-
>
Read
(
fAmmount
)
;
params
-
>
bitStream
-
>
Read
(
iWeaponID
)
;
params
-
>
bitStream
-
>
Read
(
iBodyPart
)
;
if
(
!
bGiveOrTake
)
{
SF
-
>
getSAMP
(
)
-
>
getChat
(
)
-
>
AddChatMessage
(
D3DCOLOR_XRGB
(
245
,
184
,
0
)
,
"{006400}Попал по: %d | Нанес: %.f | Оружие: %d | Часть тела: %d "
,
iPlayerID
,
fAmmount
,
iWeaponID
,
iBodyPart
)
;
sprintf
(
buf
,
"{006400}/ - %.2f / "
,
fAmmount
)
;
rTimer
=
GetTickCount
(
)
+
2000
;
}
else
{
SF
-
>
getSAMP
(
)
-
>
getChat
(
)
-
>
AddChatMessage
(
D3DCOLOR_XRGB
(
245
,
184
,
0
)
,
"{8b0000}Урон от: %d | Нанес по мне: %.f | Оружие: %d | Часть тела: %d "
,
iPlayerID
,
fAmmount
,
iWeaponID
,
iBodyPart
)
;
}
}
;
return
true
;
}
;
bool
CALLBACK
Present
(
CONST
RECT
*
pSourceRect
,
CONST
RECT
*
pDestRect
,
HWND
hDestWindowOverride
,
CONST
RGNDATA
*
pDirtyRegion
)
{
if
(
SUCCEEDED
(
SF
-
>
getRender
(
)
-
>
BeginRender
(
)
)
)
if
(
rTimer
>=
GetTickCount
(
)
)
{
float sx
,
sy
;
SF
-
>
getGame
(
)
-
>
convert3DCoordsToScreen
(
SF
-
>
getSAMP
(
)
-
>
getPlayers
(
)
-
>
GetOnFootData
(
iPlayerID
)
-
>
fPosition
[
0
]
,
SF
-
>
getSAMP
(
)
-
>
getPlayers
(
)
-
>
GetOnFootData
(
iPlayerID
)
-
>
fPosition
[
1
]
,
SF
-
>
getSAMP
(
)
-
>
getPlayers
(
)
-
>
GetOnFootData
(
iPlayerID
)
-
>
fPosition
[
2
]
+
1
,
&
sx
,
&
sy
)
;
pFont
-
>
Print
(
buf
,
sx
,
sy
,
false
)
;
SF
-
>
getRender
(
)
-
>
EndRender
(
)
;
}
;
return
true
;
}
;
я вижу "if(lol ==true)", он вообще активен?
Woofing Giraffe
24.09.2016, 17:58
Как преобразовать вектор скорости машины в одно число? Чтоб было тоже самое что 02E3 возвращает
MISTER_GONWIK
24.09.2016, 18:06
Как преобразовать вектор скорости машины в одно число? Чтоб было тоже самое что 02E3 возвращает
загугли
Nintendo
24.09.2016, 19:19
я вижу "if(lol ==true)", он вообще активен?
Да, конечно
iAmerican
25.09.2016, 12:36
Как преобразовать вектор скорости машины в одно число? Чтоб было тоже самое что 02E3 возвращает
Посмотри сурс тут - https://www.blast.hk/threads/13382/
хз правда что там твой 02e3 возвращает , но думаю тоже самое.
Dark_Knight
25.09.2016, 13:38
Как преобразовать вектор скорости машины в одно число? Чтоб было тоже самое что 02E3 возвращает
float speed = sqrt(pow(car->speed[0], 2) + pow(car->speed[1], 2) + pow(car->speed[2], 2));
Nintendo
25.09.2016, 21:59
загугли
Вот весь код
PHP:
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
bool lol
;
bool bGiveOrTake
;
short int iPlayerID
;
float fAmmount
;
int iWeaponID
,
iBodyPart
;
DWORD
rTimer
;
stFontInfo
*
pFont
;
char buf
[
128
]
;
bool
CALLBACK
outcomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
-
>
packetId
==
RPCEnumeration
:
:
RPC_GiveTakeDamage
)
if
(
lol
==
true
)
{
params
-
>
bitStream
-
>
Read
(
bGiveOrTake
)
;
params
-
>
bitStream
-
>
Read
(
iPlayerID
)
;
params
-
>
bitStream
-
>
Read
(
fAmmount
)
;
params
-
>
bitStream
-
>
Read
(
iWeaponID
)
;
params
-
>
bitStream
-
>
Read
(
iBodyPart
)
;
if
(
!
bGiveOrTake
)
{
SF
-
>
getSAMP
(
)
-
>
getChat
(
)
-
>
AddChatMessage
(
D3DCOLOR_XRGB
(
245
,
184
,
0
)
,
"{006400}Попал по: %d | Нанес: %.f | Оружие: %d | Часть тела: %d "
,
iPlayerID
,
fAmmount
,
iWeaponID
,
iBodyPart
)
;
sprintf
(
buf
,
"{006400}/ - %.2f / "
,
fAmmount
)
;
rTimer
=
GetTickCount
(
)
+
2000
;
}
else
{
SF
-
>
getSAMP
(
)
-
>
getChat
(
)
-
>
AddChatMessage
(
D3DCOLOR_XRGB
(
245
,
184
,
0
)
,
"{8b0000}Урон от: %d | Нанес по мне: %.f | Оружие: %d | Часть тела: %d "
,
iPlayerID
,
fAmmount
,
iWeaponID
,
iBodyPart
)
;
}
}
;
return
true
;
}
;
bool
CALLBACK
Present
(
CONST
RECT
*
pSourceRect
,
CONST
RECT
*
pDestRect
,
HWND
hDestWindowOverride
,
CONST
RGNDATA
*
pDirtyRegion
)
{
if
(
SUCCEEDED
(
SF
-
>
getRender
(
)
-
>
BeginRender
(
)
&&
lol
==
true
)
)
if
(
rTimer
>=
GetTickCount
(
)
)
{
float sx
,
sy
;
SF
-
>
getGame
(
)
-
>
convert3DCoordsToScreen
(
SF
-
>
getSAMP
(
)
-
>
getPlayers
(
)
-
>
GetOnFootData
(
iPlayerID
)
-
>
fPosition
[
0
]
,
SF
-
>
getSAMP
(
)
-
>
getPlayers
(
)
-
>
GetOnFootData
(
iPlayerID
)
-
>
fPosition
[
1
]
,
SF
-
>
getSAMP
(
)
-
>
getPlayers
(
)
-
>
GetOnFootData
(
iPlayerID
)
-
>
fPosition
[
2
]
+
1
,
&
sx
,
&
sy
)
;
pFont
-
>
Print
(
buf
,
sx
,
sy
,
false
)
;
SF
-
>
getRender
(
)
-
>
EndRender
(
)
;
}
;
return
true
;
}
;
void
CALLBACK
testt
(
std
:
:
string param
)
{
lol
^
=
true
;
if
(
lol
)
SF
-
>
Log
(
"{006400}ON"
)
;
else
SF
-
>
Log
(
"{8b0000}OFF"
)
;
}
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
-
>
getRakNet
(
)
-
>
registerRakNetCallback
(
RakNetScriptHookType
:
:
RAKHOOK_TYPE_OUTCOMING_RPC
,
outcomingRPC
)
;
pFont
=
SF
-
>
getRender
(
)
-
>
CreateNewFont
(
"Tahoma"
,
5
,
FCR_BORDER
)
;
SF
-
>
getRender
(
)
-
>
registerD3DCallback
(
eDirect3DDeviceMethods
:
:
D3DMETHOD_PRESENT
,
Present
)
;
SF
-
>
getSAMP
(
)
-
>
registerChatCommand
(
"dinf"
,
testt
)
;
init
=
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
26.09.2016, 00:03
Я или идиот, или так не правильно же будет?
if( SUCCEEDED( SF->getRender()->BeginRender()&& lol ==true))
замени на
if( SUCCEEDED( SF->getRender()->BeginRender()) && lol )
Nintendo
26.09.2016, 00:18
Я или идиот, или так не правильно же будет?
if( SUCCEEDED( SF->getRender()->BeginRender()&& lol ==true))
замени на
if( SUCCEEDED( SF->getRender()->BeginRender()) && lol )
Сделал как ты сказал, после чего начал стрелять в игрока нету рендера, и потом краш.
Dark_Knight
27.09.2016, 13:22
Уже на верном пути тогда. Проверяй что актер существует, а потом только уже получай координаты.
DarkExorcist
30.09.2016, 18:49
Код:
BitStream bsClass;
bsClass.Write((DWORD)playerid);
bsClass.Write((DWORD)0xFF0000FF);
bsClass.Write((float)100.0);
bsClass.Write((DWORD)10000);
bsClass.Write("1111",5);
SF->getRakNet()->emulateRecvRPC(59, &bsClass);
При перехвате все работает, а вот при эмуляции - нет. Что не так в коде?
itsLegend
30.09.2016, 18:52
unsigned short - playerid
integer - color
float - draw distance
integer - expire time
byte - string lenght
char - string
Когда-то была темка на форуме, как использовать AntTweakBar в одном плагине, без дополнительного "0 LiteAntTweakBar.sf". Может кто сейчас подсказать как это реализовать? :D
DarkP1xel
03.10.2016, 23:49
А какая разница? Без этого .SF тебе все равно придется использовать .DLL.
А какая разница? Без этого .SF тебе все равно придется использовать .DLL.
Он имеет введу, чтобы вшить атб в сам плагин, без использования дополнительных библиотек. Как в сб хаке.
Dark_Knight
04.10.2016, 19:36
Берешь сурс и вшиваешь. Но возможно будет конфликтовать с другими плагинами.
http://anttweakbar.sourceforge.net/doc/tools:anttweakbar:download (https://www.blast.hk/redirect/aHR0cDovL2FudHR3ZWFrYmFyLnNvdXJjZWZvcmdlLm5ldC9kb2 MvdG9vbHM6YW50dHdlYWtiYXI6ZG93bmxvYWQ)
Что не так? Какую-то фигню выдаёт вместо нужного текста.
Код:
if (params->packetId == ScriptRPCEnumeration::RPC_ScrCreate3DTextLabel)
{
WORD ID;
char text[256];
DWORD color;
float pos[3];
BYTE testLOS;
params->bitStream->ResetReadPointer();
params->bitStream->Read(ID);
params->bitStream->Read(text);
params->bitStream->Read(color);
params->bitStream->Read(pos);
params->bitStream->Read(testLOS);
SF->getSAMP()->getChat()->AddChatMessage(-1, "ID: %d | Text: %s", ID, text);
}
Если эт не то, то как считaть 3д текст?
Что не так? Какую-то фигню выдаёт вместо нужного текста.
Код:
if (params->packetId == ScriptRPCEnumeration::RPC_ScrCreate3DTextLabel)
{
WORD ID;
char text[256];
DWORD color;
float pos[3];
BYTE testLOS;
params->bitStream->ResetReadPointer();
params->bitStream->Read(ID);
params->bitStream->Read(text);
params->bitStream->Read(color);
params->bitStream->Read(pos);
params->bitStream->Read(testLOS);
SF->getSAMP()->getChat()->AddChatMessage(-1, "ID: %d | Text: %s", ID, text);
}
Если эт не то, то как считaть 3д текст?
Код:
if (params->packetId == ScriptRPCEnumeration::RPC_ScrCreate3DTextLabel)
{
WORD ID;
char text[256];
params->bitStream->ResetReadPointer();
params->bitStream->Read(ID);
params->bitStream->SetReadOffset(0xD8);
SF->getRakNet()->DecodeString(text, 256, params->bitStream);
SF->getSAMP()->getChat()->AddChatMessage(-1, "ID: %d | Text: %s", ID, text);
}
Полная структура
id - word, color - dword, pos - float[3], DrawDist - float, testLOS - byte, unk - dword(всегда 0xFFFFFF), text - encoded
Почему не перемещает за размеры 500, 500? OnMouseHover(x, y, 500, 500)
C++:
BOOL
OnMouseHover
(
int
x
,
int
y
,
int
w
,
int
h
)
{
POINT pos
;
GetCursorPos
(
&
pos
)
;
return
(
pos
.
x
>=
x
&&
pos
.
x
=
y
&&
pos
.
y
getGame
(
)
->
isKeyDown
(
0x01
)
)
{
POINT pt
;
GetCursorPos
(
&
pt
)
;
x
=
pt
.
x
,
y
=
pt
.
y
;
}
}
iAmerican
19.10.2016, 10:44
Почему не перемещает за размеры 500, 500? OnMouseHover(x, y, 500, 500)
C++:
BOOL
OnMouseHover
(
int
x
,
int
y
,
int
w
,
int
h
)
{
POINT pos
;
GetCursorPos
(
&
pos
)
;
return
(
pos
.
x
>=
x
&&
pos
.
x
=
y
&&
pos
.
y
getGame
(
)
->
isKeyDown
(
0x01
)
)
{
POINT pt
;
GetCursorPos
(
&
pt
)
;
x
=
pt
.
x
,
y
=
pt
.
y
;
}
}
Пример :
C++:
static
POINT offset
;
POINT cursor
=
SF
->
getGame
(
)
->
getCursorPos
(
)
;
if
(
cursor
.
x
hpX
-
30
&&
cursor
.
y
hpY
-
30
)
{
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
VK_LBUTTON
)
)
{
offset
.
x
=
hpX
-
cursor
.
x
;
offset
.
y
=
hpY
-
cursor
.
y
;
}
if
(
SF
->
getGame
(
)
->
isKeyDown
(
VK_LBUTTON
)
)
{
hpX
=
cursor
.
x
+
offset
.
x
;
hpY
=
cursor
.
y
+
offset
.
y
;
}
}
Или попробуй вот так :
Почему не перемещает за размеры 500, 500? OnMouseHover(x, y, 500, 500)
C++:
BOOL
OnMouseHover
(
int
x
,
int
y
,
int
w
,
int
h
)
{
POINT pos
;
GetCursorPos
(
&
pos
)
;
return
(
pos
.
x
>=
x
&&
pos
.
x
=
y
&&
pos
.
y
getGame
(
)
->
isKeyDown
(
0x01
)
)
{
if
(
OnMouseHover
(
x
,
y
,
500
,
500
)
)
{
POINT pt
;
GetCursorPos
(
&
pt
)
;
x
=
pt
.
x
,
y
=
pt
.
y
;
}
}
Пример :
C++:
static
POINT offset
;
POINT cursor
=
SF
->
getGame
(
)
->
getCursorPos
(
)
;
if
(
cursor
.
x
hpX
-
30
&&
cursor
.
y
hpY
-
30
)
{
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
VK_LBUTTON
)
)
{
offset
.
x
=
hpX
-
cursor
.
x
;
offset
.
y
=
hpY
-
cursor
.
y
;
}
if
(
SF
->
getGame
(
)
->
isKeyDown
(
VK_LBUTTON
)
)
{
hpX
=
cursor
.
x
+
offset
.
x
;
hpY
=
cursor
.
y
+
offset
.
y
;
}
}
уже лучше, но всё равно возвращает на исходные координаты, если далеко увожу мышку.
Подскажите, почему GetHealth() постоянно показывает 100 и только если оно берет хп моё тогда правильно показывает?!
C++:
[CODE]
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
VK_F10
)
)
{
CVehicle
*
pCurrentVehicle
=
GAME
->
GetPools
(
)
->
GetVehicle
(
reinterpret_cast
(
SF
->
getGame
(
)
->
vehicleInfoGet
(
VEHICLE_SELF
,
0
)
)
)
;
if
(
pCurrentVehicle
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"IsBeingDriven - %d | PassengerCount - %d"
,
pCurrentVehicle
->
IsBeingDriven
(
)
,
pCurrentVehicle
->
GetPassengerCount
(
)
)
;
for
(
int
i
=
0
,
j
=
pCurrentVehicle
->
GetPassengerCount
(
)
,
pid
=
-
1
;
i
GetPassenger
(
i
)
;
if
(
passenger
)
{
pid
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetSAMPPlayerIDFromGTAHandle
(
GAME
->
GetPools
(
)
->
GetPedRef
(
passenger
)
)
;
auto
hp
=
passenger
->
GetHealth
(
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"GetPassenger(%d) - %s[%d] | HP - %f"
,
i
,
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetPlayerName
(
pid
)
,
pid
,
hp
)
;
if
(
hp
NarutoUA
19.10.2016, 17:35
Еще есть функция для проверки лежит ли точка в прямоугольнике PtInRect
https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd162882(v=vs.85).aspx (https://www.blast.hk/redirect/aHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vcnUtcnUvbGlicm FyeS93aW5kb3dzL2Rlc2t0b3AvZGQxNjI4ODIodj12cy44NSku YXNweA)
C++:
stBulletData bulletData
;
memset
(
&
bulletData
,
0
,
sizeof
(
stBulletData
)
)
;
byte packetID
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
packetID
)
;
params
->
bitStream
->
Read
(
(
char
*
)
&
bulletData
,
sizeof
(
stBulletData
)
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
SF
->
Log
(
"-> TargetID: %d | Target: %.3f, %.3f, %.3f | Origin: %.3f, %.3f, %.3f | Center: %.3f, %.3f, %.3f"
,
bulletData
.
sTargetID
,
bulletData
.
fTarget
[
0
]
,
bulletData
.
fTarget
[
1
]
,
bulletData
.
fTarget
[
2
]
,
bulletData
.
fOrigin
[
0
]
,
bulletData
.
fOrigin
[
1
]
,
bulletData
.
fOrigin
[
2
]
,
bulletData
.
fCenter
[
0
]
,
bulletData
.
fCenter
[
1
]
,
bulletData
.
fCenter
[
2
]
)
;
А в логе получаю вот это:
C++:
TagetID
:
256
|
Target
:
-
123526324853786050000000.000
,
3002534671919167300000.000
,
-
157041088764241890000000000000000.000
|
Origin
:
2224.054
,
-
0.000
,
-
70597757144914183000000000000000.000
|
Center
:
-
2.004
,
0.000
,
-
2600830318495991100000000000000000.000
В чем проблема?
DarkP1xel
29.10.2016, 03:54
там player id после ид пакета
там player id после ид пакета
Почему тогда outcoming пакет читается нормально?
upd:
Все работает. Спасибо.
Как реализовать функци. get_z_angle_for_point на С++. Мне нужно отправить ложную онфут синхру.
Можно ли как-то вставить текст в input диалога?
[QUOTE="MoZg"]
Подскажите, почему GetHealth() постоянно показывает 100 и только если оно берет хп моё тогда правильно показывает?!
C++:
[CODE]
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
VK_F10
)
)
{
CVehicle
*
pCurrentVehicle
=
GAME
->
GetPools
(
)
->
GetVehicle
(
reinterpret_cast
(
SF
->
getGame
(
)
->
vehicleInfoGet
(
VEHICLE_SELF
,
0
)
)
)
;
if
(
pCurrentVehicle
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"IsBeingDriven - %d | PassengerCount - %d"
,
pCurrentVehicle
->
IsBeingDriven
(
)
,
pCurrentVehicle
->
GetPassengerCount
(
)
)
;
for
(
int
i
=
0
,
j
=
pCurrentVehicle
->
GetPassengerCount
(
)
,
pid
=
-
1
;
i
GetPassenger
(
i
)
;
if
(
passenger
)
{
pid
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetSAMPPlayerIDFromGTAHandle
(
GAME
->
GetPools
(
)
->
GetPedRef
(
passenger
)
)
;
auto
hp
=
passenger
->
GetHealth
(
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"GetPassenger(%d) - %s[%d] | HP - %f"
,
i
,
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetPlayerName
(
pid
)
,
pid
,
hp
)
;
if
(
hp
andrejandrej
04.11.2016, 21:03
C++:
stBulletData bulletsync
;
byte packet
;
byte ID
;
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
packet
)
;
params
->
bitStream
->
Read
(
ID
)
;
params
->
bitStream
->
Read
(
(
PCHAR
)
&
bulletsync
,
sizeof
(
stBulletData
)
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
Шо не правильно? Не могу получить нужный результат, ничего не записывается в структуру. (входящий)
itsLegend
04.11.2016, 21:14
ID игрока - 2 байта
Какой функцией на С++ можно заменить опкод get_z_angle_for_point?
Использовал:
C++:
atan2
(
targetPos
.
fY
-
GAME
->
GetCamera
(
)
->
GetCam
(
GAME
->
GetCamera
(
)
->
GetActiveCam
(
)
)
->
GetSource
(
)
->
fY
,
targetPos
.
fX
-
GAME
->
GetCamera
(
)
->
GetCam
(
GAME
->
GetCamera
(
)
->
GetActiveCam
(
)
)
->
GetSource
(
)
->
fX
)
;
но это не то, наверное.
andrejandrej
06.11.2016, 15:09
Интересненький вопрос, ребят. Как к примеру отправить онфут синхру смены координат, но при этом чтобы этого не было видно другим игрокам.
Интересненький вопрос, ребят. Как к примеру отправить онфут синхру смены координат, но при этом чтобы этого не было видно другим игрокам.
Никак. Если только отправить один раз из 20 за секунду, чтобы это чисто физически никто не заметил.
andrejandrej
11.11.2016, 16:37
По какому принципу работает "ГМ облет пуль"? или подобное :scratch:
По какому принципу работает "ГМ облет пуль"? или подобное :scratch:
В входящей буллет синхре изменяется оффсет или таргет, вроде.
Если я поставлю хук на D3DMETHOD_RESET, мой callback вызовется перед вызовом оригинального метода, или после него? И можно ли как-то поставить хук перед вызовом и после вызова? SFAPI
BlackKnigga
13.11.2016, 18:49
Как нажать на Player TextDraw? SF->getSAMP()->sendClickTextDraw() как я понял жмет только на обычные текстдравы.
Мне нужны те что в структуре PlayerTextdraw хранятся.
Отправил рпц, заработало.
Делаю что-то на подобии чекера. Показ игроков при заходе на сервер/выходе с сервера отображает/сохранение новых ников в файлик работает на ура, а вот при попытке принудительно (командой/клавишей, не важно) перегрузить список (из файла) - крашит.
Крашит именно из-за этого участка кода:
Код:
if (reload == true)
{
for (int id = 0; id getSAMP()->getPlayers()->GetPlayerName(id), playername[x]))
{
SF->getSAMP()->getChat()->AddChatMessage(-1, "Пиздюк %s[%d] подключился к серверу.", SF->getSAMP()->getPlayers()->GetPlayerName(id), id);
}
}
}
reload = false;
}
p.s. не поливайте сразу гавном :D
itsLegend
15.11.2016, 00:37
Есть такая штука как комментарии. С помощью них ты можешь узнать какая именно строчка является проблемной.
Есть такая штука как комментарии. С помощью них ты можешь узнать какая именно строчка является проблемной.
Конечно сорян за нубский вопрос, но о чём ты? :D
Я знаю что такое комментарии, но как они помогут понять немогу.
itsLegend
15.11.2016, 01:14
К тому, что это может быть либо addChatMessage, либо stricmp. Перед тем, как написать сюда, закомментировал тело цикла и искал бы именно проблемную функцию. Тут их уж не так и много, и предполагаю, что getPlayerName возвращает NULL и stricmp пытается прочитать нулевой указатель.
Any Example For Create DXUT Dialog? like a in cleo.
itsLegend
15.11.2016, 01:40
Any Example For Create DXUT Dialog? like a in cleo.
Search the required SAMP DXUT's addresses or use SF->getCleo()->callOpcode
Sire Like
15.11.2016, 22:10
Можн как-то зарендрить то что я ввожу с клавиатуры?
BlackKnigga
15.11.2016, 22:47
Как проверить нажата ли клавиша при открытом чате?
Как проверить нажата ли клавиша при открытом чате?
Как вариант, GetAsyncKeyState
BlackKnigga
16.11.2016, 13:13
Как вариант, GetAsyncKeyState
Пробовал уже, и хук ставил SetWindowsHookEx, выходит ошибка:
Код:
error LNK2019: ссылка на неразрешенный внешний символ __imp__GetAsyncKeyState@4 в функции "void __stdcall mainloop(void)" (?mainloop@@YGXXZ)
Мб что то не так делаю?
C++:
if
(
GetAsyncKeyState
(
VK_TAB
)
)
{
SF
->
Log
(
"Tab Pressed"
)
;
}
Sire Like
16.11.2016, 13:34
Пробовал уже, и хук ставил SetWindowsHookEx, выходит ошибка:
Код:
error LNK2019: ссылка на неразрешенный внешний символ __imp__GetAsyncKeyState@4 в функции "void __stdcall mainloop(void)" (?mainloop@@YGXXZ)
Мб что то не так делаю?
C++:
if
(
GetAsyncKeyState
(
VK_TAB
)
)
{
SF
->
Log
(
"Tab Pressed"
)
;
}
Библиотеку вруби
Как проверить нажата ли клавиша при открытом чате?
Поставить хук на функцию WndProc.
Твой wndProc:
bool __stdcall wndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
return true;
}
Регистрируем callback:
SF->getGame()->registerWndProcCallback(SFGame::WndProcCallbackPri ority::HIGH_CB_PRIORITY, *wndProc);
Честно, не знаю что за приоритеты в аргументе, сам уже потестишь.
BlackKnigga
03.12.2016, 21:24
Как можно переместить чат с input box?
Woofing Giraffe
07.12.2016, 19:35
https://pp.vk.me/c626716/v626716558/52996/sxysHK9chqI.jpg
Из за чего цвет смещается? Вроде всё правильно выставил
Dark_Knight
07.12.2016, 20:02
Мы ванги? Код где?
iAmerican
11.12.2016, 12:51
Надо было по быстрому сделать чекер 0 лвлов , сделал на быструю руку. Но проблема в том , что он выводит не до конца всех игроков. А просто обрезает половину.
сидел , пробовал и так и так , что-то не получилось вообщем доделать, подскажите кто нибудь, буду благодарен.
https://pp.vk.me/c836538/v836538033/1237b/-McaK-ptmMs.jpg
Код :
UPD:
Прокоментил строки
C++:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
int
Score
=
3
;
stFontInfo
*
pFont
;
char
oldnick
[
4096
]
=
{
0
}
;
char
nick
[
4096
]
=
{
0
}
;
bool
bAct
=
false
;
void
CALLBACK
cmd_show_info_player
(
std
::
string param
)
{
bAct
^=
true
;
}
bool
CALLBACK
Present
(
CONST RECT
*
pSourceRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindowOverride
,
CONST RGNDATA
*
pDirtyRegion
)
{
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
// если рендерер готов к рисованию
{
// рисуем
if
(
bAct
)
{
for
(
uint16_t
it
=
0
;
it
getSAMP
(
)
->
getInfo
(
)
->
UpdateScoreAndPing
(
)
;
// обновляем таб
if
(
!
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
[
it
]
)
continue
;
// проверяем подключен ли игрок
Score
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
it
]
->
iScore
;
// Записываем в переменную лвл игрока
if
(
Score
==
0
)
// Проверяем что игрок 0 лвл.
{
sprintf
(
oldnick
,
"%s [%i]"
,
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetPlayerName
(
it
)
,
it
)
;
sprintf
(
nick
,
"%s \n %s"
,
nick
,
oldnick
)
;
// и так всё понятно.
}
}
pFont
->
Print
(
nick
,
D3DCOLOR_ARGB
(
170
,
255
,
255
,
255
)
,
500
,
500
,
false
)
;
// Рисуем список
sprintf
(
oldnick
,
""
)
;
sprintf
(
nick
,
""
)
;
// Очищаем переменные , что бы не было краша.
}
SF
->
getRender
(
)
->
EndRender
(
)
;
// завершаем рисование
}
;
return
true
;
// возвращаем положительный результат
}
;
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
(
)
->
getInfo
(
)
->
UpdateScoreAndPing
(
)
;
SF
->
getRender
(
)
->
registerD3DCallback
(
eDirect3DDeviceMethods
::
D3DMETHOD_PRESENT
,
Present
)
;
pFont
=
SF
->
getRender
(
)
->
CreateNewFont
(
"Consolas"
,
10
,
FCR_BORDER
)
;
SF
->
getSAMP
(
)
->
registerChatCommand
(
"dauncheck"
,
cmd_show_info_player
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
init
=
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
;
}
Как получить имя автомобиля, имея его CVehicle? Или хотя бы тип.
C++:
pVehicle
->
GetModelIndex
(
)
;
A za ime ne znaju no mozhes vzyat array iz pawno gde to i perepisat dlja C/C++
C++:
pVehicle
->
GetModelIndex
(
)
;
A za ime ne znaju no mozhes vzyat array iz pawno gde to i perepisat dlja C/C++
Уже сделал, спасибо. Я почему-то думал что функция имеет название типа GetType().
DarkP1xel
17.12.2016, 11:33
В GetModel кажется есть func GetNameIfVehicle
BlackKnigga
17.12.2016, 11:59
Как загрузить шрифт из .ttf файла?
Sire Like
17.12.2016, 12:14
Как загрузить шрифт из .ttf файла?
AddFontResource('Путь') ;
BlackKnigga
17.12.2016, 12:48
AddFontResource('Путь') ;
Окей, а как тогда получить его название в системе(чтобы создать через CreateNewFont())? При установке он переименовывается в ""шрифтнейм" полужирный". Какие только названия не вводил, загружается какой-то стандартный шрифт(вроде Arial'а).
Sire Like
17.12.2016, 20:19
Ненубы, помогайте с перехватом ScrClientMessage
Чё не так делаю?
C++:
D3DCOLOR MessageColor
;
// Цвет сообщения
byte textLen
;
// Длина сообщения
char
textMessage
[
144
]
;
// Сообщение
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
MessageColor
)
;
params
->
bitStream
->
Read
(
textLen
)
;
params
->
bitStream
->
Read
(
textMessage
)
;
textMessage
[
textLen
]
=
'\0'
;
params
->
bitStream
->
ResetReadPointer
(
)
;
BlackKnigga
17.12.2016, 20:49
Ненубы, помогайте с перехватом ScrClientMessage
Чё не так делаю?
C++:
D3DCOLOR MessageColor
;
// Цвет сообщения
byte textLen
;
// Длина сообщения
char
textMessage
[
144
]
;
// Сообщение
params
->
bitStream
->
ResetReadPointer
(
)
;
params
->
bitStream
->
Read
(
MessageColor
)
;
params
->
bitStream
->
Read
(
textLen
)
;
params
->
bitStream
->
Read
(
textMessage
)
;
textMessage
[
textLen
]
=
'\0'
;
params
->
bitStream
->
ResetReadPointer
(
)
;
TextLen дворд, а не байт.
https://docs.google.com/spreadsheets/d/1iIxEk7yR8r7ZLGiSAL4ndtz_N1k0p3Wt7TE5bei6ztU/edit#gid=1 (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2 QvMWlJeEVrN3lSOHI3WkxHaVNBTDRuZHR6X04xazBwM1d0N1RF NWJlaTZ6dFUvZWRpdCNnaWQ9MQ)
params->bitStream->Read(textMessage, textLen);
Sire Like
17.12.2016, 21:10
от души пацаны
Что лучше : загружать текстуру или рендрить ? Пример: текстура 500х500px синяя или же DrawBox ?
Надо было по быстрому сделать чекер 0 лвлов , сделал на быструю руку. Но проблема в том , что он выводит не до конца всех игроков. А просто обрезает половину.
сидел , пробовал и так и так , что-то не получилось вообщем доделать, подскажите кто нибудь, буду благодарен.
-McaK-ptmMs.jpgSR_team · 19 Дек 2016 в 13:53' data-fancybox="lb-post-131871" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="/proxy.php?image=https%3A%2F%2Fpp.vk.me%2Fc836538%2 Fv836538033%2F1237b%2F-McaK-ptmMs.jpg&hash=27a05876289dc4a783c3acc6e8d3be44" style="cursor: pointer;" title="-McaK-ptmMs.jpg">
https://pp.vk.me/c836538/v836538033/1237b/-McaK-ptmMs.jpg
Код :
UPD:
Прокоментил строки
C++:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
int
Score
=
3
;
stFontInfo
*
pFont
;
char
oldnick
[
4096
]
=
{
0
}
;
char
nick
[
4096
]
=
{
0
}
;
bool
bAct
=
false
;
void
CALLBACK
cmd_show_info_player
(
std
::
string param
)
{
bAct
^=
true
;
}
bool
CALLBACK
Present
(
CONST RECT
*
pSourceRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindowOverride
,
CONST RGNDATA
*
pDirtyRegion
)
{
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
// если рендерер готов к рисованию
{
// рисуем
if
(
bAct
)
{
for
(
uint16_t
it
=
0
;
it
getSAMP
(
)
->
getInfo
(
)
->
UpdateScoreAndPing
(
)
;
// обновляем таб
if
(
!
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
iIsListed
[
it
]
)
continue
;
// проверяем подключен ли игрок
Score
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
it
]
->
iScore
;
// Записываем в переменную лвл игрока
if
(
Score
==
0
)
// Проверяем что игрок 0 лвл.
{
sprintf
(
oldnick
,
"%s [%i]"
,
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
GetPlayerName
(
it
)
,
it
)
;
sprintf
(
nick
,
"%s \n %s"
,
nick
,
oldnick
)
;
// и так всё понятно.
}
}
pFont
->
Print
(
nick
,
D3DCOLOR_ARGB
(
170
,
255
,
255
,
255
)
,
500
,
500
,
false
)
;
// Рисуем список
sprintf
(
oldnick
,
""
)
;
sprintf
(
nick
,
""
)
;
// Очищаем переменные , что бы не было краша.
}
SF
->
getRender
(
)
->
EndRender
(
)
;
// завершаем рисование
}
;
return
true
;
// возвращаем положительный результат
}
;
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
(
)
->
getInfo
(
)
->
UpdateScoreAndPing
(
)
;
SF
->
getRender
(
)
->
registerD3DCallback
(
eDirect3DDeviceMethods
::
D3DMETHOD_PRESENT
,
Present
)
;
pFont
=
SF
->
getRender
(
)
->
CreateNewFont
(
"Consolas"
,
10
,
FCR_BORDER
)
;
SF
->
getSAMP
(
)
->
registerChatCommand
(
"dauncheck"
,
cmd_show_info_player
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"SAMPFUNCS Plugin loaded."
)
;
init
=
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
;
}
массивы слишком маленькие скорее всего.
25 - максимальная длина Ника, 1000 максимальное число игроков.
https://forum.antichat.xyz/attachments/27131871/
З.Ы. А еще SF не умел рендерить больше 256 символов за раз, и вроде это не фиксилось
iAmerican
20.12.2016, 19:59
Что лучше : загружать текстуру или рендрить ? Пример: текстура 500х500px синяя или же DrawBox ?
Для каких целей? DrawBox попроще будет.
iAmerican
20.12.2016, 20:09
массивы слишком маленькие скорее всего.
25 - максимальная длина Ника, 1000 максимальное число игроков.
З.Ы. А еще SF не умел рендерить больше 256 символов за раз, и вроде это не фиксилось
скорее всего не рендрит больше 256 символов , но на сколько я помню были админчекеры , они тоже не рендрят больше 256 символов?
скорее всего не рендрит больше 256 символов , но на сколько я помню были админчекеры , они тоже не рендрят больше 256 символов?
Я не думаю, что они так по уебански сделаны, и не склевают все в 1 строку, а выводят каждую строку отдельно
NarutoUA
21.12.2016, 11:56
Что лучше : загружать текстуру или рендрить ? Пример: текстура 500х500px синяя или же DrawBox ?
Лучше самому отрисовать, но средствами DX9 (вертекс буффером).
Наведите на правильную мысль, вот к примеру есть функция отрисовки:
C++:
bool
CALLBACK
Present
(
CONST RECT
*
pSourceRect
,
CONST RECT
*
pDestRect
,
HWND hDestWindowOverride
,
CONST RGNDATA
*
pDirtyRegion
)
{
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
// если рендерер готов к рисованию
{
// рисуем
SF
->
getRender
(
)
->
DrawBox
(
50
,
500
,
100
,
250
,
D3DCOLOR_ARGB
(
255
,
0
,
255
,
0
)
)
;
SF
->
getRender
(
)
->
EndRender
(
)
;
// завершаем рисование
}
;
return
true
;
// возвращаем положительный результат
}
;
В mainloop() я хочу сделать следующее:
C++:
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
'H'
)
)
// если нажата клавиша H (англ)
{
SF
->
getRender
(
)
->
registerD3DCallback
(
eDirect3DDeviceMethods
::
D3DMETHOD_PRESENT
,
Present
)
;
//Рисую блок
pFont
=
SF
->
getRender
(
)
->
CreateNewFont
(
"Tahoma"
,
12
,
FCR_BORDER
)
;
pFont
->
Print
(
"текст"
,
D3DCOLOR_ARGB
(
255
,
255
,
255
,
0
)
,
45
,
505
,
false
)
;
//Добавляю к нему текст
}
;
Но сам вопрос, как мне скрывать этот блок при нажатии на другую клавишу? Я так понимаю надо будет вывести переменную глобально со статусом блока, но вот как убрать отрисованый блок это я не нашел в API.
И ещё сразу вопрос, когда я делаю сначала SF->getRender()->registerD3DCallback а потом текст, то я текст не вижу, а если в функцию добавлю текст:
C++:
if
(
SUCCEEDED
(
SF
->
getRender
(
)
->
BeginRender
(
)
)
)
// если рендерер готов к рисованию
{
// рисуем
SF
->
getRender
(
)
->
DrawBox
(
50
,
500
,
100
,
250
,
D3DCOLOR_ARGB
(
255
,
0
,
255
,
0
)
)
;
pFont
=
SF
->
getRender
(
)
->
CreateNewFont
(
"Tahoma"
,
12
,
FCR_BORDER
)
;
pFont
->
Print
(
"текст"
,
D3DCOLOR_ARGB
(
255
,
255
,
255
,
0
)
,
45
,
505
,
false
)
;
//Добавляю к нему текст
SF
->
getRender
(
)
->
EndRender
(
)
;
// завершаем рисование
}
;
То рисует текст поверх блока и вылетает клиент, как разместить нормально текст на блоке?
BlackKnigga
28.12.2016, 00:45
но вот как убрать отрисованый блок это я не нашел в API.
Он сам пропадает если перестать его рисовать
И ещё сразу вопрос
Шрифт достаточно создать один раз, где нибудь в цикле mainloop перед init = true;
Он сам пропадает если перестать его рисовать
SF->getRender()->EndRender(); // завершаем рисование
Я так понял о этом речь? Но вот сейчас я нажал клавишу, появился блок и он уже не пропадает даже если я выхожу в меню, что я тогда не так делаю?
BlackKnigga
28.12.2016, 01:07
SF->getRender()->EndRender(); // завершаем рисование
Я так понял о этом речь? Но вот сейчас я нажал клавишу, появился блок и он уже не пропадает даже если я выхожу в меню, что я тогда не так делаю?
Ты нажал клавишу и зарегистрировал коллбек (registerD3DCallback) который рисует постоянно. Это не вызов рисования единожды. Чтобы перестать рисовать тебе нужно перестать выполнять функции рисования в методе Present (DrawBox и Print).
SF->getRender()->EndRender(); // завершаем рисование
Я так понял о этом речь? Но вот сейчас я нажал клавишу, появился блок и он уже не пропадает даже если я выхожу в меню, что я тогда не так делаю?
(Для примера)
Насчёт меню - делай проверку, замени:
Код:
if (SUCCEEDED(SF->getRender()->BeginRender()))
на
Код:
if (SUCCEEDED(SF->getRender()->BeginRender()) && !SF->getGame()->isGTAMenuActive())
Аналогично с отображением, сделай глобальную переменную, к примеру, bool render и делай проверку на true/false:
Код:
if (SUCCEEDED(SF->getRender()->BeginRender()) && !SF->getGame()->isGTAMenuActive() && render == true)
Ты нажал клавишу и зарегистрировал коллбек (registerD3DCallback) который рисует постоянно. Это не вызов рисования единожды.
Как тогда вызвать рисование 1 раз? Вопросов много, а доки нет, поэтому извиняйте.
И ещё вопрос, в консоли в игре есть дебаг мод, я могу отправлять сообщения в консоль вместо вывода в чат к примеру сообщения о том что происходит?
Dark_Knight
28.12.2016, 01:34
1 раз? 1 раз - это один кард.Я конечно все понимаю, что у каждого свои увлечения, но зачем делать приложения под винды с убунты?
1 раз? 1 раз - это один кард.Я конечно все понимаю, что у каждого свои увлечения, но зачем делать приложения под винды с убунты?
Ну на работе у меня Ubuntu+Windows, но т.к. я работаю в Ubuntu то думал и это учить там же не перегружаясь, в SAMP я иногда захожу через Wine . Дома там же 2 операционки, но т.к. дома в основном с WIndows тут проблем нет, работаю с под неё.
Oppenhem
28.12.2016, 02:59
Есть диалог 2-ого стиля(LIST), нужно после его закрытия вывести номер последней выделенной строки. Но если диалог был закрыт с помощью ESC ничего не выводить.
C++:
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
VK_NUMPAD0
)
)
{
char
buf2
[
128
]
;
char
buf1
[
]
=
"Test"
;
sprintf
(
buf2
,
"[%d]\n[%d]\n[%d]\n[%d]\n[%d]"
,
0
,
1
,
2
,
3
,
4
)
;
SF
->
getSAMP
(
)
->
getDialog
(
)
->
ShowDialog
(
1
,
2
,
buf1
,
buf2
,
"Enter"
,
""
)
;
dialogWasActive
=
1
;
}
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
VK_ESCAPE
)
)
{
dialogWasActive
=
0
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"esc"
)
;
}
if
(
!
(
SF
->
getSAMP
(
)
->
getDialog
(
)
->
iIsActive
)
&
(
dialogWasActive
==
1
)
)
{
int
item
=
SF
->
getSAMP
(
)
->
getDialog
(
)
->
ListBoxGetIndex
(
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
0
,
0xAA
,
0
)
,
"item = %d"
,
item
)
;
dialogWasActive
=
0
;
}
Вроде всё правильно, но isKeyPressed(VK_ESCAPE) не работает в диалоге.
NarutoUA
28.12.2016, 03:58
Ну на работе у меня Ubuntu+Windows, но т.к. я работаю в Ubuntu то думал и это учить там же не перегружаясь, в SAMP я иногда захожу через Wine . Дома там же 2 операционки, но т.к. дома в основном с WIndows тут проблем нет, работаю с под неё.
Что ж это у тебя за работа что ты регистрацию callback делаешь по нажатию кнопки?
C++:
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pObject
->
GetObjectHandleByID
(
objectid
)
что возвращает эта функция?
Мне надо изменить координаты и ротацию объекта. Пробовал через самп поол но не получилось, позиция там изменена но не в 3D мире.
Что ж это у тебя за работа что ты регистрацию callback делаешь по нажатию кнопки?
На вопрос можно ответить по теме? Работаю я на других языках: PHP, Python, JS. О C++ абсолютно ничего не известно, но т.к. языки похожи все чем то то и тут пытаюсь вникнуть, только C++ более низкоуровневый, и доки я ещё не читал по нему, по этому и делаю что- попало
что возвращает эта функция?
scm-хендл объекта. он используется только в опкодах.
И ещё вопрос, в консоли в игре есть дебаг мод, я могу отправлять сообщения в консоль вместо вывода в чат к примеру сообщения о том что происходит?
SF->Log()
Подскажет кто где тогда можно делать регистрацию коллбека если не при нажатию на кнопку?
C++:
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
'H'
)
)
// если нажата клавиша H (англ)
{
SF
->
getRender
(
)
->
registerD3DCallback
(
eDirect3DDeviceMethods
::
D3DMETHOD_PRESENT
,
Present
)
;
//Рисую блок
}
;
Так вроде бы работает, сделал чтоб блок скрывался и показывался, но говорят выше что это так себе вариант.
itsLegend
28.12.2016, 17:00
Подскажет кто где тогда можно делать регистрацию коллбека если не при нажатию на кнопку?
C++:
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
'H'
)
)
// если нажата клавиша H (англ)
{
SF
->
getRender
(
)
->
registerD3DCallback
(
eDirect3DDeviceMethods
::
D3DMETHOD_PRESENT
,
Present
)
;
//Рисую блок
}
;
Так вроде бы работает, сделал чтоб блок скрывался и показывался, но говорят выше что это так себе вариант.
Один раз где угодно. Хоть после загрузки сампа, хоть во время загрузки игры, хоть по кнопке, но при этом проверять, что колбэк был зарегистрирован единожды (boolean переменную можешь ввести). После регистрации он будет вызываться постоянно, пока игра активна.
Один раз где угодно.
Спасибо, теперь понял, сложно конечно так без доки что-то делать конечно, всё методом проб и ошибок делать надо :)
NarutoUA
28.12.2016, 18:19
Спасибо, теперь понял, сложно конечно так без доки что-то делать конечно, всё методом проб и ошибок делать надо :)
На вики есть 4 урока по С++ апи:
https://www.blast.hk/wiki/tutorials:list
Еще в разделе читов можно найти плагины с сурсами и там посмотреть.
Sire Like
28.12.2016, 18:39
Я как бы ничего не намекаю.
http://image.prntscr.com/image/62ab96aecf63433db1bc29c28be7cfd5.png
Я как бы и не отрицаю что я нуб в этом деле. Для моих задач мне этого хватает с головой, если буду дальше что-то писать под SAMP и уже не будет хватать API буду учить что-то более сложнее.
Dark_Knight
28.12.2016, 20:13
С++ сложнее lua.
Обойти античит на DRP чтобы ездить на машиной для аренды не арендовав её никак нельзя? Там когда садишься в автомобиль, появляется диалог о аренде, я его сворачивал, заводил двигатель через функцию в CVehicle, но меня кикало через 5-10 метров езды.
Вопрос по чата, хочу отправить сообщение в чат чтоб все видели.
Я вот нашел метод SF->getSAMP()->getChat()->AddChatMessage(), но я так понял это сообщение вижу только я.
SF->getSAMP()->getChat()->SetChatInputText(); но он вставляет в инпут чата данные, а как их отправить в чат?
И сразу вопрос, как можно отследить какая клавиша нажата?
Вот к примеру я сделаю SF->getGame()->isKeyPressed('W') && SF->getGame()->isKeyPressed('E') в одном условном блоке, я внутри смогу как то узнать какая именно клавиша была нажата?
BlackKnigga
30.12.2016, 22:32
как их отправить в чат
SF->getSAMP()->getPlayers()->pLocalPlayer->Say
я внутри смогу как то узнать какая именно клавиша была нажата?
Так у тебя &&, блок выполнится только при нажатии обоих клавиш.
Так у тебя &&, блок выполнится только при нажатии обоих клавиш.
Не так написал, имел в виду или, к примеру мне надо будет узнать какую клавишу от 1 до 0 нажал человек, чтоб не делать 10 блоков я бы хотел 1 с переменной в которой будет клавиша, если это возможно, я так понимаю это уже не API а средствами C++ надо делать?
Dark_Knight
31.12.2016, 00:14
Чтобы узнать какая именно клавиша была нажатая на клавиатуре, то тут уже нужен хук на окно.
Ладно, пока для первой версии программы сделаю просто статикой, потом буду искать способ сделать код лучше, ещё вопрос, можно ли как то добавить данные в буфер обмена через API? И вообще есть где то хоть не много информации о методах? А то я так каждый день писать буду сюда :)
P.S. И ещё вопрос назрел, можно ли как то открыть инпут в чате? Который на F6 открывается вдруг кто не понял) Лажу по методам но что-то ничего похожего не нахожу (Ответ уже нашел, остается вопрос выше:) )
Последний вопрос на сегодня :)
C++:
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
0x31
)
)
{
SF
->
getSAMP
(
)
->
getInput
(
)
->
EnableInput
(
)
;
SF
->
getSAMP
(
)
->
getChat
(
)
->
SetChatInputText
(
text here
)
;
}
Вот так я пытаюсь ловить события при нажатии на 1, и всё хорошо если происходит другое действие, но не то что выше, когда при нажатии на 1 появляется поле ввода и текст в нём, всё как надо, но после закрытия это поля и отправки сообщения я нажимаю снова 1 и ничего не происходит, SF->getGame()->isKeyPressed(0x31) уже не видит нажатие, а если я нажму ещё раз 1 тогда всё работает, такое чувство что методом SF->getSAMP()->getInput()->EnableInput() я что-то преребиваю, потому что без него SF->getSAMP()->getChat()->SetChatInputText(text here) вставляет нормально данные в поле ввода, но я его не вижу. А нужно чтоб было поле ввода и мой текст. Причина точно в SF->getSAMP()->getInput()->EnableInput(), я больше не нашел способа вызвать поле ввода.
Dark_Knight
31.12.2016, 11:20
Для буфера с обменов есть винапи. Для него все есть в гугле.
Вопрос по чата, хочу отправить сообщение в чат чтоб все видели.
Я вот нашел метод SF->getSAMP()->getChat()->AddChatMessage(), но я так понял это сообщение вижу только я.
SF->getSAMP()->getChat()->SetChatInputText(); но он вставляет в инпут чата данные, а как их отправить в чат?
И сразу вопрос, как можно отследить какая клавиша нажата?
Вот к примеру я сделаю SF->getGame()->isKeyPressed('W') && SF->getGame()->isKeyPressed('E') в одном условном блоке, я внутри смогу как то узнать какая именно клавиша была нажата?
SF->getSAMP()->getPlayers()->pLocalPlayer->Say();
if(key_pressed(W) && key_pressed(E))
{
if(key_pressed(W)
{}
else
{}
}
SF->getSAMP()->getPlayers()->pLocalPlayer->Say();
if(key_pressed(W) && key_pressed(E))
}
Нет такой функции.
Может кто по поводу SF->getSAMP()->getInput()->EnableInput() всё же может кто подсказать?
Короче что происходит:
C++:
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
0x31
)
)
//нажимаю на 1
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
SetChatInputText
(
"text here"
)
;
SF
->
getSAMP
(
)
->
getInput
(
)
->
EnableInput
(
)
;
}
В итоге в чат идет text here1 и потом когда я нажимаю 1 во второй раз ничего не происходит, а когда в третий - уже снова идет вызов, такое чувство что из-за того что цифра 1 идет в чат не отпраляется событие keydown и только при 2 нажатии оно отправляется и выходит что на 3 раз уже при нажатии на 1 всё работает, как от этого избавиться?
Может есть ещё способ отслеживать нажатие клавиши и чтоб она в чат не шла?
UPD. Отправку цифры 1 в чат убрал через эмуляцию нажатия backspace, а вот почему после вызова EnableInput не работает снова вызов на цифру 1 пока не могу понять
Может кто подсказать как поступить.
Делаю сейчас локальный DXUT диалог на Cleo и надо бы как то его вызывать по команде и собирать данные с его инпутов, их там 3 будет и работать с ними через C++ SF API, как можно будет при нажатии на кнопку забирать данные в SF API? Через getCLEO есть методы взять переменные, но как их в cleo скрипте объявить чтоб забрать в коде? Может кто пример кода показать, примеров нигде не нашел.
Есть ещё вариант через getDialog но там всё ещё запутаней, по методам ничего не понятно, а доки то и нет
Нет такой функции.
Может кто по поводу SF->getSAMP()->getInput()->EnableInput() всё же может кто подсказать?
Короче что происходит:
C++:
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
0x31
)
)
//нажимаю на 1
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
SetChatInputText
(
"text here"
)
;
SF
->
getSAMP
(
)
->
getInput
(
)
->
EnableInput
(
)
;
}
В итоге в чат идет text here1 и потом когда я нажимаю 1 во второй раз ничего не происходит, а когда в третий - уже снова идет вызов, такое чувство что из-за того что цифра 1 идет в чат не отпраляется событие keydown и только при 2 нажатии оно отправляется и выходит что на 3 раз уже при нажатии на 1 всё работает, как от этого избавиться?
Может есть ещё способ отслеживать нажатие клавиши и чтоб она в чат не шла?
UPD. Отправку цифры 1 в чат убрал через эмуляцию нажатия backspace, а вот почему после вызова EnableInput не работает снова вызов на цифру 1 пока не могу понять
То, что ты делаешь через InputBox полнейшая хрень. Есть функция Say и её используют для отправки сообщения или команды.
http://i.imgur.com/PqBwK7L.png
Sire Like
02.01.2017, 06:29
можно ли в .sf использовать библиотеку sqlite?
вангуем же,
та да, почему бы и нет?
То, что ты делаешь через InputBox полнейшая хрень. Есть функция Say и её используют для отправки сообщения или команды.
А при чем тут это? Мне надо чтобы текст вставлялся в инпут без отправки, чтоб дальше можно было дописать ID и отправить. Я вроде как с этим уже разобрался.
Sire Like
02.01.2017, 15:57
вот примерно такое
C++:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include
#include
#include
#include
#include "sqlite3.h"
#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
(
-
1
,
sqlite3_libversion
(
)
)
;
init
=
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
;
}
сначала написал простое подключение к бд - скрипт не работает в игре,потом просто вывод версии библиотеки - тоже не работает, мож я чего-то не понимаю ?
в логах ничего интересного
позже сам попробую, через час отпишу, гляну
iAmerican
04.01.2017, 02:44
C++:
SF
->
getSAMP
(
)
->
getDialog
(
)
->
ShowDialog
(
1
,
DIALOG_STYLE_INPUT
,
"Введите ID"
,
""
,
"Ок"
,
"Отмена"
)
;
от сюда только хуком вытаскивать данные? или можно как то иначе?
и ещё вопрос сразу , как организовать свой диалог с вводом данных?
мне чисто в теории
Sire Like
04.01.2017, 14:23
C++:
SF
->
getSAMP
(
)
->
getDialog
(
)
->
ShowDialog
(
1
,
DIALOG_STYLE_INPUT
,
"Введите ID"
,
""
,
"Ок"
,
"Отмена"
)
;
от сюда только хуком вытаскивать данные? или можно как то иначе?
и ещё вопрос сразу , как организовать свой диалог с вводом данных?
мне чисто в теории
ага, хуков вытаскивай данные.
Можно ли как-то использовать команду, которая недоступна для твоего ранга/фракции на сервере? Ну или хотя бы считать содержимое диалога, не открывая его (опять же из-за того, что ранг/фракция не та).
Sire Like
04.01.2017, 18:16
Можно ли как-то использовать команду, которая недоступна для твоего ранга/фракции на сервере? Ну или хотя бы считать содержимое диалога, не открывая его (опять же из-за того, что ранг/фракция не та).
Ну в моде проверка, так что нет.
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot