У меня в карте почему то при её запуске по инету, у всех кроме Хоста вылетает. Насколько я понимаю это Десинхронизация. Я тщательно проверил свой код, и убедился что нету ничего что создаётся локально через GetLocalPlayer(). Но что ещё может вызывать десинк? Какие действия. Возможно ли это изза того что в РО есть юнит у которого есть около 70 абилок, который создаётся и сразу удаляется (это для прелода) ? Или же это изза функции call ShowUnit(...)? Или причина совсем другая?
Обычных юнитов, а точнее здания. Продавцов. У меня в одном и том же месте стоит продавец для каждого игрока. Игрок видит только своего продавца. Другие для него скрыты. Но это ведь не должно приводить к десинку. Ведь Тексттаги, Таймер-Диалоги, когда скрываются подобным образом, не приводят к десинку.
Quote (Ty3uK)
Ты сразу 70 абилок добавляешь?
Ты не понял. У меня УЖЕ ЕСТЬ юнит с этими 70 абилками. Эти абилки у него добавлено ещё в РО. В начале игры этот юнит всего лишь создаётся и удаляется, тем самым "прелодя" все его 70 абилок. Может ли юнит с 70 абилками с РО, десинхронить карту?
Добавлено (28 Март 2012, 20:02:50) --------------------------------------------- А ещё вот это может делать десинк?
Code
if GetLocalPlayer() == Player(i) then call ShowUnit( udg_Socketer[ i + 1 ], true ) call ShowUnit( udg_Socketer[ i + 11 ], true ) call ShowUnit( udg_Armor[ i + 1 ], true ) call ShowUnit( udg_Armor[ i + 11 ], true ) call ShowUnit( udg_Weapon[ i + 1 ], true ) call ShowUnit( udg_Weapon[ i + 11 ], true ) call ShowUnit( udg_Monument[ i + 1 ], true ) call ShowUnit( udg_Tavern[ i + 1 ], true ) call ClearSelection() call SelectUnit( udg_Tavern[ i + 1 ], true ) endif set i = i + 1
У меня есть незавершенный тест по десинху. И вот что по ShowUnit - Нельзя: выделять скрываемого(если уже выделен, тогда можно). Давать приказы на скрываемого юнита, давать скрываемому приказы типа цель, где цель не свой юнит. Убивать декорации. (убивать или триггерно наносить урон скрываемому можно)
Функции подобные GroupEnumUnitsInRange добавлять скрываемого в группу не будут (у кого скрыт) и другие функции на видимость юнита будут выполняться по разному или возвращать разные результаты.
Также десинх от обзора этого юнита. Например: есть катапульта, у одного игрока она видит врага, а у другого нет. Она дает приказ на атаку и тут десинх.
Поищи такое у себя или покажи сам код.
Если долго мучиться, то может, все равно нихуя не получится.
Если для игрока 1 юнит скрыт, а для игрока 2 юнит показан, то игрок 2 может выделять его. Тут будет десинк?
Quote (Impregnable)
давать скрываемому приказы типа цель, где цель не свой юнит
Такого быть у меня не может, так как скрытые юниты - магазины, НПЦ. У них приказы не требуют цели. Другое дело - способность "выбрать героя", как у любого магазина. Возможно в этом вся проблема?
Quote (Impregnable)
Поищи такое у себя или покажи сам код.
Я выявил триггер в котором существует причина для десинка. Вот код:
function Trig_Const_Actions takes nothing returns nothing local integer id = GetHandleId(gg_unit_h02F_0082) local integer i = 1 local integer pid local group g = CreateGroup() local unit un set udg_ExpModifier = 1.0 set udg_CommandPointsBad = 0 set udg_CommandPointsGood = 0 set udg_Level[1] = true set udg_Level[2] = true set udg_Level[3] = true set udg_Level[4] = true set udg_Toads = 0.0 set udg_Tornado = 0.0 set udg_hIndex = 0
set udg_Socketer[1] = gg_unit_n005_0371 set udg_Socketer[2] = gg_unit_n005_0372 set udg_Socketer[3] = gg_unit_n005_0373 set udg_Socketer[4] = gg_unit_n005_0374 set udg_Socketer[5] = gg_unit_n005_0375 set udg_Socketer[6] = gg_unit_n005_0376 set udg_Socketer[7] = gg_unit_n005_0377 set udg_Socketer[8] = gg_unit_n005_0378 set udg_Socketer[9] = gg_unit_n005_0379 set udg_Socketer[10] = gg_unit_n005_0380 set udg_Socketer[11] = gg_unit_n005_0357 set udg_Socketer[12] = gg_unit_n005_0362 set udg_Socketer[13] = gg_unit_n005_0363 set udg_Socketer[14] = gg_unit_n005_0364 set udg_Socketer[15] = gg_unit_n005_0365 set udg_Socketer[16] = gg_unit_n005_0366 set udg_Socketer[17] = gg_unit_n005_0367 set udg_Socketer[18] = gg_unit_n005_0368 set udg_Socketer[19] = gg_unit_n005_0369 set udg_Socketer[20] = gg_unit_n005_0370
set udg_Armor[1] = gg_unit_n000_0020 set udg_Armor[2] = gg_unit_n000_0245 set udg_Armor[3] = gg_unit_n000_0249 set udg_Armor[4] = gg_unit_n000_0022 set udg_Armor[5] = gg_unit_n000_0248 set udg_Armor[6] = gg_unit_n000_0023 set udg_Armor[7] = gg_unit_n000_0246 set udg_Armor[8] = gg_unit_n000_0048 set udg_Armor[9] = gg_unit_n000_0049 set udg_Armor[10] = gg_unit_n000_0247 set udg_Armor[11] = gg_unit_n000_0256 set udg_Armor[12] = gg_unit_n000_0034 set udg_Armor[13] = gg_unit_n000_0035 set udg_Armor[14] = gg_unit_n000_0257 set udg_Armor[15] = gg_unit_n000_0036 set udg_Armor[16] = gg_unit_n000_0258 set udg_Armor[17] = gg_unit_n000_0037 set udg_Armor[18] = gg_unit_n000_0259 set udg_Armor[19] = gg_unit_n000_0260 set udg_Armor[20] = gg_unit_n000_0038
set udg_Weapon[1] = gg_unit_n008_0050 set udg_Weapon[2] = gg_unit_n008_0250 set udg_Weapon[3] = gg_unit_n008_0251 set udg_Weapon[4] = gg_unit_n008_0051 set udg_Weapon[5] = gg_unit_n008_0252 set udg_Weapon[6] = gg_unit_n008_0052 set udg_Weapon[7] = gg_unit_n008_0253 set udg_Weapon[8] = gg_unit_n008_0053 set udg_Weapon[9] = gg_unit_n008_0054 set udg_Weapon[10] = gg_unit_n008_0254 set udg_Weapon[11] = gg_unit_n008_0261 set udg_Weapon[12] = gg_unit_n008_0033 set udg_Weapon[13] = gg_unit_n008_0032 set udg_Weapon[14] = gg_unit_n008_0262 set udg_Weapon[15] = gg_unit_n008_0031 set udg_Weapon[16] = gg_unit_n008_0263 set udg_Weapon[17] = gg_unit_n008_0030 set udg_Weapon[18] = gg_unit_n008_0264 set udg_Weapon[19] = gg_unit_n008_0265 set udg_Weapon[20] = gg_unit_n008_0029
set udg_Monument[2] = gg_unit_n00M_0239 set udg_Monument[3] = gg_unit_n00M_0232 set udg_Monument[5] = gg_unit_n00M_0233 set udg_Monument[7] = gg_unit_n00M_0235 set udg_Monument[10] = gg_unit_n00M_0237 set udg_Monument[1] = gg_unit_n006_0008 set udg_Monument[4] = gg_unit_n006_0011 set udg_Monument[6] = gg_unit_n006_0014 set udg_Monument[8] = gg_unit_n006_0243 set udg_Monument[9] = gg_unit_n006_0019
set udg_Tavern[1] = gg_unit_n00G_0041 set udg_Tavern[2] = gg_unit_n009_0012 set udg_Tavern[3] = gg_unit_n009_0234 set udg_Tavern[4] = gg_unit_n00G_0226 set udg_Tavern[5] = gg_unit_n009_0236 set udg_Tavern[6] = gg_unit_n00G_0227 set udg_Tavern[7] = gg_unit_n009_0238 set udg_Tavern[8] = gg_unit_n00G_0228 set udg_Tavern[9] = gg_unit_n00G_0229 set udg_Tavern[10] = gg_unit_n009_0240
Но тогда какой смысл в скрывание/показывание юнитов? Тем более что многие именно так и делают мультпродавцов. Создаётся в одном и том же месте продавец для каждого игрока. Все эти продавцы скрываются с помощью call ShowUnit( u, false ) Затем через цикл каждому игроку через GetLocalPlayer() открывается только его продавец. Разве такая система должна делать десинк? Почему же все её так рекомендуют?
Сообщение отредактировал FatalBlade - Среда, 28 Марта 2012, 20:46:41
if GetLocalPlayer() == Player(i) then call ShowUnit( udg_Socketer[ i + 1 ], true ) call ShowUnit( udg_Socketer[ i + 11 ], true ) call ShowUnit( udg_Armor[ i + 1 ], true ) call ShowUnit( udg_Armor[ i + 11 ], true ) call ShowUnit( udg_Weapon[ i + 1 ], true ) call ShowUnit( udg_Weapon[ i + 11 ], true ) call ShowUnit( udg_Monument[ i + 1 ], true ) call ShowUnit( udg_Tavern[ i + 1 ], true ) call ClearSelection() call SelectUnit( udg_Tavern[ i + 1 ], true ) endif set i = i + 1 endloop
set pid = GetHandleId(Player(i)) - если не ошибаюсь, то GetHandleId(Player(i)) = i call ShowUnit( udg_Socketer[ i + 1 ], true ) call ShowUnit( udg_Socketer[ i + 11 ], true ) +11 я примерно понимаю, но вот +1...
call SelectUnit( udg_Tavern[ i + 1 ], true ) - вот оно. Если честно очень тяжело понять зачем локально делаешь, но причина десинха в этой строке.
Добавлено (28 Март 2012, 20:47:43) ---------------------------------------------
Quote (FatalBlade)
Но тогда какой смысл в скрывание/показывание юнитов?
Как зачем. Если сильно захотеть и поизвращаться, то можно сделать интересную способность или юнит дух, который видим 1 игроку, да мало ли чего еще можно.
Добавлено (28 Март 2012, 20:50:50) ---------------------------------------------
Quote (FatalBlade)
Разве такая система должна делать десинк?
Я мог тестировать только на v1.24b, поэтому может быть, что на версиях >1.24b уже немного иначе.
Если долго мучиться, то может, все равно нихуя не получится.
set pid = GetHandleId(Player(i)) - если не ошибаюсь, то GetHandleId(Player(i)) = i
Ты путаешь GetHandleId с GetPlayerId
Quote (Impregnable)
+11 я примерно понимаю, но вот +1...
Игроков 10. Базы 2. Значит продавцов 20. Для каждого игрока есть продавец на его базе, и такой же на чужой базе.
Quote (Impregnable)
call SelectUnit( udg_Tavern[ i + 1 ], true ) - вот оно. Если честно очень тяжело понять зачем локально делаешь, но причина десинха в этой строке.
Это изза того что выбирается скрытый юнит? А если я уберу эту строку, и игрокам придётся вручную выбирать Таверну, то как только какой то игрок кликнет по таверне, тоже всех выкинет?
Сообщение отредактировал FatalBlade - Среда, 28 Марта 2012, 20:53:25
Это изза того что выбирается скрытый юнит? А если я уберу эту строку, и игрокам придётся вручную выбирать Таверну, то как только какой то игрок кликнет по таверне, тоже всех выкинет?
По идее да. Лучше убери эту строчку и проверь, а то я и сам уже начал сомневаться.
Если долго мучиться, то может, все равно нихуя не получится.
Я сделал через SetUnitVertexColor + Deselect + SelectUnit ( LoadUnitHandle(...), true ). То есть если игрок выбирает не своего продавца, то триггерно ему в выбор даётся продавец который пренадлежит ему.
Quote (Impregnable)
Это не сделает их некликабельными, а вот SetUnitFlyHeight должно помочь (тень можно сделать даммиком).
Это зачем? Разве можно локально выставить юниту высоту? И даже если можно, то зачем?
Это зачем? Разве можно локально выставить юниту высоту? И даже если можно, то зачем?
Еще как можно. Затем чтобы не писать таких корявых систем:
Quote
Я сделал через SetUnitVertexColor + Deselect + SelectUnit ( LoadUnitHandle(...), true ). То есть если игрок выбирает не своего продавца, то триггерно ему в выбор даётся продавец который пренадлежит ему.
Причем не очень приятно будет когда я вижу продавца, могу навести курсор, а выбрать не получается.
Если долго мучиться, то может, все равно нихуя не получится.
Так так так.... Я выставляю высоту всем продавцам на астрономическое число, а затем локально каждому продавцу выставляю высоту 0? Кстати а вместо 99999999 или тому подобного, я ведь могу выставить например -200. То есть уйдёт под землю. Я ведь тоже не смогу его кликать?
Добавлено (29 Март 2012, 14:47:19) ---------------------------------------------
Quote (Impregnable)
Причем не очень приятно будет когда я вижу продавца, могу навести курсор, а выбрать не получается.
Почему не получается? Получается. Просто выберется не тот юнит на которого ты нажал, а тот который пренадлежит тебе.