Current time: 13.04.2025, 14:23 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Сложные скрипты (справочник)
» Готовые решения
Author Message
Raistlin Away
Moderators

Posts: 1351
Post: #1
Восклицание 
Данная тема является справочником, содержащем примеры готовых скриптов. Скрипты, выкладываемые здесь, должны быть хорошо прокомментированы, хорошо структурированы, а также не быть банальными. Использование команд UN:C, SN:E и SN:К приветствуется.


В качестве примера возьму скрипт, найденный на просторах этого форума, и доработанный мной. Суть скрипта - поиск наиболее короткого маршрута от одного гекса до другого в бою, суть моей поправки - раньше скрипт всегда считал замковые ворота препятствием, но теперь это не так. Решение проблемы заключалось в отказе от BU:О и использовании вместо этой команды SN:E4625904[...].

Узнать расстояние между двумя гексами на поле боя:

  1. ** Автор: Algor, обновил: Raistlin
  2. ** получение пройденного расстояния между двумя гексами
  3. ** по алгоритму, который привел в FizMiG'е AlexSpl
  4. ** FU8888-FU8891
  5. !?FU8888; [получение пройденного расстояния между двумя гексами]
  6. ; x1 - исходный гекс (1..185)
  7. ; x2 - целевой гекс (1..185)
  8. ; x3 - ширина существа (1..2)
  9. ; x4 - расстояние или -1(гекс не доступен) или -2 (гекс занят/за полем)
  10. !!BU:Ex1/?y1; [номер отряда в исходной позиции]
  11. !!VRy2:Sx1; [для одногексового отряда 2й исходный гекс совпадает с первым]
  12. !!VRy2&y1>=0/y1<21/x3=2:+1; [y2 - 2й исходный гекс для атакующего двугексового существа]
  13. !!VRy2&y1>20/x3=2:-1; [y2 - 2й исходный гекс для защищающегося двугексового существа]
  14. !!DO8889/0/186/1:Px3; [инициализация сетки значениями -1(не определено) и -2 (не доступно)]
  15. !!SN:W^alg%X1^/0 W^alg%Y2^/0; [инициализация исходных гексов (расстояние 0)]
  16. !!DO8890/1/30/1:Px2; [расчет значений сетки (30 итераций)]
  17. !!SN:W^alg%X2^/?x4; [возврат в x4 значения целевого гекса]
  18. !?FU8889; [установка значения -1(не определено) или -2 (не доступно) для гекса x16]
  19. !!BU:Ex16/?y1; [y1/y2 - отряд/препятствие в гексе]
  20. !!UN:C6919200/4/?y50; [менеджер Битвы]
  21. !!SN:E4625904/2/y50/x16; [вызов функции IsHexNotFree]
  22. !!VRy2:Sv1 *2; [y2=2, если на позиции препятствие]
  23. !!VRy3:Sx16 %17; [y3 = 0 или 16 если гекс за пределами поля]
  24. !!VRy5:S0;
  25. !!VRy5|y1>=0/y2=2/y3=0/y3=16:S2; [y5=2 для недоступного гекса]
  26. !!if&x1=2/y5<2:; [для двугексовых существ определяем доступность еще и по соседним гексам]
  27. !!VRy4:Sx16 -1; [y4 - номер левого гекса]
  28. !!BU:Ey4/?y1; [y1/y2 - отряд/препятствие в гексе]
  29. !!SN:E4625904/2/y50/y4; [вызов функции IsHexNotFree]
  30. !!VRy2:Sv1 *2; [y2=2, если на позиции препятствие]
  31. !!VRy3:Sy4 %17; [y3 = 0 или 16 если гекс за пределами поля]
  32. !!VRy5|y1>=0/y2=2/y3=0/y3=16:+1; [y5++, если левый гекс не доступен]
  33. !!VRy4:Sx16 +1; [y4 - номер правого гекса]
  34. !!BU:Ey4/?y1; [y1/y2 - отряд/препятствие в гексе]
  35. !!SN:E4625904/2/y50/y4; [вызов функции IsHexNotFree]
  36. !!VRy2:Sv1 *2; [y2=2, если на позиции препятствие]
  37. !!VRy3:Sy4 %17; [y3 = 0 или 16 если гекс за пределами поля]
  38. !!VRy5|y1>=0/y2=2/y3=0/y3=16:+1; [y5++, если левый гекс не доступен]
  39. !!en:;
  40. !!SN&y5<2:W^alg%X16^/-1; [значение гекса "не определено"]
  41. !!SN&y5>=2/x16<>96:W^alg%X16^/-2; [значение гекса "не доступно"]
  42. !!SN&x16=96/v1=1:W^alg%X16^/-2; [значение гекса "не доступно" для ворот]
  43. !?FU8890; [расчет значений сетки]
  44. !!SN:W^alg%X1^/?y1; [текущее значение целевого гекса]
  45. !!FU&y1>=0:E; [выход, если расстояние до текущего гекса уже определилось]
  46. !!DO8891/1/185/1:P; [для каждого гекса определяем расстояния от исходного по соседним значениям]
  47. !?FU8891; [расчет значения гекса x16]
  48. !!SN:W^alg%X16^/?y1; [y1 - текущее значение гекса]
  49. !!FU&y1<>-1:E; [выход, если значение уже определено]
  50. !!VRy1:Sx16 :17 %2; [y1 - четность ряда проверяемого гекса]
  51. !!VRy10:S100; [y10 - инициализация значения большим числом]
  52. !!VRy2:Sx16 -1; [y2 - левый гекс]
  53. !!SN:W^alg%Y2^/?y9; [y9 - значение гекса]
  54. !!VRy10&y9<y10/y9>=0:Sy9; [y10 - минимальное значение соседнего гекса]
  55. !!VRy2:Sx16 +1; [y2 - правый гекс]
  56. !!SN:W^alg%Y2^/?y9; [y9 - значение гекса]
  57. !!VRy10&y9<y10/y9>=0:Sy9; [y10 - минимальное значение соседнего гекса]
  58. !!VRy2:Sx16 -17 -y1; [y2 - левый верхний гекс]
  59. !!SN&y2>=0:W^alg%Y2^/?y9; [y9 - значение гекса]
  60. !!VRy10&y2>=0/y9<y10/y9>=0:Sy9; [y10 - минимальное значение соседнего гекса]
  61. !!VRy2:Sx16 -16 -y1; [y2 - правый верхний гекс]
  62. !!SN&y2>=0:W^alg%Y2^/?y9; [y9 - значение гекса]
  63. !!VRy10&y2>=0/y9<y10/y9>=0:Sy9; [y10 - минимальное значение соседнего гекса]
  64. !!VRy2:Sx16 +17 -y1; [y2 - левый нижний гекс]
  65. !!SN&y2<187:W^alg%Y2^/?y9; [y9 - значение гекса]
  66. !!VRy10&y2<187/y9<y10/y9>=0:Sy9; [y10 - минимальное значение соседнего гекса]
  67. !!VRy2:Sx16 +18 -y1; [y2 - правый нижний гекс]
  68. !!SN&y2<187:W^alg%Y2^/?y9; [y9 - значение гекса]
  69. !!VRy10&y2<187/y9<y10/y9>=0:Sy9; [y10 - минимальное значение соседнего гекса]
  70. !!VRy10&y10<100:+1; [если значение гекса определилось...]
  71. !!SN&y10<100:W^alg%X16^/y10; [...устанавливаем его]
  72. !?CM4; [ДЕМОНСТРАЦИЯ: при ПКМ на гексе выводит пешее расстояние до него от текущего отряда]
  73. !!BG:N?y1; [y1 - текущий отряд]
  74. !!BMy1:P?y4 F?y5; [y4 - исходный гекс, y5 - флаги отряда]
  75. !!VRy5:&1 +1; [y5 - размер отряда (1..2)]
  76. !!CM:D?y3 S?y2; [y3/y2 - место/тип клика]
  77. !!FU&y2<>14:E; [выход, если не ПКМ]
  78. !!FU8888:Py4/y3/y5/?y6; [y6 - пройденное расстояние]
  79. !!IF:M^Расстояние: %Y6 (%Y4 -> %Y3, %Y5-hex)^; [вывод сообщения]



