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

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

Ответ
 
Doc

offline
Опыт: 63,163
Активность:
[Debug Log]

Предисловие

Всем preload exploit пацаны! Представьте ситуацию: огромная карта, ваша карта. Сотни кода, объектов, моделей итп. В процессе разработки новой версии в коде делаются более девяти тысяч изменений, поправок, доработок. И вот он - долгожданный тест! Предвещая профит, вы собираете кучу кунов и тянов, хостуете игру и начинаете тестить. Сначала, все идет как по маслу, хуманы бегают, эльфы размножаются, сатанисты строят здания. Но тут бац! Причем в самом неожиданном месте! Epic fail. Как узнать где ошибка? Реплеи не сохраняются, игра закрывается сразу-же, ничего невозможно усмотреть. Тут вам и поможет Debug Log System. Она заботливо запишет в отдельный файлик дебаг-сообщения, которые вы сможете просмотреть непосредственно после игры или в ее процессе.

Как оно работает

Наработка использует небезызвестный preload exploit, точнее ту его часть, что отвечает за сохранение. Следовательно, ничего менять в реестре вам не понадобится.

API

Наработка пока сырая, поэтому в ней всего 3 функции:
LogAdd(string s)
Собственно добавляет запись в лог.
LogClear()
Кэп подсказывает, что это функция чистит лог.
LogUpdate()
Ручная перезапись лога.
Так же, есть несколько настроек-дефайнов, которые нельзя изменить в течение игры. Меняются они в самом коде. Вот они:
private SavePath = Dir\\Debug
private SaveOnHardDrive = true
private HardDriveLetter = C
private AutoSaveLog = true
private LogSavePeriod = 1.0
Первая отвечает за путь к файлу лога и за имя самого файла. Вторая спрашивает, нужно ли использовать как источник пути корень указанного диска, либо папку с вакрафтом. Третья указывает на букву диска, используемого в сохранении файла. Четвертая и пятая, отвечают за автосохранение лога.

Рекомендации к использованию

Используется точно так же как и обычный дебаг, то есть вы выводите некие поясняющие данные в лог файл, которые указывают вам на предыдущие совершенные действия, дабы обнаружить причину ошибки. В особо сложных случаях я рекомендую использовать конструкцию вида LogAdd(`funcname`), это выведет вам имя функции, в которой использовалось LogAdd.

Собственно система

» Тысячи кода
//@ Debug Log library by DoctorGester, 2011, v 1.0

#define{
    private SavePath = Dir\\Debug
    private SaveOnHardDrive = true
    private HardDriveLetter = C
    private AutoSaveLog = true
    private LogSavePeriod = 1.0
}

library DebugLog initializer DebugLogInit{

    #include "cj_types_priv.j"

    private string DebugLog[8192]
    private int CurrentString = 0
    private int Seconds = 0
    private int Minutes = 0
    private constant int StringLimit = 200
    
    void LogAdd(string s){
        string sec = I2S(Seconds)
        if (Seconds < 10){
            sec = "0" + sec
        }
        DebugLog[CurrentString] = DebugLog[CurrentString] + ("[" + I2S(Minutes) + ":" + sec + "] " + s + "\n") /* DebugLog[CurrentString] += (s + "\n") cJass bug ! */
        if (StringLength(DebugLog[CurrentString]) >= StringLimit){
            CurrentString++
        }
    }
    
    void LogClear(){
        int i = 0
        while (i <= CurrentString){
            DebugLog[i] = ""
            i++
        }
        CurrentString = 0
    }
    
    void LogUpdate(){
      PreloadGenClear()
      PreloadGenStart()
      int i = 0
        while (i <= CurrentString){
            Preload("\")\n" + DebugLog[i] + "\n(\"")
            i++
        }
      #if SaveOnHardDrive
            PreloadGenEnd(`HardDriveLetter` + ":\\" + `SavePath` + ".txt")
      #else
            PreloadGenEnd("\\" + `SavePath` + ".txt")
      #endif
    }
    
    private void DebugLogOnTimer(){
        Seconds++
        if (Seconds > 59){
            Seconds = 0
            Minutes++
        }
    }

    private void DebugLogInit(){
        #if AutoSaveLog
            TimerStart(CreateTimer(), LogSavePeriod, true, function LogUpdate)
        #endif
        TimerStart(CreateTimer(), 1., true, function DebugLogOnTimer)
        LogAdd("By DoctorGester. Last compilation: " + `DATE` + " " + `TIME`)
    }
    
}
Карту пример прикреплять не стал, т.к. показывать особо нечего.
Старый 24.04.2011, 23:11
Nekit1234007

