As the title, I coded a repeat task but don't know how to stop it after 5 seconds. Here is my code: PHP: <?phpnamespace Test;use pocketmine\plugin\PluginBase;use pocketmine\Server;use pocketmine\Player;use pocketmine\event\Listener;use pocketmine\command\CommandSender;use pocketmine\command\Command;use pocketmine\utils\TextFormat;use pocketmine\item\Item;use pocketmine\math\Vector3;use pocketmine\scheduler\Task;use pocketmine\level\Level;class dropTask extends Task { private $moneyItems; private $level; private $player; function __construct(Array $moneyItems, Level $level, Player $player) { $this->moneyItems = $moneyItems; $this->level = $level; $this->player = $player; } public function onRun(int $currentTick) { $x = $this->player->getX(); $y = $this->player->getY() + 2; $z = $this->player->getZ(); $pos = new Vector3($x, $y, $z); $this->level->dropItem($pos, Item::get($this->moneyItems[mt_rand(0, count($this->moneyItems) - 1)])->setCustomName("CANT_PICKUP")); }}class Main extends PluginBase implements Listener { public $tasks = []; public function onEnable(): void { $this->getServer()->getPluginManager()->registerEvents($this, $this); } public function onCommand(CommandSender $player, Command $command, string $label, array $args): bool { if ($command->getName() === "drop") { if ($player instanceof Player) { if (!isset($args[0])) { $player->sendMessage("Usage: /drop <on/off>"); return false; } else { if ($args[0] === "on") { if (isset($this->tasks[$player->getId()])) { $player->sendMessage("/drop is already on"); return false; } $level = $player->getLevel(); $moneyItems = [Item::EMERALD, Item::GOLD_NUGGET, Item::DIAMOND]; $task = new dropTask($moneyItems, $level, $player); $this->tasks[$player->getId()] = $task; $task2 = new stopTask($player, $this->tasks); $this->getScheduler()->scheduleRepeatingTask($task, 10); /* Turn off the task after 5 seconds */ } else if ($args[0] === "off") { if (!isset($this->tasks[$player->getId()])) { $player->sendMessage("/drop is already off"); return false; } $task = $this->tasks[$player->getId()]; unset($this->tasks[$player->getId()]); $task->getHandler()->cancel(); } } } } return true; }}
PHP: <?phpnamespace Test;use pocketmine\plugin\PluginBase;use pocketmine\Server;use pocketmine\Player;use pocketmine\event\Listener;use pocketmine\command\CommandSender;use pocketmine\command\Command;use pocketmine\utils\TextFormat;use pocketmine\item\Item;use pocketmine\math\Vector3;use pocketmine\scheduler\Task;use pocketmine\level\Level;class dropTask extends Task { private $moneyItems; private $level; private $player; private $time = 5; //Time to the Task function __construct(Array $moneyItems, Level $level, Player $player) { $this->moneyItems = $moneyItems; $this->level = $level; $this->player = $player; } public function onRun(int $currentTick) { $this->time--; //Subtracting 1 every tick if ($this->time < 1){ $this->getScheduler()->cancelTask($this->getTaskId()); //Canceled Task here } $x = $this->player->getX(); $y = $this->player->getY() + 2; $z = $this->player->getZ(); $pos = new Vector3($x, $y, $z); $this->level->dropItem($pos, Item::get($this->moneyItems[mt_rand(0, count($this->moneyItems) - 1)])->setCustomName("CANT_PICKUP")); }}class Main extends PluginBase implements Listener { public $tasks = []; public function onEnable(): void { $this->getServer()->getPluginManager()->registerEvents($this, $this); } public function onCommand(CommandSender $player, Command $command, string $label, array $args): bool { if ($command->getName() === "drop") { if ($player instanceof Player) { if (!isset($args[0])) { $player->sendMessage("Usage: /drop <on/off>"); return false; } else { if ($args[0] === "on") { if (isset($this->tasks[$player->getId()])) { $player->sendMessage("/drop is already on"); return false; } $level = $player->getLevel(); $moneyItems = [Item::EMERALD, Item::GOLD_NUGGET, Item::DIAMOND]; $task = new dropTask($moneyItems, $level, $player); $this->tasks[$player->getId()] = $task; $task2 = new stopTask($player, $this->tasks); //I dont think you need this $this->getScheduler()->scheduleRepeatingTask($task, 20); //Changed to 20 = 1 tick } else if ($args[0] === "off") { if (!isset($this->tasks[$player->getId()])) { $player->sendMessage("/drop is already off"); return false; } $task = $this->tasks[$player->getId()]; unset($this->tasks[$player->getId()]); $task->getHandler()->cancel(); } } } } return true; }} There ya go!
I have this error: "Call to undefined method Test\dropTask::getScheduler()" (EXCEPTION) in "plugins/drop/src/Test/Main" at line 32"
PHP: <?phpnamespace Test;use pocketmine\plugin\PluginBase;use pocketmine\Server;use pocketmine\Player;use pocketmine\event\Listener;use pocketmine\command\CommandSender;use pocketmine\command\Command;use pocketmine\utils\TextFormat;use pocketmine\item\Item;use pocketmine\math\Vector3;use pocketmine\scheduler\Task;use pocketmine\level\Level;class dropTask extends Task { private $moneyItems; private $level; private $player; private $plugin; //Added private $time = 5; //Time to the Task //Added Main $main public function __construct(Main $main,Array $moneyItems, Level $level, Player $player) { $this->moneyItems = $moneyItems; $this->level = $level; $this->player = $player; $this->plugin = $main; //Register to the plugin } public function onRun(int $currentTick) { $this->time--; //Subtracting 1 every tick if ($this->time < 1){ $this->getScheduler()->cancelTask($this->getTaskId()); //Canceled Task here } $x = $this->player->getX(); $y = $this->player->getY() + 2; $z = $this->player->getZ(); $pos = new Vector3($x, $y, $z); $this->level->dropItem($pos, Item::get($this->moneyItems[mt_rand(0, count($this->moneyItems) - 1)])->setCustomName("CANT_PICKUP")); }}class Main extends PluginBase implements Listener { public $tasks = []; public function onEnable(): void { $this->getServer()->getPluginManager()->registerEvents($this, $this); } public function onCommand(CommandSender $player, Command $command, string $label, array $args): bool { if ($command->getName() === "drop") { if ($player instanceof Player) { if (!isset($args[0])) { $player->sendMessage("Usage: /drop <on/off>"); return false; } else { if ($args[0] === "on") { if (isset($this->tasks[$player->getId()])) { $player->sendMessage("/drop is already on"); return false; } $level = $player->getLevel(); $moneyItems = [Item::EMERALD, Item::GOLD_NUGGET, Item::DIAMOND]; $task = new dropTask($this,$moneyItems, $level, $player); //Added $this, I think this is the plugin in on my phone $this->tasks[$player->getId()] = $task; $this->getScheduler()->scheduleRepeatingTask($task, 20); Changed to 20 = 1 tick } else if ($args[0] === "off") { if (!isset($this->tasks[$player->getId()])) { $player->sendMessage("/drop is already off"); return false; } $task = $this->tasks[$player->getId()]; unset($this->tasks[$player->getId()]); $task->getHandler()->cancel(); } } } } return true; }}
I changed $this->getScheduler() to $this->plugin->getScheduler() in your code and it works! Thanks for helping me
Are you looking for it to run once after 5 seconds instead of every second, 5 times? Use a delayed task instead