Skip to content

Commit c4e33a6

Browse files
committed
Address #207 by replacing existing chest blocks with barrier blocks
1 parent 1279d93 commit c4e33a6

3 files changed

Lines changed: 50 additions & 6 deletions

File tree

src/muqsit/invmenu/type/BlockActorFixedInvMenuType.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,17 @@
77
use muqsit\invmenu\inventory\InvMenuInventory;
88
use muqsit\invmenu\InvMenu;
99
use muqsit\invmenu\type\graphic\BlockActorInvMenuGraphic;
10+
use muqsit\invmenu\type\graphic\BlockInvMenuGraphic;
1011
use muqsit\invmenu\type\graphic\InvMenuGraphic;
12+
use muqsit\invmenu\type\graphic\MultiBlockInvMenuGraphic;
1113
use muqsit\invmenu\type\graphic\network\InvMenuGraphicNetworkTranslator;
1214
use muqsit\invmenu\type\util\InvMenuTypeHelper;
1315
use pocketmine\block\Block;
16+
use pocketmine\block\VanillaBlocks;
1417
use pocketmine\inventory\Inventory;
18+
use pocketmine\math\Facing;
1519
use pocketmine\player\Player;
20+
use function count;
1621

1722
final class BlockActorFixedInvMenuType implements FixedInvMenuType{
1823

@@ -29,12 +34,18 @@ public function getSize() : int{
2934
}
3035

3136
public function createGraphic(InvMenu $menu, Player $player) : ?InvMenuGraphic{
32-
$origin = $player->getPosition()->addVector(InvMenuTypeHelper::getBehindPositionOffset($player))->floor();
37+
$position = $player->getPosition();
38+
$origin = $position->addVector(InvMenuTypeHelper::getBehindPositionOffset($player))->floor();
3339
if(!InvMenuTypeHelper::isValidYCoordinate($origin->y)){
3440
return null;
3541
}
3642

37-
return new BlockActorInvMenuGraphic($this->block, $origin, BlockActorInvMenuGraphic::createTile($this->tile_id, $menu->getName()), $this->network_translator, $this->animation_duration);
43+
$graphics = [new BlockActorInvMenuGraphic($this->block, $origin, BlockActorInvMenuGraphic::createTile($this->tile_id, $menu->getName()), $this->network_translator, $this->animation_duration)];
44+
foreach(InvMenuTypeHelper::findConnectedBlocks("Chest", $position->getWorld(), $origin, Facing::HORIZONTAL) as $side){
45+
$graphics[] = new BlockInvMenuGraphic(VanillaBlocks::BARRIER(), $side);
46+
}
47+
48+
return count($graphics) > 1 ? new MultiBlockInvMenuGraphic($graphics) : $graphics[0];
3849
}
3950

4051
public function createInventory() : Inventory{

src/muqsit/invmenu/type/DoublePairableBlockActorFixedInvMenuType.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@
77
use muqsit\invmenu\inventory\InvMenuInventory;
88
use muqsit\invmenu\InvMenu;
99
use muqsit\invmenu\type\graphic\BlockActorInvMenuGraphic;
10+
use muqsit\invmenu\type\graphic\BlockInvMenuGraphic;
1011
use muqsit\invmenu\type\graphic\InvMenuGraphic;
1112
use muqsit\invmenu\type\graphic\MultiBlockInvMenuGraphic;
1213
use muqsit\invmenu\type\graphic\network\InvMenuGraphicNetworkTranslator;
1314
use muqsit\invmenu\type\util\InvMenuTypeHelper;
1415
use pocketmine\block\Block;
1516
use pocketmine\block\tile\Chest;
17+
use pocketmine\block\VanillaBlocks;
1618
use pocketmine\inventory\Inventory;
19+
use pocketmine\math\Facing;
1720
use pocketmine\player\Player;
1821

1922
final class DoublePairableBlockActorFixedInvMenuType implements FixedInvMenuType{
@@ -31,17 +34,19 @@ public function getSize() : int{
3134
}
3235

3336
public function createGraphic(InvMenu $menu, Player $player) : ?InvMenuGraphic{
34-
$origin = $player->getPosition()->addVector(InvMenuTypeHelper::getBehindPositionOffset($player))->floor();
37+
$position = $player->getPosition();
38+
$origin = $position->addVector(InvMenuTypeHelper::getBehindPositionOffset($player))->floor();
3539
if(!InvMenuTypeHelper::isValidYCoordinate($origin->y)){
3640
return null;
3741
}
3842

3943
$graphics = [];
4044
$menu_name = $menu->getName();
45+
$world = $position->getWorld();
4146
foreach([
42-
[$origin, $origin->east()],
43-
[$origin->east(), $origin]
44-
] as [$origin_pos, $pair_pos]){
47+
[$origin, $origin->east(), [Facing::NORTH, Facing::SOUTH, Facing::WEST]],
48+
[$origin->east(), $origin, [Facing::NORTH, Facing::SOUTH, Facing::EAST]]
49+
] as [$origin_pos, $pair_pos, $connected_sides]){
4550
$graphics[] = new BlockActorInvMenuGraphic(
4651
$this->block,
4752
$origin_pos,
@@ -51,6 +56,9 @@ public function createGraphic(InvMenu $menu, Player $player) : ?InvMenuGraphic{
5156
$this->network_translator,
5257
$this->animation_duration
5358
);
59+
foreach(InvMenuTypeHelper::findConnectedBlocks("Chest", $world, $origin_pos, $connected_sides) as $side){
60+
$graphics[] = new BlockInvMenuGraphic(VanillaBlocks::BARRIER(), $side);
61+
}
5462
}
5563

5664
return count($graphics) > 1 ? new MultiBlockInvMenuGraphic($graphics) : $graphics[0];

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

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

55
namespace muqsit\invmenu\type\util;
66

7+
use Generator;
8+
use pocketmine\block\tile\Chest;
9+
use pocketmine\math\Facing;
710
use pocketmine\math\Vector3;
811
use pocketmine\player\Player;
12+
use pocketmine\world\World;
913

1014
final class InvMenuTypeHelper{
1115

@@ -24,4 +28,25 @@ public static function getBehindPositionOffset(Player $player) : Vector3{
2428
public static function isValidYCoordinate(float $y) : bool{
2529
return $y >= self::NETWORK_WORLD_Y_MIN && $y <= self::NETWORK_WORLD_Y_MAX;
2630
}
31+
32+
/**
33+
* @param string $tile_id
34+
* @param World $world
35+
* @param Vector3 $position
36+
* @param list<Facing::DOWN|Facing::UP|Facing::NORTH|Facing::SOUTH|Facing::WEST|Facing::EAST> $sides
37+
* @return Generator<Vector3>
38+
*/
39+
public static function findConnectedBlocks(string $tile_id, World $world, Vector3 $position, array $sides) : Generator{
40+
if($tile_id === "Chest"){
41+
// setting a single chest at the spot of a pairable chest sends the client a double chest
42+
// https://github.com/Muqsit/InvMenu/issues/207
43+
foreach($sides as $side){
44+
$pos = $position->getSide($side);
45+
$tile = $world->getTileAt($pos->x, $pos->y, $pos->z);
46+
if($tile instanceof Chest && $tile->getPair() !== null){
47+
yield $pos;
48+
}
49+
}
50+
}
51+
}
2752
}

0 commit comments

Comments
 (0)