offline
Опыт: 11,916
Активность:
Время можно вычислять по принципу как тут. А так, ни мягко ни тепло, учитывая, что лавочку могут прикрыть.
Старый 25.04.2011, 00:00
Doc

offline
Опыт: 63,163
Активность:
поэтому пока не прикрыли надо юзать. в целом написал систему лишь потому, что понадобилось найти неочевидный фатал, но мб кто-нибудь еще найдет этому применение. ах да, за идею с часами спасибо, так действительно правильней.
Старый 25.04.2011, 00:21
Virysru

offline
Опыт: 7,692
Активность:
зацените хоть пример лога, что-ли.
Старый 25.04.2011, 01:15
Doc

offline
Опыт: 63,163
Активность:
дак сделай и посмотри =) генерится txt файл с твоими сообщениями в формате "[время] сообщение" и ненужным мусором, который не убирается. алсо, лог файл некорретно просмотривается блокнотом - нету переходов на следующую строку.
Старый 25.04.2011, 01:20
reALien

offline
Опыт: 29,211
Активность:
нп++ вас спасет
Старый 25.04.2011, 01:20
Doc

offline
Опыт: 63,163
Активность:
Именно так. Алсо, в вордпаде отступы тоже работают, проверял.
Старый 25.04.2011, 01:22
Virysru

offline
Опыт: 7,692
Активность:
т.е если я, допустим, добавлю в некий триггер строку (первым действием) на вывод 1111, то при вылете, последним что я увижу в логе, будет 1111?
Старый 25.04.2011, 02:10
Doc

offline
Опыт: 63,163
Активность:
Virysru, да.
Doc добавил:
ну и не только при вылете.
Старый 25.04.2011, 06:39
ihsan
Призрак старого Варкрафта
offline
Опыт: 9,067
Активность:
Какая версия вара нужна?
а так, очень полезная система (особенно для меня)
Старый 25.04.2011, 13:54
Doc

offline
Опыт: 63,163
Активность:
По идее на любой после 1.18 должно работать.
Старый 25.04.2011, 13:55
ihsan
Призрак старого Варкрафта
offline
Опыт: 9,067
Активность:
можешь все таки выложить пример, хотя бы такой:
игрок красный напечатал сообщение 1 - добавить сообщение в лог
игрок красный напечатал сообщение 2 - очистить лог
игрок красный напечатал сообщение 3 - Ручная перезапись лога
либо вар тупит либо я криворукий (это наиболее вероятно), но вар не грузит мапу
Старый 25.04.2011, 14:32
Doc

offline
Опыт: 63,163
Активность:
Ок позже запилю пример.
Старый 25.04.2011, 14:42
BK.Jugg
террорист из КиП
offline
Опыт: 27,066
Активность:
крутата, обязательно запилю себе
Старый 25.04.2011, 17:59
Doc

offline
Опыт: 63,163
Активность:
Вот вам пример, команды add clear и update. Файл в C:\Dir\Debug.txt.
Прикрепленные файлы
Тип файла: w3x debug_log_example.w3x (13.1 Кбайт, 122 просмотров )
Старый 25.04.2011, 19:06
Msey
????
offline
Опыт: 67,346
Активность:
Классная весчь :) "approved" ^
Старый 23.05.2011, 21:35
wetalq

offline
Опыт: 3,715
Активность:
Насколько я понял такую вещь можно использовать в оРпг токо сохранять не Лог а пароль ?
Старый 08.06.2011, 17:57
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
Нельзя. Можно эту.
Старый 08.06.2011, 18:08
Doc

offline
Опыт: 63,163
Активность:
wetalq, сохранение файла можно реализовать по тому же принципу.
Старый 08.06.2011, 21:34
SomeFire
Всего 20 символов...
offline
Опыт: 26,884
Активность:
Проблемы по мере их поступления:
  1. отключаю основной триггер в примере и больше не могу его включить. Пишет кучу всяких отсутствий. Нужен нестандартный редактор?
SomeFire добавил:
Если вырубаю другие триггеры, выдает отсутсвие оператора кода.
Старый 13.06.2011, 21:26
Ответ

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

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

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

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



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