PDA

Просмотр полной версии : SAMPFUNCS | API C++


Страницы : 1 2 3 4 5 [6] 7 8

AWRage
22.03.2016, 21:15
Ну как чат отчистить (какая функция) ну помогите блять!


for-ом перебери все строки чата и очисти их memset(string, 0, sizeof(string));

AWRage
22.03.2016, 21:44
Возможно сделать свой колормод? Какие библиотеки и функции для этого нужно использовать?

Dark_Knight
22.03.2016, 21:53
А нужно ли? Работу с директиксом учи.

AWRage
22.03.2016, 23:25
А нужно ли? Работу с директиксом учи.


Колормод который сейчас в интернете сложно настроить так как прийдется перезаходить каждый раз.

Skadi
22.03.2016, 23:40
Колормод который сейчас в интернете сложно настроить так как прийдется перезаходить каждый раз.


вводишь colormod как чит код и настраиваешь.

Woofing Giraffe
23.03.2016, 00:02
Как отключить RakNet хук ? Видел функцию ->UnregisterHook();


Как вариант просто поставить bool условие в начале хука и потом в дальнейшем сменить значение переменной

SR_team
23.03.2016, 00:05
отправить очень много сообщений и самп освободит память чата останутся только пустые строки.


Можно просто удалить имеющиеся сообщения. у меня даже адрес где-то был с их расположением в памяти

NarutoUA
23.03.2016, 00:08
Очистить чат:

memset(&SF->getSAMP()->getChat()->chatEntry, 0, sizeof(stChatEntry)*100);

SF->getSAMP()->getChat()->m_iRedraw = 1;

Gabriel__
23.03.2016, 08:48
Перечислите параметры RPC_ScrSetVehicleParamsEx.

Почему не работает

if (params->packetId == RPC_ScrClearAnimations || RPC_ScrRemovePlayerFromVehicle)

Постоянно выдает true.

Dark_Knight
23.03.2016, 12:03
Перечислите параметры RPC_ScrSetVehicleParamsEx.

Почему не работает
if (params->packetId == RPC_ScrClearAnimations || RPC_ScrRemovePlayerFromVehicle)
Постоянно выдает true.


if (params->packetId == RPC_ScrClearAnimations || params->packetId == RPC_ScrRemovePlayerFromVehicle)

Gabriel__
23.03.2016, 12:54
Как установить машине режим двигателя ?

AWRage
23.03.2016, 17:38
Можно ли создать две или больше структур с одинаковым названием, но в разных .h файлах, которые друг друга подключают.

Например:

C++:






// cheats.h
stINI
{
int
key
;
}
;
stCheats
{
int
some
;
.
.
.
stINI stINI
;
}
;
// samp.h
stINI
{
int
iColor
;
}
;
stSamp
{
stINI stINI
;
}
;




Чем отличается MyClass *Class от MyClass *Class = new MyClass?

Dark_Knight
23.03.2016, 18:15
Да, но названия должны быть разные.

В первом ты просто объявляешь указатель. Второе ты его объявляешь и записываешь в него обобьет.

AWRage
23.03.2016, 18:32
Да, но названия должны быть разные.
В первом ты просто объявляешь указатель. Второе ты его объявляешь и записываешь в него обобьет.


Что такое обобьет?

Dark_Knight
23.03.2016, 19:29
Что такое обобьет?


Обьект.

AWRage
23.03.2016, 20:03
Обьект.


Ясно, спасибо.

Gabriel__
24.03.2016, 19:14
Помогите срочно! Как перевести CVector * pos = PEDSELF->GetPosition() в три переменные типа float с X Y Z.

Dark_Knight
24.03.2016, 19:20
pos->fX

pos->fY

pos->fZ

Tray228
25.03.2016, 00:06
Как выдать своему игроку определенный объект, например: чемодан.

Gabriel__
25.03.2016, 09:32
Создать объект и прикрепить его к костям руки.

Dark_Knight
25.03.2016, 12:41
Как выдать своему игроку определенный объект, например: чемодан.


Для всех никак.

Tray228
25.03.2016, 14:19
Для всех никак.


ну мне визуально надо, ток хз как

Tray228
25.03.2016, 23:57
Ошибка 1 error MSB8020: The builds tools for v110_xp (Platform Toolset = 'v110_xp') cannot be found. To build using the v110_xp build tools, either click the Project menu or right-click the solution, and then select "Update VC++ Projects...". Install v110_xp to build using the v110_xp build tools. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.Cp p.Platform.targets 44 5 SFPlugin

что делать

AWRage
26.03.2016, 02:57
Ошибка 1 error MSB8020: The builds tools for v110_xp (Platform Toolset = 'v110_xp') cannot be found. To build using the v110_xp build tools, either click the Project menu or right-click the solution, and then select "Update VC++ Projects...". Install v110_xp to build using the v110_xp build tools. C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.Cp p.Platform.targets 44 5 SFPlugin
что делать


Там же написано что делать. :pidrila:

Почему вылазит ошибка следующего содержания?

http://i.imgur.com/ize4DYh.png

Код:

Код:






CPed *Ped = GAME->GetPools()->GetPed(SF->getSAMP()->getPlayers()->GetActorHandleFromSAMPPlayerID(0));
AW->Log("%.3f", Ped->GetPosition()->fX);

Dark_Knight
26.03.2016, 04:39
Инт - это инт, не СПед.

https://yadi.sk/i/VagOlJg4qV85Q (https://www.blast.hk/redirect/aHR0cHM6Ly95YWRpLnNrL2kvVmFnT2xKZzRxVjg1UQ)

AWRage
26.03.2016, 16:33
Инт - это инт, не СПед.
https://yadi.sk/i/VagOlJg4qV85Q (https://www.blast.hk/redirect/aHR0cHM6Ly95YWRpLnNrL2kvVmFnT2xKZzRxVjg1UQ)


Тогда что нужно указывать функции GetPed? Разве не handle?

Или как вообще получить CPed из самповского ID?

GAME->GetPools()->GetPedFromRef( SF->getSAMP()->getPlayers()->GetActorHandleFromSAMPPlayerID(i) ) и так пробовал(

Dark_Knight
26.03.2016, 19:19
Что ты хочешь? По идеи, pRemotePlayer тебе хватит.

MISTER_GONWIK
26.03.2016, 19:37
Тогда что нужно указывать функции GetPed? Разве не handle?

Или как вообще получить CPed из самповского ID?
GAME->GetPools()->GetPedFromRef( SF->getSAMP()->getPlayers()->GetActorHandleFromSAMPPlayerID(i) ) и так пробовал(


тебе туда нужно структуру игрока передать:

C++:






// тут я просто показал как получить структуру,
// но однако перед тем как всё это вызывать,
// нужно проверить, что игрок существует и всё такое,
// я не стал этого делать, сам сделаешь, иначе крашнет
actor_info
*
actorInfo
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
iPlayerID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
;
if
(
actorInfo
!=
nullptr
)
{
CPed
*
ped
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
actorInfo
)
;
.
.
}

AWRage
26.03.2016, 23:35
Что ты хочешь? По идеи, pRemotePlayer тебе хватит.


Мне нужно получить координаты костей игрока. В классе CPed есть это.



тебе туда нужно структуру игрока передать:

C++:






// тут я просто показал как получить структуру,
// но однако перед тем как всё это вызывать,
// нужно проверить, что игрок существует и всё такое,
// я не стал этого делать, сам сделаешь, иначе крашнет
actor_info
*
actorInfo
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
iPlayerID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
;
if
(
actorInfo
!=
nullptr
)
{
CPed
*
ped
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
actorInfo
)
;
.
.
}





Спасибо большое! Работает c:

AWRage
27.03.2016, 00:59
1. Как проверить, виден ли игрок моему игроку?

2. Как изменить кол-во элементов в массиве?

C++:






int
i
[
32
]
;
// функция, макрос, хз че еще
i
[
64
]
;

Gabriel__
27.03.2016, 17:51
А как нарисовать линии как в ESP ?

Dark_Knight
27.03.2016, 19:35
DrawLine в классе СRender.

SR_team
27.03.2016, 20:26
1. Как проверить, виден ли игрок моему игроку?
2. Как изменить кол-во элементов в массиве?

C++:






int
i
[
32
]
;
// функция, макрос, хз че еще
i
[
64
]
;





template

T *ReSizeMas(const T *mas, size_t sz, size_t oldsz)

{

T *newMas = new T[sz];

memcpy(newMas, mas, oldsz);

delete mas;

return newMas;

}

Gabriel__
27.03.2016, 20:33
DrawLine в классе СRender.


Там просто отрезок рисуется. А мне нужно чтобы 2D box рисовался. И кстати как сделать прозрачный цвет ?

Dark_Knight
27.03.2016, 20:56
DrawBox. цвет в идет в ARGB, где А - это альфа и на отвечает за прозрачность. 00 = 0, FF = 255/

AWRage
27.03.2016, 21:27
template
T *ReSizeMas(const T *mas, size_t sz, size_t oldsz)
{
T *newMas = new T[sz];
memcpy(newMas, mas, oldsz);
delete mas;
return newMas;
}


Спасибо!

Gabriel__
27.03.2016, 22:27
1. Как получить игроков в зоне стрима ?

2. Как проверить что игрок или точка на экране ?

AWRage
28.03.2016, 00:24
1. Как получить игроков в зоне стрима ?
2. Как проверить что игрок или точка на экране ?



C++:






int
CSAMP
::
GetPlayersInStream
(
)
{
int
InStream
=
0
;
for
(
int
i
=
0
;
i

getSAMP
(
)
->
getPlayers
(
)
->
IsPlayerDefined
(
i
,
true
)
)
InStream
++
;
}
return
InStream
;
}

AWRage
28.03.2016, 00:28
Крашит игра, когда вызываю функцию. Если просто вызвать функцию без присвоения *Menu возвращаемого функцией значения, то все норм.

C++:






// Реализация функции.
struct
stMenu
*
CMenu
::
CreateMenu
(
int
Status
,
const
char
*
Name
,
D3DCOLOR ARGB
,
int
Element
,
int
MaxElement
)
{
struct
stMenu
*
Menu
=
new
struct
stMenu
;
Menu
->
Status
=
Status
;
Menu
->
Name
=
_strdup
(
Name
)
;
Menu
->
ARGB
=
ARGB
;
Menu
->
Element
=
Element
;
Menu
->
MaxElement
=
MaxElement
;
Menu
->
Submenu
=
NULL
;
return
Menu
;
}
// Определение функции в классе CMenu.
static
struct
stMenu
*
CreateMenu
(
int
Status
,
const
char
*
Name
,
D3DCOLOR ARGB
,
int
Element
,
int
MaxElement
)
;
//Вызов функции = краш.
struct
stMenu
*
Menu
;
Menu
=
CreateMenu
(
1
,
"Main"
,
-
1
,
0
,
0
)
;
//Вызов функции = vse ok;
CreateMenu
(
1
,
"Main"
,
-
1
,
0
,
0
)
;

