Объявления
Поздравляем
Roman2211


Друзья, если не получается зарегистрироваться, напишите на почту vdv_forever@bk.ru.
Я оторву свою задницу от всех дел и обязательно Вас активирую! :smile10:
Добро пожаловать на геройский форум! :smile25:

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

Герои Меча и Магии III: Возрождение Эрафии, Герои Меча и Магии III Дыхание Смерти, Герои Меча и Магии III Клинок Армагеддона, Герои Меча и Магии III Хроники Героев
offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 04 мар 2021, 13:09

В SoD_SP он также не восстанавливается?
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

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

Сообщение AlexSpl » 04 мар 2021, 14:33

Если вызывается функция SplitCreatures(), то да. Особого смысла воcстанавливать seed нет. Например, мы что-то сделали в конце недели, что фиксирует seed (например, получили уровень), пропустили ход, наступила неделя A. Ничего не сделали, пропустили ход, наступила неделя B. Загрузили другой сейв, немножко поиграли, надоело, загрузили снова старый, пропустили ход, наступила неделя C. Т.е. видим, что на seed не только наш "лишний" вызов Randint() влияет, а посему заморачиваться нет смысла.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 04 мар 2021, 18:58

AlexSpl писал(а):

Случаи, когда число существ меньше, чем число отрядов, на которое они должны поделиться

Решил так:
Код: Выделить всё
if (defArmy->count[0] < stackCount) stackCount = defArmy->count[0];


AlexSpl писал(а):

а также когда грейд есть, но существа уже грейженые или не имеют грейда

Вот это не совсем понятно. В моем случае только Банки существ + Утопия + Склеп + 2 Корабля + Заброшенная шахта + Пирамида.
Я же разбивку сущеcтв на отряды для всех не делаю, только для объектов перечисленных выше. В некоторых сокровищницах может быть один грейженный отряд, в Улей змиев могут быть все. Но вроде все верно отображает. А среди не сокровищниц у меня одна Заброшенная шахта. Но там вроде только один грейженный стек может быть. Чтобы все, такого не видел. Короче я вас в данном случае не понял, что вы хотели донести и что мне нужно доделать.

И последний момент остался.

AlexSpl писал(а):

Проверил. Используется. Но Visited с точки зрения игры означает, что Пирамида пустая. У Склепа эта инфа хотя бы не отображается. Стоп :smile1: А нам какая разница вообще? Мы просто переопределим понятие Visited. Для других игроков она всё равно не будет Visited. А отличать Visted в нашем понимании от Visited в понимании игры можно просто по отсутствию охраны (& 1).


AlexSpl писал(а):

Поставить хук туда, где добавляется "\n\n(Visited)" и переписать сообщение на своё. Завтра гляну.


Как оказалось, нам доп хук ставить ненужно. Мы все можем делать в хуке showGuardsRMB. В showPyramid мы ставим флаг посещения mapItem->SetAsVisited(o_GameMgr->GetMeID()), а в showGuardsRMB отслеживаем его состояние. В случае Visited в нашем понимании мы переписываем оригинальное сообщение нашим.

Код: Выделить всё
if (mapItem->IsVisited(o_GameMgr->GetMeID()))
{
   string str = "Здесь_нужна_функция_которая_вернет_название_объекта_(Пирамиды)" + "\n\n";
   str = str + (204 строка из GENRLTXT.TXT) + (186 строка из ARRAYTXT.TXT) + o_CreatureInfo[CID_DIAMOND_GOLEM].name_plural + "; " + (186 строка из ARRAYTXT.TXT) + o_CreatureInfo[CID_GOLD_GOLEM].name_plural;
   sprintf(o_TextBuffer, "%s", str.c_str());
   c->ecx = (int)o_TextBuffer;
}


Нужна помощь по этим пунктам:
1) Функция, которая вернет название объекта по ПКМ (в нашем случаи Пирамиды).
2) Текст строки 204 из файла GENRLTXT.TXT (чтобы плагин автоматически брал этот текст из указанного файла и заданной строки).
3) Текст строки 186 из файла ARRAYTXT.TXT.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

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

Сообщение AlexSpl » 05 мар 2021, 07:04

o_GENRLTXT_TXT уже определено, o_ARRAYTXT_TXT (или просто o_ARRAYTXT) я определял в одном примере (должно найтись поиском по форуму), а о_OBJNAMES_TXT определяется так же (только адрес 0x6A7A50).
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 05 мар 2021, 08:38

Спасибо. Почти разобрался.

