nbt_utils 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.gitignore CHANGED
@@ -1,2 +1,4 @@
1
1
  .bundle/
2
2
  .idea/
3
+ tmp
4
+ nbt_utils*.gem
@@ -7,12 +7,11 @@ PATH
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
- bindata (1.2.1)
10
+ bindata (1.3.1)
11
11
 
12
12
  PLATFORMS
13
13
  ruby
14
14
 
15
15
  DEPENDENCIES
16
- bindata (~> 1.2)
17
16
  bundler (>= 1.0.0)
18
17
  nbt_utils!
data/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  nbt_utils
2
2
  =========
3
3
 
4
- Some classes for handling Minecraft .nbt files.
4
+ Some classes for handling [Minecraft](http://minecraft.net) .nbt files.
5
5
 
6
- See http://www.minecraft.net/docs/NBT.txt for specification info, also mirred in the doc directory.
6
+ See [the spec](http://www.minecraft.net/docs/NBT.txt) for more info, also mirrored in the doc directory in a file named `NBT.txt`.
7
7
 
8
8
  Installation
9
9
  ============
@@ -12,6 +12,8 @@ Requires ruby 1.9 minimum. Tested with 1.9.2.
12
12
 
13
13
  gem install nbt_utils
14
14
 
15
+ No sudo. You *are* using [rvm](http://rvm.beginrescueend.com/), right?
16
+
15
17
  Use
16
18
  ===
17
19
 
@@ -25,4 +27,4 @@ Copyright
25
27
 
26
28
  Copyright (c) 2010 Michael Dungan, mpd@jesters-court.net, released under the MIT license.
27
29
 
28
- The files `NBT.txt`, `test.nbt`, and `bigtest.nbt` in the `doc` directory are mirred from the Minecraft website.
30
+ The files `NBT.txt`, `test.nbt`, and `bigtest.nbt` in the doc directory are mirrored from the Minecraft website and not covered under the above license.
Binary file
@@ -6,14 +6,13 @@ module NBTUtils
6
6
 
7
7
  def read(path = @path)
8
8
  Zlib::GzipReader.open(path) do |f|
9
- # ostensibly this will always be a single TAG_Compound, per the spec
10
- last_byte = f.read(1).bytes.first
11
- klass = NBTUtils::Tag.tag_type_to_class(last_byte)
12
-
13
- @tag = klass.new(f, true)
9
+ @content = StringIO.new(f.read)
14
10
  end
15
11
 
16
- @tag
12
+ last_byte = @content.read(1).bytes.first
13
+ klass = NBTUtils::Tag.tag_type_to_class(last_byte)
14
+
15
+ @tag = klass.new(@content, true)
17
16
  end
18
17
 
19
18
  def write(path = @path, tag = @tag)
@@ -47,6 +47,10 @@ module NBTUtils
47
47
  NBTUtils::Tag.tag_type_to_class(tag_type)
48
48
  end
49
49
 
50
+ def set_value(new_value, index = nil)
51
+ @payload.value = new_value
52
+ end
53
+
50
54
  module ClassMethods
51
55
  def type_id(new_id = nil)
52
56
  if new_id
@@ -9,8 +9,9 @@ module NBTUtils
9
9
  read_name(io) if named
10
10
 
11
11
  len = ::BinData::Int32be.new.read(io).value
12
- # signedness of the bytes in the array is not defined in the spec.
13
- @payload = ::BinData::Array.new(:type => :uint8, :initial_length => len).read(io)
12
+ # use single string for the payload because an array means each byte is a
13
+ # separate object which is incredibly SLOW
14
+ @payload = ::BinData::String.new(:read_length => len).read(io)
14
15
  end
15
16
 
16
17
  def to_s(indent = 0)
@@ -21,9 +22,15 @@ module NBTUtils
21
22
  result = named ? binary_type_id + name_to_nbt_string : ''
22
23
  len = ::BinData::Int32be.new
23
24
  len.value = @payload.length
24
- result += len.to_binary_s
25
+ result << len.to_binary_s
25
26
  result + @payload.to_binary_s
26
27
  end
28
+
29
+ def set_value(new_value, index)
30
+ b = ::BinData::Uint8.new
31
+ b.value = new_value
32
+ @payload[index] = to_binary_s
33
+ end
27
34
  end
28
35
  end
29
36
  end
@@ -18,11 +18,11 @@ module NBTUtils
18
18
 
19
19
  def to_s(indent = 0)
20
20
  ret = (' ' * indent) + "TAG_Compound#{@name ? "(\"#{@name}\")" : ''}: #{@payload.length} entries\n"
21
- ret += (' ' * indent) + "{\n"
21
+ ret << (' ' * indent) + "{\n"
22
22
  @payload.each do |load|
23
- ret += "#{load.to_s(indent + 2)}\n"
23
+ ret << "#{load.to_s(indent + 2)}\n"
24
24
  end
25
- ret += (' ' * indent) + "}"
25
+ ret << (' ' * indent) + "}"
26
26
 
27
27
  ret
28
28
  end
@@ -38,11 +38,15 @@ module NBTUtils
38
38
  end
39
39
 
40
40
  def find_tag(name)
41
- @payload.detect { |tag| tag.name =~ /#{name}/ }
41
+ if name.kind_of?(Regexp)
42
+ @payload.detect { |tag| tag.name.to_s =~ /#{name}/ }
43
+ else
44
+ @payload.detect { |tag| tag.name.to_s == name }
45
+ end
42
46
  end
43
47
 
44
48
  def find_tags(name)
45
- @payload.select { |tag| tag.name =~ /#{name}/ }
49
+ @payload.select { |tag| tag.name.to_s =~ /#{name}/ }
46
50
  end
47
51
 
48
52
  def add_tag(tag)
@@ -51,6 +55,21 @@ module NBTUtils
51
55
  @tag_names << tag.name
52
56
  @payload << tag
53
57
  end
58
+
59
+ # update one of my tags indirectly
60
+ def update_tag(name, new_value, index = nil)
61
+ tag = find_tag(name)
62
+ tag.set_value(new_value, index)
63
+ end
64
+
65
+ # update one of my tags directly. sort of wonky but here to conform to the api.
66
+ def set_value(new_value, index)
67
+ update_tag(index, new_value)
68
+ end
69
+
70
+ def remove_tag(name)
71
+ @payload.delete find_tag(name)
72
+ end
54
73
  end
55
74
  end
56
75
  end
@@ -19,26 +19,36 @@ module NBTUtils
19
19
 
20
20
  def to_s(indent = 0)
21
21
  ret = (' ' * indent) + "TAG_List#{@name ? "(\"#{@name}\")" : ''}: #{@payload.length} entries of type TAG_#{@tag_type.to_s.split('::').last}\n"
22
- ret += (' ' * indent) + "{\n"
22
+ ret << (' ' * indent) + "{\n"
23
23
  @payload.each do |load|
24
- ret += "#{load.to_s(indent + 2)}\n"
24
+ ret << "#{load.to_s(indent + 2)}\n"
25
25
  end
26
- ret += (' ' * indent) + "}"
26
+ ret << (' ' * indent) + "}"
27
27
  ret
28
28
  end
29
29
 
30
30
  def to_nbt_string(named = true)
31
31
  result = named ? binary_type_id + name_to_nbt_string : ''
32
- type =::BinData::Int8be.new
32
+ type = ::BinData::Int8be.new
33
33
  type.value = @tag_type.type_id
34
- result += type.to_binary_s
34
+ result << type.to_binary_s
35
35
  len = ::BinData::Int32be.new
36
36
  len.value = @payload.length
37
- result += len.to_binary_s
37
+ result << len.to_binary_s
38
38
  @payload.inject(result) do |r, load|
39
39
  r + load.to_nbt_string(false)
40
40
  end
41
41
  end
42
+
43
+ def set_value(new_value, index)
44
+ unless new_value.kind_of?(NBTUtils::Tag)
45
+ t = @tag_type.new
46
+ t.value = new_value
47
+ new_value = t
48
+ end
49
+
50
+ @payload[index] = new_value
51
+ end
42
52
  end
43
53
  end
44
54
  end
@@ -9,5 +9,9 @@ module NBTUtils
9
9
  def value
10
10
  data
11
11
  end
12
+
13
+ def value=(other_value)
14
+ self.data = (other_value)
15
+ end
12
16
  end
13
17
  end
@@ -1,3 +1,3 @@
1
1
  module NBTUtils
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/script.rb CHANGED
@@ -8,24 +8,32 @@ require 'zlib'
8
8
 
9
9
  @compound = nil
10
10
 
11
- file = NBTUtils::File.new('doc/test.nbt')
12
- @compound = file.read
13
-
14
- puts @compound.to_s
11
+ #file = NBTUtils::File.new('doc/test.nbt')
12
+ #@compound = file.read
13
+ #
14
+ #puts @compound.to_s
15
+ #
16
+ #@compound.update_tag('name', 'asdf')
17
+ #puts @compound.to_s
18
+ #
19
+ #@compound.remove_tag('name')
20
+ #puts @compound.to_s
15
21
 
16
22
  #puts @compound.to_nbt_string
17
- #Zlib::GzipWriter.open('lolwut.nbt') do |gz|
18
- # gz.write @compound.to_nbt_string
19
- #end
23
+ #NBTUtils::File.new.write('biglolwut.nbt', @compound)
24
+
25
+ #@compound = NBTUtils::File.new.read('doc/bigtest.nbt')
26
+ #puts @compound.to_s
27
+
20
28
 
21
- @compound = NBTUtils::File.new.read('doc/bigtest.nbt')
29
+ @compound = NBTUtils::File.new.read('doc/test.mclevel')
22
30
  puts @compound.to_s
23
31
 
24
32
  #puts @compound.to_nbt_string
25
- #Zlib::GzipWriter.open('biglolwut.nbt') do |gz|
26
- # gz.write @compound.to_nbt_string
27
- #end
33
+ #NBTUtils::File.new.write('biglolwut.nbt', @compound)
28
34
 
29
- puts @compound.find_tag('Test')
30
- #puts @compound.find_tags(/(?:byte|int)Test/)
31
- #puts @compound.find_tags 'intasdf'
35
+ #p @compound.find_tag(/Test/)
36
+ #p @compound.find_tag('Test')
37
+ #p @compound.find_tag('intTest')
38
+ #p @compound.find_tags(/(?:byte|int)Test/)
39
+ #p @compound.find_tags 'intasdf'
metadata CHANGED
@@ -1,12 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nbt_utils
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 1
9
- version: 0.0.1
4
+ prerelease:
5
+ version: 0.0.2
10
6
  platform: ruby
11
7
  authors:
12
8
  - Michael Dungan
@@ -14,7 +10,7 @@ autorequire:
14
10
  bindir: bin
15
11
  cert_chain: []
16
12
 
17
- date: 2010-09-23 00:00:00 -07:00
13
+ date: 2011-02-26 00:00:00 -08:00
18
14
  default_executable:
19
15
  dependencies:
20
16
  - !ruby/object:Gem::Dependency
@@ -25,9 +21,6 @@ dependencies:
25
21
  requirements:
26
22
  - - ~>
27
23
  - !ruby/object:Gem::Version
28
- segments:
29
- - 1
30
- - 2
31
24
  version: "1.2"
32
25
  type: :runtime
33
26
  version_requirements: *id001
@@ -39,10 +32,6 @@ dependencies:
39
32
  requirements:
40
33
  - - ">="
41
34
  - !ruby/object:Gem::Version
42
- segments:
43
- - 1
44
- - 0
45
- - 0
46
35
  version: 1.0.0
47
36
  type: :development
48
37
  version_requirements: *id002
@@ -63,6 +52,7 @@ files:
63
52
  - Rakefile
64
53
  - doc/NBT.txt
65
54
  - doc/bigtest.nbt
55
+ - doc/test.mclevel
66
56
  - doc/test.nbt
67
57
  - lib/nbt_utils.rb
68
58
  - lib/nbt_utils/file.rb
@@ -97,24 +87,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
97
87
  requirements:
98
88
  - - ~>
99
89
  - !ruby/object:Gem::Version
100
- segments:
101
- - 1
102
- - 9
103
90
  version: "1.9"
104
91
  required_rubygems_version: !ruby/object:Gem::Requirement
105
92
  none: false
106
93
  requirements:
107
94
  - - ">="
108
95
  - !ruby/object:Gem::Version
109
- segments:
110
- - 1
111
- - 3
112
- - 6
113
96
  version: 1.3.6
114
97
  requirements: []
115
98
 
116
99
  rubyforge_project:
117
- rubygems_version: 1.3.7
100
+ rubygems_version: 1.5.0
118
101
  signing_key:
119
102
  specification_version: 3
120
103
  summary: Set of classes to read and write Minecraft .nbt files