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

Servers monitoring and the Addons Editor

We present you two legends. All dreams come true.

Servers monitoring The Addons Editor

Digest April

We talk about what was done and updated in the past month. We help keep abreast of events.

Read more

Game tooltips

Tooltips provide a way for 3rd party fansites and extensions to display detailed information on mouseover.

Read more

Подскажите, в чем ошибка


Unicorn79
 Share

Recommended Posts

TrackName = trackInfo.playerName

LogInfo ( "Получено имя: ", TrackName )

if (TrackName == "Аукционер") then ....

 

Вопрос. Почему, несмотря на то, что в лог выводится "Аукционер", значение выражения в операторе if равно false?

 

 

 

 

 

Link to comment
Share on other sites

 

TrackName = trackInfo.playerName
LogInfo ( "Получено имя: ", TrackName )
if (TrackName == "Аукционер") then ....
 
Вопрос. Почему, несмотря на то, что в лог выводится "Аукционер", значение выражения в операторе if равно false?

 

 

Читаем доки:

objects.GetTrackInfo( trackId )
...
playerName: WString.

Твой "Аукционер" - это Lua string(ASCII), а trackInfo.playerName - WString(UTF-16). Это разные типы данных, при сравнении дают false.

 

Перевести WString в string можно функцией userMods.FromWString( text ).

Link to comment
Share on other sites

Спасибо! А string в WString функцией  userMods.ToWString (text) ?

Да.

Но надежней сравнивать именно стринги, встринг иногда тоже не сравниваются

 

Кстати тут кто-то использовал интересный код, в первой строчке ставишь

local FromWS, ToWS = userMods.FromWString, userMods.ToWString

 

И дальше используешь не userMods.FromWString а FromWS и все работает как надо, а вместо userMods.ToWString всего лишь ToWS

Link to comment
Share on other sites

WString это userdata, сравнивать WStrinmg операторами ==, ~= нельзя. Для сравнения WString есть функции common.CompareWStringEx( text1, text2 ) и common.CompareWString( text1, text2 ).

Link to comment
Share on other sites

Раз уж завел тему, чтоб не плодить новые, спрошу еше раз сюда.

 

Есть функция:

 

===========

function OnRem ( tracks, params )
   for j, trackId in tracks do
      local trackInfo = objects.GetTrackInfo( trackId )

     ............
   end
end

========

 

В логе выдает ошибку:

 

Game::LuaObjectsGetTrackInfoPart: cannot find track data (id=731719), details: int __cdecl Game::LuaObjectsGetTrackInfoPart(bool &,const struct GMUIHelper::ITrackData *&,struct lua_State *)

 

В чем причина? Вроде он получает идентификатор трэка (id=731719), но... 

Link to comment
Share on other sites

а запусти

local trackstest = objects.GetTracks()
for i, trackId in trackstest do
  LogInfo( "trackId: ", trackId )
end
И если там не будет твоего id, значит трек не в зоне действия аватара.

(Код для отладки)

вообще надо треки ловить по эвентам и если EVENT_TRACK_REMOVED

удалять этот trackId

Link to comment
Share on other sites

Огромное спасибо, разобрался. Трэк действительно находился вне зоны действия аватара.

 

Скажите, а правильно ли я понимаю работу функций table.insert( Таблица, Значение ) и table.remove( Таблица, Ключ ). А именно: вторым параметром ИНСЕРТа является значение, которое я хочу добавить в таблицу-массив, а вторым параметром РЕМУВа является ключ (порядковый номер)  того значения, которое я хочу удалить?

Link to comment
Share on other sites

Огромное спасибо, разобрался. Трэк действительно находился вне зоны действия аватара.

 

Скажите, а правильно ли я понимаю работу функций table.insert( Таблица, Значение ) и table.remove( Таблица, Ключ ). А именно: вторым параметром ИНСЕРТа является значение, которое я хочу добавить в таблицу-массив, а вторым параметром РЕМУВа является ключ (порядковый номер)  того значения, которое я хочу удалить?

Да, правильно, при этом если ты работаешь с таблицей с ТОЛЬКО помощью insert и remove. Создание/удаление новых элементов другими методами ведет к невозможности работать с таблицей через insert и remove, если не ошибаюсь.

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Кружок на земле более нельзя, конус вверх более нельзя. Это были VisObject'ы. Их можно было использовать если знать как, однако более это невозможно.

Link to comment
Share on other sites

Хорошо, а вообще каким-либо образом можно выделить? Вот мой аддон нашел, к примеру, аукционера в новике. Я могу как-то его подстветить/выделить/отметить среди остальной толпы?

Edited by Unicorn79
Link to comment
Share on other sites

