Ну что ж, Дружочки, собственно говоря сабж, сегодня мы будем делать довольно бесполезную, но весьма интересную, а именно качать из интернета музыкальный архив на лету, для этого нам понадобиться:
ЧЕГО?
Почему именно так? если есть SendHttpGetRequest?
К сожалению для него нужен Dotahelper.dll (он же EXTRADLLNAME), который весит 800 килобайт, и даже его наличие требует ещё дополнительных знаний, и возможно сайт, где будет размещён файл, но у меня последних двух пунктов нет.
К сожалению для него нужен Dotahelper.dll (он же EXTRADLLNAME), который весит 800 килобайт, и даже его наличие требует ещё дополнительных знаний, и возможно сайт, где будет размещён файл, но у меня последних двух пунктов нет.
- Прямая ссылка на файл
- Функция SFileOpenArchive, которая позволит подгрузить MIX, как только он скачается, не дожидаюсь перезапуска карты (увы не сработало в 1 из 10 случаев)
- Функция FileExistStorm которая позволит проверить наличие файла в папке
Чего ОПЯТЬ?
Ведь есть же FileExists мне доводилось видеть, как каждый запрос этой функции вызывает утечку в памяти на 40 мегабайт, не будем рисковать
- или же просто карта образец, приложенная в конец статьи, в которой уже всё это реализовано, но теперь по порядку про каждый пункт более подробно
Memory Hack First
Почему же всё таки первой версии, а не второй,
из за больше разницы в наличии функций, которые урезаны добрым человеком как не нужные, но к сожалению нам они понадобятся, а добавить их не вариант из за разницы того что внутрянка из подфункций разная, я наверное 3 раза поднимал тему о том как объединить эти мемхаки, но к сожалению ответом является - ИСПОЛЬЗОВАТЬ ТОЛЬКО ОДИН
из за больше разницы в наличии функций, которые урезаны добрым человеком как не нужные, но к сожалению нам они понадобятся, а добавить их не вариант из за разницы того что внутрянка из подфункций разная, я наверное 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), хоть и идёт загрузка файла по нажатии кнопки ентер, то такая ссылка *** !!! НЕ ПОДОЙДЁТ!!!**, да простят меня профи програмеры за бред что я пишу здесь!, есть лозейки, позволяющие получить прямую ссылку на файл, но они временные, обменник либо вк либо гугл, дают ограниченные по жизни прямые ссылки, верте мне! я много выкурил от этой темы!
Никакие облака никакие 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 за разжевывание этой темы по полочкам
Огромное спасибо пользователю ENAleksey за разжевывание этой темы по полочкам
Для тех кто дошёл до это места или сразу пролистал
Собственно вот и карта, где происходит это действо, я никого не призываю качать иные типы файлов кроме mix архивов, патченный Game.dll и ирина коннектор решают все проблемы большого объема файлов да и в 130 нет никакой проблемы, так что я узнал об этом достаточно поздно, и возможно есть 100500 сопособов менее геморойно качать файлы, например как это делает Дота_Лича
Так же, я не особо проверял загрузку микса в локальной сети, но возможно там всё работет
Так же, я не особо проверял загрузку микса в локальной сети, но возможно там всё работет
Как проверить всё
- Включить звук
- Запустить тестовую карту
- читать дебаг сообещния на экране и ждать музыки
- для повторной проверки удалить микс файл из корневой папки
konvan5, жаль не актуально
Ред. VinerX
Ред. Берги
Маскировка не обязательна, это я просто так показывал, что это "возможно"
Кстати по коду, лучше реестр не патчить через "ShellExecute", там по моему есть какая проблема для подгрузки на лету звука того же, если убрать, то тогда всё нормализуется..
В идеале проверку надо делать, чтобы не трогать реестр прям каждый каждый раз