WarCraft 3: Загрузка Mix из интернета картой

» Раздел: Работа с MPQ и импортом

Ну что ж, Дружочки, собственно говоря сабж, сегодня мы будем делать довольно бесполезную, но весьма интересную, а именно качать из интернета музыкальный архив на лету, для этого нам понадобиться:
  • мемхак первой версии
  • включенные локальные файлы
  • VBS скрипт загрузки файла
» ЧЕГО?
Почему именно так? если есть SendHttpGetRequest?
К сожалению для него нужен Dotahelper.dll (он же EXTRADLLNAME), который весит 800 килобайт, и даже его наличие требует ещё дополнительных знаний, и возможно сайт, где будет размещён файл, но у меня последних двух пунктов нет.
  • Прямая ссылка на файл
  • Функция SFileOpenArchive, которая позволит подгрузить MIX, как только он скачается, не дожидаюсь перезапуска карты (увы не сработало в 1 из 10 случаев)
  • Функция FileExistStorm которая позволит проверить наличие файла в папке
» Чего ОПЯТЬ?
Ведь есть же FileExists мне доводилось видеть, как каждый запрос этой функции вызывает утечку в памяти на 40 мегабайт, не будем рисковать
  • или же просто карта образец, приложенная в конец статьи, в которой уже всё это реализовано, но теперь по порядку про каждый пункт более подробно

Memory Hack First

Почему же всё таки первой версии, а не второй,
из за больше разницы в наличии функций, которые урезаны добрым человеком как не нужные, но к сожалению нам они понадобятся, а добавить их не вариант из за разницы того что внутрянка из подфункций разная, я наверное 3 раза поднимал тему о том как объединить эти мемхаки, но к сожалению ответом является - ИСПОЛЬЗОВАТЬ ТОЛЬКО ОДИН

Локальные файлы

Я просто скажу, что они должны быть включены, включить можно либо по ссылке через Regedit, либо карта пример снизу, включит вам всё сама, а сделает она вот этой строчкой:
call ShellExecute("open", "reg", "add \"HKEY_CURRENT_USER\\Software\\Blizzard Entertainment\\Warcraft III\" /v \"Allow Local Files\" /t REG_DWORD /d 00000001 /f")
в общем, если не включить локальные файлы то микс архив будет качаться каждый раз, так как у меня по каким то причинам ни 1 из трёх функции проверки наличия файла не работает.

VBS скрипт

А вот и самая вкусная и в тоже время кривущая вещь, но она работает самостоятельно даже без карты с варкрафтом, вот её код:
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set F = FSO.GetFile(Wscript.ScriptFullName) 

path = FSO.GetParentFolderName(F) 

''WScript.Echo path 

InetFile = "ftp://war3.ddns.net/FTP1GB/War3/End_of_Life.mix" 
localFile = path & "\End_of_Life.mix" 

Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP") 
oXMLHTTP.Open "GET", InetFile, 0, "xgm", "xgm" 
oXMLHTTP.Send 

Set oADOStream = CreateObject("ADODB.Stream") 
oADOStream.Mode = 3 
oADOStream.Type = 1 
oADOStream.Open 
oADOStream.Write oXMLHTTP.responseBody 

oADOStream.SaveToFile localFile, 2 

