GTA Builder Форум

GTA Vice City => Общие вопросы => Тема начата: Saint от Январь 03, 2020, 10:54:50 pm

Название: Как удалять (редактировать) объекты карты
Отправлено: Saint от Январь 03, 2020, 10:54:50 pm
возможно ли как-то в процессе игры удалять или редактировать (например заменить модель определёного объекта) объекты карты?
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Shagg_E от Январь 04, 2020, 02:04:28 am
Можно отключить рендер определенной модели в определенном радиусе: опкод 0363 (https://gtamods.com/wiki/0363).
Иначе говоря, указав координаты нужного объекта и поставив маленький радиус(полметра или меньше) - можно заставить исчезнуть именно этот объект. Но коллизия и т.д. останется - объект исчезнет лишь визуально.
Этим трюком можно принудительно включать/выключать дневные/ночные версии time objects или незаметно подменять объекты на актера (https://youtu.be/pyYbc5xnYCU?t=23), например.
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: xanser от Январь 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;
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Saint от Январь 08, 2020, 01:31:47 pm
спасибо за ваши ответы, но увы это не то, нужно именно удаление (с коллизией т.е. полностью) как буд-то бы мы его удалили вручную из фалов data перед запуском игры, но надо всё это дело делать уже в процессе игры.
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: xanser от Январь 08, 2020, 03:37:09 pm
Ты упоминал, что тебе нужно заменять не один объект, а целые районы. Нужно будет выгрузить кучу объектов карты и загрузить заново по сути из альтернативного gta_vc.dat, который подцепит альтернативные ide с другими моделями на те же самые id. В итоге даже если все получится, ты получишь в игре очередную полосу загрузки, как в начале. Может сразу заложить разные версии gta_vc.dat и подменять их до полосы загрузки при старте игры в зависимости от каких-то условий.
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: daniel_360 от Январь 09, 2020, 11:47:18 pm
Здравствуйте, такая проблема не получается убрать работающие краны в порту. Пытался через .dat файл убрать - не получилось. Такое ощущение как будто он защит в exe.
https://prnt.sc/qlieak
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: xanser от Январь 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.  
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Shagg_E от Январь 14, 2020, 01:56:39 am
Круто! Полезная инфа.
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Shagg_E от Январь 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, т.к. в его ситуации вроде не обязательно заменять объекты "на лету", если я правильно всё помню.
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Saint от Январь 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);

эффекта никакого к сожалению  :(
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Shagg_E от Январь 16, 2020, 12:58:52 pm
-127 и -126 - это прописанные референсы в начале main.scm. Попробуй вместо них сразу юзать id из ide
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Saint от Январь 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
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Shagg_E от Январь 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

(https://funkyimg.com/p/31qPX.jpg) (https://funkyimg.com/view/31qPX)
(https://funkyimg.com/p/31qPY.jpg) (https://funkyimg.com/view/31qPY)

Работает и с объектами, не прописанными в 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

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

(https://funkyimg.com/p/31qR6.jpg) (https://funkyimg.com/view/31qR6)

Есть лишь 1 нюанс: The game can swap and save a maximum of 25 map models. (https://gtamods.com/wiki/03B6) Значит ли это что в сейвах сохранится лишь 25 замен, или всего можно провести в игре 25 замен - хрен знает.
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Saint от Январь 16, 2020, 05:12:03 pm
только мне это нужно делать не в Клео
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Saint от Январь 16, 2020, 05:32:31 pm
извиняюсь, вообщем вся проблема была в моей невнимательности.

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

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

const SCRIPT_COMMAND replace_model = { 0x03B6, "ffffii" }; // 6
теперь всё работает, но всё равно это не совсем то что нужно...
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Shagg_E от Январь 17, 2020, 12:17:17 am
Ну, остается только ковырять устройство этого опкода.
А "не совсем то что нужно" - это из-за ограниченного количества заменяемых объектов? Мб проще взломать этот лимит(понятное дело, что речь не о сейвах, но просто для стабильной работы игры)?
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: daniel_360 от Январь 17, 2020, 01:40:18 pm
А можно как-то остановить эти краны, не убирая их? А то криво получается!
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Shagg_E от Январь 17, 2020, 02:32:32 pm
Попробуй прописать в ide новые объекты с новыми id но старыми именами моделей и текстур кранов. И заменить старые краны на новые тем опкодом 03B6 но перед заменой хотя бы просто попробовать заспавнить новый объект в Map Editor, чтобы посмотреть, рабочие ли объекты, полученные таким образом.
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: daniel_360 от Январь 17, 2020, 02:46:02 pm
Да, спасибо, попробую!
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Saint от Январь 25, 2020, 05:58:48 pm
Ну, остается только ковырять устройство этого опкода.
А "не совсем то что нужно" - это из-за ограниченного количества заменяемых объектов? Мб проще взломать этот лимит(понятное дело, что речь не о сейвах, но просто для стабильной работы игры)?

ещё бы знать где он...

.text:00459E19                         ; ---------------------------------------------------------------------------
.text:00459E19
.text:00459E19                         loc_459E19:                             ; CODE XREF: CRunningScript::ProcessCommands900To999(int)+22j
.text:00459E19                                                                 ; DATA XREF: .data:0068A020o
.text:00459E19 8D 45 10                                lea     eax, [ebp+10h]  ; jumptable 00458EE2 case 50
.text:00459E1C 89 E9                                   mov     ecx, ebp
.text:00459E1E 6A 06                                   push    6
.text:00459E20 50                                      push    eax
.text:00459E21 E8 EA 71 FF FF                          call    CRunningScript::CollectParameters(uint *,short)
.text:00459E26 D9 05 38 74 7D 00                       fld     ds:scm_params_1
.text:00459E2C D9 5C 24 7C                             fstp    [esp+218h+var_19C]
.text:00459E30 D9 05 3C 74 7D 00                       fld     ds:scm_params_2
.text:00459E36 D9 9C 24 94 00 00 00                    fstp    [esp+218h+var_184]
.text:00459E3D D9 05 40 74 7D 00                       fld     ds:scm_params_3
.text:00459E43 D9 9C 24 AC 00 00 00                    fstp    [esp+218h+var_16C]
.text:00459E4A D9 84 24 AC 00 00 00                    fld     [esp+218h+var_16C]
.text:00459E51 D8 1D D4 9C 68 00                       fcomp   flt_689CD4
.text:00459E57 DF E0                                   fnstsw  ax
.text:00459E59 F6 C4 04                                test    ah, 4
.text:00459E5C 75 24                                   jnz     short loc_459E82
.text:00459E5E 80 E4 45                                and     ah, 45h
.text:00459E61 F6 C4 41                                test    ah, 41h
.text:00459E64 74 1C                                   jz      short loc_459E82
.text:00459E66 FF B4 24 94 00 00 00                    push    [esp+218h+var_184]
.text:00459E6D FF B4 24 80 00 00 00                    push    [esp+21Ch+var_19C]
.text:00459E74 E8 C7 B6 07 00                          call    CWorld::FindGroundZForCoord(float,float)
.text:00459E79 D9 9C 24 B4 00 00 00                    fstp    [esp+220h+var_16C]
.text:00459E80 59                                      pop     ecx
.text:00459E81 59                                      pop     ecx
.text:00459E82
.text:00459E82                         loc_459E82:                             ; CODE XREF: CRunningScript::ProcessCommands900To999(int)+F9Cj
.text:00459E82                                                                 ; CRunningScript::ProcessCommands900To999(int)+FA4j
.text:00459E82 D9 05 44 74 7D 00                       fld     ds:scm_params_4
.text:00459E88 D9 5C 24 3C                             fstp    [esp+218h+var_1DC]
.text:00459E8C D9 05 E4 9C 68 00                       fld     flt_689CE4
.text:00459E92 D8 4C 24 3C                             fmul    [esp+218h+var_1DC]
.text:00459E96 8B 3D 48 74 7D 00                       mov     edi, ds:scm_params_5
.text:00459E9C 31 ED                                   xor     ebp, ebp
.text:00459E9E 85 FF                                   test    edi, edi
.text:00459EA0 D9 5C 24 38                             fstp    [esp+218h+var_1E0]
.text:00459EA4 7D 12                                   jge     short loc_459EB8
.text:00459EA6 F7 DF                                   neg     edi
.text:00459EA8 8D 04 FD 00 00 00 00                    lea     eax, ds:0[edi*8]
.text:00459EAF 29 F8                                   sub     eax, edi
.text:00459EB1 8B 3C 85 E0 1D 7D 00                    mov     edi, ds:dword_7D1DE0[eax*4]
.text:00459EB8
.text:00459EB8                         loc_459EB8:                             ; CODE XREF: CRunningScript::ProcessCommands900To999(int)+FE4j
.text:00459EB8 8B 35 4C 74 7D 00                       mov     esi, ds:scm_params_6
.text:00459EBE 85 F6                                   test    esi, esi
.text:00459EC0 7D 12                                   jge     short loc_459ED4
.text:00459EC2 F7 DE                                   neg     esi
.text:00459EC4 8D 04 F5 00 00 00 00                    lea     eax, ds:0[esi*8]
.text:00459ECB 29 F0                                   sub     eax, esi
.text:00459ECD 8B 34 85 E0 1D 7D 00                    mov     esi, ds:dword_7D1DE0[eax*4]
.text:00459ED4
.text:00459ED4                         loc_459ED4:                             ; CODE XREF: CRunningScript::ProcessCommands900To999(int)+1000j
.text:00459ED4 8B 44 24 7C                             mov     eax, [esp+218h+var_19C]
.text:00459ED8 89 FB                                   mov     ebx, edi
.text:00459EDA 89 84 24 B4 01 00 00                    mov     [esp+218h+var_64], eax
.text:00459EE1 8B 84 24 AC 00 00 00                    mov     eax, [esp+218h+var_16C]
.text:00459EE8 89 84 24 BC 01 00 00                    mov     [esp+218h+var_5C], eax
.text:00459EEF 8D 84 24 18 01 00 00                    lea     eax, [esp+218h+var_102+2]
.text:00459EF6 6A 00                                   push    0               ; char
.text:00459EF8 6A 00                                   push    0               ; char
.text:00459EFA 6A 00                                   push    0               ; char
.text:00459EFC 6A 00                                   push    0               ; char
.text:00459EFE 6A 01                                   push    1               ; char
.text:00459F00 50                                      push    eax             ; int
.text:00459F01 8D 84 24 2E 01 00 00                    lea     eax, [esp+230h+var_102]
.text:00459F08 6A 10                                   push    10h             ; __int16
.text:00459F0A 50                                      push    eax             ; int
.text:00459F0B 8D 84 24 D4 01 00 00                    lea     eax, [esp+238h+var_64]
.text:00459F12 8B 8C 24 B4 00 00 00                    mov     ecx, [esp+238h+var_184]
.text:00459F19 6A 01                                   push    1               ; int
.text:00459F1B FF 74 24 60                             push    [esp+23Ch+var_1DC] ; float
.text:00459F1F 50                                      push    eax             ; int
.text:00459F20 53                                      push    ebx             ; int
.text:00459F21 89 8C 24 E8 01 00 00                    mov     [esp+248h+var_60], ecx
.text:00459F28 E8 43 C8 07 00                          call    CWorld::FindObjectsOfTypeInRange(uint,CVector  const&,float,bool,short *,short,CEntity **,bool,bool,bool,bool,bool)
.text:00459F2D 83 C4 30                                add     esp, 30h
.text:00459F30 66 83 BC 24 16 01 00 00+                cmp     [esp+218h+var_102], 0
.text:00459F39 75 55                                   jnz     short loc_459F90
.text:00459F3B 8B 44 24 7C                             mov     eax, [esp+218h+var_19C]
.text:00459F3F 8D 8C 24 18 01 00 00                    lea     ecx, [esp+218h+var_102+2]
.text:00459F46 89 84 24 C0 01 00 00                    mov     [esp+218h+var_58], eax
.text:00459F4D 8B 84 24 AC 00 00 00                    mov     eax, [esp+218h+var_16C]
.text:00459F54 89 84 24 C8 01 00 00                    mov     [esp+218h+var_50], eax
.text:00459F5B 8D 84 24 16 01 00 00                    lea     eax, [esp+218h+var_102]
.text:00459F62 51                                      push    ecx             ; int
.text:00459F63 8B 94 24 98 00 00 00                    mov     edx, [esp+21Ch+var_184]
.text:00459F6A 6A 10                                   push    10h             ; __int16
.text:00459F6C 50                                      push    eax             ; int
.text:00459F6D 8D 84 24 CC 01 00 00                    lea     eax, [esp+224h+var_58]
.text:00459F74 6A 01                                   push    1               ; char
.text:00459F76 FF 74 24 4C                             push    [esp+228h+var_1DC] ; float
.text:00459F7A 50                                      push    eax             ; int
.text:00459F7B 89 94 24 DC 01 00 00                    mov     [esp+230h+var_54], edx
.text:00459F82 68 FC 85 97 00                          push    offset dword_9785FC ; int
.text:00459F87 53                                      push    ebx             ; int
.text:00459F88 E8 13 C7 07 00                          call    CWorld::FindObjectsOfTypeInRangeSectorList(uint,CPtrList &,CVector  const&,float,bool,short *,short,CEntity **)
.text:00459F8D 83 C4 20                                add     esp, 20h
.text:00459F90
.text:00459F90                         loc_459F90:                             ; CODE XREF: CRunningScript::ProcessCommands900To999(int)+1079j
.text:00459F90 66 83 BC 24 16 01 00 00+                cmp     [esp+218h+var_102], 0
.text:00459F99 0F 85 98 00 00 00                       jnz     loc_45A037
.text:00459F9F 8B 44 24 7C                             mov     eax, [esp+218h+var_19C]
.text:00459FA3 8B 8C 24 94 00 00 00                    mov     ecx, [esp+218h+var_184]
.text:00459FAA 89 84 24 58 01 00 00                    mov     [esp+218h+var_C0], eax
.text:00459FB1 8B 84 24 AC 00 00 00                    mov     eax, [esp+218h+var_16C]
.text:00459FB8 89 84 24 60 01 00 00                    mov     [esp+218h+var_B8], eax
.text:00459FBF 8D 84 24 58 01 00 00                    lea     eax, [esp+218h+var_C0]
.text:00459FC6 50                                      push    eax
.text:00459FC7 89 8C 24 60 01 00 00                    mov     [esp+21Ch+var_BC], ecx
.text:00459FCE E8 2D 33 08 00                          call    CTheZones::GetLevelFromPosition(CVector  const*)
.text:00459FD3 0F BF C0                                movsx   eax, ax
.text:00459FD6 8B 94 24 80 00 00 00                    mov     edx, [esp+21Ch+var_19C]
.text:00459FDD 59                                      pop     ecx
.text:00459FDE 8B 8C 24 94 00 00 00                    mov     ecx, [esp+218h+var_184]
.text:00459FE5 89 94 24 CC 01 00 00                    mov     [esp+218h+var_4C], edx
.text:00459FEC 8B 94 24 AC 00 00 00                    mov     edx, [esp+218h+var_16C]
.text:00459FF3 89 8C 24 D0 01 00 00                    mov     [esp+218h+var_48], ecx
.text:00459FFA 8D 8C 24 18 01 00 00                    lea     ecx, [esp+218h+var_102+2]
.text:0045A001 89 94 24 D4 01 00 00                    mov     [esp+218h+var_44], edx
.text:0045A008 8D 04 85 00 00 00 00                    lea     eax, ds:0[eax*4]
.text:0045A00F 51                                      push    ecx             ; int
.text:0045A010 05 FC 85 97 00                          add     eax, offset dword_9785FC
.text:0045A015 8D 94 24 1A 01 00 00                    lea     edx, [esp+21Ch+var_102]
.text:0045A01C 8D 8C 24 D0 01 00 00                    lea     ecx, [esp+21Ch+var_4C]
.text:0045A023 6A 10                                   push    10h             ; __int16
.text:0045A025 52                                      push    edx             ; int
.text:0045A026 6A 01                                   push    1               ; char
.text:0045A028 FF 74 24 4C                             push    [esp+228h+var_1DC] ; float
.text:0045A02C 51                                      push    ecx             ; int
.text:0045A02D 50                                      push    eax             ; int
.text:0045A02E 53                                      push    ebx             ; int
.text:0045A02F E8 6C C6 07 00                          call    CWorld::FindObjectsOfTypeInRangeSectorList(uint,CPtrList &,CVector  const&,float,bool,short *,short,CEntity **)
.text:0045A034 83 C4 20                                add     esp, 20h
.text:0045A037
.text:0045A037                         loc_45A037:                             ; CODE XREF: CRunningScript::ProcessCommands900To999(int)+10D9j
.text:0045A037 31 D2                                   xor     edx, edx
.text:0045A039 D9 EE                                   fldz
.text:0045A03B D9 EE                                   fldz
.text:0045A03D D9 EE                                   fldz
.text:0045A03F EB 6D                                   jmp     short loc_45A0AE
.text:0045A041                         ; ---------------------------------------------------------------------------
.text:0045A041
.text:0045A041                         loc_45A041:                             ; CODE XREF: CRunningScript::ProcessCommands900To999(int)+11FBj
.text:0045A041 0F B7 DA                                movzx   ebx, dx
.text:0045A044 8B 84 9C 18 01 00 00                    mov     eax, dword ptr [esp+ebx*4+218h+var_102+2]
.text:0045A04B 83 C0 34                                add     eax, 34h
.text:0045A04E D9 40 08                                fld     dword ptr [eax+8]
.text:0045A051 D8 A4 24 AC 00 00 00                    fsub    [esp+218h+var_16C]
.text:0045A058 DD D9                                   fstp    st(1)
.text:0045A05A D9 40 04                                fld     dword ptr [eax+4]
.text:0045A05D D8 A4 24 94 00 00 00                    fsub    [esp+218h+var_184]
.text:0045A064 DD DA                                   fstp    st(2)
.text:0045A066 D9 00                                   fld     dword ptr [eax]
.text:0045A068 D8 64 24 7C                             fsub    [esp+218h+var_19C]
.text:0045A06C DD DB                                   fstp    st(3)
.text:0045A06E D9 C1                                   fld     st(1)
.text:0045A070 D8 C8                                   fmul    st, st
.text:0045A072 D9 C3                                   fld     st(3)
.text:0045A074 D8 C8                                   fmul    st, st
.text:0045A076 DE C1                                   faddp   st(1), st
.text:0045A078 D9 C1                                   fld     st(1)
.text:0045A07A D8 C8                                   fmul    st, st
.text:0045A07C DE C1                                   faddp   st(1), st
.text:0045A07E D9 FA                                   fsqrt
.text:0045A080 D9 9C 24 B8 00 00 00                    fstp    [esp+218h+var_160]
.text:0045A087 D9 84 24 B8 00 00 00                    fld     [esp+218h+var_160]
.text:0045A08E DD DB                                   fstp    st(3)
.text:0045A090 D9 C2                                   fld     st(2)
.text:0045A092 D8 5C 24 38                             fcomp   [esp+218h+var_1E0]
.text:0045A096 DF E0                                   fnstsw  ax
.text:0045A098 80 E4 05                                and     ah, 5
.text:0045A09B 80 FC 01                                cmp     ah, 1
.text:0045A09E 75 0D                                   jnz     short loc_45A0AD
.text:0045A0A0 D9 C2                                   fld     st(2)
.text:0045A0A2 D9 5C 24 38                             fstp    [esp+218h+var_1E0]
.text:0045A0A6 8B AC 9C 18 01 00 00                    mov     ebp, dword ptr [esp+ebx*4+218h+var_102+2]
.text:0045A0AD
.text:0045A0AD                         loc_45A0AD:                             ; CODE XREF: CRunningScript::ProcessCommands900To999(int)+11DEj
.text:0045A0AD 42                                      inc     edx
.text:0045A0AE
.text:0045A0AE                         loc_45A0AE:                             ; CODE XREF: CRunningScript::ProcessCommands900To999(int)+117Fj
.text:0045A0AE 0F BF 8C 24 16 01 00 00                 movsx   ecx, [esp+218h+var_102]
.text:0045A0B6 0F B7 C2                                movzx   eax, dx
.text:0045A0B9 39 C8                                   cmp     eax, ecx
.text:0045A0BB 7C 84                                   jl      short loc_45A041
.text:0045A0BD 85 ED                                   test    ebp, ebp
.text:0045A0BF 74 1F                                   jz      short loc_45A0E0
.text:0045A0C1 DE D9                                   fcompp
.text:0045A0C3 89 E9                                   mov     ecx, ebp
.text:0045A0C5 56                                      push    esi
.text:0045A0C6 DD D8                                   fstp    st
.text:0045A0C8 E8 E3 DC FA FF                          call    CBuilding::ReplaceWithNewModel(int)
.text:0045A0CD 56                                      push    esi
.text:0045A0CE 57                                      push    edi
.text:0045A0CF 55                                      push    ebp
.text:0045A0D0 E8 BB EC FF FF                          call    CTheScripts::AddToBuildingSwapArray(CBuilding *,int,int)
.text:0045A0D5 83 C4 0C                                add     esp, 0Ch
.text:0045A0D8 EB 15                                   jmp     short loc_45A0EF
.text:0045A0D8                         ; ---------------------------------------------------------------------------
.text:0045A0DA 8D 80 00 00 00 00                       align 10h
.text:0045A0E0
.text:0045A0E0                         loc_45A0E0:                             ; CODE XREF: CRunningScript::ProcessCommands900To999(int)+11FFj
.text:0045A0E0 DE D9                                   fcompp
.text:0045A0E2 68 E8 9C 68 00                          push    offset aFailedToFindBu ; "Failed to find building\n"
.text:0045A0E7 DD D8                                   fstp    st
.text:0045A0E9 E8 12 6F FA FF                          call    _dbgprint
.text:0045A0EE 59                                      pop     ecx
.text:0045A0EF
.text:0045A0EF                         loc_45A0EF:                             ; CODE XREF: CRunningScript::ProcessCommands900To999(int)+1218j
.text:0045A0EF 30 C0                                   xor     al, al
.text:0045A0F1 81 C4 08 02 00 00                       add     esp, 208h
.text:0045A0F7 5D                                      pop     ebp
.text:0045A0F8 5F                                      pop     edi
.text:0045A0F9 5E                                      pop     esi
.text:0045A0FA 5B                                      pop     ebx
.text:0045A0FB C2 04 00                                retn    4
.text:0045A0FE                         ; ---------------------------------------------------------------------------
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Shagg_E от Январь 25, 2020, 06:45:46 pm
ещё бы знать где он...
По-моему, он в той функции, которая вызывается на 0x45A0D0.
Там(в AddToBuildingSwapArray) происходит запись в массив 0x94DBE8, из которого, если я правильно понял, позднее происходит запись в сейв-файл(и загрузка в дальнейшем). Кстати - из-за причудливого способа записи теперь понятно, мне кажется, откуда появлялись глюки, если загрузить сейв после замены на слегка измененной карте.
А вот чтобы разобрать это дело глубже - понадобится намного больше времени - сейчас его у меня, к сожалению, нет(но я планирую вернуться к этому в ближайший год). Надеюсь, написанное выше хоть немного помогло.
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Saint от Сентябрь 05, 2020, 03:22:57 pm
может кто помочь переписать опкоды 0363 и 03B6 в нормальный код?

хочется всё таки норм удалять объекты, а не подменять их, так как тем же опкодом 03B6 нельзя заменять объекты карты которые игрок может разрушить.
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: xanser от Сентябрь 06, 2020, 12:01:31 pm
0363 не вижу смысла переписывать, это просто отключение видимости, можно этого достичь просто Entity->SetRwObjectAlpha(0);
03B6 действительно меняет объект полностью вместе с колом. Если взять саму суть опкода, то она заключается всего в двух функциях, применяемых к объекту карты. Как перебрать все объекты и получить нужный Entity по id, я писал выше. Ну и как уже говорилось, массив таких сменяемых объектов всего 25 штук, нужно его переопределять, менять во всем коде ссылки на него.

Код: C++
  1. void CEntity::ReplaceWithNewModel(int id) {
  2.         ((void(__thiscall *)(CEntity *, int))0x407DB0)(this, id);
  3. };
  4. void CTheScripts::AddToBuildingSwapArray(CEntity entity, int old_id, int new_id) {
  5.         ((void(__cdecl *)(CEntity, int, int))0x458D90)(entity, old_id, new_id);
  6. }
  7.  
  8. Entity->ReplaceWithNewModel(new_id);
  9. CTheScripts::AddToBuildingSwapArray(*Entity, old_id, new_id);
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Saint от Сентябрь 06, 2020, 01:38:51 pm
спасибо за ответ, но всё же

в опкоде по замене моделей перед его вызовом я просто занупил  вызов
.text:0045A0D0 E8 BB EC FF FF                          call    CTheScripts::AddToBuildingSwapArray(CBuilding *,int,int)
и тем самым у меня получилось менять на карте более 25 объектов

но как я говорил выше мне нужно не замена, а именно удаление, т.к. опкод не может менять ломающиеся объекты типо фонарных столбов и т.д.

можешь пожалуйста привести пример как удалить допустим так называемый шлагбаум на военной базе?

379, smashbar, 0, -1721.86, -293.002, 15.1086, 1, 1, 1, -0.707107, -0.707107, 4.4827E-8, 4.4827E-8

может конечно то что нельзя подменять ломающиеся объекты както задаётся в этих функциях

.text:00459F28 E8 43 C8 07 00                          call    CWorld::FindObjectsOfTypeInRange(uint,CVector  const&,float,bool,short *,short,CEntity **,bool,bool,bool,bool,bool)
.text:00459F88 E8 13 C7 07 00                          call    CWorld::FindObjectsOfTypeInRangeSectorList(uint,CPtrList &,CVector  const&,float,bool,short *,short,CEntity **)
.text:0045A02F E8 6C C6 07 00                          call    CWorld::FindObjectsOfTypeInRangeSectorList(uint,CPtrList &,CVector  const&,float,bool,short *,short,CEntity **)

если я правильно понимаю то CEntity ** это как раз для получения указателя на найденный объект карты?
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: xanser от Сентябрь 06, 2020, 06:46:10 pm
Видимо кишки опкода не дают тебе заменять столбы и шлагбаумы, поэтому весь код тебе не нужен, а только функция CEntity::ReplaceWithNewModel(). Во вложении пример замены столбов на светофоры при их первом появлении. Кстати кроме объекта ты можешь там же поменять и его координаты. Заметил, что свойства нового объекта остаются теми же, что были у старого. А как удалять объект полностью с карты, я не знаю.
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: Saint от Сентябрь 06, 2020, 11:36:29 pm
Видимо кишки опкода не дают тебе заменять столбы и шлагбаумы, поэтому весь код тебе не нужен, а только функция CEntity::ReplaceWithNewModel(). Во вложении пример замены столбов на светофоры при их первом появлении. Кстати кроме объекта ты можешь там же поменять и его координаты. Заметил, что свойства нового объекта остаются теми же, что были у старого. А как удалять объект полностью с карты, я не знаю.

хорошо, спасибо
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: daniel_360 от Май 26, 2021, 09:45:42 pm
Здравствуйте, решил опять вернуться к теме с кранами. Откуда начать нопить вызов функции поворота крана?
Название: Re: Как удалять (редактировать) объекты карты
Отправлено: xanser от Июнь 01, 2021, 11:22:29 am
Попробуй отсюда 0x5A937F CCrane::Update