Объявления

Форум о Героях Меча и Магии и King's Bounty. Если Вы любите эти игры, мы будем рады видеть Вас в наших рядах. :smile2:

Как создать плагин для HD мода

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineas239  
Мастер
Мастер
 
Сообщения: 323
Зарегистрирован: 29 дек 2018, 14:17
Пол: Не указан
Поблагодарили: 13 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 16 дек 2019, 08:44

Сделать чтобы односторонний вход работал как двусторонний у меня получилось.
А вот как сделать чтобы односторонние выходы вообще не генерились?

Пытаюсь сделать так в 0x549E20:
Код: Выделить всё
   H3Vector<RMG_ObjectProps**> vmon1_enter = rmg->objectPrototypes[43];
   H3Vector<RMG_ObjectProps**> vmon1_exit = rmg->objectPrototypes[44];
   H3Vector<RMG_ObjectProps**> vmon2 = rmg->objectPrototypes[45];

   for (size_t i = 0; i < vmon1_enter.Count(); i++)
   {
      RMG_ObjectProps* mon = **vmon1_enter[i];
      
       mon->type = MONOLITH_TWO_WAY;
      mon->subtype = mon->subtype+8;

      RMG_ObjectProps** monadd = *vmon1_enter[i];

      vmon2.Push(monadd);

   }
   vmon1_enter.RemoveAll();
   vmon1_exit.RemoveAll();


Т.е. односторонние входы переношу в вектор двусторонних монолитов.
И потом очищаю оба вектора односторонних монолитов.
Результат - односторонние входы работают как двусторонние, здесь все ок, однако односторонние выходы по-прежнему генерятся.
Вернуться к началу

offlineRoseKavalier  
Подмастерье
Подмастерье
 
Сообщения: 171
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 141 раз.

Re: Как создать плагин для HD мода

Сообщение RoseKavalier » 17 дек 2019, 20:47

I'm not super certain of the question here. Do you mean the portal appearance or you'd rather simply create 16 two-way portals?
I'm not certain how that would work with DEF visuals, I have not checked where the RMG sets which asset name to use.
Вернуться к началу

offlineas239  
Мастер
Мастер
 
Сообщения: 323
Зарегистрирован: 29 дек 2018, 14:17
Пол: Не указан
Поблагодарили: 13 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 18 дек 2019, 05:55

Yes, I want to have 16 two-way portals.
I made the one-way enters works as two-way portals.
But I need to get rid of one-way exits.
Вернуться к началу

offlineRoseKavalier  
Подмастерье
Подмастерье
 
Сообщения: 171
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 141 раз.

Re: Как создать плагин для HD мода

Сообщение RoseKavalier » 18 дек 2019, 13:20

What I can think of is to change defNumber within your current loop, have the one-way exits defNumber be changed to matching one-way entrances' defNumber.
There should be a way to change the def names themselves but I don't have time to check where they are stored.

You can look up homm3tools if you want more information, there is good info about h3m, which this data eventually represents.
Вернуться к началу

offlineas239  
Мастер
Мастер
 
Сообщения: 323
Зарегистрирован: 29 дек 2018, 14:17
Пол: Не указан
Поблагодарили: 13 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 18 дек 2019, 14:55

Thanks!
It seems, it works:

Код: Выделить всё
   H3Vector<RMG_ObjectProps**> vmon1_enter = rmg->objectPrototypes[43];
   H3Vector<RMG_ObjectProps**> vmon1_exit = rmg->objectPrototypes[44];
   for (size_t i = 0; i < vmon1_enter.Count(); i++)
   {
      RMG_ObjectProps* mon = **vmon1_enter[i];
      
           mon->type = MONOLITH_TWO_WAY;
      mon->subtype = mon->subtype+8;

      RMG_ObjectProps* mon_exit = **vmon1_exit[i];
      mon_exit->type = 0;
      mon_exit->subtype = 0;
      mon_exit->defNumber = 0;
   }
Вернуться к началу

offlineRoseKavalier  
Подмастерье
Подмастерье
 
Сообщения: 171
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 141 раз.

Re: Как создать плагин для HD мода

Сообщение RoseKavalier » 18 дек 2019, 16:18

That seems incorrect at a glance, def #0 is usually "default.def".

Unless I am mistaken, you want one-way exits to look like one-way entrances?
Код: Выделить всё
for (size_t i = 0; i < vmon1_enter.Count(); ++i)
   {
      auto& exits = **vmon1_exit[i];
      auto& entrance = **vmon1_enter[i];

      exits.defNumber = entrance.defNumber; // make exit look like entry
      exits.type = NH3Objects::MONOLITH_TWO_WAY; // make exit a 2-way
      exits.subtype += 8; // increase subtype by 8

      entrance.subtype += 8;
      entrance.type = NH3Objects::MONOLITH_TWO_WAY;
   }


