34 public function __construct(
35 private int $networkId,
36 private ?PrimitiveShapeType $type,
38 private ?
float $scale,
40 private ?
float $totalTimeLeft,
41 private ?
float $maximumRenderDistance,
42 private ?
Color $color,
43 private ?
int $dimensionId,
44 private ?
int $attachedToEntityId,
48 public static function remove(
int $networkId, ?
int $dimensionId =
null) :
self{
49 return new self($networkId,
null,
null,
null,
null,
null,
null,
null, $dimensionId,
null,
null);
52 public static function line(
int $networkId,
Vector3 $location,
Vector3 $lineEndLocation, ?
Color $color =
null, ?
int $dimensionId =
null, ?
int $attachedToEntityId =
null) :
self{
54 networkId: $networkId,
55 type: PrimitiveShapeType::LINE,
60 maximumRenderDistance:
null,
62 dimensionId: $dimensionId,
63 attachedToEntityId: $attachedToEntityId,
68 public static function box(
int $networkId,
Vector3 $location,
Vector3 $boxBound, ?
float $scale =
null, ?
Color $color =
null, ?
int $dimensionId =
null, ?
int $attachedToEntityId =
null) :
self{
70 networkId: $networkId,
71 type: PrimitiveShapeType::BOX,
76 maximumRenderDistance:
null,
78 dimensionId: $dimensionId,
79 attachedToEntityId: $attachedToEntityId,
84 public static function sphere(
int $networkId,
Vector3 $location,
int $segments, ?
float $scale =
null, ?
Color $color =
null, ?
int $dimensionId =
null, ?
int $attachedToEntityId =
null) :
self{
86 networkId: $networkId,
87 type: PrimitiveShapeType::SPHERE,
92 maximumRenderDistance:
null,
94 dimensionId: $dimensionId,
95 attachedToEntityId: $attachedToEntityId,
100 public static function circle(
int $networkId,
Vector3 $location,
int $segments, ?
float $scale =
null, ?
Color $color =
null, ?
int $dimensionId =
null, ?
int $attachedToEntityId =
null) :
self{
102 networkId: $networkId,
103 type: PrimitiveShapeType::CIRCLE,
108 maximumRenderDistance:
null,
110 dimensionId: $dimensionId,
111 attachedToEntityId: $attachedToEntityId,
116 public static function text(
int $networkId,
Vector3 $location,
string $text,
bool $useRotation =
false, ?
Color $backgroundColor =
null,
bool $depthTest =
true,
bool $showBackface =
true,
bool $showTextBackface =
true, ?
Color $color =
null, ?
int $dimensionId =
null, ?
int $attachedToEntityId =
null) :
self{
118 networkId: $networkId,
119 type: PrimitiveShapeType::TEXT,
124 maximumRenderDistance:
null,
126 dimensionId: $dimensionId,
127 attachedToEntityId: $attachedToEntityId,
128 payload:
new PrimitiveShapeTextPayload($text, $useRotation, $backgroundColor, $depthTest, $showBackface, $showTextBackface)
132 public static function arrow(
int $networkId,
Vector3 $location,
Vector3 $lineEndLocation, ?
float $scale =
null, ?
Color $color =
null, ?
float $arrowHeadLength =
null, ?
float $arrowHeadRadius =
null, ?
int $segments =
null, ?
int $dimensionId =
null, ?
int $attachedToEntityId =
null) :
self{
134 networkId: $networkId,
135 type: PrimitiveShapeType::ARROW,
140 maximumRenderDistance:
null,
142 dimensionId: $dimensionId,
143 attachedToEntityId: $attachedToEntityId,
148 public static function cylinder(
int $networkId,
Vector3 $location,
Vector2 $radiusX,
Vector2 $radiusZ,
float $height,
int $segments, ?
Color $color =
null, ?
int $dimensionId =
null, ?
int $attachedToEntityId =
null) :
self{
150 networkId: $networkId,
151 type: PrimitiveShapeType::CYLINDER,
156 maximumRenderDistance:
null,
158 dimensionId: $dimensionId,
159 attachedToEntityId: $attachedToEntityId,
164 public static function pyramid(
int $networkId,
Vector3 $location,
float $width,
float $height, ?
float $depth =
null, ?
Color $color =
null, ?
int $dimensionId =
null, ?
int $attachedToEntityId =
null) :
self{
166 networkId: $networkId,
167 type: PrimitiveShapeType::PYRAMID,
172 maximumRenderDistance:
null,
174 dimensionId: $dimensionId,
175 attachedToEntityId: $attachedToEntityId,
180 public static function ellipsoid(
int $networkId,
Vector3 $location,
Vector3 $radii,
int $segmentsPerAxis, ?
Color $color =
null, ?
int $dimensionId =
null, ?
int $attachedToEntityId =
null) :
self{
182 networkId: $networkId,
183 type: PrimitiveShapeType::ELLIPSOID,
188 maximumRenderDistance:
null,
190 dimensionId: $dimensionId,
191 attachedToEntityId: $attachedToEntityId,
196 public static function cone(
int $networkId,
Vector3 $location,
Vector2 $radii,
float $height,
int $segments, ?
Color $color =
null, ?
int $dimensionId =
null, ?
int $attachedToEntityId =
null) :
self{
198 networkId: $networkId,
199 type: PrimitiveShapeType::CONE,
204 maximumRenderDistance:
null,
206 dimensionId: $dimensionId,
207 attachedToEntityId: $attachedToEntityId,
212 public function getNetworkId() :
int{
return $this->networkId; }
214 public function getType() : ?PrimitiveShapeType{
return $this->type; }
216 public function getLocation() : ?
Vector3{
return $this->location; }
218 public function getScale() : ?
float{
return $this->scale; }
220 public function getRotation() : ?
Vector3{
return $this->rotation; }
222 public function getTotalTimeLeft() : ?
float{
return $this->totalTimeLeft; }
224 public function getMaximumRenderDistance() : ?
float{
return $this->maximumRenderDistance; }
226 public function getColor() : ?
Color{
return $this->color; }
228 public function getDimensionId() : ?
int{
return $this->dimensionId; }
230 public function getAttachedToEntityId() : ?
int{
return $this->attachedToEntityId; }
234 public static function read(ByteBufferReader $in) :
self{
235 $networkId = VarInt::readUnsignedLong($in);
236 $shapeType = CommonTypes::readOptional($in, fn() => PrimitiveShapeType::fromPacket(Byte::readUnsigned($in)));
237 $location = CommonTypes::readOptional($in, CommonTypes::getVector3(...));
238 $scale = CommonTypes::readOptional($in, LE::readFloat(...));
239 $rotation = CommonTypes::readOptional($in, CommonTypes::getVector3(...));
240 $totalTimeLeft = CommonTypes::readOptional($in, LE::readFloat(...));
241 $maximumRenderDistance = CommonTypes::readOptional($in, LE::readFloat(...));
242 $color = CommonTypes::readOptional($in, fn() => Color::fromARGB(LE::readUnsignedInt($in)));
243 $dimensionId = CommonTypes::readOptional($in, fn() => VarInt::readSignedInt($in));
244 $attachedToEntityId = CommonTypes::readOptional($in, fn() => CommonTypes::getActorRuntimeId($in));
246 $payloadType = VarInt::readUnsignedInt($in);
249 ($shapeType !==
null && $payloadType !== $shapeType->getPayloadType() && $payloadType !== PrimitiveShapeType::PAYLOAD_TYPE_NONE) ||
250 ($shapeType ===
null && $payloadType !== PrimitiveShapeType::PAYLOAD_TYPE_NONE)
252 throw new PacketDecodeException(
"Unexpected payload type $payloadType for provided shape type " . ($shapeType->name ??
"(not set)"));
255 $payload = match($payloadType){
256 PrimitiveShapeType::PAYLOAD_TYPE_NONE =>
null,
257 PrimitiveShapeType::PAYLOAD_TYPE_ARROW => PrimitiveShapeArrowPayload::read($in),
258 PrimitiveShapeType::PAYLOAD_TYPE_TEXT => PrimitiveShapeTextPayload::read($in),
259 PrimitiveShapeType::PAYLOAD_TYPE_BOX => PrimitiveShapeBoxPayload::read($in),
260 PrimitiveShapeType::PAYLOAD_TYPE_LINE => PrimitiveShapeLinePayload::read($in),
261 PrimitiveShapeType::PAYLOAD_TYPE_CIRCLE_OR_SPHERE => PrimitiveShapeCircleOrSpherePayload::read($in),
262 PrimitiveShapeType::PAYLOAD_TYPE_CYLINDER => PrimitiveShapeCylinderPayload::read($in),
263 PrimitiveShapeType::PAYLOAD_TYPE_PYRAMID => PrimitiveShapePyramidPayload::read($in),
264 PrimitiveShapeType::PAYLOAD_TYPE_ELLIPSOID => PrimitiveShapeEllipsoidPayload::read($in),
265 PrimitiveShapeType::PAYLOAD_TYPE_CONE => PrimitiveShapeConePayload::read($in),
276 $maximumRenderDistance,
284 public function write(ByteBufferWriter $out) :
void{
285 VarInt::writeUnsignedLong($out, $this->networkId);
286 CommonTypes::writeOptional($out, $this->type, fn(ByteBufferWriter $out, PrimitiveShapeType $type) => Byte::writeUnsigned($out, $type->value));
287 CommonTypes::writeOptional($out, $this->location, CommonTypes::putVector3(...));
288 CommonTypes::writeOptional($out, $this->scale, LE::writeFloat(...));
289 CommonTypes::writeOptional($out, $this->rotation, CommonTypes::putVector3(...));
290 CommonTypes::writeOptional($out, $this->totalTimeLeft, LE::writeFloat(...));
291 CommonTypes::writeOptional($out, $this->maximumRenderDistance, LE::writeFloat(...));
292 CommonTypes::writeOptional($out, $this->color, fn(ByteBufferWriter $out,
Color $color) => LE::writeUnsignedInt($out, $color->
toARGB()));
293 CommonTypes::writeOptional($out, $this->dimensionId, fn(ByteBufferWriter $out,
int $dimensionId) => VarInt::writeSignedInt($out, $dimensionId));
294 CommonTypes::writeOptional($out, $this->attachedToEntityId, fn(ByteBufferWriter $out,
int $entityId) => CommonTypes::putActorRuntimeId($out, $entityId));
296 VarInt::writeUnsignedInt($out, $this->payload?->getTypeId() ?? PrimitiveShapeType::PAYLOAD_TYPE_NONE);
297 $this->payload?->write($out);