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

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


Сообщения - kenking

Страницы: 1 ... 12 13 [14] 15 16
196
Код: C++
  1. pMyTexture = RwD3D9DDSTextureRead("models\\image", 0); // загружает image.dds из папки models
Как я понял, загружаются текстуры только формата .dds?
А если надо взять какую-либо текстуру из определённого .txd файла, какой код для отрисовки текстуры с наклоном будет в этом случае?

197
Обновился пример CreateCar, теперь вместо CCheat::VehicleCheat там используется своя функция спавна.
Просьба пояснить эти строчки:
Код: C++
  1. reinterpret_cast<CBike *>(vehicle)->m_nDamageFlags |= 0x10;
  2. reinterpret_cast<CBmx *>(vehicle)->m_nDamageFlags |= 0x10;

и эти:
Код: C++
  1. reinterpret_cast<CBike *>(vehicle)->PlaceOnRoadProperly();
  2. reinterpret_cast<CAutomobile *>(vehicle)->PlaceOnRoadProperly();

Пробую работу с выводом текстур на экран. Почитал твой урок http://ru-script.3dn.ru/publ/programirovanie/sozdanie_dll_bibliotek/sa_124_c_plugin_sdk_risuem_chast_1/18-1-0-206

Перенёс пример на sdk:
Код: C++
  1. #include <plugin.h>
  2. #include "game_sa\CSprite2d.h"
  3. #include "game_sa\CTxdStore.h"
  4.  
  5. using namespace plugin;
  6.  
  7. class MyPlugin {
  8. public:
  9.     static CSprite2d mySprite;
  10.  
  11.     MyPlugin() {
  12.         Events::initRwEvent += [] {
  13.             // Добавляем новый слот для нашего txd
  14.             int txd = CTxdStore::AddTxdSlot("mytxd");
  15.             // Загружаем наш txd в выделенный слот
  16.             CTxdStore::LoadTxd(txd, "MODELS\\MYTXD.TXD");
  17.             // Увеличиваем счётчик использований для созданного txd
  18.             CTxdStore::AddRef(txd);
  19.             // Сохраняем текущий txd
  20.             CTxdStore::PushCurrentTxd();
  21.             // Устанавливаем наш txd как текущий
  22.             CTxdStore::SetCurrentTxd(txd);
  23.             // Назначаем текстру нашему спрайту (имя текстуры, имя альфа-маски для текстуры)
  24.             mySprite.SetTexture("skipicon", "skipicona");
  25.             // Восстанавливаем сохранённый txd
  26.             CTxdStore::PopCurrentTxd();
  27.         };
  28.  
  29.         Events::drawingEvent += [] {
  30.             // Рисуем наш спрайт (указываем параметры - позиция, ширина, высота, цвет)
  31.             mySprite.Draw(20.0, 20.0, 150.0, 150.0, CRGBA(255, 255, 255, 255));
  32.         };
  33.     }
  34.  
  35.     ~MyPlugin() {
  36.         Events::shutdownRwEvent += [] {
  37.             // Удаляем наш спрайт
  38.             mySprite.Delete();
  39.             // Удаляем наш txd
  40.             CTxdStore::RemoveTxdSlot(CTxdStore::FindTxdSlot("mytxd"));
  41.         };
  42.     }
  43. } myPlugin;
  44.  
  45. CSprite2d MyPlugin::mySprite;

Верно ли?

Дальше задумался над кодом для спидометра, но не нашёл функции для вращения текстуры стрелки.

198
Программирование / Re: Сложные модели объектов
« : Сентябрь 10, 2016, 08:56:46 am »
Возможно, я позже покажу, как именно переношу информацию из IDA (функции, классы, переменные) в файлы sdk.
Это было бы хорошо. Можно даже отдельную тему для этого создать.

199
Программирование / Re: Сложные модели объектов
« : Сентябрь 09, 2016, 10:08:52 am »
Опять же, на plugin-sdk для Vice City у меня нету времени. Надеюсь, на этом сайте найдутся желающие развивать проект.
А я уже помогу чем смогу, научу и обьясню.

У меня есть желание, но знаний пока маловато.  ;)

