Files
mmo/plan.md
Marek Le 80a65fa555 update
2026-03-29 22:58:23 +02:00

6.1 KiB

Projektstruktur

Szenenbaum

  • Welt
    • Player
    • Portal
      • Gegner
    • HUD

Architektur

  • Zwischen Szenen: Kommunikation über EventBus (Szenen kennen sich nicht)
  • Innerhalb einer Szene: Modulare Skripte, Zugriff auf Geschwister-Nodes erlaubt

Szenen

  • world.tscn — Hauptszene

    • NavigationRegion3D (Wegfindung für Gegner)
      • Boden (MeshInstance3D, 20x20m PlaneMesh, Gras-Noise-Textur)
    • Kollision (StaticBody3D, WorldBoundaryShape3D)
    • Licht (DirectionalLight3D, 45°, Schatten)
    • Spieler (Instanz von player.tscn)
    • Portal (Instanz von portal.tscn)
    • HUD (Instanz von hud.tscn)
  • player.tscn — Spieler

    • CharacterBody3D (player.gd)
    • Kollision (CapsuleShape3D, 1.8m x 0.3m)
    • Mesh (CapsuleMesh)
    • CameraPivot (Node3D, Kopfhöhe, camera.gd)
      • Camera3D (hinter/über Spieler)
    • Movement (Node, movement.gd)
    • Combat (Node, combat.gd)
    • PlayerClass (Node, player_class.gd)
    • Targeting (Node, targeting.gd)
    • Health (Node, health.gd)
    • Shield (Node, shield.gd)
    • Respawn (Node, respawn.gd)
  • hud.tscn — HUD (eigene Szene, kommuniziert nur über Events)

    • CanvasLayer (hud.gd)
      • HealthBar (ProgressBar, links oben)
      • ShieldBar (ProgressBar, links oben, unter HealthBar)
      • RespawnTimer (Label, mitte, Countdown bei Tod)
      • AbilityBar (HBoxContainer, mitte unten)
        • ClassIcon (Label, Klassen-Symbol: T=Tank, D=Schaden, H=Heiler)
        • Ability 1-5
  • portal.tscn — Portal (Gegner-Spawner, anvisierbar, Gruppe "targetable")

    • StaticBody3D (portal.gd)
    • Kollision (CylinderShape3D)
    • Mesh (CylinderMesh, Platzhalter)
    • Health (Node, health.gd)
    • HitArea (Area3D, Trefferbereich)
      • CollisionShape3D
    • PortalSpawner (Node, portal_spawner.gd)
      • Spawnt 3 Gegner bei 85%, 70%, 55%, 40%, 25%, 10% Leben (einmalig)
      • Portal = Spawnpunkt der Gegner
      • 10m Aggro-Radius um das Portal
    • Healthbar (Sprite3D + SubViewport, healthbar.gd)
  • enemy.tscn — Gegner

    • CharacterBody3D (enemy.gd)
    • Kollision (CapsuleShape3D)
    • Mesh (SphereMesh, Platzhalter)
    • Health (Node, health.gd)
    • Shield (Node, shield.gd)
    • HitArea (Area3D, Trefferbereich des Gegners)
      • CollisionShape3D (CapsuleShape3D)
    • DetectionArea (Area3D, Erkennungsradius)
      • CollisionShape3D (SphereShape3D)
    • NavigationAgent3D (Wegfindung)
    • EnemyMovement (Node, enemy_movement.gd)
    • EnemyCombat (Node, enemy_combat.gd)
    • EnemyAggro (Node, enemy_aggro.gd)
    • Healthbar (Sprite3D + SubViewport, über dem Gegner, healthbar.gd)
      • SubViewport
        • Border (ColorRect, gelb, sichtbar bei Anvisierung)
        • HealthBar (ProgressBar, grün)
        • ShieldBar (ProgressBar, blau)

