Ответ

Внимание! Пока вы просматривали тему, появилось 23 новых ответа. Возможно, вы захотите изменить свое сообщение.
Имя:
E-mail:
Тема:
Иконка:

Вложение:
(Удалить вложение)
(Добавить ещё)
Ограничения: максимум вложений в сообщении — 4, максимальный размер всех файлов — 192 Кбайт, максимальный размер одного файла — 128 Кбайт
Визуальная проверка:
Наберите символы, которые изображены на картинке
Прослушать / Запросить другое изображение

Наберите символы, которые изображены на картинке:
О какой игре форум? (три буквы заглавные):
Сколько будет (5*5 + 2) ответ цифрой.:

подсказка: нажмите alt+s для отправки или alt+p для предварительного просмотра сообщения


Сообщения в этой теме

Автор: kenking
« : Март 21, 2019, 10:01:02 am »

Цитировать
как заставить педа бежать к координатам?
В который раз объясняю, что надо смотреть в базе, как устроен соответствующий опкод, без этого не разберёшься.
Код: C++
  1. CPed *ped;
  2. CVector *point;
  3. ped->m_nPedFlags.b32 = 0;
  4. CPed::SetObjective(ped, OBJECTIVE_RUN_TO_AREA, point);

Цитировать
в некоторые функциях есть параметр CVector, что передаем в таком случае?
Вектор и передаём.

Цитировать
за что отвечают эти функции?
Переведи названия функций, смотри в базе, где они вызываются, может используются в каких-либо скриптовых командах (опкодах).
Автор: egor230
« : Март 21, 2019, 03:59:08 am »

 Спасибо за ваш ответ kenking. Всё таки получилось создать педа. Но вопрос правильно ли?
Код: Text
  1. CPed * create(int modelID) {// создать pedа
  2.         char reference = 2;// чтобы удалился потом.
  3.         CPed *player = FindPlayerPed();
  4.         CVector position = player->m_placement.pos;
  5.         position += player->m_placement.up * 10.f; // Вектор оси прямо от игрока умножаем на 10 метров и прибавляем к позиции.
  6.         CStreaming::RequestModel(modelID, 0); // загрузим.
  7.         CStreaming::LoadAllRequestedModels(false);// модель загружена.
  8.         CPed *ped = new CCivilianPed(PEDTYPE_COP, modelID);
  9.                
  10.         ped->m_nState = 4;// флаг
  11.         ped->m_placement.SetRotate(0, 0, 3.5f);// смещение от координат игрока
  12.         ped->m_placement.pos.x = position.x;
  13.         ped->m_placement.pos.y = position.y;
  14.         ped->m_placement.pos.z = position.z;
  15.         CWorld::Add(ped);// добавить в мир педа.
  16.         return ped;    
  17. }
  18.  

за что отвечают эти функции?
Код: Text
  1.  //v->CollideWithPed(player);//??
  2. // v->HasAttractor();//??
  3. // v->Initialise();//?
  4.  

как заставить педа бежать к координатам? в некоторые функциях есть параметр CVector, что передаем в таком случае?
Автор: kenking
« : Март 20, 2019, 08:00:56 am »

Цитировать
//ped->bfFlagsD &= 0x7F;//это метода нет
Это установка флага. В базе и в sdk записи в данный момент не совпадают и не все флаги "обозначены" правильно.
Надо так:
Код: C++
  1. ped->m_nPedFlags.b32 = 0;
Автор: egor230
« : Март 20, 2019, 12:17:06 am »

Спасибо вам большое за вас ответ, kenking. сделал в цикле- находит людей, они начинают атаковать меня. Всё хорошо, но есть 2 но, враги  они становится медленнее находится чем на cleo, через пару минут  игра вылетает, Как решить данную проблему?