200
Добавил все функции класса CGeneral, теперь там есть такое:
Эти функции используются в опкодах 0208 и 0209.
Это хорошо. В скриптах я частенько пользовался этими опкодами.


И ещё сразу по прицепам есть вопрос - можно ли в трафике в процессе создания транспорта проверить, если модель определённого ID (тягач), то цеплять к нему прицеп. Цеплять не на весь транспорт с таким ID, а выборочно, ну скажем через определённое время? Цеплять разные прицепы?
Можно, надо разбирать CCarCtrl::GenerateOneRandomCar.
Как будет свободное время разбери пожалуйста это дело. Вопрос с прицепами интересен многим пользователям. Было написано несколько скриптов на эту тему (в том числе и у меня есть такой скрипт), но это всё не то.

201
Спасибо за разъяснения.

По sdk для VC пока никакого продвижения нет? А по SA много ещё осталось не разобранного?

202
Разобрался, спасибо! Есть только один момент:
Код: C++
  1. RwTexture *&pExpTex = *(RwTexture **)0xC403F4;
Такие записи (*& и **) ранее не встречались. Просьба разъяснить. Где про это почитать?

Немного изменил и дополнил код:
1) Ограничил для транспорта трафика по m_nClass (оставил для poorfamily, richfamily и executive).
2) Ограничил для транспорта игрока по m_dwVehicleSubClass.
3) Изменил случайный выбор для транспорта в трафике.
4) Взял другую (прямоугольную) текстуру.
5) Размер проекции "привязал" на габариты модели.
6) Так как текстура с ровными краями, сделал мигание проекции, чтобы это сильно "не бросалось в глаза".

Код: C++
  1. #include "plugin.h"
  2. #include "game_sa\CClock.h"
  3. #include "game_sa\CShadows.h"
  4. #include "game_sa\common.h"
  5. #include "KeyCheck.h"
  6. #include "game_sa\CModelInfo.h"
  7. #include "game_sa\CTimer.h"
  8.  
  9. #define TURN_ON_OFF_DELAY 500
  10.  
  11. using namespace plugin;
  12. using namespace std;
  13.  
  14. RwTexture *&pWhiteTex = *(RwTexture **)0xB4E3EC;
  15.  
  16. class NeonLights {
  17. public:
  18.     enum eNeonColor {
  19.         NEON_YELLOW, NEON_GREEN, NEON_RED, NEON_BLUE, NEON_PURPLE
  20.     };
  21.  
  22.     class Neon {
  23.     public:
  24.         unsigned char color;
  25.         bool activated;
  26.         bool processed;
  27.  
  28.         Neon(CVehicle *) {
  29.             activated = processed = false;
  30.         }
  31.  
  32.         void Enable(eNeonColor Color) {
  33.             color = Color;
  34.             activated = true;
  35.         }
  36.  
  37.         void Disable() {
  38.             activated = false;
  39.         }
  40.     };
  41.  
  42.     static VehicleExtendedData<Neon> VehNeon;
  43.  
  44.     static bool CanEnableNeonOnThisVehicle(CVehicle *vehicle) {
  45.         CVehicleModelInfo *vehModel = reinterpret_cast<CVehicleModelInfo *>(CModelInfo::ms_modelInfoPtrs[vehicle->m_wModelIndex]);
  46.         return CClock::GetIsTimeInRange(22, 5) && vehicle->m_pDriver && (vehModel->m_nClass == 1 || vehModel->m_nClass == 2 || vehModel->m_nClass == 3) && (vehicle->m_dwVehicleSubClass == VEHICLE_AUTOMOBILE ||
  47.                         vehicle->m_dwVehicleSubClass == VEHICLE_MTRUCK || vehicle->m_dwVehicleSubClass == VEHICLE_QUAD);
  48.     }
  49.  
  50.     static void ProcessNpcVehicle(CVehicle *vehicle) {
  51.         if (CanEnableNeonOnThisVehicle(vehicle) && !VehNeon.Get(vehicle).processed) {
  52.             VehNeon.Get(vehicle).processed = true;
  53.             if (rand() % 3 == 1) {
  54.                 VehNeon.Get(vehicle).activated = true;
  55.                 VehNeon.Get(vehicle).color = rand() % 5;
  56.             }
  57.         }
  58.     }
  59.  
  60.     static void ProcessVehicles() {
  61.         KeyCheck::Update();
  62.         CVehicle *playaVeh = FindPlayerVehicle(0, false);
  63.         if (playaVeh && (playaVeh->m_dwVehicleSubClass == VEHICLE_AUTOMOBILE ||
  64.                         playaVeh->m_dwVehicleSubClass == VEHICLE_MTRUCK || playaVeh->m_dwVehicleSubClass == VEHICLE_QUAD)) {
  65.             if (KeyCheck::Check(VK_SHIFT)) {
  66.                 if (KeyCheck::CheckJustDown('1'))
  67.                     VehNeon.Get(playaVeh).Enable(NEON_YELLOW);
  68.                 else if (KeyCheck::CheckJustDown('2'))
  69.                     VehNeon.Get(playaVeh).Enable(NEON_GREEN);
  70.                 else if (KeyCheck::CheckJustDown('3'))
  71.                     VehNeon.Get(playaVeh).Enable(NEON_RED);
  72.                 else if (KeyCheck::CheckJustDown('4'))
  73.                     VehNeon.Get(playaVeh).Enable(NEON_BLUE);
  74.                 else if (KeyCheck::CheckJustDown('5'))
  75.                     VehNeon.Get(playaVeh).Enable(NEON_PURPLE);
  76.                 else if (KeyCheck::CheckJustDown('0'))
  77.                     VehNeon.Get(playaVeh).Disable();
  78.             }
  79.         }
  80.         for (int i = 0; i < CPools::ms_pVehiclePool->m_Size; i++) {
  81.             CVehicle *vehicle = CPools::ms_pVehiclePool->GetAt(i);
  82.             if (vehicle && vehicle != playaVeh)
  83.                 ProcessNpcVehicle(vehicle);
  84.         }
  85.     }
  86.  
  87.     static void RenderNeonForVehicle(CVehicle *vehicle) {
  88.         if (VehNeon.Get(vehicle).activated) {
  89.             unsigned char r, g, b;
  90.             switch (VehNeon.Get(vehicle).color) {
  91.             case NEON_YELLOW:
  92.                 r = 255; g = 200; b = 0;
  93.                 break;
  94.             case NEON_GREEN:
  95.                 r = 0; g = 255; b = 0;
  96.                 break;
  97.             case NEON_RED:
  98.                 r = 255; g = 0; b = 0;
  99.                 break;
  100.             case NEON_BLUE:
  101.                 r = 0; g = 0; b = 255;
  102.                 break;
  103.             case NEON_PURPLE:
  104.                 r = 255; g = 0; b = 255;
  105.                 break;
  106.             }
  107.             if (CTimer::m_snTimeInMilliseconds % (TURN_ON_OFF_DELAY + 250) < TURN_ON_OFF_DELAY) {
  108.                 CVector Pos = CModelInfo::ms_modelInfoPtrs[vehicle->m_wModelIndex]->m_pColModel->m_boundBox.m_vSup;
  109.                 CVector center = vehicle->TransformFromObjectSpace(CVector(0.0f, 0.0f, 0.0f));
  110.                 CVector up = vehicle->TransformFromObjectSpace(CVector(0.0f, -Pos.y - 0.5f, 0.0f)) - center;
  111.                 CVector right = vehicle->TransformFromObjectSpace(CVector(Pos.x + 0.2f, 0.0f, 0.0f)) - center;
  112.                 CShadows::StoreShadowToBeRendered(2, pWhiteTex, &center, up.x, up.y, right.x, right.y, 255, r, g, b, 2.0f, false, 1.0f, 0, true);
  113.             }
  114.         }
  115.     }
  116.  
  117.     NeonLights() {
  118.         Events::gameProcessEvent += ProcessVehicles;
  119.         Events::vehicleRenderEvent += RenderNeonForVehicle;
  120.     }
  121. } neon;
  122.  
  123. VehicleExtendedData<NeonLights::Neon> NeonLights::VehNeon;

203
Спасибо за примеры.

