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

View File

@ -51,7 +51,6 @@ use pocketmine\event\player\PlayerBedEnterEvent;
use pocketmine\event\player\PlayerBedLeaveEvent;
use pocketmine\event\player\PlayerBlockPickEvent;
use pocketmine\event\player\PlayerChangeSkinEvent;
use pocketmine\event\player\PlayerChatAsyncEvent;
use pocketmine\event\player\PlayerChatEvent;
use pocketmine\event\player\PlayerDeathEvent;
use pocketmine\event\player\PlayerDisplayNameChangeEvent;
@ -159,7 +158,6 @@ use function strlen;
use function strtolower;
use function substr;
use function trim;
use function var_dump;
use const M_PI;
use const M_SQRT3;
use const PHP_INT_MAX;
@ -1519,19 +1517,6 @@ class Player extends Human implements CommandSender, ChunkListener, IPlayer{
if(!$ev->isCancelled()){
$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 */
$paramClass = $paramType->getName();
$eventClass = new \ReflectionClass($paramClass);
if(!$eventClass->isSubclassOf(Event::class)){
if(!$eventClass->isSubclassOf(Event::class) && !$eventClass->isSubclassOf(AsyncEvent::class)){
return null;
}

View File

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