1#if PROTOCOL_VERSION > 347 && PROTOCOL_VERSION < 768
9#if PROTOCOL_VERSION > 453
12#if PROTOCOL_VERSION > 732 && PROTOCOL_VERSION < 763
15#if PROTOCOL_VERSION > 761
27#if PROTOCOL_VERSION > 453
30#if PROTOCOL_VERSION > 732 && PROTOCOL_VERSION < 763
33#if PROTOCOL_VERSION > 761
43#if PROTOCOL_VERSION < 766
44 Recipe& Recipe::SetType(
const Identifier& Type_)
47 const std::string full = Type.GetFull();
49 if (full ==
"minecraft:crafting_shapeless")
51 Data = std::make_shared<RecipeDataCraftingShapeless>();
53 else if (full ==
"minecraft:crafting_shaped")
55 Data = std::make_shared<RecipeDataCraftingShaped>();
57 else if (full ==
"minecraft:smelting")
59 Data = std::make_shared<RecipeDataSimpleCooking>();
61#if PROTOCOL_VERSION > 452
62 else if (full ==
"minecraft:blasting")
64 Data = std::make_shared<RecipeDataSimpleCooking>();
66 else if (full ==
"minecraft:smoking")
68 Data = std::make_shared<RecipeDataSimpleCooking>();
70 else if (full ==
"minecraft:campfire_cooking")
72 Data = std::make_shared<RecipeDataSimpleCooking>();
74 else if (full ==
"minecraft:stonecutting")
76 Data = std::make_shared<RecipeDataSingleItem>();
79#if PROTOCOL_VERSION > 732 && PROTOCOL_VERSION < 763
80 else if (full ==
"minecraft:smithing")
82 Data = std::make_shared<RecipeDataSmithing>();
85#if PROTOCOL_VERSION > 761
86 else if (full ==
"minecraft:smithing_transform")
88 Data = std::make_shared<RecipeDataSmithingTransform>();
90 else if (full ==
"minecraft:smithing_trim")
92 Data = std::make_shared<RecipeDataSmithingTrim>();
97 Data = std::make_shared<RecipeDataSimpleCrafting>();
102 Recipe& Recipe::SetType(
const RecipeDataType Type_)
104 if (Type_ <= RecipeDataType::None || Type_ >= RecipeDataType::NUM_RECIPE_DATA_TYPES)
106 throw std::runtime_error(
"Unable to create recipe with id: " + std::to_string(
static_cast<int>(Type_)) +
".");
112 case RecipeDataType::CraftingShaped:
113 Data = std::make_shared<RecipeDataCraftingShaped>();
115 case RecipeDataType::CraftingShapeless:
116 Data = std::make_shared<RecipeDataCraftingShapeless>();
118 case RecipeDataType::Smelting:
119 case RecipeDataType::Blasting:
120 case RecipeDataType::Smoking:
121 case RecipeDataType::CampfireCooking:
122 Data = std::make_shared<RecipeDataSimpleCooking>();
124 case RecipeDataType::CraftingSpecialArmordye:
125 case RecipeDataType::CraftingSpecialBookcloning:
126 case RecipeDataType::CraftingSpecialMapcloning:
127 case RecipeDataType::CraftingSpecialMapextending:
128 case RecipeDataType::CraftingSpecialFireworkRocket:
129 case RecipeDataType::CraftingSpecialFireworkStar:
130 case RecipeDataType::CraftingSpecialFireworkStarFade:
131 case RecipeDataType::CraftingSpecialTippedarrow:
132 case RecipeDataType::CraftingSpecialBannerduplicate:
133 case RecipeDataType::CraftingSpecialShielddecoration:
134 case RecipeDataType::CraftingSpecialShulkerboxcoloring:
135 case RecipeDataType::CraftingSpecialSuspiciousstew:
136 case RecipeDataType::CraftingSpecialRepairitem:
137 case RecipeDataType::CraftingDecoratedPot:
138 Data = std::make_shared<RecipeDataSimpleCrafting>();
140 case RecipeDataType::Stonecutting:
141 Data = std::make_shared<RecipeDataSingleItem>();
143 case RecipeDataType::SmithingTransform:
144 Data = std::make_shared<RecipeDataSmithingTransform>();
146 case RecipeDataType::SmithingTrim:
147 Data = std::make_shared<RecipeDataSmithingTrim>();
151 throw std::runtime_error(
"Unable to create recipe with id: " + std::to_string(
static_cast<int>(Type_)) +
".");
161#if PROTOCOL_VERSION > 765
162 std::string_view Recipe::GetName()
const
164 static constexpr std::array<std::string_view, static_cast<size_t>(RecipeDataType::NUM_RECIPE_DATA_TYPES)> recipe_names = {
166 "crafting_shapeless",
167 "crafting_special_armordye",
168 "crafting_special_bookcloning",
169 "crafting_special_mapcloning",
170 "crafting_special_mapextending",
171 "crafting_special_firework_rocket",
172 "crafting_special_firework_star",
173 "crafting_special_firework_star_fade",
174 "crafting_special_tippedarrow",
175 "crafting_special_bannerduplicate",
176 "crafting_special_shielddecoration",
177 "crafting_special_shulkerboxcoloring",
178 "crafting_special_suspiciousstew",
179 "crafting_special_repairitem",
185 "smithing_transform",
187 "crafting_decorated_pot",
189 if (GetType() <= RecipeDataType::None || GetType() >= RecipeDataType::NUM_RECIPE_DATA_TYPES)
193 return recipe_names[
static_cast<size_t>(GetType())];
197 void Recipe::ReadImpl(
ReadIterator& iter,
size_t& length)
199#if PROTOCOL_VERSION < 453
200 SetRecipeId(ReadData<Identifier>(iter, length));
201 SetType(ReadData<Identifier>(iter, length));
202#elif PROTOCOL_VERSION < 766
203 SetType(ReadData<Identifier>(iter, length));
204 SetRecipeId(ReadData<Identifier>(iter, length));
206 SetRecipeId(ReadData<Identifier>(iter, length));
207 SetType(ReadData<RecipeDataType, VarInt>(iter, length));
209 if (GetData() !=
nullptr)
211 GetData()->Read(iter, length);
217#if PROTOCOL_VERSION < 453
218 WriteData<Identifier>(GetRecipeId(), container);
219 WriteData<Identifier>(GetType(), container);
220#elif PROTOCOL_VERSION < 766
221 WriteData<Identifier>(GetType(), container);
222 WriteData<Identifier>(GetRecipeId(), container);
224 WriteData<Identifier>(GetRecipeId(), container);
225 WriteData<RecipeDataType, VarInt>(GetType(), container);
227 if (GetData() !=
nullptr)
229 GetData()->Write(container);
233 Json::Value Recipe::SerializeImpl()
const
237 output[std::string(field_name<RecipeId_index>)] = GetRecipeId();
238#if PROTOCOL_VERSION < 766
239 output[std::string(field_name<Type_index>)] = GetType().GetFull();
241 output[std::string(field_name<Type_index>)] = GetName();
243 output[std::string(field_name<Data_index>)] = GetData() ==
nullptr ? Json::Object() : GetData()->Serialize();
#define DEFINE_NETWORK_TYPE(ClassName)
std::vector< unsigned char > WriteContainer
std::vector< unsigned char >::const_iterator ReadIterator