Gabriel__
28.03.2016, 11:41
Ну помогите!

Как проверить что 3D координата на экране ? А то когда конвертирую координаты (SF->getGame()->convert3DCoordsToScreen(x, y, z, &x, &y);) то объекты рисуются где попало возле краев экрана.

Dark_Knight
28.03.2016, 11:42
Это что за меню? И попробуй найти ошибку через трай кетч

Dark_Knight
28.03.2016, 11:58
Ну помогите!
Как проверить что 3D координата на экране ? А то когда конвертирую координаты (SF->getGame()->convert3DCoordsToScreen(x, y, z, &x, &y);) то объекты рисуются где попало возле краев экрана.



Код:






bool OnScreen(CVector vect)
{
SF->getCLEO()->callOpcode("00C2: %f %f %f 0.0", vect.fX, vect.fY, vect.fZ);
return SF->getCLEO()->GetCondResult();
}

AWRage
28.03.2016, 15:56
Это что за меню? И попробуй найти ошибку через трай кетч


Меню сам делал. Ошибку нашёл.

Dark_Knight
28.03.2016, 15:59
Меню сам делал. Ошибку нашёл.


Юзай МенюМенеджер от Тима. Хотя практика вещь таки заебись.

AWRage
28.03.2016, 16:04
Юзай МенюМенеджер от Тима. Хотя практика вещь таки заебись.


Не, хочу свое меню, хотя и знаю что от Тима лучше. Но можно будет подсмотреть реализацию некоторых функций)

Dark_Knight
28.03.2016, 16:06
Не, хочу свое меню, хотя и знаю что от Тима лучше. Но можно будет подсмотреть реализацию некоторых функций)


Там нет сурса)

AWRage
28.03.2016, 16:11
Там нет сурса)


Бля(

Gabriel__
28.03.2016, 18:22
Как определить расстояние от двух точек ? Без callopcode.

Dark_Knight
28.03.2016, 18:24
Как определить расстояние от двух точек ? Без callopcode.


Найти формулу в гугле.

AWRage
28.03.2016, 23:35
Как определить расстояние от двух точек ? Без callopcode.



http://i.imgur.com/Nnmj1jQ.png

PIDORASHUESOS1
29.03.2016, 02:20
Как проверить на существование игрока на сервере?

Woofing Giraffe
29.03.2016, 09:19
Как проверить на существование игрока на сервере?


SF->getSAMP()->getPlayers()->IsPlayerDefined(id, false);

PIDORASHUESOS1
29.03.2016, 15:25
Как создать переменную скорости и позиции?

Dark_Knight
29.03.2016, 15:36
Чего/кого?

SR_team
29.03.2016, 16:45
Как создать переменную скорости и позиции?


CVector speed, pos;

AWRage
31.03.2016, 00:45
Пасаны, такая задача:

Есть подменю, которое содержит название и еще одно подменю, которое в свою очередь содержит тоже название и подменю, которое.. И так далее. Понятное дело, что не во всех подменю есть другие подменю, некоторые являются конечными и в таком случае указатель равен NULL. Вот как мне прогнать это все циклом и найти подменю с нужным именем?

C++:






struct
submenu
{
char
*
name
;
struct
submenu
*
submenu
;
}
;
struct
submenu
*
Submenu
=
new
struct
submenu
;

Vasiliy77
31.03.2016, 14:41
Хм, а где найти архив этого SF с файлами, чтобы просмотреть их содержимое?)

Dark_Knight
31.03.2016, 15:52
Хм, а где найти архив этого SF с файлами, чтобы просмотреть их содержимое?)


В теме SAMPFUNCS в клео разделе.



Пасаны, такая задача:
Есть подменю, которое содержит название и еще одно подменю, которое в свою очередь содержит тоже название и подменю, которое.. И так далее. Понятное дело, что не во всех подменю есть другие подменю, некоторые являются конечными и в таком случае указатель равен NULL. Вот как мне прогнать это все циклом и найти подменю с нужным именем?

C++:






struct
submenu
{
char
*
name
;
struct
submenu
*
submenu
;
}
;
struct
submenu
*
Submenu
=
new
struct
submenu
;





Никак или писать свой шаблон.

next23012
31.03.2016, 16:38
Как подобную конструкцию сделать? Цикл while в mainloop поставить?

CLEO:






cmd
"test"
@test
while
true
if
1@
==
true
then
say
"hello"
wait
3000
1@
=
false
end
end
0BDE:
0
:test
if
1@
==
false
then
1@
=
true
else
1@
=
false
end

Dark_Knight
31.03.2016, 16:45
Нельзя юзать бесконечный файл в меин луп. Вызовет зависание.

san0
31.03.2016, 16:48
Как подобную конструкцию сделать? Цикл while в mainloop поставить?

CLEO:






cmd
"test"
@test
while
true
if
1@
==
true
then
say
"hello"
wait
3000
1@
=
false
end
end
0BDE:
0
:test
if
1@
==
false
then
1@
=
true
else
1@
=
false
end





CreateThread, _beginthread, std::thread

Dark_Knight
31.03.2016, 17:11
Вообще команда вызывается при вызове её и в ней ты просто можешь спокойно вывести текст в чат.

AWRage
31.03.2016, 22:56
А можно ли как-то записать в массив указатели на разные структуры?

Dark_Knight
01.04.2016, 10:27
stFontInfo *mass[10];

AWRage
01.04.2016, 16:21
stFontInfo *mass[10];


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

mass[0] = new stFontInfo;

mass[1] = new stMenu;

mass[2] = new stSubmenu;

SR_team
01.04.2016, 16:26
Не, я имею ввиду, чтобы записать в каждый элемент массива другую структуру.
mass[0] = new stFontInfo;
mass[1] = new stMenu;
mass[2] = new stSubmenu;


И в чем проблема так сделать?

MISTER_GONWIK
01.04.2016, 16:26
Не, я имею ввиду, чтобы записать в каждый элемент массива другую структуру.
mass[0] = new stFontInfo;
mass[1] = new stMenu;
mass[2] = new stSubmenu;


но зачем?

C++:






void
*
ptrs
[
10
]
=
{
nullptr
}
;
ptrs
[
0
]
=
new
.
.
;

Dark_Knight
01.04.2016, 17:18
Дебилизм же, если у тебя статическое количество елементов.

AWRage
01.04.2016, 18:02
но зачем?

C++:






void
*
ptrs
[
10
]
=
{
nullptr
}
;
ptrs
[
0
]
=
new
.
.
;





Если нужно добавить элемент в меню, то в массив нужно добавить указатель на структуру этого элемента. Но их бывает несколько видов (подменю, переключатель, IncDec).

MISTER_GONWIK
01.04.2016, 18:15
Если нужно добавить элемент в меню, то в массив нужно добавить указатель на структуру этого элемента. Но их бывает несколько видов (подменю, переключатель, IncDec).


посмотри как работает меню собейта (dumb_menu.cpp)

2Shae
01.04.2016, 20:53
Подскажите, пожалуйста, как создать и вызвать окно диалога? Через команду, к примеру.

Ладно, как создать понял. А как его при вводе команды показать то?

Woofing Giraffe
01.04.2016, 21:10
Подскажите, пожалуйста, как создать и вызвать окно диалога? Через команду, к примеру.
Ладно, как создать понял. А как его при вводе команды показать то?


Урок самый первый почитай

dimoz
01.04.2016, 22:18
Народ, есть ли способ как-либо заблокировать возможность движения мышки при прицеливании, используя SF API?

Я пробовал с помощью SetMouseSensitivity выставить сенс на 0.0, но это дало лишь замедление мыши.

Также пробовал с помощью registerWndProcCallback возращать false, когда шло сообщение WM_MOUSEMOVE - не помогло.

Помогите, пожалуйста.

2Shae
01.04.2016, 22:37
Урок самый первый почитай


Окей, через команду работает. А как сделать через клавишу/клавиши?

Код:






if (SF->getGame()->isKeyPressed('B'))
{
SF->getSAMP()->getDialog()->ShowDialog(1, DIALOG_STYLE_LIST, "Название", "1\n2\n3\n4", "Выбрать", "Закрыть");
}




Его не выводит.:sad_frog2:

AWRage
01.04.2016, 22:54
посмотри как работает меню собейта (dumb_menu.cpp)


Хорошо.

2Shae
02.04.2016, 00:39
Окей, через команду работает. А как сделать через клавишу/клавиши?

Код:






if (SF->getGame()->isKeyPressed('B'))
{
SF->getSAMP()->getDialog()->ShowDialog(1, DIALOG_STYLE_LIST, "Название", "1\n2\n3\n4", "Выбрать", "Закрыть");
}




Его не выводит.:sad_frog2:


К этому всему, как правильно реализировать обработчик локальных диалогов? Что-то по типу OnDialogResponse в Pawn. Чёт сам пытался, и ***.

Dark_Knight
02.04.2016, 10:56
Так выводит у тебя его или нет? И диалоги должны начинаться с ида 2. Первый ид - это справка на ф1.

Регистрация происходит таким образом.

void CALLBACK OnDialogRespond(int dialogId, int buttonId, int listItem, const char *input){ //Создаешь обработчик диалога

//some code

}

void mainloop(){

if(init)

//some code

SF->getSAMP()->registerDialogCallback(OnDialogRespond);

}

2Shae
02.04.2016, 14:19
И диалоги должны начинаться с ида 2. Первый ид - это справка на ф1.


Бля, я начинал с 1... Теперь работает, но только первый диалог

Код:






SF->getSAMP()->getDialog()->ShowDialog(2, 2, "Название", "1\n2\n3", "Выбрать", "Закрыть");




Код:






if (dialogId == 2)
{
if (buttonId == 1)
{
if (listItem == 0) SF->getSAMP()->getChat()->AddChatMessage(-1, "1");
if (listItem == 1) SF->getSAMP()->getChat()->AddChatMessage(-1, "2");
if (listItem == 2) SF->getSAMP()->getChat()->AddChatMessage(-1, "3");
}
}




Но, если сделать при выборе какого-то пункта переход на другой диалог, то новый не выводит.

Код:






if (dialogId == 2)
{
if (buttonId == 1)
{
if (listItem == 0) SF->getSAMP()->getDialog()->ShowDialog(3, 2, "1 пункт", "1-1\n1-2\n1-3", "Выбрать", "Закрыть");
if (listItem == 1) SF->getSAMP()->getChat()->AddChatMessage(-1, "2");
if (listItem == 2) SF->getSAMP()->getChat()->AddChatMessage(-1, "3");
}
}




Так и "должно" быть или я опять затупил с чем то?

Dark_Knight
02.04.2016, 14:36
Юзай switch case конструкцию и логируй каждое действие.

