Автор Тема: Как удалять (редактировать) объекты карты  (Прочитано 257 раз)

Оффлайн Saint

  • Прохожий
  • *
  • Сообщений: 53
  • Репутация: +1/-0
  • Saint Games
    • saint36rus
    • Просмотр профиля
возможно ли как-то в процессе игры удалять или редактировать (например заменить модель определёного объекта) объекты карты?

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 653
  • Репутация: +21/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Как удалять (редактировать) объекты карты
« Ответ #1 : Январь 04, 2020, 02:04:28 am »
Можно отключить рендер определенной модели в определенном радиусе: опкод 0363.
Иначе говоря, указав координаты нужного объекта и поставив маленький радиус(полметра или меньше) - можно заставить исчезнуть именно этот объект. Но коллизия и т.д. останется - объект исчезнет лишь визуально.
Этим трюком можно принудительно включать/выключать дневные/ночные версии time objects или незаметно подменять объекты на актера, например.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 571
  • Репутация: +84/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Как удалять (редактировать) объекты карты
« Ответ #2 : Январь 06, 2020, 03:21:08 pm »
Можно еще менять прозрачность модели Entity->SetRwObjectAlpha(alpha). Пример как заменять модели неба по времени с плавным переходом между ними. По факту все модели существуют одновременно, только с разной прозрачностью.
Код: C++
  1. void CEntity::SetRwObjectAlpha(int alpha) {
  2.         ((void(__thiscall *)(CEntity *, int))0x487990)(this, alpha);
  3. }
  4.  
  5. class EntityPreRender {
  6.         static bool isSky(CEntity * Entity) {
  7.                 for (int i = 0; i < DAT_Sky; i++)            // DAT_Sky - sky model count
  8.                         if (Entity->id == IPL_Sky[i]) {      // IPL_Sky[i] - array of sky model id
  9.                                 switch (i) {
  10.                                 case 1:
  11.                                         Entity->SetRwObjectAlpha(int(255 * ((((HOUR > 4) && (HOUR < 8)) || ((HOUR > 17) && (HOUR < 23))) + ((HOUR == 4) || (HOUR == 17)) * ((MINUTE * 60 + SECOND) / 3600.0f) + ((HOUR == 8) || (HOUR == 23)) * (1 - (MINUTE * 60 + SECOND) / 3600.0f))));
  12.                                         break;
  13.                                 case 2:
  14.                                         Entity->SetRwObjectAlpha(int(255 * (((HOUR < 5) || (HOUR > 22)) + (HOUR == 22) * ((MINUTE * 60 + SECOND) / 3600.0f) + (HOUR == 5) * (1 - (MINUTE * 60 + SECOND) / 3600.0f))));
  15.                                         break;
  16.                                 default:
  17.                                         Entity->SetRwObjectAlpha(int(255 * (((HOUR > 7) && (HOUR < 18)) + (HOUR == 7) * ((MINUTE * 60 + SECOND) / 3600.0f) + (HOUR == 18) * (1 - (MINUTE * 60 + SECOND) / 3600.0f))));
  18.                                         break;
  19.                                 }
  20.                                 return true;
  21.                         }
  22.                 return false;
  23.         }
  24.  
  25.         static void __stdcall SetEntityEvents(CEntity * Entity) {
  26.                 if ((ModelInfo[Entity->id])->num2dEffects)
  27.                         Entity->ProcessLights();    // original code
  28.                 if (isSky(Entity)) {
  29.                         Entity->matrix.UpdateRw();
  30.                         Entity->UpdateRwFrame();
  31.                 }
  32.         }
  33.  
  34. public:
  35.         EntityPreRender() {
  36.                 Inject(0x488819, 0x488833, (int)SetEntityEvents, ASM_PUSH_EBX);
  37.         }
  38. } _EntityPreRender;

Оффлайн Saint

  • Прохожий
  • *
  • Сообщений: 53
  • Репутация: +1/-0
  • Saint Games
    • saint36rus
    • Просмотр профиля
Re: Как удалять (редактировать) объекты карты
« Ответ #3 : Январь 08, 2020, 01:31:47 pm »
спасибо за ваши ответы, но увы это не то, нужно именно удаление (с коллизией т.е. полностью) как буд-то бы мы его удалили вручную из фалов data перед запуском игры, но надо всё это дело делать уже в процессе игры.

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 571
  • Репутация: +84/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Как удалять (редактировать) объекты карты
« Ответ #4 : Январь 08, 2020, 03:37:09 pm »
Ты упоминал, что тебе нужно заменять не один объект, а целые районы. Нужно будет выгрузить кучу объектов карты и загрузить заново по сути из альтернативного gta_vc.dat, который подцепит альтернативные ide с другими моделями на те же самые id. В итоге даже если все получится, ты получишь в игре очередную полосу загрузки, как в начале. Может сразу заложить разные версии gta_vc.dat и подменять их до полосы загрузки при старте игры в зависимости от каких-то условий.