Хорошо, а вообще каким-либо образом можно выделить? Вот мой аддон нашел, к примеру, аукционера в новике. Я могу как-то его подстветить/выделить/отметить среди остальной толпы?

Я кстати наврал сообщением выше. Конус это не VisObject а Widget3D, так что "конус в небо" прилепить можно, см. функцию AttachWidget3D.

 

Еще можно выделить цветом, подобно тому как светятся юниты при нажатии T. При этом любым цветом с любой "интенсивностью".

Link to comment
Share on other sites

Setras, премного благодарен :) зашел сюда спросить  "А как же AttachWidget3D ?" а Вы уже сами отписали. Еще раз огромное спасибо!

 

 

 

Еще можно выделить цветом, подобно тому как светятся юниты при нажатии T. При этом любым цветом с любой "интенсивностью".

 

Подскажите, пожалуйста, как? Выберу для себя более подходящее выделение.

Edited by Unicorn79
Link to comment
Share on other sites

Setras, премного благодарен :) зашел сюда спросить  "А как же AttachWidget3D ?" а Вы уже сами отписали. Еще раз огромное спасибо!

Сперва подумал что "конус" есть конус, т.е. трехмерная фигура. Потом вспомнил что это плоская 2Д хрень которая уходит в небо.

Подскажите, пожалуйста, как? Выберу для себя более подходящее выделение.

object.Highlight( objectId, type, color, color2, period )

 

Юниты, вероятно, являются интерактивными объектами.

Link to comment
Share on other sites

Простите еще раз. А не могли бы вы привести пример как реализовать этот самый "конус в небо". Что-то , как не экспериментирую с AttachWidget3d, ничего не получается. Заранее спасибо!

Link to comment
Share on other sites

local wtControl3D = stateMainForm:GetChildChecked( "MainAddonMainForm", false ):GetChildChecked( "MainScreenControl3D", false )
wtControl3D:AddWidget3D( wtWT[v], size, object.GetPos(avatar.GetId()), false, false, 175.0, WIDGET_3D_BIND_POINT_HIGH, 1, 1 )
object.AttachWidget3D( v, wtControl3D, wtWT[v], 3 )

wtWT[v] - виджет, v - юнит.

  • Upvote 1
Link to comment
Share on other sites

Доброго времени суток! У меня созрел новый вопрос.

Аддон отслеживает 2 событыя: ON_EVENT_TRACK_ADDED и ON_EVENT_TRACK_REMOVED.

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

Link to comment
Share on other sites

В случае если за кадр произошли оба события, оба "события" придут в кадре в случайном порядке. Вероятность такого - крайне мала.

 

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

Link to comment
Share on other sites

Да, это понятно, иногда срабатывает сначала ADDED потом REMOVED, иногда наоборот. Мне нужно, чтобы обязательно сначала сработал обработчик Эдда, ибо в противном случае нарушается логика алгоритма. Так вот, есть ли какая-либо фунция типа pause (msec), которую можно вставить в обработчик Ремува, чтобы подождать, чтобы все таки сначала выполнился обработчик Эдда? или тут надо работать с потоками...

Edited by Unicorn79
Link to comment
Share on other sites


function oneventremoved(params)

userMods.SendEvent( "Removed", params)

end

common.RegisterEventHandler(oneventremoved, "ON_EVENT_TRACK_REMOVED")

function Removed(params)

end

common.RegisterEventHandler(Removed, "Removed")

Link to comment
Share on other sites

Или как мне кажется можно вот так:

function oneventremoved(params)

 ...

 common.UnRegisterEventHandler(oneventremoved, "ON_EVENT_TRACK_REMOVED")

end

 

function add(params)

 ...

 common.RegisterEventHandler(oneventremoved, "ON_EVENT_TRACK_REMOVED")

end

 

common.RegisterEventHandler(add, "ON_EVENT_TRACK_ADDED")

 

 

При событии АДД включать реакцию на событие Removed, ну а там отключать после его появления.

Link to comment
Share on other sites

Или как мне кажется можно вот так:

 

При событии АДД включать реакцию на событие Removed, ну а там отключать после его появления.

неправильно.

Link to comment
Share on other sites

Здравствуйте!

Добрался до визуальных объектов. Прописал ресурс, объявляю вот так:

local VisObj = common.GetAddonRelatedVisObject( "MyVisObj" )

 

При логировании идентификатор прописывается в логе, значит ресурс я объявляю правильно. Как его теперь прицепить к необходимому мне объекту (мобу)? Спасибо.

Link to comment
Share on other sites

При логировании идентификатор прописывается в логе, значит ресурс я объявляю правильно. Как его теперь прицепить к необходимому мне объекту (мобу)? Спасибо.

Никак. Пожалуйста.

Link to comment
Share on other sites

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  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