# Economy

Mira bringt eine vollständige Server-Economy mit: Konten, Überweisungen, Admin-Verwaltung und Bestenliste. [Chest-Shops](shop.md) und [Jobs](jobs.md) buchen direkt über diese Konten. Jede Transaktion wird sofort gespeichert und ist gegen gleichzeitige Buchungen abgesichert.

## Commands

| Command | Syntax | Permission | Default | Beschreibung |
|---|---|---|---|---|
| `/balance` | `/balance [spieler]` (Alias `/bal`, `/money`) | `economy.balance` | `true` | Kontostand anzeigen; andere Spieler: `economy.balance.others` (true, auch offline) |
| `/pay` | `/pay <spieler> <betrag>` | `economy.pay` | `true` | Überweist Geld an einen Online-Spieler |
| `/baltop` | `/baltop [seite]` (Alias `/balancetop`, `/moneytop`) | `economy.baltop` | `true` | Bestenliste der reichsten Spieler |
| `/eco give` | `/eco give <spieler> <betrag>` | `economy.admin` | op | Schreibt Geld gut (auch offline) |
| `/eco take` | `/eco take <spieler> <betrag>` | `economy.admin` | op | Bucht Geld ab |
| `/eco set` | `/eco set <spieler> <betrag>` | `economy.admin` | op | Setzt den Kontostand exakt |
| `/eco reset` | `/eco reset <spieler>` | `economy.admin` | op | Setzt auf das Startguthaben zurück |
| `/eco reload` | `/eco reload` | `economy.admin` | op | Lädt Economy-Config und Nachrichten neu (Kontostände werden nicht neu eingelesen) |

> **Tipp:** Beträge verstehen Komma und Punkt als Dezimaltrennzeichen sowie die Suffixe `k` und `M`: `1.5k` = 1500. Ungültige Werte (negativ, NaN, unendlich) werden überall abgelehnt.

`/pay <spieler> <betrag>` verlangt den exakten Spielernamen. Ein Namensanfang (z. B. `Alex` für `Alexander`) wird nicht ergänzt, sondern als "Spieler nicht online" abgelehnt. Spieler im Vanish gelten für alle ohne `mod.vanish.see` als offline (gleiche Regel wie `/msg`). Auch `/eco give|take|set|reset` löst den Namen exakt auf: zuerst ein Online-Spieler mit genau diesem Namen, sonst ein dem Server bekannter Offline-Spieler.

`/eco reload` lädt nur die Economy-Konfiguration und die Nachrichten neu. Kontostände werden dabei nicht neu eingelesen, weil der laufende Server die Konten führt und die gespeicherten Daten im Hintergrund nachschreibt. Manuelle Änderungen an den gespeicherten Kontoständen greifen deshalb erst nach einem Neustart.

> **Hinweis:** Die Bestenliste ist bis zu 30 Sekunden gecacht; ein frisch per `/eco set` gesetzter Rekord taucht also nicht sofort in `/baltop` auf. Rang 1 bis 3 werden mit 🥇/🥈/🥉 hervorgehoben.

## Vault: eigene oder fremde Economy