Оффлайн daniel_360

  • Прохожий
  • *
  • Сообщений: 72
  • Репутация: +2/-0
    • daniel360465
    • Просмотр профиля
Re: Как удалять (редактировать) объекты карты
« Ответ #5 : Январь 09, 2020, 11:47:18 pm »
Здравствуйте, такая проблема не получается убрать работающие краны в порту. Пытался через .dat файл убрать - не получилось. Такое ощущение как будто он защит в exe.
https://prnt.sc/qlieak

Оффлайн xanser

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 571
  • Репутация: +84/-0
  • Есть такая профессия - на работе сидеть
    • Просмотр профиля
Re: Как удалять (редактировать) объекты карты
« Ответ #6 : Январь 13, 2020, 12:58:03 pm »
Такое ощущение как будто он защит в exe.
В этом ты прав:
674, doc_crane_cab0, crate, 1, 50, 132           // башня крана docks.ide            0068E848
681, doc_crane_cab01, crate, 1, 50, 132         // башня крана docks.ide            0068E84C
682, doc_crane_cab02, crate, 1, 50, 132         // башня крана docks.ide            0068E850
683, doc_crane_cab03, crate, 1, 50, 132         // башня крана docks.ide            0068E854
668, boatcranelg0, crate, 1, 50, 132                // башня крана docks.ide            0068E858
842, LODnetopa0, lod_docks, 1, 1000, 132      // башня крана docks.ide            0068E85C

Можно отключить рендер определенной модели в определенном радиусе

Можно отключить рендер модели еще так:
Код: C++
  1. void CEntity::Render() {
  2.         ((void(__thiscall *)(CEntity *))0x4887D0)(this);
  3. }
  4. class EntityRender {
  5.         static void __fastcall SetEntityRender(CEntity * Entity) {
  6.                 if (Entity->id != 1234)    // disable render model with id 1234
  7.                         Entity->Render();
  8.         }
  9. public:
  10.         EntityRender() {
  11.                 Patch(0x6865C0, (int)SetEntityRender);
  12.                 Patch(0x686610, (int)SetEntityRender);
  13.                 Patch(0x68B394, (int)SetEntityRender);
  14.                 Patch(0x68B610, (int)SetEntityRender);
  15.                 Patch(0x68F6E8, (int)SetEntityRender);
  16.                 Patch(0x691610, (int)SetEntityRender);
  17.                 Patch(0x69CA28, (int)SetEntityRender);
  18.         }
  19. } _EntityRender;
  20.  
  21.  
« Последнее редактирование: Январь 13, 2020, 01:08:32 pm от xanser »

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 653
  • Репутация: +21/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Как удалять (редактировать) объекты карты
« Ответ #7 : Январь 14, 2020, 01:56:39 am »
Круто! Полезная инфа.

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 653
  • Репутация: +21/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Как удалять (редактировать) объекты карты
« Ответ #8 : Январь 16, 2020, 02:51:42 am »
Ой, я совсем забыл про этот опкод:
Код: Text
  1. 03B6: replace_model_at 117.991 -362.461 10.179 radius 80.0 from #BLDNGST2MESH to #BLDNGST2MESHDAM
  2.  
Он вроде вместе с col-файлом заменяет. По крайней мере, гаитянский наркозавод вроде и коллизию менял после дебоша Томми(сам лично еще не юзал этот опкод, поэтому 100% не скажу).

Я почти уверен, что это именно то, что нужно было Saint и daniel_360. Остается только найти объекты-пустышки, на которые нужно заменить удаляемые объекты. Для тех, кто не знает - имена объектов, типа "#BLDNGST2MESH" можно просто заменить на их id(это и делает компилятор при компиляции).

Но в случае daniel_360 может помочь и простая замена объектов в ipl, т.к. в его ситуации вроде не обязательно заменять объекты "на лету", если я правильно всё помню.
« Последнее редактирование: Январь 16, 2020, 02:55:51 am от Shagg_E »

Оффлайн Saint

  • Прохожий
  • *
  • Сообщений: 53
  • Репутация: +1/-0
  • Saint Games
    • saint36rus
    • Просмотр профиля
Re: Как удалять (редактировать) объекты карты
« Ответ #9 : Январь 16, 2020, 12:51:48 pm »
Ой, я совсем забыл про этот опкод:
Код: Text
  1. 03B6: replace_model_at 117.991 -362.461 10.179 radius 80.0 from #BLDNGST2MESH to #BLDNGST2MESHDAM
  2.  
Он вроде вместе с col-файлом заменяет. По крайней мере, гаитянский наркозавод вроде и коллизию менял после дебоша Томми(сам лично еще не юзал этот опкод, поэтому 100% не скажу).

Я почти уверен, что это именно то, что нужно было Saint и daniel_360. Остается только найти объекты-пустышки, на которые нужно заменить удаляемые объекты. Для тех, кто не знает - имена объектов, типа "#BLDNGST2MESH" можно просто заменить на их id(это и делает компилятор при компиляции).