Woofing Giraffe
02.04.2016, 20:06
Не знаю, мб ебанутый способ, но я объявляю глобальную int, например DialogShow. Когда нужно открыть новый диалог присваиваю ей значение например 2, в мэйнлуп проверяю if(int DialogShow == 2), обнуляю её и вывожу новый диалог

2Shae
03.04.2016, 18:23
логируй каждое действие.


Kak?

Только заметил проблемку...

Код:






SF->getSAMP()->getDialog()->ShowDialog(101, 2, "Название", "1\n2\n3", "Выбрать", "Закрыть");




Код:






switch (dialogId)
{
case 101:
{
if (buttonId == 1)
{
if (listItem == 0) SF->getSAMP()->getChat()->AddChatMessage(-1, "1-1.");
if (listItem == 1) SF->getSAMP()->getChat()->AddChatMessage(-1, "1-2.");
if (listItem == 2) SF->getSAMP()->getDialog()->ShowDialog(102, 2, "Пункт 3", "1\n2", "Выбрать", "Закрыть");
}
else
{
SF->getSAMP()->getChat()->AddChatMessage(-1, "101 закрыт.");
}
}
case 102:
{
if (buttonId == 1)
{
if (listItem == 0) SF->getSAMP()->getChat()->AddChatMessage(-1, "2-1.");
if (listItem == 1) SF->getSAMP()->getChat()->AddChatMessage(-1, "2-2.");
}
else
{
SF->getSAMP()->getChat()->AddChatMessage(-1, "102 закрыт.");
}
}
}




При выборе любого пункта из 101 диалога выводит в чат сообщения из 102 диалога. WTF :D Сообщения при закрытии выводит за оба диалога так же.

Dark_Knight
03.04.2016, 20:43
Заюзай брик после выполнения нужно действия.

2Shae
04.04.2016, 12:47
Почему крашит при использовании SF->getSAMP()->getDialog()->Close(2) ?

Dark_Knight
04.04.2016, 12:57
Потому что нет кнопки 2 в диалогах. Только 0 и 1

2Shae
04.04.2016, 13:06
Потому что нет кнопки 2 в диалогах. Только 0 и 1


При SF->getSAMP()->getDialog()->Close(false/0) тоже крашит.

Бля, писать плагины для CS куда проще. :D

Разобрался.

AWRage
04.04.2016, 23:20
Как правильно освободить выделенную память? Достаточно просто освободить переменную, которая содержит указатель на класс, в котором тоже выделяется память или нужно сначала освободить память в классе, а потом освободить переменную-класс. Код ниже будет правильным?

C++:






class
MyClass
{
int
*
i
=
new
int
;
}
;
MyClass
*
Class
=
new
MyClass
;
// some code
delete
Class
;

Woofing Giraffe
04.04.2016, 23:26
Какое RPC/пакет приходит когда любой человек на сервере умирает?

NarutoUA
05.04.2016, 01:13
Как правильно освободить выделенную память? Достаточно просто освободить переменную, которая содержит указатель на класс, в котором тоже выделяется память или нужно сначала освободить память в классе, а потом освободить переменную-класс. Код ниже будет правильным?

C++:






class
MyClass
{
int
*
i
=
new
int
;
}
;
MyClass
*
Class
=
new
MyClass
;
// some code
delete
Class
;






В деструкторе класса высвобождать выделенную в классе память. Деструктор автоматически вызовется при выполнении delete Class;

AWRage
06.04.2016, 23:55
В деструкторе класса высвобождать выделенную в классе память. Деструктор автоматически вызовется при выполнении delete Class;


А как на счет обычных переменных? Их не нужно освобождать в деструкторе? Они сами удалятся после удаления класса, как локальные переменные в функции, так?

NarutoUA
07.04.2016, 00:00
А как на счет обычных переменных? Их не нужно освобождать в деструкторе? Они сами удалятся после удаления класса, как локальные переменные в функции, так?


Сами, класс это как структура, только класс.

AWRage
07.04.2016, 19:36
Сами, класс это как структура, только класс.


Спасибо :)

AWRage
10.04.2016, 16:08
1̶.̶ ̶П̶о̶ч̶е̶м̶у̶ ̶е̶с̶л̶и̶ ̶ф̶у̶н̶к̶ц̶и̶ю̶ ̶D̶l̶l̶M̶a̶i̶n̶ ̶п̶е̶р̶е̶и̶м̶е̶н̶о̶в̶а̶т̶ ь̶,̶ ̶т̶о̶ ̶с̶к̶р̶и̶п̶т̶ ̶о̶т̶к̶а̶з̶ы̶в̶а̶е̶т̶с̶я̶ ̶р̶а̶б̶о̶т̶а̶т̶ь̶.̶ ̶Н̶е̶ ̶т̶о̶ ̶ч̶т̶о̶ ̶б̶ы̶ ̶э̶т̶о̶ ̶м̶н̶е̶ ̶м̶е̶ш̶а̶л̶о̶,̶ ̶н̶о̶ ̶п̶р̶о̶с̶т̶о̶ ̶и̶н̶т̶е̶р̶е̶с̶н̶о̶,̶ ̶п̶о̶ч̶е̶м̶у̶? Гугол наше все.

2. Как компилятор определяет "точку входа в плагин". То есть, как он понимает, что DllMain - это главная функция, которая инджектит плагин, но не, скажем, Loop.

SR_team
10.04.2016, 16:27
1̶.̶ ̶П̶о̶ч̶е̶м̶у̶ ̶е̶с̶л̶и̶ ̶ф̶у̶н̶к̶ц̶и̶ю̶ ̶D̶l̶l̶M̶a̶i̶n̶ ̶п̶е̶р̶е̶и̶м̶е̶н̶о̶в̶а̶т̶ ь̶,̶ ̶т̶о̶ ̶с̶к̶р̶и̶п̶т̶ ̶о̶т̶к̶а̶з̶ы̶в̶а̶е̶т̶с̶я̶ ̶р̶а̶б̶о̶т̶а̶т̶ь̶.̶ ̶Н̶е̶ ̶т̶о̶ ̶ч̶т̶о̶ ̶б̶ы̶ ̶э̶т̶о̶ ̶м̶н̶е̶ ̶м̶е̶ш̶а̶л̶о̶,̶ ̶н̶о̶ ̶п̶р̶о̶с̶т̶о̶ ̶и̶н̶т̶е̶р̶е̶с̶н̶о̶,̶ ̶п̶о̶ч̶е̶м̶у̶? Гугол наше все.
2. Как компилятор определяет "точку входа в плагин". То есть, как он понимает, что DllMain - это главная функция, которая инджектит плагин, но не, скажем, Loop.


она подписана. в компиляторе можно изменить точку входа

Vasiliy77
10.04.2016, 22:10
Как можно с помощью SF получить список загруженных cleo скриптов, или вообще участок процесса, куда они загрузились (именно названия)? И еще dll библиотек, если возможно. Названия функций хотя бы назовите

Dark_Knight
10.04.2016, 23:13
1. http://gtamodding.ru/wiki/Адреса_Памяти_(SA) (https://www.blast.hk/redirect/aHR0cDovL2d0YW1vZGRpbmcucnUvd2lraS_QkNC00YDQtdGB0L Bf0J_QsNC80Y_RgtC4XyhTQSk) "Относящееся к SCM"

2. http://pastebin.com/Zi1uVDDV (https://www.blast.hk/redirect/aHR0cDovL3Bhc3RlYmluLmNvbS9aaTF1VkREVg)

Vasiliy77
12.04.2016, 01:46
Можно ли сделать рендер картинки через SF функции, т.е. чтобы сама картинка была в самом исходнике уже, без доп. файлов .txd? Какие функции надо юзать?

И какие функции нужны для рендера картинки на загрузочный экран, и уже во время игры?

AWRage
12.04.2016, 02:01
Можно ли будет использовать SAMPFUNCS в НЕ sf-плагинах? То есть, просто некоторые функции.

MISTER_GONWIK
12.04.2016, 06:27
Можно ли будет использовать SAMPFUNCS в НЕ sf-плагинах? То есть, просто некоторые функции.


можно, но сложно

p.s. делал вызов функции выгрузки плагина

C++:






(
(
void
(
__thiscall
)
(
void
_this
,
std
::
string text
)
)
(
g_dwSF_Addr
+
0x8E9A0
)
)
(
(
void
*
)
(
g_dwSF_Addr
+
0x28F7C0
)
,
"blablabla.sf"
)
;

2Shae
12.04.2016, 12:58
Можно ли сделать рендер картинки через SF функции, т.е. чтобы сама картинка была в самом исходнике уже, без доп. файлов .txd? Какие функции надо юзать?
И какие функции нужны для рендера картинки на загрузочный экран, и уже во время игры?


https://www.blast.hk/wiki/tutorials:api_lesson_render

Vasiliy77
12.04.2016, 18:42
https://www.blast.hk/wiki/tutorials:api_lesson_render


LoadTextureFromFile( "SAMPFUNCS\\image.png" ) - текстура грузится из файла, а нужно чтобы сразу "внутри" себя брало и грузило

Gabriel__
12.04.2016, 19:41
Что за адрес ? 0x609CF9

CarLCas
12.04.2016, 21:58
Что за адрес ? 0x609CF9


Размер прицела

