Jump to content
Alloder.pro: about Allods with love
Search In
  • More options...
Find results that contain...
Find results in...

New program for writers

We turn from quantity to quality and tell you how we will supplement the Allods Team program with rewards in rubles.

More

The new Updater

Let us to introduce the new addon updater software and to share the details

Read more

Alloder 2.0

We have started the process of project evolve, and this relates not only, and not even primarily of the site's view

Read more

Как узнать ObjectId предмета?


Guest Urjin
 Share

Recommended Posts

Guest Urjin

Полазил по форуму, но не нашел темы.

Как узнать ObjectId вещи, на которую наведен курсор?

Думал вытянуть, через событие, которое обрабатывает описание вещи, которое появляется при наведении курсора на предмет (в инвентаре, у вендора, или в аукционе), в API нашел только EVENT_SHOW_ITEMS_INFO, но ни разу не удалось вызвать с ним переменную. написано, что работает только в UIstate, может в этом дело, но я не знаю, что это такое :-(

В AucCenter, вроде как это событие обрабатывается SCRIPT_REQUEST_CONTEXT_TOOLTIP, но он сейчас вообще не работает.

Link to comment
Share on other sites

  • Replies 56
  • Created
  • Last Reply

Top Posters In This Topic

Guest Abagor
Quote:
UIstate

Насколько понимаю, это означает, что работать будет только в самом интерфейсе. Например, в случае с иконкой вещи - она корректно воспроизводится на экране, но ни какую инфу по ней невозможно сохранить (ни ид, ни путь, ни саму картинку тем более).

Quote:
Как узнать ObjectId вещи, на которую наведен курсор?

А позвольте полюбопытствовать для чего? Может есть другое решение...
Link to comment
Share on other sites

А дальше как? EVENT_INGAME_UNDER_CURSOR_CHANGED для интерфейса передает только 1 строчку state == "interface" и все

Как бы еще узнать, что за виджет под курсором

Link to comment
Share on other sites

Guest Urjin

Был в командировке, прошу прощения за долгий ответ.

Quote:

EVENT_INGAME_UNDER_CURSOR_CHANGED - поля:

state: string - может принимать следующие значения:

- "interface" - курсор находится над элементом интерфейса, кроме основного 3d-view

- "main_view_3d_none" - курсор находится на основном 3d-view, под ним нет юнитов

- "main_view_3d_unit" - курсор находится на основном 3d-view, под ним находится юнит

Для этого случая присылается дополнительное поле:

unitId: ObjectId (not nil) - идентификатор юнита под курсором

- "main_view_3d_device" - курсор находится на основном 3d-view, под ним находится устройство (не юниты, сундуки и пр.)

Для этого случая присылаются дополнительные поля:

deviceId: ObjectId (not nil) - идентификатор устройства под курсором

canUse: boolean - можно ли использовать устройство в текущий момент (в частности, учитывается расстояние до него)

- "main_view_3d_astral_unit" - курсор находится на основном 3d-view, под ним находится астральный юнит

Для этого случая присылается дополнительное поле:

unitId: ObjectId (not nil) - идентификатор астрального юнита под курсором

- "main_view_3d_interactive_device_element" - курсор находится на интерактивном элементе какого-либо устройства, при работе с этим устройством.

Для этого случая присылается дополнительные поля:

deviceType: number (enum USDEV_...) - тип корабельного устройства

Если это USDEV_SCANER, то дополнительные поля:

type: number (enum HT_...) - тип хаба {HT_NONE, HT_UNKNOWN, HT_OUR, HT_ENEMYSHIP, HT_PORTAL, HT_ALLOD, HT_ISLAND}

name: WString or nil - название хаба, если это HT_PORTAL

т.е. если курсор находится не в окне 3Д - мы просто получим значение, что он находится в интерфейсе и все. а где он, над окном персонажа, над ActionPanel, или где-нибудь еще, вообще непонятно. потому и не подходит. Я рассматривал этот вариант.

Quote:

А позвольте полюбопытствовать для чего? Может есть другое решение...

Я хочу на базе темы "О гармонии, или в поисках золотой середины в статах", написать аддон, который будет оценивать эффективность персонажа, и выводить в тултип (подсказку) под предметом.

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

но самая фишка в том, чтоб понять, станет ли твой персонаж эффективнее, не покупая/ролля и примеряя вещь, а до этого.

вот как-то так.

UPD: потому и нужно вытягивать ObjID предмета, с него я вытяну характеристики вещи, и потом заменю на них характеристики персонажа, и перерассчитаю общую эффективность. Если есть другие идеи - буду рад.

Link to comment
Share on other sites

Ясно, EVENT_INGAME_UNDER_CURSOR_CHANGED для этой цели не подходит.

Тогда загляни в этот ларчик Али-Бабы:

Interface.1.0.03.26.2.zip

Это все скрипты разработчиков из игры версии АО 1.0.03.26.2, последней версии, после которой они были зашифрованы.

Если там не будет ответа, то значит, никак. Но очень велики шансы, что ответ ты там найдёшь.

P.S. Прочитал отрывками статью о гармонии, ОЧЕНЬ интересно, только читается медленно :)

Link to comment
Share on other sites

Guest Urjin

Гляну, спасибо, просто есть опасение, что если его нет в нормальном АПИ, то разрабы считают, что его и не должно быть, соответственно могут отключить функционал в следующих патчах :(

UPD:

Два вопроса.

1. Есть идея. Может быть возможно как-нибудь узнать ObjId предмета под курсором мыши? тогда по kbflags можно будет назначить какой-нить хоткей и при наведении курсора на предмет нажимать его и таким образом вытягивать.

2. Я порылся в Interface.1.0.03.26.2, но там совсем все по-другому. собственно, там и был зарыт SCRIPT_REQUEST_CONTEXT_TOOLTIP, но что это за эвент такой и как он вызывается, совершенно непонятно.

т.е. прописан он вот так:

Code:
 onBase [ "SCRIPT_REQUEST_CONTEXT_TOOLTIP" ]  = function( params )

а вызывается так:

Code:
multevent.RegisterEventHandlers( onBase )

совсем непохоже на тот вариант вызова эвентов к которому я привык. может кто-нибудь проконсультировать, как работать со скриптовыми эвентами?

Link to comment
Share on other sites

Guest Abagor
Quote:
EVENT_SHOW_ITEMS_INFO
В сообщеннии приходит список ValuedObject-ов - объектов, в которых содержится информация о предметах. Эти объекты можно добавлять в какой либо ValuedText.


Возможно так прокатит (не тестил):

Code:
function Test(o)
local oid = o.items [0] :GetId()
common.LogInfo("common", "ID объекта: "..oid)
end

common.RegisterEventHandler(Test, "EVENT_SHOW_ITEMS_INFO")


Должен выдать ID первого (то бишь [0]) объекта.
Link to comment
Share on other sites

SCRIPT_REQUEST_CONTEXT_TOOLTIP - это событие возникает, когда указатель мышки задержался на 1 секунду над каким-то "активным" элементом интерфейса (например, любая иконка). Раньше это событие приходило в аддоны, и мы им пользовались, чтобы показывать свои тултипы. Но когда у нас отобрали common.SendEvent(), дав нам взамен урезанный userMods.SendEvent(), пропал способ запрашивать показ подсказки. Поэтому, мы перестали пользоваться подсказками.

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

Link to comment
Share on other sites

  • 2 weeks later...

Совет Abagor'а не сработал :(

Народ, может подумать в другом направлении?

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

Есть идеи?

И еще попутно вопрос, если так - никак, может быть можно создать какой-нибудь, типа, InputBox? Куда руками забивать интересующие статы (благо их немного)?

UPD: Щас додумал, (по поводу EVENT_SHOW_ITEMS_INFO) что за среда такая UIState? может все дело в том, что из нее надо как-то по-особенному извлекать инфу?

Link to comment
Share on other sites

Guest Abagor

Узнать бонус к статам от предмета легко. Только нужно выбрать к какому событию сие привязывать. Например, к появлению в сумке или же получать список предметов, уже надетых на персонаже, как это сделано в aGAI.

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

Link to comment
Share on other sites

Так в том-то все и дело. С надетого на себя, или появившегося в сумке предмет вообще не нужно вытягивать статы. Его можно надеть на себя, и вытянуть уже готовые эффективные статы с аватара. Но задача аддона - выяснить станет ли персонаж эффективнее от покупки/ролла этого предмета. Т.Е. до того, как ты его сроллил/купил => до того как он появился в инвентаре. Потому события, типа ...STATS_CHANGED, ...INVENTORY_CHANGED (писал по памяти - дословно не помню), не подходят (ну, т.е. STATS_CHANGED нужен, но для другого). В этом-то и заковыка, а так действительно все просто надел предмет, снял сразу статы готовые, и посчитал эффективность.

Link to comment
Share on other sites

Guest Abagor

Похоже событие EVENT_SHOW_ITEMS_INFO вообще не срабатывает при наведении на предмет. Видимо мы неверно толкуем описание его логики исполнения. Не работает даже простейшая конструкция вида:

Code:
function GetIDs(list)

userMods.SetGlobalConfigSection("TestGetIDs", list.items)

end

--------------------------------------------------------------------------------

function Init()

common.RegisterEventHandler(GetIDs, "EVENT_SHOW_ITEMS_INFO")

end

--------------------------------------------------------------------------------

Init()

Пробежался в очередной раз взором по апи - ни чего подходящего под твои задачи не нашел :(

Видимо придется юзать примерочные на сайтах и знать будущий лут наперед. Что, конечно, не удобно.

Link to comment
Share on other sites

Guest mehael

Рылся по своим целям в старом коде.. нашел кое-что для тебя )) (возможно такого ивента уже нет.. но опробуй)

