Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ UO Pilot в Ultima Online _ Найти объект по типу

Автор: Dalamar81 30.8.2013, 13:27

https://forum.uokit.com/index.php?s=&showtopic=26560&view=findpost&p=194418

Есть ли в пилоте возможность поиска объекта в сумках по типу?
Чрезвычайно нужная функция...
Если нет, нужно сделать.

что-то типа такого:
set healPotionId findobject healType healColor

или такого:
set healPotionId findobject containerId healType healColor

Автор: xolost 30.8.2013, 13:49

Это для ультимы что ли?
Она ещё жива? blink.gif

Автор: pet 1.9.2013, 10:58

Цитата(xolost @ 30.8.2013, 14:49) *

Это для ультимы что ли?
Она ещё жива? blink.gif

Жива конечно, чего ей умирать-то)

Автор: EL-GReeN 3.9.2013, 11:59

Нету но можно искать по картинкам, либо перекопать память, последнее сложнее но лучше.

Автор: Dalamar81 3.9.2013, 13:26

Цитата(EL-GReeN @ 3.9.2013, 12:59) *
перекопать память

Это делается средствами пилота?..

Автор: DarkMaster 3.9.2013, 16:26

Цитата
Цитата(EL-GReeN @ 3.9.2013, 12:59) *
перекопать память

Это делается средствами пилота?..

Это делается средствами артмани. А вот адреса найденные в артмани, можно спокойно использовать в пилоте. Копать кстати можно и пилотом, но это будет ОЧЕНЬ долго)

Автор: pet 3.9.2013, 22:30

Цитата(DarkMaster @ 3.9.2013, 17:26) *

Это делается средствами артмани. А вот адреса найденные в артмани, можно спокойно использовать в пилоте. Копать кстати можно и пилотом, но это будет ОЧЕНЬ долго)

Друзья, может подскажите, как действовать? Очень интересна эта тема. Знаю как ее можно использовать для отслеживания изменения значений, а вот как ее для этих целей? По Id, если только...

Автор: DarkMaster 4.9.2013, 11:11

Цитата
Друзья, может подскажите, как действовать?

Берете артмани, находите значения. Потом пилотом их вытягиваете через readmem, используете как обычную переменную.

Автор: EL-GReeN 4.9.2013, 19:48

Предмет в паке, ищете, затем на землю, отсеиваете, и так далее пока не будет минимум значений, перезапускаете клиент и смотрите меняется ли что то при перемещении предмета, если результат есть это оно, если нет то повторить поиск-отсеивание и на результат искать ссылку на другом адресе или ссылку на сслыку, которая скорее всего и будет статичной сслылкой на искомый адрес, это все может и не сработать, тогда нужно искать в памяти какое то уникальное значение рядом с которым есть инфа о предметах в паке, и искать уже вокруг него каждый раз, бредово звучит но это все так работает biggrin.gif
Возможно пригодится если разберетесь, тут о вытягивании журнала уо и ссылках:
https://forum.uokit.com/index.php?showtopic=23139&hl=

Автор: pet 5.9.2013, 21:48

Цитата(EL-GReeN @ 4.9.2013, 20:48) *

Предмет в паке, ищете, затем на землю, отсеиваете, и так далее пока не будет минимум значений, перезапускаете клиент и смотрите меняется ли что то при перемещении предмета, если результат есть это оно, если нет то повторить поиск-отсеивание и на результат искать ссылку на другом адресе или ссылку на сслыку, которая скорее всего и будет статичной сслылкой на искомый адрес, это все может и не сработать, тогда нужно искать в памяти какое то уникальное значение рядом с которым есть инфа о предметах в паке, и искать уже вокруг него каждый раз, бредово звучит но это все так работает biggrin.gif
Возможно пригодится если разберетесь, тут о вытягивании журнала уо и ссылках:
https://forum.uokit.com/index.php?showtopic=23139&hl=

Понял. Спасибо большое, буду пробовать.

Автор: Dalamar81 11.9.2013, 16:31

Спасибо за наводки и подсказки, удалось с помощью артмани добыть всю необходимую информацию!

Если кому тоже интересен этот вопрос, то результаты получились такими (справедливо для клиента ультимы 2.0.3 - на других не пробовал):

По адресу 0x00CC535C хранится указатель, где по смещению +248 хранится следующий указатель, указывающий на структуру, описывающую бэкпак в памяти.

Далее, оказалось, что все предметы описаны одной и той же структурой. Предметы, находящиеся в одном контейнере хранятся в виде двусвязанного списка.

Структура такая (цифры 16-ричные, W - 2 байта, D - 4 байта):
itemAddr + 24: (W) X-координата объекта в контейнере
itemAddr + 26: (W) Y-координата объекта в контейнере
itemAddr + 3С: (W) Тип
itemAddr + 40: (W) Количество штук в куче
itemAddr + 42: (W) Цвет
itemAddr + 44: (D) Указатель на предыдущий объект в списке
itemAddr + 48: (D) Указатель на следующий объект в списке
itemAddr + 7C: (D) ID объекта
itemAddr + 80: (D) Указатель на контейнер
itemAddr + 84: (D) Указатель на предыдущий связанный объект
itemAddr + 88: (D) Указатель на следующий связанный объект
itemAddr + B0: (D) Если объект - контейнер, то указатель на объект с координатами контейнера на экране

В объекте с координатами контейнера по смещению +0x30 хранится координата X (D), а по смещению +0x34 хранится координата Y (D).

