Änderung: Anpassung der TaxiHighscore-API und Verbesserung der Highscore-Anzeige im Taxi-Spiel

Änderungen:
- Umbenennung des API-Endpunkts für Highscores von `/api/taxi/highscore` zu `/api/taxi/highscores`.
- Anpassung der Highscore-Datenstruktur zur Verwendung von `hashedUserId` anstelle von `userId`.
- Erweiterung der Router-Logik zur besseren Organisation der Highscore-Abfragen.
- Implementierung einer neuen Highscore-Anzeige im Spiel, die die Top 20 Spieler und den aktuellen Spieler anzeigt.

Diese Anpassungen verbessern die API-Konsistenz und erweitern die Benutzeroberfläche für die Highscore-Anzeige im Spiel.
This commit is contained in:
Torsten Schulz (local)
2025-10-05 12:42:37 +02:00
parent 42349e46c8
commit 1bde46430b
6 changed files with 345 additions and 43 deletions

View File

@@ -13,7 +13,7 @@ class TaxiHighscoreService extends BaseService {
* Speichert oder aktualisiert einen Highscore-Eintrag
* Jeder User kann nur einen Eintrag pro Map haben (der beste wird gespeichert)
* @param {Object} highscoreData - Die Highscore-Daten
* @param {number} highscoreData.userId - ID des Users
* @param {string} highscoreData.hashedUserId - Hash-ID des Users
* @param {string} highscoreData.nickname - Nickname des Users
* @param {number} highscoreData.passengersDelivered - Anzahl abgelieferter Passagiere
* @param {number} highscoreData.playtime - Spielzeit in Sekunden
@@ -24,10 +24,14 @@ class TaxiHighscoreService extends BaseService {
*/
async createHighscore(highscoreData) {
try {
// Hash-ID zu echter User-ID konvertieren
const user = await this.getUserByHashedId(highscoreData.hashedUserId);
const userId = user.id;
// Prüfen ob bereits ein Eintrag für diesen User und diese Map existiert
const existingHighscore = await this.model.findOne({
where: {
userId: highscoreData.userId,
userId: userId,
mapId: highscoreData.mapId
}
});
@@ -50,7 +54,7 @@ class TaxiHighscoreService extends BaseService {
} else {
// Kein existierender Eintrag, neuen erstellen
const highscore = await this.model.create({
userId: highscoreData.userId,
userId: userId,
nickname: highscoreData.nickname,
passengersDelivered: highscoreData.passengersDelivered,
playtime: highscoreData.playtime,
@@ -107,12 +111,16 @@ class TaxiHighscoreService extends BaseService {
/**
* Holt die persönlichen Bestleistungen eines Users
* @param {number} userId - ID des Users
* @param {string} hashedUserId - Hash-ID des Users
* @param {number} mapId - ID der Map (optional)
* @returns {Promise<Object>} Bestleistungen des Users
*/
async getUserBestScores(userId, mapId = null) {
async getUserBestScores(hashedUserId, mapId = null) {
try {
// Hash-ID zu echter User-ID konvertieren
const user = await this.getUserByHashedId(hashedUserId);
const userId = user.id;
const whereClause = { userId };
if (mapId) {
whereClause.mapId = mapId;
@@ -146,12 +154,16 @@ class TaxiHighscoreService extends BaseService {
/**
* Holt alle Highscores eines Users
* @param {number} userId - ID des Users
* @param {string} hashedUserId - Hash-ID des Users
* @param {number} limit - Anzahl der Einträge (Standard: 20)
* @returns {Promise<Array>} Array der Highscore-Einträge des Users
*/
async getUserHighscores(userId, limit = 20) {
async getUserHighscores(hashedUserId, limit = 20) {
try {
// Hash-ID zu echter User-ID konvertieren
const user = await this.getUserByHashedId(hashedUserId);
const userId = user.id;
const highscores = await this.model.findAll({
where: { userId },
include: [
@@ -174,13 +186,17 @@ class TaxiHighscoreService extends BaseService {
/**
* Holt die Rangliste-Position eines Users für eine bestimmte Map
* @param {number} userId - ID des Users
* @param {string} hashedUserId - Hash-ID des Users
* @param {number} mapId - ID der Map (optional)
* @param {string} orderBy - Sortierung ('points', 'passengersDelivered', 'playtime')
* @returns {Promise<number>} Rangliste-Position (1-basiert)
*/
async getUserRank(userId, mapId = null, orderBy = 'points') {
async getUserRank(hashedUserId, mapId = null, orderBy = 'points') {
try {
// Hash-ID zu echter User-ID konvertieren
const user = await this.getUserByHashedId(hashedUserId);
const userId = user.id;
const whereClause = mapId ? { mapId } : {};
const userHighscore = await this.model.findOne({