XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
FatalBlade

offline
Опыт: 7,398
Активность:
Десинхронизация - помимо GetLocalPlayer
У меня в карте почему то при её запуске по инету, у всех кроме Хоста вылетает. Насколько я понимаю это Десинхронизация. Я тщательно проверил свой код, и убедился что нету ничего что создаётся локально через GetLocalPlayer(). Но что ещё может вызывать десинк? Какие действия. Возможно ли это изза того что в РО есть юнит у которого есть около 70 абилок, который создаётся и сразу удаляется (это для прелода) ? Или же это изза функции call ShowUnit(...)? Или причина совсем другая?
Старый 28.03.2012, 17:46
alexprey
познающий Unity
offline
Опыт: 68,501
Активность:
FatalBlade, попробуй закоментить потенциально опасные функции и проверить
Старый 28.03.2012, 18:16
FatalBlade

offline
Опыт: 7,398
Активность:
alexprey:
потенциально опасные функции и проверить
Вот именно... А какие функции мне считать потенциально опасными?
Старый 28.03.2012, 18:34
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
для начала все c GetLocalPlayer()
Старый 28.03.2012, 18:59
FatalBlade

offline
Опыт: 7,398
Активность:
Faion:
для начала все c GetLocalPlayer()
Проверял. Ничего локально не создаётся. Всё по правилам.
Я выявил триггер который вызывает десинк. Вот он:
» Код
function Trig_Const_Func029A takes nothing returns nothing
    local player p = GetEnumPlayer()
    call SetPlayerAbilityAvailable( p, 'A0FH', false )
    call SetPlayerAbilityAvailable( p, 'A0IL', false )
    call SetPlayerAbilityAvailable( p, 'A0S7', false )
    call SetPlayerAbilityAvailable( p, 'A0KC', false )
    call SetPlayerAbilityAvailable( p, 'Asal', false )
    call SetPlayerAbilityAvailable( p, 'A0IU', false )
    call SetPlayerAbilityAvailable( p, 'A0JC', false )
    call SetPlayerAbilityAvailable( p, 'A0JD', false )
    call SetPlayerAbilityAvailable( p, 'A0JI', false )
    call SetPlayerAbilityAvailable( p, 'A0GF', false )
    call SetPlayerAbilityAvailable( p, 'A0GC', false )
    call SetPlayerAbilityAvailable( p, 'A0G8', false )
    call SetPlayerAbilityAvailable( p, 'A0GE', false )
    call SetPlayerAbilityAvailable( p, 'A0GG', false )
    call SetPlayerAbilityAvailable( p, 'A0G9', false )
    call SetPlayerAbilityAvailable( p, 'A0GB', false )
    call SetPlayerAbilityAvailable( p, 'A0GD', false )
    call SetPlayerAbilityAvailable( p, 'A0GA', false )
    call SetPlayerAbilityAvailable( p, 'A0GH', false )
    call SetPlayerAbilityAvailable( p, 'Aspb', false )
    call SetPlayerAbilityAvailable( p, 'A0CL', false )
    call SetPlayerAbilityAvailable( p, 'A0EE', false )
    call SetPlayerAbilityAvailable( p, 'A0GJ', false )
    call SetPlayerAbilityAvailable( p, 'A0SP', false )
    call SetPlayerAbilityAvailable( p, 'Asal', false)
    call SetPlayerState(p, PLAYER_STATE_RESOURCE_GOLD, 600)
    call SetPlayerState(p, PLAYER_STATE_FOOD_CAP_CEILING, 100)
    set p = null
