Skip to content

Commit 57ea981

Browse files
committed
Implement a builder for actor-backed inventories (address #144)
1 parent 16c3cfe commit 57ea981

7 files changed

Lines changed: 227 additions & 2 deletions

File tree

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace muqsit\invmenu\type;
6+
7+
use muqsit\invmenu\inventory\InvMenuInventory;
8+
use muqsit\invmenu\InvMenu;
9+
use muqsit\invmenu\type\graphic\ActorInvMenuGraphic;
10+
use muqsit\invmenu\type\graphic\InvMenuGraphic;
11+
use muqsit\invmenu\type\graphic\network\InvMenuGraphicNetworkTranslator;
12+
use pocketmine\inventory\Inventory;
13+
use pocketmine\network\mcpe\protocol\types\entity\MetadataProperty;
14+
use pocketmine\player\Player;
15+
16+
final class ActorFixedInvMenuType implements FixedInvMenuType{
17+
18+
/**
19+
* @param string $actor_identifier
20+
* @param int $actor_runtime_identifier
21+
* @param array<int, MetadataProperty> $actor_metadata
22+
* @param int $size
23+
* @param InvMenuGraphicNetworkTranslator|null $network_translator
24+
*/
25+
public function __construct(
26+
private string $actor_identifier,
27+
private int $actor_runtime_identifier,
28+
private array $actor_metadata,
29+
private int $size,
30+
private ?InvMenuGraphicNetworkTranslator $network_translator = null
31+
){}
32+
33+
public function getSize() : int{
34+
return $this->size;
35+
}
36+
37+
public function createGraphic(InvMenu $menu, Player $player) : ?InvMenuGraphic{
38+
return new ActorInvMenuGraphic($this->actor_identifier, $this->actor_runtime_identifier, $this->actor_metadata, $this->network_translator);
39+
}
40+
41+
public function createInventory() : Inventory{
42+
return new InvMenuInventory($this->size);
43+
}
44+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace muqsit\invmenu\type\graphic;
6+
7+
use muqsit\invmenu\type\graphic\network\InvMenuGraphicNetworkTranslator;
8+
use pocketmine\inventory\Inventory;
9+
use pocketmine\network\mcpe\protocol\AddActorPacket;
10+
use pocketmine\network\mcpe\protocol\RemoveActorPacket;
11+
use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataProperties;
12+
use pocketmine\network\mcpe\protocol\types\entity\MetadataProperty;
13+
use pocketmine\network\mcpe\protocol\types\entity\PropertySyncData;
14+
use pocketmine\network\mcpe\protocol\types\entity\StringMetadataProperty;
15+
use pocketmine\player\Player;
16+
17+
final class ActorInvMenuGraphic implements InvMenuGraphic{
18+
19+
/**
20+
* @param string $actor_identifier
21+
* @param int $actor_runtime_identifier
22+
* @param array<int, MetadataProperty> $actor_metadata
23+
* @param InvMenuGraphicNetworkTranslator|null $network_translator
24+
* @param int $animation_duration
25+
*/
26+
public function __construct(
27+
private string $actor_identifier,
28+
private int $actor_runtime_identifier,
29+
private array $actor_metadata,
30+
private ?InvMenuGraphicNetworkTranslator $network_translator = null,
31+
private int $animation_duration = 0
32+
){}
33+
34+
public function send(Player $player, ?string $name) : void{
35+
$metadata = $this->actor_metadata;
36+
if($name !== null){
37+
$metadata[EntityMetadataProperties::NAMETAG] = new StringMetadataProperty($name);
38+
}
39+
$player->getNetworkSession()->sendDataPacket(AddActorPacket::create(
40+
$this->actor_runtime_identifier,
41+
$this->actor_runtime_identifier,
42+
$this->actor_identifier,
43+
$player->getPosition()->asVector3(),
44+
null,
45+
0.0,
46+
0.0,
47+
0.0,
48+
0.0,
49+
[],
50+
$metadata,
51+
new PropertySyncData([], []),
52+
[]
53+
));
54+
}
55+
56+
public function sendInventory(Player $player, Inventory $inventory) : bool{
57+
return $player->setCurrentWindow($inventory);
58+
}
59+
60+
public function remove(Player $player) : void{
61+
$player->getNetworkSession()->sendDataPacket(RemoveActorPacket::create($this->actor_runtime_identifier));
62+
}
63+
64+
public function getNetworkTranslator() : ?InvMenuGraphicNetworkTranslator{
65+
return $this->network_translator;
66+
}
67+
68+
public function getAnimationDuration() : int{
69+
return $this->animation_duration;
70+
}
71+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace muqsit\invmenu\type\graphic\network;
6+
7+
use muqsit\invmenu\session\InvMenuInfo;
8+
use muqsit\invmenu\session\PlayerSession;
9+
use pocketmine\network\mcpe\protocol\ContainerOpenPacket;
10+
use pocketmine\network\mcpe\protocol\types\BlockPosition;
11+
12+
final class ActorInvMenuGraphicNetworkTranslator implements InvMenuGraphicNetworkTranslator{
13+
14+
public function __construct(
15+
private int $actor_runtime_id
16+
){}
17+
18+
public function translate(PlayerSession $session, InvMenuInfo $current, ContainerOpenPacket $packet) : void{
19+
$packet->actorUniqueId = $this->actor_runtime_id;
20+
$packet->blockPosition = new BlockPosition(0, 0, 0);
21+
}
22+
}

src/muqsit/invmenu/type/util/InvMenuTypeBuilders.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,17 @@
44

55
namespace muqsit\invmenu\type\util;
66

7+
use muqsit\invmenu\type\util\builder\ActorFixedInvMenuTypeBuilder;
78
use muqsit\invmenu\type\util\builder\BlockActorFixedInvMenuTypeBuilder;
89
use muqsit\invmenu\type\util\builder\BlockFixedInvMenuTypeBuilder;
910
use muqsit\invmenu\type\util\builder\DoublePairableBlockActorFixedInvMenuTypeBuilder;
1011

1112
final class InvMenuTypeBuilders{
1213

14+
public static function ACTOR_FIXED() : ActorFixedInvMenuTypeBuilder{
15+
return new ActorFixedInvMenuTypeBuilder();
16+
}
17+
1318
public static function BLOCK_ACTOR_FIXED() : BlockActorFixedInvMenuTypeBuilder{
1419
return new BlockActorFixedInvMenuTypeBuilder();
1520
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace muqsit\invmenu\type\util\builder;
6+
7+
use muqsit\invmenu\type\ActorFixedInvMenuType;
8+
use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataFlags;
9+
use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataProperties;
10+
11+
final class ActorFixedInvMenuTypeBuilder implements InvMenuTypeBuilder{
12+
use ActorInvMenuTypeBuilderTrait;
13+
use FixedInvMenuTypeBuilderTrait{ setSize as parentSetSize; }
14+
use GraphicNetworkTranslatableInvMenuTypeBuilderTrait{ setNetworkWindowType as parentSetNetworkWindowType; }
15+
16+
public function __construct(){
17+
$metadata = $this->getActorMetadata();
18+
$metadata->setFloat(EntityMetadataProperties::BOUNDING_BOX_HEIGHT, 0.01);
19+
$metadata->setFloat(EntityMetadataProperties::BOUNDING_BOX_WIDTH, 0.01);
20+
$metadata->setGenericFlag(EntityMetadataFlags::INVISIBLE, true);
21+
}
22+
23+
public function setNetworkWindowType(int $window_type) : self{
24+
$this->parentSetNetworkWindowType($window_type);
25+
$this->getActorMetadata()->setByte(EntityMetadataProperties::CONTAINER_TYPE, $window_type);
26+
return $this;
27+
}
28+
29+
public function setSize(int $size) : self{
30+
$this->parentSetSize($size);
31+
$this->getActorMetadata()->setInt(EntityMetadataProperties::CONTAINER_BASE_SIZE, $size);
32+
return $this;
33+
}
34+
35+
public function build() : ActorFixedInvMenuType{
36+
return new ActorFixedInvMenuType($this->getActorIdentifier(), $this->getActorRuntimeIdentifier(), $this->getActorMetadata()->getAll(), $this->getSize(), $this->getGraphicNetworkTranslator());
37+
}
38+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace muqsit\invmenu\type\util\builder;
6+
7+
use muqsit\invmenu\type\graphic\network\ActorInvMenuGraphicNetworkTranslator;
8+
use pocketmine\entity\Entity;
9+
use pocketmine\network\mcpe\protocol\types\entity\EntityIds;
10+
use pocketmine\network\mcpe\protocol\types\entity\EntityMetadataCollection;
11+
12+
trait ActorInvMenuTypeBuilderTrait{
13+
14+
private ?string $actor_identifier = null;
15+
private ?int $actor_runtime_identifier = null;
16+
private ?EntityMetadataCollection $actor_metadata = null;
17+
18+
public function getActorRuntimeIdentifier() : int{
19+
return $this->actor_runtime_identifier ?? $this->setActorRuntimeIdentifier(Entity::nextRuntimeId())->getActorRuntimeIdentifier();
20+
}
21+
22+
public function setActorRuntimeIdentifier(int $actor_runtime_identifier) : self{
23+
$this->actor_runtime_identifier = $actor_runtime_identifier;
24+
$this->addGraphicNetworkTranslator(new ActorInvMenuGraphicNetworkTranslator($this->actor_runtime_identifier));
25+
return $this;
26+
}
27+
28+
public function getActorMetadata() : EntityMetadataCollection{
29+
return $this->actor_metadata ?? $this->setActorMetadata(new EntityMetadataCollection())->getActorMetadata();
30+
}
31+
32+
public function setActorMetadata(EntityMetadataCollection $actor_metadata) : self{
33+
$this->actor_metadata = $actor_metadata;
34+
return $this;
35+
}
36+
37+
public function getActorIdentifier() : string{
38+
return $this->actor_identifier ?? $this->setActorIdentifier(EntityIds::CHEST_MINECART)->getActorIdentifier();
39+
}
40+
41+
public function setActorIdentifier(string $actor_identifier) : self{
42+
$this->actor_identifier = $actor_identifier;
43+
return $this;
44+
}
45+
}

virion.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: InvMenu
22
antigen: muqsit\invmenu
3-
api: 4.4.0
4-
version: 4.4.1
3+
api: 4.15.0
4+
version: 4.5.0
55
author: Muqsit

0 commit comments

Comments
 (0)