PocketMine-MP 5.33.2 git-1133d49c924b4358c79d44eeb97dcbf56cb4d1eb
Loading...
Searching...
No Matches
AnimatedContainerLikeTrait.php
1<?php
2
3/*
4 *
5 * ____ _ _ __ __ _ __ __ ____
6 * | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
7 * | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
8 * | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
9 * |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
10 *
11 * This program is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License as published by
13 * the Free Software Foundation, either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * @author PocketMine Team
17 * @link http://www.pocketmine.net/
18 *
19 *
20 */
21
22declare(strict_types=1);
23
24namespace pocketmine\block\utils;
25
29use function count;
30
31trait AnimatedContainerLikeTrait{
32
33 protected function getViewerCount() : int{
34 $position = $this->getPosition();
35 $tile = $position->getWorld()->getTile($position);
36 if($tile instanceof InventoryHolder){
37 return count($tile->getInventory()->getViewers());
38 }
39 return 0;
40 }
41
42 abstract protected function getOpenSound() : Sound;
43
44 abstract protected function getCloseSound() : Sound;
45
46 abstract protected function playAnimationVisual(Position $position, bool $isOpen) : void;
47
48 protected function playAnimationSound(Position $position, bool $isOpen) : void{
49 $position->getWorld()->addSound($position->add(0.5, 0.5, 0.5), $isOpen ? $this->getOpenSound() : $this->getCloseSound());
50 }
51
52 abstract protected function getPosition() : Position;
53
54 protected function doAnimationEffects(bool $isOpen) : void{
55 $position = $this->getPosition();
56 $this->playAnimationVisual($position, $isOpen);
57 $this->playAnimationSound($position, $isOpen);
58 }
59
60 public function onViewerAdded() : void{
61 if($this->getViewerCount() === 1){
62 $this->doAnimationEffects(true);
63 }
64 }
65
66 public function onViewerRemoved() : void{
67 if($this->getViewerCount() === 1){
68 $this->doAnimationEffects(false);
69 }
70 }
71}