Добавлен
Здравствуйте. Уже несколько неделю пытаюсь понять в чем ошибка. Иногда игра крашится и причина непонятна. Может дамп поможет пролить свет. Помогите пожалуйста разобраться.

Кажеться я разобрался с крашем и десинком, хотя я так не до конца понял почему именно из-за этих двух вещей происходит такая фигня.
  1. Краш при падении артефакта скорее всего связан с лидербордом где отображаются результаты розыгрыша. Каждую секунду у лидерборда меняется название мб краш как-то связан с этим. По крайней мере этим можно объяснить почему игроков крашило по очереди с некоторой периодичностью. Теперь убрав этот лидерборд и откатав 30+ игр никаких крашей при падении артефактов обнаружено не было. Но конечно хотелось бы понять как лидерборд мог вызвать такие странные краши. Мб конфликт с локальными мультибордами?) Хотя я хз.
  2. Десинхрон в начале волны с 1-м боссом. Я просмотрел 6 реплеев с игр когда вылетали игроки и выяснил что каждый раз это происходило когда их атаковал танк на котором приезжает босс. Танк имеет способность москиты и Тип Атаки - мгновенный и Тип Урона - мили. Мб какое-то сочетания настроек атаки и москитов давало такой странный результат.
`
ОЖИДАНИЕ РЕКЛАМЫ...
23
Похожие вопросы:

ответ
А что не понятного? Крашится при уничтожении базы красного, значит перелопать код, который отсится к базе или вообще к красному игроку хоть как-то. Что сложного то?
ответ
баф-то не сохранется
не трогай уровни на мертвых юнитах, никогда
ответ
файлик краша открой и проштудируй
ну или хотя бы его сюда скинь
ответ
PyCCKuu_4eJl, а причем тут аура торнадо? Если стан это стан, особый флаг + приказ смотреть на источник стана.
Не пойму почему не молоток бурь а аура торнадо?

28
А где сами логи краша? В папку Errors загляни, они все там.
12
DracoL1ch, приложил .txt. Ссылка в посте Я сразу загрузил оба файла но скачивается дмп.
2
C:\Users\Evil.Penguin\Desktop\Warcraft III - 1.26\Game.dll
Попробуй изменить файл на этот
P.s. Измени название файла чтобы было Game.dll
Загруженные файлы
13
DracoL1ch:
изменил уровень ауры на мертвом юните
Интересно, как так точно получается читать дампы, каков принцип
16
огромный опыт и тупо тот факт, что у меня эта функция запатчена и, очевидно, я вижу, как называется патч :)
12
DracoL1ch, ещё такая тема что во время этого краша игроки вылетают не сразу а как бы по очереди. Это может быть изза повышения уровня ауры у мертвого юнита? Я думал что если крашит то всех сразу)
16
все валятся одновременно, никаких исключений
12
DracoL1ch, просто у меня в мапе при появлении той ошибки все валятся по очереди=\ Иногда кто-то не отваливается вовсе. Странный баг-_-
32
EvilPenguin, ну если что синхронизация между игроками не мгновенная, первый получил краш и потерял соединеие, потом второй, ну и так пока до всех не дойдет, а может из за потери пакетов и не дойти. Синхронизация такая синхронизация, особенно когда инет говно и вы играете на лаганом айкапе...
16
скорее, по счастливому стечению обстоятельств, у одного в том участке памяти мог оказаться мусор, который не привел к крашу. Но это скорее исключение
12
DracoL1ch, да но у меня это правило. Все происходит на 1-м боссе. Или в начале когда он появляется часть игроков дисконектит. Или после его смерти босса происходит краш. Причем киает игроков с небольшой задержкой. Хотя это происходит не всегда но довольно часто
16
ну в логе хорошо видно потенциальную причину - 0gGA -> AGg0
28
да но у меня это правило. Все происходит на 1-м боссе. Или в начале когда он появляется часть игроков дисконектит
похоже на десинк
12
nvc123, да это десинк 100%. Уже не раз случался мне игроки писали что их отключило. Однако я не понимаю что его может вызывать. При появлении босса нигде не используется GetLocalPlayer().
21
EvilPenguin, предмет какой-нибудь кому-нибудь создаётся/даётся в это время? уровень улучшения изменяется? текстовое сообщение выходит? если на что-то "да", попробуй поэкспериментировать с изменением/убиранием этого... точнее не скажу, но вот что-то похожее знакомо... (уровни улучшений вообще не оч советую юзать в принципе, особенно глобальные)
12
ClotPh, да предмет создается. Сейчас кину код на который у меня подозрение. Есть два босса с которых падает артефакт. Сегодня когда убили одного из этих боссов критануло у некоторых игроков. При смерти босса вызывается метод spawn ( integer it_id, real x, real y ).
з.ы: название методов конечно голимые но я не думал что мой код кто-то будет читать:D
struct mscArtefact
    static trigger roll_trig 
    static item array queue_item 
    static integer queue_cnt = 0
    static item roll_cur_item = null
    static integer roll_time = 0
    static integer roll_table_delay = 0
    static timer roll_timer = null
    static integer array roll_result
    static integer roll_cnt = 0
    static leaderboard lb = null
    
    static method add_to_queue takes item it returns nothing
        set queue_item[queue_cnt] = it
        set queue_cnt = queue_cnt + 1
    endmethod
    
    static method ger_first_from_queue takes nothing returns item
        local item it = queue_item [0]
        local integer i = 0
        loop
            set queue_item [i] = queue_item [i+1]
            set i = i + 1
            exitwhen ( i >= queue_cnt - 1 )
        endloop
        set queue_cnt = queue_cnt - 1
        return it
    endmethod
    
    static method get_winner_rnd takes nothing returns integer 
        local msc_Players plr = msc_Players.get_random ()
        local integer i = 0
        local boolean flag = true
        loop
            if ( roll_result[i] != -1 ) then
                set flag = false
            endif
            set i = i + 1
            exitwhen ( i == 8 )
        endloop
        if ( flag ) then
            set roll_result[GetPlayerId (plr.plr)] = 100
        endif
        return ger_winner ()
    endmethod
    
    static method update takes nothing returns nothing
        if ( roll_time == 0 ) then
            if ( roll_table_delay == 0 ) then
                call play_prize ( get_winner_rnd() )
            else
                set roll_table_delay = roll_table_delay - 1
            endif
        else
            set roll_time = roll_time - 1
        endif
        call LeaderboardSetLabel ( lb, "Артефакт " + GetObjectName ( GetItemTypeId ( roll_cur_item ) ) + " |cFF567C7E(" + I2S ( roll_time ) + ")|r" )
    endmethod
    
    static method play_prize takes integer id returns nothing
        local integer i = 0
        
        call DisplayTimedTextToForce ( GetPlayersAll(), 10.0, MSC_CLR_TAG_PLAYER[id] + GetPlayerName ( Player ( id ) ) + "|cFF90FF00(" + I2S ( roll_result[id] ) + ")|r" + "|cFFFFCD00 выиграл предмет|r " + GetObjectName ( GetItemTypeId ( roll_cur_item ) ) )
        call SetItemPlayer ( roll_cur_item, Player ( id ), true )
        call RemoveSavedBoolean ( HASH, 'ATFC', GetHandleId ( roll_cur_item ) )
        call msc_effectXY ( "Abilities\\Spells\\Human\\Polymorph\\PolyMorphDoneGround.mdl", GetItemX ( roll_cur_item ), GetItemY ( roll_cur_item ) )
        
        set roll_cur_item = null
        set roll_cnt = 0
        loop
            call LeaderboardRemovePlayerItem ( lb, Player (i) )
            set roll_result[i] = -1
            set i = i + 1
            exitwhen ( i == 8 )
        endloop
        call get_next ()
    endmethod
    
    static method ger_winner takes nothing returns integer
        local integer i = 0
        local integer id = 0
        loop
            if ( roll_result[i] > roll_result[id] ) then
                set id = i
            endif
            set i = i + 1
            exitwhen ( i == 8 )
        endloop
        return id
    endmethod
    
    static method roll takes nothing returns nothing
        local player p = GetTriggerPlayer ()
        local integer p_id = GetPlayerId ( p )
        local integer rnd  
        if ( roll_cur_item == null ) then
            set rnd = GetRandomInt ( 0, 100 )
        else
            if ( roll_result[p_id] == -1 ) and ( roll_table_delay == 3 ) then
                set rnd = GetRandomInt ( 0, 100 )
                call LeaderboardAddItem ( lb, GetPlayerName ( p ), rnd, p )
                call LeaderboardSortItemsBJ( lb, bj_SORTTYPE_SORTBYVALUE, false )
                call LeaderboardResizeBJ ( lb )
                set roll_result[p_id] = rnd
                set roll_cnt = roll_cnt + 1
            endif
        endif
        call DisplayTimedTextToForce ( GetPlayersAll(), 10.0, MSC_CLR_TAG_PLAYER[GetPlayerId(p)] + GetPlayerName ( p ) + "|cFFFFCD00 выбросил:|r " + I2S ( rnd ) )
        if ( roll_cnt == msc_Players.player_count ) then
            set roll_time = 0//call play_prize ( ger_winner() )
            call LeaderboardSetLabel ( lb, "Артефакт " + GetObjectName ( GetItemTypeId ( roll_cur_item ) ) + " |cFF567C7E(" + I2S ( roll_time ) + ")|r" )
        endif
    endmethod
    
    static method get_next takes nothing returns nothing
        if ( queue_cnt > 0 ) then
            set roll_cur_item = ger_first_from_queue ()
            
            call DisplayTimedTextToForce ( GetPlayersAll(), 30.0, "|cFF20F100Внимание: |r|cFFFFCD00разыгрывается артефакт |r" + GetObjectName ( GetItemTypeId ( roll_cur_item ) ) + "\n|cFFFFCD00Напишите|r -roll |cFFFFCD00чтобы принять участие в розыгрыше|r" )
            call PlaySoundBJ ( gg_snd_SecretFound )
                
            call LeaderboardSetLabel ( lb, "Артефакт " + GetObjectName ( GetItemTypeId ( roll_cur_item ) ) + " |cFF567C7E(" + I2S ( roll_time ) + ")|r" )
            call LeaderboardDisplay ( lb, true )
            
            //call LeaderboardResizeBJ ( lb )
            
            set roll_table_delay = 3
            set roll_time = 30
        else
            call LeaderboardResizeBJ ( lb )
            call LeaderboardDisplay ( lb, false )
            call PauseTimer ( roll_timer )
            call DestroyTimer ( roll_timer )
            set roll_timer = null
        endif
    endmethod
    
    static method start_quiz takes nothing returns nothing
        if ( roll_timer == null ) then
            call get_next ()
            
            set roll_timer = CreateTimer ()
            call TimerStart ( roll_timer, 1.0, true, function mscArtefact.update )
        endif
    endmethod
    
    static method spawn takes integer it_id, real x, real y returns item
        local item it = CreateItem ( it_id, x, y )
        call msc_effectXY ( "Abilities\\Spells\\Demon\\ReviveDemon\\ReviveDemon.mdl", x, y )
        call SaveBoolean ( HASH, 'ATFC', GetHandleId ( it ), true ) 
        
        call add_to_queue ( it )
        call start_quiz ()
        
        return it
    endmethod
    
    static method check takes unit u, item it returns boolean
        local boolean flag =  LoadBoolean ( HASH, 'ATFC', GetHandleId ( it ) )
        local item it_new = null
        local integer it_id
        local real x
        local real y
        if ( flag ) then
            call DisplayTimedTextToPlayer ( GetOwningPlayer ( u ), 0, 0, 10.0, "|cFFFF0505Ошибка:|r предмет сейчас разыгрывается" ) 
            
            set it_id = GetItemTypeId ( it )
            set x = GetItemX ( it )
            set y = GetItemY ( it )
            call RemoveSavedBoolean ( HASH, 'ATFC', GetHandleId ( it ) )
            call RemoveItem ( it )
            set it_new = CreateItem ( it_id, x, y )
            call SaveBoolean ( HASH, 'ATFC', GetHandleId ( it_new ), true ) 
            set roll_cur_item = it_new
        endif
        set it = null
        set it_new = null
        return flag
    endmethod
    
    static method init takes nothing returns nothing
        set lb = CreateLeaderboard ()
        call ForceSetLeaderboardBJ( lb, GetPlayersAll() )
        
        set roll_result[0] = -1
        set roll_result[1] = -1
        set roll_result[2] = -1
        set roll_result[3] = -1
        set roll_result[4] = -1
        set roll_result[5] = -1
        set roll_result[6] = -1
        set roll_result[7] = -1
    
        set roll_trig = CreateTrigger ()
        call TriggerRegisterPlayerChatEvent( roll_trig, Player(0), "-roll", true )
        call TriggerRegisterPlayerChatEvent( roll_trig, Player(1), "-roll", true )
        call TriggerRegisterPlayerChatEvent( roll_trig, Player(2), "-roll", true )
        call TriggerRegisterPlayerChatEvent( roll_trig, Player(3), "-roll", true )
        call TriggerRegisterPlayerChatEvent( roll_trig, Player(4), "-roll", true )
        call TriggerRegisterPlayerChatEvent( roll_trig, Player(5), "-roll", true )
        call TriggerRegisterPlayerChatEvent( roll_trig, Player(6), "-roll", true )
        call TriggerRegisterPlayerChatEvent( roll_trig, Player(7), "-roll", true )
        call TriggerAddAction ( roll_trig, function mscArtefact.roll )
    endmethod
endstruct
28
EvilPenguin, кинь j файл карты
так же по слухам десинк может происходить из за кривого участка ланда
28
EvilPenguin,
Отлаживай в соло, запускай много вариков (погугои есть спец прожка) и через них играй. Выключай различные тригеры/функции и пробуй. Других вариантов нету.
28
EvilPenguin, глянь триггер HintUnit
так же я заметил что у тебя есть локальное выделение юнитов и триггеры которые реагируют на выделение юнита
это тоже может быть источником десинка
а может и не быть
ну а вообще особо серьёзного на первый взгляд нету
28
EvilPenguin, по идее нет
но если работает с локальными данными то может быть десинк
Чтобы оставить комментарий, пожалуйста, войдите на сайт.