IPB

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V  < 1 2  
Reply to this topicStart new topic
> Хуки на исполняемый код из ERA
Richter
сообщение 21 Jan 2019, 05:53 (Сообщение отредактировал Richter - 21 Jan 2019, 05:59)
Сообщение #21

collector of time
Сообщений: 159
Спасибо сказали: 73 раза




Цитата(XEPOMAHT @ 21 Jan 2019, 02:00) *
Можно и поставить хук на 4Е1F2А...


Вылет "без объяснения причин".
Цитата(XEPOMAHT @ 21 Jan 2019, 02:00) *
...в нужном тебе триггере получаешь адреса следующих данных: HeroSpecWoG[номер_твоего_героя].SpecPicInd[0] и HeroSpecWoG[номер_твоего_героя].SpecPicInd[1] и заменяешь в них номера картинок специализаций.

Как это делается? Триггер !?CM2;


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
XEPOMAHT
сообщение 21 Jan 2019, 09:46
Сообщение #22

---------------------- New_Life_of_Heroes ----------------------
Сообщений: 223
Спасибо сказали: 342 раза




Цитата(Richter @ 21 Jan 2019, 05:53) *
Вылет "без объяснения причин".


Написано ж, хук на 4Е1F2А. Зачем вы поставили его на 5FF3A0? Вам нужно перехватить вызов процедуры, а не саму процедуру (т.е. должно быть "mov dword [4Е1F2B], адрес_вашей_функции"). И выход из вашей функции должен уходить на дальнейший код (т.е. на 4E1F2F) со сдвигом стека. Соответственно, вызов функции, изменяющий элемент диалога с нужными вам параметрами (т.е. с нужным вам номером спрайта специализации), вы тоже должны сделать в вашем хуке, иначе картинка специализации просто не появится в диалоге.

Цитата(Richter @ 21 Jan 2019, 05:53) *
Как это делается? Триггер !?CM2;


Любой триггер, идущий после заполнения данными по-умолчанию таблицы HeroSpecWoG. Да хоть в Триггер_Перед_показом_карты.


--------------------
WoG + MoP + HoA + Forge + Bastion = ERA+


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Richter
сообщение 21 Jan 2019, 10:46 (Сообщение отредактировал Richter - 21 Jan 2019, 10:54)
Сообщение #23

collector of time
Сообщений: 159
Спасибо сказали: 73 раза




Цитата(XEPOMAHT @ 21 Jan 2019, 11:46) *
Написано ж, хук на 4Е1F2А..

Точно, без инициативы никуда) Исправил. Правда ничего похожего на нужное значение не обнаружено.
Цитата(XEPOMAHT @ 21 Jan 2019, 11:46) *
Любой триггер, идущий после заполнения данными по-умолчанию таблицы HeroSpecWoG. Да хоть в Триггер_Перед_показом_карты.

Про это всё равно не понятно)
А где в WoG на UN:G2 хук стоит?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
XEPOMAHT
сообщение 21 Jan 2019, 11:09 (Сообщение отредактировал XEPOMAHT - 21 Jan 2019, 11:14)
Сообщение #24

---------------------- New_Life_of_Heroes ----------------------
Сообщений: 223
Спасибо сказали: 342 раза




Цитата(Richter @ 21 Jan 2019, 10:46) *
Правда ничего похожего на нужное значение не обнаружено.


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

Цитата(Richter @ 21 Jan 2019, 10:46) *
А где в WoG на UN:G2 хук стоит?


Зачем там нужен хук, если UN:G2 изменяет только воговскую таблицу HSpecNames и никак не влияет на оригинальный код?

Код
        case 2:  // Спец.Героев 2/номер_героя/тип_текста(3-картинка)/zvar(номер картинки спец+1)
          t=Mp->n[1];  if((t<0)||(t>=HERNUM)){ MError("\"!!UN:G\"-wrong hero number."); RETURN(0) }
          t2=Mp->n[2]; if((t2<0)||(t2>3)){ MError("\"!!UN:G\"-wrong herospec text type number (0...3)."); RETURN(0) }
          if(t2==3){ // картинка
            v=HSpecNames[t].PicNum-1;
            if(Apply(&v,4,Mp,3)) break;
            HSpecNames[t].PicNum=v+1;
            break;
          }
          v=HSpecNames[t].Var[t2];
          if(Apply(&v,4,Mp,3)) break;
          HSpecNames[t].Var[t2]=v;
          if(v!=0){
            if((v<1)||(v>1000)){ MError("\"UN:G\"-wrong z var index (1...1000)."); RETURN(0) }
            switch(t2){
              case 0: // short
                HSpecTable[t].SpShort=ERMString[v-1];
                break;
              case 1: // full
                HSpecTable[t].SpFull=ERMString[v-1];
                break;
              case 2: // descr
                HSpecTable[t].SpDescr=ERMString[v-1];
            }
          }else{
            switch(t2){
              case 0: // short
                HSpecTable[t].SpShort=HSpecBack[t].SpShort;
                break;
              case 1: // full
                HSpecTable[t].SpFull=HSpecBack[t].SpFull;
                break;
              case 2: // descr
                HSpecTable[t].SpDescr=HSpecBack[t].SpDescr;
                break;
            }
          }
          break;
        default: MError("\"!!UN:G\"-wrong first parameter."); RETURN(0)
      }
      break;


--------------------
WoG + MoP + HoA + Forge + Bastion = ERA+
Go to the top of the pageAdd Nick
 
+Quote Post
Richter
сообщение 21 Jan 2019, 11:56 (Сообщение отредактировал Richter - 21 Jan 2019, 12:06)
Сообщение #25

