Ответ

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

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

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

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


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

Автор: kenking
« : Сегодня в 08:00:56 am »

Цитировать
//ped->bfFlagsD &= 0x7F;//это метода нет
Это установка флага. В базе и в sdk записи в данный момент не совпадают и не все флаги "обозначены" правильно.
Надо так:
Код: C++
  1. ped->m_nPedFlags.b32 = 0;
Автор: egor230
« : Сегодня в 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.  
Автор: egor230
« : Февраль 08, 2019, 10:01:29 am »

Спасибо большое за добрые слова поддержки и понимания, Shagge_E, я недоволен своим прогрессом, этот прогресс нужно было достичь за неделю, я всегда хотел сделать настоящий прорыв в области изучения нового, но на деле происходит долго, тяжело, часто не понятно. Но буду стараться, потому что другого выхода у нас просто нет. Много общался с Виталием, его интересуют совершенно другие вещи, мне нравится очень общаться с Вами, всегда получишь четкий, ясный, правильный ответ, который нужен в данный момент. Я Вам очень признателен за ту помощь в 17 году. Виталий из-за скорости выполнения предпочитает команды ассемблера, я считаю, что это шаг назад, весь мир повышает уровень программирования, делая его простым и лёгким, ну что более легко изучить? Что более понятно обычным людям? Во что, как говорит наша молодежь, в что можно быстрее въехать: в сложный, непонятный ассемблер, или лёгкий и простой питон?
 
Поэтому, я внедряю в sdk lua, ведь функции готовы, только писать большое объём кода на с++ очень тяжело. Большая вероятность ошибки. Да, признаюсь, тяжело постигать sdk, нет документации, но когда это меня останавливало? Только лишь тормозило меня. Но идти медленно это не значит стоять на месте, как многие думают. Очень хочется услышать реальный совет, который поможет в реализации моей идеи.
Автор: Shagg_E
« : Февраль 07, 2019, 08:19:58 pm »

egor230> Твои успехи вдохновляют: за полтора года научился стольким вещам. Удачи в дальнейшем!
Насчет lua - спроси у Sektor, он же запилил Vice Lua, он по-любому сталкивался со всеми этими проблемами. А может, и вовсе имеет смысл не изобретать велосипед, а продолжить его разработку?..