Vasiliy77
13.04.2016, 00:22
Может знает кто, какой указатель идет к скорости анимации скина (не скорости)? В CE оффсетов нашлось >500 штук, а нужный искать месяц точно..(

Gabriel__
13.04.2016, 14:46
1.Автоматический поиск указателей используй.

2. Есть адрес 0xB6F5F0 в нем хранится указатель на игрока CPed и по смещению там есть скорость скина.

AWRage
17.04.2016, 22:15
Поможет кто с d3d хуком?

Dark_Knight
17.04.2016, 22:17
А че надо?

AWRage
18.04.2016, 17:49
А че надо?


Хотел написать свой .asi плагин. Нужно написать d3dhook чтобы рендерить текст и примитивы. А я даже хз с чего начать и где искать. Искал в исходниках собейта, но там нихуя не понятно.

NarutoUA
18.04.2016, 18:13
Хотел написать свой .asi плагин. Нужно написать d3dhook чтобы рендерить текст и примитивы. А я даже хз с чего начать и где искать. Искал в исходниках собейта, но там нихуя не понятно.


В интеренте есть полно кода д3д хука

2Shae
20.04.2016, 23:12
Как записать в реестр значение int? Если это возможно, конечно же.

Woofing Giraffe
21.04.2016, 21:55
Глупый вопрос, но всё же, почему не удаётся объявить шрифты в массиве?

Код:






stFontInfo *Fonts[4] = { pFont, pFontTitle, pFontFirst, pFontTwo };

Dark_Knight
21.04.2016, 22:02
Ты хочешь, чтобы в одном массиве было 4 елемента с разными названиями? Тебе мапа стринговая нужна или структура.

AWRage
22.04.2016, 00:49
Вообщем, сделал d3d hook, собрал это добро в .asi файл и кинул в папку с игрой. Захожу - работает, у других выскакивает ошибка отсутствия библиотеки vcruntime140.dll. Шо делать?

Dark_Knight
22.04.2016, 02:13
http://forum.oszone.net/thread-145766.html (https://www.blast.hk/redirect/aHR0cDovL2ZvcnVtLm9zem9uZS5uZXQvdGhyZWFkLTE0NTc2Ni 5odG1s)

Пусть ставят

AWRage
22.04.2016, 14:18
http://forum.oszone.net/thread-145766.html (https://www.blast.hk/redirect/aHR0cDovL2ZvcnVtLm9zem9uZS5uZXQvdGhyZWFkLTE0NTc2Ni 5odG1s)
Пусть ставят


А почему для собейта такого ставить не нужно? Или то что я описал выше нормально?

Dark_Knight
22.04.2016, 14:19
Нормально.

C&J
22.04.2016, 18:52
Здравствуйте,не могли бы вы,описать за что отвечают данный переменные в textdraw,или дать ссылку для прочтение?

struct stTextdraw

{

char szText[800 + 1]; // Вроде как за текст?

char szString[1600 + 2];//Тоже текст

float fLetterWidth;//Размеры?

float fLetterHeight;//Так же размеры

DWORD dwLetterColor;//Цвет

uint8_t byte_unk; // always = 01 (?)

BYTE byteCenter;// ?

BYTE byteBox;// Бокс

float fBoxSizeX;//Размер Бокса по X

float fBoxSizeY;//Размеры Бокса по Y

DWORD dwBoxColor;//Цвет Бокса

BYTE byteProportional;// ?

DWORD dwShadowColor;//Цвет чего-то

BYTE byteShadowSize;//Размер чего-то

BYTE byteOutline;// ?

BYTE byteLeft;//?

BYTE byteRight;//?

int iStyle; // font style/texture/model |Так понял стиль textdraw

float fX;// Позиция чего-то по X?

float fY;//Позиция чего-то по Y

byte unk[8];// ?

DWORD dword99B; // -1 by default ???

DWORD dword99F; // -1 by default ???

DWORD index; // -1 if bad ID textdraw'a?

BYTE byte9A7; // = 1; 0 by default ???

uint16_t sModel; //???

float fRot[3];//???

float fZoom;//???

WORD sColor[2];// Цвет чего-то

BYTE f9BE; //???

BYTE byte9BF;//???

BYTE byte9C0;//???

DWORD dword9C1;//???

DWORD dword9C5;//???

DWORD dword9C9;//???

DWORD dword9CD;//???

BYTE byte9D1;//???

DWORD dword9D2;//???

};

struct stTextdrawPool

{

int iIsListed[SAMP_MAX_TEXTDRAWS]; //Существует ли глобальный textdraw?

int iPlayerTextDraw[SAMP_MAX_PLAYERTEXTDRAWS];//Существует ли textdraw для игрока?

struct stTextdraw *textdraw[SAMP_MAX_TEXTDRAWS];//???

struct stTextdraw *playerTextdraw[SAMP_MAX_PLAYERTEXTDRAWS];//???

};

Dark_Knight
22.04.2016, 20:05
Ничего нет. Разберись сам. можешь опкоды СФ для работы с текстдравами заюзать.

AWRage
22.04.2016, 22:06
struct stTextdraw

{

char szText[800 + 1]; // Вроде как за текст?

char szString[1600 + 2];//Тоже текст

float fLetterWidth; Ширина

float fLetterHeight; Высота

DWORD dwLetterColor;//Цвет

uint8_t byte_unk; // always = 01 (?)

BYTE byteCenter; Выравнивание по центру

BYTE byteBox;// Бокс

float fBoxSizeX;//Размер Бокса по X

float fBoxSizeY;//Размеры Бокса по Y

DWORD dwBoxColor;//Цвет Бокса

BYTE byteProportional;// Пропорциональность, потести, поймешь.

DWORD dwShadowColor;// Цвет тени

BYTE byteShadowSize;//Размер тени

BYTE byteOutline;// Обводка

BYTE byteLeft;// Выравнивание по левому краю

BYTE byteRight;// Выравнивание по правому краю

int iStyle; // font style/texture/model |Так понял стиль textdraw

float fX;// Позиция текстдрава

float fY;//Позиция текстдрава

byte unk[8];// ?

DWORD dword99B; // -1 by default ???

DWORD dword99F; // -1 by default ???

DWORD index; // -1 if bad ID textdraw'a?

BYTE byte9A7; // = 1; 0 by default ???

uint16_t sModel; //???

float fRot[3];//???

float fZoom;//???

WORD sColor[2];// Цвет чего-то

BYTE f9BE; //???

BYTE byte9BF;//???

BYTE byte9C0;//???

DWORD dword9C1;//???

DWORD dword9C5;//???

DWORD dword9C9;//???

DWORD dword9CD;//???

BYTE byte9D1;//???

DWORD dword9D2;//???

};

struct stTextdrawPool

{

int iIsListed[SAMP_MAX_TEXTDRAWS]; //Существует ли глобальный textdraw?

int iPlayerTextDraw[SAMP_MAX_PLAYERTEXTDRAWS];//Существует ли textdraw для игрока?

struct stTextdraw *textdraw[SAMP_MAX_TEXTDRAWS];// массив текстдравов. То есть, можно обращаться к элементам и получать текстдрав по его ID

struct stTextdraw *playerTextdraw[SAMP_MAX_PLAYERTEXTDRAWS];// массив текстдравов игрока ^

};

dimoz
23.04.2016, 12:05
пытаюсь прочитать позицию пикапа с помощью перехвата RPC, но правильно читается только его ID, а всё остальное - нет.

Код:






else if (params->packetId == ScriptRPCEnumeration::RPC_ScrCreatePickup)
{
short pickup_id;
float pos[3];
int model_id;
int type;
params->bitStream->ResetReadPointer(); // на всякий случай устанавливаем оффсет чтения на начало
params->bitStream->Read(pickup_id); // читаем отправляемые данные
params->bitStream->Read(model_id); // читаем отправляемые данные
params->bitStream->Read(type); // читаем отправляемые данные
params->bitStream->Read(pos); // читаем отправляемые данные
params->bitStream->ResetReadPointer(); // снова обнуляем оффсет чтения
SF->getSAMP()->getChat()->AddChatMessage(-1, "%d %f %f %f", pickup_id, pos[0], pos[1], pos[2]);

return true;
}




Решил методом тыка.

Код:






params->bitStream->ResetReadPointer(); // на всякий случай устанавливаем оффсет чтения на начало
params->bitStream->Read(pickup_id); // читаем отправляемые данные
params->bitStream->SetReadOffset(96);
params->bitStream->Read(pos[0]); // читаем отправляемые данные
params->bitStream->Read(pos[1]); // читаем отправляемые данные
params->bitStream->Read(pos[2]); // читаем отправляемые данные
params->bitStream->ResetReadPointer(); // снова обнуляем оффсет чтения
SF->getSAMP()->getChat()->AddChatMessage(-1, "%d %f %f %f", pickup_id, pos[0], pos[1], pos[2]);

Dark_Knight
23.04.2016, 15:41
пытаюсь прочитать позицию пикапа с помощью перехвата RPC, но правильно читается только его ID, а всё остальное - нет.

Код:






else if (params->packetId == ScriptRPCEnumeration::RPC_ScrCreatePickup)
{
short pickup_id;
float pos[3];
int model_id;
int type;
params->bitStream->ResetReadPointer(); // на всякий случай устанавливаем оффсет чтения на начало
params->bitStream->Read(pickup_id); // читаем отправляемые данные
params->bitStream->Read(model_id); // читаем отправляемые данные
params->bitStream->Read(type); // читаем отправляемые данные
params->bitStream->Read(pos); // читаем отправляемые данные
params->bitStream->ResetReadPointer(); // снова обнуляем оффсет чтения
SF->getSAMP()->getChat()->AddChatMessage(-1, "%d %f %f %f", pickup_id, pos[0], pos[1], pos[2]);

return true;
}




Решил методом тыка.

Код:






params->bitStream->ResetReadPointer(); // на всякий случай устанавливаем оффсет чтения на начало
params->bitStream->Read(pickup_id); // читаем отправляемые данные
params->bitStream->SetReadOffset(96);
params->bitStream->Read(pos[0]); // читаем отправляемые данные
params->bitStream->Read(pos[1]); // читаем отправляемые данные
params->bitStream->Read(pos[2]); // читаем отправляемые данные
params->bitStream->ResetReadPointer(); // снова обнуляем оффсет чтения
SF->getSAMP()->getChat()->AddChatMessage(-1, "%d %f %f %f", pickup_id, pos[0], pos[1], pos[2]);





https://docs.google.com/spreadsheet/ccc?key=0AtKPKl8O9mGodFZESEp6WEdzcTB0U2V1ZkR0UWpub 1E#gid=1 (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXQvY2 NjP2tleT0wQXRLUEtsOE85bUdvZEZaRVNFcDZXRWR6Y1RCMFUy VjFaa1IwVVdwdWIxRSNnaWQ9MQ)

AWRage
23.04.2016, 16:03
Мой хук работает так:

Я хукаю оргинальную функцию Present (или End Scene) моей функцией Present. Когда оригинальная функция Present вызовется игрой, сначала выполнится моя функция, а потом в конце моей функции я вызову стандартную функцию. Но в SFAPI там немного по другому. То есть, оригинальная функция не вызывается ибо в конце функций стоит не return originalPresent(pDevice, ...), а просто return TRUE. Как это работает в SFAPI? Это другой вид хука?

Dark_Knight
23.04.2016, 16:21
В СФ юзается хук как в собейте. Можешь там глянуть.

AWRage
23.04.2016, 21:53
В СФ юзается хук как в собейте. Можешь там глянуть.


Но там тоже в конце выполняется оригинальная функция present.

Код:






HRESULT proxyIDirect3DDevice9::Present ( CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride,
CONST RGNDATA *pDirtyRegion )
{
traceLastFunc( "proxyIDirect3DDevice9::Present()" );

renderHandler();

// get original function to return
return origIDirect3DDevice9->Present( pSourceRect, pDestRect, hDestWindowOverride, pDirtyRegion );
}

Dark_Knight
23.04.2016, 22:06
И?

AWRage
23.04.2016, 23:06
И?


А в SFAPI функция просто возвращает TRUE. То есть, оригинальная функция не вызывается. Почему так?

SR_team
24.04.2016, 15:31
А в SFAPI функция просто возвращает TRUE. То есть, оригинальная функция не вызывается. Почему так?


плагинов может быть over9000, а хуков столько не надо. Сам хук находится в СФ и он вызывает стандартную функцию в конце, а в теле хука опрашивает функции в плагинах и рисует чот свое.

dimoz
24.04.2016, 17:35
у кого-нибудь есть структура входящего пакета RPC_ScrShowDialog?

Tray228
26.04.2016, 19:01
можно ли получить ники игроков которые поменяли со старого на новый

Dark_Knight
26.04.2016, 19:43
Всмысле?

AWRage
26.04.2016, 20:12
можно ли получить ники игроков которые поменяли со старого на новый


Если ты хочешь просмотреть их namestore, то нет. На некоторых серверах это есть, но там походу для каждого игрока массив со сменами ников.

Woofing Giraffe
28.04.2016, 00:02
http://cs631322.vk.me/v631322142/2464f/K9PyCknLZbQ.jpg

В чём причина? Не могу поменять выходной каталог

Tray228
28.04.2016, 14:44
Если ты хочешь просмотреть их namestore, то нет. На некоторых серверах это есть, но там походу для каждого игрока массив со сменами ников.


Нет, мне нужно которые сменили в данный момент

Dark_Knight
28.04.2016, 15:44
Только через логирование и сравнение строк чата.

Gabriel__
01.05.2016, 12:39
Как проверить что открыто меню на ESC ?

DarkP1xel
01.05.2016, 13:27
C++:






if
(
SF
->
getGame
(
)
->
isGTAMenuActive
(
)
)
{
//some code
}

Yakkoff
11.05.2016, 10:21
Захотел начать писать SF плагины, прочитал вики, при первой же компиляции появляется ошибка:

Код:






Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка (активно) не удается открыть источник файл "d3dx9.h" SFPlugin d:\GTASA\SFPlugin\SFPlugin\SFPlugin\SFAPI\SAMPFUNC S_API.h 21

SR_team
11.05.2016, 10:30
Захотел начать писать SF плагины, прочитал вики, при первой же компиляции появляется ошибка:

Код:






Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка (активно) не удается открыть источник файл "d3dx9.h" SFPlugin d:\GTASA\SFPlugin\SFPlugin\SFPlugin\SFAPI\SAMPFUNC S_API.h 21





DXSDK установи

Yakkoff
11.05.2016, 23:50
DXSDK установи


Какой именно? Там несколько версий.

DarkP1xel
12.05.2016, 08:37
Какой именно? Там несколько версий.


https://www.microsoft.com/en-us/download/details.aspx?id=6812 (https://www.blast.hk/redirect/aHR0cHM6Ly93d3cubWljcm9zb2Z0LmNvbS9lbi11cy9kb3dubG 9hZC9kZXRhaWxzLmFzcHg_aWQ9NjgxMg)

Dark_Knight
20.05.2016, 19:53
Код:






stServerPresets *setting = SF->getSAMP()->getInfo()->pSettings;
SFGame *game = SF->getGame();
if (game->isKeyDown(VK_F3)){
if (setting->byteNoNametagsBehindWalls == 1)
setting->byteNoNametagsBehindWalls = 0;
else
setting->byteNoNametagsBehindWalls = 1;
}

Dark_Knight
20.05.2016, 22:02
Потому что флоат. Иди учи типы данных.

Frixen
20.05.2016, 22:17
Потому что флоат. Иди учи типы данных.


Выучил) Исправил)

