Current time: 23.04.2024, 16:12 Hello There, Guest! (LoginRegister)
Language: english | russian  

Post Reply 
Threaded Mode | Linear Mode
Ваши вопросы по ERM-скриптам
Author Message
totkotoriy Offline

Posts: 873
Post: #1801

(17.03.2012 01:26)Berserker Wrote:  

Не... ребята вы волшебники!!! 119 JC_ThankYou ... только подскажите ещё пожалуста куда звук то совать? не находит скрипт его нигде. И вообще в сообщении об ошибке пишет что не найден ресурс "1", а я, как понимаю, там должно быть имя файла звука.


Ты роешься в моих паках, но ты делаешь это без уважения...
(This post was last modified: 17.03.2012 01:53 by totkotoriy.)
17.03.2012 01:44
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #1802

totkotoriy Wrote:Что такое статические и динамические адреса? И какие надо менять?
И какие надо менять? Я как понимаю это адрес, который ты нашёл, это адрес памяти? Или чего? Должен он меняться при другом запуске игры или нет? Как написать dll честно говоря не знаю... нужен там хук или нет?

Статические адреса - это адреса, на информацию по которым выделяется память системой при самом запуске exe. Эти адреса всегда постоянны, при любом запуске по ним будет одна и та же информация (сама информация может меняться в процессе игры, но смысл её одинаков для одного и того же статического адреса). Вся информация, записанная в экзешнике хранится именно по статическим адресам (в процессе игры она может куда-то копироваться, но изначально - по статическим). Код игры также хранится по статическим адресам.

Динамические адреса - это адреса, на информацию по которым память выделяла сама игра (а потом туда что-то записывала). Где именно находится выделенная память - неизвестно, она может находиться где угодно, в разных местах во время разных запусков.

В иде можно грубо различить статические адреса как те, по которым что-то есть без запуска отладчика.
Статические адреса находятся примерно между 0x400000 и 0x800000. Остальные адреса - динамические.

Что-то менять прямо есть смысл только по статическим адресам. Нахождение динамического адреса практически ничего не даёт - при следующем запуске по тому же адресу может быть записано что-то другое.


Если ты хочешь изменить какую-то записанную в самом экзешнике информацию, то тебе нужен статический адрес. Менять надо только один раз при запуске игры - после этого она уже будет изменённая на весь запуск. Хук тут никакой не нужен, просто надо поменять информацию при запуске, например, в событии Эры OnAfterWoG или OnBeforeWoG.



Если тебе где-то в игре нужно получить или изменить информацию, записанную по динамическому адресу, нужно знать статический указатель и смещения.

Например:
*(int*)(*(int*)(0x699420) + 21708 + 1352*21*1 + 1352*3 + 52)

В статическом адресе 0x699420 во время игры записывается динамический адрес, по которому находится информация о бое.
21708 - это смещение информации о воюющих монстрах в информации о бое (т. е. информация о монстрах находится в 21708-ом байте, если считать с начала информации о битве).
1352 - количество памяти, которое занимает инофрмация об одном монстре.
21 - максимальное количество монстров у одной стороны.
1 - защищающаяся сторона.
3 - отряд монстров номер 3.
Т. е. 1352*21*1 + 1352*3 означает, что мы будем рассматривать отряд номер 3 у защищающейся стороны.
52 - смещение поля типа монстра в его информации.

Т. е. *(int*)(*(int*)(0x699420) + 21708 + 1352*21*1 + 1352*3 + 52) возвратит нам тип монстра у отряда монстров номер 3 защищающейся стороны в бою. Естественно, это можно делать только во время боя, когда у защищающейся стороны есть стек номер 3.

Но это, вроде, тебе пока не нужно, я показал для примера работы с динамическими адресами.



Теперь насчёт адресов для файла/памяти.

Всё это - только статические адреса. Более того, адреса для файла и для памяти - это одни и те же адреса в разных представлениях.

Если ты откроешь exe hex-редактором, то адреса информации там будут начинаться с 0. Это и есть адреса для файла.

