PDA

Просмотр полной версии : 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
ты это не на свой ид юзаешь?


Ок, попробовал на других игроках и работает. Благодарю

da9
08.08.2016, 09:00
Как работать с 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");
}

da9
08.08.2016, 10:12
После получение CHandlingEntry делай проверку на валидность

Код:






if(entry){
entry->SetABS(true);
} else {
SF->Log("CHandlingEntry empty");
}





Они все пустые или я что-то не так делаю

CarLCas
08.08.2016, 10:20
Не путай 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);)


Тот же результат будет. Пробел то не учитываешь

dimoz
09.08.2016, 21:29
скрипторы, а используя SF API можно зарендерить надпись, развернутую на 90 градусов?

itsLegend
09.08.2016, 21:31
скрипторы, а используя SF API можно зарендерить надпись, развернутую на 90 градусов?


stFontInfo :: Print там есть rect. Возможно оно))

UPD: Нет, не оно(

dimoz
09.08.2016, 21:34
stFontInfo :: Print там есть rect. Возможно оно))


я уже с этим химичил, оно не отвечает за разворот текста.

максимум, что можно сделать, - обрезать его

NarutoUA
09.08.2016, 21:40
Нельзя через стандартные методы SF API

AWRage
09.08.2016, 21:49
скрипторы, а используя 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;
}





Ты меня немного не понял. Мне нужен шрифт и размер самповский (т.е. чата)

AWRage
12.08.2016, 02:35
Ты меня немного не понял. Мне нужен шрифт и размер самповский (т.е. чата)


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, но там размер по другому рассчитывается.

AWRage
12.08.2016, 15:58
Можешь дать пример как правильно его использовать? Не особо понял


В desc будут все настройки шрифта, высота, качество, название и т.д.

C++:






D3DXFONT_DESC desc
;
.
.
.
->
D3DXFont
->
GetDesc
(
&
desc
)
;

QGate
13.08.2016, 12:55
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());

}

QGate
13.08.2016, 13:30
Такой вопрос, а как лучше сканить параметры при вводе команды, если я не знаю столько их? Мне нужно разделить игроков на команды с разными именами, к примеру ввожу /squad 100(радиус) 4(кол-во команд) name name name name, name - имя команды.

Dark_Knight
13.08.2016, 13:49
Через 2 регулярки можно попробовать. Сначала сканиуре на радиус и количество. Что после количество записываешь в новую переменную, а потом уже это переменную сканируешь на количество команд.

QGate
15.08.2016, 12:29
Как можно получить всех игроков в радиусе?

Dark_Knight
15.08.2016, 12:54
Перебором через пул игроков в стриме, а потом уже и на радиус проверять.

QGate
15.08.2016, 13:09
Никак не могу найти этот пул.

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])



Вот тебе пример кода

QGate
16.08.2016, 19:00
Ну у меня примерно также.

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 не знал)

SR_team
16.08.2016, 22:41
GetCurrentDir(path, 256);


Проверь, что она возвращает. Возможно там уже есть на конце \

Tray228
16.08.2016, 22:53
Проверь, что она возвращает. Возможно там уже есть на конце \


0, уже все исправил

аналог можно? 009A: 2@ = create_actor_pedtype 4 model #MALE01 (https://www.blast.hk/redirect/aHR0cHM6Ly92ay5jb20vZmVlZD9zZWN0aW9uPXNlYXJjaCZxPS UyM01BTEUwMQ) at 0.0 0.0 0.0

QGate
18.08.2016, 16:53
Как повернуть персонажа?

san0
18.08.2016, 18:14
Как повернуть персонажа?


PEDSELF->SetCurrentRotation

в радианах

QGate
18.08.2016, 19:10
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
;
// выключить

QGate
20.08.2016, 19:07
А возможно ли скрыть серверный textdraw?

Woofing Giraffe
20.08.2016, 19:26
А возможно ли скрыть серверный textdraw?


Хукаешь показ текстдрава и возвращаешь false

QGate
20.08.2016, 19:30
Хукаешь показ текстдрава и возвращаешь 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
)
;
}

QGate
20.08.2016, 19:58
А еще вопросик, он срабатывает только тогда, когда появляется текстдрав или постоянно?

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

AWRage
22.08.2016, 03:11
Это я неправильно что - то делаю? или в СФ проблема?

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)

SR_team
22.08.2016, 05:29
Насчёт порта не знаю, но айпи надо преобразовать в строку (ulIP - число типа 0xAABBCCDD (AA,BB,CC,DD числа из диапазона [0..255] ну типа айпи 255.255.255.255)


Хочешь сказать, что 552 это IP 0.0.2.40 ?

hnnssy
22.08.2016, 06:48
Хочешь сказать, что 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)