CarLCas
22.05.2016, 19:27
C++:






if
(
SF
->
getGame
(
)
->
isKeyDown
(
119
)
!=
NULL
)
{
stServerPresets
*
setting
=
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pSettings
;
if
(
setting
->
byteNoNametagsBehindWalls
==
0
)
{
setting
->
byteNoNametagsBehindWalls
=
1
;
Sleep
(
2
)
;
}
else
{
setting
->
byteNoNametagsBehindWalls
=
0
;
}
}




Подскажите пожалуйста, когда жму F8 при включенном WH, у меня он не всегда выключается, а просто быстренько моргнет перед скрином и опять включается... Как это исправить?



C++:






if
(
SF
->
getGame
(
)
->
isKeyDown
(
119
)
!=
NULL
)
{
stServerPresets
*
setting
=
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pSettings
;
if
(
setting
->
byteNoNametagsBehindWalls
==
1
)
{
setting
->
byteNoNametagsBehindWalls
=
0
;
}
}

CarLCas
22.05.2016, 20:28
надо чтобы он после скриншота включился


Ниже проверку сделай на то что скриншот сделан, либо задержку, только не Sleep, иначе тебе игру зафризит, и скрин сделается после задержки, а через условие разницы времени, выше можешь поискать как это

Woofing Giraffe
22.05.2016, 22:41
C++:






if
(
SF
->
getGame
(
)
->
isKeyDown
(
119
)
!=
NULL
)
{
stServerPresets
*
setting
=
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pSettings
;
if
(
setting
->
byteNoNametagsBehindWalls
==
0
)
{
setting
->
byteNoNametagsBehindWalls
=
1
;
Sleep
(
2
)
;
}
else
{
setting
->
byteNoNametagsBehindWalls
=
0
;
}
}




Подскажите пожалуйста, когда жму F8 при включенном WH, у меня он не всегда выключается, а просто быстренько моргнет перед скрином и опять включается... Как это исправить?


У тебя KeyDown, т.е. код срабатывает пока ты удерживаешь клавишу, используй KeyPressed

Dark_Knight
23.05.2016, 02:52
И убери на*** слип

Dark_Knight
23.05.2016, 02:53
Как правильно юзать таймер, чтобы после нажатия клавиши допустим F8 пошел отсчет, а после 5 секунд произошло какое-нибудь действие.

C++:






static
DWORD timer
=
0
;
void
mainloop
(
)
{
if
{
!
init
}
{
}
if
(
GetTickCount
-
timer
>
5000
)
{
SF
->
log
(
"Таймер работает раз в 5 секунд"
)
;
timer
=
GetTickCount
(
)
;
}
}




Пробовал делать так, но он срабатывает сразу и потом каждые 5 секунд


Добавить буллевую переменную

CarLCas
23.05.2016, 08:14
Как правильно юзать таймер, чтобы после нажатия клавиши допустим F8 пошел отсчет, а после 5 секунд произошло какое-нибудь действие.

C++:






static
DWORD timer
=
0
;
void
mainloop
(
)
{
if
{
!
init
}
{
}
if
(
GetTickCount
-
timer
>
5000
)
{
SF
->
log
(
"Таймер работает раз в 5 секунд"
)
;
timer
=
GetTickCount
(
)
;
}
}




Пробовал делать так, но он срабатывает сразу и потом каждые 5 секунд



C++:






static
bool
init
,
screen
;
static
DWORD timer
=
0
;
/*
code
*/
if
(
SF
->
getGame
(
)
->
isKeyPressed
(
119
)
)
//разница KeyDown и KeyPressed, в том что Pressed 1 раз выполнит код когда ты нажмешь на клавишу, а KeyDown всегда пока кнопка нажата
{
stServerPresets
*
setting
=
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pSettings
;
if
(
setting
->
byteNoNametagsBehindWalls
==
1
)
{
setting
->
byteNoNametagsBehindWalls
=
0
;
screen
=
true
;
timer
=
GetTickCount
(
)
;
}
}
if
(
(
GetTickCount
(
)
-
timer
>
1500
)
&&
screen
)
{
stServerPresets
*
setting
=
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pSettings
;
if
(
setting
->
byteNoNametagsBehindWalls
==
0
)
{
setting
->
byteNoNametagsBehindWalls
=
1
;
screen
=
false
;
}
}

Frixen
23.05.2016, 12:31
Добрые люди, может у кого есть код аймбота обычного под SF??

CarLCas
23.05.2016, 18:15
Добрые люди, может у кого есть код аймбота обычного под SF??


Тут не под сф конечно, но работать и в сф плагине будет. Если нужно будет, сам переведешь под сф там не сложно

C++:






#define CAMERA_X *(float *)0xB6F258
DWORD
*
pActor
=
(
DWORD
*
)
0xB6F5F0
;
if
(
*
pActor
>
0
)
{
if
(
GetAsyncKeyState
(
0x01
)
)
// можешь заменить на SF->getGame()->isKeyPressed(0x01)
{
DWORD
*
pTarget
=
(
DWORD
*
)
0xB6F3B8
;
DWORD
*
pPed
=
(
DWORD
*
)
(
(
*
pTarget
)
+
0x79C
)
;
if
(
*
pPed
>
0
)
{
float
mult1
=
35.0f
;
float
mult2
=
17.0f
;
mult2
/=
360.0f
;
DWORD
*
vPos
=
(
DWORD
*
)
(
(
*
pPed
)
+
0x14
)
;
CVector vecSpeed
=
*
(
CVector
*
)
(
(
*
pPed
)
+
0x44
)
;
vecSpeed
.
fX
*=
mult2
;
vecSpeed
.
fY
*=
mult2
;
vecSpeed
.
fZ
*=
mult2
;
vecSpeed
.
fX
*=
mult1
;
vecSpeed
.
fY
*=
mult1
;
vecSpeed
.
fZ
*=
mult1
;
CVector vecPos
;
vecPos
.
fX
=
*
(
float
*
)
(
*
vPos
+
0x30
)
;
vecPos
.
fY
=
*
(
float
*
)
(
*
vPos
+
0x34
)
;
vecPos
.
fZ
=
*
(
float
*
)
(
*
vPos
+
0x38
)
;
vecPos
.
fX
+=
vecSpeed
.
fX
;
vecPos
.
fY
+=
vecSpeed
.
fY
;
vecPos
.
fZ
+=
vecSpeed
.
fZ
;
CVector newVecPos
=
vecPos
;
CVector vecCameraPos
;
vecCameraPos
.
fX
=
*
(
float
*
)
(
0xB6F9CC
)
;
vecCameraPos
.
fY
=
*
(
float
*
)
(
0xB6F9D0
)
;
vecCameraPos
.
fZ
=
*
(
float
*
)
(
0xB6F9D4
)
;
CVector newVecOrigin
;
DWORD
*
vPos2
=
(
DWORD
*
)
(
(
*
pActor
)
+
0x14
)
;
newVecOrigin
.
fX
=
*
(
float
*
)
(
*
vPos2
+
0x30
)
;
newVecOrigin
.
fY
=
*
(
float
*
)
(
*
vPos2
+
0x34
)
;
newVecOrigin
.
fZ
=
*
(
float
*
)
(
*
vPos2
+
0x38
)
;
vecCameraPos
.
fX
-=
newVecPos
.
fX
;
vecCameraPos
.
fY
-=
newVecPos
.
fY
;
if
(
vecCameraPos
.
fX

newVecPos
.
fX
&&
newVecOrigin
.
fY
>
newVecPos
.
fY
)
{
ccamy
-=
unk7
[
1
]
;
cam_x
=
ccamy
;
}
else
if
(
newVecOrigin
.
fX
>
newVecPos
.
fX
&&
newVecOrigin
.
fY

newVecPos
.
fY
)
{
ccamx
+=
unk7
[
2
]
;
cam_x
=
ccamx
;
}
else
if
(
newVecOrigin
.
fX

-
0.18f
)
{
cam_x
+=
0.0389f
;
CAMERA_X
=
cam_x
;
}
}
}
}
}

