Просмотр полной версии : SAMPFUNCS | API C++
Страницы :
1
2
3
4
5
[
6]
7
8
Ну как чат отчистить (какая функция) ну помогите блять!
for-ом перебери все строки чата и очисти их memset(string, 0, sizeof(string));
Возможно сделать свой колормод? Какие библиотеки и функции для этого нужно использовать?
Dark_Knight
22.03.2016, 21:53
А нужно ли? Работу с директиксом учи.
А нужно ли? Работу с директиксом учи.
Колормод который сейчас в интернете сложно настроить так как прийдется перезаходить каждый раз.
Колормод который сейчас в интернете сложно настроить так как прийдется перезаходить каждый раз.
вводишь colormod как чит код и настраиваешь.
Woofing Giraffe
23.03.2016, 00:02
Как отключить RakNet хук ? Видел функцию ->UnregisterHook();
Как вариант просто поставить bool условие в начале хука и потом в дальнейшем сменить значение переменной
отправить очень много сообщений и самп освободит память чата останутся только пустые строки.
Можно просто удалить имеющиеся сообщения. у меня даже адрес где-то был с их расположением в памяти
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
Как установить машине режим двигателя ?
Можно ли создать две или больше структур с одинаковым названием, но в разных .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
Да, но названия должны быть разные.
В первом ты просто объявляешь указатель. Второе ты его объявляешь и записываешь в него обобьет.
Да, но названия должны быть разные.
В первом ты просто объявляешь указатель. Второе ты его объявляешь и записываешь в него обобьет.
Что такое обобьет?
Dark_Knight
23.03.2016, 19:29
Что такое обобьет?
Обьект.
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
Как выдать своему игроку определенный объект, например: чемодан.
Gabriel__
25.03.2016, 09:32
Создать объект и прикрепить его к костям руки.
Dark_Knight
25.03.2016, 12:41
Как выдать своему игроку определенный объект, например: чемодан.
Для всех никак.
Для всех никак.
ну мне визуально надо, ток хз как
Ошибка 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
что делать
Ошибка 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)
Инт - это инт, не СПед.
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
)
;
.
.
}
Что ты хочешь? По идеи, 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:
1. Как проверить, виден ли игрок моему игроку?
2. Как изменить кол-во элементов в массиве?
C++:
int
i
[
32
]
;
// функция, макрос, хз че еще
i
[
64
]
;
Gabriel__
27.03.2016, 17:51
А как нарисовать линии как в ESP ?
Dark_Knight
27.03.2016, 19:35
DrawLine в классе СRender.
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/
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. Как проверить что игрок или точка на экране ?
1. Как получить игроков в зоне стрима ?
2. Как проверить что игрок или точка на экране ?
C++:
int
CSAMP
::
GetPlayersInStream
(
)
{
int
InStream
=
0
;
for
(
int
i
=
0
;
i
getSAMP
(
)
->
getPlayers
(
)
->
IsPlayerDefined
(
i
,
true
)
)
InStream
++
;
}
return
InStream
;
}
Крашит игра, когда вызываю функцию. Если просто вызвать функцию без присвоения *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();
}
Это что за меню? И попробуй найти ошибку через трай кетч
Меню сам делал. Ошибку нашёл.
Dark_Knight
28.03.2016, 15:59
Меню сам делал. Ошибку нашёл.
Юзай МенюМенеджер от Тима. Хотя практика вещь таки заебись.
Юзай МенюМенеджер от Тима. Хотя практика вещь таки заебись.
Не, хочу свое меню, хотя и знаю что от Тима лучше. Но можно будет подсмотреть реализацию некоторых функций)
Dark_Knight
28.03.2016, 16:06
Не, хочу свое меню, хотя и знаю что от Тима лучше. Но можно будет подсмотреть реализацию некоторых функций)
Там нет сурса)
Gabriel__
28.03.2016, 18:22
Как определить расстояние от двух точек ? Без callopcode.
Dark_Knight
28.03.2016, 18:24
Как определить расстояние от двух точек ? Без callopcode.
Найти формулу в гугле.
Как определить расстояние от двух точек ? Без 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
Чего/кого?
Как создать переменную скорости и позиции?
CVector speed, pos;
Пасаны, такая задача:
Есть подменю, которое содержит название и еще одно подменю, которое в свою очередь содержит тоже название и подменю, которое.. И так далее. Понятное дело, что не во всех подменю есть другие подменю, некоторые являются конечными и в таком случае указатель равен 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
Нельзя юзать бесконечный файл в меин луп. Вызовет зависание.
Как подобную конструкцию сделать? Цикл 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
Вообще команда вызывается при вызове её и в ней ты просто можешь спокойно вывести текст в чат.
А можно ли как-то записать в массив указатели на разные структуры?
Dark_Knight
01.04.2016, 10:27
stFontInfo *mass[10];
stFontInfo *mass[10];
Не, я имею ввиду, чтобы записать в каждый элемент массива другую структуру.
mass[0] = new stFontInfo;
mass[1] = new stMenu;
mass[2] = new stSubmenu;
Не, я имею ввиду, чтобы записать в каждый элемент массива другую структуру.
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
Дебилизм же, если у тебя статическое количество елементов.
но зачем?
C++:
void
*
ptrs
[
10
]
=
{
nullptr
}
;
ptrs
[
0
]
=
new
.
.
;
Если нужно добавить элемент в меню, то в массив нужно добавить указатель на структуру этого элемента. Но их бывает несколько видов (подменю, переключатель, IncDec).
MISTER_GONWIK
01.04.2016, 18:15
Если нужно добавить элемент в меню, то в массив нужно добавить указатель на структуру этого элемента. Но их бывает несколько видов (подменю, переключатель, IncDec).
посмотри как работает меню собейта (dumb_menu.cpp)
Подскажите, пожалуйста, как создать и вызвать окно диалога? Через команду, к примеру.
Ладно, как создать понял. А как его при вводе команды показать то?
Woofing Giraffe
01.04.2016, 21:10
Подскажите, пожалуйста, как создать и вызвать окно диалога? Через команду, к примеру.
Ладно, как создать понял. А как его при вводе команды показать то?
Урок самый первый почитай
Народ, есть ли способ как-либо заблокировать возможность движения мышки при прицеливании, используя SF API?
Я пробовал с помощью SetMouseSensitivity выставить сенс на 0.0, но это дало лишь замедление мыши.
Также пробовал с помощью registerWndProcCallback возращать false, когда шло сообщение WM_MOUSEMOVE - не помогло.
Помогите, пожалуйста.
Урок самый первый почитай
Окей, через команду работает. А как сделать через клавишу/клавиши?
Код:
if (SF->getGame()->isKeyPressed('B'))
{
SF->getSAMP()->getDialog()->ShowDialog(1, DIALOG_STYLE_LIST, "Название", "1\n2\n3\n4", "Выбрать", "Закрыть");
}
Его не выводит.:sad_frog2:
посмотри как работает меню собейта (dumb_menu.cpp)
Хорошо.
Окей, через команду работает. А как сделать через клавишу/клавиши?
Код:
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);
}
И диалоги должны начинаться с ида 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), обнуляю её и вывожу новый диалог
логируй каждое действие.
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
Заюзай брик после выполнения нужно действия.
Почему крашит при использовании SF->getSAMP()->getDialog()->Close(2) ?
Dark_Knight
04.04.2016, 12:57
Потому что нет кнопки 2 в диалогах. Только 0 и 1
Потому что нет кнопки 2 в диалогах. Только 0 и 1
При SF->getSAMP()->getDialog()->Close(false/0) тоже крашит.
Бля, писать плагины для CS куда проще. :D
Разобрался.
Как правильно освободить выделенную память? Достаточно просто освободить переменную, которая содержит указатель на класс, в котором тоже выделяется память или нужно сначала освободить память в классе, а потом освободить переменную-класс. Код ниже будет правильным?
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;
В деструкторе класса высвобождать выделенную в классе память. Деструктор автоматически вызовется при выполнении delete Class;
А как на счет обычных переменных? Их не нужно освобождать в деструкторе? Они сами удалятся после удаления класса, как локальные переменные в функции, так?
NarutoUA
07.04.2016, 00:00
А как на счет обычных переменных? Их не нужно освобождать в деструкторе? Они сами удалятся после удаления класса, как локальные переменные в функции, так?
Сами, класс это как структура, только класс.
Сами, класс это как структура, только класс.
Спасибо :)
1̶.̶ ̶П̶о̶ч̶е̶м̶у̶ ̶е̶с̶л̶и̶ ̶ф̶у̶н̶к̶ц̶и̶ю̶ ̶D̶l̶l̶M̶a̶i̶n̶ ̶п̶е̶р̶е̶и̶м̶е̶н̶о̶в̶а̶т̶ ь̶,̶ ̶т̶о̶ ̶с̶к̶р̶и̶п̶т̶ ̶о̶т̶к̶а̶з̶ы̶в̶а̶е̶т̶с̶я̶ ̶р̶а̶б̶о̶т̶а̶т̶ь̶.̶ ̶Н̶е̶ ̶т̶о̶ ̶ч̶т̶о̶ ̶б̶ы̶ ̶э̶т̶о̶ ̶м̶н̶е̶ ̶м̶е̶ш̶а̶л̶о̶,̶ ̶н̶о̶ ̶п̶р̶о̶с̶т̶о̶ ̶и̶н̶т̶е̶р̶е̶с̶н̶о̶,̶ ̶п̶о̶ч̶е̶м̶у̶? Гугол наше все.
2. Как компилятор определяет "точку входа в плагин". То есть, как он понимает, что DllMain - это главная функция, которая инджектит плагин, но не, скажем, Loop.
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? Какие функции надо юзать?
И какие функции нужны для рендера картинки на загрузочный экран, и уже во время игры?
Можно ли будет использовать 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"
)
;
Можно ли сделать рендер картинки через 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
Что за адрес ? 0x609CF9
Размер прицела
Vasiliy77
13.04.2016, 00:22
Может знает кто, какой указатель идет к скорости анимации скина (не скорости)? В CE оффсетов нашлось >500 штук, а нужный искать месяц точно..(
Gabriel__
13.04.2016, 14:46
1.Автоматический поиск указателей используй.
2. Есть адрес 0xB6F5F0 в нем хранится указатель на игрока CPed и по смещению там есть скорость скина.
Dark_Knight
17.04.2016, 22:17
А че надо?
А че надо?
Хотел написать свой .asi плагин. Нужно написать d3dhook чтобы рендерить текст и примитивы. А я даже хз с чего начать и где искать. Искал в исходниках собейта, но там нихуя не понятно.
NarutoUA
18.04.2016, 18:13
Хотел написать свой .asi плагин. Нужно написать d3dhook чтобы рендерить текст и примитивы. А я даже хз с чего начать и где искать. Искал в исходниках собейта, но там нихуя не понятно.
В интеренте есть полно кода д3д хука
Как записать в реестр значение int? Если это возможно, конечно же.
Woofing Giraffe
21.04.2016, 21:55
Глупый вопрос, но всё же, почему не удаётся объявить шрифты в массиве?
Код:
stFontInfo *Fonts[4] = { pFont, pFontTitle, pFontFirst, pFontTwo };
Dark_Knight
21.04.2016, 22:02
Ты хочешь, чтобы в одном массиве было 4 елемента с разными названиями? Тебе мапа стринговая нужна или структура.
Вообщем, сделал 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)
Пусть ставят
http://forum.oszone.net/thread-145766.html (https://www.blast.hk/redirect/aHR0cDovL2ZvcnVtLm9zem9uZS5uZXQvdGhyZWFkLTE0NTc2Ni 5odG1s)
Пусть ставят
А почему для собейта такого ставить не нужно? Или то что я описал выше нормально?
Dark_Knight
22.04.2016, 14:19
Нормально.
Здравствуйте,не могли бы вы,описать за что отвечают данный переменные в 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
Ничего нет. Разберись сам. можешь опкоды СФ для работы с текстдравами заюзать.
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];// массив текстдравов игрока ^
};
пытаюсь прочитать позицию пикапа с помощью перехвата 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)
Мой хук работает так:
Я хукаю оргинальную функцию Present (или End Scene) моей функцией Present. Когда оригинальная функция Present вызовется игрой, сначала выполнится моя функция, а потом в конце моей функции я вызову стандартную функцию. Но в SFAPI там немного по другому. То есть, оригинальная функция не вызывается ибо в конце функций стоит не return originalPresent(pDevice, ...), а просто return TRUE. Как это работает в SFAPI? Это другой вид хука?
Dark_Knight
23.04.2016, 16:21
В СФ юзается хук как в собейте. Можешь там глянуть.
В СФ юзается хук как в собейте. Можешь там глянуть.
Но там тоже в конце выполняется оригинальная функция 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
И?
И?
А в SFAPI функция просто возвращает TRUE. То есть, оригинальная функция не вызывается. Почему так?
А в SFAPI функция просто возвращает TRUE. То есть, оригинальная функция не вызывается. Почему так?
плагинов может быть over9000, а хуков столько не надо. Сам хук находится в СФ и он вызывает стандартную функцию в конце, а в теле хука опрашивает функции в плагинах и рисует чот свое.
у кого-нибудь есть структура входящего пакета RPC_ScrShowDialog?
можно ли получить ники игроков которые поменяли со старого на новый
Dark_Knight
26.04.2016, 19:43
Всмысле?
можно ли получить ники игроков которые поменяли со старого на новый
Если ты хочешь просмотреть их namestore, то нет. На некоторых серверах это есть, но там походу для каждого игрока массив со сменами ников.
Woofing Giraffe
28.04.2016, 00:02
http://cs631322.vk.me/v631322142/2464f/K9PyCknLZbQ.jpg
В чём причина? Не могу поменять выходной каталог
Если ты хочешь просмотреть их 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
}
Захотел начать писать SF плагины, прочитал вики, при первой же компиляции появляется ошибка:
Код:
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка (активно) не удается открыть источник файл "d3dx9.h" SFPlugin d:\GTASA\SFPlugin\SFPlugin\SFPlugin\SFAPI\SAMPFUNC S_API.h 21
Захотел начать писать SF плагины, прочитал вики, при первой же компиляции появляется ошибка:
Код:
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка (активно) не удается открыть источник файл "d3dx9.h" SFPlugin d:\GTASA\SFPlugin\SFPlugin\SFPlugin\SFAPI\SAMPFUNC S_API.h 21
DXSDK установи
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
Потому что флоат. Иди учи типы данных.
Потому что флоат. Иди учи типы данных.
Выучил) Исправил)
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
;
}
}
надо чтобы он после скриншота включился
Ниже проверку сделай на то что скриншот сделан, либо задержку, только не 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 секунд
Добавить буллевую переменную
Как правильно юзать таймер, чтобы после нажатия клавиши допустим 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
;
}
}
Добрые люди, может у кого есть код аймбота обычного под SF??
Добрые люди, может у кого есть код аймбота обычного под 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
;
}
}
}
}
}
В собейте получение камеры выглядит следующим образом:
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Е юзай
Как проверить, что чат открыт?
DarkP1xel
31.05.2016, 21:11
Как проверить, что чат открыт?
C++:
if
(
SF
->
getSAMP
(
)
->
getInput
(
)
->
iInputEnabled
)
{
}
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
Как получить координаты 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учищь
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
Перед этим память выдели только.
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
;
}
Почему мои 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
Dark_Knight
07.06.2016, 22:35
В stOnFootData есть ид текущей анимации.
а как можно получить все пакеты и рпц, те которые я отправил, и которые мне пришли со стороны сервера?
а как можно получить все пакеты и рпц, те которые я отправил, и которые мне пришли со стороны сервера?
С начала игры логгировать все в память игры или в файл.
Dark_Knight
08.06.2016, 01:22
а как можно получить все пакеты и рпц, те которые я отправил, и которые мне пришли со стороны сервера?
Количество чтоли?:
Количество чтоли?:
Нет, название
Dark_Knight
08.06.2016, 09:35
Нет, название
RakLogger юзай
C++:
SF
->
getCLEO
(
)
->
callOpcode
(
"02AB: set_actor $PLAYER_ACTOR immunities BP 1 FP 1 EP 1 CP 1 MP 1"
)
;
так гм работать не будет?
C++:
SF
->
getCLEO
(
)
->
callOpcode
(
"02AB: set_actor $PLAYER_ACTOR immunities BP 1 FP 1 EP 1 CP 1 MP 1"
)
;
так гм работать не будет?
Это говно все. Зачем ты перешёл на плагины, если пишешь их на вызовах опкодов? В папке с проектом есть game_api.Вот его и юзай, там должно это быть.
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; //защита от столкновений (машина игрока)
#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;
почему крашит?
вот это - SF->getSAMP()->getPlayers()->pLocalPlayer->pSAMP_Actor->pGTA_Ped->vehicle->flags = CollisionProtect;
ты не в машине
ты не в машине
FreezePed это че?
FreezePed это че?
Фриз (заморозка), не? Вроде из наименования понятно
Можно ли изменить цвет сообщений от игроков в чате? с белого на черный допустим?
Можно ли изменить цвет сообщений от игроков в чате? с белого на черный допустим?
Ставишь хук на ClientMessage, читаешь параметры (DWORD color, DWORD strLen, char[] msg), записываешь измененные
Ставишь хук на ClientMessage, читаешь параметры (DWORD color, DWORD strLen, char[] msg), записываешь измененные
Оу, не разу не работал с Raknet, можно простенький пример?
Оу, не разу не работал с Raknet, можно простенький пример?
https://www.blast.hk/wiki/tutorials:api_lesson_raknet
Проблема в том, что RPC_ScrClientMessage получает\меняет цвет только определенных сообщений типо объявлений на arp и /me, /do, /try, но не сообщений от игрока. Как сделать наоборот?
Вот как все получается:
http://cs633521.vk.me/v633521510/32f10/vr3_cTErSGc.jpg
Проблема в том, что RPC_ScrClientMessage получает\меняет цвет только определенных сообщений типо объявлений на arp и /me, /do, /try, но не сообщений от игрока. Как сделать наоборот?
Вот как все получается:
http://cs633521.vk.me/v633521510/32f10/vr3_cTErSGc.jpg
Сканируй строку на "{" цвет "}" и меняй
Gabriel__
12.06.2016, 11:28
Какие параметры у RPC Client Check?
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
Для РПЦ не нужно читать и записывать ид.
Для РПЦ не нужно читать и записывать ид.
даже без ID крашит и не меняет текст
Dark_Knight
12.06.2016, 13:37
Я же тебе говорил, что длинна идет в дворде, а ты байт юзаешь.
Я же тебе говорил, что длинна идет в дворде, а ты байт юзаешь.
исправил, но краш при сообщении остался
исправил, но краш при сообщении остался
Мб не надо читать ид пакета?
Dark_Knight
12.06.2016, 15:01
исправил, но краш при сообщении остался
Код
Woofing Giraffe
12.06.2016, 15:08
При сборке проекта выбивает
'uint32_t': symbol cannot be used in a using-declaration
При сборке проекта выбивает
'uint32_t': symbol cannot be used in a using-declaration
Код.
Dark_Knight
12.06.2016, 15:23
Пробуй на дворд заменить
Можно ли где-то посмотреть информацию об каждом пакете (перехват/отправка)? Ну, т.е. что нужно считывать и т.п.
Можно ли где-то посмотреть информацию об каждом пакете (перехват/отправка)? Ну, т.е. что нужно считывать и т.п.
RakLogger
Woofing Giraffe
12.06.2016, 17:48
Код.
Такая херня при любом коде. Даже при таком: http://pastebin.com/nhNyp950 (https://www.blast.hk/redirect/aHR0cDovL3Bhc3RlYmluLmNvbS9uaE55cDk1MA)
Код
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 месте цвет, и дальше как у тебя
Тебе же вроде надо RPC_ScrClientMessage хукать? В нём на 1 месте цвет, и дальше как у тебя
в этом rpc нету сообщений игроков, только серверные типо бан админа и тд
itsLegend
12.06.2016, 19:10
Так, во-первых - ты структуру не знаешь и пытаешься наугад что-то склепать. Смотри по логам RakLogger'а.
Во-вторых - ты добавил HEX-цвет в строку(8 символов), а записываешь длину исходной строки, а не новой.
В-третьих - params->bitStream->ResetWritePointer(); очистит весь битстрим и переместит указатель на его начало.
Допустим есть стуктура TrailerData и последние два элемента _unknown. Их можно стереть? Будет работать?
itsLegend
12.06.2016, 20:02
Допустим есть стуктура TrailerData и последние два элемента _unknown. Их можно стереть? Будет работать?
Они просто не описаны.
Такая херня при любом коде. Даже при таком: http://pastebin.com/nhNyp950 (https://www.blast.hk/redirect/aHR0cDovL3Bhc3RlYmluLmNvbS9uaE55cDk1MA)
а версия студии какая?
FYP, можешь мне помочь с кодом выше?
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;
};
Подскажите как установить хук на game destructor? На какой адрес ставить? И в какую игровую функцию можно влепить свою функцию loop?
Подскажите как установить хук на game destructor? На какой адрес ставить? И в какую игровую функцию можно влепить свою функцию loop?
SF->getGame()->registerGameDestructorCallback(Destructor);
где Destructor это функция void CALLBACK без параметров
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
Дайте пожалуйста кто нибудь реализацию этого метода, или формулу для вычисления координат части тела.
C++:
virtual
CVector
*
GetBonePosition
(
eBone bone
,
CVector
*
vecPosition
)
=
0
;
Дайте пожалуйста кто нибудь реализацию этого метода, или формулу для вычисления координат части тела.
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
)
;
.
.
}
Мне Гонщик когда-то давал пример, полистай эту тему. Там есть рабочий метод.
Еще раз спасибо Гонщику)
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;
}
Я в собейте нашел реализацию но там с асм вставками хрени, а гонщик давал тебе прям формулой которая высчитывает?
Всмысле? Готовый же код, получаешь CPed, а там уже есть метод getTransformedBonePosition, юзай на здоровье.
Всмысле? Готовый же код, получаешь CPed, а там уже есть метод getTransformedBonePosition, юзай на здоровье.
Я просил реализацию потому что хотел сделать такое для серверного плагина, но увы это не подходит, там ведь нельзя работать с памятью игры(
tropical5466
16.06.2016, 23:39
ID_BULLET_SYNC является как incoming packet, так и outcoming?
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
В начале ид того, кто отправил пакет, прочитал?
как послать пулю по пингу
Я так понял функция Receive в RakClientInterface отвечает за прием как пакетов, так и RPC?
Реально ли сделать такую ***ню?: когда на адвансе одеваешь маску /mask ники над головой становятся черными, можно ли сделать чтобы когда игрок одел маску то цвет ника оставался прежним?
Реально ли сделать такую ***ню?: когда на адвансе одеваешь маску /mask ники над головой становятся черными, можно ли сделать чтобы когда игрок одел маску то цвет ника оставался прежним?
Нет.
Dark_Knight
17.06.2016, 21:35
Нет.
Можно в теории, но не будет сто процентной точности цвета.
Можно в теории, но не будет сто процентной точности цвета.
можно и точно, если знать цвет маски
Vadim.dll
17.06.2016, 22:13
Как проверить заспаунен ли игрок?
можно и точно, если знать цвет маски
Но ведь когда он одевает маску, для сервера он черный и для остальных игроков тоже черный + им приходит RPC_SetPlayerColor, по идеи.
Я так понял функция Receive в RakClientInterface отвечает за прием как пакетов, так и RPC? Потому что я не нашёл там Receive RPC.
UP.
как узнать что я в определённом радиусе от пикапа?
Помогите правильно прочесть пешую синхру, я с раксампа попробовал состряпать что-то схожее в плагине но результаты обнадеживают(
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
Но ведь когда он одевает маску, для сервера он черный и для остальных игроков тоже черный + им приходит 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
Как узнать сколько денег у локального игрока?
Как узнать сколько денег у локального игрока?
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;
};
Ты в маске и к тебе в стрим зашел новый игрок, которого не было до момент её надевания. Как я узнаю его цвет, если сервер прислал, что у него черный цвет.
сервер информирует даже за стримом. глянь в таб, там же цветные ники
но ведь ты тоже получаешь инфу о том какой у него цвет, а т.к. он не всегда в маске, то можно тупо не принимать инфу о черном цаете для ника
Я думал, он хочет чтобы для других игроков его цвет ника не изменялся.
Я думал, он хочет чтобы для других игроков его цвет ника не изменялся.
Это было бы слишком просто - не надевать маску
Не правильно читает рпц чат бубл( Хелп
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
Во всех РПЦ ид читать не нужно. да и считываешь не правильно.
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;
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot