Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - DK

Страницы: [1] 2 3 ... 16
1
Идеи / Re: Перевозка транспорта
« : Январь 25, 2019, 06:03:26 pm »

1. В новой версией sdk добавлен автоматический конверт из RwV3d в CVector. Вот это:
static CVector GetFramePosn(RwFrame *frame) {
    CVector posnFrame;
    RwV3d posn = RwFrameGetLTM(frame)->pos;
    posnFrame.x = posn.x;
    posnFrame.y = posn.y;
    posnFrame.z = posn.z;
    return posnFrame;
}
Теперь можно записать так:
Код: C++
  1. // автоматическая конверсия RwV3d > CVector
  2. static CVector GetFramePosn(RwFrame *frame) {
  3.     return RwFrameGetLTM(frame)->pos;
  4. }
2. CFont::PrintString для GTA3/GTAVC поддерживает однобайтные строки (char *)
3. Для форматирования удобнее использовать функцию plugin::Format
4. Для быстрого вывода на экран можно использовать класс gamefont (обёртка над CFont)
5. Класс gamefont может выводить список из строк на экран
Код: C++
  1. // вывод списка строк на экран
  2. gamefont::Print({
  3.     Format("enableSpeed %d", vehComps.Get(player->m_pVehicle).enableSpeed),
  4.     Format("MaxGearVelocity %.2f", player->m_pVehicle->m_pHandlingData->m_transmissionData.m_fMaxGearVelocity),
  5.     Format("ID trailer %d", vehComps.Get(player->m_pVehicle).m_pTrailer ? vehComps.Get(player->m_pVehicle).m_pTrailer->m_nModelIndex : -1)
  6. }, 10, 100, 1, FONT_DEFAULT, 1, 1, color::Orange);

2
Если надо найти один рандомный транспорт - то надо весь созданный транспорт записать в список, и из списка выбрать рандомный элемент.
Код: C++
  1. CVehicle *GetRandomVehicle(CVector const &posn, float radius) {
  2.     std::vector<CVehicle *> vehicles;
  3.     for (auto vehicle : CPools::ms_pVehiclePool) {
  4.         if (DistanceBetweenPoints(vehicle->GetPosition(), posn) <= radius)
  5.             vehicles.push_back(vehicle);
  6.     }
  7.     return vehicles.empty() ? nullptr : vehicles[plugin::Random(0, vehicles.size() - 1)];
  8. }
Функцию можно оптимизировать, - выделяя память под список только один раз
Код: C++
  1. CVehicle *GetRandomVehicle(CVector const &posn, float radius) {
  2.     static std::vector<CVehicle *> vehicles(CPools::ms_pVehiclePool->m_nCapacity);
  3.     unsigned int counter = 0;
  4.     for (auto vehicle : CPools::ms_pVehiclePool) {
  5.         if (DistanceBetweenPoints(vehicle->GetPosition(), posn) <= radius)
  6.             vehicles[counter++] = vehicle;
  7.     }
  8.     return counter == 0 ? nullptr : vehicles[plugin::Random(0, counter - 1)];
  9. }

3
Идеи / Re: Перевозка транспорта
« : Ноябрь 25, 2018, 10:40:29 pm »
Надо в sdk будет добавить функцию GetVehicleModel(int), а то этот серпантин каждый раз приходиться писать  ;D

4
string x,y,z=FindPlayerCoors();
То, что ты пытался сделать, называется Structured Binding, и там надо использовать строго фиксированный синтаксис:
Код: C++
  1. auto [переменные] = Функция_которая_возвращает_обьект
Т.е. получится вот так:
Код: C++
  1. auto [x, y, z] = FindPlayerCoors();

Код: C++
  1. #include "plugin.h"
  2. #include "CMessages.h"
  3.  
  4. using namespace plugin;
  5.  
  6. class PlayerCoors {
  7. public:
  8.     PlayerCoors() {
  9.         Events::gameProcessEvent += [] {
  10.             if (FindPlayerPed()) {
  11.                 auto [x, y, z] = FindPlayerCoors();
  12.                 CMessages::AddMessageJumpQ(FormatStatic("%.2f %.2f %.2f", x, y, z), 1000, 0);
  13.             }
  14.         };
  15.     }
  16. } playerCoors;

5
Для клавиш с буквами алфавита можно использовать символ буквы (заглавной).
Например:
Код: C++
  1. if (KeyPressed('M'))
Для других клавиш есть константы VK_*, например:
VK_TAB - Tab
VK_CONTROL - Ctrl
VK_MENU - Alt
Весь список можно посмотреть здесь.

