Перейти к содержанию

Дайджесты за январь-февраль

Обновления гайдов и аддонов

Январь Февраль

Мониторинг серверов и редактор аддонов

Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.

Мониторинг серверов Редактор аддонов

Подсказки из игры на вашем сайте

Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.

Подробнее

Апдейтер аддонов

Представляем вам программу для автообновления аддонов и делимся подробностями.

Подробнее Скачать

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


Unicorn79

Рекомендуемые сообщения

TrackName = trackInfo.playerName

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

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

 

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

 

 

 

 

 

Ссылка на комментарий
Поделиться на другие сайты

 

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 ).

Ссылка на комментарий
Поделиться на другие сайты

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

Да.

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

 

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

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

 

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

 

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

 

===========

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), но... 

Ссылка на комментарий
Поделиться на другие сайты

а запусти

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

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

 

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

Ссылка на комментарий
Поделиться на другие сайты

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

 

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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

Изменено пользователем Unicorn79
Ссылка на комментарий
Поделиться на другие сайты

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

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

 

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

Ссылка на комментарий
Поделиться на другие сайты

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

 

 

 

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

 

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

Изменено пользователем Unicorn79
Ссылка на комментарий
Поделиться на другие сайты

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

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

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

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

 

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

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 - юнит.

Ссылка на комментарий
Поделиться на другие сайты

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

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

 

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

Ссылка на комментарий
Поделиться на другие сайты

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

Изменено пользователем Unicorn79
Ссылка на комментарий
Поделиться на другие сайты


function oneventremoved(params)

userMods.SendEvent( "Removed", params)

end

common.RegisterEventHandler(oneventremoved, "ON_EVENT_TRACK_REMOVED")

function Removed(params)

end

common.RegisterEventHandler(Removed, "Removed")

Ссылка на комментарий
Поделиться на другие сайты

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

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, ну а там отключать после его появления.

Ссылка на комментарий
Поделиться на другие сайты

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

 

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

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

local VisObj = common.GetAddonRelatedVisObject( "MyVisObj" )

 

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

Ссылка на комментарий
Поделиться на другие сайты

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

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

Ссылка на комментарий
Поделиться на другие сайты

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...

Важная информация

Пользуясь сайтом, вы принимаете Условия использования