WarCraft 3: Часть 1: Знакомство с Preload Exploit

Preload Exploit: работа с файлами

Пример использования

Для начала рассмотрим простой пример использования Preload Exploit.
Мы сделаем такую систему:
Игрок вводит сообщения в чат. После ввода -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 находится в корневой папке вара) появился файл 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 имеет некий буфер (назовём его так). Есть функции, очищающие его, записывающие в него что-то и записывающие его в файл.
Мы можем сами что-либо засунуть в буфер - а именно строку.
При выполнении записи в файл по указанному пути создаётся файл, в него добавляется код, в котором записано содержимое буфера.
Помните: после записи в файл буфер НЕ очищается.

Анализ нашего кода

Рассмотрим ту систему, которую мы только что создали.
  1. Триггер инициализации
call PreloadGenClear()
  • call PreloadGenClear()
Функция PreloadGenClear полностью очищает буфер.Вообще в самом начале игры буфер, по идее, пуст. Но я особо не думал над этим, так что мало ли что там может быть. Вообще я эту функцию дал, потому что она полезная.
  1. Триггер ввода сообщения
if (GetEventPlayerChatString()=="-save") then
    call PreloadGenEnd("save\\PreExp.txt")
else
    call Preload(GetEventPlayerChatString())
endif
  • call PreloadGenEnd("save\\PreExp.txt")
Функция PreloadGenEnd, как видно из кода, выполняется при вводе -save. Эта функция записывает в указанный файл (в данном случае - save\PreExp.txt) содержимое буфера. Если файл уже существует, то его содержимое безжалостно стираеся. Почему слэш двойной - см. главу Мелочи.
  • call Preload(GetEventPlayerChatString())
Функция Preload добавляет строку в буфер. В данном случае - введённую строку.
» Кое-что ещё
В ответах на форуме я замечал, что перед заполнением буфера нужно добавить:
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
Как видно, в файле содержится функция PreloadFiles. Как её вызвать - в следующей главе.
  • call Preload( "<какая-то строка>" )
Функция Preload нам знакома! Тут в неё записаны те строки, которые мы вводили.
  • call PreloadEnd( 37.9 )
Смысл этой строчки для меня непонятен. Всё равно в следующей главе мы будем её убирать - она нам не нужна.

Заключение

Итак, мы в какой-то степени познакомились с Preload Exploit. Мы умеем записывать что-то в буфер и выводить это в файл.
Вот список функций, которые мы уже знаем:
  • PreloadGenClear() - очищает буфер.
  • Preload(S) - записывает в буфер строку S. Также встречается в выходном файле.
  • PreloadGenEnd(F) - записывает содержимое буфера в виде кода в файл F.
  • PreloadGenStart() - насколько я понял, начинает записывать в буфер пути к текстурам и звукам. В общем, создаёт бесполезный мусор.
  • PreloadRefresh() - насколько я понял, делает то же, что и PreloadGenClear().
  • PreloadEnd(R) - встречается в конце выходного файла. Смысл её непонятен. В качестве параметра берёт real.
В следующей главе я расскажу, как запускать код из файла и как читать информацию из файла.

Просмотров: 3 527

Bornikkeny #1 - 6 лет назад 0
Как то мутно... Непонятно...
Arti #2 - 6 лет назад (отредактировано ) 0
Если ты пишешь статью, не используй даные выражения:
Preload Exploit - штука довольно полезна. Но зачем близзы сделали её - не имею понятия.
Смысл этой строчки для меня непонятен.
Тьма #3 - 6 лет назад 0
Статья мутная, нфига не понял как записывать загруженые данные в переменную
Артас Менетил #4 - 6 лет назад 0
Тьма:
Статья мутная, нфига не понял как записывать загруженые данные в переменную
В следующую главу, пожалуйста.
Nikir #5 - 6 лет назад 1
Спасибо, все понял, вот только смутило незнание определенных ф-ций, для чего-то же они созданны.
Sergant1000 #6 - 5 лет назад (отредактировано ) 0
из наблюдений могу сказать что:
PreloadRefresh() - обновляет данные то есть перезаписывает
PreloadGenClear() - очищает полностью
quq_CCCP #7 - 4 года назад 0
Но зачем близзы сделали её - не имею понятия. ---
Вероятно для автоматического создания *.pld скриптов, файлов в которых записано что нужно подгрузить игре в карте....
В архиве игры нашёл кучу файлов с расширением *.pld вот пример
прикреплены файлы
DracoL1ch #8 - 8 месяцев назад 0
PreloadGenClear и PreloadEnd и PreloadEndEx делают примерно одно и то же, отправляя файлы на подзагрузку. Параметр = количество тиков, отведенное под загрузку данных. Если переваливает, подзагрузка прекращается. Если функция не принимает параметр, что считается 0 (клир) или 2^32 (unsigned int 0xFFFFFFFF, у EndEx).