Для контейнеров указатель на следующий связанный объект (+0x88) указывает либо на первый предмет в контейнере, либо на ещё один какой-то объект, у которого уже по смещению +0x88 будет указатель на первый предмет.
У предмета по смещению +0x48 хранится указатель на следующий предмет. У последнего - равен нулю.

Вот небольшой скрипт, демонстрирующий использование этой информации в пилоте (выводит идентификаторы всех объектов в паке):

Код

readmem #addr 0x00CC535C D
set #addr #addr + 284
readmem #bpackAddr #addr D

set #nextItemAddrRef #bpackAddr + 0x88
while 1 = 1
    readmem #itemAddr #nextItemAddrRef D
    if #itemAddr = 0
        break
    end_if
    set #addr #itemAddr + 0x80
    readmem #containerAddr #addr D
    if #containerAddr <> #bpackAddr
        // какая-то не понятная запись. идём к следующей
        set #nextItemAddrRef #itemAddr + 0x88
        continue
    end_if

    // нашли следующий предмет
    // выведем ID предмета
    set #addr #itemAddr + 0x7c
    readmem #itemID #addr D
    msg #itemID

    set #nextItemAddrRef #itemAddr + 0x48
end_while
stop_script

Ну и естественно, это всё работает только, если пак - открыт.
Хорошо бы соответствующую функциональность по работе с объектами UO встроить в пилот. Или в плагин для пилота.

Цитата(pet)
Для клиента 1.26.4а все смещения совпадают. Единственное различие в адресе бэкпака, точнее ссылке на него. Ссылка храниться по адресу 0х00C88AE0, далее по смещению 0х11С. Все остальное совпадает.

Автор: pet 11.9.2013, 17:19

Цитата(Dalamar81 @ 11.9.2013, 17:31) *

Спасибо за наводки и подсказки, удалось с помощью артмани добыть всю необходимую информацию!

Если кому тоже интересен этот вопрос, то результаты получились такими (справедливо для клиента ультимы 2.0.3 - на других не пробовал):

По адресу 0x00CC535C хранится указатель, где по смещению +248 хранится следующий указатель, указывающий на структуру, описывающую бэкпак в памяти.

Далее, оказалось, что все предметы описаны одной и той же структурой. Предметы, находящиеся в одном контейнере хранятся в виде двусвязанного списка.

Структура такая (цифры 16-ричные, W - 2 байта, D - 4 байта):
itemAddr + 24: (W) X-координата объекта в контейнере
itemAddr + 26: (W) Y-координата объекта в контейнере
itemAddr + 3С: (D) Тип
itemAddr + 40: (W) Количество штук в куче
itemAddr + 42: (W) Цвет
itemAddr + 44: (D) Указатель на предыдущий объект в списке
itemAddr + 48: (D) Указатель на следующий объект в списке
itemAddr + 7C: (D) ID объекта
itemAddr + 80: (D) Указатель на контейнер
itemAddr + 84: (D) Указатель на предыдущий связанный объект
itemAddr + 88: (D) Указатель на следующий связанный объект
itemAddr + B0: (D) Если объект - контейнер, то указатель на объект с координатами контейнера на экране

В объекте с координатами контейнера по смещению +0x30 хранится координата X (D), а по смещению +0x34 хранится координата Y (D).

Для контейнеров указатель на следующий связанный объект (+0x88) указывает либо на первый предмет в контейнере, либо на ещё один какой-то объект, у которого уже по смещению +0x88 будет указатель на первый предмет.
У предмета по смещению +0x48 хранится указатель на следующий предмет. У последнего - равен нулю.

Вот небольшой скрипт, демонстрирующий использование этой информации в пилоте (выводит идентификаторы всех объектов в паке):
Код

readmem #addr 0x00CC535C D
set #addr #addr + 284
readmem #bpackAddr #addr D

set #nextItemAddrRef #bpackAddr + 0x88
while 1 = 1
    readmem #itemAddr #nextItemAddrRef D
    if #itemAddr = 0
        break
    end_if
    set #addr #itemAddr + 0x80
    readmem #containerAddr #addr D
    if #containerAddr <> #bpackAddr
        // какая-то не понятная запись. идём к следующей
        set #nextItemAddrRef #itemAddr + 0x88
        continue
    end_if

    // нашли следующий предмет
    // выведем ID предмета
    set #addr #itemAddr + 0x7c
    readmem #itemID #addr D
    msg #itemID

    set #nextItemAddrRef #itemAddr + 0x48
end_while
stop_script

Ну и естественно, это всё работает только, если пак - открыт.
Хорошо бы соответствующую функциональность по работе с объектами UO встроить в пилот. Или в плагин для пилота.

Супер, спасибо, что поделились. Попробую на своем клиенте. Во всяком случае теперь предельно ясно как действовать.

Автор: DarkMaster 11.9.2013, 17:50

Dalamar81, большое спасибо за проделанную работу и публикацию результатов.

Автор: pet 22.9.2013, 11:05

С горем пополам, спасибо огромное топикстартеру, разобрался во всех этих смещениях и адресах.
Для клиента 1.26.4а все смещения совпадают. Единственное различие в адресе бэкпака, точнее ссылке на него. Ссылка храниться по адресу 0х00C88AE0, далее по смещению 0х11С. Все остальное совпадает.

Автор: Forxy 8.9.2016, 13:18

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

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

Прикрепленное изображение

Но это ведь указатель на предмет(тип, количество, id) в паке, а как узнать указатель на сам пак?

Автор: DarkMaster 8.9.2016, 16:07

Цитата
Но это ведь указатель на предмет(тип, количество, id) в паке, а как узнать указатель на сам пак?

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

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)