Также приведу пример из моего собственного кода.
Реализация абилки Астральных Элементалей из WoG UE:

Что за абилка (Click to View)

  1. !?BR&v997>0; При каждом раунде, начиная со второго
  2. !!re v10/0/41:; Проходимся по стекам
  3. !!BMv10:T?y1; Тип монстра в текущем стеке
  4. !!if&y1=251:; Если Астральный Элементаль
  5. !!BMv10:F?y2; Получаем флаги
  6. !!VRy2:&8388608; Клон?
  7. !!co&y2<>0:; Пропускаем клонов
  8. !!BMv10:N?y3; Количество оставшихся монстров
  9. !!co&y3=0:; Пропускаем мертвые стеки
  10. !!BMv10:P?y4; Позиция текущего стека
  11. !!UN:C6919200/4/?y5; Менеджер битвы
  12. !!VRy6&v10<21:S21692; Корректируем смещение
  13. !!VRy6&v10>20:S21696;
  14. !!UN:Cy5/y6/4/?y7; Узнаем количество стеков у текущей стороны
  15. !!SN&y7<20:E5926784/2/y5/y4/50; Если не 20, вызываем клон
  16. !!en:;
  17. !!en:;


Создал новый глобальный мод: WoG Ultra Edition
11.04.2021 18:06
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16734
Post: #2

Получение названий/описаний заклинаний:

  1. !#DC(EDU_WOG_SPELLS_TABLE_ADDR) = 8114880;
  2. !#DC(EDU_SIZEOF_SPELL_STRUCT) = 136;
  3. !#DC(EDU_STRUCT_SPELL_NAME) = 16;
  4. !#DC(EDU_STRUCT_SPELL_SHORT_NAME) = 20;
  5. !#DC(EDU_STRUCT_SPELL_DESCR) = 120;
  6. !#DC(EDU_STRUCT_SPELL_DESCR_BASIC) = 124;
  7. !#DC(EDU_STRUCT_SPELL_DESCR_ADVANCED) = 128;
  8. !#DC(EDU_STRUCT_SPELL_DESCR_EXPERT) = 132;
  9. !#DC(EDU_SPELL_TEXT_NAME) = 1;
  10. !#DC(EDU_SPELL_TEXT_SHORT_NAME) = 2;
  11. !#DC(EDU_SPELL_TEXT_DESCR) = 3;
  12. !#DC(EDU_SPELL_TEXT_DESCR_BASIC) = 4;
  13. !#DC(EDU_SPELL_TEXT_DESCR_ADVANCED) = 5;
  14. !#DC(EDU_SPELL_TEXT_DESCR_EXPERT) = 6;
  15. !?FU(edu_GetSpellText);
  16. !#VA(spellId:x); Spell ID.
  17. !#VA(textType:x); One of EDU_SPELL_TEXT_XXX constants.
  18. !#VA(result:x); Result string.
  19. !!if&(textType)=(EDU_SPELL_TEXT_NAME);
  20. !!VR(fieldOffset:y):S(EDU_STRUCT_SPELL_NAME);
  21. !!el&(textType)=(EDU_SPELL_TEXT_SHORT_NAME);
  22. !!VR(fieldOffset:y):S(EDU_STRUCT_SPELL_SHORT_NAME);
  23. !!el&(textType)=(EDU_SPELL_TEXT_DESCR);
  24. !!VR(fieldOffset:y):S(EDU_STRUCT_SPELL_DESCR);
  25. !!el&(textType)=(EDU_SPELL_TEXT_DESCR_BASIC);
  26. !!VR(fieldOffset:y):S(EDU_STRUCT_SPELL_DESCR_BASIC);
  27. !!el&(textType)=(EDU_SPELL_TEXT_DESCR_ADVANCED);
  28. !!VR(fieldOffset:y):S(EDU_STRUCT_SPELL_DESCR_ADVANCED);
  29. !!el&(textType)=(EDU_SPELL_TEXT_DESCR_EXPERT);
  30. !!VR(fieldOffset:y):S(EDU_STRUCT_SPELL_DESCR_EXPERT);
  31. !!el;
  32. !!SN:F^ShowErmError^/^edu_GetSpellText: invalid spell text type: %(textType)^;
  33. !!VR(result):S(@empty:z);
  34. !!FU:E;
  35. !!en;
  36. !!VR(offset:y):S(spellId) *(EDU_SIZEOF_SPELL_STRUCT) +(fieldOffset);
  37. !!UN:C(EDU_WOG_SPELLS_TABLE_ADDR)/(offset)/(UNC_UINT32)/?(textAddr:y);
  38. !!SN:B(textAddr)/0/?s^temp^;
  39. !!VR(result):Zs^temp^;
  40. !!VRs^temp^:S^^;
  41. !?PI;
  42. !!FU(edu_GetSpellText):P(SPELL_EARTHQUAKE)/(EDU_SPELL_TEXT_DESCR_EXPERT)/?(spellText:z);
  43. !!IF:M^%(spellText)^;


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
18.04.2021 07:15
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16734
Post: #3