Set oXMLHTTP = Nothing 
Set oADOStream = Nothing
А качать мы будем музыкальный архив игры End of Life, автор этой замечательной карты просит нас скачать MIX через VKDOC введя 20 символов ручками в браузер, чего врядли кто вообще делал, только если не самые отбитые фанаты, разберу несколько важных строк из скрипта:
  • InetFile = "ftp://war3.ddns.net/FTP1GB/War3/End_of_Life.mix" - прямой путь до файла на моём фтп сервере (я поднял фтп на роутере Keenetic, также это можно сделать на микротике и тплинке, всё гуглиться, но если хочть 1 человек заинтересуется, то напишу об этом здесь (как никак это касается Warcraft)), но фтп серевер не обязательно использовать, можно использовать прямую ссылку с XGM, как я показал выше у карты Majesty
  • localFile = path & "\End_of_Life.mix" - кладём микс файл в корень папки с варкрафтом, чтобы он запустился самостоятельно при следующем старте карты, если внутри микса модели или же мы где-то прокололись и музыка не заиграла. Если указать более длинный путь, а конкретно несуществующую папку, то она не создастся, папку можно создать строкой извлечения архива в директорию или прелоадом
  • oXMLHTTP.Open "GET", InetFile, 0, "xgm", "xgm" - xgm - это логин и пароль для фтп сервера, параметры не нужны, в случае если фтп сервер открыт или же если загрузка идёт иным способом (например с сайта XGM) (если на момент того как вы читаете эту статью не качается файл с моего архива то тут много причин: я отключил фтп, у меня нет инета, сдохла флешка, у меня серый ИП, лег дднс, я не оплатил инет, или вышел 130 патч и все сидят на нём)
Файл down.vbs уже содержится внутри карты и извлечётся из архива при инициализации в корень карты строчкой :
call ExportFileFromMpq("Missle.mdx","down.vbs")
Как видите игра опознаёт vbs скрипт как модель, в общем не верьте своим глазам, переименовывать как угодно никто не запрещал, скрипт можно уничтожить если дописать в конец строчку о его удалении fso.DeleteFile(path+\down.vbs)
Или же можно собрать скрипт через cmd командой echo но об этих извращениях вам больше расскажет гугл, или же снова я, но в следующей статье...

Прямая ссылка

В случае, если используете этот скрипт, то он работает исключительно с прямыми ссылками
Никакие облака никакие VK никакие обменники (может только rghost), но его заблочили, если у вас на конце ссылки нет тип файла (AAA.mix), хоть и идёт загрузка файла по нажатии кнопки ентер, то такая ссылка *** !!! НЕ ПОДОЙДЁТ!!!**, да простят меня профи програмеры за бред что я пишу здесь!, есть лозейки, позволяющие получить прямую ссылку на файл, но они временные, обменник либо вк либо гугл, дают ограниченные по жизни прямые ссылки, верте мне! я много выкурил от этой темы!

Подгрузка на лету

Как только файл скачается, мы захотим его тут же загрузить и послушать нашу Хевиметал или же Бетховена, на помощь к нам придёт библиотека storm.dll и её атрибут (бейте по рукам если это не атрибут) 266, а конкретно функция SFileOpenArchive, вот её код:
function SFileOpenArchive takes string fileName returns boolean
local integer pSFileOpenArchive = GetModuleProcAddress2("Storm.dll", 266)
call WriteRealMemory(pReserverdIntArg1,0)
return CallStdcallWith4Args(pSFileOpenArchive, GetStringAddress(fileName), 15, 0, pReserverdIntArg1) != 0
endfunction
Если всё правильно, то заиграет музыка, если же нет, то всё заработает при следующем старте карты (если файл скачался), к сожалению закрытие архива у меня не получилось, да и смысла не вижу...
Огромное спасибо пользователю ENAleksey за разжевывание этой темы по полочкам

Для тех кто дошёл до это места или сразу пролистал

Собственно вот и карта, где происходит это действо, я никого не призываю качать иные типы файлов кроме mix архивов, патченный Game.dll и ирина коннектор решают все проблемы большого объема файлов да и в 130 нет никакой проблемы, так что я узнал об этом достаточно поздно, и возможно есть 100500 сопособов менее геморойно качать файлы, например как это делает Дота_Лича
Так же, я не особо проверял загрузку микса в локальной сети, но возможно там всё работет

Как проверить всё

  • Включить звук
  • Запустить тестовую карту
  • читать дебаг сообещния на экране и ждать музыки
  • для повторной проверки удалить микс файл из корневой папки

Просмотров: 376

NazarPunk #2 - 2 месяца назад 0
Bergi_Bear, Мало вам моих кук, так ещё и в реестр правки вносите?
Bergi_Bear #3 - 2 месяца назад 0
NazarPunk, это было до того как я куки твои получил
konvan5, жаль не актуально