Пример использования
Для начала рассмотрим простой пример использования Preload Exploit.
Мы сделаем такую систему:
Игрок вводит сообщения в чат. После ввода -save все сообщения записываются в файл.
Мы сделаем такую систему:
Игрок вводит сообщения в чат. После ввода -save все сообщения записываются в файл.
- Открываем редактор и создаём новую карту.
- Открываем редактор триггеров и удаляем триггер Иниц. сражения
- Создаём триггер и добавляем событие - Map Initialization
- Конвертируем в текст
- В код триггера вставляем следующее:
call PreloadGenClear()
- Создаём ещё один триггер и добавляем событие - Игрок 1 (красный) types a chat message contains <Пустая строка> as Подстрока - т.е. при вводе сообщения.
- Конвертируем в текст
- В код этого триггера вставляем следующее:
if (GetEventPlayerChatString()=="-save") then
call PreloadGenEnd("save\\PreExp.txt")
else
call Preload(GetEventPlayerChatString())
endif
Система сделана.
Эту карту я выложил во вложениях.
Эту карту я выложил во вложениях.
Итак, запускаем карту. Пишем что-нибудь в чат. Советую пока не использовать кириллицу в сообщениях.
В конце пишем -save, выходим из игры.
В конце пишем -save, выходим из игры.
В папке save (save находится в корневой папке вара) появился файл PreExp.txt.
Новички, скорее всего, ожидают, что там просто построчно записаны все сообщения. Это не так.
Откройте файл...
Новички, скорее всего, ожидают, что там просто построчно записаны все сообщения. Это не так.
Откройте файл...
Содержимое файла PreExp.txt у меня
function PreloadFiles takes nothing returns nothing
call Preload( "hi" )
call Preload( "65757" )
call Preload( "jjj" )
call Preload( "testtesttesr" )
call Preload( "5gfhgf" )
call Preload( "asefsdf" )
call Preload( "lolololo" )
call Preload( "hi" )
call PreloadEnd( 37.9 )
endfunction
Строки кода, в них записаны наши сообщения... Что это значит - расскажу прямо сейчас.
Что такое Preload Exploit и с чем его едят
Preload Exploit - штука довольно полезна. Но зачем близзы сделали её - не имею понятия.
Хочу сказать, что то, что я сейчасбуду вам впаривать расскажу, может оказаться несколько неточным, так как всё это основано, как я говорил раньше, на моих личных наблюдениях. Никакой статьи по Preload Exploit в рунете не наблюдается, так что терминология, похоже, отсутствует.
Хочу сказать, что то, что я сейчас
Итак. Preload Exploit имеет некий буфер (назовём его так). Есть функции, очищающие его, записывающие в него что-то и записывающие его в файл.
Мы можем сами что-либо засунуть в буфер - а именно строку.
При выполнении записи в файл по указанному пути создаётся файл, в него добавляется код, в котором записано содержимое буфера.
Помните: после записи в файл буфер НЕ очищается.
Мы можем сами что-либо засунуть в буфер - а именно строку.
При выполнении записи в файл по указанному пути создаётся файл, в него добавляется код, в котором записано содержимое буфера.
Помните: после записи в файл буфер НЕ очищается.
Анализ нашего кода
Рассмотрим ту систему, которую мы только что создали.
- Триггер инициализации
call PreloadGenClear()
- call PreloadGenClear()
- Триггер ввода сообщения
if (GetEventPlayerChatString()=="-save") then
call PreloadGenEnd("save\\PreExp.txt")
else
call Preload(GetEventPlayerChatString())
endif
- call PreloadGenEnd("save\\PreExp.txt")
- call Preload(GetEventPlayerChatString())
Кое-что ещё
В ответах на форуме я замечал, что перед заполнением буфера нужно добавить:
call PreloadGenStart()
Из своих наблюдений я вывел, что делать этого не следует - из-за этого в буфер попадает всякий мусор - пути к текстурам и звукам.
Про PreloadGenClear()
В jass есть ещё функция PreloadRefresh(). В чём её отличие от PreloadGenClear() - распознать не удалось. Если есть знатоки - пишите, исправлю.
Теперь рассмотрим файл save\PreExp.txt
function PreloadFiles takes nothing returns nothing
call Preload( "hi" )
call Preload( "65757" )
call Preload( "jjj" )
call Preload( "testtesttesr" )
call Preload( "5gfhgf" )
call Preload( "asefsdf" )
call Preload( "lolololo" )
call Preload( "hi" )
call PreloadEnd( 37.9 )
endfunction
- function PreloadFiles takes nothing returns nothing
- call Preload( "<какая-то строка>" )
- call PreloadEnd( 37.9 )
Заключение
Итак, мы в какой-то степени познакомились с Preload Exploit. Мы умеем записывать что-то в буфер и выводить это в файл.
Вот список функций, которые мы уже знаем:
Вот список функций, которые мы уже знаем:
- PreloadGenClear() - очищает буфер.
- Preload(S) - записывает в буфер строку S. Также встречается в выходном файле.
- PreloadGenEnd(F) - записывает содержимое буфера в виде кода в файл F.
- PreloadGenStart() - насколько я понял, начинает записывать в буфер пути к текстурам и звукам. В общем, создаёт бесполезный мусор.
- PreloadRefresh() - насколько я понял, делает то же, что и PreloadGenClear().
- PreloadEnd(R) - встречается в конце выходного файла. Смысл её непонятен. В качестве параметра берёт real.
В следующей главе я расскажу, как запускать код из файла и как читать информацию из файла.
Ред. Arti
Ред. Sergant1000
PreloadRefresh() - обновляет данные то есть перезаписывает
PreloadGenClear() - очищает полностью
Вероятно для автоматического создания *.pld скриптов, файлов в которых записано что нужно подгрузить игре в карте....
В архиве игры нашёл кучу файлов с расширением *.pld вот пример
Ред. Globder
Globder: p.s Все норм, надо было вставлять до первого endfunction, а не перед крайним. (почему, хз)