Code may be a bit different because I modified H3Vector[] to give reference(&) instead of pointer(*).
Вернуться к началу

offlineas239  
Мастер
Мастер
 
Сообщения: 323
Зарегистрирован: 29 дек 2018, 14:17
Пол: Не указан
Поблагодарили: 13 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 19 дек 2019, 06:09

I tried this code and got 4-way portal:

 
Изображение


My code gives 2-way portal as needed:

 
Изображение


Hmm, in the debug mod that string:
Код: Выделить всё
  H3Vector<RMG_ObjectProps**> vmon1_enter = rmg->objectPrototypes[43];

causes that error:
 
Изображение

In the release mod its ok.
Вернуться к началу

offlineRoseKavalier  
Подмастерье
Подмастерье
 
Сообщения: 171
Зарегистрирован: 23 сен 2017, 17:00
Пол: Не указан
Поблагодарили: 141 раз.

Re: Как создать плагин для HD мода

Сообщение RoseKavalier » 19 дек 2019, 13:30

Just wanted to make it clear that you are removing RMG's planned connections and instead creating new connections with your code.

If RMG did...
A -> B
and
C -> D

Now your code makes
A <-> C
With no possible access to B or D.

This potentially invokes a deep-copy as both sides of the equality are H3Vector<T>.
This means you are making a new vector with identical contents, but in different spots.

The alternative is you copy the addresses of the original vector (shallow copy)... in this case you are editing the correct data,
but when your copy loses context (when no longer used), ~H3Vector() destructor is called and it will free all memory held by original vector, great risk of garbage data or crash.
Код: Выделить всё
H3Vector<RMG_ObjectProps**> vmon1_enter = rmg->objectPrototypes[43];


Unless you really need to, I suggest working with reference
Код: Выделить всё
H3Vector<RMG_ObjectProps**>& vmon1_enter = rmg->objectPrototypes[43];

or pointer
Код: Выделить всё
H3Vector<RMG_ObjectProps**>* vmon1_enter = &rmg->objectPrototypes[43];


Any modifications made on a copy will not be made on the original.
With reference/pointer, you ensure faster code execution and also guarantee you can modify what you want to.
Вернуться к началу

offlineas239  
Мастер
Мастер
 
Сообщения: 323
Зарегистрирован: 29 дек 2018, 14:17
Пол: Не указан
Поблагодарили: 13 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 19 дек 2019, 17:14

Thank you very much for the detailed explanation, it is very useful for me.
Вернуться к началу

offlineas239  
Мастер
Мастер
 
Сообщения: 323
Зарегистрирован: 29 дек 2018, 14:17
Пол: Не указан
Поблагодарили: 13 раз.

Re: Как создать плагин для HD мода

Сообщение as239 » 20 дек 2019, 07:55

RoseKavalier писал(а):

That seems incorrect at a glance, def #0 is usually "default.def".

Unless I am mistaken, you want one-way exits to look like one-way entrances?
Код: Выделить всё
for (size_t i = 0; i < vmon1_enter.Count(); ++i)
   {
      auto& exits = **vmon1_exit[i];
      auto& entrance = **vmon1_enter[i];

      exits.defNumber = entrance.defNumber; // make exit look like entry
      exits.type = NH3Objects::MONOLITH_TWO_WAY; // make exit a 2-way
      exits.subtype += 8; // increase subtype by 8

      entrance.subtype += 8;
      entrance.type = NH3Objects::MONOLITH_TWO_WAY;
   }


Code may be a bit different because I modified H3Vector[] to give reference(&) instead of pointer(*).


There is one problem with this code - one way exits havn't guards.

Update;
And looks like RMG has different logic for one and two way portals vectors.
One way portal has more connections.
So with this code i have surplus connections.
This code works - there are no any one way portals:
Код: Выделить всё
   H3Vector<RMG_ObjectProps**> &vmon1_enter = rmg->objectPrototypes[43];
   H3Vector<RMG_ObjectProps**> &vmon1_exit = rmg->objectPrototypes[44];
   vmon1_enter.RemoveAll();
   vmon1_exit.RemoveAll();


So i just need to know how to add one way portal to the two way portals vector.

Код: Выделить всё
   H3Vector<RMG_ObjectProps**> &vmon1_enter = rmg->objectPrototypes[43];
   H3Vector<RMG_ObjectProps**> &vmon1_exit = rmg->objectPrototypes[44];
   H3Vector<RMG_ObjectProps**> &vmon2 = rmg->objectPrototypes[45];
   for (size_t i = 0; i < vmon1_enter.Count(); i++)
   {
      auto& entrance = **vmon1_enter[i];
      entrance->subtype += 8;
      entrance->type = MONOLITH_TWO_WAY;

      vmon2.Push(entrance);//this string is wrong, what is the correct syntax?      
   }
Вернуться к началу

Пред.След.

Вернуться в Общий раздел

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron