Setras Posted December 16, 2010 Share Posted December 16, 2010 По событию EVENT_UNITS_CHANGED юзается функция object.AttachWidget2D. Проблема в том что в лог срется гигабйтами ошибка Error: UI::LuaObjectAttachWidget2D: interactive object not found: №№№№№№, details: int __cdecl UI::LuaObjectAttachWidget2D(struct lua_State *) Где вместо №№№№№ - обджект ИД юнита. Т.е. как я подозреваю сперва приходит событие мол "такие то юниты появились в зоне действия", а через некоторое время (три, пять минут? помним тот злополучный патч с загрузкой окружающих персонажей по 5 минут?) иногда короткое(секунда-две), иногда длинное(лагоград) юниты таки появляются в клиенте, хотя во время юза разных проверок стоящих перед object.AttachWidget2D все они возвращают верные значения. В общем сталкивался ли кто с такой фигней и есть ли обходные пути решения? Quote Link to comment Share on other sites More sharing options...
Guest mehael Posted December 16, 2010 Share Posted December 16, 2010 .. если проверка на то, что юнит появляется, а не пропадает не помогает.. Тогда только по-русски пихать по событию в список, потом по секундному таймеру проверять что юнит существует(unit.isExist) и если появился - создаем ваш виджет и удаляем запись из списка >_< Quote Link to comment Share on other sites More sharing options...
Nikon Posted December 16, 2010 Share Posted December 16, 2010 А привести код этого куска, где твой обьект аттачится? Аттачишь только к тем кто spawned? Quote: хотя во время юза разных проверок стоящих перед object.AttachWidget2D все они возвращают верные значения Те проверка if object.isExist(units.spawned [0 итд] ) then object.AttachWidget2D end проходит? ЗЫ. Не знаю, как там с аттачами - инфа по юниту приходит нормально, в этом событии уже можно все доступное о нем узнать ЗЫЫ. Бывает еще юнит на грани досягаемости - спавнится и со следующим событием деспавнится Quote Link to comment Share on other sites More sharing options...
Setras Posted December 18, 2010 Author Share Posted December 18, 2010 Вот конец той функции: if params.spawned then for i, v in params.spawned do if unit.IsPlayer( v ) then wtWT[v] = mainForm:CreateWidgetByDesc(wtF:GetWidgetDesc()) object.AttachWidget2D( v, wtWT[v], ATTACHED_OBJECT_POS_UP ) wtWT[v]:Show(true) end end end Вероятно надо ввести проверку на то не находится ли юнит одновременно и в таблице params.spawned и в таблице params.despawned ... Но я сомневаюсь что дело в этом. Но сейчас лень заниматься этим аддоном, хоть лог и засоряется неимоверно быстро, аддон то работает =\ Quote Link to comment Share on other sites More sharing options...
Setras Posted December 19, 2010 Author Share Posted December 19, 2010 Error: addon Titan: Game::LuaObjectIsFar: InteractiveObject (id=21247) not found, details: int __cdecl Game::LuaObjectIsFar(struct lua_State *) Error: addon Titan: UI::LuaObjectAttachWidget2D: interactive object not found: 21247, details: int __cdecl UI::LuaObjectAttachWidget2D(struct lua_State *) if unit.IsPlayer( v ) and not object.IsFar( v ) then -- unit.IsPlayer(21247)? Безбазару, этот юнит плеер! -- unit.isFar(21247)? Ты че, попутал? Нет такого юнита и не было! Quote Link to comment Share on other sites More sharing options...
Setras Posted December 19, 2010 Author Share Posted December 19, 2010 LogInfo("Object name is ", object.GetName(v)) Вставил эту хрень перед if unit.IsPlayer( v ) and not object.IsFar( v ) then и что я вижу? Уже 10 минут лог пестрит разнообразием имен-названий и ни одной ошибки... Quote Link to comment Share on other sites More sharing options...
Setras Posted December 19, 2010 Author Share Posted December 19, 2010 Наверно ошибок в логе не было потому что их просто не было... Фак мой мозг..... Quote Link to comment Share on other sites More sharing options...
Guest mehael Posted December 19, 2010 Share Posted December 19, 2010 .. я конечно понимаю что событие EVENT_UNITS_CHANGED крутая вещьчь.. но пятка левой ноги упорно подсказывает мне что Code: for i, v in params.spawned do что-то связанное с перебором полученной инфы косячит.. хотя я сам хзВобщем по теме - попробуй заюзать EVENT_UNIT_SPAWNED и не париться Высылает на каждого нового юнита ивент с unitId >_< Quote Link to comment Share on other sites More sharing options...
Setras Posted December 19, 2010 Author Share Posted December 19, 2010 Я по params.spawned виджеты создаю, а по params.despawned - уничтожаю. ИМХО все верно оно перебирает. Но порой конструкция вида for i, v in params.spawned do LogInfo("Name ",object.GetName(v)," and Id ",v) if unit.IsPlayer( v ) and not object.IsFar( v ) then wtWT[v] = mainForm:CreateWidgetByDesc(wtF:GetWidgetDesc()) object.AttachWidget2D( v, wtWT[v], ATTACHED_OBJECT_POS_UP ) Выдает в лог примерно такое: Code: Info: addon AllianceICO: Name Прохор Волков and Id 13098Info: addon AllianceICO: Name Торговля оружием для Ратоборцев and Id 13092 Info: addon AllianceICO: Name Эрис and Id 13104 Info: addon AllianceICO: Name Пьянь and Id 13166 Info: addon AllianceICO: Name Страж and Id 13222 Info: addon AllianceICO: Name ХХПрестолХХ and Id 13200 Info: addon AllianceICO: Name Стражник Новограда and Id 13216 Info: addon AllianceICO: Name МиссисФауст and Id 13208 Info: addon AllianceICO: Name Фалколн and Id 13276 Info: addon AllianceICO: Name Страж and Id 13264 Info: addon AllianceICO: Name хххИНТЕРххх and Id 13292 Info: addon AllianceICO: Name Торговля аксессуарами для Ратоборцев and Id 13306 Info: addon AllianceICO: Name ХилРусский and Id 13256 Info: addon AllianceICO: Name Стражник Новограда and Id 13270 Info: addon AllianceICO: Name СуперХай and Id 13284 Info: addon AllianceICO: Name ФаустЖрец and Id 13246 Info: addon AllianceICO: Name Торговля бронёй для Ратоборцев and Id 13300 Error: addon AllianceICO: Game::LuaObjectIsFar: InteractiveObject (id=10649) not found, details: int __cdecl Game::LuaObjectIsFar(struct lua_State *) Error: addon AllianceICO: UI::LuaObjectAttachWidget2D: interactive object not found: 10649, details: int __cdecl UI::LuaObjectAttachWidget2D(struct lua_State *) Error: addon AllianceICO: Game::LuaObjectIsFar: InteractiveObject (id=11690) not found, details: int __cdecl Game::LuaObjectIsFar(struct lua_State *) Error: addon AllianceICO: UI::LuaObjectAttachWidget2D: interactive object not found: 11690, details: int __cdecl UI::LuaObjectAttachWidget2D(struct lua_State *) Error: addon AllianceICO: Game::LuaObjectIsFar: InteractiveObject (id=11932) not found, details: int __cdecl Game::LuaObjectIsFar(struct lua_State *) Error: addon AllianceICO: UI::LuaObjectAttachWidget2D: interactive object not found: 11932, details: int __cdecl UI::LuaObjectAttachWidget2D(struct lua_State *) Error: addon AllianceICO: Game::LuaObjectIsFar: InteractiveObject (id=12069) not found, details: int __cdecl Game::LuaObjectIsFar(struct lua_State *) Error: addon AllianceICO: UI::LuaObjectAttachWidget2D: interactive object not found: 12069, details: int __cdecl UI::LuaObjectAttachWidget2D(struct lua_State *) Error: addon AllianceICO: Game::LuaObjectIsFar: InteractiveObject (id=11074) not found, details: int __cdecl Game::LuaObjectIsFar(struct lua_State *) Error: addon AllianceICO: UI::LuaObjectAttachWidget2D: interactive object not found: 11074, details: int __cdecl UI::LuaObjectAttachWidget2D(struct lua_State *) Error: addon AllianceICO: Game::LuaObjectIsFar: InteractiveObject (id=12696) not found, details: int __cdecl Game::LuaObjectIsFar(struct lua_State *) Error: addon AllianceICO: UI::LuaObjectAttachWidget2D: interactive object not found: 12696, details: int __cdecl UI::LuaObjectAttachWidget2D(struct lua_State *) Error: addon AllianceICO: Game::LuaObjectIsFar: InteractiveObject (id=10763) not found, details: int __cdecl Game::LuaObjectIsFar(struct lua_State *) Error: addon AllianceICO: UI::LuaObjectAttachWidget2D: interactive object not found: 10763, details: int __cdecl UI::LuaObjectAttachWidget2D(struct lua_State *) Error: addon AllianceICO: Game::LuaObjectIsFar: InteractiveObject (id=13104) not found, details: int __cdecl Game::LuaObjectIsFar(struct lua_State *) Error: addon AllianceICO: UI::LuaObjectAttachWidget2D: interactive object not found: 13104, details: int __cdecl UI::LuaObjectAttachWidget2D(struct lua_State *) Error: addon AllianceICO: Game::LuaObjectIsFar: InteractiveObject (id=10812) not found, details: int __cdecl Game::LuaObjectIsFar(struct lua_State *) Error: addon AllianceICO: UI::LuaObjectAttachWidget2D: interactive object not found: 10812, details: int __cdecl UI::LuaObjectAttachWidget2D(struct lua_State *) Error: addon AllianceICO: Game::LuaObjectIsFar: InteractiveObject (id=11682) not found, details: int __cdecl Game::LuaObjectIsFar(struct lua_State *) Error: addon AllianceICO: UI::LuaObjectAttachWidget2D: interactive object not found: 11682, details: int __cdecl UI::LuaObjectAttachWidget2D(struct lua_State *) Info: addon AllianceICO: Name Марианна ди Ардер and Id 13574 Info: addon AllianceICO: Name Карачикапица and Id 13536 Info: addon AllianceICO: Name демонщик and Id 13552 Info: addon AllianceICO: Name Мила Мещерская and Id 13568 Info: addon AllianceICO: Name Стражник Новограда and Id 13530 Info: addon AllianceICO: Name Иеро and Id 13544 Info: addon AllianceICO: Name АшварияРай and Id 13560 Info: addon AllianceICO: Name Просекутор and Id 13616 Quote Link to comment Share on other sites More sharing options...
Nikon Posted December 19, 2010 Share Posted December 19, 2010 Quote: if unit.IsPlayer( v ) and not object.IsFar( v ) then 1. Чем тебе поможет проверка на удаленность/на плеера обьекта, если обьекта не существует, о чем тебе, собственно, и пишут в логеQuote: object not found 2. Так как насчет предварительной проверки на существование? object.isExist. Проходит?3. Обьекты, ИД которых выдаются в despawned, уже не существуют и с ними вообще ничего нельзя сделать. Ну это так, просто инфа, мало лиХотя бывают иногда глюки (начались как раз с той обновы, в которой появилась замедленная прорисовка обьектов): обьект вроде исчез из поля действия, а инфу по нему получать можно Quote Link to comment Share on other sites More sharing options...
SLA Posted December 19, 2010 Share Posted December 19, 2010 Quote: Т.е. как я подозреваю сперва приходит событие мол "такие то юниты появились в зоне действия", а через некоторое время (три, пять минут? помним тот злополучный патч с загрузкой окружающих персонажей по 5 минут?) иногда короткое(секунда-две), иногда длинное(лагоград) юниты таки появляются в клиенте, хотя во время юза разных проверок стоящих перед object.AttachWidget2D все они возвращают верные значения. Имхо, EVENT_UNITS_CHANGED и EVENT_UNIT_SPAWNED сообщают о том, что юнит появился в зоне досягаемости (но НЕ видимости!). Но в этот момент, он визуально ЕЩЁ НЕ ВИДЕН, поэтому, аттачить к нему виждет нельзя. Есть два радиуса, имхо - юнит ID "досягаем" на большом радиусе (о чём и сообщают EVENT_UNITS_CHANGED и EVENT_UNIT_SPAWNED), а радиус визуальной видимости юнита гораздо уже. О чём и сообщает object.AttachWidget2D() - "не вижу, к кому аттачить".Юнит ID - это душа."interactive object" - это тело.То есть, в момент EVENT_UNIT_SPAWNED, юнит уже СУЩЕСТВУЕТ, и по его ID можно получить подробную информацию о нём, НО его "interactive object" ещё не существует. Сам юнит, и его "interactive object" - это разные вещи. "Interactive object" появляется значительно позже, и то, ТОЛЬКО В ТОМ СЛУЧАЕ, если этот юнит попрётся навстречу аватару. А если не попрётся, а остановится, или пробежит мимо, или рванёт обратно, то его "interactive object" (тело) так и не появится.Я не знаю способа, как определить, находится ли юнит в "зоне видимости". Может, и есть такой способ в API, я этим просто не интересовался. Quote Link to comment Share on other sites More sharing options...
Guest mehael Posted December 20, 2010 Share Posted December 20, 2010 AllianceICO )) а друзей будет выделять? Если совсем задолбаешься от наших советов - можешь как некоторые зарубежные товарищи выложить свой аддон аттачем, а мы потестим, попробуем решить головоломочку И думаю Nikon дело говорит ^^ Quote Link to comment Share on other sites More sharing options...
Setras Posted December 20, 2010 Author Share Posted December 20, 2010 Quote: 3. Обьекты, ИД которых выдаются в despawned, уже не существуют и с ними вообще ничего нельзя сделать. Да, но по этим ИД можно удалить более неиспользуемые виджеты.По поводу юнит екзист, юнит фар и т.п. - если юнит существует разве нельзя узнать far он или не far?И по поводу работы самого аддона - я еще ни разу, никогда не видел чтобы виджет не приаттачился к игроку. Т.е. ошибки сыпятся тоннами, а виджеты к игрокам все равно нормально аттачатся. Quote Link to comment Share on other sites More sharing options...
Setras Posted December 21, 2010 Author Share Posted December 21, 2010 ЖЕБАЧ! Я нашел КАКОЙ именно кусок кода генерит ошибки! Вот это ФАНТАСТИКА. Такой фигни я от себя и от луа не ожидал ))) function Retargeted(params) for k, v in wtWT do if not object.IsFar( k ) then object.AttachWidget2D( k, wtWT[k], ATTACHED_OBJECT_POS_UP ) end end end Т.к. даже если виджет БЫЛ уничтожен, запись в таблице wtWT остается(даже если значение nil видимо...)! Несмотря на то что оно работает для существующих виджетов, для несуществующих оно матерится на отсутствие объекта. И слава богу на это, а не на отсутствие виджета... P.S. Jebach is a eastern-europe-stylised word that means "oh fuck!". Maybe in Poland or Czech they say so... Quote Link to comment Share on other sites More sharing options...
Setras Posted December 21, 2010 Author Share Posted December 21, 2010 Тогда такой вопрос идиота, что делает функция DestroyWidget() ?? Quote Link to comment Share on other sites More sharing options...
SLA Posted December 21, 2010 Share Posted December 21, 2010 Физически уничтожает виджет. То есть, телепортирует по переданной ей ссылке микроскопическую квантовую чёрную дыру, которая за считанные доли секунды поглощает виджет, и тут же полностью аннигилируется сама. Но если у тебя остаётся ссылка, то теперь она ссылается на космический вакуум. P.S. Хотя, учёные уже поняли, что в Ведах написана правда - вакуума не существует. Твоя ссылка ссылается на что-то другое. На какую-нибудь космическую Ктулху, например P.S. Все виджеты, с которыми мы работаем в Lua - это ссылки (на объект userdata), в классическом понимании, как в языке Си. Quote Link to comment Share on other sites More sharing options...
SLA Posted December 21, 2010 Share Posted December 21, 2010 Так вот оно, в чём дело! Да, остаётся. Потому что, удалив виджет, ты забыл уничтожить ссылку на него: Code: DestroyWidget( wtWT [X] )wtWT [X] = nil Если ты этого не сделал, то ссылка остаётся в таблице. Она ссылается на пустоту, находящуюся где-то за пределами метагалактики. Quote Link to comment Share on other sites More sharing options...
Recommended Posts