endfunction

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 SaveInteger(udg_Hash, 'I02A', 0, 250)
    call SaveInteger(udg_Hash, 'I02B', 0, 250)
    call SaveInteger(udg_Hash, 'I029', 0, 150)
    call SaveInteger(udg_Hash, 'desc', 0, 100)

    call GroupEnumUnitsOfType( g, UnitId2String('owyv'), null )
     loop
         set un = FirstOfGroup(g)
         exitwhen un == null
         call GroupRemoveUnit( g, un )
         call IssueImmediateOrderById( un, 852177 )
     endloop

    call GroupEnumUnitsOfType( g, UnitId2String('ohun'), null )
     loop
         set un = FirstOfGroup(g)
         exitwhen un == null
         call GroupRemoveUnit( g, un )
         call IssueImmediateOrderById( un, 852177 )
     endloop

    call GroupEnumUnitsOfType( g, UnitId2String('n005'), null )
     loop
         set un = FirstOfGroup(g)
         exitwhen un == null
         call GroupRemoveUnit( g, un )
         call ShowUnit( un, false )
     endloop

    loop
      exitwhen i > 10
        set udg_Herbs[i] = null
        call ShowUnit( udg_Socketer[ i + 10 ], false )
        call ShowUnit( udg_Socketer[i], false )
        call ShowUnit( udg_Armor[ i + 10 ], false )
        call ShowUnit( udg_Armor[i], false )
        call ShowUnit( udg_Weapon[ i + 10 ], false )
        call ShowUnit( udg_Weapon[i], false )
        call ShowUnit( udg_Monument[i], false )
        call ShowUnit( udg_Tavern[i], false )
        set i = i + 1
    endloop

    call DestroyGroup(g)
    call ForForce( bj_FORCE_ALL_PLAYERS, function Trig_Const_Func029A )

    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_ZTg4_6217 )
    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_ZTsx_6205 )
    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_ZTsx_6207 )
    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_ZTsx_6208 )
    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_ZTsg_6212 )
    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_ZTsg_6215 )
    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_ZTsg_6213 )
    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_ITg1_6629 )
    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_ITg1_6628 )
    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_ITg4_6632 )
    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_ITg4_6631 )
    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_ITg3_6636 )
    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_ITg3_6635 )
    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_ITg3_6650 )
    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_ITg3_6649 )
    call ModifyGateBJ( bj_GATEOPERATION_OPEN, gg_dest_B006_1947 )

    set i = 0
    loop
        exitwhen i > 9
        set udg_AbilityCounter[i] = 0
        set pid = GetHandleId(Player(i))
        call SaveBoolean(udg_Hash, pid, 11, false)
        call SaveBoolean(udg_Hash, pid, 22, false)
        call SaveBoolean(udg_Hash, pid, 35, false)
        call SaveBoolean(udg_Hash, pid, 50, false)
        call SaveBoolean(udg_Hash, pid, 66, false)
        call SaveBoolean(udg_Hash, pid, 85, false)
        call SaveBoolean(udg_Hash, pid, 113, false)
        call SaveBoolean(udg_Hash, pid, 507, false)
        call SaveBoolean(udg_Hash, pid, 508, false)
        call SaveBoolean(udg_Hash, pid, 509, false)
        call SaveBoolean(udg_Hash, pid, 2929, false)
        call SaveBoolean(udg_Hash, pid, 366, false)
        call SaveReal(udg_Hash, pid, 932, 1.0)
        set udg_Hell[ i + 1 ] = 1.0
        set udg_Lan[ i + 1 ] = 0

        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 i = 1
    loop
        exitwhen i > 4
        set udg_BossesBad[i] = 0.00
        set udg_BossesGood[i] = 0.00
        set i = i + 1
    endloop
    set un = null
    set g = null
endfunction

//===========================================================================
function InitTrig_Const takes nothing returns nothing
    set gg_trg_Const = CreateTrigger(  )
    call TriggerRegisterTimerEvent( gg_trg_Const, 0.1, false )
    call TriggerAddAction( gg_trg_Const, function Trig_Const_Actions )
endfunction

Отредактировано FatalBlade, 28.03.2012 в 20:34.
Старый 28.03.2012, 20:02
ScorpioT1000
Работаем
offline
Опыт: отключен
        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 )
        endi
чтож вы нам мозги то парите, а ?
Старый 28.03.2012, 20:49
MpW

offline
Опыт: 49,642
Активность:
вырежи вот этот кусок из триггера и посмотри

Код:
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


если да, выкидывает, то проверяй из-за какого действия выкидывает таким же методом, выкинь сначало одно действие, потом второе. И короч проверь все функции.

Отредактировано Steal nerves, 28.03.2012 в 21:18.
Старый 28.03.2012, 20:50
ScorpioT1000
Работаем
offline
Опыт: отключен
да, потому что ShowUnit вызывает десинк, юзай
SetUnitVertexColor(255,255,255,0)
 TriggerRegisterPlayerUnitEvent(trig, whichPlayer, EVENT_PLAYER_UNIT_SELECTED, null)
и на этот эвент отменять выделение, тока так
Старый 28.03.2012, 21:01
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
ScorpioT1000, ScorpioT1000:
SetUnitVertexColor(255,255,255,0)
Черт, ты помог с 1 проблемой, я все думал, как удобнее локально хайдить юнитов. Совсем забыл про эту функцию.
Старый 28.03.2012, 21:25
FatalBlade

offline
Опыт: 7,398
Активность:
ScorpioT1000:
и на этот эвент отменять выделение, тока так
Всмысле? отменять определённый тип юнитов в условие?
SetUnitVertexColor(255,255,255,0)
А это разве можно делать локально?
Старый 28.03.2012, 21:26
alpha

offline
Опыт: 7,387
Активность:
  ...
  local boolean a = false
  if (GetLocalPlayer() == Player(i)) then
    set a = true
    call ClearSelection()
    call SelectUnit( udg_Tavern[ i + 1 ], true )
  endif
  call ShowUnit( udg_Socketer[ i + 1 ], a )
  call ShowUnit( udg_Socketer[ i + 11 ], a )
  call ShowUnit( udg_Armor[ i + 1 ], a )
  call ShowUnit( udg_Armor[ i + 11 ], a )
  call ShowUnit( udg_Weapon[ i + 1 ], a )
  call ShowUnit( udg_Weapon[ i + 11 ], a )
  call ShowUnit( udg_Monument[ i + 1 ], a )
  call ShowUnit( udg_Tavern[ i + 1 ], a )
  ...