Код: Выделить всё
#define o_ARRAY_TXT (*(_TXTEX_**)0x6A60AC)
#define о_OBJNAMES_TXT (*(_TXTEX_**)0x6A7A50)
...
struct _TXTEX_ : public _TXT_ {
   inline void SetString(int index, char* str)
   {
      *(char**)(*(int*)((int)this + 32) + index * 4) = str;
   }
};
...
if (mapItem->IsVisited(o_GameMgr->GetMeID()))
{
   // string str = "Пирамида";
   string str = о_OBJNAMES_TXT->GetString(63);   
   str = str + "\n\n" + o_GENRLTXT_TXT->GetString(203) + " " + o_ARRAY_TXT->GetString(185) + " " + o_CreatureInfo[CID_DIAMOND_GOLEM].name_plural + "; " + o_ARRAY_TXT->GetString(185) + " " + o_CreatureInfo[CID_GOLD_GOLEM].name_plural;
   sprintf(o_TextBuffer, "%s", str.c_str());
   c->ecx = (int)o_TextBuffer;
}


Но есть проблема с о_OBJNAMES_TXT. При этом с o_GENRLTXT_TXT и o_ARRAY_TXT все тянет нормально, а вот с о_OBJNAMES_TXT почему-то не хочет, вылетает. Может что-то с адресом не то...
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

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

Сообщение AlexSpl » 05 мар 2021, 08:54

То, что по адресу 0x6A7A50 названия объектов - это 100%. Может, метод GetString() другой нужен. Попробуйте напрямую прочитать: *(char**)(0x6A7A50 + ID * 4); Да, может, ID на единицу больше брать нужно. "Nothing" начинается не с 0, а с 1.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

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

Сообщение AlexSpl » 05 мар 2021, 09:11

Для тех, кто не не понимает запись *(_type_*)address. Мы читаем то, что записано по адресу address в оперативной памяти игры и считаем это прочитанное имеющим тип _type_. Например, *(char**)0x6A7A50. Мы читаем то, что записано по адресу 0x6A7A50 и считаем, что это null-terminated строка (_type_ = char*).
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 05 мар 2021, 09:22

AlexSpl писал(а):

То, что по адресу 0x6A7A50 названия объектов - это 100%. Может, метод GetString() другой нужен. Попробуйте напрямую прочитать: *(char**)(0x6A7A50 + ID * 4); Да, может, ID на единицу больше брать нужно. "Nothing" начинается не с 0, а с 1.

Вот так заработало:
Код: Выделить всё
string str = *(char**)(0x6A7A50 + 64 * 4);

Странно, что не напрямую не хотело. А ведь o_ARRAY_TXT норм читался.
Вернуться к началу

offlineАватара пользователя
AlexSpl  
имя: Александр
Эксперт
Эксперт
 
Сообщения: 5587
Зарегистрирован: 17 сен 2010, 12:58
Пол: Мужчина
Награды: 14
Высшая медаль (1) Победителю турнира по HMM1_TE (2) Победителю этапа по HMM1 (1) Победителю этапа по HMM2 (1) Лучшему из лучших (1) 2 место 1 этапа по HMM1 (1)
3 место 1 этапа по HMM1 (1) 1 место 2 этапа по HMM2 (1) Победителю турнира по KB (2) Победителю турнира по KB (1) Грандмастер оффлайн-турниров (1) Боевой шлем (1)
Поблагодарили: 2185 раз.

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

Сообщение AlexSpl » 05 мар 2021, 09:26

Цитата:
Странно, что не напрямую не хотело.

Дело в методе. Если нужна универсальность, то есть o_LoadTXT("имя ресурса")->GetString(). Только этот метод будет каждый раз подгружать текстовик, что не есть хорошо.
Вернуться к началу

offlineRolex  
имя: Alex
Ветеран
Ветеран
 
Сообщения: 898
Зарегистрирован: 22 сен 2020, 18:58
Откуда: УКРАИНА
Пол: Мужчина
Поблагодарили: 53 раз.

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

Сообщение Rolex » 05 мар 2021, 12:22

Ясно. Такс меня сейчас очень интересует такой момент. Насколько мне известно у каждого заклинания есть определенная вероятность выпадения. Так вот, по идее если изменить эту верояность на 100% для определенного заклинания, то это заклинание при постройки Гильдии магов того уровня к которому оно относится будет появлятся со 100%-вероятностью, то есть будет всегда. Так вот, мне сейчас нужно сделать, чтобы Медлительность и Городской портал выпадали со 100%-вероятностью. AlexSpl, подскажите, пжл, как можно через плагин к моду изменить эту вероятность для этих заклинаний?

И если все так, как я думаю, то как бы у нас кол-во слотов под заклинания определенного уровня в Гильдии магов строго меньше чем всевозможных заклинаний этого уровня. И если, например, мы установим 100% шанс такому кол-ву заклинаний одного уровня, которое будет строго больше чем кол-во слотов для заклинаний этого уровня в Гильдии магов, то по какому принципу они тогда будут отбиратся? Беруться все заклинания со 100%-вероятностью и среди них выбирается нужное кол-во случайным образом?
Вернуться к началу

Пред.След.

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

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

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