Если же ты откроешь exe в дизассемблере, то адреса той же самой информации будут начинаться с 0x400000+. Это адреса для памяти.

Все адреса, найденные в дизассемблере, отладчике, artmoney - это адреса для памяти. В dll'ках и через erm правятся тоже только адреса для памяти.
Найденный мной адрес - адрес, естественно, для памяти. А вот найденный тобой в экзешнике адрес - это тот же самый адрес, но в представлении адреса для файла.

В общем, адреса для файла встречаются только если править exe hex-редактором. Во всех остальных случаях (в т. ч. и в коде самой игры) используются адреса для памяти. То, что я говорил про от 0x400000 до 0x800000 - это тоже в адресах для памяти.


Хук - это перехватчик управления. Он нужен для того, чтобы при выполнении игрой команды по определённому адресу управление передавалось плагину и он мог что-то сделать или поменять, а потом вернуть управление игре. Это что-то вроде триггера, который ты сам устанавливаешь и который срабатывает каждый раз, когда выполняется код, в котором он установлен. Нужен хук только тогда, когда ты хочешь в конкретное место вклинить выполнение своего кода.


Примеры написанных dll есть, начиная примером, входящим в поставку Эры.


Вроде на всё ответил.
17.03.2012 12:26
Find all posts by this user Quote this message in a reply
totkotoriy Offline

Posts: 873
Post: #1803

(17.03.2012 12:26)Sav Wrote:  Вроде на всё ответил.
Большое спасибо! Теперь всё понятно.


Ты роешься в моих паках, но ты делаешь это без уважения...
17.03.2012 13:41
Find all posts by this user Quote this message in a reply
totkotoriy Offline

Posts: 873
Post: #1804

Помогите ещё пожалуйста, че-то у меня всё-таки не получается...
почему-то этот код записывает не то, что надо, т.к. я проверяю длину записаной строки:
Code:
!!SN:X^name.wav^ X?y1 Ky1/?y2;
!!VRy2:+1;
!!SN:Ky2/y1/6849176/1;
!!SN:Ky2/6849176/y1/1;
!!SN:Ky1/?y3;
!!IF:M^%Y3^;
и мне выдаёт 1... и кстати ресурс, который не может найтись почему то тоже называется "1"... не знаете в чем дело?

И ещё тут поэкспериментировал - приспособил немного скриптик МОР'a
Вот такая штука:
Code:
!!FU29010:Pz355;
!!IF:M1/z355;

!?FU29010;
!!UN:C6849176/4/?y2;
!!VRx1:*512+9597416;
!!UN:Cx1/4/y2;
!!VRx1:+4;
!!UN:Cx1/1/0;
выдает "deca", то есть первые 4 символа decay.wav
может лучше этот скрипт приспособить на замену строки в памяти? Только я не знаю как... а вот что это 512+9597416 такое вобще для меня загадка, как я думаю перевод байтов в буквы (не... это скорей всего адрес переменной z)...


Добавлено позже:
Пока что сделал наитупейшим образом (но и наипростейшим одновременно):
Code:
!!UN:C6849176/1/65;
то есть заменил просто первый символ decay.wav на eecay.wav и добавил такой звук... зато все заработало!
Только почему то вместо буквы E записывается буква А... я могу, конечно, методом тыка составить свою таблицу символов, только не пойму почему коды читаемых символов строки не совпадают с записываемыми кодами 105... ???

Причем что еще заметил, так это то, что командой UN:C читается информация с конца строки то есть слово deca будет 61 63 65 44 на HEX'e... вобще ниче не понимаю... как так?


Ты роешься в моих паках, но ты делаешь это без уважения...
(This post was last modified: 18.03.2012 01:48 by totkotoriy.)
17.03.2012 23:36
Find all posts by this user Quote this message in a reply
Berserker Online
Administrators

Posts: 16488
Post: #1805



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

Posts: 873
Post: #1806

Berserker, огромное человеческое спасибо, Sav'у кстати тоже... всё работает 132. И начал хоть немного что-то понимать в этом.

Можете ещё на счет кодов символов просветить? И почему строка с конца читается при UN:C? Я думаю мне это тоже сильно пригодится.