Как, имея арт "Сердце Дракона", влиять на тип драконов, появляющихся на поле боя, при помощи ERM?:

  1. !?FU(OnGameEnter);
  2. ; убираем зависимость: случайно или от типа почвы.
  3. ; ставим: всегда случайно
  4. !!UN:C7763959/2/37008;
  5. ; выпиливаем случайный выбор дракона:
  6. ; всегда берём первого монстра из массива
  7. ; AnyDragon2Summon[Random(0,14)]
  8. !!UN:C7763962/1/0; правим "14" в "0"
  9. !?FU(OnBeforeBattleUniversal);
  10. ; подменяем первого монстра в массиве AnyDragon2Summon
  11. !!UN:C8002264/4/132; указываем номер монстра для вызова

Как поменять название строения Грааля в Инферно?:
  1. !?FU(OnGameEnter);
  2. !!VRz250:S^Название строения^;
  3. !!VRz251:S^Описание строения^;
  4. ; Важно. Нельзя трогать переменные z250 и z251
  5. !!VRy1:S250*512 +9597416;
  6. !!VRy2:S251*512 +9597416;
  7. !!UN:C6968548/4/y1; [правим ссылку названия здания Грааля Инферно]
  8. !!UN:C6977820/4/y2; [правим ссылку описания здания Грааля Инферно]


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
29.04.2021 01:12
Find all posts by this user Quote this message in a reply
Raistlin Away
Moderators

Posts: 1351
Post: #4

Добавление нового события для существующего объекта:

  1. *Выдержка из WoG UE
  2. *Новое событие в Костре
  3. !?OB12;
  4. !!SN:W^WoGUE.Campfire%V998%V999%V1000.Setup^/?y1; Статус настройки костра
  5. !!if&y1=0:; Если не настроен
  6. !!VRy1:S1; Берем случайное число
  7. !!VRy1:R8;
  8. !!SN:W^WoGUE.Campfire%V998%V999%V1000.Setup^/y1; Сохраняем результат
  9. !!FU&y1>6:E; Если не повезло - выход
  10. [:Campfire.Handle]
  11. !!if&1000:;
  12. !!IF:Q1/z163519; Если что-то есть, спрашиваем игрока о том, хочет ли он приблизиться
  13. !!OBv998/v999/v1000&-1:T125; Заменяем тип объекта (125 - водоросль)
  14. !!FU&-1:E; Выход, если не хочет
  15. !!en:;
  16. !!if&y1=6:; Дарим Ос
  17. !!FU(WoGUE.Campfire.GiveTroops):P163509/126;
  18. !!FU:E;
  19. !!en:;
  20. !!if&y1=5:; Дарим Пауков
  21. !!FU(WoGUE.Campfire.GiveTroops):P163508/124;
  22. !!FU:E;
  23. !!en:;
  24. !!FU&-1000:E; На ИИ не нападаем
  25. !!if&y1<3:;
  26. !!FU(WoGUE.Campfire.Battle):P163506/124; Бой с Пауками (Значения 1 и 2)
  27. !!FU:E;
  28. !!en:;
  29. !!FU(WoGUE.Campfire.Battle):P163507/126; Бой с Осами (Значения 3 и 4)
  30. !!el:;
  31. !!SN:G[Campfire.Handle]; Прыгаем к обработчику, если костер уже настроен
  32. !!en:;
  33. !$OB12;
  34. !!SN:W^WoGUE.Campfire%V998%V999%V1000.Setup^/?y1; Статус настройки костра
  35. !!OBv998/v999/v1000&y1<7:T12; Если настроен, восстанавливаем тип объекта
  36. !?FU(WoGUE.Campfire.GiveTroops);
  37. !!VRy1:S5;
  38. !!VRy1:R10; Сколько присоеденится
  39. !!if&1000:;
  40. !!IF:M1/zx1;
  41. !!HE-1:C2/x2/y1/1; Если человек, спрашиваем
  42. !!el:;
  43. !!HE-1:C2/x2/y1/0; ИИ даем сразу
  44. !!en:;
  45. !!SN:W^WoGUE.Campfire%V998%V999%V1000.Setup^/10; Отмечаем, что костер зачистили
  46. !?FU(WoGUE.Campfire.Battle);
  47. !!VRy1:S20;
  48. !!VRy1:R25; Число нападающих
  49. !!HE-1:P?y50/?y51/?y52;
  50. !!IF:M1/zx1;
  51. !!HE-1:Ty50/y51/y52/x2/y1; Бой
  52. !!HE-1:O?y2; Проверяем, победил герой или нет
  53. !!SN&y2<>-1:W^WoGUE.Campfire%V998%V999%V1000.Setup^/10; Если победил (остался у владельца), отмечаем, что костер зачистили

Способность Воплощений Сехмет - существ 4 уровня в новом городе Бастионе:

  1. ; Кража магии
  2. !?BG0;
  3. !!BG:A?y1; Тип действия
  4. !!FU&y1<>7:E; Выход, если не выстрел
  5. !!BG:N?y2;
  6. !!BMy2:T?y3;
  7. !!if&y3=204:; Если ходит Воплощение Сехмет
  8. !!BG:E?y4; Выясняем, на какой стек направлена атака
  9. !!SN:W^WoG359.PriestessShoots^/1; Отмечаем, что был совершен выстрел
  10. !!SN:W^WoG359.PriestessShoots.Attacker^/y2; Сохраняем индексы стеков
  11. !!SN:W^WoG359.PriestessShoots.Target^/y4;
  12. !!en:;
  13. !?BG1;
  14. !!SN:W^WoG359.PriestessShoots^/?y1;
  15. !!FU&y1=0:E;
  16. !!SN:W^WoG359.PriestessShoots^/0;
  17. !!SN:W^WoG359.PriestessShoots.Attacker^/?y2;
  18. !!SN:W^WoG359.PriestessShoots.Target^/?y3;
  19. !!BA:Q?y50; Статус быстрой битвы
  20. !!IF&y50=0:V1/0; Статус проигрывания звука воровства
  21. !!IF&y50=1:V1/1; Звуки не проигрываются, если быстрая битва
  22. ; Вызываем функцию ApplySteal для всех полезных заклинаний
  23. !!re i/27/58:;
  24. !!SSi:F?y4; Флаги заклинания
  25. !!VRy4:&2048; Проверка на "дружественность"
  26. !!co&y4=0:; Переходим к следующей итерации, если флага нет
  27. !!FU(ApplySteal):Pi/y2/y3;
  28. !!en:;
  29. !?FU(ApplySteal);
  30. !!BMx3:Gx1/?v1/?n;
  31. !!FU&v1=0:E; Выход, если полезное заклинание не наложено
  32. !!SSx1:L?y1; Уровень заклинания
  33. !!VRy2:S5 -y1 *20; Вероятность выпадения
  34. !!VRy3:S0 R100; Генерируем случайное число
  35. !!FU&y3>y2:E; Выход, если не повезло
  36. !!BMx2:Mx1/v1/1; Наклaдываем магию на Воплощений (всегда базовый уровень)
  37. !!BMx3:Z?y4; Получаем структуру атакуемого стека
  38. !!SN:E4473392/2/y4/x1; Снимаем заклинание
  39. !!if&-1:;
  40. !!VRz1:S^VISIONS^;
  41. !!SN:Pz1; Проигрываем звук
  42. !!IF:V1/1; Сохраняем статус проигрывания, чтобы не было лишнего шума :)
  43. !!BMx3:P?y5; Получаем позицию атакующего стека
  44. !!VRz2:S^SpellSteal.def^;
  45. !!FU(PlayCustomAnimation):P0/2/y5/100/0/0/1; Проигрывание анимации воровства заклинания
  46. !!en:;
  47. !!BMx3:T?y6;
  48. !!UN:N1/z2/x1; Узнаем название существа и заклинания
  49. !!UN:N3/z3/y6/1;
  50. !!VRz4:S^Воплощения Сехмет забирают заклинание %Z2 у отряда %Z3.^;
  51. !!BU:Mz4; Показываем сообщение в лог