Сложна че то. Добыл сам из памяти.

SR_team
22.08.2016, 13:25
Нет

Сложна че то. Добыл сам из памяти.


В сф ващет есть указатель на строковый ip

Nintendo
22.08.2016, 22:28
как убрать звук крови

Woofing Giraffe
23.08.2016, 20:25
Как сделать горизонтальную табуляцию? Например у меня в диалоге есть 2 строки

Какой-то текст |

Еще один текст |

Как мне сделать чтобы обе | были наравне?

SR_team
23.08.2016, 20:30
Как сделать горизонтальную табуляцию? Например у меня в диалоге есть 2 строки
Какой-то текст |
Еще один текст |
Как мне сделать чтобы обе | были наравне?


выравнивай по пикселям при рендере

Woofing Giraffe
26.08.2016, 01:29
выравнивай по пикселям при рендере


У меня это в тексте диалога... Пытался пробелами, но получается криво, через \t тоже хрень

--- Сообщение обновлено ---

Не у кого идей нету?

MISTER_GONWIK
26.08.2016, 01:35
У меня это в тексте диалога... Пытался пробелами, но получается криво, через \t тоже хрень

--- Сообщение обновлено ---
Не у кого идей нету?


только через \t

CarLCas
26.08.2016, 05:35
У меня это в тексте диалога... Пытался пробелами, но получается криво, через \t тоже хрень

--- Сообщение обновлено ---
Не у кого идей нету?


Определи самую длинную строку, получи её ширину в пикселях, возьми получение значение+Х текста получишь Х для линии, сделай линию вниз.

Woofing Giraffe
28.08.2016, 21:45
Чем отличаются знаки форматирования %d и %i?

iAmerican
29.08.2016, 19:12
Чем отличаются знаки форматирования %d и %i?



нечем , имеют разницу только при вводе scanf()

Yakkoff
02.09.2016, 12:57
Visual Studio 2015 подойдет?

DarkP1xel
02.09.2016, 12:57
Да.

DarkExorcist
05.09.2016, 17:53
как узнать, что ты убил игрока?

Woofing Giraffe
05.09.2016, 19:56
как узнать, что ты убил игрока?


RPC_ScrDeathMessage хукай

2Shae
06.09.2016, 21:37
Почему RPC_GiveTakeDamage выдаёт неверный дамаг? К примеру, наноситься урон 5, но RPC_GiveTakeDamage отображает 1.

Dark_Knight
06.09.2016, 21:39
Потому что сервер сам свои значения может снимать. Ты хоть верно читаешь?

2Shae
06.09.2016, 21:41
Потому что сервер сам свои значения может снимать. Ты хоть верно читаешь?



Код:






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);

QGate
13.09.2016, 14:11
Можно ли как-то выбрать нужный пункт в диалоге не прибегая к использованию эмуляции нажатия клавиши?

Rorian
15.09.2016, 16:00
Можно ли как-то выбрать нужный пункт в диалоге не прибегая к использованию эмуляции нажатия клавиши?


Возможно. Через RPC

QGate
19.09.2016, 17:48
Возможно. Через RPC


А примера не будет?

2Shae
22.09.2016, 01:26
Здрасти.

Код:






for (int m = 0; m getSAMP()->getChat()->AddChatMessage(-1, "One: %d, Two: %d, Three: %s", typeOne, typeTwo, typeThree[n]);
}
}
}
}




Почему крашит? Нужно вывести текст из массива typeThree. (код для примера)

SR_team
22.09.2016, 01:32
Здрасти.

Код:






for (int m = 0; m getSAMP()->getChat()->AddChatMessage(-1, "One: %d, Two: %d, Three: %s", typeOne, typeTwo, typeThree[n]);
}
}
}
}




Почему крашит? Нужно вывести текст из массива typeThree. (код для примера)


ты странный. ты в цикле ищешь число, которое совпадает с числом записаным в уже существующую переменную. Зачем???

2Shae
22.09.2016, 01:46
ты странный. ты в цикле ищешь число, которое совпадает с числом записаным в уже существующую переменную. Зачем???


Да бля, сонный с выебаными мозгами писал. Исправил:

Код:






for (int m = 0; m getSAMP()->getChat()->AddChatMessage(-1, "One: %d, Two: %d, Three: %d, Four: %s", typeOne, typeTwo, typeThree, typeFour[n]);
}
}
}
}




Нужно вывести текст из массива typeFour, меня какого-то фига крашит.

SR_team
22.09.2016, 08:33
Исправил


тебе меня не обмануть.

2Shae
22.09.2016, 11:04
тебе меня не обмануть.


SF->getSAMP()->getChat()->AddChatMessage(-1, "One: %d, Two: %d, Three: %d, Four: %s", typeOne, typeTwo, typeThree, typeFour[n]);

2Shae
22.09.2016, 16:11
Dark_Knight помог крч.

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

2Shae
03.10.2016, 22:44
Когда-то была темка на форуме, как использовать AntTweakBar в одном плагине, без дополнительного "0 LiteAntTweakBar.sf". Может кто сейчас подсказать как это реализовать? :D

DarkP1xel
03.10.2016, 23:49
А какая разница? Без этого .SF тебе все равно придется использовать .DLL.

Apolo11
04.10.2016, 04:06
А какая разница? Без этого .SF тебе все равно придется использовать .DLL.


Он имеет введу, чтобы вшить атб в сам плагин, без использования дополнительных библиотек. Как в сб хаке.

Dark_Knight
04.10.2016, 19:36
Берешь сурс и вшиваешь. Но возможно будет конфликтовать с другими плагинами.

http://anttweakbar.sourceforge.net/doc/tools:anttweakbar:download (https://www.blast.hk/redirect/aHR0cDovL2FudHR3ZWFrYmFyLnNvdXJjZWZvcmdlLm5ldC9kb2 MvdG9vbHM6YW50dHdlYWtiYXI6ZG93bmxvYWQ)

2Shae
13.10.2016, 18:41
Что не так? Какую-то фигню выдаёт вместо нужного текста.

Код:






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д текст?

san0
14.10.2016, 01:27
Что не так? Какую-то фигню выдаёт вместо нужного текста.

Код:






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

Skadi
18.10.2016, 16:53
Почему не перемещает за размеры 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
;
}
}

Skadi
19.10.2016, 12:17
Пример :

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
;
}
}





уже лучше, но всё равно возвращает на исходные координаты, если далеко увожу мышку.

MoZg
19.10.2016, 16:30
Подскажите, почему 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)

AWRage
29.10.2016, 03:41
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 после ид пакета

AWRage
29.10.2016, 15:57
там player id после ид пакета


Почему тогда outcoming пакет читается нормально?

upd:

Все работает. Спасибо.

Как реализовать функци. get_z_angle_for_point на С++. Мне нужно отправить ложную онфут синхру.

2Shae
31.10.2016, 16:04
Можно ли как-то вставить текст в input диалога?

SR_team
31.10.2016, 16:46
[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 байта

AWRage
05.11.2016, 04:37
Какой функцией на С++ можно заменить опкод 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
Интересненький вопрос, ребят. Как к примеру отправить онфут синхру смены координат, но при этом чтобы этого не было видно другим игрокам.

AWRage
06.11.2016, 15:19
Интересненький вопрос, ребят. Как к примеру отправить онфут синхру смены координат, но при этом чтобы этого не было видно другим игрокам.


Никак. Если только отправить один раз из 20 за секунду, чтобы это чисто физически никто не заметил.

andrejandrej
11.11.2016, 16:37
По какому принципу работает "ГМ облет пуль"? или подобное :scratch:

AWRage
11.11.2016, 19:18
По какому принципу работает "ГМ облет пуль"? или подобное :scratch:


В входящей буллет синхре изменяется оффсет или таргет, вроде.

Если я поставлю хук на D3DMETHOD_RESET, мой callback вызовется перед вызовом оригинального метода, или после него? И можно ли как-то поставить хук перед вызовом и после вызова? SFAPI

BlackKnigga
13.11.2016, 18:49
Как нажать на Player TextDraw? SF->getSAMP()->sendClickTextDraw() как я понял жмет только на обычные текстдравы.

Мне нужны те что в структуре PlayerTextdraw хранятся.

Отправил рпц, заработало.

2Shae
15.11.2016, 00:25
Делаю что-то на подобии чекера. Показ игроков при заходе на сервер/выходе с сервера отображает/сохранение новых ников в файлик работает на ура, а вот при попытке принудительно (командой/клавишей, не важно) перегрузить список (из файла) - крашит.

Крашит именно из-за этого участка кода:

Код:






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
Есть такая штука как комментарии. С помощью них ты можешь узнать какая именно строчка является проблемной.

2Shae
15.11.2016, 01:08
Есть такая штука как комментарии. С помощью них ты можешь узнать какая именно строчка является проблемной.


Конечно сорян за нубский вопрос, но о чём ты? :D

Я знаю что такое комментарии, но как они помогут понять немогу.

itsLegend
15.11.2016, 01:14
К тому, что это может быть либо addChatMessage, либо stricmp. Перед тем, как написать сюда, закомментировал тело цикла и искал бы именно проблемную функцию. Тут их уж не так и много, и предполагаю, что getPlayerName возвращает NULL и stricmp пытается прочитать нулевой указатель.

Trou
15.11.2016, 01:37
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
Как проверить нажата ли клавиша при открытом чате?

CarLCas
16.11.2016, 10:38
Как проверить нажата ли клавиша при открытом чате?


Как вариант, 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"
)
;
}








