Minecraft NBT-File Library

    • VB.NET

      Minecraft NBT-File Library

      Hallo liebe Community,

      ich war hier jetzt schon seit einiger Zeit nicht mehr online, bin mal meine alten Projekte durchgegangen und auf was gestoßen, was ich in meiner Ausbildung als Zeitvertreib in der Berufsschule gemacht habe.

      Damals wollte ich ein Backup-Programm für Minecraft schreiben, das damals noch ziemlich instabil war..
      Die Funktionsweise war einfach mit einem Timer die Ordner in ein Backup-Verzeichnis zu kopieren, nur wollte ich auch die Namen der Welt auslesen - nicht nur die Ordnernamen. Und diese sind in einer Meta-Datei der Spielstände im NBT-Format gespeichert.

      Also habe ich mir die Doku von Notch angesehen und eine Weile daran gesessen, eine Library für NBT-Files zu schreiben.

      Jetzt habe ich das wieder entdeckt und gedacht es kann vielleicht jemand brauchen, weiß leider nicht ob sich seit dem etwas am Dateiformat getan hat..
      Der Sourcecode ist von mir und hier und da aus dem Internet inspiriert - auf jeden Fall frei.

      Da ich eigentlich PHP-Entwickler bin und die Art der Programmierung dort anders ist als in VB, ist es natürlich auch nicht die sauberste Arbeit, also sicherlich Refactoring-Bedürftig.
      Ich habe außerdem eine kleine Demo-Klasse geschrieben, wie man Werte auslesen kann, um mir abgesehen von den übermäßigen Kommentaren, eine Dokumentation zu ersparen:

      VB.NET-Quellcode

      1. Imports NBTLib
      2. Public Class Demo
      3. Private _oNBT As NBTFile
      4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      5. Dim ofd As New OpenFileDialog()
      6. If ofd.ShowDialog() = Windows.Forms.DialogResult.OK Then
      7. 'creating nbt-file
      8. Me._oNBT = New NBTFile(ofd.FileName)
      9. 'getting the data
      10. Dim oTags As NBTTag = Me._oNBT.getData()
      11. Dim oFileInfo As New IO.FileInfo(ofd.FileName)
      12. 'creating root-node with filename
      13. Dim oRootNode As New TreeNode(oFileInfo.Name)
      14. 'push the nbt-tags to view
      15. TreeView1.Nodes.Clear()
      16. oRootNode.Nodes.Add(Me._tagToNode(oTags))
      17. TreeView1.Nodes.Add(oRootNode)
      18. 'enable reading
      19. Button2.Enabled = True
      20. End If
      21. End Sub
      22. Private Function _tagToNode(ByVal oTag As NBTTag) As TreeNode
      23. Dim oNode As New TreeNode(oTag.getTagType().ToString & ": """ & oTag.getName() & """")
      24. If oTag.getTagType() <> NBTTag.TagType.Empty And oTag.getTagType() <> NBTTag.TagType.TAG_Compound And oTag.getTagType() <> NBTTag.TagType.TAG_List And oTag.getTagType() <> NBTTag.TagType.TAG_Byte_Array And oTag.getTagType() <> NBTTag.TagType.TAG_Int_Array Then
      25. oNode.Text &= ": " & oTag.getValue().ToString()
      26. Else
      27. oNode.Text &= " [" & oTag.getChildren().Count & " children]"
      28. End If
      29. Dim oChildren As List(Of TreeNode) = Me._getChildren(oTag)
      30. For Each oChild As TreeNode In oChildren
      31. oNode.Nodes.Add(oChild)
      32. Next
      33. Return oNode
      34. End Function
      35. Private Function _getChildren(ByVal oTag As NBTTag) As List(Of TreeNode)
      36. Dim oTree As New List(Of TreeNode)
      37. Dim iTreeIndex As Integer = 0
      38. For Each oChildTag As NBTTag In oTag.getChildren()
      39. Dim oCurNode As TreeNode = Me._tagToNode(oChildTag)
      40. oTree.Add(oCurNode)
      41. Next
      42. Return oTree
      43. End Function
      44. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
      45. Dim sPath As String = InputBox("Pfad zum Tag eingeben, getrennt durch ""/"", beginnend 1 Ebene unter dem ersten Tag", "Pfad eingeben", "Data/LevelName")
      46. MsgBox(Me._oNBT.read(sPath))
      47. End Sub
      48. End Class


      Hierfür fehlt natürlich der Designer-Code, aber ich denke man sieht gut, wie die Library funktioniert.
      Im Anhang findet ihr den Sourcecode und die kompilierte dll-Datei, hoffe jemand kann es brauchen und würde mich über Feedback freuen :)
      Dateien
      • NBTFile.vb

        (23,44 kB, 150 mal heruntergeladen, zuletzt: )
      • NBTLib.dll

        (20,48 kB, 167 mal heruntergeladen, zuletzt: )
      LG
      Merio