Одна из пособностей Надсмотрщиков - существ 2 уровня в новом городе Бастионе:
Описание: "Каждый Надсмотрщик, находящийся не в армии героя (то есть, в каком-либо гарнизоне), повышает общий доход на 5 единиц золота. Если в гарнизоне шахты находится не менее 50 Надсмотрщиков (суммируются все стеки), то ровно один раз в каждые 3 дня эта шахта приносит двойной доход."

  1. ; В данном примере показано, как повышается доход из городских гарнизонов. Остальной код тоже давно написан, но пока что опубликован не будет.
  2. !?FU(OnCalculateTownIncome);
  3. !#VA(townId:x) (income:x);
  4. !!VR(overseers:y):S0;
  5. !!re (iterator:y)/0/6:;
  6. !!CA0/(townId):M2/(iterator)/?(creatureType:y)/?(count:y);
  7. !!VR(overseers)&(count)>0/(creatureType)=199:+(count);
  8. !!en:;
  9. !!VR(money:y):S(overseers) *5;
  10. !!VR(income):+(money); К доходу города добавляется количество Надсмотрщиков*5

Я принял решение выложить немного кода, относящегося к Бастиону, по двум причинам: во первых, чтобы продемонстрировать его работоспособность, и во вторых, чтобы справочник развивался, а также, чтобы у людей всегда были под рукой примеры того, как можно реализовывать различные нестандартные игровые бонусы.
Да, кстати, если у кого будут время и настроение, можете попробовать свои силы в реализации парочки неготовых способностей. Просто напишите мне, я буду рад любой помощи. 20 Оформление кода, желательно, делать таким же, как у меня.


Создал новый глобальный мод: WoG Ultra Edition
05.05.2021 00:11
Find all posts by this user Quote this message in a reply
Berserker Offline
Administrators

Posts: 16734
Post: #5

Получение названия класса героя: © igrik

  1. !?CM0;
  2. !!CM:R0;
  3. !!FU(edu_GetHeroClassName):P(HERO_EDRIC)/?(className:z);
  4. !!IF:M^%(className)^;
  5. !?FU(edu_GetHeroClassName);
  6. !#VA(heroId:x);
  7. !#VA(result:x); string
  8. !!VR(savedV1:y):Sv1;
  9. !!HE(heroId):Z?(heroStruct:y);
  10. !!SN:E5083616/(CALLCONV_THISCALL)/(heroStruct);
  11. !!SN:Bv1/d/?s^temp^;
  12. !!VRv1:S(savedV1);
  13. !!VR(result):Zs^temp^;
  14. !!VRs^temp^:S^^;


Скачать Герои 3 Эра и всё, что с ней связано / ERA 2.46f для старых модов
Поддержать проект
12.07.2021 05:28
Find all posts by this user Quote this message in a reply
daemon_n Offline
Administrators

Posts: 4356
Post: #6

