Botcraft 1.21.4
Loading...
Searching...
No Matches
AreaEffectCloudEntity.cpp
Go to the documentation of this file.
2
3#if PROTOCOL_VERSION > 765 /* > 1.20.4 */
5#endif
6
7#include <mutex>
8
9namespace Botcraft
10{
11 const std::array<std::string, AreaEffectCloudEntity::metadata_count> AreaEffectCloudEntity::metadata_names{ {
12 "data_radius",
13 "data_color",
14 "data_waiting",
15#if PROTOCOL_VERSION < 766 /* < 1.20.5 */
16 "data_particle",
17#endif
18#if PROTOCOL_VERSION < 341 /* < 1.13 */
19 "data_particle_argument1",
20 "data_particle_argument2",
21#endif
22 } };
23
25 {
26 // Initialize all metadata with default values
27#if PROTOCOL_VERSION < 761 /* < 1.19.3 */
28 SetDataRadius(0.5f);
29#else
30 SetDataRadius(3.0f);
31#endif
32#if PROTOCOL_VERSION < 766 /* < 1.20.5 */
33 SetDataColor(0);
34#endif
35 SetDataWaiting(false);
36#if PROTOCOL_VERSION > 340 /* > 1.12.2 */
39#if PROTOCOL_VERSION > 765 /* > 1.20.4 */
40 std::dynamic_pointer_cast<ProtocolCraft::ColorParticleOptions>(particle.GetOptions())->SetColor(-1);
41#endif
42 SetDataParticle(particle);
43#else
44 SetDataParticle(std::optional<int>());
45 SetDataParticleArgument1(0);
46 SetDataParticleArgument2(0);
47#endif
48 }
49
54
55
57 {
58 return "area_effect_cloud";
59 }
60
65
66
68 {
69 return "area_effect_cloud";
70 }
71
76
77
79 {
81
82 output["metadata"]["data_radius"] = GetDataRadius();
83#if PROTOCOL_VERSION < 766 /* < 1.20.5 */
84 output["metadata"]["data_color"] = GetDataColor();
85#endif
86 output["metadata"]["data_waiting"] = GetDataWaiting();
87#if PROTOCOL_VERSION > 340 /* > 1.12.2 */
88 output["metadata"]["data_particle"] = GetDataParticle() ? ProtocolCraft::Json::Value({ {"particle_type", GetDataParticle()->GetName() }, {"particle_data", GetDataParticle()->Serialize()} }) : ProtocolCraft::Json::Value();
89#else
90 output["metadata"]["data_particle"] = GetDataParticle() ? ProtocolCraft::Json::Value(GetDataParticle().value()) : ProtocolCraft::Json::Value();
91#endif
92 return output;
93 }
94
95
96 void AreaEffectCloudEntity::SetMetadataValue(const int index, const std::any& value)
97 {
98 if (index < hierarchy_metadata_count)
99 {
100 Entity::SetMetadataValue(index, value);
101 }
102 else if (index - hierarchy_metadata_count < metadata_count)
103 {
104 std::scoped_lock<std::shared_mutex> lock(entity_mutex);
105 const std::string& metadata_name = metadata_names[index - hierarchy_metadata_count];
106 metadata[metadata_name] = value;
107#if USE_GUI
108 if (metadata_name == "data_radius")
109 {
111 }
112#endif
113 }
114 }
115
117 {
118 std::shared_lock<std::shared_mutex> lock(entity_mutex);
119 return GetDataRadiusImpl();
120 }
121
122#if PROTOCOL_VERSION < 766 /* < 1.20.5 */
123 int AreaEffectCloudEntity::GetDataColor() const
124 {
125 std::shared_lock<std::shared_mutex> lock(entity_mutex);
126 return std::any_cast<int>(metadata.at("data_color"));
127 }
128#endif
129
131 {
132 std::shared_lock<std::shared_mutex> lock(entity_mutex);
133 return std::any_cast<bool>(metadata.at("data_waiting"));
134 }
135
136#if PROTOCOL_VERSION > 340 /* > 1.12.2 */
137 std::shared_ptr<ProtocolCraft::Particle> AreaEffectCloudEntity::GetDataParticle() const
138 {
139 std::shared_lock<std::shared_mutex> lock(entity_mutex);
140 return std::any_cast<std::shared_ptr<ProtocolCraft::Particle>>(metadata.at("data_particle"));
141 }
142#else
143 std::optional<int> AreaEffectCloudEntity::GetDataParticle() const
144 {
145 std::shared_lock<std::shared_mutex> lock(entity_mutex);
146 return std::any_cast<std::optional<int>>(metadata.at("data_particle"));
147 }
148
149 int AreaEffectCloudEntity::GetDataParticleArgument1() const
150 {
151 std::shared_lock<std::shared_mutex> lock(entity_mutex);
152 return std::any_cast<int>(metadata.at("data_particle_argument1"));
153 }
154
155 int AreaEffectCloudEntity::GetDataParticleArgument2() const
156 {
157 std::shared_lock<std::shared_mutex> lock(entity_mutex);
158 return std::any_cast<int>(metadata.at("data_particle_argument2"));
159 }
160#endif
161
162
163 void AreaEffectCloudEntity::SetDataRadius(const float data_radius)
164 {
165 std::scoped_lock<std::shared_mutex> lock(entity_mutex);
166 metadata["data_radius"] = data_radius;
167#if USE_GUI
169#endif
170 }
171
172#if PROTOCOL_VERSION < 766 /* < 1.20.5 */
173 void AreaEffectCloudEntity::SetDataColor(const int data_color)
174 {
175 std::scoped_lock<std::shared_mutex> lock(entity_mutex);
176 metadata["data_color"] = data_color;
177 }
178#endif
179
180 void AreaEffectCloudEntity::SetDataWaiting(const bool data_waiting)
181 {
182 std::scoped_lock<std::shared_mutex> lock(entity_mutex);
183 metadata["data_waiting"] = data_waiting;
184 }
185
186#if PROTOCOL_VERSION > 340 /* > 1.12.2 */
188 {
189 std::scoped_lock<std::shared_mutex> lock(entity_mutex);
190 metadata["data_particle"] = data_particle;
191 }
192#else
193 void AreaEffectCloudEntity::SetDataParticle(const std::optional<int>& data_particle)
194 {
195 std::scoped_lock<std::shared_mutex> lock(entity_mutex);
196 metadata["data_particle"] = data_particle;
197 }
198
199 void AreaEffectCloudEntity::SetDataParticleArgument1(const int data_particle_argument1)
200 {
201 std::scoped_lock<std::shared_mutex> lock(entity_mutex);
202 metadata["data_particle_argument1"] = data_particle_argument1;
203 }
204
205 void AreaEffectCloudEntity::SetDataParticleArgument2(const int data_particle_argument2)
206 {
207 std::scoped_lock<std::shared_mutex> lock(entity_mutex);
208 metadata["data_particle_argument2"] = data_particle_argument2;
209 }
210#endif
211
212
214 {
215 return std::any_cast<float>(metadata.at("data_radius"));
216 }
217
219 {
220 return std::any_cast<float>(metadata.at("data_radius")) * 2.0;
221 }
222
224 {
225 return 0.5;
226 }
227}
std::shared_ptr< ProtocolCraft::Particle > GetDataParticle() const
void SetDataRadius(const float data_radius)
void SetDataWaiting(const bool data_waiting)
virtual EntityType GetType() const override
virtual void SetMetadataValue(const int index, const std::any &value) override
virtual double GetWidthImpl() const override
void SetDataParticle(const ProtocolCraft::Particle &data_particle)
virtual ProtocolCraft::Json::Value Serialize() const override
virtual double GetHeightImpl() const override
virtual std::string GetName() const override
static const std::array< std::string, metadata_count > metadata_names
void OnSizeUpdated()
Definition Entity.cpp:1936
virtual ProtocolCraft::Json::Value Serialize() const
Definition Entity.cpp:1095
virtual void SetMetadataValue(const int index, const std::any &value)
Definition Entity.cpp:622
std::shared_mutex entity_mutex
Definition Entity.hpp:253
std::map< std::string, std::any > metadata
Definition Entity.hpp:268
Main class, basically a JsonVariant with extra utility functions it doesn't inherit JsonVariant direc...
Definition Json.hpp:45
Particle & SetParticleType(const ProtocolCraft::ParticleType particle_type_)
Definition Particle.cpp:332