Skripte

  • player.gd — Kern, verbindet Komponenten
  • camera.gd — LMB freies Umsehen, RMB Kamera + Laufrichtung anpassen
  • movement.gd — Bewegung (WASD relativ zur Kamera), Springen, Schwerkraft
  • combat.gd — Führt Abilities aus, verwaltet Cooldowns (GCD 1s), Fähigkeiten 1-5
    • 1 Single: 10 Schaden, Distanzprüfung, 0s CD, GCD
    • 2 AOE: 5 Schaden im Bereich, 3s CD, GCD
    • 3 Utility: Schild sofort auf 100%, 5s CD, kein GCD
    • 4 Ult: 4x Single + 2x AOE um Ziel, 30s CD, GCD
    • 5 Passive: 50% mehr Schaden (permanent aktiv, kein CD)
  • targeting.gd — Klick/TAB anvisieren (Gruppe "targetable"), Kampfmodus bei Gegner-Angriff, Auto-Targeting auf nächsten Gegner
  • event_bus.gd — Autoload-Singleton, globale Signals
  • portal.gd — Portal-Kern, Gruppe "targetable", kein Kampf/Aggro/State
  • portal_spawner.gd — Spawnt Gegner bei Lebensschwellen, setzt Portal als Spawnpunkt
  • enemy.gd — Gegner-Kern, State Machine (Idle, Verfolgen, Angreifen, Zurückkehren), alarmiert Gegner in 3m, Gruppe "enemies" + "targetable"
  • enemy_movement.gd — Navigation zum Ziel/Spawnpunkt
  • enemy_combat.gd — Angriff über Event (damage_requested)
  • enemy_aggro.gd — Aggro-Tabelle (Spieler → Wert), wählt Ziel mit höchstem Aggro
    • Schaden = Aggro (1:1)
    • Heilung = Aggro (0.5x)
    • Tank = Aggro-Multiplikator (2x)
    • Aggro verfällt -1/s
    • Außerhalb 10m Portal-Radius: Aggro verfällt 1% * 2 je s (1%, 2%, 4%, 8%, ...)
    • Ohne Aggro: Gegner kehrt zum Portal zurück, regeneriert 10% Leben/s bis 100%, dann 1%/s
    • Bei Spieler-Tod → Aggro auf 0
  • health.gd — Leben, 1/s Regeneration, Tod bei 0 (wiederverwendbar)
  • shield.gd — Schild, regeneriert nach 3s ohne Schaden, in 5s voll (wiederverwendbar)
  • player_class.gd — Klassenwechsel ALT+1 bis ALT+3 (Tank/Schaden/Heiler), tauscht AbilitySet
  • respawn.gd — Bei Tod: Spieler deaktivieren, 3s Timer, Respawn am Startpunkt, Leben/Schild voll
  • hud.gd — Reagiert auf Events, aktualisiert HealthBar/ShieldBar/AbilityBar/RespawnTimer
  • healthbar.gd — Liest Health/Shield (optional) vom Parent, gelber Rand bei Anvisierung, blauer Lebensbalken wenn Spieler Ziel ist (nur bei Gegnern)

Abilities (Resources)

  • ability.gd (Resource) — name, type, damage, range, cooldown, uses_gcd, execute()
  • ability_set.gd (Resource) — Set von 5 Abilities pro Klasse
  • ability_modifier.gd (Resource) — Verändert Ability (Element, Beruf, Prestige)
  • Typen: Single, AOE, Utility, Ult, Passive
  • Jede Klasse hat ein eigenes AbilitySet
  • Beim Klassenwechsel wird das AbilitySet getauscht
  • Elemente und Modifikatoren verändern Abilities nachträglich

Events

  • attack_executed(attacker, position, direction, damage) — Angriff wurde ausgeführt
  • damage_dealt(attacker, target, damage) — Schaden wurde verteilt
  • damage_requested(attacker, target, amount) — Schaden zwischen Szenen anfordern
  • entity_died(entity) — Entity ist gestorben
  • shield_broken(entity) — Schild ist auf 0 gefallen
  • shield_regenerated(entity) — Schild ist wieder voll
  • target_changed(player, target) — Spieler hat neues Ziel anvisiert
  • player_respawned(player) — Spieler ist respawnt
  • class_changed(player, class_name) — Spieler hat Klasse gewechselt
  • health_changed(entity, current, max) — Leben hat sich verändert
  • shield_changed(entity, current, max) — Schild hat sich verändert
  • respawn_tick(timer) — Respawn-Countdown Update
  • enemy_engaged(enemy, target) — Gegner hat Spieler anvisiert
  • cooldown_tick(cooldowns, max_cooldowns, gcd_timer) — Cooldown-Update für HUD
  • portal_spawn(portal, enemies) — Portal hat Gegner gespawnt