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

Спавн-Деспавн юнитов, задержка


Setras
 Share

Recommended Posts

По событию EVENT_UNITS_CHANGED юзается функция object.AttachWidget2D.

Проблема в том что в лог срется гигабйтами ошибка

Error: UI::LuaObjectAttachWidget2D: interactive object not found: №№№№№№, details: int __cdecl UI::LuaObjectAttachWidget2D(struct lua_State *)

Где вместо №№№№№ - обджект ИД юнита.

Т.е. как я подозреваю сперва приходит событие мол "такие то юниты появились в зоне действия", а через некоторое время (три, пять минут? помним тот злополучный патч с загрузкой окружающих персонажей по 5 минут?) иногда короткое(секунда-две), иногда длинное(лагоград) юниты таки появляются в клиенте, хотя во время юза разных проверок стоящих перед object.AttachWidget2D все они возвращают верные значения.

В общем сталкивался ли кто с такой фигней и есть ли обходные пути решения?

Link to comment
Share on other sites

.. если проверка на то, что юнит появляется, а не пропадает не помогает..

Тогда только по-русски :) пихать по событию в список, потом по секундному таймеру проверять что юнит существует(unit.isExist) и если появился - создаем ваш виджет и удаляем запись из списка >_<

Link to comment
Share on other sites

А привести код этого куска, где твой обьект аттачится?

Аттачишь только к тем кто spawned?

Quote:
хотя во время юза разных проверок стоящих перед object.AttachWidget2D все они возвращают верные значения

Те проверка if object.isExist(units.spawned [0 итд] ) then object.AttachWidget2D end проходит?

ЗЫ. Не знаю, как там с аттачами - инфа по юниту приходит нормально, в этом событии уже можно все доступное о нем узнать

ЗЫЫ. Бывает еще юнит на грани досягаемости - спавнится и со следующим событием деспавнится

Link to comment
Share on other sites

Вот конец той функции:

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 ... Но я сомневаюсь что дело в этом. Но сейчас лень заниматься этим аддоном, хоть лог и засоряется неимоверно быстро, аддон то работает =\

Link to comment
Share on other sites

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)? Ты че, попутал? Нет такого юнита и не было!

Link to comment
Share on other sites

LogInfo("Object name is ", object.GetName(v))

Вставил эту хрень перед if unit.IsPlayer( v ) and not object.IsFar( v ) then и что я вижу?

Уже 10 минут лог пестрит разнообразием имен-названий и ни одной ошибки...

Link to comment
Share on other sites

.. я конечно понимаю что событие EVENT_UNITS_CHANGED крутая вещьчь.. но пятка левой ноги упорно подсказывает мне что

Code:
for i, v in params.spawned do
что-то связанное с перебором полученной инфы косячит.. хотя я сам хз

Вобщем по теме - попробуй заюзать EVENT_UNIT_SPAWNED и не париться :) Высылает на каждого нового юнита ивент с unitId >_<

Link to comment
Share on other sites

Я по 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 13098

Info: 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

Link to comment
Share on other sites

Quote:
if unit.IsPlayer( v ) and not object.IsFar( v ) then

1. Чем тебе поможет проверка на удаленность/на плеера обьекта, если обьекта не существует, о чем тебе, собственно, и пишут в логе
Quote:
object not found

2. Так как насчет предварительной проверки на существование? object.isExist. Проходит?
3. Обьекты, ИД которых выдаются в despawned, уже не существуют и с ними вообще ничего нельзя сделать. Ну это так, просто инфа, мало ли
Хотя бывают иногда глюки (начались как раз с той обновы, в которой появилась замедленная прорисовка обьектов): обьект вроде исчез из поля действия, а инфу по нему получать можно
Link to comment
Share on other sites

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, я этим просто не интересовался.
Link to comment
Share on other sites

AllianceICO )) а друзей будет выделять?

Если совсем задолбаешься от наших советов - можешь как некоторые зарубежные товарищи выложить свой аддон аттачем, а мы потестим, попробуем решить головоломочку :) И думаю Nikon дело говорит ^^

Link to comment
Share on other sites

Quote:
3. Обьекты, ИД которых выдаются в despawned, уже не существуют и с ними вообще ничего нельзя сделать.
Да, но по этим ИД можно удалить более неиспользуемые виджеты.

По поводу юнит екзист, юнит фар и т.п. - если юнит существует разве нельзя узнать far он или не far?

И по поводу работы самого аддона - я еще ни разу, никогда не видел чтобы виджет не приаттачился к игроку. Т.е. ошибки сыпятся тоннами, а виджеты к игрокам все равно нормально аттачатся.
Link to comment
Share on other sites

ЖЕБАЧ! Я нашел КАКОЙ именно кусок кода генерит ошибки!

Вот это ФАНТАСТИКА. Такой фигни я от себя и от луа не ожидал )))

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

Link to comment
Share on other sites

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

Но если у тебя остаётся ссылка, то теперь она ссылается на космический вакуум.

P.S. Хотя, учёные уже поняли, что в Ведах написана правда - вакуума не существует. Твоя ссылка ссылается на что-то другое. На какую-нибудь космическую Ктулху, например :)

P.S. Все виджеты, с которыми мы работаем в Lua - это ссылки (на объект userdata), в классическом понимании, как в языке Си.

Link to comment
Share on other sites

Так вот оно, в чём дело! Да, остаётся. Потому что, удалив виджет, ты забыл уничтожить ссылку на него:

Code:
DestroyWidget( wtWT [X] )

wtWT [X] = nil

Если ты этого не сделал, то ссылка остаётся в таблице. Она ссылается на пустоту, находящуюся где-то за пределами метагалактики.

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