Skip to content

Instantly share code, notes, and snippets.

@PJZ9n
Created May 2, 2020 23:52
Show Gist options
  • Save PJZ9n/085d3572fc3c9136abd06005e39f057a to your computer and use it in GitHub Desktop.
Save PJZ9n/085d3572fc3c9136abd06005e39f057a to your computer and use it in GitHub Desktop.
PocketMineでAsyncTaskを使う例(動作未確認)
<?php
declare(strict_types=1);
//パターン1: 非同期で処理だけする
class Task1 extends \pocketmine\scheduler\AsyncTask
{
/** @var string POST先URL */
private const URL = "https://example.com/api";
/** @var array */
private $data;
public function __construct(array $data)
{
$this->data = $data;
}
public function onRun(): void
{
$data = (array)$this->data;//配列はそのまま使えないので明示的にarrayにキャストする
\pocketmine\utils\Internet::postURL(self::URL, $data);//例えばWebHookなど適当に送信するだけ
}
}
//処理が終わったらプレイヤーにチャットをさせる
class Task2 extends \pocketmine\scheduler\AsyncTask
{
/** @var string */
private $message;
public function __construct(\pocketmine\Player $player, string $message)
{
$this->message = $message;
$this->storeLocal($player);//ローカルに保存しておく(onRun内では使えないことに注意)
}
public function onRun(): void
{
//$this->messageを元に翻訳APIを呼んだり..
$result = "かきくけこ";//取得したデータ
$this->setResult($result);//結果として設定する
}
public function onCompletion(\pocketmine\Server $server): void
{
/** @var \pocketmine\Player $player */
$player = $this->fetchLocal();//ローカルに保存しておいたPlayerを取得
if (!$player->isOnline()) {
return;//すでにオフラインだった場合は終了
}
/** @var string $message */
$message = $this->getResult();//設定した結果を取得する
$player->chat($message);//取得結果をもとにチャットさせる
}
}
//処理が終わったらクロージャを呼ぶ
class Task3 extends \pocketmine\scheduler\AsyncTask
{
public function __construct(Closure $closure)
{
$this->storeLocal($closure);
}
public function onRun(): void
{
//時間が掛かる処理
$this->setResult("処理の結果");
}
public function onCompletion(\pocketmine\Server $server): void
{
/** @var Closure $closure */
$closure = $this->getResult();
$closure($this->getResult());//結果を引数にしてクロージャを呼ぶ
}
}
//AsyncPoolは、Server->getAsyncPool()で取得する
/** @var \pocketmine\scheduler\AsyncPool $asyncPool */
//Task1
$asyncPool->submitTask(new Task1([
"serverstatus" => "online",
]));
//Task2
/** @var \pocketmine\Player $player */
$asyncPool->submitTask(new Task2(
$player,
"あいうえお"
));
//Task3
//例えば、処理が終わったらプレイヤーにメッセージを送信する
/** @var \pocketmine\Player $player */
$asyncPool->submitTask(new Task3(function ($result) use ($player): void {
if (!$player->isOnline()) {
//オンラインでは無かったら終了
return;
}
$player->sendMessage($result);//結果を送信
}));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment