minecraft-vortex-launcher/vlauncher_linux.pb

1061 lines
45 KiB
Plaintext
Raw Normal View History

2019-05-01 15:58:48 -04:00
EnableExplicit
2018-06-13 04:33:28 -04:00
2024-12-06 08:45:05 -05:00
Global.s workingDirectory = RTrim(GetPathPart(ProgramFilename()), "/")
2019-06-17 12:35:12 -04:00
Global.s tempDirectory = GetTemporaryDirectory()
2018-06-13 04:33:28 -04:00
Global.i downloadOkButton
2019-05-01 15:58:48 -04:00
Global.i downloadThreadsAmount
Global.i asyncDownload
Global.i versionsGadget, playButton
Global.i progressBar, filesLeft, progressWindow, downloadingClientTextGadget
Global.i versionsDownloadGadget, downloadVersionButton
Global.i forceDownloadMissingLibraries
2019-06-17 12:35:12 -04:00
Global.s versionsManifestString
2018-06-13 04:33:28 -04:00
2019-06-17 12:35:12 -04:00
Define *FileBuffer
Define.i javaProgram
2019-05-01 15:58:48 -04:00
Define.i Event, font, ramGadget, nameGadget, javaPathGadget, argsGadget, downloadButton, settingsButton, launcherVersionGadget, launcherAuthorGadget
Define.i saveLaunchString, versionsTypeGadget, saveLaunchStringGadget, launchStringFile, inheritsJsonObject, jsonInheritsArgumentsModernMember
Define.i argsTextGadget, javaBinaryPathTextGadget, downloadThreadsTextGadget, downloadAllFilesGadget
Define.i gadgetsWidth, gadgetsHeight, gadgetsIndent, windowWidth, windowHeight
Define.i listOfFiles, jsonFile, jsonObject, jsonObjectObjects, fileSize, jsonJarMember, jsonArgumentsArray, jsonArrayElement, inheritsJson, clientSize
Define.i releaseTimeMember, releaseTime, jsonJvmArray, loggingMember, loggingClientMember, loggingFileMember, logConfSize
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
Define.s playerName, ramAmount, clientVersion, javaBinaryPath, fullLaunchString, assetsIndex, clientUrl, fileHash, versionToDownload
Define.s assetsIndex, clientMainClass, clientArguments, inheritsClientJar, customLaunchArguments, clientJarFile, nativesPath, librariesString
Define.s uuid, jvmArguments, logConfId, logConfUrl, logConfArgument
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
Define.i downloadThread, downloadMissingLibraries, jsonArgumentsMember, jsonArgumentsModernMember, jsonInheritsFromMember
Define.i downloadMissingLibrariesGadget, downloadThreadsGadget, asyncDownloadGadget, saveSettingsButton, useCustomJavaGadget, useCustomParamsGadget, keepLauncherOpenGadget
2019-05-01 15:58:48 -04:00
Define.i i
2018-06-14 04:03:33 -04:00
2024-12-06 08:45:05 -05:00
Define.s playerNameDefault = "PlayerName", ramAmountDefault = "2500", javaBinaryPathDefault = "/usr/bin/java"
2020-07-01 16:17:53 -04:00
Define.s customLaunchArgumentsDefault = "-Xss1M -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1NewSizePercent=20 -XX:G1ReservePercent=20 -XX:MaxGCPauseMillis=50 -XX:G1HeapRegionSize=32M"
2019-06-17 12:35:12 -04:00
Define.s customOldLaunchArgumentsDefault = "-XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:-UseAdaptiveSizePolicy -Xmn128M"
2024-12-06 08:45:05 -05:00
Define.i downloadThreadsAmountDefault = 20
Define.i asyncDownloadDefault = 1
Define.i downloadMissingLibrariesDefault = 1
2019-05-01 15:58:48 -04:00
Define.i downloadAllFilesDefault = 0
Define.i versionsTypeDefault = 0
Define.i saveLaunchStringDefault = 0
Define.i useCustomJavaDefault = 0
Define.i useCustomParamsDefault = 0
Define.i keepLauncherOpenDefault = 0
2018-06-14 04:03:33 -04:00
2024-12-06 08:45:05 -05:00
Define.s launcherVersion = "1.1.20"
2021-07-27 05:03:31 -04:00
Define.s launcherDeveloper = "Kron4ek"
2018-06-14 04:03:33 -04:00
Declare assetsToResources(assetsIndex.s)
2019-05-01 15:58:48 -04:00
Declare progressWindow(clientVersion.s)
Declare findInstalledVersions()
Declare downloadFiles(downloadAllFiles.i)
Declare CreateDirectoryRecursive(path.s)
Declare generateProfileJson()
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
Declare.s parseVersionsManifest(versionType.i = 0, getClientJarUrl.i = 0, clientVersion.s = "")
2024-12-06 08:45:05 -05:00
Declare.s parseLibraries(clientVersion.s, prepareForDownload.i = 0, librariesString.s = "")
2019-05-01 15:58:48 -04:00
Declare.s fileRead(pathToFile.s)
Declare.s removeSpacesFromVersionName(clientVersion.s)
2019-05-01 15:58:48 -04:00
SetCurrentDirectory(workingDirectory)
2024-12-06 08:45:05 -05:00
workingDirectory = RTrim(GetCurrentDirectory(), "/")
2019-05-01 15:58:48 -04:00
OpenPreferences("vortex_launcher.conf")
downloadThreadsAmount = ReadPreferenceInteger("DownloadThreads", downloadThreadsAmountDefault)
asyncDownload = ReadPreferenceInteger("AsyncDownload", asyncDownloadDefault)
2019-06-17 12:35:12 -04:00
DeleteFile(tempDirectory + "vlauncher_download_list.txt")
2019-05-01 15:58:48 -04:00
RemoveEnvironmentVariable("_JAVA_OPTIONS")
2024-12-06 08:45:05 -05:00
windowWidth = 350
windowHeight = 280
2019-05-01 15:58:48 -04:00
If OpenWindow(0, #PB_Ignore, #PB_Ignore, windowWidth, windowHeight, "Vortex Minecraft Launcher")
gadgetsWidth = windowWidth - 10
2024-12-06 08:45:05 -05:00
gadgetsHeight = 35
2019-05-01 15:58:48 -04:00
gadgetsIndent = 5
nameGadget = StringGadget(#PB_Any, gadgetsIndent, 5, gadgetsWidth, gadgetsHeight, ReadPreferenceString("Name", playerNameDefault))
SetGadgetAttribute(nameGadget, #PB_String_MaximumLength, 16)
2024-12-06 08:45:05 -05:00
ramGadget = StringGadget(#PB_Any, gadgetsIndent, 45, gadgetsWidth, gadgetsHeight, ReadPreferenceString("Ram", ramAmountDefault), #PB_String_Numeric)
GadgetToolTip(ramGadget, "Amount (megabytes) of memory to allocate for Minecraft")
SetGadgetAttribute(ramGadget, #PB_String_MaximumLength, 6)
2019-05-01 15:58:48 -04:00
2024-12-06 08:45:05 -05:00
versionsGadget = ComboBoxGadget(#PB_Any, gadgetsIndent, 85, gadgetsWidth, gadgetsHeight)
2019-05-01 15:58:48 -04:00
2024-12-06 08:45:05 -05:00
playButton = ButtonGadget(#PB_Any, gadgetsIndent, 130, gadgetsWidth, gadgetsHeight + 5, "Play")
downloadButton = ButtonGadget(#PB_Any, gadgetsIndent, 175, gadgetsWidth, gadgetsHeight + 5, "Downloader")
settingsButton = ButtonGadget(#PB_Any, gadgetsIndent, 220, gadgetsWidth, gadgetsHeight + 5, "Settings")
2019-05-01 15:58:48 -04:00
2020-07-16 13:15:12 -04:00
If LoadFont(0, "Arial", 10, #PB_Font_Bold)
2019-05-01 15:58:48 -04:00
SetGadgetFont(playButton, FontID(0))
SetGadgetFont(downloadButton, FontID(0))
2018-06-13 04:33:28 -04:00
EndIf
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
launcherAuthorGadget = TextGadget(#PB_Any, 2, windowHeight - 10, 70, 20, "by " + launcherDeveloper)
2020-07-01 16:17:53 -04:00
launcherVersionGadget = TextGadget(#PB_Any, windowWidth - 37, windowHeight - 10, 50, 20, "v" + launcherVersion)
2020-07-16 13:15:12 -04:00
If LoadFont(1, "Arial", 7)
2019-05-01 15:58:48 -04:00
font = FontID(1) : SetGadgetFont(launcherAuthorGadget, font) : SetGadgetFont(launcherVersionGadget, font)
2018-06-13 04:33:28 -04:00
EndIf
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
findInstalledVersions()
2018-06-13 04:33:28 -04:00
Repeat
Event = WaitWindowEvent()
2018-06-14 04:03:33 -04:00
2018-06-13 04:33:28 -04:00
If Event = #PB_Event_Gadget
Select EventGadget()
2019-05-01 15:58:48 -04:00
Case playButton
ramAmount = GetGadgetText(ramGadget)
clientVersion = GetGadgetText(versionsGadget)
playerName = GetGadgetText(nameGadget)
javaBinaryPath = "java"
2019-05-01 15:58:48 -04:00
downloadMissingLibraries = ReadPreferenceInteger("DownloadMissingLibs", downloadMissingLibrariesDefault)
2020-07-16 13:15:12 -04:00
librariesString = ""
clientArguments = ""
2021-08-15 09:56:47 -04:00
jvmArguments = ""
logConfArgument = ""
If FindString(clientVersion, " ")
clientVersion = removeSpacesFromVersionName(clientVersion)
EndIf
If forceDownloadMissingLibraries
downloadMissingLibraries = 1
EndIf
If FindString(playerName, " ")
playerName = ReplaceString(playerName, " ", "")
EndIf
2019-05-01 15:58:48 -04:00
If ReadPreferenceInteger("UseCustomJava", useCustomJavaDefault)
javaBinaryPath = ReadPreferenceString("JavaPath", javaBinaryPathDefault)
EndIf
2019-06-17 12:35:12 -04:00
If ramAmount And Len(playerName) >= 3
2019-07-16 06:47:28 -04:00
If Val(ramAmount) < 350
ramAmount = "350"
2019-07-16 06:47:28 -04:00
MessageRequester("Warning", "You allocated too low amount of memory!" + #CRLF$ + #CRLF$ + "Allocated memory set to 350 MB to prevent crashes.")
EndIf
WritePreferenceString("Name", playerName)
WritePreferenceString("Ram", ramAmount)
WritePreferenceString("ChosenVer", clientVersion)
If RunProgram(javaBinaryPath, "-version", workingDirectory)
2019-05-01 15:58:48 -04:00
jsonFile = ParseJSON(#PB_Any, fileRead("versions/" + clientVersion + "/" + clientVersion + ".json"))
If jsonFile
2021-07-27 05:03:31 -04:00
clientJarFile = "versions/" + clientVersion + "/" + clientVersion + ".jar"
nativesPath = "versions/" + clientVersion + "/natives"
2021-08-11 12:38:53 -04:00
2019-05-01 15:58:48 -04:00
jsonObject = JSONValue(jsonFile)
jsonJarMember = GetJSONMember(jsonObject, "jar")
jsonInheritsFromMember = GetJSONMember(jsonObject, "inheritsFrom")
2021-08-11 12:38:53 -04:00
2021-07-27 05:03:31 -04:00
If jsonInheritsFromMember Or jsonJarMember
If jsonInheritsFromMember
inheritsClientJar = GetJSONString(jsonInheritsFromMember)
Else
inheritsClientJar = GetJSONString(jsonJarMember)
EndIf
2021-08-11 12:38:53 -04:00
2021-07-27 05:03:31 -04:00
If FileSize(clientJarFile) < 1 And FileSize("versions/" + inheritsClientJar + "/" + inheritsClientJar + ".jar") > 0
CopyFile("versions/" + inheritsClientJar + "/" + inheritsClientJar + ".jar", clientJarFile)
EndIf
2021-08-11 12:38:53 -04:00
2021-07-27 05:03:31 -04:00
nativesPath = "versions/" + inheritsClientJar + "/natives"
EndIf
2021-08-11 12:38:53 -04:00
2021-07-27 05:03:31 -04:00
releaseTimeMember = GetJSONMember(jsonObject, "releaseTime")
2021-08-11 12:38:53 -04:00
2021-07-27 05:03:31 -04:00
If releaseTimeMember
releaseTime = Val(StringField(GetJSONString(releaseTimeMember), 1, "-")) * 365 + Val(StringField(GetJSONString(releaseTimeMember), 2, "-")) * 30
2018-06-13 04:33:28 -04:00
EndIf
2019-05-01 15:58:48 -04:00
2020-07-16 13:15:12 -04:00
jsonArgumentsMember = GetJSONMember(jsonObject, "minecraftArguments")
jsonArgumentsModernMember = GetJSONMember(jsonObject, "arguments")
If jsonArgumentsMember
clientArguments = GetJSONString(jsonArgumentsMember)
ElseIf jsonArgumentsModernMember
jsonArgumentsArray = GetJSONMember(jsonArgumentsModernMember, "game")
2021-07-27 05:03:31 -04:00
jsonJvmArray = GetJSONMember(jsonArgumentsModernMember, "jvm")
2020-07-16 13:15:12 -04:00
For i = 0 To JSONArraySize(jsonArgumentsArray) - 1
jsonArrayElement = GetJSONElement(jsonArgumentsArray, i)
If JSONType(jsonArrayElement) = #PB_JSON_String
clientArguments + " " + GetJSONString(jsonArrayElement) + " "
EndIf
Next
2021-08-11 12:38:53 -04:00
2021-07-27 05:03:31 -04:00
If jsonJvmArray
For i = 0 To JSONArraySize(jsonJvmArray) - 1
jsonArrayElement = GetJSONElement(jsonJvmArray, i)
If JSONType(jsonArrayElement) = #PB_JSON_String
2021-08-15 09:56:47 -04:00
jvmArguments + " " + Chr(34) + GetJSONString(jsonArrayElement) + Chr(34) + " "
2021-07-27 05:03:31 -04:00
EndIf
Next
EndIf
2020-07-16 13:15:12 -04:00
EndIf
2024-12-06 08:45:05 -05:00
If FileSize(clientJarFile) > 0
librariesString + parseLibraries(clientVersion, downloadMissingLibraries)
If jsonInheritsFromMember
inheritsClientJar = GetJSONString(jsonInheritsFromMember)
2019-05-01 15:58:48 -04:00
2024-12-06 08:45:05 -05:00
inheritsJson = ParseJSON(#PB_Any, fileRead("versions/" + inheritsClientJar + "/" + inheritsClientJar + ".json"))
2020-07-16 13:15:12 -04:00
2024-12-06 08:45:05 -05:00
If inheritsJson
inheritsJsonObject = JSONValue(inheritsJson)
jsonInheritsArgumentsModernMember = GetJSONMember(inheritsJsonObject, "arguments")
2020-07-16 13:15:12 -04:00
2024-12-06 08:45:05 -05:00
If jsonInheritsArgumentsModernMember
jsonArgumentsArray = GetJSONMember(jsonInheritsArgumentsModernMember, "game")
jsonJvmArray = GetJSONMember(jsonInheritsArgumentsModernMember, "jvm")
2021-08-11 12:38:53 -04:00
2024-12-06 08:45:05 -05:00
For i = 0 To JSONArraySize(jsonArgumentsArray) - 1
jsonArrayElement = GetJSONElement(jsonArgumentsArray, i)
2021-07-27 05:03:31 -04:00
If JSONType(jsonArrayElement) = #PB_JSON_String
2024-12-06 08:45:05 -05:00
clientArguments + " " + GetJSONString(jsonArrayElement) + " "
2021-07-27 05:03:31 -04:00
EndIf
Next
2024-12-06 08:45:05 -05:00
If jsonJvmArray
For i = 0 To JSONArraySize(jsonJvmArray) - 1
jsonArrayElement = GetJSONElement(jsonJvmArray, i)
If JSONType(jsonArrayElement) = #PB_JSON_String
jvmArguments + " " + Chr(34) + GetJSONString(jsonArrayElement) + Chr(34) + " "
EndIf
Next
EndIf
2021-07-27 05:03:31 -04:00
EndIf
2020-07-16 13:15:12 -04:00
2024-12-06 08:45:05 -05:00
librariesString + parseLibraries(inheritsClientJar, downloadMissingLibraries, librariesString)
assetsIndex = GetJSONString(GetJSONMember(JSONValue(inheritsJson), "assets"))
2020-07-16 13:15:12 -04:00
2024-12-06 08:45:05 -05:00
releaseTimeMember = GetJSONMember(inheritsJsonObject, "releaseTime")
2021-08-11 12:38:53 -04:00
2024-12-06 08:45:05 -05:00
If releaseTimeMember
releaseTime = Val(StringField(GetJSONString(releaseTimeMember), 1, "-")) * 365 + Val(StringField(GetJSONString(releaseTimeMember), 2, "-")) * 30
EndIf
Else
MessageRequester("Error", inheritsClientJar + ".json file is missing!") : Break
2021-07-27 05:03:31 -04:00
EndIf
2018-06-14 04:01:39 -04:00
Else
2024-12-06 08:45:05 -05:00
If GetJSONMember(jsonObject, "assets")
assetsIndex = GetJSONString(GetJSONMember(jsonObject, "assets"))
ElseIf releaseTime > 0 And releaseTime < 734925
assetsIndex = "pre-1.6"
Else
assetsIndex = "legacy"
EndIf
2018-06-13 04:33:28 -04:00
EndIf
2024-12-06 08:45:05 -05:00
If jsonInheritsFromMember And inheritsJson
loggingMember = GetJSONMember(inheritsJsonObject, "logging")
2019-07-16 06:47:28 -04:00
Else
2024-12-06 08:45:05 -05:00
loggingMember = GetJSONMember(jsonObject, "logging")
2019-07-16 06:47:28 -04:00
EndIf
2019-05-01 15:58:48 -04:00
2024-12-06 08:45:05 -05:00
If loggingMember
loggingClientMember = GetJSONMember(loggingMember, "client")
2024-12-06 08:45:05 -05:00
If loggingClientMember
loggingFileMember = GetJSONMember(loggingClientMember, "file")
2024-12-06 08:45:05 -05:00
If loggingFileMember
logConfArgument = "-Dlog4j.configurationFile=assets/log_configs/" + GetJSONString(GetJSONMember(loggingFileMember, "id"))
EndIf
EndIf
EndIf
2024-12-06 08:45:05 -05:00
If inheritsJson
FreeJSON(inheritsJson)
EndIf
2019-05-01 15:58:48 -04:00
clientMainClass = GetJSONString(GetJSONMember(jsonObject, "mainClass"))
2019-07-10 05:10:29 -04:00
UseMD5Fingerprint()
uuid = StringFingerprint("OfflinePlayer:" + playerName, #PB_Cipher_MD5)
uuid = Left(uuid, 12) + LCase(Hex(Val("$" + Mid(uuid, 13, 2)) & $0f | $30)) + Mid(uuid, 15, 2) + LCase(Hex(Val("$" + Mid(uuid, 17, 2)) & $3f | $80)) + Right(uuid, 14)
If assetsIndex = "pre-1.6" Or assetsIndex = "legacy"
assetsToResources(assetsIndex)
EndIf
2019-05-01 15:58:48 -04:00
If downloadMissingLibraries
downloadFiles(0)
EndIf
2021-08-11 12:38:53 -04:00
2021-07-27 05:03:31 -04:00
If jvmArguments = ""
jvmArguments = Chr(34) + "-Djava.library.path=" + nativesPath + Chr(34) + " -cp " + Chr(34) + librariesString + clientJarFile + Chr(34)
EndIf
2021-08-11 12:38:53 -04:00
2021-07-27 05:03:31 -04:00
If releaseTime > 0 And releaseTime < 736780
customLaunchArguments = customOldLaunchArgumentsDefault
Else
customLaunchArguments = customLaunchArgumentsDefault
EndIf
2021-08-11 12:38:53 -04:00
2021-07-27 05:03:31 -04:00
If ReadPreferenceInteger("UseCustomParameters", useCustomParamsDefault)
customLaunchArguments = ReadPreferenceString("LaunchArguments", customLaunchArgumentsDefault)
EndIf
2019-05-01 15:58:48 -04:00
fullLaunchString = "-Xmx" + ramAmount + "M " + customLaunchArguments + " -Dlog4j2.formatMsgNoLookups=true " + logConfArgument + " " + jvmArguments + " " + clientMainClass + " " + clientArguments
2021-08-11 12:38:53 -04:00
fullLaunchString = ReplaceString(fullLaunchString, "${auth_player_name}", playerName)
fullLaunchString = ReplaceString(fullLaunchString, "${version_name}", clientVersion)
2022-05-25 18:45:31 -04:00
fullLaunchString = ReplaceString(fullLaunchString, "${game_directory}", Chr(34) + workingDirectory + Chr(34))
2021-08-11 12:38:53 -04:00
fullLaunchString = ReplaceString(fullLaunchString, "${assets_root}", "assets")
fullLaunchString = ReplaceString(fullLaunchString, "${auth_uuid}", uuid)
fullLaunchString = ReplaceString(fullLaunchString, "${auth_access_token}", "00000000000000000000000000000000")
fullLaunchString = ReplaceString(fullLaunchString, "${clientid}", "0000")
fullLaunchString = ReplaceString(fullLaunchString, "${auth_xuid}", "0000")
2021-08-11 12:38:53 -04:00
fullLaunchString = ReplaceString(fullLaunchString, "${user_properties}", "{}")
fullLaunchString = ReplaceString(fullLaunchString, "${user_type}", "mojang")
fullLaunchString = ReplaceString(fullLaunchString, "${version_type}", "release")
fullLaunchString = ReplaceString(fullLaunchString, "${assets_index_name}", assetsIndex)
fullLaunchString = ReplaceString(fullLaunchString, "${auth_session}", "00000000000000000000000000000000")
fullLaunchString = ReplaceString(fullLaunchString, "${game_assets}", "resources")
fullLaunchString = ReplaceString(fullLaunchString, "${classpath}", librariesString + clientJarFile)
fullLaunchString = ReplaceString(fullLaunchString, "${library_directory}", "libraries")
fullLaunchString = ReplaceString(fullLaunchString, "${classpath_separator}", ":")
fullLaunchString = ReplaceString(fullLaunchString, "${natives_directory}", nativesPath)
2021-08-15 09:56:47 -04:00
fullLaunchString = ReplaceString(fullLaunchString, Chr(34) + "-Dminecraft.launcher.brand=${launcher_name}" + Chr(34), "")
fullLaunchString = ReplaceString(fullLaunchString, Chr(34) + "-Dminecraft.launcher.version=${launcher_version}" + Chr(34), "")
2021-08-11 12:38:53 -04:00
2019-05-01 15:58:48 -04:00
RunProgram(javaBinaryPath, fullLaunchString, workingDirectory)
2019-06-17 12:35:12 -04:00
saveLaunchString = ReadPreferenceInteger("SaveLaunchString", saveLaunchStringDefault)
2019-05-01 15:58:48 -04:00
If saveLaunchString
2019-06-17 12:35:12 -04:00
DeleteFile("launch_string.txt")
2019-05-01 15:58:48 -04:00
2019-06-17 12:35:12 -04:00
launchStringFile = OpenFile(#PB_Any, "launch_string.txt")
2021-07-27 05:03:31 -04:00
fullLaunchString = ReplaceString(fullLaunchString, " ", " ")
WriteString(launchStringFile, Chr(34) + javaBinaryPath + Chr(34) + " " + fullLaunchString)
2019-05-01 15:58:48 -04:00
CloseFile(launchStringFile)
EndIf
If Not ReadPreferenceInteger("KeepLauncherOpen", keepLauncherOpenDefault)
Break
EndIf
2018-06-13 04:33:28 -04:00
Else
2019-05-01 15:58:48 -04:00
MessageRequester("Error", "Client jar file is missing!")
2018-06-13 04:33:28 -04:00
EndIf
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
FreeJSON(jsonFile)
2018-06-13 04:33:28 -04:00
Else
2019-05-01 15:58:48 -04:00
MessageRequester("Error", "Client json file is missing!")
2018-06-13 04:33:28 -04:00
EndIf
Else
MessageRequester("Error", "Java not found! Check if Java installed." + #CRLF$ + #CRLF$ + "Or check if path to Java binary is correct.")
2018-06-13 04:33:28 -04:00
EndIf
Else
If playerName = ""
2020-07-02 14:26:07 -04:00
MessageRequester("Error", "Enter your desired name.")
ElseIf ramAmount = ""
MessageRequester("Error", "Enter RAM amount.")
ElseIf Len(playerName) < 3
MessageRequester("Error", "Name is too short! Minimum length is 3.")
EndIf
2018-06-13 04:33:28 -04:00
EndIf
2019-05-01 15:58:48 -04:00
Case downloadButton
2019-06-17 12:35:12 -04:00
*FileBuffer = ReceiveHTTPMemory("https://launchermeta.mojang.com/mc/game/version_manifest.json")
If *FileBuffer
2024-12-06 08:45:05 -05:00
If OpenWindow(1, #PB_Ignore, #PB_Ignore, 300, 160, "Client Downloader")
2019-05-01 15:58:48 -04:00
DisableGadget(downloadButton, 1)
2024-12-06 08:45:05 -05:00
ComboBoxGadget(325, 5, 5, 290, 35)
versionsDownloadGadget = 325
2024-12-06 08:45:05 -05:00
CheckBoxGadget(110, 5, 50, 240, 20, "Show all versions")
2019-05-01 15:58:48 -04:00
versionsTypeGadget = 110
SetGadgetState(versionsTypeGadget, ReadPreferenceInteger("ShowAllVersions", versionsTypeDefault))
2024-12-06 08:45:05 -05:00
CheckBoxGadget(817, 5, 75, 240, 20, "Redownload all files")
2019-07-16 06:47:28 -04:00
downloadAllFilesGadget = 817
2019-05-01 15:58:48 -04:00
SetGadgetState(downloadAllFilesGadget, ReadPreferenceInteger("RedownloadFiles", downloadAllFilesDefault))
2024-12-06 08:45:05 -05:00
downloadVersionButton = ButtonGadget(#PB_Any, 5, 110, 290, 40, "Download")
2019-05-01 15:58:48 -04:00
If IsThread(downloadThread) : DisableGadget(downloadVersionButton, 1) : EndIf
2019-06-17 12:35:12 -04:00
versionsManifestString = PeekS(*FileBuffer, MemorySize(*FileBuffer), #PB_UTF8)
FreeMemory(*FileBuffer)
2019-05-01 15:58:48 -04:00
parseVersionsManifest(GetGadgetState(versionsTypeGadget))
EndIf
Else
MessageRequester("Download Error", "Seems like you have no internet connection")
EndIf
Case versionsTypeGadget
ClearGadgetItems(versionsDownloadGadget)
parseVersionsManifest(GetGadgetState(versionsTypeGadget))
Case downloadVersionButton
versionToDownload = GetGadgetText(versionsDownloadGadget)
CreateDirectoryRecursive("versions/" + versionToDownload)
If ReceiveHTTPFile(parseVersionsManifest(GetGadgetState(versionsDownloadGadget), 1, versionToDownload), "versions/" + versionToDownload + "/" + versionToDownload + ".json")
2019-06-17 12:35:12 -04:00
DeleteFile(tempDirectory + "vlauncher_download_list.txt")
listOfFiles = OpenFile(#PB_Any, tempDirectory + "vlauncher_download_list.txt")
2019-05-01 15:58:48 -04:00
jsonFile = ParseJSON(#PB_Any, fileRead("versions/" + versionToDownload + "/" + versionToDownload + ".json"))
If jsonFile
jsonObject = JSONValue(jsonFile)
assetsIndex = GetJSONString(GetJSONMember(jsonObject, "assets"))
CreateDirectoryRecursive("assets/indexes")
ReceiveHTTPFile(GetJSONString(GetJSONMember(GetJSONMember(jsonObject, "assetIndex"), "url")), "assets/indexes/" + assetsIndex + ".json")
loggingMember = GetJSONMember(jsonObject, "logging")
If loggingMember
loggingClientMember = GetJSONMember(loggingMember, "client")
If loggingClientMember
loggingFileMember = GetJSONMember(loggingClientMember, "file")
If loggingFileMember
logConfId = GetJSONString(GetJSONMember(loggingFileMember, "id"))
logConfUrl = GetJSONString(GetJSONMember(loggingFileMember, "url"))
logConfSize = GetJSONInteger(GetJSONMember(loggingFileMember, "size"))
WriteStringN(listOfFiles, logConfUrl + "::" + "assets/log_configs/" + logConfId + "::" + logConfSize)
CreateDirectoryRecursive("assets/log_configs")
EndIf
EndIf
EndIf
2019-05-01 15:58:48 -04:00
clientUrl = GetJSONString(GetJSONMember(GetJSONMember(GetJSONMember(jsonObject, "downloads"), "client"), "url"))
clientSize = GetJSONInteger(GetJSONMember(GetJSONMember(GetJSONMember(jsonObject, "downloads"), "client"), "size"))
WriteStringN(listOfFiles, clientUrl + "::" + "versions/" + versionToDownload + "/" + versionToDownload + ".jar" + "::" + clientSize)
FreeJSON(jsonFile)
EndIf
jsonFile = ParseJSON(#PB_Any, fileRead("assets/indexes/" + assetsIndex + ".json"))
If jsonFile
jsonObject = JSONValue(jsonFile)
jsonObjectObjects = GetJSONMember(jsonObject, "objects")
If ExamineJSONMembers(jsonObjectObjects)
While NextJSONMember(jsonObjectObjects)
fileHash = GetJSONString(GetJSONMember(GetJSONMember(jsonObjectObjects, JSONMemberKey(jsonObjectObjects)), "hash"))
fileSize = GetJSONInteger(GetJSONMember(GetJSONMember(jsonObjectObjects, JSONMemberKey(jsonObjectObjects)), "size"))
2022-12-19 06:37:12 -05:00
WriteStringN(listOfFiles, "https://resources.download.minecraft.net/" + Left(fileHash, 2) + "/" + fileHash + "::" + "assets/objects/" + Left(fileHash, 2) + "/" + fileHash + "::" + fileSize)
2019-05-01 15:58:48 -04:00
Wend
EndIf
FreeJSON(jsonFile)
EndIf
CloseFile(listOfFiles)
parseLibraries(versionToDownload, 1)
DisableGadget(playButton, 1)
progressWindow(versionToDownload)
downloadThread = CreateThread(@downloadFiles(), GetGadgetState(downloadAllFilesGadget))
Else
MessageRequester("Download Error", "Seems like you have no internet connection!")
EndIf
Case settingsButton
DisableGadget(settingsButton, 1)
If OpenWindow(3, #PB_Ignore, #PB_Ignore, 350, 315, "Vortex Launcher Settings")
argsTextGadget = TextGadget(#PB_Any, 5, 5, 80, 30, "Launch parameters:")
2019-05-01 15:58:48 -04:00
argsGadget = StringGadget(#PB_Any, 85, 5, 260, 30, ReadPreferenceString("LaunchArguments", customLaunchArgumentsDefault))
GadgetToolTip(argsGadget, "These parameters will be used to launch Minecraft")
2019-05-01 15:58:48 -04:00
2024-12-06 08:45:05 -05:00
javaBinaryPathTextGadget = TextGadget(#PB_Any, 5, 45, 80, 30, "Path to Java binary:")
2019-05-01 15:58:48 -04:00
javaPathGadget = StringGadget(#PB_Any, 85, 45, 260, 30, ReadPreferenceString("JavaPath", javaBinaryPathDefault))
2024-12-06 08:45:05 -05:00
GadgetToolTip(javaPathGadget, "Absolute path to the Java binary that will be used to run the game")
2019-05-01 15:58:48 -04:00
downloadThreadsTextGadget = TextGadget(#PB_Any, 5, 85, 80, 30, "Download threads:")
2019-05-01 15:58:48 -04:00
downloadThreadsGadget = StringGadget(#PB_Any, 85, 85, 260, 30, ReadPreferenceString("DownloadThreads", Str(downloadThreadsAmountDefault)), #PB_String_Numeric)
2024-12-06 08:45:05 -05:00
GadgetToolTip(downloadThreadsGadget, "Higher numbers may speedup downloads on fast internet connection (works only with multi-threads downloads)")
2019-05-01 15:58:48 -04:00
SetGadgetAttribute(downloadThreadsGadget, #PB_String_MaximumLength, 3)
2024-12-06 08:45:05 -05:00
CheckBoxGadget(311, 5, 125, 340, 20, "Fast multithreaded downloading")
asyncDownloadGadget = 311
2019-05-01 15:58:48 -04:00
SetGadgetState(asyncDownloadGadget, ReadPreferenceInteger("AsyncDownload", asyncDownloadDefault))
downloadMissingLibrariesGadget = CheckBoxGadget(#PB_Any, 5, 150, 340, 20, "Download missing libraries on game start")
2019-05-01 15:58:48 -04:00
SetGadgetState(downloadMissingLibrariesGadget, ReadPreferenceInteger("DownloadMissingLibs", downloadMissingLibrariesDefault))
2024-12-06 08:45:05 -05:00
saveLaunchStringGadget = CheckBoxGadget(#PB_Any, 5, 175, 340, 20, "Save the launch string to a file")
GadgetToolTip(saveLaunchStringGadget, "The full game launch string will be saved to launch_string.txt")
2019-05-01 15:58:48 -04:00
SetGadgetState(saveLaunchStringGadget, ReadPreferenceInteger("SaveLaunchString", saveLaunchStringDefault))
CheckBoxGadget(312, 5, 200, 340, 20, "Use custom Java")
useCustomJavaGadget = 312
2024-12-06 08:45:05 -05:00
GadgetToolTip(useCustomJavaGadget, "Use custom Java binary instead of the default one from the system")
SetGadgetState(useCustomJavaGadget, ReadPreferenceInteger("UseCustomJava", useCustomJavaDefault))
CheckBoxGadget(313, 5, 225, 340, 20, "Use custom launch parameters")
useCustomParamsGadget = 313
2024-12-06 08:45:05 -05:00
GadgetToolTip(useCustomParamsGadget, "Set custom parameters to launch the game")
SetGadgetState(useCustomParamsGadget, ReadPreferenceInteger("UseCustomParameters", useCustomParamsDefault))
CheckBoxGadget(689, 5, 250, 340, 20, "Keep the launcher open")
keepLauncherOpenGadget = 689
GadgetToolTip(keepLauncherOpenGadget, "Keep the launcher open after launching the game")
SetGadgetState(keepLauncherOpenGadget, ReadPreferenceInteger("KeepLauncherOpen", keepLauncherOpenDefault))
saveSettingsButton = ButtonGadget(#PB_Any, 5, 275, 340, 20, "Save and apply")
DisableGadget(downloadThreadsGadget, Bool(Not GetGadgetState(asyncDownloadGadget)))
DisableGadget(javaPathGadget, Bool(Not GetGadgetState(useCustomJavaGadget)))
DisableGadget(argsGadget, Bool(Not GetGadgetState(useCustomParamsGadget)))
2019-05-01 15:58:48 -04:00
EndIf
Case useCustomParamsGadget
DisableGadget(argsGadget, Bool(Not GetGadgetState(useCustomParamsGadget)))
Case asyncDownloadGadget
DisableGadget(downloadThreadsGadget, Bool(Not GetGadgetState(asyncDownloadGadget)))
Case useCustomJavaGadget
DisableGadget(javaPathGadget, Bool(Not GetGadgetState(useCustomJavaGadget)))
2019-05-01 15:58:48 -04:00
Case saveSettingsButton
If GetGadgetText(downloadThreadsGadget) = "0" : SetGadgetText(downloadThreadsGadget, "5") : EndIf
2019-05-01 15:58:48 -04:00
WritePreferenceInteger("DownloadMissingLibs", GetGadgetState(downloadMissingLibrariesGadget))
WritePreferenceInteger("AsyncDownload", GetGadgetState(asyncDownloadGadget))
WritePreferenceInteger("SaveLaunchString", GetGadgetState(saveLaunchStringGadget))
WritePreferenceInteger("UseCustomJava", GetGadgetState(useCustomJavaGadget))
WritePreferenceInteger("UseCustomParameters", GetGadgetState(useCustomParamsGadget))
WritePreferenceInteger("KeepLauncherOpen", GetGadgetState(keepLauncherOpenGadget))
If GetGadgetState(useCustomJavaGadget)
WritePreferenceString("JavaPath", GetGadgetText(javaPathGadget))
EndIf
If GetGadgetState(asyncDownloadGadget)
WritePreferenceString("DownloadThreads", GetGadgetText(downloadThreadsGadget))
EndIf
If GetGadgetState(useCustomParamsGadget)
WritePreferenceString("LaunchArguments", GetGadgetText(argsGadget))
EndIf
2019-05-01 15:58:48 -04:00
downloadThreadsAmount = Val(GetGadgetText(downloadThreadsGadget))
asyncDownload = GetGadgetState(asyncDownloadGadget)
Case downloadOkButton
CloseWindow(progressWindow)
If IsGadget(playButton) : DisableGadget(playButton, 0) : EndIf
If IsGadget(downloadVersionButton) : DisableGadget(downloadVersionButton, 0) : EndIf
2018-06-13 04:33:28 -04:00
EndSelect
EndIf
2019-05-01 15:58:48 -04:00
If Event = #PB_Event_CloseWindow
If EventWindow() = 1
WritePreferenceInteger("ShowAllVersions", GetGadgetState(versionsTypeGadget))
WritePreferenceInteger("RedownloadFiles", GetGadgetState(downloadAllFilesGadget))
CloseWindow(1)
DisableGadget(downloadButton, 0)
ElseIf EventWindow() = progressWindow
If Not IsThread(downloadThread)
CloseWindow(progressWindow)
If IsGadget(playButton) : DisableGadget(playButton, 0) : EndIf
If IsGadget(downloadVersionButton) : DisableGadget(downloadVersionButton, 0) : EndIf
Else
MessageRequester("Download in progress", "Wait for download to complete!")
EndIf
ElseIf EventWindow() = 3
CloseWindow(3)
DisableGadget(settingsButton, 0)
EndIf
EndIf
Until Event = #PB_Event_CloseWindow And EventWindow() = 0
2019-06-17 12:35:12 -04:00
DeleteFile(tempDirectory + "vlauncher_download_list.txt")
2018-06-13 04:33:28 -04:00
EndIf
2019-05-01 15:58:48 -04:00
Procedure findInstalledVersions()
Protected.s dirName, chosenVer = ReadPreferenceString("ChosenVer", "")
Protected.i directory, chosenFound
directory = ExamineDirectory(#PB_Any, "versions", "*")
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
DisableGadget(playButton, 0)
DisableGadget(versionsGadget, 0)
If directory
While NextDirectoryEntry(directory)
If DirectoryEntryType(directory) = #PB_DirectoryEntry_Directory
dirName = DirectoryEntryName(directory)
If dirName <> ".." And dirName <> "."
If FileSize("versions/" + dirName + "/" + dirName + ".json") > -1
If Not chosenFound And dirName = chosenVer
chosenFound = 1
EndIf
2018-06-14 04:03:33 -04:00
AddGadgetItem(versionsGadget, -1, dirName)
2018-06-13 04:33:28 -04:00
EndIf
EndIf
EndIf
Wend
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
FinishDirectory(directory)
2018-06-14 04:03:33 -04:00
2018-06-13 04:33:28 -04:00
If chosenFound
2019-05-01 15:58:48 -04:00
SetGadgetText(versionsGadget, chosenVer)
2018-06-13 04:33:28 -04:00
Else
2019-05-01 15:58:48 -04:00
SetGadgetState(versionsGadget, 0)
2018-06-13 04:33:28 -04:00
EndIf
EndIf
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
If Not CountGadgetItems(versionsGadget)
DisableGadget(playButton, 1)
DisableGadget(versionsGadget, 1) : AddGadgetItem(versionsGadget, 0, "Versions not found") : SetGadgetState(versionsGadget, 0)
Else
2020-07-02 14:26:07 -04:00
generateProfileJson()
2018-06-13 04:33:28 -04:00
EndIf
EndProcedure
2019-05-01 15:58:48 -04:00
Procedure.s parseVersionsManifest(versionType.i = 0, getClientJarUrl.i = 0, clientVersion.s = "")
Protected.i jsonFile, jsonObject, jsonVersionsArray, jsonArrayElement, i
Protected.s url
2019-06-17 12:35:12 -04:00
jsonFile = ParseJSON(#PB_Any, versionsManifestString)
2019-05-01 15:58:48 -04:00
If jsonFile
jsonObject = JSONValue(jsonFile)
jsonVersionsArray = GetJSONMember(jsonObject, "versions")
For i = 0 To JSONArraySize(jsonVersionsArray) - 1
jsonArrayElement = GetJSONElement(jsonVersionsArray, i)
If getClientJarUrl = 0 And versionType = 0 And GetJSONString(GetJSONMember(jsonArrayElement, "type")) <> "release"
Continue
EndIf
If getClientJarUrl = 0
AddGadgetItem(versionsDownloadGadget, -1, GetJSONString(GetJSONMember(jsonArrayElement, "id")))
Else
If GetJSONString(GetJSONMember(jsonArrayElement, "id")) = clientVersion
url = GetJSONString(GetJSONMember(jsonArrayElement, "url"))
FreeJSON(jsonFile)
ProcedureReturn url
EndIf
EndIf
Next
FreeJSON(jsonFile)
2019-05-01 15:58:48 -04:00
Else
AddGadgetItem(versionsDownloadGadget, -1, "Error")
DisableGadget(downloadVersionButton, 1)
EndIf
SetGadgetState(versionsDownloadGadget, 0)
EndProcedure
2024-12-06 08:45:05 -05:00
Procedure.s parseLibraries(clientVersion.s, prepareForDownload.i = 0, librariesString.s = "")
2019-05-01 15:58:48 -04:00
Protected.i jsonLibrariesArray, jsonArrayElement, jsonFile, fileSize, downloadListFile, zipFile
Protected.i jsonArtifactsMember, jsonDownloadsMember, jsonUrlMember, jsonClassifiersMember, jsonNativesLinuxMember
2019-08-05 05:01:04 -04:00
Protected.i jsonRulesMember, jsonRulesOsMember
2019-05-01 15:58:48 -04:00
Protected.i i, k
2024-12-06 08:45:05 -05:00
Protected.i allowLib, skipLib
2019-05-01 15:58:48 -04:00
2024-12-06 08:45:05 -05:00
Protected.s libName, libNameBase, libsString, packFileName, url
2019-08-05 05:01:04 -04:00
Protected.s jsonRulesOsName
2022-05-25 18:45:31 -04:00
Protected Dim libSplit.s(4)
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
If prepareForDownload = 1
2019-06-17 12:35:12 -04:00
downloadListFile = OpenFile(#PB_Any, tempDirectory + "vlauncher_download_list.txt")
2019-05-01 15:58:48 -04:00
FileSeek(downloadListFile, Lof(downloadListFile), #PB_Relative)
EndIf
2018-06-13 04:33:28 -04:00
UseZipPacker()
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
jsonFile = ParseJSON(#PB_Any, fileRead("versions/" + clientVersion + "/" + clientVersion + ".json"))
If jsonFile
jsonLibrariesArray = GetJSONMember(JSONValue(jsonFile), "libraries")
For i = 0 To JSONArraySize(jsonLibrariesArray) - 1
jsonArrayElement = GetJSONElement(jsonLibrariesArray, i)
2019-08-05 05:01:04 -04:00
allowLib = 1
jsonRulesOsName = "empty"
2024-12-06 08:45:05 -05:00
skipLib = 0
2019-05-01 15:58:48 -04:00
2019-08-05 05:01:04 -04:00
jsonRulesMember = GetJSONMember(jsonArrayElement, "rules")
2019-05-01 15:58:48 -04:00
2019-08-05 05:01:04 -04:00
If jsonRulesMember
For k = 0 To JSONArraySize(jsonRulesMember) - 1
jsonRulesOsMember = GetJSONMember(GetJSONElement(jsonRulesMember, k), "os")
2019-05-01 15:58:48 -04:00
2019-08-05 05:01:04 -04:00
If jsonRulesOsMember
jsonRulesOsName = GetJSONString(GetJSONMember(jsonRulesOsMember, "name"))
EndIf
2019-05-01 15:58:48 -04:00
2019-08-05 05:01:04 -04:00
If GetJSONString(GetJSONMember(GetJSONElement(jsonRulesMember, k), "action")) = "allow"
If jsonRulesOsName <> "empty" And jsonRulesOsName <> "linux"
allowLib = 0
EndIf
Else
If jsonRulesOsName = "linux"
allowLib = 0
EndIf
EndIf
Next
EndIf
2019-05-01 15:58:48 -04:00
2019-08-05 05:01:04 -04:00
If allowLib
libName = GetJSONString(GetJSONMember(jsonArrayElement, "name"))
2019-05-01 15:58:48 -04:00
2022-05-25 18:45:31 -04:00
libSplit(4) = ""
For k = 1 To 4
2019-08-05 05:01:04 -04:00
libSplit(k) = StringField(libName, k, ":")
Next
2024-12-06 08:45:05 -05:00
libNameBase = ReplaceString(libSplit(1), ".", "/") + "/" + libSplit(2)
libName = libNameBase + "/" + libSplit(3) + "/" + libSplit(2) + "-" + libSplit(3)
If librariesString <> ""
If FindString(librariesString, libNameBase + "/")
skipLib = 1
EndIf
EndIf
2019-08-05 05:01:04 -04:00
2022-05-25 18:45:31 -04:00
If libSplit(4)
libName + "-" + libSplit(4)
EndIf
2019-08-05 05:01:04 -04:00
If prepareForDownload = 1
jsonDownloadsMember = GetJSONMember(jsonArrayElement, "downloads")
If jsonDownloadsMember
jsonArtifactsMember = GetJSONMember(jsonDownloadsMember, "artifact")
jsonClassifiersMember = GetJSONMember(jsonDownloadsMember, "classifiers")
If jsonClassifiersMember
jsonNativesLinuxMember = GetJSONMember(jsonClassifiersMember, "natives-linux")
2018-06-14 04:03:33 -04:00
2019-08-05 05:01:04 -04:00
If jsonNativesLinuxMember
url = GetJSONString(GetJSONMember(jsonNativesLinuxMember, "url"))
fileSize = GetJSONInteger(GetJSONMember(jsonNativesLinuxMember, "size"))
libName + "-natives-linux"
EndIf
ElseIf jsonArtifactsMember
url = GetJSONString(GetJSONMember(jsonArtifactsMember, "url"))
fileSize = GetJSONInteger(GetJSONMember(jsonArtifactsMember, "size"))
EndIf
2019-05-01 15:58:48 -04:00
Else
2019-08-05 05:01:04 -04:00
jsonUrlMember = GetJSONMember(jsonArrayElement, "url")
If jsonUrlMember
url = GetJSONString(jsonUrlMember) + libName + ".jar"
Else
url = "https://libraries.minecraft.net/" + libName + ".jar"
EndIf
2019-05-01 15:58:48 -04:00
EndIf
2019-08-05 05:01:04 -04:00
WriteStringN(downloadListFile, url + "::" + "libraries/" + libName + ".jar" + "::" + fileSize)
EndIf
2018-06-14 04:03:33 -04:00
2019-08-05 05:01:04 -04:00
If Not GetJSONMember(jsonArrayElement, "natives")
2024-12-06 08:45:05 -05:00
If skipLib = 0
libsString + workingDirectory + "/libraries/" + libName + ".jar:"
EndIf
2019-05-01 15:58:48 -04:00
Else
2019-08-05 05:01:04 -04:00
If Not Right(libName, 13) = "natives-linux"
zipFile = OpenPack(#PB_Any, "libraries/" + libName + "-natives-linux.jar")
Else
zipFile = OpenPack(#PB_Any, "libraries/" + libName + ".jar")
EndIf
If zipFile
CreateDirectoryRecursive("versions/" + clientVersion + "/natives")
2019-05-01 15:58:48 -04:00
2019-08-05 05:01:04 -04:00
If ExaminePack(zipFile)
While NextPackEntry(zipFile)
If PackEntryType(zipFile) = #PB_Packer_File
packFileName = PackEntryName(zipFile)
2019-05-01 15:58:48 -04:00
2019-08-05 05:01:04 -04:00
If FileSize("versions/" + clientVersion + "/natives/" + packFileName) < 1
UncompressPackFile(zipFile, "versions/" + clientVersion + "/natives/" + packFileName)
EndIf
2019-05-01 15:58:48 -04:00
EndIf
2019-08-05 05:01:04 -04:00
Wend
EndIf
2018-06-14 04:03:33 -04:00
2019-08-05 05:01:04 -04:00
ClosePack(zipFile)
EndIf
2019-05-01 15:58:48 -04:00
EndIf
EndIf
2018-06-13 04:33:28 -04:00
Next
2019-05-01 15:58:48 -04:00
EndIf
2018-06-13 04:33:28 -04:00
2019-05-01 15:58:48 -04:00
FreeJSON(jsonFile)
FreeArray(libSplit())
If prepareForDownload = 1 : CloseFile(downloadListFile) : EndIf
ProcedureReturn libsString
EndProcedure
Procedure downloadFiles(downloadAllFiles.i)
Protected Dim httpArray.i(downloadThreadsAmount)
Protected Dim strings.s(downloadThreadsAmount)
Protected Dim retries.i(downloadThreadsAmount)
Protected.i failedDownloads, succeededDownloads, linesTotal, lines, allowedRetries = 5
Protected.s string
Protected.i file, fileSize, requiredSize, i
Protected.i currentDownloads
Protected.i retries
2019-06-17 12:35:12 -04:00
file = ReadFile(#PB_Any, tempDirectory + "vlauncher_download_list.txt")
2019-05-01 15:58:48 -04:00
If file
While Eof(file) = 0
ReadString(file)
lines + 1
Wend
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
linesTotal = lines
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
FileSeek(file, 0)
If IsGadget(downloadVersionButton) : DisableGadget(downloadVersionButton, 1) : EndIf
If IsGadget(progressBar) : SetGadgetAttribute(progressBar, #PB_ProgressBar_Maximum, linesTotal) : EndIf
If asyncDownload
While (Eof(file) = 0 Or currentDownloads > 0) And failedDownloads <= 5
2019-05-01 15:58:48 -04:00
For i = 0 To downloadThreadsAmount
If httpArray(i) = 0
string = ReadString(file)
If string
fileSize = FileSize(StringField(string, 2, "::"))
requiredSize = Val(StringField(string, 3, "::"))
If (downloadAllFiles = 0 And (fileSize = -1 Or (requiredSize <> 0 And fileSize <> requiredSize))) Or downloadAllFiles = 1
CreateDirectoryRecursive(GetPathPart(StringField(string, 2, "::")))
httpArray(i) = ReceiveHTTPFile(StringField(string, 1, "::"), StringField(string, 2, "::"), #PB_HTTP_Asynchronous)
strings(i) = string
retries(i) = 0
2019-05-01 15:58:48 -04:00
currentDownloads + 1
2019-07-16 06:47:28 -04:00
Else
lines - 1
2019-05-01 15:58:48 -04:00
EndIf
EndIf
2024-12-06 08:45:05 -05:00
ElseIf HTTPProgress(httpArray(i)) = #PB_HTTP_Success
2019-05-01 15:58:48 -04:00
currentDownloads - 1
2019-07-16 06:47:28 -04:00
lines - 1
2019-05-01 15:58:48 -04:00
FinishHTTP(httpArray(i))
httpArray(i) = 0
2024-12-06 08:45:05 -05:00
ElseIf HTTPProgress(httpArray(i)) = #PB_HTTP_Failed
2019-05-01 15:58:48 -04:00
FinishHTTP(httpArray(i))
If retries(i) < allowedRetries
httpArray(i) = ReceiveHTTPFile(StringField(strings(i), 1, "::"), StringField(strings(i), 2, "::"), #PB_HTTP_Asynchronous)
retries(i) + 1
Else
retries(i) = 0
httpArray(i) = 0
failedDownloads + 1
currentDownloads - 1
2018-06-13 04:33:28 -04:00
EndIf
EndIf
2019-05-01 15:58:48 -04:00
Next
If IsGadget(progressBar) : SetGadgetState(progressBar, linesTotal - lines) : EndIf
If IsGadget(filesLeft) : SetGadgetText(filesLeft, "Files remaining: " + lines): EndIf
2019-05-01 15:58:48 -04:00
Delay(500)
Wend
Else
While Eof(file) = 0
string = ReadString(file)
If string
lines - 1
fileSize = FileSize(StringField(string, 2, "::"))
requiredSize = Val(StringField(string, 3, "::"))
If (downloadAllFiles = 0 And (fileSize = -1 Or (requiredSize <> 0 And fileSize <> requiredSize))) Or downloadAllFiles = 1
CreateDirectoryRecursive(GetPathPart(StringField(string, 2, "::")))
If ReceiveHTTPFile(StringField(string, 1, "::"), StringField(string, 2, "::"))
retries = 0
Else
If retries < allowedRetries
retries + 1
FileSeek(file, -1, #PB_Relative)
Continue
Else
failedDownloads = 1
Break
EndIf
EndIf
EndIf
EndIf
If IsGadget(progressBar) : SetGadgetState(progressBar, linesTotal - lines) : EndIf
If IsGadget(filesLeft) : SetGadgetText(filesLeft, "Files remaining: " + lines) : EndIf
2019-05-01 15:58:48 -04:00
Wend
EndIf
If failedDownloads
If IsGadget(filesLeft) : SetGadgetText(filesLeft, "Download failed! " + lines + " files left.") : EndIf
2019-05-01 15:58:48 -04:00
Else
If IsGadget(filesLeft) : SetGadgetText(filesLeft, "Download complete!") : EndIf
2019-05-01 15:58:48 -04:00
EndIf
If IsGadget(progressBar) : HideGadget(progressBar, 1) : EndIf
If IsGadget(downloadOkButton) : HideGadget(downloadOkButton, 0) : EndIf
2019-05-01 15:58:48 -04:00
ClearGadgetItems(versionsGadget)
findInstalledVersions()
CloseFile(file)
EndIf
FreeArray(httpArray())
FreeArray(strings())
DeleteFile(tempDirectory + "vlauncher_download_list.txt")
2019-05-01 15:58:48 -04:00
EndProcedure
Procedure progressWindow(clientVersion.s)
progressWindow = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 230, 95, "Download progress")
2019-05-01 15:58:48 -04:00
If progressWindow
downloadingClientTextGadget = TextGadget(#PB_Any, 5, 5, 220, 30, "Version: " + clientVersion)
filesLeft = TextGadget(#PB_Any, 5, 30, 220, 30, "Files remaining: unknown")
progressBar = ProgressBarGadget(#PB_Any, 5, 60, 220, 20, 0, 100, #PB_ProgressBar_Smooth)
downloadOkButton = ButtonGadget(#PB_Any, 5, 55, 220, 30, "OK")
HideGadget(downloadOkButton, 1)
2019-05-01 15:58:48 -04:00
EndIf
EndProcedure
Procedure CreateDirectoryRecursive(path.s)
Protected.s fullPath, pathElement
Protected.i i = 1
Repeat
pathElement = StringField(path, i, "/")
fullPath + pathElement + "/"
CreateDirectory(fullPath)
i + 1
Until pathElement = ""
EndProcedure
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
Procedure generateProfileJson()
Protected.s fileName = "launcher_profiles.json"
2019-05-01 15:58:48 -04:00
Protected.i file
Protected.i lastProfilesJsonSize = ReadPreferenceInteger("LastProfilesJsonSize", 89)
Protected.i fileSize = FileSize(fileName)
2019-05-01 15:58:48 -04:00
If fileSize <= 0
DeleteFile(fileName)
file = OpenFile(#PB_Any, fileName)
2019-05-01 15:58:48 -04:00
If file
WriteString(file, "{ " + Chr(34) + "profiles" + Chr(34) + ": { " + Chr(34) + "justProfile" + Chr(34) + ": { " + Chr(34) + "name" + Chr(34) + ": " + Chr(34) + "justProfile" + Chr(34) + ", ")
WriteString(file, Chr(34) + "lastVersionId" + Chr(34) + ": " + Chr(34) + "1.12.2" + Chr(34) + " } } }" + #CRLF$)
CloseFile(file)
EndIf
EndIf
fileSize = FileSize(fileName)
If fileSize <> lastProfilesJsonSize
forceDownloadMissingLibraries = 1
EndIf
WritePreferenceInteger("LastProfilesJsonSize", fileSize)
2019-05-01 15:58:48 -04:00
EndProcedure
Procedure.s fileRead(pathToFile.s)
Protected.i file
Protected.s fileContent
file = ReadFile(#PB_Any, pathToFile)
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
If file
2018-06-13 04:33:28 -04:00
Repeat
2019-05-01 15:58:48 -04:00
fileContent + ReadString(file) + #CRLF$
Until Eof(file)
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
CloseFile(file)
2018-06-13 04:33:28 -04:00
EndIf
2018-06-14 04:03:33 -04:00
2019-05-01 15:58:48 -04:00
ProcedureReturn fileContent
2018-06-13 04:33:28 -04:00
EndProcedure
Procedure assetsToResources(assetsIndex.s)
Protected.i jsonFile, jsonObject, jsonObjectObjects, fileSize
Protected.s fileHash, fileName
jsonFile = ParseJSON(#PB_Any, fileRead("assets/indexes/" + assetsIndex + ".json"))
If jsonFile
jsonObject = JSONValue(jsonFile)
jsonObjectObjects = GetJSONMember(jsonObject, "objects")
If ExamineJSONMembers(jsonObjectObjects)
While NextJSONMember(jsonObjectObjects)
fileHash = GetJSONString(GetJSONMember(GetJSONMember(jsonObjectObjects, JSONMemberKey(jsonObjectObjects)), "hash"))
fileSize = GetJSONInteger(GetJSONMember(GetJSONMember(jsonObjectObjects, JSONMemberKey(jsonObjectObjects)), "size"))
fileName = JSONMemberKey(jsonObjectObjects)
If FileSize("resources/" + fileName) <> fileSize
CreateDirectoryRecursive("resources/" + GetPathPart(fileName))
CopyFile("assets/objects/" + Left(fileHash, 2) + "/" + fileHash, "resources/" + fileName)
EndIf
Wend
EndIf
FreeJSON(jsonFile)
EndIf
EndProcedure
Procedure.s removeSpacesFromVersionName(clientVersion.s)
Protected.s newVersionName = ReplaceString(clientVersion, " ", "-")
RenameFile("versions/" + clientVersion + "/" + clientVersion + ".jar", "versions/" + clientVersion + "/" + newVersionName + ".jar")
RenameFile("versions/" + clientVersion + "/" + clientVersion + ".json", "versions/" + clientVersion + "/" + newVersionName + ".json")
RenameFile("versions/" + clientVersion, "versions/" + newVersionName)
ProcedureReturn newVersionName
EndProcedure