Код: Text
  1.  
  2. CPed* randomfindped(CPed *p, float radius) {CVehicle* v = NULL;
  3.  
  4.         if (p->m_bInVehicle && p->m_pVehicle != NULL) {// в авто игрок?
  5.                 CVehicle *v = p->m_pVehicle;    }// получить указатель на хенлд авто в котором сидит томии.
  6.         for (auto car : CPools::ms_pVehiclePool) {
  7.                 if (car != v && DistanceBetweenPoints(car->GetPosition(), p->GetPosition()) < radius && car->m_fHealth > 50) {
  8.                 car->CanPedExitCar(true);
  9.                 if (CPed*ped = car->m_pDriver) {if (ped != NULL && ped != p) {
  10.                         CMessages::AddMessageJumpQ("found ped", 1000, 0);//выводит сообщение на экран
  11.                                 return ped;     }}}}
  12.         for (auto ped : CPools::ms_pPedPool) {
  13.                 if (ped != p && DistanceBetweenPoints(ped->GetPosition(), p->GetPosition()) < radius && ped->m_fHealth > 50) {
  14.                         CMessages::AddMessageJumpQ("found ped", 1000, 0);//выводит сообщение на экран
  15.                         return ped;     }}
  16.        
  17.                  CMessages::AddMessageJumpQ("not found ped", 1000, 0);  
  18. };
  19. bool flag = false;
  20. class Message {//имя класса
  21. public:
  22.         Message() {
  23.                 Events::gameProcessEvent += [] {//обработчик событий игры
  24.                                 CPed *player = FindPlayerPed();// найти игрока
  25.                         KeyCheck::Update();
  26.                         if (KeyCheck::CheckWithDelay('M', 200)|| flag==true) {//если м нажата
  27.                                 flag=true;
  28.                                 if (!player) return;// проверка найден игрок
  29.                                 CPed *ped = randomfindped(player, 20.0);
  30.                                 //ped->bfFlagsD &= 0x7F;//это метода нет
  31.                                 ped->SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, CWorld::Players[CWorld::PlayerInFocus].m_pPed);
  32.                         }};
  33.         }
  34. } message;
  35.  

все работает без проблем.

Код: Text
  1. CPed* randomfindped(CPed *p, float radius) {CVehicle* v = NULL;
  2.  
  3.         if (p->m_bInVehicle && p->m_pVehicle != NULL) {// в авто игрок?
  4.                 CVehicle *v = p->m_pVehicle;    }// получить указатель на хенлд авто в котором сидит томии.
  5.         for (auto car : CPools::ms_pVehiclePool) {
  6.                 if (car != v && DistanceBetweenPoints(car->GetPosition(), p->GetPosition()) < radius && car->m_fHealth > 50) {
  7.                 car->CanPedExitCar(true);// пед может выйти из авто
  8.                 if (car->m_pDriver != NULL && car->m_pDriver != p) {
  9.                         CMessages::AddMessageJumpQ("found ped", 1000, 0);//выводит сообщение на экран
  10.                         return car->m_pDriver;
  11.                 }
  12.  
  13.         }
  14. }
  15.         for (auto ped : CPools::ms_pPedPool) {
  16.                 if (ped != p && DistanceBetweenPoints(ped->GetPosition(), p->GetPosition()) < radius && ped->m_fHealth > 50) {
  17.                         CMessages::AddMessageJumpQ("found ped", 1000, 0);//выводит сообщение на экран
  18.                         return ped;     }
  19.        
  20.         }
  21.                  CMessages::AddMessageJumpQ("not found ped", 1000, 0);  
  22.                         return NULL;
  23. };
  24. bool flag = false;
  25. class Message {//имя класса
  26. public:
  27.         Message() {
  28.                 Events::gameProcessEvent += [] {//обработчик событий игры
  29.                                 CPed *player = FindPlayerPed();// найти игрока
  30.                         KeyCheck::Update();
  31.                         if (KeyCheck::CheckWithDelay('M', 200)|| flag==true) {//если м нажата
  32.                                 flag=true;
  33.                                 if (!player) return;// проверка найден игрок
  34.                                 CPed *ped = randomfindped(player, 20.0);
  35.  
  36.                                 if (ped == NULL) return;// проверка найден игрок
  37.                                 ped->SetObjective(OBJECTIVE_KILL_CHAR_ON_FOOT, CWorld::Players[CWorld::PlayerInFocus].m_pPed);
  38.                         }
  39.                 };
  40.         }
  41. } message;
  42.  
Автор: kenking
« : Март 19, 2019, 07:46:41 am »

Цитировать
Есть  задача, чтобы ped нападал  на  игрока.
Думал, сделать так, через функции не получилось.
пришлось, чтобы пед  атаковал игрока, использовать скриптовую команду.
Надо смотреть, как устроен соответствующий опкод в базе (я уже ранее писал про это). Опкоды:
01C9: actor $2324 kill_actor $2291
01CA: actor $853 kill_player $PLAYER_CHAR