Frixen
24.05.2016, 12:25
В собейте получение камеры выглядит следующим образом:

C++:






// get the camera
CCamera
*
pCamera
=
pGame
->
GetCamera
(
)
;
// grab the active cam
CCamSAInterface
*
pCam
=
(
CCamSAInterface
*
)
(
(
CCamSA
*
)
pCamera
->
GetCam
(
pCamera
->
GetActiveCam
(
)
)
)
->
GetInterface
(
)
;




Как это будет выглядеть в SF API

Dark_Knight
24.05.2016, 22:46
GAMЕ юзай

Frixen
31.05.2016, 21:09
Как проверить, что чат открыт?

DarkP1xel
31.05.2016, 21:11
Как проверить, что чат открыт?



C++:






if
(
SF
->
getSAMP
(
)
->
getInput
(
)
->
iInputEnabled
)
{
}

Frixen
31.05.2016, 21:23
C++:






if
(
SF
->
getSAMP
(
)
->
getInput
(
)
->
iInputEnabled
)
{
}





0C0C: 10@ = struct 6@ offset {dwPosChatInput1}0x8 size 4 // X

0C0C: 11@ = struct 6@ offset {dwPosChatInput2}0xC size 4 // Y

а насчет этого не подскажешь как будет SF API?

Dark_Knight
31.05.2016, 22:14
SF -> samp -> chat

Frixen
31.05.2016, 22:38
Как получить координаты input box у чата

Dark_Knight
31.05.2016, 23:32
Как получить координаты input box у чата


SF -> samp -> chat

SF -> samp -> chat

SF -> samp -> chat

SF -> samp -> chat

SF -> samp -> chat

SF -> samp -> chat

SF -> samp -> chat

SF -> samp -> chat

Но все ты не по1учищь

Frixen
02.06.2016, 19:12
0BAF: samp 6@ = get_input_info_ptr

0C0C: 6@ = struct 6@ offset {pDXUTEditBox}0x8 size 4

0C0C: 10@ = struct 6@ offset {dwPosChatInput1}0x8 size 4 // X

0C0C: 11@ = struct 6@ offset {dwPosChatInput2}0xC size 4 // Y

через callopcode это можно реализовать?

itsLegend
02.06.2016, 21:12
Перед этим память выдели только.

AWRage
03.06.2016, 00:01
0BAF: samp 6@ = get_input_info_ptr
0C0C: 6@ = struct 6@ offset {pDXUTEditBox}0x8 size 4
0C0C: 10@ = struct 6@ offset {dwPosChatInput1}0x8 size 4 // X
0C0C: 11@ = struct 6@ offset {dwPosChatInput2}0xC size 4 // Y
через callopcode это можно реализовать?


Можно так.

C++:






DWORD a
=
*
(
DWORD
*
)
(
(
(
DWORD
)
GetModuleHandleA
(
"samp.dll"
)
)
+
0x21A0E8
)
;
DWORD b
=
*
(
DWORD
*
)
(
a
+
0x8
)
;
DWORD X
=
*
(
DWORD
*
)
(
b
+
0x8
)
;
DWORD Y
=
*
(
DWORD
*
)
(
b
+
0xC
)
;

Gabriel__
04.06.2016, 18:58
Почему мои asi файлы не грузятся игрой ? Чужие грузятся а мои нет.

C++:






