View difference between Paste ID: pDVgw3tK and
SHOW:
|
|
- or go back to the newest paste.
1 | - | |
1 | + | ////////////// |
2 | // List Tag // | |
3 | ////////////// | |
4 | ||
5 | // Code omitted | |
6 | ||
7 | void NBT::Tag::List::ClearMismatchedTypes(){ | |
8 | for (std::vector<std::shared_ptr<NBT::Tag::Base> >::iterator i = Value.begin(); i != Value.end();){ | |
9 | if ((*i)->GetType() != Type) | |
10 | i = Value.erase(i); | |
11 | else | |
12 | ++i; | |
13 | } | |
14 | } | |
15 | ||
16 | // Code omitted | |
17 | ||
18 | bool NBT::Tag::List::Load(std::istream &Stream, bool LoadExtra){ | |
19 | // Code omitted | |
20 | int8_t ID = ReadByte(Stream); | |
21 | if (!Stream.good() || ID < 0 || ID > 10) | |
22 | return false; | |
23 | SetTagType(ID); | |
24 | int32_t Length = ReadInt(Stream); | |
25 | if (!Stream.good()) | |
26 | return false; | |
27 | std::vector<std::shared_ptr<NBT::Tag::Base> > NewValue; | |
28 | for (int32_t i = 0; i < Length; i++){ | |
29 | std::shared_ptr<NBT::Tag::Base> NewTag; | |
30 | switch (ID){ | |
31 | case NBT::TagID::Byte:{ | |
32 | NewTag.reset(new NBT::Tag::Byte("", 0)); | |
33 | break; | |
34 | } | |
35 | case NBT::TagID::Short:{ | |
36 | NewTag.reset(new NBT::Tag::Short("", 0)); | |
37 | break; | |
38 | } | |
39 | case NBT::TagID::Int:{ | |
40 | NewTag.reset(new NBT::Tag::Int("", 0)); | |
41 | break; | |
42 | } | |
43 | case NBT::TagID::Long:{ | |
44 | NewTag.reset(new NBT::Tag::Long("", 0)); | |
45 | break; | |
46 | } | |
47 | case NBT::TagID::Float:{ | |
48 | NewTag.reset(new NBT::Tag::Float("", 0)); | |
49 | break; | |
50 | } | |
51 | case NBT::TagID::Double:{ | |
52 | NewTag.reset(new NBT::Tag::Double("", 0)); | |
53 | break; | |
54 | } | |
55 | case NBT::TagID::ByteArray:{ | |
56 | NewTag.reset(new NBT::Tag::ByteArray("", std::vector<int8_t>())); | |
57 | break; | |
58 | } | |
59 | case NBT::TagID::String:{ | |
60 | NewTag.reset(new NBT::Tag::String("", "")); | |
61 | break; | |
62 | } | |
63 | case NBT::TagID::List:{ | |
64 | NewTag.reset(new NBT::Tag::List("", std::vector<std::shared_ptr<NBT::Tag::Base> >())); | |
65 | break; | |
66 | } | |
67 | case NBT::TagID::Compound:{ | |
68 | NewTag.reset(new NBT::Tag::Compound("", std::map<std::string, std::shared_ptr<NBT::Tag::Base> >())); | |
69 | break; | |
70 | } | |
71 | default: | |
72 | break; | |
73 | } | |
74 | if (NewTag.get() == NULL){ | |
75 | NewValue.clear(); | |
76 | return false; | |
77 | } | |
78 | if (!NewTag->Load(Stream, false) || !Stream.good()){ | |
79 | NewTag.reset(); | |
80 | NewValue.clear(); | |
81 | return false; | |
82 | } | |
83 | std::cout << "Pointer: " << NewTag.get() << '\n'; | |
84 | NewValue.push_back(NewTag); | |
85 | } | |
86 | if (!Stream.good()){ | |
87 | NewValue.clear(); | |
88 | return false; | |
89 | } | |
90 | SetValue(NewValue); | |
91 | std::cout << Value.size() << " entries\n"; | |
92 | std::cout << "Pointers:\n"; | |
93 | for (std::vector<std::shared_ptr<NBT::Tag::Base> >::iterator i = Value.begin(); i != Value.end(); i++) | |
94 | std::cout << i->get() << '\n'; | |
95 | std::cout << "}\n"; | |
96 | return true; | |
97 | } | |
98 | ||
99 | // Code omitted | |
100 | ||
101 | void NBT::Tag::List::SetTagType(int8_t NewType){ | |
102 | Type = NewType; | |
103 | ClearMismatchedTypes(); | |
104 | } | |
105 | ||
106 | void NBT::Tag::List::SetValue(std::vector<std::shared_ptr<NBT::Tag::Base> > &NewValue){ | |
107 | Value.clear(); | |
108 | for (std::vector<std::shared_ptr<NBT::Tag::Base> >::iterator i = NewValue.begin(); i != NewValue.end(); i++) | |
109 | Value.push_back(*i); | |
110 | if (Value.size() > 0) | |
111 | SetTagType(Value.front()->GetType()); | |
112 | else | |
113 | SetTagType(-1); | |
114 | } | |
115 | ||
116 | // Code omitted | |
117 | ||
118 | ////////////////// | |
119 | // Compound Tag // | |
120 | ////////////////// | |
121 | ||
122 | // Code omitted | |
123 | ||
124 | bool NBT::Tag::Compound::Load(std::istream &Stream, bool LoadExtra){ | |
125 | // Code omitted | |
126 | std::map<std::string, std::shared_ptr<NBT::Tag::Base> > NewValue; | |
127 | while (true){ | |
128 | std::shared_ptr<NBT::Tag::Base> NewTag; | |
129 | int8_t ID = ReadByte(Stream); | |
130 | if (!Stream.good() || ID < 0 || ID > 10){ | |
131 | NewValue.clear(); | |
132 | return false; | |
133 | } | |
134 | if (ID == 0) | |
135 | break; | |
136 | switch (ID){ | |
137 | case NBT::TagID::Byte:{ | |
138 | NewTag.reset(new NBT::Tag::Byte("", 0)); | |
139 | break; | |
140 | } | |
141 | case NBT::TagID::Short:{ | |
142 | NewTag.reset(new NBT::Tag::Short("", 0)); | |
143 | break; | |
144 | } | |
145 | case NBT::TagID::Int:{ | |
146 | NewTag.reset(new NBT::Tag::Int("", 0)); | |
147 | break; | |
148 | } | |
149 | case NBT::TagID::Long:{ | |
150 | NewTag.reset(new NBT::Tag::Long("", 0)); | |
151 | break; | |
152 | } | |
153 | case NBT::TagID::Float:{ | |
154 | NewTag.reset(new NBT::Tag::Float("", 0)); | |
155 | break; | |
156 | } | |
157 | case NBT::TagID::Double:{ | |
158 | NewTag.reset(new NBT::Tag::Double("", 0)); | |
159 | break; | |
160 | } | |
161 | case NBT::TagID::ByteArray:{ | |
162 | NewTag.reset(new NBT::Tag::ByteArray("", std::vector<int8_t>())); | |
163 | break; | |
164 | } | |
165 | case NBT::TagID::String:{ | |
166 | NewTag.reset(new NBT::Tag::String("", "")); | |
167 | break; | |
168 | } | |
169 | case NBT::TagID::List:{ | |
170 | NewTag.reset(new NBT::Tag::List("", std::vector<std::shared_ptr<NBT::Tag::Base> >())); | |
171 | break; | |
172 | } | |
173 | case NBT::TagID::Compound:{ | |
174 | NewTag.reset(new NBT::Tag::Compound("", std::map<std::string, std::shared_ptr<NBT::Tag::Base> >())); | |
175 | break; | |
176 | } | |
177 | default: | |
178 | break; | |
179 | } | |
180 | if (NewTag.get() == NULL){ | |
181 | NewValue.clear(); | |
182 | return false; | |
183 | } | |
184 | if (!NewTag->Load(Stream, true) || !Stream.good()){ | |
185 | NewTag.reset(); | |
186 | NewValue.clear(); | |
187 | return false; | |
188 | } | |
189 | std::cout << "Pointer: " << NewTag.get() << '\n'; | |
190 | NewValue.insert(std::pair<std::string, std::shared_ptr<NBT::Tag::Base> >(NewTag->GetName(), NewTag)); | |
191 | } | |
192 | if (!Stream.good()){ | |
193 | NewValue.clear(); | |
194 | return false; | |
195 | } | |
196 | SetValue(NewValue); | |
197 | std::cout << Value.size() << " entries\n"; | |
198 | std::cout << "Pointers:\n"; | |
199 | for (std::map<std::string, std::shared_ptr<NBT::Tag::Base> >::iterator i = Value.begin(); i != Value.end(); i++) | |
200 | std::cout << i->second.get() << '\n'; | |
201 | std::cout << "}\n"; | |
202 | return true; | |
203 | } | |
204 | ||
205 | // Code omitted | |
206 | ||
207 | void NBT::Tag::Compound::SetValue(std::map<std::string, std::shared_ptr<NBT::Tag::Base> > &NewValue){ | |
208 | Value.clear(); | |
209 | Value = NewValue; | |
210 | } | |
211 | ||
212 | // Code omitted |