По первому примеру студия ругается на:
Код: C++
  1. 1>------ Перестроение всех файлов начато: проект: testVector, Конфигурация: Release Win32 ------
  2. 1>  Source.cpp
  3. 1>Source.obj : error LNK2001: неразрешенный внешний символ ""public: static class std::vector<struct SettingsTest::MyData,class std::allocator<struct SettingsTest::MyData> > SettingsTest::entries" (?entries@SettingsTest@@2V?$vector@UMyData@SettingsTest@@V?$allocator@UMyData@SettingsTest@@@std@@@std@@A)"
  4. 1>D:\Games\GTA San Andreas\scripts\testVector.asi : fatal error LNK1120: неразрешенных внешних элементов: 1
  5. ========== Перестроение всех проектов: успешно: 0, с ошибками: 1, пропущено: 0 ==========

По второму примеру всё отлично, за исключением того, что проекция на поверхности стоит под одним и тем же углом, т.е. не поворачивается вместе с авто. Это заметно, если сделать проекцию овальной, а не круглой или заменить текстуру на квадратную. Можно это, как-то исправить? У Дениса в скрипте проекция поворачивается вместе с авто.

204
Цитировать
Я бы сделал так, по аналогии с vehicles.ide:
Код: C++
  1. trucks
  2. 400, 500, 0.0
  3. 401, 505, 1.0
  4. end
Цитировать
Или вообще всё в отдельный файл и убрать метки trucks и end.
Надо ещё один объект std::stringstream и std::vector для float значений? А как сопоставлять их значения? Или как-то по другому? Вот, допустим, первой колонкой идёт набор ID каких-то моделей транспорта, второй колонкой идёт какое-то значение float (допустим, угол поворота фар). Как их правильно считать и сопоставить угол и ID?
Код: C++
  1. trucks
  2. 500, 1.5
  3. 501, 1.71
  4. 502, 1.35
  5. end



Решил попробовать сделать неоновую подсветку для автомобилей в плагине. Посмотрел скрипт Дениса для SA, что-то там сложновато. Глянул твой скрипт для GTA III - тут всё понятно, можно взять за основу. Посмотрел в базе опкод 016F, там вызывается  CShadows__registerShadowByType, глянул в sdk - есть такое дело в CShadows.
Код: C++
  1. static void StoreShadowToBeRendered(unsigned char type, RwTexture* texture, CVector* posn, float x1, float y1, float x2, float y2, short intensity, unsigned char red, unsigned char green, unsigned char blue, float zDistance, bool bDrawOnWater, float scale, CRealTimeShadow* shadowData, bool bDrawOnBuildings);


Можно пожалуйста пример, как вызвать эту функцию. С текстурами примеров не было, как с ними работать? Ещё например, установка винила на авто. 


205
Цитировать
Есть плагин fastman92 лимит-аджастер. Там тоже есть попытка сделать дополнительные модели. Проект отличный, можно расширять карту, воду, кол-во авто итд. Так вот к чему это я, может вам объединиться с ним касательно части новых фишек для авто. Возможно его дело пойдет быстрее.
С меня в данный момент польза для fastman'а вряд ли будет, я только начал изучать.  ;D

Цитировать
Вместо ini я бы использовал такой формат
Код: C++
  1. section
  2. 1,2,3,4
  3. end
Цитировать
По-моему, так намного удобнее.

Да, разобрал, что к чему. Удобная вещь.
Есть вопросы:
1) Есть ли ограничение по количеству элементов записываемых в truckIDs?
2) Длина строки в .dat ограничена в 256 символа или никакого ограничения нет?
3) Как бы ещё организовать запись/считывание пары значений. Например, одного типа - ID тягача и ID прицепа? А разных типов? Например, ID дополнительной модели типа zr350 и угол, на который должны открываться у неё фары?

206
Теперь нормально.
Что сказать? Круто! Спасибо за пример.
С каждым новым примером я всё больше убеждаюсь в том, что надо было мне раньше заняться изучением С++. Ну рано или поздно это должно было произойти, в рамках клео скриптов давно стало "тесно".  :)

