time(function() use ($recipients, $packets) : bool{ /** @var NetworkSession[] $sessions */ $sessions = []; foreach($recipients as $player){ if($player->isConnected()){ $sessions[] = $player->getNetworkSession(); } } if(count($sessions) === 0){ return false; } /** @var PacketBroadcaster[] $uniqueBroadcasters */ $uniqueBroadcasters = []; /** @var NetworkSession[][] $broadcasterTargets */ $broadcasterTargets = []; foreach($sessions as $recipient){ $broadcaster = $recipient->getBroadcaster(); $uniqueBroadcasters[spl_object_id($broadcaster)] = $broadcaster; $broadcasterTargets[spl_object_id($broadcaster)][spl_object_id($recipient)] = $recipient; } foreach($uniqueBroadcasters as $broadcaster){ $broadcaster->broadcastPackets($broadcasterTargets[spl_object_id($broadcaster)], $packets); } return true; }); } /** * @param Player[] $recipients * @phpstan-param \Closure(EntityEventBroadcaster, array) : void $callback */ public static function broadcastEntityEvent(array $recipients, \Closure $callback) : void{ $uniqueBroadcasters = []; $broadcasterTargets = []; foreach($recipients as $recipient){ $session = $recipient->getNetworkSession(); $broadcaster = $session->getEntityEventBroadcaster(); $uniqueBroadcasters[spl_object_id($broadcaster)] = $broadcaster; $broadcasterTargets[spl_object_id($broadcaster)][spl_object_id($session)] = $session; } foreach($uniqueBroadcasters as $k => $broadcaster){ $callback($broadcaster, $broadcasterTargets[$k]); } } }