Quote:

onEvent [ "event_loot_for_greed_need" ] = function( eventParams )

local itemInfo = avatar.GetItemInfo( eventParams.itemId )

local itemName = itemInfo.name

--lootHash [ eventparams.rollid ] = itemName

end

Link to comment
Share on other sites

Quote:

local itemInfo = avatar.GetItemInfo( eventParams. ItemId) )

От тож, что для того, чтоб воспользоваться этой функцией нужен ItemId, а его нет. :(

Я так и понял. По-ходу, тему можно закрывать. В назидание потомкам: Узнать ItemID предмета до того, как его получил - невозможно.
Link to comment
Share on other sites

Guest mehael

В этот ивент не приходит {ItemId} или нет самого ивента?

По идее это событие EVENT_LOOT_FOR_GREED_NEED срабатывает при начале рола и Params.ItemId в него должно передаваться с сервера.

Link to comment
Share on other sites

Guest fastergadgethippo

У меня появился вопрос, как вытащить ID эмоций, форум пошарил, но как то не нашел, может я кривой и слепой, если есть тема то дайте ссылку...

Link to comment
Share on other sites

Согласен, но это - частный случай. а как быть при покупке на ауке?

Хотя с другой стороны - это уже неплохо.

Link to comment
Share on other sites

Quote:
EVENT_LOOT_FOR_GREED_NEED
Сообщение приходит при начале дележа при Greed/Need ролле:
-- поля
rollId: ObjectId (not nil) - уникальный идентификатор ролла
itemId: ObjectId (not nil) - уникальный идентификатор айтема
count: number (int) - количество данного айтема в стеке

По крайней мере во время ролла итем можно узнать

Кстати, походу при любом перемещении итемов в сумку-банк, одевание из сумки, исходный итем уничтожается, а в нужном месте появляется его копия, уже с другим ИД

+ Еще информация о надетых на кого-то вещах
Quote:
unit.GetEquipmentItemId( unitId, slot )
..
-- возвращаемые значения:
ObjectId - идентификатор предмета экипировки


Шаримся на аукционе
auction.GetAuctions()
Quote:
auction.GetAuctionInfo( id )
..
itemId: ObjectId - id предмета, выставленного на аукцион

Link to comment
Share on other sites

Guest mehael

Действительно, можно наставить рядом с каждой пиктограммой лота на аукционе маленький значек вопросика например с реакцией на наведение.. при наведении узнавать имя нашего значка-виджета и из него узнавать id аукционое --> id предмета как предложил Nikon..

Link to comment
Share on other sites

Guest mehael

Обязательно гляньте в хелпе вкладочку CategoryEmotes.. там еще много полезной нформации ^_^ да и Ctrl+F вам в помощь.

Code:
local emotes = avatar.GetEmotes()

for i, id in emotes do

  local emoteInfo = avatar.GetEmoteInfo( id )

  LogInfo( emoteInfo.sysName .. " id = " ..  emoteInfo.id)

end

ЗЫ: Этот код работает только после создания Аватара.. т.е. только после события EVENT_AVATAR_CREATED

.. а я уже месяц бегаю с аддоном АвтоЭмоции.. но выкладывать не хочу, а то мир погрузится во флуд >_<

... и еще - топик для вопросов по API, а то в оффтоп идем >_>

Link to comment
Share on other sites

а можно по-подробнее в этом месте, как это реализовать?

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share


×
×
  • Create New...

Important Information

By using our site you agree to the Terms of Use