# Mobile Tag - Task Status ## Aktueller Stand (27.07.2026 ~20:20) ### Bereits umgesetzt - Deployment auf Ubuntu-Server (194.164.201.75) via PM2 + Apache Reverse-Proxy + HTTPS - Service Worker auf `selfDestroying: true` gesetzt (alte Caches werden gelöscht) - `useSocket` ist Module-Level-Singleton (keine doppelten Verbindungen mehr) - Lobby zeigt sich korrekt an, `playerId` und `isHost` werden gesetzt - Feuer-Button ist immer aktiv (außer während Nachladezeit) - Server-autoritative Schussauswertung: - Client sendet `shooterPos`, `heading`, `bodyPart`, `clientTimestamp` - Server prüft Cooldown, Lebensstatus, Positions-Plausibilität, Reichweite, Blickrichtung - Keine Treffer auf tote Spieler - Reichweite auf **50m** und Winkeltoleranz auf **30°** erhöht - Bei Distanz < 3m wird der Winkel ignoriert (für Tests nebeneinander) - Fallback-Targeting entfernt: Keine fake Körperteile mehr – nur echt erkannte Personen zeigen ein Label ### Server-Log Analyse (27.07.2026 ~20:25) - ZWEITER ECHTER TEST **Ergebnis:** Zwei echte Spieler (Tobi, Niko) im gleichen laufenden Match. **Gefundenes Problem:** Die Spielerpositionen auf dem Server blieben bei `{ lat: 0, lng: 0 }`, obwohl der Schütze seine echte GPS-Position sendete. **Ursache:** In `client/src/App.tsx` wurde `player:update` nur gesendet, wenn `orientation.heading !== null`. Wenn der Kompass keine Berechtigung hatte oder nicht funktionierte, wurden die GPS-Positionen **nie** an den Server gesendet. **Fix:** - `App.tsx`: Position wird jetzt immer gesendet, auch wenn der Kompass null ist (heading fallback = 0) - `server/src/game.ts`: `isPositionPlausible` von 50m/s auf 500m/s erhöht, damit der erste große Sprung von (0,0) akzeptiert wird - `CameraView.tsx`: Fadenkreuz ist nicht mehr durch Klicken/Tippen verschiebbar ### Weitere Änderungen (27.07.2026 ~21:10) - **Hybrid-Targeting implementiert:** - Distanz < 10m: Proximity-Hit (kein Kompass nötig) - Distanz 10-50m: Kompass mit ±60° Toleranz - **Bild-Snapshot beim Feuern:** Client erstellt JPEG-Shot und sendet ihn mit dem Schuss an den Server - **Server-seitige KI-Bildauswertung:** TensorFlow.js MoveNet läuft auf dem Server und prüft jeden Schuss - Erkennt Person im Bild? - Ist das gewählte Körperteil (`head`/`chest`/`arm`/`leg`) in der Bildmitte? - Ergebnis steht im `HitEvent` unter `poseValidation` - **Erste GPS-Position wird akzeptiert:** Der Sprung von (0,0) zur echten Position wird nicht mehr als Teleport abgelehnt ### Noch offen / nächste Schritte 1. **Testen mit zwei echten Spielern im gleichen Raum** 2. **Server-Logs weiter beobachten** (`pm2 logs mobile-tag-server`) 3. **Client-seitiges Feedback verbessern**, wenn kein Gegner in Reichweite 4. **Snapshot-Validierung in Gameplay einbinden** – aktuell wird das Ergebnis nur zurückgegeben, hat aber keine Auswirkung auf Schaden --- ## Deploy-Handbuch für neue Tasks ### Server-Zugang - **Server-IP:** 194.164.201.75 - **User:** root - **SSH-Key:** `%USERPROFILE%\.ssh\id_ed25519_mobiletag` (Windows) bzw. `~/.ssh/id_ed25519_mobiletag` (Linux/Mac) - **SSH-Befehl (Windows CMD):** ```cmd ssh -i "%USERPROFILE%\.ssh\id_ed25519_mobiletag" root@194.164.201.75 ``` ### Projekt-Pfade - **Lokal:** `c:\Users\thebi\OneDrive\KI Projekte\Mobil_Tag` - **Server:** `/var/www/mobile-tag` ### Wichtige Dateien | Datei | Zweck | |-------|-------| | `server/src/game.ts` | `handleShot` – Server-Logik mit Debug-Logging | | `server/src/types.ts` | `DEFAULT_SETTINGS` (rangeM: 50, angleTolerance: 30) | | `server/src/index.ts` | Socket.io Event-Handler (`player:shoot`, etc.) | | `server/src/rooms.ts` | Raum-Management (create/join/leave) | | `client/src/components/HUD.tsx` | Feuer-Button + Schuss senden | | `client/src/components/CameraView.tsx` | Kamera + Pose-Erkennung + Fadenkreuz | | `client/src/hooks/useSocket.ts` | Socket.io-Client-Singleton | | `client/src/store/gameStore.ts` | Globaler Zustand | ### Komplette Deploy-Prozedur 1. **Lokale Änderungen vornehmen** (im Ordner `c:\Users\thebi\OneDrive\KI Projekte\Mobil_Tag`) 2. **Änderungen auf den Server kopieren** (nur geänderte Dateien, Beispiel): ```cmd scp -i "%USERPROFILE%\.ssh\id_ed25519_mobiletag" "c:/Users/thebi/OneDrive/KI Projekte/Mobil_Tag/server/src/game.ts" root@194.164.201.75:/var/www/mobile-tag/server/src/game.ts scp -i "%USERPROFILE%\.ssh\id_ed25519_mobiletag" "c:/Users/thebi/OneDrive/KI Projekte/Mobil_Tag/client/src/components/HUD.tsx" root@194.164.201.75:/var/www/mobile-tag/client/src/components/HUD.tsx ``` 3. **Auf dem Server bauen und neustarten:** ```bash cd /var/www/mobile-tag npm run build pm2 restart mobile-tag-server systemctl reload apache2 ``` 4. **Logs prüfen:** ```bash pm2 logs mobile-tag-server --lines 100 ``` ### Alles-in-einem Deploy-Befehl (nach Datei-Änderungen) ```cmd ssh -i "%USERPROFILE%\.ssh\id_ed25519_mobiletag" root@194.164.201.75 "cd /var/www/mobile-tag && npm run build && pm2 restart mobile-tag-server && systemctl reload apache2" ``` ### Rollback Falls etwas schiefgeht: ```bash cd /var/www/mobile-tag git checkout -- . # oder manuell die letzte funktionierende Version wiederherstellen npm run build pm2 restart mobile-tag-server systemctl reload apache2 ``` ### Server-Status prüfen ```bash pm2 status pm2 logs mobile-tag-server --lines 50 systemctl status apache2 ``` ### Test-Skript `/tmp/socket-test-shoot.js` auf dem Server simuliert zwei Spieler und einen Treffer: ```bash node /tmp/socket-test-shoot.js ``` ### Troubleshooting | Problem | Lösung | |---------|--------| | Client lädt alte Version | Hard Refresh (Strg+Shift+R) oder privater Tab | | "Verbindungsfehler" | Prüfen, ob `mobile-tag-server` läuft (`pm2 status`) | | Keine Treffer | Logs prüfen; sicherstellen, dass beide Spieler im gleichen Raum sind | | 502 Bad Gateway | Apache/PM2 neu starten (`systemctl reload apache2`, `pm2 restart mobile-tag-server`) | --- Letzte Aktualisierung: 27.07.2026 ~20:20