5.8 KiB
5.8 KiB
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: truegesetzt (alte Caches werden gelöscht) useSocketist Module-Level-Singleton (keine doppelten Verbindungen mehr)- Lobby zeigt sich korrekt an,
playerIdundisHostwerden 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
- Client sendet
- 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:isPositionPlausiblevon 50m/s auf 500m/s erhöht, damit der erste große Sprung von (0,0) akzeptiert wirdCameraView.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
HitEventunterposeValidation
- Erste GPS-Position wird akzeptiert: Der Sprung von (0,0) zur echten Position wird nicht mehr als Teleport abgelehnt
Noch offen / nächste Schritte
- Testen mit zwei echten Spielern im gleichen Raum
- Server-Logs weiter beobachten (
pm2 logs mobile-tag-server) - Client-seitiges Feedback verbessern, wenn kein Gegner in Reichweite
- 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):
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
- Lokale Änderungen vornehmen (im Ordner
c:\Users\thebi\OneDrive\KI Projekte\Mobil_Tag) - Änderungen auf den Server kopieren (nur geänderte Dateien, Beispiel):
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 - Auf dem Server bauen und neustarten:
cd /var/www/mobile-tag npm run build pm2 restart mobile-tag-server systemctl reload apache2 - Logs prüfen:
pm2 logs mobile-tag-server --lines 100
Alles-in-einem Deploy-Befehl (nach Datei-Änderungen)
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:
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
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:
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