Ты роешься в моих паках, но ты делаешь это без уважения...
(This post was last modified: 18.03.2012 02:15 by totkotoriy.)
18.03.2012 02:13
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #1807

totkotoriy Wrote:Только почему то вместо буквы E записывается буква А...
Так ведь в erm всё в десятичной системе счисления. 65 = 41h = 'A'. 65h = 101 = 'e'.

totkotoriy Wrote:Причем что еще заметил, так это то, что командой UN:C читается информация с конца строки то есть слово deca будет 61 63 65 44 на HEX'e... вобще ниче не понимаю... как так?
Дело в том, что UN:C приспособлен считывать числовые данные. А числовые данные в памяти компьютера хранятся в перевёрнутом виде.
Например, ABC5678h хранится так: 78 56 BC 0A. А 56h в двойном слове будет выглядеть так: 56 00 00 00. Поэтому UN:C их автоматически переворачивает. Ну а строка хранится в нормальном порядке.

Это переворачиваение в памяти сделано для того, чтобы при взятии байта по адресу, где записано слово или двойное слово, или слова по адресу, где записано двойное слово, брались младшиие байт/слово, а не старшие (ведь если там записано, скажем, маленькое число - оно всё хранится в младших разрядах, а старшие пусты)
(This post was last modified: 18.03.2012 09:32 by Sav.)
18.03.2012 09:30
Find all posts by this user Quote this message in a reply
totkotoriy Offline

Posts: 873
Post: #1808

(18.03.2012 09:30)Sav Wrote:  
totkotoriy Wrote:Только почему то вместо буквы E записывается буква А...
Так ведь в erm всё в десятичной системе счисления. 65 = 41h = 'A'. 65h = 101 = 'e'.
Точно! 145 Совсем забыл, что в ЕРМе нужны 10ричные числа... Теперь то я делов наделаю.


Ты роешься в моих паках, но ты делаешь это без уважения...
(This post was last modified: 18.03.2012 11:57 by totkotoriy.)
18.03.2012 11:53
Find all posts by this user Quote this message in a reply
Хоррон Offline

Posts: 15
Post: #1809

Возможно ли добавить (например дендроиду) умение "Стрелок"? Ну, что бы он стрелял...
   Прошу помочь советом, а еще лучше наглядным примером, так как на форумах прямого ответа не нашел, а у самого разобраться не получается.
21.03.2012 21:10
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #1810

У дендроида нету ни анимации стрельбы, ни снаряда. Так что одними скриптами тут не обойдёшься.
21.03.2012 21:14
Find all posts by this user Quote this message in a reply
Хоррон Offline

Posts: 15
Post: #1811

Хм, ну а если "прикрутить" анимацию выстрела другого юнита? Ну или на крайний случай оставить выстрел без анимации?
21.03.2012 21:18
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #1812

В def`ах есть секции кадров различных типов. Если секции выстрела нет в def`е - при стрельбе будет вылет. Если добавить туда кадры другого существа - на время выстрела существо будет превращаться. Можно добавить туда кадры того же существа из другой секци, так будет более-менее адекватно. Но для всего этого надо править def.

Снаряд монстру добавить скриптами и правкой ресурсов нереально. Но можно вместо снаряда сделать луч чёрного цвета, это делается простым скриптом.
21.03.2012 21:30
Find all posts by this user Quote this message in a reply
Berserker Online
Administrators

Posts: 16488
Post: #1813

Quote:Но для всего этого надо править def.
Угу, сделать дальнюю атак аналогичной ближней.


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

Posts: 15
Post: #1814

Спасибо, буду пытаться.
   А добавить заклинание юниту? Например, эфрит колдует "огненный шар"?
Наверное, надо в ехе-шнике менять или все таки можно с помощью скриптов настроить?
22.03.2012 08:28
Find all posts by this user Quote this message in a reply
Sav Offline

Posts: 2180
Post: #1815

Заклинание после атаки можно и скриптом, но оно будет работать не очень качественно. Активируемая способность - только exe.
22.03.2012 11:50
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-2024 MyBB Group