resolve AsyncEvent with self instance

This commit is contained in:
ShockedPlot7560 2024-01-21 11:50:31 +01:00
parent d6b7a9ed45
commit eb9814197b
No known key found for this signature in database
GPG Key ID: 9A66EBFAA7CD3601
4 changed files with 9 additions and 22 deletions

View File

@ -45,7 +45,7 @@ abstract class AsyncEvent{
private const MAX_EVENT_CALL_DEPTH = 50; private const MAX_EVENT_CALL_DEPTH = 50;
/** /**
* @phpstan-return Promise<null> * @phpstan-return Promise<self>
*/ */
final public function call() : Promise{ final public function call() : Promise{
$this->promises = new ObjectSet(); $this->promises = new ObjectSet();
@ -71,16 +71,16 @@ abstract class AsyncEvent{
} }
/** /**
* @phpstan-return Promise<null> * @phpstan-return Promise<self>
*/ */
private function callAsyncDepth() : Promise{ private function callAsyncDepth() : Promise{
/** @phpstan-var PromiseResolver<null> $globalResolver */ /** @phpstan-var PromiseResolver<self> $globalResolver */
$globalResolver = new PromiseResolver(); $globalResolver = new PromiseResolver();
$priorities = EventPriority::ALL; $priorities = EventPriority::ALL;
$testResolve = function () use (&$testResolve, &$priorities, $globalResolver){ $testResolve = function () use (&$testResolve, &$priorities, $globalResolver){
if(count($priorities) === 0){ if(count($priorities) === 0){
$globalResolver->resolve(null); $globalResolver->resolve($this);
}else{ }else{
$this->callPriority(array_shift($priorities))->onCompletion(function() use ($testResolve) : void{ $this->callPriority(array_shift($priorities))->onCompletion(function() use ($testResolve) : void{
$testResolve(); $testResolve();

View File

@ -51,7 +51,6 @@ use pocketmine\event\player\PlayerBedEnterEvent;
use pocketmine\event\player\PlayerBedLeaveEvent; use pocketmine\event\player\PlayerBedLeaveEvent;
use pocketmine\event\player\PlayerBlockPickEvent; use pocketmine\event\player\PlayerBlockPickEvent;
use pocketmine\event\player\PlayerChangeSkinEvent; use pocketmine\event\player\PlayerChangeSkinEvent;
use pocketmine\event\player\PlayerChatAsyncEvent;
use pocketmine\event\player\PlayerChatEvent; use pocketmine\event\player\PlayerChatEvent;
use pocketmine\event\player\PlayerDeathEvent; use pocketmine\event\player\PlayerDeathEvent;
use pocketmine\event\player\PlayerDisplayNameChangeEvent; use pocketmine\event\player\PlayerDisplayNameChangeEvent;
@ -159,7 +158,6 @@ use function strlen;
use function strtolower; use function strtolower;
use function substr; use function substr;
use function trim; use function trim;
use function var_dump;
use const M_PI; use const M_PI;
use const M_SQRT3; use const M_SQRT3;
use const PHP_INT_MAX; use const PHP_INT_MAX;
@ -1519,19 +1517,6 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{
if(!$ev->isCancelled()){ if(!$ev->isCancelled()){
$this->server->broadcastMessage($ev->getFormatter()->format($ev->getPlayer()->getDisplayName(), $ev->getMessage()), $ev->getRecipients()); $this->server->broadcastMessage($ev->getFormatter()->format($ev->getPlayer()->getDisplayName(), $ev->getMessage()), $ev->getRecipients());
} }
$ev = new PlayerChatAsyncEvent(
$this, $messagePart,
$this->server->getBroadcastChannelSubscribers(Server::BROADCAST_CHANNEL_USERS),
new StandardChatFormatter()
);
$ev->call()->onCompletion(function () use ($ev) {
if(!$ev->isCancelled()){
$this->server->broadcastMessage($ev->getFormatter()->format($ev->getPlayer()->getDisplayName(), $ev->getMessage()), $ev->getRecipients());
}
}, function () {
var_dump("Failed to send chat message");
});
} }
} }
} }

View File

@ -578,7 +578,7 @@ class PluginManager{
/** @phpstan-var class-string $paramClass */ /** @phpstan-var class-string $paramClass */
$paramClass = $paramType->getName(); $paramClass = $paramType->getName();
$eventClass = new \ReflectionClass($paramClass); $eventClass = new \ReflectionClass($paramClass);
if(!$eventClass->isSubclassOf(Event::class)){ if(!$eventClass->isSubclassOf(Event::class) && !$eventClass->isSubclassOf(AsyncEvent::class)){
return null; return null;
} }

View File

@ -83,8 +83,10 @@ final class Promise{
function(mixed $value) use ($resolver, $key, &$toResolve, &$continue, &$values) : void{ function(mixed $value) use ($resolver, $key, &$toResolve, &$continue, &$values) : void{
$values[$key] = $value; $values[$key] = $value;
if(--$toResolve === 0 && $continue){ $toResolve--;
if($toResolve === 0 && $continue){
$resolver->resolve($values); $resolver->resolve($values);
$continue = false;
} }
}, },
function() use ($resolver, &$continue) : void{ function() use ($resolver, &$continue) : void{
@ -100,7 +102,7 @@ final class Promise{
} }
} }
if($toResolve === 0){ if($toResolve === 0 && $continue){
$continue = false; $continue = false;
$resolver->resolve($values); $resolver->resolve($values);
} }