Initial commit: Mobil_Tag project setup

This commit is contained in:
topsith
2026-08-05 20:29:18 +02:00
commit 9db3812cf8
46 changed files with 3888 additions and 0 deletions
+135
View File
@@ -0,0 +1,135 @@
# 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