Код: C++
  1. class msg {
  2. ...
  3. } msg;
У тебя название класса и переменной одинаковые. Так лучше не делать. Если ты создаешь плагин через Мастер создания проекта, и даешь ему название msg, то мастер назовёт переменную как _msg.

как можно получить координаты игрока?
Есть статическая функция FindPlayerCoors. В Vice City она не принимает никаких входных параметров и возвращает позицию игрока. Перед её вызовом надо проверять, что игрок существует.

Также, у класса CEntity есть метод GetPosition. Этот метод доступен для всех классов, которые наследуют CEntity - т.е. CPed, CVehicle, CObject и другие.

Метод TransformFromObjectSpace можно применять для получения координат со смещением от центра обьекта. Но этот метод ещё не добавлен в версию для Vice City. В качестве замены - для получения координат со смещением можно умножить матрицу игрока на вектор с координатами смещения.

В функцию AddMessageJumpQ надо передавать указатель на C-строку (массив из char или wchar_t). Если хочешь вывести координаты - надо их отформатировать в строку (для этого есть функции plugin::FormatStatic (для получения C-строки) и plugin::Format (для получения std-строки)).

Код: C++
  1. #include "plugin.h"
  2.  
  3. using namespace plugin;
  4.  
  5. class PlayerCoors {
  6. public:
  7.     PlayerCoors() {
  8.         Events::drawingEvent += [] {
  9.             CPed *player = FindPlayerPed();
  10.             if (player) {
  11.                 CVector coors = player->m_placement * CVector(0.0f, 5.0f, 0.0f);
  12.                 gamefont::PrintAt3d(coors, Format("%.2f %.2f %.2f", coors.x, coors.y, coors.z),
  13.                     0, 0, FONT_DEFAULT, 2, 2, color::Pink, true, gamefont::AlignCenter);
  14.             }
  15.         };
  16.     }
  17. } playerCoors;

6
Исходя из багов на твоих скринах - скорее всего, работает.

7
В игре есть ограничение на количество загруженных прозрачных обьектов - не более 200 штук.
Возможно, какой-то из Limit-Adjuster'ов это ограничение убирает, тут уже не знаю.

8
В игре есть сортировка прозрачных обьектов. Сортируются они по дистанции. Дистанция - это разница между центром обьекта и камерой.
Если у тебя в сцене 2 обьекта с флагом DRAW_LAST, сначала будет отрендерен тот, центр которого находится дальше от камеры. Как я понимаю, стенка - это часть модели интерьера (т.е. не отдельный обьект), поэтому, фактически, стенка находится ближе к камере, чем пальмы (зависит от того, где находится центр модели интерьера).

Цитировать
У меня у тех зданий все окна отдельными объектами и у них стоит флаг, а вот у самой пятиэтажки нет флагов
Каждое окно - отдельный обьект? Сколько всего таких окон?

9
Цитировать
Я уж не настолько тупой
Из твоих постов как раз такое впечатление о тебе. Тем более, если ты "пробовал все флаги". Твой путь - сделать наугад и надеяться, что заработает.

Я попытался объяснить корень причины - неправильный порядок рендера обьектов. Какое объяснение у тебя? "Мистика, что-то в движке, альфа в txd...".

Если проблема наблюдается только при определённом положении камеры - возможно, в таком положении в сцену попадает больше обьектов, и список из обьектов переполняется. Или же компоненты позиции камеры при определённом положении обнуляются, и алгоритм, который делает сортировку обьектов, перестаёт правильно работать.
По факту - надо выводить на экран порядок рендера обьектов, список прозрачных обьектов и координаты камеры, и пытаться найти закономерность. А ещё лучше - отследить в exe заполнение списка прозрачных обьектов, и рендер этих обьектов.

Цитировать
Да и смысл мне что-то слушать от человека, который разбирается в SA, а не Вайсе
Я даже больше скажу - я никогда не занимался моделированием/маппингом для Vice City - т.е. не создавал модели и не вставлял их в игру. Но когда возникают такие проблемы, я знаю, где искать их причины, могу целый список составить - куда надо смотреть и что проверить. А ты предлагаешь на текстуру посмотреть в txd-workshop'е. Почему так?

10
Чтобы обьект-статика не "просвечивался" на фоне других обьеков - надо у обьекта с прозрачностью выставить флаг DRAW_LAST.
Если обьект-статика "просвечивается" на фоне себя же - надо отделять куски с прозрачностью и ставить им флаг DRAW_LAST. В случае с деревом надо отделить все ветки (каждую желательно в отдельный обьект). Каждый обьект надо нормально "отцентрировать" (выставить т.н. pivot в центр геометрии обьекта).


