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

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

Закрытая тема
 
DaeDR

offline
Опыт: 8,074
Активность:
Десинхронизация
При срабатывании этого триггера почти всегда вылетают один или несколько человек.
Никакой связи я тут не увидел, вылетают абсолютно случайные игроки.
» code
function Trig_QuestZaakOff_Conditions takes nothing returns boolean
    return IsQuestEnabled(udg_Quest_Zaak)
endfunction

function Trig_QuestZaakOff_Timer takes nothing returns nothing
    timer t = GetExpiredTimer()
    KillUnit(udg_Unit_Zaak_Kill)
    DestroyTimer (t)
    set t = null
endfunction

function Trig_QuestZaakOff_Actions takes nothing returns nothing
    unit kill = GetKillingUnit()
    if ( GetUnitTypeId(kill) != 'Udth' ) then
        set udg_Unit_Zaak_Kill = kill
        TimerStart( CreateTimer(), 1.0, false, function Trig_QuestZaakOff_Timer )
    endif
    if (IsPlayerInForce(GetLocalPlayer(), bj_FORCE_ALL_PLAYERS)) then
        call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, bj_TEXT_DELAY_QUESTDONE, " ")
        call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, bj_TEXT_DELAY_QUESTDONE, "ЗАДАНИЕ ВЫПОЛНЕНО" )
        call StartSound(bj_questCompletedSound)
        call FlashQuestDialogButton()
        call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, "|c006F6F6F - Убить демона Заака|r")
    endif
    call QuestSetCompleted( udg_Quest_Zaak, true )
    call DisableTrigger( gg_trg_Zaak )
    call DisableTrigger( gg_trg_QuestZaakOff )
    integer p = GetPlayerId(GetOwningPlayer(kill))
    if ( p < 6 ) then
        call DisplayTextToPlayer( Player(p), 0, 0, "За убийство Заака вам начислено |cffffcc00100|r очков" )
        p++
        set udg_Multiboard_Player_Score[p] = ( udg_Multiboard_Player_Score[p] + 100 )
    endif
    set kill = null
endfunction

//===========================================================================
function InitTrig_QuestZaakOff takes nothing returns nothing
    set gg_trg_QuestZaakOff = CreateTrigger(  )
    call TriggerRegisterUnitEvent( gg_trg_QuestZaakOff, gg_unit_Uwar_0063, EVENT_UNIT_DEATH )
    call TriggerAddCondition( gg_trg_QuestZaakOff, Condition( function Trig_QuestZaakOff_Conditions ) )
    call TriggerAddAction( gg_trg_QuestZaakOff, function Trig_QuestZaakOff_Actions )
endfunction
Старый 21.04.2012, 17:42
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
а пробовал расставить дебаг сообщения что бы посмотреть на каком куске вылет?
Старый 21.04.2012, 18:34
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
function Trig_QuestZaakOff_Conditions takes nothing returns boolean
    return IsQuestEnabled(udg_Quest_Zaak)
endfunction
Возможно, квест включен только для одного игрока, а для остальных выключен => происходит десинк.
Для проверки этого закомментируй ВСЁ, и в функции-действии добавь CreateUnit(...).
Если будет вылетать, значит точно в этом проблема.
Старый 21.04.2012, 18:38
DaeDR

offline
Опыт: 8,074
Активность:
Hellfim, Квест включался на обычном ГУИ.
И если в этом проблема, то надо будет проверять так?
function Trig_QuestZaakOff_Conditions takes nothing returns boolean
    if GetLocalPlayer() == Player(0) then
        return IsQuestEnabled(udg_Quest_Zaak)
    endif
    return false
endfunction
Hatsume_Hate, Я никак не могу проверить тут через Debug. Меня не выкидывает. А играть миллион раз для проверки глупо.
DaeDR добавил:
Это я сделаю (к сожалению, проверить на десинх крайне сложно). Не всегда происходит.
Есть что-нибудь еще, из-за чего может вылетать?
Старый 21.04.2012, 18:51
Hanabishi
COOL STATUS
offline
Опыт: отключен
if (IsPlayerInForce(GetLocalPlayer(), bj_FORCE_ALL_PLAYERS)) then
Зачем данная проверка? Глупее только if 1=1 then
Старый 21.04.2012, 19:01
DaeDR