Но в случае daniel_360 может помочь и простая замена объектов в ipl, т.к. в его ситуации вроде не обязательно заменять объекты "на лету", если я правильно всё помню.

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

добавил я его файл scripting.h (опкод хук от spookie)

const SCRIPT_COMMAND replace_model = { 0x036B, "ffffii" }; // 6
ну и использование

// 03B6: replace_model_at  117.991 -362.461  10.179 radius  80.0 from -127 (BLDNGST2MESH) to -126 (BLDNGST2MESHDAM) // строка из main.scm

ScriptCommand(&request_model, 3964);
ScriptCommand(&load_requested_models);
ScriptCommand(&replace_model, 117.991, -362.461,  10.179, 80.0, 3908, 3964); // стройка // test
ScriptCommand(&release_model, 3908);

эффекта никакого к сожалению  :(

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 653
  • Репутация: +21/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Как удалять (редактировать) объекты карты
« Ответ #10 : Январь 16, 2020, 12:58:52 pm »
-127 и -126 - это прописанные референсы в начале main.scm. Попробуй вместо них сразу юзать id из ide

Оффлайн Saint

  • Прохожий
  • *
  • Сообщений: 53
  • Репутация: +1/-0
  • Saint Games
    • saint36rus
    • Просмотр профиля
Re: Как удалять (редактировать) объекты карты
« Ответ #11 : Январь 16, 2020, 01:20:38 pm »
-127 и -126 - это прописанные референсы в начале main.scm. Попробуй вместо них сразу юзать id из ide

ScriptCommand(&replace_model, 117.991, -362.461,  10.179, 80.0, 3908, 3964); // стройка // test

последние 2 параметра это и есть сразу id

Оффлайн Shagg_E

  • Главный Модератор
  • Постоялец
  • *****
  • Сообщений: 653
  • Репутация: +21/-0
  • Изобретательный Рукожопъ
    • Просмотр профиля
    • NewRockstar
Re: Как удалять (редактировать) объекты карты
« Ответ #12 : Январь 16, 2020, 04:21:41 pm »
последние 2 параметра это и есть сразу id
Ой, я слепой - не туда смотрел.

Ну, в общем - этот код 100% рабочий, по крайней мере на ванильном Вайсе(меняется и col-файл):
{$CLEO .cs}

//-------------MAIN---------------
0000:

:BuildingReplace
wait 0
   Player.Defined($PLAYER_CHAR)
jf @BuildingReplace
0ADC: test_cheat "STROYKA"
jf @BuildingReplace
Model.Load(3964)

:BuildingReplace2
if
   not Model.Available(3964)
jf @BuildingReplace3
wait 0
jump @BuildingReplace2

:BuildingReplace3
03B6: replace_model_at 117.991 -362.461 10.179 radius 80.0 from 3908 to 3964
Model.Destroy(3964)
0ACE: show_formatted_text_box "tpax tubugox"
jump @BuildingReplace




Работает и с объектами, не прописанными в main.scm или objects.dat:

{$CLEO .cs}

//-------------MAIN---------------
0000:

:BuildingReplace
wait 0
   Player.Defined($PLAYER_CHAR)
jf @BuildingReplace
0ADC: test_cheat "STROYKA"
jf @BuildingReplace
Model.Load(3820) //starwaterfrnt11, originally 3964

:BuildingReplace2
if
   not Model.Available(3820)
jf @BuildingReplace3
wait 0
jump @BuildingReplace2

:BuildingReplace3
03B6: replace_model_at 117.991 -362.461 10.179 radius 80.0 from 3908 to 3820
Model.Destroy(3820)
0ACE: show_formatted_text_box "tpax tubugox"
jump @BuildingReplace

Копия скрипта в аттаче



Есть лишь 1 нюанс: The game can swap and save a maximum of 25 map models. Значит ли это что в сейвах сохранится лишь 25 замен, или всего можно провести в игре 25 замен - хрен знает.

Оффлайн Saint

  • Прохожий
  • *
  • Сообщений: 53
  • Репутация: +1/-0
  • Saint Games
    • saint36rus
    • Просмотр профиля
Re: Как удалять (редактировать) объекты карты
« Ответ #13 : Январь 16, 2020, 05:12:03 pm »
только мне это нужно делать не в Клео

Оффлайн Saint

  • Прохожий
  • *
  • Сообщений: 53
  • Репутация: +1/-0
  • Saint Games
    • saint36rus
    • Просмотр профиля
Re: Как удалять (редактировать) объекты карты
« Ответ #14 : Январь 16, 2020, 05:32:31 pm »
извиняюсь, вообщем вся проблема была в моей невнимательности.

я неправильно добавил опкод

const SCRIPT_COMMAND replace_model = { 0x036B, "ffffii" }; // 6
а надо было так

const SCRIPT_COMMAND replace_model = { 0x03B6, "ffffii" }; // 6
теперь всё работает, но всё равно это не совсем то что нужно...