Принцип ясен
Старый 28.03.2012, 21:26
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
FatalBlade:
А это разве можно делать локально?
Да. Хендлы же не затрагиваются.
Старый 28.03.2012, 21:33
FatalBlade

offline
Опыт: 7,398
Активность:
alpha:
call SelectUnit( udg_Tavern[ i + 1 ], true )
А вот эта строка не будет делать десинк? Просто заранее, ещё до этого блока, написано вот это:
    loop
      exitwhen i > 10
        set udg_Herbs[i] = null
        call ShowUnit( udg_Socketer[ i + 10 ], false )
        call ShowUnit( udg_Socketer[i], false )
        call ShowUnit( udg_Armor[ i + 10 ], false )
        call ShowUnit( udg_Armor[i], false )
        call ShowUnit( udg_Weapon[ i + 10 ], false )
        call ShowUnit( udg_Weapon[i], false )
        call ShowUnit( udg_Monument[i], false )
        call ShowUnit( udg_Tavern[i], false )
        set i = i + 1
    endloop
Старый 28.03.2012, 21:36
ScorpioT1000
Работаем
offline
Опыт: отключен
SelectUnit вот какраз обязательно надо делать внутри GetLocalPlayer
Старый 28.03.2012, 21:37
alpha

offline
Опыт: 7,387
Активность:
Да возьми ты популярные жирные карты, раздэпротекть, посмотри код и узнай.
Карты как книги перед носом, а ты шатаешь форум
Старый 28.03.2012, 21:37
ScorpioT1000
Работаем
offline
Опыт: отключен
вот смотрите что близзы вам в BJ написали:
function SelectUnitForPlayerSingle takes unit whichUnit, player whichPlayer returns nothing
    if (GetLocalPlayer() == whichPlayer) then
        // Use only local code (no net traffic) within this block to avoid desyncs.
        call ClearSelection()
        call SelectUnit(whichUnit, true)
    endif
endfunction
Старый 28.03.2012, 21:39
FatalBlade

offline
Опыт: 7,398
Активность:
ScorpioT1000:
SelectUnit вот какраз обязательно надо делать внутри GetLocalPlayer
Да я не об этом))) Знаю что надо внутри.
Просто как я понял, в данном случае нельзя выбирать юнита, который был локально скрыт/показан для другого. Отсюда и десинк. Если так, то любое выбирание юнита, будь то триггерно, или же вручную игроком в игре, приведёт к десинку. Я правильно понял?
FatalBlade добавил:
ScorpioT1000:
TriggerRegisterPlayerUnitEvent(trig, whichPlayer, EVENT_PLAYER_UNIT_SELECTED, null)
и на этот эвент отменять выделение, тока так
Вот тут можно поточнее?
Если у меня например есть такой триггер
function Trig_P_1_Actions takes nothing returns nothing
    if GetUnitTypeId(GetTriggerUnit()) == 'ngme' then
            if GetLocalPlayer() == Player(0) then
                call ClearSelection()
            call SelectUnit( udg_AA[1], true )
            endif
    endif
endfunction

//===========================================================================
function InitTrig_P_1 takes nothing returns nothing
    set gg_trg_P_1 = CreateTrigger(  )
    call TriggerRegisterPlayerUnitEvent( gg_trg_P_1, Player(0), EVENT_PLAYER_UNIT_SELECTED, null )
    call TriggerAddAction( gg_trg_P_1, function Trig_P_1_Actions )
endfunction
Он будет вызывать десинк? 'ngme' - совершенно не связанный с продавцами юнит. udg_AA[1] - тоже не связанный с продавцами юнит. В принципе этот триггер вообще не связан ни с чем из выше-написанного, но его регулирует событие EVENT_PLAYER_UNIT_SELECTED.
Старый 28.03.2012, 22:04
Doc

offline
Опыт: 63,163
Активность:
Нельзя скрывать/показывать юнита локально омфг. Это не визуальное изменение.
Старый 28.03.2012, 22:21
FatalBlade

offline
Опыт: 7,398
Активность:
И ещё вопрос.
Вот я сделал всё это с помощью SetUnitVertexColor(...). Но теперь я могу случайно выбрать не своего продавца, а кого то другого. Как мне сделать что бы для какого то игрока, данный юнит был не выбираем. Я же не могу локально дать юниту способность Москиты =))
Старый 28.03.2012, 22:47
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
Деселект делай, по другому никак. И полностью скрыть тоже вроде бы никак.
Старый 28.03.2012, 23:27
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 15:05.