diff --git a/core/Players/PlayerList.php b/core/Players/PlayerList.php index 31404e55..bc44b17c 100644 --- a/core/Players/PlayerList.php +++ b/core/Players/PlayerList.php @@ -84,7 +84,7 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer $this->maniaControl->getCallbackManager()->registerCallbackListener(CallbackManager::CB_MP_PLAYERMANIALINKPAGEANSWER, $this, 'handleManialinkPageAnswer'); // Update Widget Events - $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERINFOCHANGED, $this, 'updateWidget'); + $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERINFOSCHANGED, $this, 'updateWidget'); $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERDISCONNECT, $this, 'updateWidget'); $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'updateWidget'); $this->maniaControl->getCallbackManager()->registerCallbackListener(AuthenticationManager::CB_AUTH_LEVEL_CHANGED, $this, 'updateWidget'); @@ -819,9 +819,8 @@ class PlayerList implements ManialinkPageAnswerListener, CallbackListener, Timer /** * Reopen the widget on PlayerInfoChanged / Player Connect and Disconnect * - * @param Player $player */ - public function updateWidget(Player $player) { + public function updateWidget() { foreach ($this->playersListShown as $login => $shown) { if (!$shown) { continue; diff --git a/core/Players/PlayerManager.php b/core/Players/PlayerManager.php index 72d46b94..306ecb8d 100644 --- a/core/Players/PlayerManager.php +++ b/core/Players/PlayerManager.php @@ -33,9 +33,11 @@ class PlayerManager implements CallbackListener, TimerListener, CommunicationLis /* * Constants */ - const CB_PLAYERCONNECT = 'PlayerManagerCallback.PlayerConnect'; - const CB_PLAYERDISCONNECT = 'PlayerManagerCallback.PlayerDisconnect'; + const CB_PLAYERCONNECT = 'PlayerManagerCallback.PlayerConnect'; + const CB_PLAYERDISCONNECT = 'PlayerManagerCallback.PlayerDisconnect'; + /** @use CB_PlayerInfosChanged in favour to avoid multiple triggers at once */ const CB_PLAYERINFOCHANGED = 'PlayerManagerCallback.PlayerInfoChanged'; + const CB_PLAYERINFOSCHANGED = 'PlayerManagerCallback.PlayerInfosChanged'; const CB_SERVER_EMPTY = 'PlayerManagerCallback.ServerEmpty'; const TABLE_PLAYERS = 'mc_players'; const SETTING_JOIN_LEAVE_MESSAGES = 'Enable Join & Leave Messages'; @@ -70,6 +72,8 @@ class PlayerManager implements CallbackListener, TimerListener, CommunicationLis /** @var AdminLists $adminLists */ private $adminLists = null; + private $playerInfosChangedTime = 0; + /** * Construct a new Player Manager * @@ -505,6 +509,16 @@ class PlayerManager implements CallbackListener, TimerListener, CommunicationLis // Trigger own callback $this->maniaControl->getCallbackManager()->triggerCallback(self::CB_PLAYERINFOCHANGED, $player); + + //Avoid Multiple Triggers + if ((microtime(true) - 0.5) > $this->playerInfosChangedTime) { + //Delay Callback by a short Time (200ms) to be sure that different changes get submitted the same time + $this->maniaControl->getTimerManager()->registerOneTimeListening($this, function () { + $this->maniaControl->getCallbackManager()->triggerCallback(self::CB_PLAYERINFOSCHANGED); + }, 200); + } + + $this->playerInfosChangedTime = microtime(true); } /** @@ -571,10 +585,10 @@ class PlayerManager implements CallbackListener, TimerListener, CommunicationLis * @return \ManiaControl\Players\Player[] */ public function getPlayers($withoutSpectators = false) { - if($withoutSpectators){ + if ($withoutSpectators) { $players = array(); - foreach($this->players as $player){ - if(!$player->isSpectator){ + foreach ($this->players as $player) { + if (!$player->isSpectator) { $players[] = $players; } } diff --git a/plugins/MCTeam/WidgetPlugin.php b/plugins/MCTeam/WidgetPlugin.php index 4d96242e..b0e16ef6 100644 --- a/plugins/MCTeam/WidgetPlugin.php +++ b/plugins/MCTeam/WidgetPlugin.php @@ -130,7 +130,7 @@ class WidgetPlugin implements CallbackListener, TimerListener, Plugin { $this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::MP_PODIUMSTART, $this, 'handleOnEndMap'); $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'handlePlayerConnect'); $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERDISCONNECT, $this, 'updateWidgets'); - $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERINFOCHANGED, $this, 'updateWidgets'); + $this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERINFOSCHANGED, $this, 'updateWidgets'); $this->maniaControl->getCallbackManager()->registerCallbackListener(SettingManager::CB_SETTING_CHANGED, $this, 'updateSettings'); // Settings @@ -559,6 +559,7 @@ class WidgetPlugin implements CallbackListener, TimerListener, Plugin { if ($this->maniaControl->getSettingManager()->getSettingValue($this, self::SETTING_SERVERINFO_WIDGET_ACTIVATED)) { $time = time(); //Update Max once per second + //TODO the one time can be removed due the new PlayerInfosChanged Callback if ($this->lastWidgetUpdateTime < ($time - 1)) { $this->displayServerInfoWidget(); $this->lastWidgetUpdateTime = $time;