collector of time
Сообщений: 159
Спасибо сказали: 73 раза




Цитата(XEPOMAHT @ 21 Jan 2019, 13:09) *
Его нужно самому записывать в стек и вызывать соответствующую функцию

Программистом не являюсь пока что.
Как то картинка появляется в диалоге, а мне просто нужен доступ к её номеру в пределах функции обновления, для изменения.
Например регистр EDX используемый в адресе 4E1F2F уже содержит номер картинки ,сам номер в динамическом адресе. Изменения в последнем ничего не дают, видимо потому что после call.


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
XEPOMAHT
сообщение 21 Jan 2019, 12:37
Сообщение #26

---------------------- New_Life_of_Heroes ----------------------
Сообщений: 223
Спасибо сказали: 342 раза




Цитата(Richter @ 21 Jan 2019, 11:56) *
Например регистр EDX используемый в адресе 4E1F2F уже содержит номер картинки ,сам номер в динамическом адресе.


EDX в этой функции может содержать номер героя ИЛИ адрес структуры героя (т.к. функция его использующая - универсальная). Менять - не советую - будут вылеты.

Проще делать БЕЗ ХУКОВ (что за мания ставить хуки, когда можно сделать без них).


--------------------
WoG + MoP + HoA + Forge + Bastion = ERA+


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Richter
сообщение 21 Jan 2019, 12:44 (Сообщение отредактировал Richter - 21 Jan 2019, 12:59)
Сообщение #27

collector of time
Сообщений: 159
Спасибо сказали: 73 раза




Мания, потому что результата хочется, а тут уже кто как умеет). Сможете подсказать как получить значение?


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
feanor
сообщение 21 Jan 2019, 14:31 (Сообщение отредактировал feanor - 21 Jan 2019, 14:31)
Сообщение #28

laughed as one fey
Сообщений: 12 166
Спасибо сказали: 20580 раз




По-моему, в !?CM2 хук вообще не поможет, потому что картинка уже нарисована и является частью диалога героя.
Надо, видимо, сообщение отправлять.
Go to the top of the pageAdd Nick
 
+Quote Post
igrik
сообщение 21 Jan 2019, 14:46 (Сообщение отредактировал igrik - 21 Jan 2019, 15:04)
Сообщение #29

Immortal
Сообщений: 589
Спасибо сказали: 890 раз




Цитата(Richter @ 21 Jan 2019, 12:44) *
Мания, потому что результата хочется, а тут уже кто как умеет). Сможете подсказать как получить значение?

Код
!?FU77004; триггер ЭРА (открытие окна героя)
!!VRy2:S<номер_героя> *16 +10787776;
!!UN:Cy2/4/?y3;
!!VRy3:-1;
!!IF:M^Номер картинки %Y3^;

; заменяем картинку специализации (на стрелковые башни)
!!UN:Cy2/4/357;   номер картинки 356 +1


И вот сразу работающий скрипт при любом клике в окне героя
Код
!?CM2;         [клик в окне героя №28 (Мальком)]
!!VRy2:S28 *16 +10787776;  [таблица HSpecNames[hero_number].PicNum]
!!CM:I?y3;                 [оплучаем id элемента клика]
!!FU|y3<1/y3>356:E;        [выход, если вышли за границы диапазона картинок]
!!VRy3:+1;                 [+1 к номеру картинки (так работает WoG)]
!!UN:Cy2/4/y3;             [установили номер картинки]
!!UN:R3/-1;                [обновили диалог героя]


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Richter
сообщение 23 Jan 2019, 16:03 (Сообщение отредактировал Richter - 25 Jan 2019, 16:36)
Сообщение #30

collector of time
Сообщений: 159
Спасибо сказали: 73 раза




Получить, изменить предлагаемые вторичные навыки при повышении уровня героя.
Код
!?FU303045;          
!!SN:L^EraPlugins\erm_hooker.era^/?y1 Ay1/^SetHook^/?y2;
!!SN:Ey2/1/5090856/x1;
!?FU318945;
!!SN:X?y1;
; EDI (0), ESI (4), EBP (8), ESP (12), EBX (16), EDX (20), ECX (24), EAX (28)
; RetAddr (32)
!!VRy2:Sy1 +0;     переход к EDI        
!!VRy4:Sy1 +4;     переход к ESI    
!!UN:Cy2/4/?y3;   узнать EDI (правый навык)
!!UN:Cy4/4/?y5;   узнать ESI (левый навык)
!!UN:Cy2/4/0; установить правый навык на поиск пути
!!UN:Cy4/4/0; установить левый навык на поиск пути

!?HL-1;Триггер повышения уровня
!!FU303045:P318945; Выполнить функцию


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post
Richter
сообщение 17 Jul 2019, 20:29 (Сообщение отредактировал Richter - 18 Aug 2019, 16:17)
Сообщение #31

collector of time
Сообщений: 159
Спасибо сказали: 73 раза




Цитата(igrik @ 21 Jan 2019, 16:46) *
Код
!?FU77004; триггер ЭРА (открытие окна героя)
!!VRy2:S<номер_героя> *16 +10787776;
!!UN:Cy2/4/?y3;
!!VRy3:-1;
!!IF:M^Номер картинки %Y3^;


К сожалению на получение картинки специализации героя не работает, выдаёт значение -1 в триггерах !?FU77004, !?CM2;
На установку работает хорошо. Подскажите как узнать картинку специализации героя плиз.

Разобрался, специализации соответствуют порядковым номерам героя. Вопрос отпадает.


--------------------


Спасибо сказали:
Go to the top of the pageAdd Nick
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 19 March 2024 - 12:36
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика