Botcraft 1.21.4
Loading...
Searching...
No Matches
Recipe.cpp
Go to the documentation of this file.
1#if PROTOCOL_VERSION > 347 /* > 1.12.2 */ && PROTOCOL_VERSION < 768 /* < 1.21.2 */
4
9#if PROTOCOL_VERSION > 453 /* > 1.13.2 */
11#endif
12#if PROTOCOL_VERSION > 732 /* > 1.15.2 */ && PROTOCOL_VERSION < 763 /* < 1.20 */
14#endif
15#if PROTOCOL_VERSION > 761 /* > 1.19.3 */
18#endif
20
21namespace ProtocolCraft
22{
23 DEFINE_NETWORK_TYPE(RecipeDataCraftingShaped);
24 DEFINE_NETWORK_TYPE(RecipeDataCraftingShapeless);
25 DEFINE_NETWORK_TYPE(RecipeDataSimpleCooking);
26 DEFINE_NETWORK_TYPE(RecipeDataSimpleCrafting);
27#if PROTOCOL_VERSION > 453 /* > 1.13.2 */
28 DEFINE_NETWORK_TYPE(RecipeDataSingleItem);
29#endif
30#if PROTOCOL_VERSION > 732 /* > 1.15.2 */ && PROTOCOL_VERSION < 763 /* < 1.20 */
31 DEFINE_NETWORK_TYPE(RecipeDataSmithing);
32#endif
33#if PROTOCOL_VERSION > 761 /* > 1.19.3 */
34 DEFINE_NETWORK_TYPE(RecipeDataSmithingTransform);
35 DEFINE_NETWORK_TYPE(RecipeDataSmithingTrim);
36#endif
37
38 Recipe::~Recipe()
39 {
40
41 }
42
43#if PROTOCOL_VERSION < 766 /* < 1.20.5 */
44 Recipe& Recipe::SetType(const Identifier& Type_)
45 {
46 Type = Type_;
47 const std::string full = Type.GetFull();
48
49 if (full == "minecraft:crafting_shapeless")
50 {
51 Data = std::make_shared<RecipeDataCraftingShapeless>();
52 }
53 else if (full == "minecraft:crafting_shaped")
54 {
55 Data = std::make_shared<RecipeDataCraftingShaped>();
56 }
57 else if (full == "minecraft:smelting")
58 {
59 Data = std::make_shared<RecipeDataSimpleCooking>();
60 }
61#if PROTOCOL_VERSION > 452 /* > 1.13.2 */
62 else if (full == "minecraft:blasting")
63 {
64 Data = std::make_shared<RecipeDataSimpleCooking>();
65 }
66 else if (full == "minecraft:smoking")
67 {
68 Data = std::make_shared<RecipeDataSimpleCooking>();
69 }
70 else if (full == "minecraft:campfire_cooking")
71 {
72 Data = std::make_shared<RecipeDataSimpleCooking>();
73 }
74 else if (full == "minecraft:stonecutting")
75 {
76 Data = std::make_shared<RecipeDataSingleItem>();
77 }
78#endif
79#if PROTOCOL_VERSION > 732 /* > 1.15.2 */ && PROTOCOL_VERSION < 763 /* < 1.20 */
80 else if (full == "minecraft:smithing")
81 {
82 Data = std::make_shared<RecipeDataSmithing>();
83 }
84#endif
85#if PROTOCOL_VERSION > 761 /* > 1.19.3 */
86 else if (full == "minecraft:smithing_transform")
87 {
88 Data = std::make_shared<RecipeDataSmithingTransform>();
89 }
90 else if (full == "minecraft:smithing_trim")
91 {
92 Data = std::make_shared<RecipeDataSmithingTrim>();
93 }
94#endif
95 else
96 {
97 Data = std::make_shared<RecipeDataSimpleCrafting>();
98 }
99 return *this;
100 }
101#else
102 Recipe& Recipe::SetType(const RecipeDataType Type_)
103 {
104 if (Type_ <= RecipeDataType::None || Type_ >= RecipeDataType::NUM_RECIPE_DATA_TYPES)
105 {
106 throw std::runtime_error("Unable to create recipe with id: " + std::to_string(static_cast<int>(Type_)) + ".");
107 }
108 Type = Type_;
109
110 switch (Type_)
111 {
112 case RecipeDataType::CraftingShaped:
113 Data = std::make_shared<RecipeDataCraftingShaped>();
114 break;
115 case RecipeDataType::CraftingShapeless:
116 Data = std::make_shared<RecipeDataCraftingShapeless>();
117 break;
118 case RecipeDataType::Smelting:
119 case RecipeDataType::Blasting:
120 case RecipeDataType::Smoking:
121 case RecipeDataType::CampfireCooking:
122 Data = std::make_shared<RecipeDataSimpleCooking>();
123 break;
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>();
139 break;
140 case RecipeDataType::Stonecutting:
141 Data = std::make_shared<RecipeDataSingleItem>();
142 break;
143 case RecipeDataType::SmithingTransform:
144 Data = std::make_shared<RecipeDataSmithingTransform>();
145 break;
146 case RecipeDataType::SmithingTrim:
147 Data = std::make_shared<RecipeDataSmithingTrim>();
148 break;
149 default:
150 // This should not happen
151 throw std::runtime_error("Unable to create recipe with id: " + std::to_string(static_cast<int>(Type_)) + ".");
152 Data = nullptr;
153 break;
154 }
155 return *this;
156 }
157#endif
158
159
160
161#if PROTOCOL_VERSION > 765 /* > 1.20.4 */
162 std::string_view Recipe::GetName() const
163 {
164 static constexpr std::array<std::string_view, static_cast<size_t>(RecipeDataType::NUM_RECIPE_DATA_TYPES)> recipe_names = {
165 "crafting_shaped",
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",
180 "smelting",
181 "blasting",
182 "smoking",
183 "campfire_cooking",
184 "stonecutting",
185 "smithing_transform",
186 "smithing_trim",
187 "crafting_decorated_pot",
188 };
189 if (GetType() <= RecipeDataType::None || GetType() >= RecipeDataType::NUM_RECIPE_DATA_TYPES)
190 {
191 return "";
192 }
193 return recipe_names[static_cast<size_t>(GetType())];
194 }
195#endif
196
197 void Recipe::ReadImpl(ReadIterator& iter, size_t& length)
198 {
199#if PROTOCOL_VERSION < 453 /* < 1.14 */
200 SetRecipeId(ReadData<Identifier>(iter, length));
201 SetType(ReadData<Identifier>(iter, length));
202#elif PROTOCOL_VERSION < 766 /* < 1.20.5 */
203 SetType(ReadData<Identifier>(iter, length));
204 SetRecipeId(ReadData<Identifier>(iter, length));
205#else
206 SetRecipeId(ReadData<Identifier>(iter, length));
207 SetType(ReadData<RecipeDataType, VarInt>(iter, length));
208#endif
209 if (GetData() != nullptr)
210 {
211 GetData()->Read(iter, length);
212 }
213 }
214
215 void Recipe::WriteImpl(WriteContainer& container) const
216 {
217#if PROTOCOL_VERSION < 453 /* < 1.14 */
218 WriteData<Identifier>(GetRecipeId(), container);
219 WriteData<Identifier>(GetType(), container);
220#elif PROTOCOL_VERSION < 766 /* < 1.20.5 */
221 WriteData<Identifier>(GetType(), container);
222 WriteData<Identifier>(GetRecipeId(), container);
223#else
224 WriteData<Identifier>(GetRecipeId(), container);
225 WriteData<RecipeDataType, VarInt>(GetType(), container);
226#endif
227 if (GetData() != nullptr)
228 {
229 GetData()->Write(container);
230 }
231 }
232
233 Json::Value Recipe::SerializeImpl() const
234 {
235 Json::Value output;
236
237 output[std::string(field_name<RecipeId_index>)] = GetRecipeId();
238#if PROTOCOL_VERSION < 766 /* < 1.20.5 */
239 output[std::string(field_name<Type_index>)] = GetType().GetFull();
240#else
241 output[std::string(field_name<Type_index>)] = GetName();
242#endif
243 output[std::string(field_name<Data_index>)] = GetData() == nullptr ? Json::Object() : GetData()->Serialize();
244
245 return output;
246 }
247}
248#endif
#define DEFINE_NETWORK_TYPE(ClassName)
std::vector< unsigned char > WriteContainer
std::vector< unsigned char >::const_iterator ReadIterator