Библиотеку вруби

AWRage
17.11.2016, 01:47
Как проверить нажата ли клавиша при открытом чате?


Поставить хук на функцию 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
;
}

AWRage
16.12.2016, 16:19
Как получить имя автомобиля, имея его CVehicle? Или хотя бы тип.

Ice
17.12.2016, 01:18
C++:






pVehicle
->
GetModelIndex
(
)
;




A za ime ne znaju no mozhes vzyat array iz pawno gde to i perepisat dlja C/C++

AWRage
17.12.2016, 03:03
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)

CarLCas
17.12.2016, 20:54
params->bitStream->Read(textMessage, textLen);

Sire Like
17.12.2016, 21:10
от души пацаны

Potniy
19.12.2016, 13:20
Что лучше : загружать текстуру или рендрить ? Пример: текстура 500х500px синяя или же DrawBox ?

SR_team
19.12.2016, 14:53
Надо было по быстрому сделать чекер 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 символов?

SR_team
21.12.2016, 00:21
скорее всего не рендрит больше 256 символов , но на сколько я помню были админчекеры , они тоже не рендрят больше 256 символов?


Я не думаю, что они так по уебански сделаны, и не склевают все в 1 строку, а выводят каждую строку отдельно

NarutoUA
21.12.2016, 11:56
Что лучше : загружать текстуру или рендрить ? Пример: текстура 500х500px синяя или же DrawBox ?


Лучше самому отрисовать, но средствами DX9 (вертекс буффером).

TheMY3
27.12.2016, 23:52
Наведите на правильную мысль, вот к примеру есть функция отрисовки:

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;

TheMY3
28.12.2016, 00:56
Он сам пропадает если перестать его рисовать


SF->getRender()->EndRender(); // завершаем рисование

Я так понял о этом речь? Но вот сейчас я нажал клавишу, появился блок и он уже не пропадает даже если я выхожу в меню, что я тогда не так делаю?

BlackKnigga
28.12.2016, 01:07
SF->getRender()->EndRender(); // завершаем рисование
Я так понял о этом речь? Но вот сейчас я нажал клавишу, появился блок и он уже не пропадает даже если я выхожу в меню, что я тогда не так делаю?


Ты нажал клавишу и зарегистрировал коллбек (registerD3DCallback) который рисует постоянно. Это не вызов рисования единожды. Чтобы перестать рисовать тебе нужно перестать выполнять функции рисования в методе Present (DrawBox и Print).

2Shae
28.12.2016, 01:09
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)

TheMY3
28.12.2016, 01:18
Ты нажал клавишу и зарегистрировал коллбек (registerD3DCallback) который рисует постоянно. Это не вызов рисования единожды.


Как тогда вызвать рисование 1 раз? Вопросов много, а доки нет, поэтому извиняйте.

И ещё вопрос, в консоли в игре есть дебаг мод, я могу отправлять сообщения в консоль вместо вывода в чат к примеру сообщения о том что происходит?

Dark_Knight
28.12.2016, 01:34
1 раз? 1 раз - это один кард.Я конечно все понимаю, что у каждого свои увлечения, но зачем делать приложения под винды с убунты?

TheMY3
28.12.2016, 01:42
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 делаешь по нажатию кнопки?

Ice
28.12.2016, 07:18
C++:






SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pObject
->
GetObjectHandleByID
(
objectid
)




что возвращает эта функция?

Мне надо изменить координаты и ротацию объекта. Пробовал через самп поол но не получилось, позиция там изменена но не в 3D мире.

TheMY3
28.12.2016, 12:09
Что ж это у тебя за работа что ты регистрацию callback делаешь по нажатию кнопки?


На вопрос можно ответить по теме? Работаю я на других языках: PHP, Python, JS. О C++ абсолютно ничего не известно, но т.к. языки похожи все чем то то и тут пытаюсь вникнуть, только C++ более низкоуровневый, и доки я ещё не читал по нему, по этому и делаю что- попало

FYP
28.12.2016, 13:44
что возвращает эта функция?


scm-хендл объекта. он используется только в опкодах.



