Unicorn79 Posted October 12, 2013 Share Posted October 12, 2013 TrackName = trackInfo.playerName LogInfo ( "Получено имя: ", TrackName ) if (TrackName == "Аукционер") then .... Вопрос. Почему, несмотря на то, что в лог выводится "Аукционер", значение выражения в операторе if равно false? Quote Link to comment Share on other sites More sharing options...
ramirez Posted October 12, 2013 Share Posted October 12, 2013 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 ). Quote Link to comment Share on other sites More sharing options...
Unicorn79 Posted October 12, 2013 Author Share Posted October 12, 2013 Спасибо! А string в WString функцией userMods.ToWString (text) ? Quote Link to comment Share on other sites More sharing options...
jedbez Posted October 12, 2013 Share Posted October 12, 2013 Спасибо! А string в WString функцией userMods.ToWString (text) ? Да. Но надежней сравнивать именно стринги, встринг иногда тоже не сравниваются Кстати тут кто-то использовал интересный код, в первой строчке ставишь local FromWS, ToWS = userMods.FromWString, userMods.ToWString И дальше используешь не userMods.FromWString а FromWS и все работает как надо, а вместо userMods.ToWString всего лишь ToWS Quote Link to comment Share on other sites More sharing options...
Setras Posted October 13, 2013 Share Posted October 13, 2013 WString это userdata, сравнивать WStrinmg операторами ==, ~= нельзя. Для сравнения WString есть функции common.CompareWStringEx( text1, text2 ) и common.CompareWString( text1, text2 ). Quote Link to comment Share on other sites More sharing options...
Unicorn79 Posted October 15, 2013 Author Share Posted October 15, 2013 Раз уж завел тему, чтоб не плодить новые, спрошу еше раз сюда. Есть функция: =========== function OnRem ( tracks, params ) for j, trackId in tracks do local trackInfo = objects.GetTrackInfo( trackId ) ............ endend ======== В логе выдает ошибку: Game::LuaObjectsGetTrackInfoPart: cannot find track data (id=731719), details: int __cdecl Game::LuaObjectsGetTrackInfoPart(bool &,const struct GMUIHelper::ITrackData *&,struct lua_State *) В чем причина? Вроде он получает идентификатор трэка (id=731719), но... Quote Link to comment Share on other sites More sharing options...
logg Posted October 15, 2013 Share Posted October 15, 2013 а запусти local trackstest = objects.GetTracks() for i, trackId in trackstest do LogInfo( "trackId: ", trackId ) end И если там не будет твоего id, значит трек не в зоне действия аватара.(Код для отладки) вообще надо треки ловить по эвентам и если EVENT_TRACK_REMOVED удалять этот trackId Quote Link to comment Share on other sites More sharing options...
Unicorn79 Posted October 16, 2013 Author Share Posted October 16, 2013 Огромное спасибо, разобрался. Трэк действительно находился вне зоны действия аватара. Скажите, а правильно ли я понимаю работу функций table.insert( Таблица, Значение ) и table.remove( Таблица, Ключ ). А именно: вторым параметром ИНСЕРТа является значение, которое я хочу добавить в таблицу-массив, а вторым параметром РЕМУВа является ключ (порядковый номер) того значения, которое я хочу удалить? Quote Link to comment Share on other sites More sharing options...
Setras Posted October 16, 2013 Share Posted October 16, 2013 Огромное спасибо, разобрался. Трэк действительно находился вне зоны действия аватара. Скажите, а правильно ли я понимаю работу функций table.insert( Таблица, Значение ) и table.remove( Таблица, Ключ ). А именно: вторым параметром ИНСЕРТа является значение, которое я хочу добавить в таблицу-массив, а вторым параметром РЕМУВа является ключ (порядковый номер) того значения, которое я хочу удалить? Да, правильно, при этом если ты работаешь с таблицей с ТОЛЬКО помощью insert и remove. Создание/удаление новых элементов другими методами ведет к невозможности работать с таблицей через insert и remove, если не ошибаюсь. Quote Link to comment Share on other sites More sharing options...
Unicorn79 Posted October 17, 2013 Author Share Posted October 17, 2013 Доброго времени суток, коллеги! А подскажите, каким образом можно подстветить необходимого мне моба, подобно тому, как они подсвечиваются "лампочкой" - кружок на земле и конус вверх. Заранее спасибо. Quote Link to comment Share on other sites More sharing options...
Setras Posted October 17, 2013 Share Posted October 17, 2013 Кружок на земле более нельзя, конус вверх более нельзя. Это были VisObject'ы. Их можно было использовать если знать как, однако более это невозможно. Quote Link to comment Share on other sites More sharing options...
Unicorn79 Posted October 17, 2013 Author Share Posted October 17, 2013 (edited) Хорошо, а вообще каким-либо образом можно выделить? Вот мой аддон нашел, к примеру, аукционера в новике. Я могу как-то его подстветить/выделить/отметить среди остальной толпы? Edited October 17, 2013 by Unicorn79 Quote Link to comment Share on other sites More sharing options...
Setras Posted October 17, 2013 Share Posted October 17, 2013 Хорошо, а вообще каким-либо образом можно выделить? Вот мой аддон нашел, к примеру, аукционера в новике. Я могу как-то его подстветить/выделить/отметить среди остальной толпы? Я кстати наврал сообщением выше. Конус это не VisObject а Widget3D, так что "конус в небо" прилепить можно, см. функцию AttachWidget3D. Еще можно выделить цветом, подобно тому как светятся юниты при нажатии T. При этом любым цветом с любой "интенсивностью". Quote Link to comment Share on other sites More sharing options...
Unicorn79 Posted October 17, 2013 Author Share Posted October 17, 2013 (edited) Setras, премного благодарен зашел сюда спросить "А как же AttachWidget3D ?" а Вы уже сами отписали. Еще раз огромное спасибо! Еще можно выделить цветом, подобно тому как светятся юниты при нажатии T. При этом любым цветом с любой "интенсивностью". Подскажите, пожалуйста, как? Выберу для себя более подходящее выделение. Edited October 17, 2013 by Unicorn79 Quote Link to comment Share on other sites More sharing options...
Setras Posted October 17, 2013 Share Posted October 17, 2013 Setras, премного благодарен зашел сюда спросить "А как же AttachWidget3D ?" а Вы уже сами отписали. Еще раз огромное спасибо! Сперва подумал что "конус" есть конус, т.е. трехмерная фигура. Потом вспомнил что это плоская 2Д хрень которая уходит в небо. Подскажите, пожалуйста, как? Выберу для себя более подходящее выделение. object.Highlight( objectId, type, color, color2, period ) Юниты, вероятно, являются интерактивными объектами. Quote Link to comment Share on other sites More sharing options...
Unicorn79 Posted October 18, 2013 Author Share Posted October 18, 2013 Простите еще раз. А не могли бы вы привести пример как реализовать этот самый "конус в небо". Что-то , как не экспериментирую с AttachWidget3d, ничего не получается. Заранее спасибо! Quote Link to comment Share on other sites More sharing options...
Setras Posted October 18, 2013 Share Posted October 18, 2013 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 - юнит. 1 Quote Link to comment Share on other sites More sharing options...
Unicorn79 Posted October 20, 2013 Author Share Posted October 20, 2013 Доброго времени суток! У меня созрел новый вопрос. Аддон отслеживает 2 событыя: ON_EVENT_TRACK_ADDED и ON_EVENT_TRACK_REMOVED. Так вот иногда возникают ситуации, когда события (я так понимаю, возможно, заблуждаюсь) происходят одновременно, во всяком случае, аддон не успевает зафиксировать появление трэка. Как поступить? Quote Link to comment Share on other sites More sharing options...
Setras Posted October 20, 2013 Share Posted October 20, 2013 В случае если за кадр произошли оба события, оба "события" придут в кадре в случайном порядке. Вероятность такого - крайне мала. Как минимум можешь логировать приход каждого из событий чтобы правильнее понять что происходит. Функция, возвращающая локальное время, также предоставляет миллисекунды. Quote Link to comment Share on other sites More sharing options...
Unicorn79 Posted October 20, 2013 Author Share Posted October 20, 2013 (edited) Да, это понятно, иногда срабатывает сначала ADDED потом REMOVED, иногда наоборот. Мне нужно, чтобы обязательно сначала сработал обработчик Эдда, ибо в противном случае нарушается логика алгоритма. Так вот, есть ли какая-либо фунция типа pause (msec), которую можно вставить в обработчик Ремува, чтобы подождать, чтобы все таки сначала выполнился обработчик Эдда? или тут надо работать с потоками... Edited October 20, 2013 by Unicorn79 Quote Link to comment Share on other sites More sharing options...
Setras Posted October 20, 2013 Share Posted October 20, 2013 function oneventremoved(params) userMods.SendEvent( "Removed", params) end common.RegisterEventHandler(oneventremoved, "ON_EVENT_TRACK_REMOVED") function Removed(params) end common.RegisterEventHandler(Removed, "Removed") Quote Link to comment Share on other sites More sharing options...
jedbez Posted October 20, 2013 Share Posted October 20, 2013 Или как мне кажется можно вот так: 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, ну а там отключать после его появления. Quote Link to comment Share on other sites More sharing options...
Setras Posted October 21, 2013 Share Posted October 21, 2013 Или как мне кажется можно вот так: При событии АДД включать реакцию на событие Removed, ну а там отключать после его появления. неправильно. Quote Link to comment Share on other sites More sharing options...
Unicorn79 Posted October 22, 2013 Author Share Posted October 22, 2013 Здравствуйте!Добрался до визуальных объектов. Прописал ресурс, объявляю вот так:local VisObj = common.GetAddonRelatedVisObject( "MyVisObj" ) При логировании идентификатор прописывается в логе, значит ресурс я объявляю правильно. Как его теперь прицепить к необходимому мне объекту (мобу)? Спасибо. Quote Link to comment Share on other sites More sharing options...
Setras Posted October 23, 2013 Share Posted October 23, 2013 При логировании идентификатор прописывается в логе, значит ресурс я объявляю правильно. Как его теперь прицепить к необходимому мне объекту (мобу)? Спасибо. Никак. Пожалуйста. Quote Link to comment Share on other sites More sharing options...
Recommended Posts