Ты, наверное, недоумеваешь от такой картины, а я тебе её очень просто обьясню: у тебя в сцене сначала рисуется трава (ландшафт), далее кусты и деревья, и далее дом.
И вот когда рисуется дом, и когда тексель из текстуры дома хочет залезть в пиксель, в который записана информация о цвете куста/дерева, буфер глубины ему отвечает: - "Тут занято". - "Но там же полупрозрачный пиксель?!". - "А мне пофигу, для меня вы все черно-белые".

11
100к полигонов? Ха. Моя машина с 8 процессорами и 3 видеокартами этого не почувствует.
Давай ещё докидывай соточку - и я подумаю над тем, чтобы скачать этот мод.
И вообще, будущие сборки на тесты кидай только мне - тут я решаю, что тормозит, а что нет.

12
Цитировать
Т.е идея заключается в том что-бы, объединить пачку моделей в один мэш и получить всего 1 вызов на эту самую пачку.
Только если все эти модели используют одну и ту же, одну текстуру, и один и тот же материал.

13
Скриптинг / Re: Прицепить звук к объекту.
« : Август 05, 2018, 03:08:28 am »
Вчера на сервере plugin-sdk обсуждали крепление партиклов к транспорту, вот такой код получился.
Код: C++
  1. #include "plugin.h"
  2. #include "CClumpModelInfo.h"
  3. #include "CParticle.h"
  4.  
  5. using namespace plugin;
  6.  
  7. class ParticleTest {
  8. public:
  9.     static void CreateParticleOnVehicleNode(CVehicle *vehicle, char const *nodeName) {
  10.         RwFrame *node = CClumpModelInfo::GetFrameFromName(vehicle->m_pRwClump, nodeName); // получить компонент по названию
  11.         if (node) {
  12.             RwMatrix *m = RwFrameGetLTM(node); // получить матрицу компонента в глобальном пространстве
  13.             CParticle::AddParticle(PARTICLE_FLYERS, CVector(m->pos.x, m->pos.y, m->pos.z), CVector(0, 0, 0), nullptr, 0.4f, 0, 0, 0, 0);
  14.         }
  15.     }
  16.  
  17.     ParticleTest() {
  18.         Events::gameProcessEvent += [] {
  19.             if (CPed *player = FindPlayerPed(); player && player->m_bInVehicle && player->m_pVehicle && player->m_pVehicle->m_fGasPedal > 0) {
  20.                 CreateParticleOnVehicleNode(player->m_pVehicle, "wheel_lb_dummy");
  21.                 CreateParticleOnVehicleNode(player->m_pVehicle, "wheel_rb_dummy");
  22.             }
  23.         };
  24.     }
  25. } particleTest;

14
Shagg_E, странно, я сам в упор не видел, что CFire уже есть в sdk для VC.
Ну зато теперь по огням всё разобрано и перепроверено до мелочей.

15
Вот что у меня получилось
Код: C++
  1. /* 0x00 */ bool     m_bActive            // существует (т.е. слот занят)
  2. /* 0x01 */ bool     m_bScriptFire        // ручное удаление ("заскриптованный" огонь)
  3. /* 0x02 */ bool     field_2              // возможно не используется, 0 - для огня после взрыва, 1 для всего остального
  4. /* 0x03 */ bool     m_bMakesNoise        // есть звук
  5. /* 0x04 */ CVector  m_vecPosition        // позиция
  6. /* 0x10 */ CEntity *m_pEntityTarget      // жертва
  7. /* 0x14 */ CEntity *m_pEntityCreator     // создатель
  8. /* 0x18 */ int      m_nEndLifeTime       // время затухания
  9. /* 0x1C */ int      field_1C             // какой-то таймер, возможно не используется, обнуляется каждые 400мс
  10. /* 0x20 */ int      m_nParticlesTimer    // таймер для создания партиклов
  11. /* 0x24 */ float    m_fSize              // размер
  12. /* 0x28 */ float    m_fStrength          // интенсивность (повышается при появлении огня и уменьшается при затухании)
  13. /* 0x2C */ bool     m_bBeingExtinguished // флаг "тушения" (водой) - используется, чтобы начать проигрывать какой-то звук, после выключается
  14. /* 0x2D */ char     _pad2D[3]

Страницы: [1] 2 3 ... 16