Mira arbeitet mit [Vault](https://www.spigotmc.org/resources/vault.34315/) zusammen, in beide Richtungen. Der Schalter ist `economy.internal` in der `config.yml`:

- **`internal: true` (Standard):** Mira nutzt seine eigene Economy und meldet sie als Vault-Economy an. Andere Plugins (Shops, Quests, Job-Belohnungen) arbeiten dann auf denselben Konten.
- **`internal: false`:** Mira nutzt die Economy eines anderen Plugins über Vault (z. B. EssentialsX). Alle Geld-Funktionen laufen dann darüber. Ohne gefundenes Economy-Plugin bleibt die interne Economy als Fallback aktiv (Warnung im Log). `/baltop` ist in dem Modus technisch nicht verfügbar.

Eine Änderung von `economy.internal` greift erst nach einem Neustart. Im Diamant-Modus (`economy.mode: diamonds`) gilt immer die eigene Economy. Auf Folia lädt das offizielle Vault derzeit nicht, dort bleibt automatisch die interne Economy aktiv.

Fremdplugins, die über Vault 0,00 buchen (oder einen Bruchteil, der auf 0,00 rundet), erhalten eine erfolgreiche Antwort ohne Kontoänderung, wie bei den gängigen Economy-Providern. Negative Beträge bleiben ein Fehler.

## Diamantbank statt Jobs-Economy

Mit `economy.mode: diamonds` läuft der Server statt mit der Jobs-Economy mit einer **Diamantbank**: Geld sind echte Diamanten, die man mit `/bank` einzahlt und wieder abhebt. Der Wechsel braucht einen Neustart.

| Command | Syntax | Permission | Default | Beschreibung |
|---|---|---|---|---|
| `/bank` | `/bank` (Alias `/diamondbank`) | `bank.use` | `true` | Bank-Menü: Kontostand, einzahlen (alles, 1, 9, 64, eigene Zahl), abheben (Diamanten oder Blöcke) |
| `/bank deposit` | `/bank deposit [anzahl\|all]` | `bank.deposit` | `true` | Zahlt Diamanten ein; Diamantblöcke zählen 9 und werden nie geteilt |
| `/bank withdraw` | `/bank withdraw <anzahl> [blocks]` | `bank.withdraw` | `true` | Zahlt Diamanten oder Diamantblöcke aus; was nicht ins Inventar passt, bleibt auf dem Konto |
| `/bank balance` | `/bank balance` | `bank.use` | `true` | Kontostand |

So funktioniert es:

- **Alles in Diamanten:** Kontostände, `/pay`, `/baltop`, Shops, Team-Bank, Teleport-Kosten, Upgrades, Claim-Blöcke, Warps, PlaceholderAPI, Vault und Web-Panel rechnen in Diamanten (zwei Nachkommastellen, z. B. 0,04 Diamanten pro Team-Claim-Block). Abheben geht nur in ganzen Diamanten.
- **Jobs sind aus:** `/jobs`, Job-Quests und Job-Shop gibt es im Diamant-Modus nicht.
- **Getrennt gespeichert:** Coin- und Diamant-Kontostände, Team-Banken und Shop-Preise liegen getrennt. Wer zurück auf `jobs` schaltet, findet alles wie vorher. Diamant-Konten starten bei `economy.diamonds.start-balance` (Standard 0).
- **Nur echte Diamanten:** Umbenannte Diamanten oder welche mit Lore gehen, Custom-Items auf Diamant-Basis (z. B. Nexo) nicht. Im Kreativ- und Zuschauermodus ist Einzahlen gesperrt (`bank.bypass.gamemode`, Standard false).
- **Preise:** Neben jedem Coin-Preis steht ein Diamant-Preis mit der Endung `-diamonds` (`cost` → `cost-diamonds`, `cost.commands.rtp` → `cost-diamonds.commands.rtp`, `team.levels.3.cost-diamonds`, Upgrade-Stufen `money-diamonds`, Sponsor-Plätze `price-diamonds`, Claim `...Diamonds`). Fehlt einer, gilt der Coin-Preis geteilt durch `economy.diamonds.coins-per-diamond` (Standard 250), auf ganze Cent aufgerundet (Preise pro Block oder Level ungerundet); dadurch wird nie versehentlich etwas kostenlos. Bei einem Update werden fehlende Diamant-Preise in bestehende Dateien geschrieben, berechnet aus den dort eingestellten Coin-Preisen. Auszahlungen (Verkaufswert von Claim-Blöcken) gibt es nur mit eigenem Diamant-Wert.
- **Shops:** Ein Shop, der noch keinen Diamant-Preis hat, handelt im Diamant-Modus nicht ("No price set" auf dem Schild), bis der Besitzer mit `/shopedit price` einen setzt.
- **Team auflösen:** Das Guthaben der Team-Bank geht an den Besitzer (Coins und Diamanten), statt zu verschwinden.
- **Vault:** Im Diamant-Modus bietet Mira sich anderen Plugins nur mit `economy.diamonds.vault-provider: true` als Vault-Economy an. Sonst könnten Vote-, Quest- oder Crate-Plugins abhebbare Diamanten auszahlen.

> **Achtung:** Inventare sind über Welten hinweg geteilt. Erzwingt ein Welt-Shortcut oder `world.forced-gamemodes` den Kreativmodus, können dort genommene Diamanten in Survival eingezahlt werden; das Plugin warnt dann beim Start.

```yaml
economy:
  # jobs = Coins aus Jobs, diamonds = Diamantbank (Neustart nötig)
  mode: diamonds
  diamonds:
    # Kurs für Preise ohne Diamant-Wert: Coin-Preis / Kurs (5000 Coins = 20 Diamanten)
    coins-per-diamond: 250.0
    start-balance: 0.0
    max-balance: 1000000.0
    min-transfer: 0.01
    currency-name: "Diamond"
    currency-name-plural: "Diamonds"
    currency-symbol: "◆"

# modules/team.yml (Beispiel)
team:
  levels:
    3:
      cost: 25000
      cost-diamonds: 100
```

## Konten und Rundung

Jeder Spieler bekommt beim ersten Betreten automatisch ein Konto mit dem Startguthaben. Abfragen zu Spielern ohne Konto zeigen das Startguthaben an, ohne ein Konto anzulegen. Alle Kontostände werden kaufmännisch auf zwei Nachkommastellen gerundet, damit sich Fließkomma-Fehler nie aufaddieren; dieselbe Rundung nutzt auch das [Shop-System](shop.md). Beträge in `/pay` und `/eco give|take|set` werden ebenfalls auf ganze Cent gerundet; ein Betrag, der auf 0,00 rundet, wird als unter dem Mindestbetrag abgelehnt. Sender und Empfänger buchen immer denselben gerundeten Betrag.

## Konfiguration (config.yml)

```yaml
economy:
  # jobs = Coins aus Jobs, diamonds = Diamantbank (siehe oben). Neustart nötig.
  mode: jobs
  # true = eigene Economy (und Vault-Provider). false = fremde Economy
  # über Vault nutzen. Wechsel erfordert einen Neustart. Die Diamantbank
  # läuft immer mit der eigenen Economy.
  internal: true
  # Startguthaben jedes neuen Kontos.
  start-balance: 1000.0
  # Währungsname (Singular bei genau 1.0), Plural und Symbol.
  currency-name: "Coin"
  currency-name-plural: "Coins"
  currency-symbol: "⛃"
  # Obergrenze pro Konto und kleinster erlaubter /pay-Betrag.
  max-balance: 1000000000.0
  min-transfer: 0.01
  # Einträge pro /baltop-Seite.
  baltop-entries-per-page: 10

cooldown:
  commands:
    # Sekunden zwischen zwei /pay-Befehlen (verhindert Spam).
    pay: 1
```

> **Hinweis:** `start-balance` muss >= 0 sein, `max-balance` > 0 und mindestens so groß wie `start-balance`, `min-transfer` >= 0.01 und `baltop-entries-per-page` >= 1. Abweichungen werden beim Laden korrigiert und einmalig im Log gemeldet.

## Komplette Beispiel-Config

```yaml
economy:
  internal: true
  start-balance: 500.0
  currency-name: "Taler"
  currency-name-plural: "Taler"
  currency-symbol: "$"
  max-balance: 10000000.0
  min-transfer: 1.0
  baltop-entries-per-page: 15

cooldown:
  commands:
    pay: 3
```