Получение координат курсора при движении мыши в любых диалогах
+ Бонус получение id Элемента при наведении на него
:
© daemon_n & Hawaiing

  1. Необходимо поставить хук на движение мыши в диалогах:
  2. Второй хук для тех, кто хочет Красиво)
  3. !!SN:L^EraPlugins\erm_hooker.era^/?y1;
  4. !!if&y1<>0;
  5. !!SN:Ay1/^SetHook^/?(hooker:y);
  6. !!SN:E(hooker)/1/6290592/(Dlg_OnMouseMove); [005FFCA0 6290592 Dlg_OnMouseMove __this]
  7. !!SN:E(hooker)/1/6287088/(DlgItem_ShowHint); [005FEEF0 6287088 DlgItem_ShowHint_callParentVMT4 __fastcall]
  8. !!en;
  9. ERM 1 Вариант:
  10. !?FU(Dlg_OnMouseMove);© Hawaiing
  11. !!SN:X?y1;
  12. !!VRy4:Sy1+12;
  13. !!UN:Cy4/4/?y14; ESP
  14. !!VRy15:Sy14+8;
  15. !!VRy16:Sy14+12;
  16. !!UN:Cy15/4/?y25;[xabs]
  17. !!UN:Cy16/4/?y26;[yabs]
  18. ERM 2 Вариант:
  19. !?FU(Dlg_OnMouseMove);© daemon_n просто пошёл дальше
  20. !#VA(dlg:x);
  21. !!UN:C(dlg)/40/4/?(x:y); получили точную х- координату мыши В игре ! Аналог CM:A?(x:y)/d;
  22. !!UN:C(dlg)/44/4/?(y:y); получили точную y- координату мыши В игре ! Аналог CM:Ad/?(y:y);
  23. Идём дальше - получаем ID Элемента на позиции
  24. !!FU(H3Dlg_GetCurrentDlg):P?(currentDlg:y);
  25. !!SN:E6289824/2/(currentDlg)/(x)/(y); Получаем структуру элемента в v1 [005FF9A0 6289824 Dlg_ItemAtPos __this]
  26. !!UN&v1>0:Cv1/16/2/?(itemId:y); Используя мои хаки со смещением, получаем Id элемента)) Аналог !!CM:I?(itemId:y);
  27. Если мы умнички и хотим получить Id элемента только при наведении на него, сохраняем значения в Глобальные переменные и идём дальше;
  28. !!VRi^Dlg_mouseX^:S(x);
  29. !!VRi^Dlg_mouseY^:S(y);
  30. Нужен наш второй хук DlgItem_ShowHint
  31. !?FU(DlgItem_ShowHint);
  32. и повторяем действие, но уже с имеющимися координатами
  33. !!FU(H3Dlg_GetCurrentDlg):P?(currentDlg:y);
  34. !!SN:E6289824/2/(currentDlg)/i^Dlg_mouseX^/i^Dlg_mouseY^; Получаем структуру элемента в v1 [005FF9A0 6289824 Dlg_ItemAtPos __this]
  35. !!UN&v1>0:Cv1/16/2/?(itemId:y); Используя мои хаки со смещением, получаем Id элемента)) Аналог !!CM:I?(itemId:y);


Image: widget.png?style=banner2

Новейший Heroes Launcher
09.11.2021 07:26
Visit this user's website Find all posts by this user Quote this message in a reply
SergOz Offline

Posts: 1333
Post: #7

Просмотр книги заклинаний у вражеского героя: © daemon_n

  1. !?FU(OnBattleScreenMouseClick)|i^mouse_battleHex^=252/i^mouse_battleHex^=253;
  2. !!if&i^mouse_action^=(MOUSE_LMB_PRESSED)/i^mouse_item^=0;
  3. !!OW:Cd/?(meID:y);
  4. !!if&i^battle_owner_0^=(meID);
  5. !!VR(hostileSide:y):S(BATTLE_RIGHT);
  6. !!el;
  7. !!VR(hostileSide:y):S(BATTLE_LEFT);
  8. !!en;
  9. !!VR(clickSide:y):Si^mouse_battleHex^ -252;
  10. !!if&(clickSide)=(hostileSide);
  11. !!UN:C(COMBAT_MANAGER)/4/?(cmbMgr:y) C(cmbMgr)/78528/4/?(storeActiveSide:y) C(cmbMgr)/78528/4/(hostileSide);
  12. !!UN:C(cmbMgr)/81268/1/?(storeNoCastLimit:y) C(cmbMgr)/81268/1/(TRUE);
  13. !!SN:E5893136/(CALLCONV_THISCALL)/(cmbMgr);
  14. !!UN:C(cmbMgr)/78528/4/(storeActiveSide) C(cmbMgr)/81268/1/(storeNoCastLimit:y);
  15. !!en;
  16. !!en;

Строку !!OW:Cd/?(meID:y), если версия ERA ещё не поддерживает эту команду, можно заменить на:
  1. !!UN:C(GAME_MANAGER)/(UNC_UINT32)/?(gm:y);
  2. !!SN:E5039840/2/(gm);
  3. !!VR(meId:y):Sv1;


Карта-мод "Война на Холсте"
(This post was last modified: 06.06.2023 21:57 by SergOz.)
14.08.2022 08:09
Find all posts by this user Quote this message in a reply
« Next Oldest | Next Newest »
Post Reply 


Forum Jump:

Powered by MyBB Copyright © 2002-2025 MyBB Group