в базе выглядят так:
Код: C++
  1. case SET_CHAR_OBJ_KILL_CHAR_ON_FOOT:
  2.       CRunningScript::CollectParameters(this, &this->m_nIp, 2);
  3.       CPed *ped_01C9 = CPool<CPed,CPlayerPed>::GetAt(CPools::ms_pPedPool, ScriptParams[0].m_nIntValue);
  4.       CPed *ped_01C9a = CPool<CPed,CPlayerPed>::GetAt(CPools::ms_pPedPool, ScriptParams[1].m_nIntValue);
  5.       ped_01C9->bfFlagsD &= 0x7F;
  6.       CPed::SetObjective(ped_01C9, OBJECTIVE_KILL_CHAR_ON_FOOT, ped_01C9a);
  7.       result = 0;
  8. break;
  9. case SET_CHAR_OBJ_KILL_PLAYER_ON_FOOT:
  10.       CRunningScript::CollectParameters(this, &this->m_nIp, 2);
  11.       CPed *ped_01CA = CPool<CPed,CPlayerPed>::GetAt(CPools::ms_pPedPool, ScriptParams[0].m_nIntValue);
  12.       id_01CA = ScriptParams[1].m_nIntValue;
  13.       ped_01CA->bfFlagsD &= 0x7F;
  14.       CPed::SetObjective(ped_01CA, OBJECTIVE_KILL_CHAR_ON_FOOT, CWorld::Players[id_01CA].m_pPed);
  15.       result = 0;
  16. break;

Значит в первом случае надо сделать так:
Код: C++
  1. pedOne->bfFlagsD &= 0x7F;
  2. CPed::SetObjective(pedOne, OBJECTIVE_KILL_CHAR_ON_FOOT, pedTwo);

Во втором случае с игроком так:
Код: C++
  1. ped->bfFlagsD &= 0x7F;
  2. CPed::SetObjective(ped, OBJECTIVE_KILL_CHAR_ON_FOOT, CWorld::Players[CWorld::PlayerInFocus].m_pPed);

Автор: egor230
« : Март 18, 2019, 10:30:26 pm »

Спасибо вам большое за ваш ответ  xanser. Выходит,Класс CEntity  является родительским классом, других классов, они от него  наследуются.

 Получается в некотором роде Функция AttachPedToEntity является аналогом 0464: put_actor 4@ into_turret_on_car 3@ at_car_offset 0.4242 -0.0679 1.1322 position 0 angle 360.0 with_weapon 30


 Хочется чтобы  всё было  максимально просто и понятно. значит  метод Ped->Dress(), мы можем переопределить сами.

согласен с вами,  лучше работать в одном направлении.  Есть  задача, чтобы ped нападал  на  игрока.
 Думал, сделать так, через функции не получилось.
Код: Text
  1. ped->Attack();
  2. ped->m_dwAction;
  3. ped->m_fAttachRot =17;
  4.  

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

Код: Text
  1. CPed *ped = randomfindped(player, 20.0);
  2. Command<COMMAND_SET_CHAR_OBJ_KILL_CHAR_ON_FOOT>(ped, player );
  3.  

Да, заработало, но не так хотел, нападают, при любом количестве нажатии на клавишу активации, максимум только 2.
как сделать это через функции, метода класса CPed?
Автор: xanser
« : Март 18, 2019, 05:02:43 am »

Класс CEntity - это основа для всех сущностей игры: зданий, объектов, машин, людей, оружия и др, имеющих общие свойства, например идентификатор, матрицу поворота, флаги коллизии и прочее. От этого класса происходят остальные классы CVehicle, CPed и т.д. Функция AttachPedToEntity означает крепление педа к сущности, обычно к транспорту, как в некоторых миссиях, где пед стреляет с машины. Но можно крепить и к другим объектам, к карусели какой-нибудь, поэтому и используется общий класс CEntity.
Параметры функции:
entity - машина или другой объект, к которой происходит крепление педа
offset - точка крепления
position - от 0 до 3 - это сторона, в которую смотрит пед
angle - угол, на который может вращаться пед при стрельбе
weaponType - тип оружия

С остальными функциями надо разбираться, обычно из названия понятно, что они делают, дальше внутри смотри и ищи ссылки, откуда они вызываются. Например Ped->Dress() может переодеть педа. Если описать ее так, то можно менять скин игроку:

Код: C++
  1. void CPed::Dress(char * name) {
  2.         ((void(__thiscall *)(CPed *, char *))0x4EF030)(this, name);
  3.         ((void(__cdecl *)(bool _))0x40B5F0)(0);
  4.         ((void(__thiscall *)(CPed *))0x4EEFD0)(this);
  5. }
  6.  
  7. PlayerPed->Dress("player2");

А вообще не стоит все смешивать в одну кучу, вот зачем тебе все эти функции сразу, если непонятно их назначение. Выбери что-то конкретное и копай в этом направлении. Научиться писать плагины - это что-то слишком размытое. Ну напишешь ты 30 плагинов про все подряд, и что это будет? Лучше развивать конкретное направление, смотреть чего именно не хватает и собирать по кирпичику. Вообще эта тема зафлудилась.
Автор: egor230
« : Март 17, 2019, 01:17:21 pm »

Пытаюсь разобраться с функциями в sdk plugin,  с классом CPed, помогите, понять за что отвечают эти функции?
Код: C++
  1.                                 //ped->AttachPedToEntity();//?
  2.                                 //ped->DriveVehicle();//?
  3.                                 //ped->Duck();//?
  4.                                 //ped->BuyIceCream();// ?
  5.                                 //ped->Add();//?
  6.                                 //ped->BuildPedLists();//?
  7.                                 //ped->LookForInterestingNodes();//?
  8.                                 //ped->Dress();//пед дергается?
  9.                                 //ped->LoadFightData();//?
  10.                                 //ped->Idle();//??
  11.                                 //ped->Avoid();// избегает пед.
  12.                                 //ped->Flee();//?
  13.                                 //ped->Attack();//?
  14.                                 //ped->Fall();//пед падает
  15.                                 //ePedAction атака = 17;
  16.  

В некоторых функция есть параметр CEntity, что это за класс? Он использует в этой функции
 CEntity* AttachPedToEntity(CEntity* entity, CVector offset, unsigned short position, float angle, eWeaponType weaponType);

Очень хочу научиться писать плагины для gta vc.   
Автор: egor230
« : Март 12, 2019, 05:52:27 pm »

спасибо большое
Автор: kenking
« : Март 12, 2019, 05:48:29 pm »

15 - это компонент  CAR_DOOR_LF (водитель выходит через левую переднюю дверь)
16 - CAR_DOOR_LR
11 - CAR_DOOR_RF
12 - CAR_DOOR_RR

Смотри eCarNodes
Автор: egor230
« : Март 12, 2019, 04:04:50 pm »

спасибо Вам огромное kenking за ответ. у меня пед выходит из машины с помощью    p->SetObjective(OBJECTIVE_LEAVE_CAR). чем отличается SetExitCar(car, 15)? 15 отвечает за выход педа, а какие числа еще есть, за что они отвечают? Скажите, пожалуйста, очень интересно.
Автор: kenking
« : Март 12, 2019, 07:26:25 am »

Код: C++
  1. #include "plugin.h"
  2. #include "CPed.h"
  3.  
  4. using namespace plugin;
  5.  
  6. class Test {
  7. public:
  8.     Test() {
  9.         Events::gameProcessEvent += [] {
  10.             CPed *player = FindPlayerPed();
  11.             if (player) {
  12.                 for (auto car : CPools::ms_pVehiclePool) {
  13.                     if (DistanceBetweenPoints(car->GetPosition(), player->GetPosition()) < 20.0f && car->m_nVehicleClass == VEHICLE_AUTOMOBILE && car->m_fHealth > 50.0f) {
  14.                         if (car->m_pDriver && car->m_pDriver != player)
  15.                             car->m_pDriver->SetExitCar(car, 15);
  16.                     }
  17.                 }
  18.             }
  19.         };
  20.     }
  21. } test;
Автор: egor230
« : Март 10, 2019, 02:37:37 pm »

Помогите,  пожалуйста,  нужно найти  не только всех педов, которые которые находятся в радиусе,  но и тех кто сидит за рулём.
 Может так находим авто, как проверить есть ли  в нём водителей? И получить указатель  на его?