Нашёл, кстати, исходник на Delphi того плагина Александра. Вот часть с тягачами:
{TRAILER_HOOKs}
  Reset(F);

  {FIRST'n'LAST Hook}
  CodePtr := VirtualAlloc(0, 1000 , MEM_COMMIT , PAGE_READWRITE) ;
  VirtualProtect(ptr($6AF26C),5,PAGE_READWRITE,OldProtect);
  PByte($6AF26C)^:= $E9;     // jmp
  PInteger($6AF26D)^:= Integer(CodePtr) - $6AF26C - 5;   // Alloced place

  While not EOF(F) do
  begin
    ReadLn(F,StrName);
    if not (strpos(PChar(StrName),'[TRAILER_HOOKs]')=nil) then break;
  end;

  Count:= ReadIntValue('MAIN','TRAILER_HOOKs');

  For i:= 0 to Count-1 do
  begin
    ReadLn(F,S[i]);
    PByte(Integer(CodePtr)+i*6)^:= $66;
    PByte(Integer(CodePtr)+i*6+1)^:= $3D;
    PSmallInt(Integer(CodePtr)+i*6+2)^:= StrToInt(S[i]);
    PByte(Integer(CodePtr)+i*6+4)^:= $74;
    PByte(Integer(CodePtr)+i*6+5)^:= (Count-i-1)*6 + $A;
  end;

  PByte(Integer(CodePtr)+Count*6)^:= $66;  // cmp
  PByte(Integer(CodePtr)+Count*6+1)^:= $3D; // ax
  PByte(Integer(CodePtr)+Count*6+2)^:= $02;   // id
  PByte(Integer(CodePtr)+Count*6+3)^:= $02;   // 2 b
  PByte(Integer(CodePtr)+Count*6+4)^:= $0F;  // jnz
  PByte(Integer(CodePtr)+Count*6+5)^:= $85;  // $6AF284
  PInteger(Integer(CodePtr)+Count*6+6)^:= $6AF272 - (Integer(CodePtr)+Count*6+10);
  PByte(Integer(CodePtr)+Count*6+10)^:= $E9;   // jmp $6AF2CC
  PInteger(Integer(CodePtr)+Count*6+11)^:= $6AF2CC - (Integer(CodePtr)+Count*6+15);

  CloseFile(F);
{TRAILER_HOOKs_END}

207
 :( Студия ругается на строчки
Код: C++
  1. outPos = *automobile->m_matrix * outPos;

Цитировать
1>VehicleAdvanced.cpp(62): error C2676: бинарный "*": "CMatrixLink" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
1>VehicleAdvanced.cpp(83): error C2676: бинарный "*": "CMatrixLink" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
1>VehicleAdvanced.cpp(91): error C2676: бинарный "*": "CMatrixLink" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору


http://savepic.net/8355422.png


208
Цитировать
Ты не будешь против если я использую часть твоего кода в своем скрипте?
Используй, конечно.

209
Цитировать
...я еще хотел чтобы из выхлопной трубы "выстреливал" черный-черный дым...Но по сравнению с СА надо копаться в памяти чтобы узнать X Y и Z даммисов типа exhaust.

http://gta.com.ua/file_details.phtml?id=2821

210
Спасибо за пояснения и новую базу. Буду разбираться.

Когда-то меня просили написать скрипт для SA, чтобы у дополнительно установленных моделей типа zr350, фары открывались на разный угол. Ну т.е. задавать каждой модели в .ini файле свой угол открытия фар, т.к. есть модели у которых он значительно отличается и получается при использовании плагина Александра GTA SA Vehicle Special Abilities Editor и новых моделей, фары у некоторых моделей открываются не полностью или наоборот поворачиваются на лишние градусы. Для VC и GTA III я такую возможность сделал (только там не считывание угла с .ini для каждой модели, а значение угла "зашивается" в саму модель путём названия вспомогательного дамми, т.е. получается надо редактировать саму модель).


Для SA хотелось бы это сделать без редактирования самой модели. Можно ли это реализовать с помощью плагина?

И ещё, касаемо плагина Александра GTA SA Vehicle Special Abilities Editor - как известно, плагин
Цитировать
позволяет ставить модели авто,обладающие особыми способностями, к примеру фары у ZR350, ковш у Dozer'a ... на лю6ые другие свободные ID с сохранением всех рабочих деталей

так вот, если можно, то просьба показать, как это реализовать на С++ на примере хотя бы возможности цеплять прицепы к моделям, где изначально эта возможность не имелась.

Страницы: 1 ... 12 13 [14] 15 16