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

 
Ответить в эту темуОткрыть новую тему
> Найти объект по типу, 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Отправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
xolost
сообщение 30.8.2013, 13:49
Сообщение #2


******

Expert
Сообщений: 517
Регистрация: 17.6.2012
Группа: Пользователи
Наличность: 0
Пользователь №: 15.035



Это для ультимы что ли?
Она ещё жива? (IMG:style_emoticons/default/blink.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
pet
сообщение 1.9.2013, 10:58
Сообщение #3


***

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



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

Это для ультимы что ли?
Она ещё жива? (IMG:style_emoticons/default/blink.gif)

Жива конечно, чего ей умирать-то)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
EL-GReeN
сообщение 3.9.2013, 11:59
Сообщение #4


*****

Journeyman
Сообщений: 474
Регистрация: 18.7.2011
Группа: Пользователи
Наличность: 0
Из: Россия
Пользователь №: 13.815
Возраст: 32



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


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Dalamar81
сообщение 3.9.2013, 13:26
Сообщение #5


**

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



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

Это делается средствами пилота?..
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 3.9.2013, 16:26
Сообщение #6


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



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

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

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


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
pet
сообщение 3.9.2013, 22:30
Сообщение #7


***

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



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

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

Друзья, может подскажите, как действовать? Очень интересна эта тема. Знаю как ее можно использовать для отслеживания изменения значений, а вот как ее для этих целей? По Id, если только...
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 4.9.2013, 11:11
Сообщение #8


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



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

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


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
EL-GReeN
сообщение 4.9.2013, 19:48
Сообщение #9


*****

Journeyman
Сообщений: 474
Регистрация: 18.7.2011
Группа: Пользователи
Наличность: 0
Из: Россия
Пользователь №: 13.815
Возраст: 32



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


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
pet
сообщение 5.9.2013, 21:48
Сообщение #10


***

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



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

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

Понял. Спасибо большое, буду пробовать.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Dalamar81
сообщение 11.9.2013, 16:31
Сообщение #11


**

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
Сообщение #12


***

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Отправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 11.9.2013, 17:50
Сообщение #13


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



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


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
pet
сообщение 22.9.2013, 11:05
Сообщение #14


***

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



С горем пополам, спасибо огромное топикстартеру, разобрался во всех этих смещениях и адресах.
Для клиента 1.26.4а все смещения совпадают. Единственное различие в адресе бэкпака, точнее ссылке на него. Ссылка храниться по адресу 0х00C88AE0, далее по смещению 0х11С. Все остальное совпадает.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Forxy
сообщение 8.9.2016, 13:18
Сообщение #15


*

Registred
Сообщений: 3
Регистрация: 6.9.2016
Группа: Пользователи
Наличность: 0
Пользователь №: 18.108



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

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

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

Но это ведь указатель на предмет(тип, количество, id) в паке, а как узнать указатель на сам пак?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 8.9.2016, 16:07
Сообщение #16


***********

Модератор UOPilot
Сообщений: 9.460
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27708
Пользователь №: 11.279



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

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


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

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

 

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