Botcraft 1.21.4
Loading...
Searching...
No Matches
DataComponents.cpp
Go to the documentation of this file.
1#if PROTOCOL_VERSION > 765 /* > 1.20.4 */
4
43#if PROTOCOL_VERSION > 766 /* > 1.20.6 */
45#endif
46#if PROTOCOL_VERSION > 767 /* > 1.21.1 */
53#endif
54
56
57namespace ProtocolCraft
58{
59 namespace Components
60 {
74
113#if PROTOCOL_VERSION > 766 /* > 1.20.6 */
115#endif
116#if PROTOCOL_VERSION > 767 /* > 1.21.1 */
123#endif
124
126 {
127 static constexpr std::array<std::string_view, static_cast<size_t>(DataComponentTypes::NUM_DATA_COMPONENT_TYPES)> names = {
128 "custom_data",
129 "max_stack_size",
130 "max_damage",
131 "damage",
132 "unbreakable",
133 "custom_name",
134 "item_name",
135#if PROTOCOL_VERSION > 767 /* > 1.21.1 */
136 "item_model",
137#endif
138 "lore",
139 "rarity",
140 "enchantments",
141 "can_place_on",
142 "can_break",
143 "attribute_modifiers",
144 "custom_model_data",
145 "hide_additional_tooltip",
146 "hide_tooltip",
147 "repair_cost",
148 "creative_slot_lock",
149 "enchantment_glint_override",
150 "intangible_projectile",
151 "food",
152#if PROTOCOL_VERSION < 768 /* < 1.21.2 */
153 "fire_resistant",
154#endif
155#if PROTOCOL_VERSION > 767 /* > 1.21.1 */
156 "consumable",
157 "use_remainder",
158 "use_cooldown",
159 "damage_resistant",
160#endif
161 "tool",
162#if PROTOCOL_VERSION > 767 /* > 1.21.1 */
163 "enchantable",
164 "equippable",
165 "repairable",
166 "glider",
167 "tooltip_style",
168 "death_protection",
169#endif
170 "stored_enchantments",
171 "dyed_color",
172 "map_color",
173 "map_id",
174 "map_decorations",
175 "map_post_processing",
176 "charged_projectiles",
177 "bundle_contents",
178 "potion_contents",
179 "suspicious_stew_effects",
180 "writable_book_content",
181 "written_book_content",
182 "trim",
183 "debug_stick_state",
184 "entity_data",
185 "bucket_entity_data",
186 "block_entity_data",
187 "instrument",
188 "ominous_bottle_amplifier",
189#if PROTOCOL_VERSION > 766 /* > 1.20.6 */
190 "jukebox_playable",
191#endif
192 "recipes",
193 "lodestone_tracker",
194 "firework_explosion",
195 "fireworks",
196 "profile",
197 "note_block_sound",
198 "banner_patterns",
199 "base_color",
200 "pot_decorations",
201 "container",
202 "block_state",
203 "bees",
204 "lock",
205 "container_loot",
206 };
207 if (type <= DataComponentTypes::None || type >= DataComponentTypes::NUM_DATA_COMPONENT_TYPES)
208 {
209 return "";
210 }
211 return names[static_cast<size_t>(type)];
212 }
213
214 std::shared_ptr<DataComponentType> CreateComponentType(const DataComponentTypes type)
215 {
216 if (type <= DataComponentTypes::None || type >= DataComponentTypes::NUM_DATA_COMPONENT_TYPES)
217 {
218 throw std::runtime_error("Unable to create data component with id: " + std::to_string(static_cast<int>(type)) + ".");
219 }
220
221 switch (type)
222 {
225 return std::make_shared<DataComponentTypeAdventureModePredicate>();
227 return std::make_shared<DataComponentTypeArmorTrim>();
229 return std::make_shared<DataComponentTypeBannerPatternLayers>();
231 return std::make_shared<DataComponentTypeBlockItemStateProperties>();
233 return std::make_shared<DataComponentTypeBoolean>();
235 return std::make_shared<DataComponentTypeBundleContents>();
237 return std::make_shared<DataComponentTypeChargedProjectiles>();
240 return std::make_shared<DataComponentTypeComponent>();
244 return std::make_shared<DataComponentTypeCustomData>();
246 return std::make_shared<DataComponentTypeCustomModelData>();
254#if PROTOCOL_VERSION > 767 /* > 1.21.1 */
256#endif
257 // Component with no network serializer specified fallback to NBT
258 return std::make_shared<DataComponentTypeDefault>();
260 return std::make_shared<DataComponentTypeDyeColor>();
262 return std::make_shared<DataComponentTypeDyedItemColor>();
264 return std::make_shared<DataComponentTypeFireworkExplosion>();
266 return std::make_shared<DataComponentTypeFireworks>();
268 return std::make_shared<DataComponentTypeFoodProperties>();
270 return std::make_shared<DataComponentTypeHolderInstrument>();
276#if PROTOCOL_VERSION > 767 /* > 1.21.1 */
278#endif
279 return std::make_shared<DataComponentTypeInteger>();
281 return std::make_shared<DataComponentTypeItemAttributeModifiers>();
283 return std::make_shared<DataComponentTypeItemContainerContents>();
286 return std::make_shared<DataComponentTypeItemEnchantments>();
288 return std::make_shared<DataComponentTypeItemLore>();
289#if PROTOCOL_VERSION > 766 /* > 1.20.6 */
291 return std::make_shared<DataComponentTypeJukeboxPlayable>();
292#endif
294 return std::make_shared<DataComponentTypeListBeehiveBlockEntityOccupant>();
296 return std::make_shared<DataComponentTypeLodestoneTracker>();
298 return std::make_shared<DataComponentTypeMapId>();
300 return std::make_shared<DataComponentTypeMapItemColor>();
302 return std::make_shared<DataComponentTypeMapPostProcessing>();
304 return std::make_shared<DataComponentTypePotDecorations>();
306 return std::make_shared<DataComponentTypePotionContents>();
308 return std::make_shared<DataComponentTypeRarity>();
310 return std::make_shared<DataComponentTypeResolvableProfile>();
312#if PROTOCOL_VERSION > 767 /* > 1.21.1 */
316#endif
317 return std::make_shared<DataComponentTypeResourceLocation>();
319 return std::make_shared<DataComponentTypeSuspiciousStewEffects>();
321 return std::make_shared<DataComponentTypeTool>();
323 return std::make_shared<DataComponentTypeUnbreakable>();
327#if PROTOCOL_VERSION < 768 /* < 1.21.2 */
328 case DataComponentTypes::FireResistant:
329#endif
330 return std::make_shared<DataComponentTypeUnit>();
332 return std::make_shared<DataComponentTypeWritableBookContent>();
334 return std::make_shared<DataComponentTypeWrittenBookContent>();
335#if PROTOCOL_VERSION > 767 /* > 1.21.1 */
337 return std::make_shared<DataComponentTypeConsumable>();
339 return std::make_shared<DataComponentTypeDeathProtection>();
341 return std::make_shared<DataComponentTypeEquippable>();
343 return std::make_shared<DataComponentTypeRepairable>();
345 return std::make_shared<DataComponentTypeUseCooldown>();
347 return std::make_shared<DataComponentTypeUseRemainder>();
348#endif
349 default:
350 // Should never happen but will make the compilers happy
351 throw std::runtime_error("Unable to create data component with id: " + std::to_string(static_cast<int>(type)) + ".");
352 }
353 }
354
359
360 const std::map<DataComponentTypes, std::shared_ptr<DataComponentType>>& DataComponentPredicate::GetMap() const
361 {
362 return map;
363 }
364
365 DataComponentPredicate& DataComponentPredicate::SetMap(const std::map<DataComponentTypes, std::shared_ptr<DataComponentType>>& map_)
366 {
367 map = map_;
368 return *this;
369 }
370
372 {
373 // special case, dynamic factory
374 const int map_size = ReadData<VarInt>(iter, length);
375 map.clear();
376 for (int i = 0; i < map_size; ++i)
377 {
378 const DataComponentTypes k = ReadData<DataComponentTypes, VarInt>(iter, length);
379 std::shared_ptr<DataComponentType> v = CreateComponentType(k);
380 if (v != nullptr)
381 {
382 v->Read(iter, length);
383 }
384 map[k] = v;
385 }
386 }
387
389 {
390 // special case, dynamic factory
391 WriteData<VarInt>(static_cast<int>(map.size()), container);
392 for (const auto& [k, v] : map)
393 {
394 WriteData<DataComponentTypes, VarInt>(k, container);
395 if (v != nullptr)
396 {
397 v->Write(container);
398 }
399 }
400 }
401
403 {
404 Json::Value output;
405
406 output["map"] = Json::Array();
407 for (const auto& p : map)
408 {
409 output["map"].push_back({
410 { "name", DataComponentTypesToString(p.first) },
411 { "data", p.second == nullptr ? nullptr : p.second->Serialize() }
412 });
413 }
414
415 return output;
416 }
417
418
423
424 const std::map<DataComponentTypes, std::shared_ptr<DataComponentType>>& DataComponentPatch::GetMap() const
425 {
426 return map;
427 }
428
429 DataComponentPatch& DataComponentPatch::SetMap(const std::map<DataComponentTypes, std::shared_ptr<DataComponentType>>& map_)
430 {
431 map = map_;
432 return *this;
433 }
434
435 void DataComponentPatch::ReadImpl(ReadIterator& iter, size_t& length)
436 {
437 const int num_data = ReadData<VarInt>(iter, length);
438 const int num_void = ReadData<VarInt>(iter, length);
439
440 map.clear();
441
442 for (int i = 0; i < num_data; ++i)
443 {
444 const DataComponentTypes type = ReadData<DataComponentTypes, VarInt>(iter, length);
445 std::shared_ptr<DataComponentType> data = CreateComponentType(type);
446
447 if (data != nullptr)
448 {
449 data->Read(iter, length);
450 }
451 map.insert({ type, data });
452 }
453
454 for (int i = 0; i < num_void; ++i)
455 {
456 const DataComponentTypes type = ReadData<DataComponentTypes, VarInt>(iter, length);
457 map.insert({ type, nullptr });
458 }
459 }
460
462 {
463 int num_data = 0;
464 for (const auto& p : map)
465 {
466 num_data += p.second != nullptr;
467 }
468 const int num_void = static_cast<int>(map.size()) - num_data;
469
470 WriteData<VarInt>(num_data, container);
471 WriteData<VarInt>(num_void, container);
472
473 for (const auto& p : map)
474 {
475 if (p.second == nullptr)
476 {
477 continue;
478 }
479 WriteData<DataComponentTypes, VarInt>(p.first, container);
480 p.second->Write(container);
481 }
482
483 for (const auto& p : map)
484 {
485 if (p.second != nullptr)
486 {
487 continue;
488 }
489 WriteData<DataComponentTypes, VarInt>(p.first, container);
490 }
491 }
492
494 {
495 Json::Value output;
496
497 output["map"] = Json::Array();
498 for (const auto& p : map)
499 {
500 output["map"].push_back({
501 { "name", DataComponentTypesToString(p.first) },
502 { "data", p.second == nullptr ? nullptr : p.second->Serialize() }
503 });
504 }
505
506 return output;
507 }
508 }
509}
510#endif
#define DEFINE_NETWORK_TYPE(ClassName)
virtual Json::Value SerializeImpl() const override
std::map< DataComponentTypes, std::shared_ptr< DataComponentType > > map
const std::map< DataComponentTypes, std::shared_ptr< DataComponentType > > & GetMap() const
virtual void ReadImpl(ReadIterator &iter, size_t &length) override
DataComponentPatch & SetMap(const std::map< DataComponentTypes, std::shared_ptr< DataComponentType > > &map_)
virtual void WriteImpl(WriteContainer &container) const override
virtual void WriteImpl(WriteContainer &container) const override
std::map< DataComponentTypes, std::shared_ptr< DataComponentType > > map
virtual Json::Value SerializeImpl() const override
virtual void ReadImpl(ReadIterator &iter, size_t &length) override
const std::map< DataComponentTypes, std::shared_ptr< DataComponentType > > & GetMap() const
DataComponentPredicate & SetMap(const std::map< DataComponentTypes, std::shared_ptr< DataComponentType > > &map_)
Real class declaration, just a derived class of std::vector<Value>
Definition Json.hpp:180
Main class, basically a JsonVariant with extra utility functions it doesn't inherit JsonVariant direc...
Definition Json.hpp:45
void push_back(const Value &value)
Definition Json.cpp:257
std::shared_ptr< DataComponentType > CreateComponentType(const DataComponentTypes type)
std::string_view DataComponentTypesToString(const DataComponentTypes type)
std::vector< unsigned char > WriteContainer
std::vector< unsigned char >::const_iterator ReadIterator