From c99892757ae5d43ca90380d5dd53d62fa4705521 Mon Sep 17 00:00:00 2001
From: Shock95x <shock95x@gmail.com>
Date: Mon, 24 Aug 2020 00:45:34 -0400
Subject: [PATCH] Index out of range fix (#51)

---
 plugin.yml                                    |  5 ++-
 .../commands/subcommand/ReloadCommand.php     |  2 +-
 src/shock95x/auctionhouse/menu/AHMenu.php     | 21 ++++++++---
 .../auctionhouse/menu/ExpiredMenu.php         |  1 -
 src/shock95x/auctionhouse/menu/MainMenu.php   | 18 ++++++++--
 .../auctionhouse/menu/admin/AdminMenu.php     | 18 ++++++++--
 .../menu/player/PlayerListingMenu.php         | 17 +++++++--
 .../auctionhouse/task/MenuDelayTask.php       | 36 -------------------
 8 files changed, 67 insertions(+), 51 deletions(-)
 delete mode 100644 src/shock95x/auctionhouse/task/MenuDelayTask.php

diff --git a/plugin.yml b/plugin.yml
index d983df1..61fd99b 100644
--- a/plugin.yml
+++ b/plugin.yml
@@ -1,6 +1,6 @@
 name: AuctionHouse
 main: shock95x\auctionhouse\AuctionHouse
-version: 1.2.0
+version: 1.2.1
 api: 3.0.0
 author: Shock95x
 softdepend: [EconomyAPI, InvCrashFix]
@@ -23,6 +23,9 @@ permissions:
             auctionhouse.command.listings:
                 default: true
                 description: Allows player to view listings.
+            auctionhouse.command.expired:
+                default: true
+                description: Allows player to view expired listings.
             auctionhouse.command.admin:
                 default: op
                 description: Opens the AuctionHouse admin menu.
diff --git a/src/shock95x/auctionhouse/commands/subcommand/ReloadCommand.php b/src/shock95x/auctionhouse/commands/subcommand/ReloadCommand.php
index 492fd77..30428c7 100644
--- a/src/shock95x/auctionhouse/commands/subcommand/ReloadCommand.php
+++ b/src/shock95x/auctionhouse/commands/subcommand/ReloadCommand.php
@@ -10,7 +10,7 @@
 class ReloadCommand extends BaseSubCommand {
 
 	protected function prepare(): void {
-		$this->setPermission("auctionhouse.command.update");
+		$this->setPermission("auctionhouse.command.reload");
 	}
 
 	public function onRun(CommandSender $sender, string $aliasUsed, array $args): void {
diff --git a/src/shock95x/auctionhouse/menu/AHMenu.php b/src/shock95x/auctionhouse/menu/AHMenu.php
index 46a71f7..3d9af3f 100644
--- a/src/shock95x/auctionhouse/menu/AHMenu.php
+++ b/src/shock95x/auctionhouse/menu/AHMenu.php
@@ -4,6 +4,7 @@
 use muqsit\invmenu\inventory\InvMenuInventory;
 use muqsit\invmenu\InvMenu;
 use muqsit\invmenu\InvMenuHandler;
+use muqsit\invmenu\metadata\MenuMetadata;
 use muqsit\invmenu\session\PlayerManager;
 use pocketmine\inventory\transaction\action\SlotChangeAction;
 use pocketmine\item\Item;
@@ -37,12 +38,17 @@ public function __construct(Player $player, bool $returnMain = false, bool $pagi
 		// workaround for recursive menus
 		if(PlayerManager::get($player)->getCurrentMenu() != null && !$this->newMenu) {
 			$menu = PlayerManager::get($player)->getCurrentMenu();
-			$menu->getInventory()->clearAll();
-			$this->inventory = $menu->getInventory();
-			$menu->setListener([$this, "handle"]);
+			// workaround for inventory bug
+			if($menu->getInventory()->getSize() < $type->getSize()) {
+				$player->removeWindow($menu->getInventory());
+				$this->createNewInventory($type);
+			} else {
+				$menu->getInventory()->clearAll();
+				$this->inventory = $menu->getInventory();
+				$menu->setListener([$this, "handle"]);
+			}
 		} else {
-			$this->inventory = $type->createInventory();
-			$this->setListener([$this, "handle"]);
+			$this->createNewInventory($type);
 		}
 		$this->player = $player;
 
@@ -54,6 +60,11 @@ public function __construct(Player $player, bool $returnMain = false, bool $pagi
 
 	abstract function renderItems();
 
+	public function createNewInventory(MenuMetadata $type) {
+		$this->inventory = $type->createInventory();
+		$this->setListener([$this, "handle"]);
+	}
+
 	public function handle(Player $player, Item $itemClicked, Item $itemClickedWith, SlotChangeAction $action): bool {
 		if($itemClicked->getNamedTag()->hasTag("pagination")) {
 			$this->handlePagination($itemClicked->getNamedTag()->getInt("pagination"));
diff --git a/src/shock95x/auctionhouse/menu/ExpiredMenu.php b/src/shock95x/auctionhouse/menu/ExpiredMenu.php
index a097ea0..cf3a1a2 100644
--- a/src/shock95x/auctionhouse/menu/ExpiredMenu.php
+++ b/src/shock95x/auctionhouse/menu/ExpiredMenu.php
@@ -1,7 +1,6 @@
 <?php
 namespace shock95x\auctionhouse\menu;
 
-use pocketmine\inventory\Inventory;
 use pocketmine\inventory\transaction\action\SlotChangeAction;
 use pocketmine\item\Item;
 use pocketmine\nbt\tag\ByteTag;
diff --git a/src/shock95x/auctionhouse/menu/MainMenu.php b/src/shock95x/auctionhouse/menu/MainMenu.php
index 072d3ba..480eac1 100644
--- a/src/shock95x/auctionhouse/menu/MainMenu.php
+++ b/src/shock95x/auctionhouse/menu/MainMenu.php
@@ -2,7 +2,6 @@
 namespace shock95x\auctionhouse\menu;
 
 use DateTime;
-use pocketmine\inventory\Inventory;
 use pocketmine\inventory\transaction\action\SlotChangeAction;
 use pocketmine\item\Item;
 use pocketmine\nbt\NBT;
@@ -11,11 +10,11 @@
 use pocketmine\nbt\tag\IntTag;
 use pocketmine\nbt\tag\ListTag;
 use pocketmine\Player;
+use pocketmine\scheduler\Task;
 use pocketmine\utils\TextFormat;
 use shock95x\auctionhouse\AuctionHouse;
 use shock95x\auctionhouse\database\DataHolder;
 use shock95x\auctionhouse\menu\admin\AdminMenu;
-use shock95x\auctionhouse\task\MenuDelayTask;
 use shock95x\auctionhouse\utils\Locale;
 use shock95x\auctionhouse\utils\Settings;
 use shock95x\auctionhouse\utils\Utils;
@@ -105,7 +104,20 @@ public function handle(Player $player, Item $itemClicked, Item $itemClickedWith,
 			return false;
 		}
 		if($action->getSlot() <= 44 && $itemClicked->getNamedTag()->hasTag("marketId")) {
-			AuctionHouse::getInstance()->getScheduler()->scheduleDelayedTask(new MenuDelayTask($player, new ConfirmPurchaseMenu($this->getPlayer(), clone $itemClicked)), 10);
+			$player->removeWindow($action->getInventory());
+			AuctionHouse::getInstance()->getScheduler()->scheduleDelayedTask(new class($player, clone $itemClicked) extends Task{
+				private $player;
+				private $item;
+
+				public function __construct(Player $player, Item $item) {
+					$this->player = $player;
+					$this->item = $item;
+				}
+
+				public function onRun(int $currentTick) {
+					new ConfirmPurchaseMenu($this->player, $this->item);
+				}
+			}, 10);
 		}
 		return parent::handle($player, $itemClicked, $itemClickedWith, $action);
 	}
diff --git a/src/shock95x/auctionhouse/menu/admin/AdminMenu.php b/src/shock95x/auctionhouse/menu/admin/AdminMenu.php
index e05b1c1..9058682 100644
--- a/src/shock95x/auctionhouse/menu/admin/AdminMenu.php
+++ b/src/shock95x/auctionhouse/menu/admin/AdminMenu.php
@@ -8,11 +8,12 @@
 use pocketmine\nbt\tag\IntTag;
 use pocketmine\nbt\tag\ListTag;
 use pocketmine\Player;
+use pocketmine\scheduler\Task;
 use pocketmine\utils\TextFormat;
+use shock95x\auctionhouse\auction\Listing;
 use shock95x\auctionhouse\AuctionHouse;
 use shock95x\auctionhouse\database\DataHolder;
 use shock95x\auctionhouse\menu\AHMenu;
-use shock95x\auctionhouse\task\MenuDelayTask;
 use shock95x\auctionhouse\utils\Locale;
 use shock95x\auctionhouse\utils\Settings;
 use shock95x\auctionhouse\utils\Utils;
@@ -78,7 +79,20 @@ public function handle(Player $player, Item $itemClicked, Item $itemClickedWith,
 				Locale::getMessage($player, "listing-gone");
 				return false;
 			}
-			AuctionHouse::getInstance()->getScheduler()->scheduleDelayedTask(new MenuDelayTask($player, new ManageListingMenu($player, $listing)), 10);
+			$player->removeWindow($action->getInventory());
+			AuctionHouse::getInstance()->getScheduler()->scheduleDelayedTask(new class($player, $listing) extends Task{
+				private $player;
+				private $listing;
+
+				public function __construct(Player $player, Listing $listing) {
+					$this->player = $player;
+					$this->listing = $listing;
+				}
+
+				public function onRun(int $currentTick) {
+					new ManageListingMenu($this->player, $this->listing);
+				}
+			}, 10);
 		}
 		return parent::handle($player, $itemClicked, $itemClickedWith, $action);
 	}
diff --git a/src/shock95x/auctionhouse/menu/player/PlayerListingMenu.php b/src/shock95x/auctionhouse/menu/player/PlayerListingMenu.php
index 74abf85..d5ea776 100644
--- a/src/shock95x/auctionhouse/menu/player/PlayerListingMenu.php
+++ b/src/shock95x/auctionhouse/menu/player/PlayerListingMenu.php
@@ -6,12 +6,12 @@
 use pocketmine\item\Item;
 use pocketmine\nbt\tag\CompoundTag;
 use pocketmine\Player;
+use pocketmine\scheduler\Task;
 use pocketmine\utils\TextFormat;
 use shock95x\auctionhouse\AuctionHouse;
 use shock95x\auctionhouse\database\DataHolder;
 use shock95x\auctionhouse\menu\AHMenu;
 use shock95x\auctionhouse\menu\ConfirmPurchaseMenu;
-use shock95x\auctionhouse\task\MenuDelayTask;
 use shock95x\auctionhouse\utils\Locale;
 use shock95x\auctionhouse\utils\Settings;
 use shock95x\auctionhouse\utils\Utils;
@@ -69,7 +69,20 @@ public function renderItems() {
 
 	public function handle(Player $player, Item $itemClicked, Item $itemClickedWith, SlotChangeAction $action) : bool {
 		if($action->getSlot() <= 44 && $itemClicked->getNamedTag()->hasTag("marketId")) {
-			AuctionHouse::getInstance()->getScheduler()->scheduleDelayedTask(new MenuDelayTask($player, new ConfirmPurchaseMenu($this->getPlayer(), clone $itemClicked)), 10);
+			$player->removeWindow($action->getInventory());
+			AuctionHouse::getInstance()->getScheduler()->scheduleDelayedTask(new class($player, clone $itemClicked) extends Task{
+				private $player;
+				private $item;
+
+				public function __construct(Player $player, Item $item) {
+					$this->player = $player;
+					$this->item = $item;
+				}
+
+				public function onRun(int $currentTick) {
+					new ConfirmPurchaseMenu($this->player, $this->item);
+				}
+			}, 10);
 		}
 		return parent::handle($player, $itemClicked, $itemClickedWith, $action);
 	}
diff --git a/src/shock95x/auctionhouse/task/MenuDelayTask.php b/src/shock95x/auctionhouse/task/MenuDelayTask.php
deleted file mode 100644
index 241bfb3..0000000
--- a/src/shock95x/auctionhouse/task/MenuDelayTask.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-namespace shock95x\auctionhouse\task;
-
-use muqsit\invmenu\InvMenu;
-use pocketmine\Player;
-use pocketmine\scheduler\Task;
-
-class MenuDelayTask extends Task {
-
-	/** @var Player */
-	private $player;
-	/** @var InvMenu */
-	private $menu;
-
-	/**
-	 * MenuDelayTask constructor.
-	 *
-	 * @param Player $player
-	 * @param InvMenu $menu
-	 */
-	public function __construct(Player $player, InvMenu $menu){
-		$this->player = $player;
-		$this->menu = $menu;
-	}
-
-	/**
-	 * Actions to execute when run
-	 *
-	 * @param int $currentTick
-	 *
-	 * @return void
-	 */
-	public function onRun(int $currentTick){
-		$this->menu->send($this->player);
-	}
-}
\ No newline at end of file