#include
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD ul_reason_for_call
,
LPVOID lpReserved
)
{
switch
(
ul_reason_for_call
)
{
case
DLL_PROCESS_ATTACH
:
MessageBoxA
(
NULL
,
"Hello world!"
,
"MessageBoxA"
,
MB_OK
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}

SR_team
04.06.2016, 19:03
Почему мои asi файлы не грузятся игрой ? Чужие грузятся а мои нет.

C++:






#include
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD ul_reason_for_call
,
LPVOID lpReserved
)
{
switch
(
ul_reason_for_call
)
{
case
DLL_PROCESS_ATTACH
:
MessageBoxA
(
NULL
,
"Hello world!"
,
"MessageBoxA"
,
MB_OK
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}





твой не такой как все. Убедись, что в настройках проекта стоит динамическая бибилиотека

Gabriel__
04.06.2016, 19:38
твой не такой как все. Убедись, что в настройках проекта стоит динамическая бибилиотека


Стоит динамическая.

barspinoff
05.06.2016, 00:04
Как получить текст из RPC_ClickTextDraw?

Dark_Knight
07.06.2016, 12:49
Как получить текст из RPC_ClickTextDraw?


В нем нет текста, но есть один варик. Если текст после клика не удаляется, то в массиве TextDrawForPlayer можно получить по иду с ClickTextDraw

Tray228
07.06.2016, 18:45
id анимок как получить?

Dark_Knight
07.06.2016, 22:35
В stOnFootData есть ид текущей анимации.

Tray228
08.06.2016, 00:16
а как можно получить все пакеты и рпц, те которые я отправил, и которые мне пришли со стороны сервера?

AWRage
08.06.2016, 00:38
а как можно получить все пакеты и рпц, те которые я отправил, и которые мне пришли со стороны сервера?


С начала игры логгировать все в память игры или в файл.

Dark_Knight
08.06.2016, 01:22
а как можно получить все пакеты и рпц, те которые я отправил, и которые мне пришли со стороны сервера?


Количество чтоли?:

Tray228
08.06.2016, 01:36
Количество чтоли?:


Нет, название

Dark_Knight
08.06.2016, 09:35
Нет, название


RakLogger юзай

Frixen
09.06.2016, 21:17
C++:






SF
->
getCLEO
(
)
->
callOpcode
(
"02AB: set_actor $PLAYER_ACTOR immunities BP 1 FP 1 EP 1 CP 1 MP 1"
)
;




так гм работать не будет?

AWRage
09.06.2016, 23:23
C++:






SF
->
getCLEO
(
)
->
callOpcode
(
"02AB: set_actor $PLAYER_ACTOR immunities BP 1 FP 1 EP 1 CP 1 MP 1"
)
;




так гм работать не будет?


Это говно все. Зачем ты перешёл на плагины, если пишешь их на вызовах опкодов? В папке с проектом есть game_api.Вот его и юзай, там должно это быть.

SR_team
10.06.2016, 00:49
C++:






SF
->
getCLEO
(
)
->
callOpcode
(
"02AB: set_actor $PLAYER_ACTOR immunities BP 1 FP 1 EP 1 CP 1 MP 1"
)
;




так гм работать не будет?


#define PedSoft 0x01

#define FreezePed 0x02

#define BulletProtect 0x04

#define FireProtect 0x08

#define CollisionProtect 0x10

#define MeleeProtect 0x20

#define Unc_7bit 0x40

#define ExplosionProtect 0x80

SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped->flags = BulletProtect + MeleeProtect; //защита от пуль и ударов

SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped->vehicle->flags = CollisionProtect; //защита от столкновений (машина игрока)

Frixen
10.06.2016, 06:46
#define PedSoft 0x01
#define FreezePed 0x02
#define BulletProtect 0x04
#define FireProtect 0x08
#define CollisionProtect 0x10
#define MeleeProtect 0x20
#define Unc_7bit 0x40
#define ExplosionProtect 0x80

SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped->flags = BulletProtect + MeleeProtect; //защита от пуль и ударов
SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped->vehicle->flags = CollisionProtect; //защита от столкновений (машина игрока)


почему крашит?

вот это - SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped->vehicle->flags = CollisionProtect;

SR_team
10.06.2016, 08:59
почему крашит?
вот это - SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped->vehicle->flags = CollisionProtect;


ты не в машине

Tray228
10.06.2016, 14:02
ты не в машине


FreezePed это че?

CarLCas
10.06.2016, 15:13
FreezePed это че?


Фриз (заморозка), не? Вроде из наименования понятно

Frixen
11.06.2016, 09:23
Можно ли изменить цвет сообщений от игроков в чате? с белого на черный допустим?

CarLCas
11.06.2016, 10:05
Можно ли изменить цвет сообщений от игроков в чате? с белого на черный допустим?


Ставишь хук на ClientMessage, читаешь параметры (DWORD color, DWORD strLen, char[] msg), записываешь измененные

Frixen
11.06.2016, 10:23
Ставишь хук на ClientMessage, читаешь параметры (DWORD color, DWORD strLen, char[] msg), записываешь измененные


Оу, не разу не работал с Raknet, можно простенький пример?

SR_team
11.06.2016, 10:28
Оу, не разу не работал с Raknet, можно простенький пример?


https://www.blast.hk/wiki/tutorials:api_lesson_raknet

Frixen
11.06.2016, 21:29
Проблема в том, что RPC_ScrClientMessage получает\меняет цвет только определенных сообщений типо объявлений на arp и /me, /do, /try, но не сообщений от игрока. Как сделать наоборот?

Вот как все получается:




http://cs633521.vk.me/v633521510/32f10/vr3_cTErSGc.jpg

san0
11.06.2016, 21:39
Проблема в том, что RPC_ScrClientMessage получает\меняет цвет только определенных сообщений типо объявлений на arp и /me, /do, /try, но не сообщений от игрока. Как сделать наоборот?
Вот как все получается:



http://cs633521.vk.me/v633521510/32f10/vr3_cTErSGc.jpg





Сканируй строку на "{" цвет "}" и меняй

Gabriel__
12.06.2016, 11:28
Какие параметры у RPC Client Check?

Frixen
12.06.2016, 13:09
C++:






bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
// определение callback-функции которая будет вызвана при отправке какого либо пакета
{
if
(
params
->
packetId
==
RPCEnumeration
::
RPC_Chat
)
// если отправляемый пакет ID_PLAYER_SYNC
{
WORD id
;
byte length
;
char
message
[
248
]
;
byte packet
;
char
buf
[
248
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
// на всякий случай устанавливаем оффсет чтения на начало
params
->
bitStream
->
Read
(
packet
)
;
// читаем ID пакета
params
->
bitStream
->
Read
(
id
)
;
params
->
bitStream
->
Read
(
length
)
;
params
->
bitStream
->
Read
(
message
,
length
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
// обнуляем оффсет чтения
sprintf_s
(
buf
,
"{B9C91F}%s"
,
message
)
;
params
->
bitStream
->
ResetWritePointer
(
)
;
params
->
bitStream
->
Write
(
packet
)
;
// читаем ID пакета
params
->
bitStream
->
Write
(
id
)
;
params
->
bitStream
->
Write
(
length
)
;
params
->
bitStream
->
Write
(
buf
,
length
)
;
params
->
bitStream
->
ResetWritePointer
(
)
;
}
;
return
true
;
// успешно завершаем отправку пакета
}
;




Крашит, хочу поменять текст сообщения игроков, никак не получается((

Dark_Knight
12.06.2016, 13:27
Для РПЦ не нужно читать и записывать ид.

Frixen
12.06.2016, 13:29
Для РПЦ не нужно читать и записывать ид.


даже без ID крашит и не меняет текст

Dark_Knight
12.06.2016, 13:37
Я же тебе говорил, что длинна идет в дворде, а ты байт юзаешь.

Frixen
12.06.2016, 13:44
Я же тебе говорил, что длинна идет в дворде, а ты байт юзаешь.


исправил, но краш при сообщении остался

AWRage
12.06.2016, 14:00
исправил, но краш при сообщении остался


Мб не надо читать ид пакета?

Dark_Knight
12.06.2016, 15:01
исправил, но краш при сообщении остался


Код

Woofing Giraffe
12.06.2016, 15:08
При сборке проекта выбивает

'uint32_t': symbol cannot be used in a using-declaration

AWRage
12.06.2016, 15:20
При сборке проекта выбивает
'uint32_t': symbol cannot be used in a using-declaration


Код.

Dark_Knight
12.06.2016, 15:23
Пробуй на дворд заменить

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

CarLCas
12.06.2016, 16:20
Можно ли где-то посмотреть информацию об каждом пакете (перехват/отправка)? Ну, т.е. что нужно считывать и т.п.


RakLogger

Woofing Giraffe
12.06.2016, 17:48
Код.


Такая херня при любом коде. Даже при таком: http://pastebin.com/nhNyp950 (https://www.blast.hk/redirect/aHR0cDovL3Bhc3RlYmluLmNvbS9uaE55cDk1MA)

Frixen
12.06.2016, 18:24
Код



C++:






bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
// определение callback-функции которая будет вызвана при отправке какого либо пакета
{
if
(
params
->
packetId
==
RPCEnumeration
::
RPC_Chat
)
// если отправляемый пакет ID_PLAYER_SYNC
{
WORD id
;
DWORD length
;
char
message
[
248
]
;
byte packet
;
char
buf
[
248
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
// на всякий случай устанавливаем оффсет чтения на начало
params
->
bitStream
->
Read
(
length
)
;
params
->
bitStream
->
Read
(
message
,
length
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
// обнуляем оффсет чтения
sprintf_s
(
buf
,
"{B9C91F}%s"
,
message
)
;
params
->
bitStream
->
ResetWritePointer
(
)
;
params
->
bitStream
->
Write
(
length
)
;
params
->
bitStream
->
Write
(
buf
,
length
)
;
params
->
bitStream
->
ResetWritePointer
(
)
;
}
;
return
true
;
// успешно завершаем отправку пакета
}
;

Woofing Giraffe
12.06.2016, 18:40
C++:






bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
// определение callback-функции которая будет вызвана при отправке какого либо пакета
{
if
(
params
->
packetId
==
RPCEnumeration
::
RPC_Chat
)
// если отправляемый пакет ID_PLAYER_SYNC
{
WORD id
;
DWORD length
;
char
message
[
248
]
;
byte packet
;
char
buf
[
248
]
;
params
->
bitStream
->
ResetReadPointer
(
)
;
// на всякий случай устанавливаем оффсет чтения на начало
params
->
bitStream
->
Read
(
length
)
;
params
->
bitStream
->
Read
(
message
,
length
)
;
params
->
bitStream
->
ResetReadPointer
(
)
;
// обнуляем оффсет чтения
sprintf_s
(
buf
,
"{B9C91F}%s"
,
message
)
;
params
->
bitStream
->
ResetWritePointer
(
)
;
params
->
bitStream
->
Write
(
length
)
;
params
->
bitStream
->
Write
(
buf
,
length
)
;
params
->
bitStream
->
ResetWritePointer
(
)
;
}
;
return
true
;
// успешно завершаем отправку пакета
}
;





Тебе же вроде надо RPC_ScrClientMessage хукать? В нём на 1 месте цвет, и дальше как у тебя

Frixen
12.06.2016, 18:44
Тебе же вроде надо RPC_ScrClientMessage хукать? В нём на 1 месте цвет, и дальше как у тебя


в этом rpc нету сообщений игроков, только серверные типо бан админа и тд

itsLegend
12.06.2016, 19:10
Так, во-первых - ты структуру не знаешь и пытаешься наугад что-то склепать. Смотри по логам RakLogger'а.

Во-вторых - ты добавил HEX-цвет в строку(8 символов), а записываешь длину исходной строки, а не новой.

В-третьих - params->bitStream->ResetWritePointer(); очистит весь битстрим и переместит указатель на его начало.

AWRage
12.06.2016, 19:53
Допустим есть стуктура TrailerData и последние два элемента _unknown. Их можно стереть? Будет работать?

itsLegend
12.06.2016, 20:02
Допустим есть стуктура TrailerData и последние два элемента _unknown. Их можно стереть? Будет работать?


Они просто не описаны.

FYP
12.06.2016, 21:15
Такая херня при любом коде. Даже при таком: http://pastebin.com/nhNyp950 (https://www.blast.hk/redirect/aHR0cDovL3Bhc3RlYmluLmNvbS9uaE55cDk1MA)


а версия студии какая?

Frixen
12.06.2016, 21:21
FYP, можешь мне помочь с кодом выше?

san0
13.06.2016, 01:51
FYP, можешь мне помочь с кодом выше?


ты заебал




Код:






bool CALLBACK incomingRPC(stRakNetHookParams *params)
{
if (params->packetId == RPCEnumeration::RPC_Chat)
{
uint16_t id;
uint8_t len;
char msg[128];

params->bitStream->ResetReadPointer();
params->bitStream->Read(id);
params->bitStream->Read(len);
params->bitStream->Read(msg, len);
params->bitStream->ResetReadPointer();
msg[len] = '\0';

SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(255, 255, 255), "{B9C91F}%s: {FFFFFF}%s",
SF->getSAMP()->getPlayers()->GetPlayerName(id), msg);

return false;
}
return true;
};

AWRage
13.06.2016, 15:00
Подскажите как установить хук на game destructor? На какой адрес ставить? И в какую игровую функцию можно влепить свою функцию loop?

SR_team
13.06.2016, 15:32
Подскажите как установить хук на game destructor? На какой адрес ставить? И в какую игровую функцию можно влепить свою функцию loop?


SF->getGame()->registerGameDestructorCallback(Destructor);

где Destructor это функция void CALLBACK без параметров

AWRage
13.06.2016, 16:26
SF->getGame()->registerGameDestructorCallback(Destructor);
где Destructor это функция void CALLBACK без параметров


Я не юзаю SF апи. Случайно не туда написал.

Woofing Giraffe
14.06.2016, 01:41
а версия студии какая?


2015 community

Vadim.dll
14.06.2016, 09:49
Вопрос, можно ли в чистом проекте C++ изменить адрес памяти gta sa? То есть чтобы не SF плагин изменял а консольное приложение

Gabriel__
14.06.2016, 10:14
WriteProcessMemory

ЯedЯuM
15.06.2016, 02:07
Дайте пожалуйста кто нибудь реализацию этого метода, или формулу для вычисления координат части тела.

C++:






virtual
CVector
*
GetBonePosition
(
eBone bone
,
CVector
*
vecPosition
)
=
0
;

AWRage
15.06.2016, 02:10
Дайте пожалуйста кто нибудь реализацию этого метода, или формулу для вычисления координат части тела.

C++:






virtual
CVector
*
GetBonePosition
(
eBone bone
,
CVector
*
vecPosition
)
=
0
;





Мне Гонщик когда-то давал пример, полистай эту тему. Там есть рабочий метод.

Еще раз спасибо Гонщику)

C++:






// тут я просто показал как получить структуру,
// но однако перед тем как всё это вызывать,
// нужно проверить, что игрок существует и всё такое,
// я не стал этого делать, сам сделаешь, иначе крашнет
actor_info
*
actorInfo
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
iPlayerID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
;
if
(
actorInfo
!=
nullptr
)
{
CPed
*
ped
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
actorInfo
)
;
.
.
}

ЯedЯuM
15.06.2016, 02:17
Мне Гонщик когда-то давал пример, полистай эту тему. Там есть рабочий метод.

Еще раз спасибо Гонщику)

C++:






// тут я просто показал как получить структуру,
// но однако перед тем как всё это вызывать,
// нужно проверить, что игрок существует и всё такое,
// я не стал этого делать, сам сделаешь, иначе крашнет
actor_info
*
actorInfo
=
SF
->
getSAMP
(
)
->
getPlayers
(
)
->
pRemotePlayer
[
iPlayerID
]
->
pPlayerData
->
pSAMP_Actor
->
pGTA_Ped
;
if
(
actorInfo
!=
nullptr
)
{
CPed
*
ped
=
GAME
->
GetPools
(
)
->
GetPed
(
(
DWORD
*
)
actorInfo
)
;
.
.
}





Я в собейте нашел реализацию но там с асм вставками хрени, а гонщик давал тебе прям формулой которая высчитывает?

Dark_Knight
15.06.2016, 02:27
Я в собейте нашел реализацию но там с асм вставками хрени, а гонщик давал тебе прям формулой которая высчитывает?


С плагин СДК

https://github.com/DK22Pac/plugin-s...89788a8f7d74b/plugin_sa/game_sa/CPed.cpp#L494 (https://github.com/DK22Pac/plugin-sdk/blob/c4593a97f2ac090fa3f4ca6c7e689788a8f7d74b/plugin_sa/game_sa/CPed.cpp#L494)

Для СФ







Код:






CVector GetBonePosition(int PlayerID, byte BoneID){
CVector Position;
typedef void(__thiscall *CPed__getBonePositionWithOffset) (void *_this, CVector *offset, int bodeId, bool includeAnim);
if (PlayerID != SF->getSAMP()->getPlayers()->sLocalPlayerID)
(CPed__getBonePositionWithOffset(0x5E01C0))(SF->getSAMP()->getPlayers()->pRemotePlayer[PlayerID]->pPlayerData->pSAMP_Actor->pGTA_Ped, &Position, BoneID, true);
else
(CPed__getBonePositionWithOffset(0x5E01C0))(SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped, &Position, BoneID, true);
return Position;
};




Из соба

Код:






CVector * CPedSA::GetBonePosition ( eBone bone, CVector * vecPosition )
{
DWORD dwFunc = FUNC_GetBonePosition;
DWORD dwThis = (DWORD)this->GetInterface();
_asm
{
push 1
push bone
push vecPosition
mov ecx, dwThis
call dwFunc
}
return vecPosition;
}

AWRage
15.06.2016, 12:25
Я в собейте нашел реализацию но там с асм вставками хрени, а гонщик давал тебе прям формулой которая высчитывает?


Всмысле? Готовый же код, получаешь CPed, а там уже есть метод getTransformedBonePosition, юзай на здоровье.

ЯedЯuM
16.06.2016, 16:01
Всмысле? Готовый же код, получаешь CPed, а там уже есть метод getTransformedBonePosition, юзай на здоровье.


Я просил реализацию потому что хотел сделать такое для серверного плагина, но увы это не подходит, там ведь нельзя работать с памятью игры(

tropical5466
16.06.2016, 23:39
ID_BULLET_SYNC является как incoming packet, так и outcoming?

AWRage
16.06.2016, 23:42
ID_BULLET_SYNC является как incoming packet, так и outcoming?


Если судить по логике, то если она прилетает, значит кто-то её отправил.

tropical5466
17.06.2016, 00:02
Если судить по логике, то если она прилетает, значит кто-то её отправил.


Да, я тоже придерживался такой логики, но координаты откуда летит пуля и в кого получить не получается

Вместо ида возвращает 0/1/другие числа

Вместо координат - 45860191271443926000000000000000000000.000000 -478512068879788470000000000000.000000 0.000000 (брал .fOrigin)

itsLegend
17.06.2016, 00:47
В начале ид того, кто отправил пакет, прочитал?

Tray228
17.06.2016, 16:41
как послать пулю по пингу

AWRage
17.06.2016, 19:56
Я так понял функция Receive в RakClientInterface отвечает за прием как пакетов, так и RPC?

Frixen
17.06.2016, 20:36
Реально ли сделать такую ***ню?: когда на адвансе одеваешь маску /mask ники над головой становятся черными, можно ли сделать чтобы когда игрок одел маску то цвет ника оставался прежним?

AWRage
17.06.2016, 20:56
Реально ли сделать такую ***ню?: когда на адвансе одеваешь маску /mask ники над головой становятся черными, можно ли сделать чтобы когда игрок одел маску то цвет ника оставался прежним?


Нет.

Dark_Knight
17.06.2016, 21:35
Нет.


Можно в теории, но не будет сто процентной точности цвета.

SR_team
17.06.2016, 21:59
Можно в теории, но не будет сто процентной точности цвета.


можно и точно, если знать цвет маски

Vadim.dll
17.06.2016, 22:13
Как проверить заспаунен ли игрок?

AWRage
17.06.2016, 23:35
можно и точно, если знать цвет маски


Но ведь когда он одевает маску, для сервера он черный и для остальных игроков тоже черный + им приходит RPC_SetPlayerColor, по идеи.

AWRage
17.06.2016, 23:42
Я так понял функция Receive в RakClientInterface отвечает за прием как пакетов, так и RPC? Потому что я не нашёл там Receive RPC.


UP.

Skadi
18.06.2016, 07:34
как узнать что я в определённом радиусе от пикапа?

ЯedЯuM
18.06.2016, 10:24
Помогите правильно прочесть пешую синхру, я с раксампа попробовал состряпать что-то схожее в плагине но результаты обнадеживают(

C++:






bool
__stdcall
PacketHook
(
stRakNetHookParams
*
hook
)
{
if
(
hook
->
packetId
==
ID_PLAYER_SYNC
)
{
stOnFootData foot
;
ZeroMemory
(
&
foot
,
sizeof
(
foot
)
)
;
BitStream
bsPlayerSync
(
hook
->
bitStream
->
GetData
(
)
,
hook
->
bitStream
->
GetNumberOfBitsUsed
(
)
/
8
,
false
)
;
uint16_t
SenderID
;
bool
bHasLR
,
bHasUD
;
bool
bHasSurfInfo
,
bAnimation
;
bsPlayerSync
.
IgnoreBits
(
8
)
;
bsPlayerSync
.
Read
(
SenderID
)
;
if
(
SenderID
==
targetID
)
{
bsPlayerSync
.
Read
(
bHasLR
)
;
if
(
bHasLR
)
bsPlayerSync
.
Read
(
foot
.
sLeftRightKeys
)
;
bsPlayerSync
.
Read
(
bHasUD
)
;
if
(
bHasUD
)
bsPlayerSync
.
Read
(
foot
.
sUpDownKeys
)
;
bsPlayerSync
.
Read
(
foot
.
sKeys
)
;
bsPlayerSync
.
Read
(
(
char
*
)
foot
.
fPosition
,
sizeof
(
float
)
*
3
)
;
bsPlayerSync
.
Read
(
(
char
*
)
foot
.
fQuaternion
,
sizeof
(
float
)
*
4
)
;
BYTE byteHealthArmour
;
BYTE byteHealth
,
byteArmour
;
BYTE byteArmTemp
=
0
,
byteHlTemp
=
0
;
bsPlayerSync
.
Read
(
byteHealthArmour
)
;
byteArmTemp
=
(
byteHealthArmour
&
0x0F
)
;
byteHlTemp
=
(
byteHealthArmour
>>
4
)
;
if
(
byteArmTemp
==
0xF
)
byteArmour
=
100
;
else
if
(
byteArmTemp
==
0
)
byteArmour
=
0
;
else
byteArmour
=
byteArmTemp
*
7
;
if
(
byteHlTemp
==
0xF
)
byteHealth
=
100
;
else
if
(
byteHlTemp
==
0
)
byteHealth
=
0
;
else
byteHealth
=
byteHlTemp
*
7
;
foot
.
byteHealth
=
byteHealth
;
foot
.
byteArmor
=
byteArmour
;
bsPlayerSync
.
Read
(
foot
.
byteCurrentWeapon
)
;
bsPlayerSync
.
Read
(
foot
.
byteSpecialAction
)
;
bsPlayerSync
.
Read
(
(
char
*
)
foot
.
fMoveSpeed
,
sizeof
(
float
)
*
3
)
;
bsPlayerSync
.
Read
(
bHasSurfInfo
)
;
if
(
bHasSurfInfo
)
{
bsPlayerSync
.
Read
(
foot
.
sSurfingVehicleID
)
;
bsPlayerSync
.
Read
(
(
char
*
)
foot
.
fSurfingOffsets
,
sizeof
(
float
)
*
3
)
;
}
else
foot
.
sSurfingVehicleID
=
-
1
;
bsPlayerSync
.
Read
(
bAnimation
)
;
if
(
bAnimation
)
{
bsPlayerSync
.
Read
(
foot
.
sCurrentAnimationID
)
;
bsPlayerSync
.
Read
(
foot
.
sAnimFlags
)
;
}
else
{
foot
.
sCurrentAnimationID
=
0
;
foot
.
sAnimFlags
=
0
;
}
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
D3DCOLOR_XRGB
(
245
,
184
,
0
)
,
"ID: %d | Health: %.1f | Armour: %.1f | Weapon: %d"
,
SenderID
,
foot
.
byteHealth
,
foot
.
byteArmor
,
foot
.
byteCurrentWeapon
)
;
}
}
return
true
;
}




На выходе: ID: 34 | Health: 0.0 | Armour: 0.0 | Weapon: 28437720

SR_team
18.06.2016, 11:10
Но ведь когда он одевает маску, для сервера он черный и для остальных игроков тоже черный + им приходит RPC_SetPlayerColor, по идеи.


но ведь ты тоже получаешь инфу о том какой у него цвет, а т.к. он не всегда в маске, то можно тупо не принимать инфу о черном цаете для ника

Dark_Knight
18.06.2016, 12:46
можно и точно, если знать цвет маски


Ты в маске и к тебе в стрим зашел новый игрок, которого не было до момент её надевания. Как я узнаю его цвет, если сервер прислал, что у него черный цвет.

tropical5466
18.06.2016, 13:18
Как узнать какие данные присылает RPC?

Ибо в раклоггере только это

Код:






[12:14:53.840] > [RPC Recv] RPC_ScrSetPlayerTeam[69](length: 3 bytes, 24 bits)
> dump:
0000 1E 00 01 ...

Vadim.dll
18.06.2016, 13:30
Как узнать сколько денег у локального игрока?

ЯedЯuM
18.06.2016, 13:39
Как узнать сколько денег у локального игрока?



C++:






*
(
DWORD
*
)
0xB7CE50

Vadim.dll
18.06.2016, 13:54
А как проверить заспаунен ли я?

Dark_Knight
18.06.2016, 14:05
bool playerIsSpawned(void)

{

bool result = false;

if (SF->getSAMP()->getPlayers()->IsPlayerDefined(SF->getSAMP()->getPlayers()->sLocalPlayerID, true))

result = SF->getSAMP()->getPlayers()->pLocalPlayer->iIsActorAlive && !SF->getSAMP()->getPlayers()->pLocalPlayer->iIsInSpawnScreen;

return result;

};

SR_team
18.06.2016, 14:20
Ты в маске и к тебе в стрим зашел новый игрок, которого не было до момент её надевания. Как я узнаю его цвет, если сервер прислал, что у него черный цвет.


сервер информирует даже за стримом. глянь в таб, там же цветные ники

AWRage
18.06.2016, 14:40
но ведь ты тоже получаешь инфу о том какой у него цвет, а т.к. он не всегда в маске, то можно тупо не принимать инфу о черном цаете для ника


Я думал, он хочет чтобы для других игроков его цвет ника не изменялся.

SR_team
18.06.2016, 15:47
Я думал, он хочет чтобы для других игроков его цвет ника не изменялся.


Это было бы слишком просто - не надевать маску

ЯedЯuM
18.06.2016, 16:31
Не правильно читает рпц чат бубл( Хелп

C++:






// DWORD playerID, DWORD color, float drawDistance, DWORD expireTime, byte strLen, char[] text
DWORD playerID
,
color
,
expireTime
;
float
drawDistance
;
byte strLen
;
char
text
[
256
]
;
hook
->
bitStream
->
ResetReadPointer
(
)
;
hook
->
bitStream
->
Read
(
playerID
)
;
hook
->
bitStream
->
Read
(
color
)
;
hook
->
bitStream
->
Read
(
drawDistance
)
;
hook
->
bitStream
->
Read
(
expireTime
)
;
hook
->
bitStream
->
Read
(
strLen
)
;
hook
->
bitStream
->
Read
(
text
)
;
hook
->
bitStream
->
ResetReadPointer
(
)
;




RPC_ScrChatBubble: playerID -65142 | color 65535 | expireTime -854392832 | drawDistance 0.00 | strLen 224 | text

Dark_Knight
18.06.2016, 18:47
Во всех РПЦ ид читать не нужно. да и считываешь не правильно.

https://sampwiki.blast.hk/wiki/SetPlayerChatBubble

ЯedЯuM
18.06.2016, 19:43
Во всех РПЦ ид читать не нужно. да и считываешь не правильно.
https://sampwiki.blast.hk/wiki/SetPlayerChatBubble


https://docs.google.com/spreadsheets/d/1iIxEk7yR8r7ZLGiSAL4ndtz_N1k0p3Wt7TE5bei6ztU/edit#gid=1 (https://www.blast.hk/redirect/aHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2 QvMWlJeEVrN3lSOHI3WkxHaVNBTDRuZHR6X04xazBwM1d0N1RF NWJlaTZ6dFUvZWRpdCNnaWQ9MQ)

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

itsLegend
18.06.2016, 19:49
WORD playerid;