Ну что ж, Дружочки, собственно говоря сабж, сегодня мы будем делать довольно бесполезную, но весьма интересную, а именно качать из интернета музыкальный архив на лету, для этого нам понадобиться:
  • мемхак первой версии
  • включенные локальные файлы
  • 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 сопособов менее геморойно качать файлы, например как это делает Дота_Лича
Так же, я не особо проверял загрузку микса в локальной сети, но возможно там всё работет

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

  • Включить звук
  • Запустить тестовую карту
  • читать дебаг сообещния на экране и ждать музыки
  • для повторной проверки удалить микс файл из корневой папки
`
ОЖИДАНИЕ РЕКЛАМЫ...
30
Bergi_Bear, Мало вам моих кук, так ещё и в реестр правки вносите?
33
NazarPunk, это было до того как я куки твои получил
konvan5, жаль не актуально
10
Тебе бы это хотя бы на годик раньше, для гарены пригодилось бы, да и на рубатла тоже. А вот айкап давно на это клал, жаль чтобы не все сервера
14
У меня проблемка вышла. Открыл тестовую карту(все готовое беру), открывается менюшка выбора файла открытия программы. Нажал верхнюю, какие-то виндовс сервера. И после выдало ошибку, при последующих загрузках ошибка также была.
33
Там выключен мой фтп сервер, разумеется будет ошибка при загрузке, хотя не помню что он качает, если маджести микс, то стоит проверить ссылку. И в эпоху Ирины не сильно актуально откуда то качать
14
Про эпоху ирины не понял, почему не актуально, особенно когда на реф так мало перешло. Сейчас попробую заменит ссылку(если найду где), чтобы качался мой файл.

В вбс файле нашел путь, при его активации уже нужный мне микс скачивается. Но активирую вручную. Где этот вбс файл в карте найти?

Так, ладно, скрыть вбс файл файлом модели забавное решение, я очень невнимательно читал статью.

Сделал все как нужно, но последний пункт не работает - для микса нужна перезагрузка, хотя в теории должны были модели подлючится.

Вообщем пункт "подгрузка на лету" не понял.
33
хотя в теории должны были модели подлючится
модели не лету не подгрузить, увы
Маскировка не обязательна, это я просто так показывал, что это "возможно"

Эпоха ирины означает, что все эти миксы не нужны в принципе, можно всё разместить внутри карты

особенно когда на реф так мало перешло
Ну я вот полностью перешёл на реф, и эта тема мне не сильно интересна
Кстати по коду, лучше реестр не патчить через "ShellExecute", там по моему есть какая проблема для подгрузки на лету звука того же, если убрать, то тогда всё нормализуется..
В идеале проверку надо делать, чтобы не трогать реестр прям каждый каждый раз
Чтобы оставить комментарий, пожалуйста, войдите на сайт.