This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
Keith @ Killa Network edeb684560 Added XBox support
2015-11-05 18:54:13 +11:00

397 lines
16 KiB
VB.net

Public Class Form1
Private FilePresent()() As Boolean
Dim DirPaths As String() = New String() {"region\", "DIM-1\region\", "DIM1\region\"}
Dim Names As String() = New String() {"r.0.0.mcr", "r.-1.0.mcr", "r.0.-1.mcr", "r.-1.-1.mcr"}
Dim NamesA As String() = New String() {"r.0.0.mca", "r.-1.0.mca", "r.0.-1.mca", "r.-1.-1.mca"}
Dim DimNames As String() = New String() {"Overworld", "Nether", "The End"}
Dim StatusText As String()() = New String(2)() {New String(3) {"", "", "", ""}, New String(3) {"", "", "", ""}, New String(3) {"", "", "", ""}}
Dim LevelDatPresent As Boolean = False
Dim MinecraftSaveDir As String
Dim AppDataPermissions As Boolean = True
Dim DirInfo As IO.DirectoryInfo
Dim PlayerFile As String, TargetDir As String
' This method calls a batch file or application and waits till it finishes running before continuing.
Public Function ShellAndWait(ByVal ProcessPath As String, Optional ByVal CommandLine As String = "") As Boolean
Dim objProcess As System.Diagnostics.Process
Try
' Get info and run
objProcess = New System.Diagnostics.Process()
objProcess.StartInfo.FileName = ProcessPath
objProcess.StartInfo.Arguments = CommandLine
objProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
objProcess.Start()
'Wait until the process passes back an exit code
objProcess.WaitForExit()
'Free resources associated with this process
objProcess.Close()
' Return a success flag
Return True
Catch
' Return a failure flag
Return False
End Try
End Function
Private Sub ExitToolStripMenuItem_Click(sender As Object, e As EventArgs)
Close()
End Sub
Private Sub OpenToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles OpenToolStripMenuItem1.Click
' Show the OpenFileDialog
Dim Result As DialogResult = OpenFileDialog1.ShowDialog()
' If the user canceled, abort now
If Result = Windows.Forms.DialogResult.Cancel Then Exit Sub
' If not, check to make sure the file exists and the name typed was not invalid
If Result = Windows.Forms.DialogResult.OK And My.Computer.FileSystem.FileExists(OpenFileDialog1.FileName) Then
' Clear the directories if they exist
If My.Computer.FileSystem.DirectoryExists(My.Application.Info.DirectoryPath + "\xbla\temp World") Then My.Computer.FileSystem.DeleteDirectory(My.Application.Info.DirectoryPath + "\xbla\temp World", FileIO.DeleteDirectoryOption.DeleteAllContents)
If My.Computer.FileSystem.DirectoryExists(My.Application.Info.DirectoryPath + "\tools\temp World") Then My.Computer.FileSystem.DeleteDirectory(My.Application.Info.DirectoryPath + "\tools\temp World", FileIO.DeleteDirectoryOption.DeleteAllContents)
' Set the status text of the label
lblFStatus.Text = "Extracting files..."
Application.DoEvents()
' Copy the file to the working directory and try to extract
My.Computer.FileSystem.CopyFile(OpenFileDialog1.FileName, My.Application.Info.DirectoryPath + "\xbla\savegame.dat", True)
If ShellAndWait(My.Application.Info.DirectoryPath + "\xbla\extract.bat", "temp") = False Then
MsgBox("Error: could not open the save game extractor.", MsgBoxStyle.Exclamation, "Extractor missing.")
Exit Sub
End If
' If here, the extractor finished, so now we examine the files it produced.
ExamineXBoxWorld(My.Application.Info.DirectoryPath + "\xbla\temp World\")
lblFStatus.Text = "savegame.dat open."
' Update all the information labels
UInfo()
Button1.Enabled = True
SaveToolStripMenuItem.Enabled = True
ToolStripMenuItem1.Enabled = True
' Show all the information labels
For I As Integer = 1 To 11
Controls.Find("Label" + Trim(Str(I)), True)(0).Show()
Next
Button1.Show()
' Move the directory to the processing center
My.Computer.FileSystem.MoveDirectory(My.Application.Info.DirectoryPath + "\xbla\temp World", My.Application.Info.DirectoryPath + "\tools\temp World")
Else
' Alert the user that the file was invalid
MsgBox("'" + OpenFileDialog1.FileName + "' could not be found. Please double check your name and try again.", MsgBoxStyle.Exclamation, "File not found.")
End If
End Sub
' This looks through to see what region files exist in this XBox world
Private Sub ExamineXBoxWorld(ByVal Directory As String)
Dim D As IO.DirectoryInfo
AReset()
' For each dimension...
For I As Integer = 0 To 2
D = New IO.DirectoryInfo(Directory + DirPaths(I))
' Now look for each file in turn
For Each F As IO.FileInfo In D.GetFiles()
Select Case F.Name
Case "r.0.0.mcr"
FilePresent(I)(0) = True
Case "r.-1.0.mcr"
FilePresent(I)(1) = True
Case "r.0.-1.mcr"
FilePresent(I)(2) = True
Case "r.-1.-1.mcr"
FilePresent(I)(3) = True
End Select
Next
Next
' Look for level.dat
LevelDatPresent = My.Computer.FileSystem.FileExists(Directory + "\level.dat")
End Sub
' Resets all labels to display files as not present
Private Sub AReset()
For I As Integer = 0 To 2
For N As Integer = 0 To 3
FilePresent(I)(N) = False
Next
Next
LevelDatPresent = False
End Sub
' Updates information on the labels
Private Sub UInfo()
For I As Integer = 0 To 2
For N As Integer = 0 To 3
If FilePresent(I)(N) Then
StatusText(I)(N) = "present"
Else : StatusText(I)(N) = "not present"
End If
Next
Next
If LevelDatPresent Then
Label11.Text = "present"
Else : Label11.Text = "not present"
End If
UpdateLabels()
End Sub
' Counts the number of files present
Private Function ACount(ByVal Index As Integer) As Integer
Dim Retval As Integer = 0
For I As Integer = 0 To 3
If FilePresent(Index)(I) Then Retval += 1
Next
Return Retval
End Function
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Hide the report form
Form2.Hide()
' Initialize file present array
FilePresent = New Boolean(2)() {New Boolean(3) {False, False, False, False}, New Boolean(3) {False, False, False, False}, New Boolean(3) {False, False, False, False}}
' Check for application data
If Not My.Computer.FileSystem.DirectoryExists(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData + "\xbox_to_pc_minecraft") Then
Try
My.Computer.FileSystem.CreateDirectory(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData + "\xbox_to_pc_minecraft")
Catch ex As Exception
MsgBox("Notice: this application does not have permission to save your settings. You will have to choose your Minecraft save directory every time you run the converter.", MsgBoxStyle.Exclamation, "No AppData permissions.")
AppDataPermissions = False
End Try
Else
' Try to read path to Minecraft save directory
If My.Computer.FileSystem.FileExists(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData + "\xbox_to_pc_minecraft\save_directory.dat") Then
MinecraftSaveDir = My.Computer.FileSystem.ReadAllText(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData + "\xbox_to_pc_minecraft\save_directory.dat")
End If
End If
End Sub
Private Sub CustomizeToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles CustomizeToolStripMenuItem.Click
UpdateSaveDirectory()
End Sub
Private Sub UpdateSaveDirectory()
' Allow user to browse to the Minecraft save directory
Dim Result As DialogResult = FolderBrowserDialog1.ShowDialog()
' If user canceled, abort now; otherwise, continue
If Result = Windows.Forms.DialogResult.Cancel Then Exit Sub
' If here, set the save directory and try to save it to app data
If My.Computer.FileSystem.DirectoryExists(FolderBrowserDialog1.SelectedPath) Then
MinecraftSaveDir = FolderBrowserDialog1.SelectedPath
My.Computer.FileSystem.WriteAllText(My.Computer.FileSystem.SpecialDirectories.CurrentUserApplicationData + "\xbox_to_pc_minecraft\save_directory.dat", MinecraftSaveDir, False)
Else
MsgBox("Could not find " + FolderBrowserDialog1.SelectedPath + ". Please check the folder name and try again.", MsgBoxStyle.Exclamation, "Folder not found.")
End If
End Sub
Private Sub Convert(ByVal Preferences As Boolean)
Dim L As Label, S As String, Nt As String
If Form2 Is Nothing Then Form2 = New Form2
Form2.TextBox1.Text = ""
' If there is no Minecraft save directory specified, get one now.
If MinecraftSaveDir = "" Or Preferences Or Not My.Computer.FileSystem.DirectoryExists(MinecraftSaveDir) Then UpdateSaveDirectory()
' Deactivate button and menu
Button1.Enabled = False
ToolStripMenuItem1.Enabled = False
SaveToolStripMenuItem.Enabled = False
MenuStrip1.Enabled = False
lblFStatus.Text = "Conversion in progress..."
' Set label information
For I As Integer = 8 To 10
L = Controls.Find("Label" + Trim(Str(I)), True)(0)
For N As Integer = 0 To 3
If FilePresent(I - 8)(N) Then
StatusText(I - 8)(N) = "waiting"
Else : StatusText(I - 8)(N) = "not present"
End If
Next
UpdateLabels()
Next
Label11.Text = "waiting"
Application.DoEvents()
' Do the conversion
For N As Integer = 0 To 2
' Add the dimention title to the report
Form2.TextBox1.Text += DimNames(N) + vbCrLf + "----------------------------------" + vbCrLf + vbCrLf
' Nether flag for bedrock removal and End flag for proper biome setting
Nt = ""
If N = 1 Then Nt = " Nether"
If N = 2 Then Nt = " End"
' For each file in this region...
For I As Integer = 0 To 3
' If the file is present, convert it
If FilePresent(N)(I) Then
If I = 0 Or I = 2 Then : S = "i " : Else : S = "- " : End If
If I = 0 Or I = 1 Then : S += "i" : Else : S += "-" : End If
' Clean up from last one
StatusText(N)(I) = "preparing..."
UpdateLabels()
Application.DoEvents()
ShellAndWait(My.Application.Info.DirectoryPath + "\tools\delete.bat")
' Extract XBox chunks
StatusText(N)(I) = "getting chunks..."
UpdateLabels()
Application.DoEvents()
ShellAndWait(My.Application.Info.DirectoryPath + "\tools\SeparateX.exe", """" + My.Application.Info.DirectoryPath + "\tools\temp World\" + DirPaths(N) + Names(I) + """ """ + My.Application.Info.DirectoryPath + "\tools\temp""")
' Decompress XBox chunks
StatusText(N)(I) = "decompressing..."
UpdateLabels()
Application.DoEvents()
ShellAndWait(My.Application.Info.DirectoryPath + "\tools\decompress.bat")
' Expand XBox chunks
StatusText(N)(I) = "converting chunks..."
UpdateLabels()
Application.DoEvents()
ShellAndWait(My.Application.Info.DirectoryPath + "\tools\ExpandX.exe", ("""" + My.Application.Info.DirectoryPath + "\tools\tempcompressed\"" """ + My.Application.Info.DirectoryPath + "\tools\temp\"" " + S + Nt).Replace("\", "/"))
' Recompress chunks
StatusText(N)(I) = "recompressing..."
UpdateLabels()
Application.DoEvents()
ShellAndWait(My.Application.Info.DirectoryPath + "\tools\CompressP.exe", ("""" + My.Application.Info.DirectoryPath + "\tools\temp\"" """ + My.Application.Info.DirectoryPath + "\tools\tempcompressed\""").Replace("\", "/"))
' Compile chunks
StatusText(N)(I) = "saving..."
UpdateLabels()
Application.DoEvents()
ShellAndWait(My.Application.Info.DirectoryPath + "\tools\ReconstructP.exe", ("""" + My.Application.Info.DirectoryPath + "\tools\tempcompressed\"" """ + My.Application.Info.DirectoryPath + "\tools\temp World\" + DirPaths(N) + NamesA(I) + """").Replace("\", "/"))
' Done
StatusText(N)(I) = "complete"
UpdateLabels()
Application.DoEvents()
' Add the log to the report
Form2.TextBox1.Text += My.Computer.FileSystem.ReadAllText(My.Application.Info.DirectoryPath + "\log.txt") + vbCrLf + "==================================" + vbCrLf + vbCrLf
End If
Next
Next
' Keep getting world names until a valid one is given (world does not already exist)
Do While TargetDir = "" Or My.Computer.FileSystem.DirectoryExists(MinecraftSaveDir + "\" + TargetDir + " World")
TargetDir = InputBox("Please enter a name for your world:", "Name your world")
Loop
Form2.Label1.Text = "Conversion report - " + TargetDir
' Now convert level.dat
' Grab the first player file; that will be the source of the inventory
My.Computer.FileSystem.CopyFile(My.Application.Info.DirectoryPath + "\tools\temp World\level.dat", My.Application.Info.DirectoryPath + "\tools\temp World\level.dat_xbox")
DirInfo = New IO.DirectoryInfo(My.Application.Info.DirectoryPath + "\tools\temp World\players")
If DirInfo.GetFiles().Length < 1 Then
PlayerFile = "player_template.dat"
Else
PlayerFile = "temp World\players\" + DirInfo.GetFiles()(0).Name
End If
Label11.Text = "converting..."
Application.DoEvents()
ShellAndWait(My.Application.Info.DirectoryPath + "\tools\savegamedat.exe", ("""" + My.Application.Info.DirectoryPath + "\tools\level_template.dat"" """ + My.Application.Info.DirectoryPath + "\tools\temp World\level.dat"" """ + My.Application.Info.DirectoryPath + "\tools\" + PlayerFile + """ """ + TargetDir + """").Replace("\", "/"))
' Now compress level.dat
Label11.Text = "compressing..."
Application.DoEvents()
ShellAndWait(My.Application.Info.DirectoryPath + "\tools\GZ_c.exe", ("""" + My.Application.Info.DirectoryPath + "\tools\temp World\"" level.dat").Replace("\", "/"))
Label11.Text = "complete"
' Now move to the Minecraft save directory
My.Computer.FileSystem.MoveDirectory(My.Application.Info.DirectoryPath + "\tools\temp World", MinecraftSaveDir + "\" + TargetDir + " World")
lblFStatus.Text = "Conversion complete. Choose another file to convert."
' Reenable menu
MenuStrip1.Enabled = True
Button2.Enabled = True
End Sub
' Update the text on the labels
Private Sub UpdateLabels()
Dim L As Label
For I As Integer = 0 To 2
L = Controls.Find("label" + Trim(Str(I + 8)), True)(0)
L.Text = ""
For N As Integer = 0 To 3
L.Text += StatusText(I)(N) + vbCrLf
Next
Next
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Convert(False)
End Sub
Private Sub SaveToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SaveToolStripMenuItem.Click
Convert(True)
End Sub
Private Sub ToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem1.Click
Convert(False)
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Form2.Show()
End Sub
End Class