offline
Опыт: 8,074
Активность:
Hanabishi, А как тогда?
DaeDR добавил:
Просто if GetLocalPlayer() then ....?
Старый 21.04.2012, 19:04
Hanabishi
COOL STATUS
offline
Опыт: отключен
DaeDR, что как? Я спрашиваю для чего она вообще нужна? Игрок в любом случае принадлежит к всем игрокам.
Hanabishi добавил:
function Trig_QuestZaakOff_Actions takes nothing returns nothing
    unit kill = GetKillingUnit()
    player kk = GetOwningPlayer(kill)
    integer p = GetPlayerId(kk)
    if ( GetUnitTypeId(kill) != 'Udth' ) then
        set udg_Unit_Zaak_Kill = kill
        TimerStart( CreateTimer(), 1.0, false, function Trig_QuestZaakOff_Timer )
    endif
    if kk==GetLocalPlayer() then // так правильнее
        call DisplayTimedTextToPlayer(kk, 0, 0, bj_TEXT_DELAY_QUESTDONE, " ")
        call DisplayTimedTextToPlayer(kk, 0, 0, bj_TEXT_DELAY_QUESTDONE, "ЗАДАНИЕ ВЫПОЛНЕНО" )
        call StartSound(bj_questCompletedSound)
        call DisplayTextToPlayer(kk, 0, 0, "|c006F6F6F - Убить демона Заака|r")
    endif
    call FlashQuestDialogButton() // рассинхрон же, нельзя менять состояние квеста для одного игрока, выносим
    call QuestSetCompleted( udg_Quest_Zaak, true )
    call DisableTrigger( gg_trg_Zaak )
    call DisableTrigger( gg_trg_QuestZaakOff )
    
    if ( p < 6 ) then
        call DisplayTextToPlayer( Player(p), 0, 0, "За убийство Заака вам начислено |cffffcc00100|r очков" )
        p++
        set udg_Multiboard_Player_Score[p] = ( udg_Multiboard_Player_Score[p] + 100 )
    endif
    set kill = null
endfunction
Старый 21.04.2012, 19:09
DaeDR

offline
Опыт: 8,074
Активность:
Hanabishi, Я опирался на данные из function list. Как там было сделано(bj), так я и сделал, ибо по другому не знаю!
DaeDR добавил:
if kk==GetLocalPlayer() then // так правильнее
        call DisplayTimedTextToPlayer(kk, 0, 0, bj_TEXT_DELAY_QUESTDONE, " ")
        call DisplayTimedTextToPlayer(kk, 0, 0, bj_TEXT_DELAY_QUESTDONE, "ЗАДАНИЕ ВЫПОЛНЕНО" )
        call StartSound(bj_questCompletedSound)
        call DisplayTextToPlayer(kk, 0, 0, "|c006F6F6F - Убить демона Заака|r")
    endif
Но разве текст покажется всем? А не только игроку, который убил.
Старый 21.04.2012, 19:12
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
DaeDR, да, но это только для 1-ого игрока.
Ну, а:
if (IsPlayerInForce(GetLocalPlayer(), bj_FORCE_ALL_PLAYERS)) then
Это да. Возможно, нельзя FlashQuestDialogButton() вызывать локально.
Текст будет итак выводиться только для локальных игроков.
Hellfim добавил:
call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, bj_TEXT_DELAY_QUESTDONE, " ")
^ покажет всем игрокам
Старый 21.04.2012, 19:13
Hanabishi
COOL STATUS
offline
Опыт: отключен
Но разве текст покажется всем? А не только игроку, который убил.
-_-
Блин, когда выкладываешь код, надо пояснять, что он должен делать.
Старый 21.04.2012, 19:21
DaeDR

offline
Опыт: 8,074
Активность:
Значит проблема в "FlashQuestDialogButton()" И почему близы сделали через локального игрока.
Всем спасибо, закрывайте.
Старый 21.04.2012, 19:29
Закрытая тема

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

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

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

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



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