Manage when player finish the map

This commit is contained in:
Beu 2023-09-08 19:58:16 +02:00
parent 676c03847a
commit 36cf818731
1 changed files with 56 additions and 19 deletions

View File

@ -10,6 +10,7 @@ use ManiaControl\Plugins\Plugin;
use ManiaControl\Players\PlayerManager; use ManiaControl\Players\PlayerManager;
use ManiaControl\Callbacks\CallbackListener; use ManiaControl\Callbacks\CallbackListener;
use ManiaControl\Callbacks\Callbacks; use ManiaControl\Callbacks\Callbacks;
use ManiaControl\Callbacks\Structures\TrackMania\OnWayPointEventStructure;
use ManiaControl\Commands\CommandListener; use ManiaControl\Commands\CommandListener;
use ManiaControl\Manialinks\LabelLine; use ManiaControl\Manialinks\LabelLine;
use ManiaControl\Manialinks\ManialinkManager; use ManiaControl\Manialinks\ManialinkManager;
@ -19,6 +20,7 @@ use ManiaControl\Callbacks\TimerListener;
use ManiaControl\Manialinks\ManialinkPageAnswerListener; use ManiaControl\Manialinks\ManialinkPageAnswerListener;
use ManiaControl\Maps\Map; use ManiaControl\Maps\Map;
use ManiaControl\Utils\Formatter;
/** /**
* ClimbTheMap * ClimbTheMap
@ -57,6 +59,7 @@ class ClimbTheMap implements ManialinkPageAnswerListener, TimerListener, Command
private $maniaControl = null; private $maniaControl = null;
private $manialink = ""; private $manialink = "";
private $wraltitude = 0; private $wraltitude = 0;
private $wrtime = 0;
/** /**
* @see \ManiaControl\Plugins\Plugin::prepare() * @see \ManiaControl\Plugins\Plugin::prepare()
@ -109,7 +112,7 @@ class ClimbTheMap implements ManialinkPageAnswerListener, TimerListener, Command
$this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::AFTERINIT, $this, 'handleAfterInit'); $this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::AFTERINIT, $this, 'handleAfterInit');
$this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::MP_STARTROUNDSTART, $this, 'handleStartRound'); $this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::MP_STARTROUNDSTART, $this, 'handleStartRound');
$this->maniaControl->getCallbackManager()->registerCallbackListener(PlayerManager::CB_PLAYERCONNECT, $this, 'handlePlayerConnect'); $this->maniaControl->getCallbackManager()->registerCallbackListener(Callbacks::TM_ONFINISHLINE, $this, 'handleFinishCallback');
$this->maniaControl->getCallbackManager()->registerScriptCallbackListener(self::CB_UPDATEPBS, $this, 'handleUpdatePBs'); $this->maniaControl->getCallbackManager()->registerScriptCallbackListener(self::CB_UPDATEPBS, $this, 'handleUpdatePBs');
@ -127,7 +130,8 @@ class ClimbTheMap implements ManialinkPageAnswerListener, TimerListener, Command
`mapIndex` INT(11) NOT NULL, `mapIndex` INT(11) NOT NULL,
`login` varchar(36) NOT NULL, `login` varchar(36) NOT NULL,
`altitude` INT(11) NOT NULL, `altitude` INT(11) NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `time` int(11) DEFAULT -1,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`index`), PRIMARY KEY (`index`),
UNIQUE KEY `map_player` (`mapIndex`,`login`) UNIQUE KEY `map_player` (`mapIndex`,`login`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;';
@ -169,12 +173,33 @@ class ClimbTheMap implements ManialinkPageAnswerListener, TimerListener, Command
$wr = $this->getWR($map->index); $wr = $this->getWR($map->index);
if ($wr !== null) { if ($wr !== null) {
$this->wraltitude = $wr[1]; $this->wraltitude = $wr[1];
$this->maniaControl->getClient()->triggerModeScriptEvent(self::M_SETWR, [$wr[0], strval($wr[1])]); $this->wrtime = $wr[2];
$this->maniaControl->getClient()->triggerModeScriptEvent(self::M_SETWR, [$wr[0], strval($wr[1]), strval($wr[2])]);
} else { } else {
$this->wraltitude = 0; $this->wraltitude = 0;
} }
} }
public function handleFinishCallback(OnWayPointEventStructure $structure) {
$map = $this->maniaControl->getMapManager()->getCurrentMap();
if ($map === null) return;
$mapIndex = $map->index;
$login = $structure->getLogin();
$time = $structure->getRaceTime();
$mysqli = $this->maniaControl->getDatabase()->getMysqli();
$stmt = $mysqli->prepare("INSERT INTO `" . self::DB_CLIMBTHEMAP . "` (`mapIndex`, `login`, `time`, `altitude`)
VALUES (?, ?, ?, -1) ON DUPLICATE KEY UPDATE
`time` = IF(`time` < 0 OR `time` > VALUES(`time`),
VALUES(`time`),
`time`);");
$stmt->bind_param('isi', $mapIndex, $login, $time);
$stmt->execute();
// Reset manialink cache
$this->manialink = "";
}
public function handleUpdatePBs(array $data) { public function handleUpdatePBs(array $data) {
$json = json_decode($data[1][0]); $json = json_decode($data[1][0]);
if ($json !== null) { if ($json !== null) {
@ -191,15 +216,9 @@ class ClimbTheMap implements ManialinkPageAnswerListener, TimerListener, Command
$stmt->bind_param('iss', $mapIndex, $login, $altitude); $stmt->bind_param('iss', $mapIndex, $login, $altitude);
foreach ($json as $login => $altitude) { foreach ($json as $login => $altitude) {
$stmt->execute(); $stmt->execute();
if ($this->wraltitude < $altitude) {
$this->wraltitude = $altitude;
}
} }
$mysqli->commit(); $mysqli->commit();
// Reset manialink cache // Reset manialink cache
$this->manialink = ""; $this->manialink = "";
} }
@ -212,15 +231,16 @@ class ClimbTheMap implements ManialinkPageAnswerListener, TimerListener, Command
$wr = $this->getWR($map->index); $wr = $this->getWR($map->index);
// Update WR if done on an another server // Update WR if done on an another server
if ($wr !== null && $this->wraltitude < $wr[1]) { if ($wr !== null && ($this->wraltitude !== $wr[1] || $this->wrtime !== $wr[2])) {
$this->wraltitude = $wr[1]; $this->wraltitude = $wr[1];
$this->maniaControl->getClient()->triggerModeScriptEvent(self::M_SETWR, [$wr[0], strval($wr[1])]); $this->wrtime = $wr[2];
$this->maniaControl->getClient()->triggerModeScriptEvent(self::M_SETWR, [$wr[0], strval($wr[1]), strval($wr[2])]);
} }
} }
private function getPlayersPB(int $mapIndex, array $logins) { private function getPlayersPB(int $mapIndex, array $logins) {
if (count($logins) === 0) return; if (count($logins) === 0) return [];
$return = []; $return = [];
$mysqli = $this->maniaControl->getDatabase()->getMysqli(); $mysqli = $this->maniaControl->getDatabase()->getMysqli();
@ -242,7 +262,15 @@ class ClimbTheMap implements ManialinkPageAnswerListener, TimerListener, Command
private function getWR(int $mapIndex) { private function getWR(int $mapIndex) {
$mysqli = $this->maniaControl->getDatabase()->getMysqli(); $mysqli = $this->maniaControl->getDatabase()->getMysqli();
$stmt = $mysqli->prepare('SELECT login,altitude FROM `' . self::DB_CLIMBTHEMAP . '` WHERE `mapIndex` = ? ORDER BY altitude DESC, time ASC LIMIT 1;'); $stmt = $mysqli->prepare('SELECT `login`,`altitude`,`time` FROM `' . self::DB_CLIMBTHEMAP . '`
WHERE `mapIndex` = ?
ORDER BY
CASE
WHEN `time` > 0 THEN `time`
ELSE `altitude`
END DESC,
`date` ASC
LIMIT 1;');
$stmt->bind_param('i', $mapIndex); $stmt->bind_param('i', $mapIndex);
if (!$stmt->execute()) { if (!$stmt->execute()) {
trigger_error('Error executing MySQL query: ' . $stmt->error); trigger_error('Error executing MySQL query: ' . $stmt->error);
@ -254,7 +282,7 @@ class ClimbTheMap implements ManialinkPageAnswerListener, TimerListener, Command
$player = $this->maniaControl->getPlayerManager()->getPlayer($data["login"]); $player = $this->maniaControl->getPlayerManager()->getPlayer($data["login"]);
if ($player !== null) { if ($player !== null) {
return [$player->nickname, $data["altitude"]]; return [$player->nickname, $data["altitude"], $data["time"]];
} }
} }
@ -269,11 +297,16 @@ class ClimbTheMap implements ManialinkPageAnswerListener, TimerListener, Command
$mysqli = $this->maniaControl->getDatabase()->getMysqli(); $mysqli = $this->maniaControl->getDatabase()->getMysqli();
$stmt = $mysqli->prepare('SELECT ctm.index,ctm.login,p.nickname,ctm.altitude,ctm.time FROM `' . self::DB_CLIMBTHEMAP . '` ctm $stmt = $mysqli->prepare('SELECT ctm.index,ctm.login,p.nickname,ctm.altitude,ctm.time,ctm.date FROM `' . self::DB_CLIMBTHEMAP . '` ctm
LEFT JOIN `' . PlayerManager::TABLE_PLAYERS . '` p LEFT JOIN `' . PlayerManager::TABLE_PLAYERS . '` p
ON ctm.login = p.login ON ctm.login = p.login
WHERE `mapIndex` = ? WHERE `mapIndex` = ?
ORDER BY altitude DESC, time ASC;'); ORDER BY
CASE
WHEN `time` > 0 THEN `time`
ELSE `altitude`
END DESC,
`date` ASC');
$stmt->bind_param('i', $mapIndex); $stmt->bind_param('i', $mapIndex);
if (!$stmt->execute()) { if (!$stmt->execute()) {
trigger_error('Error executing MySQL query: ' . $stmt->error); trigger_error('Error executing MySQL query: ' . $stmt->error);
@ -320,7 +353,8 @@ class ClimbTheMap implements ManialinkPageAnswerListener, TimerListener, Command
$labelLine = new LabelLine($headFrame); $labelLine = new LabelLine($headFrame);
$labelLine->addLabelEntryText('Rank', $posX + 5); $labelLine->addLabelEntryText('Rank', $posX + 5);
$labelLine->addLabelEntryText('Nickname', $posX + 18); $labelLine->addLabelEntryText('Nickname', $posX + 18);
$labelLine->addLabelEntryText('Altitude', $posX + $width * 0.6); $labelLine->addLabelEntryText('Altitude', $posX + $width * 0.5);
$labelLine->addLabelEntryText('Time', $posX + $width * 0.6);
$labelLine->addLabelEntryText('Date (UTC)', $posX + $width * 0.75); $labelLine->addLabelEntryText('Date (UTC)', $posX + $width * 0.75);
$labelLine->render(); $labelLine->render();
@ -352,8 +386,11 @@ class ClimbTheMap implements ManialinkPageAnswerListener, TimerListener, Command
$labelLine = new LabelLine($recordFrame); $labelLine = new LabelLine($recordFrame);
$labelLine->addLabelEntryText($index + 1, $posX + 5, 13); $labelLine->addLabelEntryText($index + 1, $posX + 5, 13);
$labelLine->addLabelEntryText($record["nickname"], $posX + 18, 52); $labelLine->addLabelEntryText($record["nickname"], $posX + 18, 52);
$labelLine->addLabelEntryText($record["altitude"], $posX + $width * 0.6, 31); $labelLine->addLabelEntryText($record["altitude"], $posX + $width * 0.5, 31);
$labelLine->addLabelEntryText($record["time"], $posX + $width * 0.75, 30); if ($record["time"] > 0) {
$labelLine->addLabelEntryText(Formatter::formatTime($record["time"]), $posX + $width * 0.6, 30);
}
$labelLine->addLabelEntryText($record["date"], $posX + $width * 0.75, 30);
$labelLine->render(); $labelLine->render();
$recordFrame->setY($posY); $recordFrame->setY($posY);