И ещё вопрос, в консоли в игре есть дебаг мод, я могу отправлять сообщения в консоль вместо вывода в чат к примеру сообщения о том что происходит?


SF->Log()

TheMY3
28.12.2016, 16:30
Подскажет кто где тогда можно делать регистрацию коллбека если не при нажатию на кнопку?

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 переменную можешь ввести). После регистрации он будет вызываться постоянно, пока игра активна.

TheMY3
28.12.2016, 17:06
Один раз где угодно.


Спасибо, теперь понял, сложно конечно так без доки что-то делать конечно, всё методом проб и ошибок делать надо :)

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

TheMY3
28.12.2016, 19:12
Я как бы и не отрицаю что я нуб в этом деле. Для моих задач мне этого хватает с головой, если буду дальше что-то писать под SAMP и уже не будет хватать API буду учить что-то более сложнее.

Dark_Knight
28.12.2016, 20:13
С++ сложнее lua.

AWRage
28.12.2016, 23:44
Обойти античит на DRP чтобы ездить на машиной для аренды не арендовав её никак нельзя? Там когда садишься в автомобиль, появляется диалог о аренде, я его сворачивал, заводил двигатель через функцию в CVehicle, но меня кикало через 5-10 метров езды.

TheMY3
30.12.2016, 22:08
Вопрос по чата, хочу отправить сообщение в чат чтоб все видели.

Я вот нашел метод 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



я внутри смогу как то узнать какая именно клавиша была нажата?


Так у тебя &&, блок выполнится только при нажатии обоих клавиш.

TheMY3
30.12.2016, 22:53
Так у тебя &&, блок выполнится только при нажатии обоих клавиш.


Не так написал, имел в виду или, к примеру мне надо будет узнать какую клавишу от 1 до 0 нажал человек, чтоб не делать 10 блоков я бы хотел 1 с переменной в которой будет клавиша, если это возможно, я так понимаю это уже не API а средствами C++ надо делать?

Dark_Knight
31.12.2016, 00:14
Чтобы узнать какая именно клавиша была нажатая на клавиатуре, то тут уже нужен хук на окно.

TheMY3
31.12.2016, 01:31
Ладно, пока для первой версии программы сделаю просто статикой, потом буду искать способ сделать код лучше, ещё вопрос, можно ли как то добавить данные в буфер обмена через API? И вообще есть где то хоть не много информации о методах? А то я так каждый день писать буду сюда :)

P.S. И ещё вопрос назрел, можно ли как то открыть инпут в чате? Который на F6 открывается вдруг кто не понял) Лажу по методам но что-то ничего похожего не нахожу (Ответ уже нашел, остается вопрос выше:) )

TheMY3
31.12.2016, 03:12
Последний вопрос на сегодня :)

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
Для буфера с обменов есть винапи. Для него все есть в гугле.

AWRage
31.12.2016, 12:29
Вопрос по чата, хочу отправить сообщение в чат чтоб все видели.
Я вот нашел метод 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

{}

}

TheMY3
31.12.2016, 13:59
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 пока не могу понять

TheMY3
02.01.2017, 03:06
Может кто подсказать как поступить.

Делаю сейчас локальный DXUT диалог на Cleo и надо бы как то его вызывать по команде и собирать данные с его инпутов, их там 3 будет и работать с ними через C++ SF API, как можно будет при нажатии на кнопку забирать данные в SF API? Через getCLEO есть методы взять переменные, но как их в cleo скрипте объявить чтоб забрать в коде? Может кто пример кода показать, примеров нигде не нашел.

Есть ещё вариант через getDialog но там всё ещё запутаней, по методам ничего не понятно, а доки то и нет

AWRage
02.01.2017, 05:39
Нет такой функции.

Может кто по поводу 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?


вангуем же,

та да, почему бы и нет?

TheMY3
02.01.2017, 13:54
То, что ты делаешь через 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"
,
""
,
"Ок"
,
"Отмена"
)
;




от сюда только хуком вытаскивать данные? или можно как то иначе?
и ещё вопрос сразу , как организовать свой диалог с вводом данных?
мне чисто в теории


ага, хуков вытаскивай данные.

2Shae
04.01.2017, 18:13
Можно ли как-то использовать команду, которая недоступна для твоего ранга/фракции на сервере? Ну или хотя бы считать содержимое диалога, не открывая его (опять же из-за того, что ранг/фракция не та).

Sire Like
04.01.2017, 18:16
Можно ли как-то использовать команду, которая недоступна для твоего ранга/фракции на сервере? Ну или хотя бы считать содержимое диалога, не открывая его (опять же из-за того, что ранг/фракция не та).


Ну в моде проверка, так что нет.