Код: Text
  1.  
  2. void randomfindcar(CPed *p, float radius) {
  3.         CVehicle*  v = isPedInVehicle(p);// авто игрока.
  4.                 for (auto car : CPools::ms_pVehiclePool) {
  5.                         if (car != v && DistanceBetweenPoints(car->GetPosition(), p->GetPosition()) < radius && car->m_fHealth > 50)
  6.                           car->???????
  7.         }
  8.                 for (auto ped : CPools::ms_pPedPool) {
  9.                         if (ped != p && DistanceBetweenPoints(ped->GetPosition(), p->GetPosition()) < radius && ped->m_fHealth > 50)
  10.                                 ped->m_fHealth = 0;
  11.  
  12.                 }
  13. };
  14.  

вроде так, но водитель не выходит.
Код: Text
  1. CVehicle* isPedInVehicle(CPed * player) {
  2.         if (player->m_bInVehicle && player->m_pVehicle != NULL) {// в авто игрок?
  3.                 CVehicle *v = player->m_pVehicle;
  4.                 return v;}// получить указатель на хенлд авто в котором сидит томии.
  5.         else {
  6.                 CVehicle *v = NULL;
  7.                 return v;}//если томми не в авто вернуть null;
  8. }
  9. void randomfindcar(CPed *p, float radius) {
  10.         CVehicle*  v = isPedInVehicle(p);// авто игрока.             
  11.         for (auto car : CPools::ms_pVehiclePool) {
  12.                         if (car != v && DistanceBetweenPoints(car->GetPosition(), p->GetPosition()) < radius && car->m_fHealth > 50) {
  13.                
  14.                                 if (CPed*p =car->m_pDriver) {
  15.                                        
  16.                                         if (p != NULL) {
  17.                                                 p->ExitCar();
  18.                                         CWorld::Players[CWorld::PlayerInFocus].m_nMoney += 1;// дать денег
  19.                                         }
  20.                         }
  21.                 }
  22.         }
  23.  
Автор: kenking
« : Март 09, 2019, 04:56:01 pm »

... в CCarCtrl::JoinCarWithRoadSystemGotoCoors ошибочный лишний третий параметр.
Оказывается там всё верно, сорри.
Автор: egor230
« : Февраль 17, 2019, 09:00:23 am »

Получилось  реализовать работу с клавишами. Столкнулся с интересным поведением функции.
Код: Text
  1. int printmessage(lua_State* L) {
  2.         try {
  3.                 if (LUA_TSTRING == lua_type(L, -1)) {//money.
  4.                 string msg = lua_tostring(L, -1);
  5.                 char str[255];
  6.                 strcpy(str, msg.c_str());
  7.  
  8.                         static char x[255];
  9.                         snprintf(x, 255,"%s", str);
  10.                         CMessages::AddMessageJumpQ(x, 5000, 3);
  11.                         return 0;
  12.                 }
  13.                 else { throw "bad argument in function printmessage"; }
  14.         }
  15.         catch (const char* x) {
  16.                 writelog(x);
  17.         }
  18.         return 0;
  19. };
  20.  
  21.  

Иногда она некорректно выводит сообщения,   А когда вообще ничего мы не видим  никакого текст на экране.
Как вы думаете с чем связанное такое поведение? Может я как-то не так делаю?

Оказалось нужно строку перевести в wchar_t.

Код: C++
  1. int printmessage(lua_State* L) {// аргументы текст и и время вывода на экран.
  2.         try {
  3.                 if (LUA_TSTRING == lua_type(L, -2) && LUA_TNUMBER == lua_type(L, -1)) {//строка.
  4.                         string aString = lua_tostring(L, -2);
  5.                         double t = lua_tonumber(L, -1);// если число.
  6.                         int time = (int)t;
  7.                         const int maxSize = 1024; // 1Мб символов
  8.                         wchar_t *str = L"_";
  9.                         wchar_t buff[maxSize];
  10.                         int nSize = ::MultiByteToWideChar(CP_UTF8, 0, aString.c_str(), static_cast<int>(aString.length() + 1), NULL, NULL);
  11.                         wchar_t *tBuff = buff;
  12.                         ::MultiByteToWideChar(CP_UTF8, 0, aString.c_str(), static_cast<int>(aString.length() + 1), buff, nSize);
  13.                         str = tBuff;
  14.                         CMessages::AddMessageJumpQ(str, time, 3);
  15.                         this_thread::sleep_for(chrono::milliseconds(time));
  16.                         return 0;
  17.                 }
  18.                 else { throw "bad argument in function printmessage"; }
  19.         }
  20.         catch (const char* x) {
  21.                 writelog(x);// записать ошибку в файл.
  22.         }
  23.         return 0;
  24.  
  25.