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

> Найти объект по типу, set healPotionId findobject healType healColor
Dalamar81
сообщение 30.8.2013, 13:27
Сообщение #1


**

Neophyte
Сообщений: 14
Регистрация: 23.8.2013
Группа: Пользователи
Наличность: 0
Пользователь №: 16.286
Возраст: 31



Ссылка на готовое

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

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

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

Сообщение отредактировал DarkMaster - 11.9.2013, 20:40
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
Dalamar81
сообщение 11.9.2013, 16:31
Сообщение #2


**

Neophyte
Сообщений: 14
Регистрация: 23.8.2013
Группа: Пользователи
Наличность: 0
Пользователь №: 16.286
Возраст: 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С. Все остальное совпадает.


Сообщение отредактировал DarkMaster - 22.9.2013, 13:50
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
pet
сообщение 11.9.2013, 17:19
Сообщение #3


***

Novice
Сообщений: 67
Регистрация: 4.7.2010
Группа: Пользователи
Наличность: 0
Пользователь №: 12.844



Цитата(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 встроить в пилот. Или в плагин для пилота.

Супер, спасибо, что поделились. Попробую на своем клиенте. Во всяком случае теперь предельно ясно как действовать.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
Dalamar81   Найти объект по типу   30.8.2013, 13:27
xolost   Это для ультимы что ли? Она ещё жива? :blink:   30.8.2013, 13:49
pet   Это для ультимы что ли? Она ещё жива? :blink: Ж...   1.9.2013, 10:58
EL-GReeN   Нету но можно искать по картинкам, либо перекопать...   3.9.2013, 11:59
Dalamar81   перекопать память Это делается средствами пилота?....   3.9.2013, 13:26
DarkMaster   Это делается средствами артмани. А вот адреса най...   3.9.2013, 16:26
pet   Это делается средствами артмани. А вот адреса най...   3.9.2013, 22:30
DarkMaster   Берете артмани, находите значения. Потом пилотом ...   4.9.2013, 11:11
EL-GReeN   Предмет в паке, ищете, затем на землю, отсеиваете,...   4.9.2013, 19:48
pet   Предмет в паке, ищете, затем на землю, отсеиваете...   5.9.2013, 21:48
DarkMaster   Dalamar81, большое спасибо за проделанную работу и...   11.9.2013, 17:50
pet   С горем пополам, спасибо огромное топикстартеру, р...   22.9.2013, 11:05
Forxy   Ох, вот что-то пытаюсь найти нужные указатели да в...   8.9.2016, 13:18
DarkMaster   Уточните, что имеете ввиду. Насколько я понимаю п...   8.9.2016, 16:07


Ответить в эту темуОткрыть новую тему
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 18.7.2025, 10:34
Designed by Nickostyle