# Chest-Shops

Ein Spieler verwandelt eine einzelne Kiste per **Shift+Linksklick mit einem Item in der Hand** in einen Shop, das Schild entsteht automatisch. Gehandelt wird ausschließlich über das Schild, die Kiste bleibt für alle außer Besitzer/Team-Verwalter/Admin gesperrt. Jeder Shop ist `SELLING` (verkauft aus der Kiste) oder `BUYING` (kauft von Spielern an) und gehört einem Spieler oder einem [Team](teams.md) (Geldfluss dann über die Team-Kasse).

## Commands

| Command | Syntax | Permission | Default | Beschreibung |
|---|---|---|---|---|
| `/shop info` | `/shop info` (Block anvisieren) | `shop.use` | `true` | Besitzer, Item, Preis, Typ, Bestand, Koordinaten |
| `/shop remove` | `/shop remove` (Block anvisieren) | `shop.use` | `true` | Entfernt den Shop (nur mit Verwaltungsrecht) |
| `/team shop` | `/team shop` (Block anvisieren) | `team.shop` + Team-Recht | `true` | Wandelt den Shop in einen Team-Shop um |
| `/shop list` | `/shop list` | `shop.admin` | op | Alle Shops mit Typ, Besitzer, Item, Preis, Position |
| `/shop reload` | `/shop reload` | `shop.admin` | op | Lädt Config und Shops neu |
| `/shopedit` | (internes Menü, Rechtsklick aufs Schild) | `shop.create` | `true` | Preis ändern, Typ wechseln, Shop entfernen |
| `/shopconfirm` / `/shopcancel` | (interne Chat-Buttons) | `shop.use` | `true` | Bestätigt/verwirft eine Transaktion |

## Weitere Permissions

| Permission | Default | Beschreibung |
|---|---|---|
| `shop.create` | `true` | Shops per Shift+Klick erstellen |
| `shop.bypass.maxshops` | false | Umgeht das persönliche und das Team-Shop-Limit |
| `shop.bypass.selftrade` | op | Erlaubt Handel am eigenen Shop |
| `shop.limit.<n>` | `false` | Individuelles Shop-Limit (höchster Wert gilt) |
| `shop.limit.unlimited` | false | Kein Shop-Limit |
| `shop.info` | `true` | Fremde Shop-Schilder per Rechtsklick lesen (Besitzer, Item, Preis, Bestand) |

## So läuft ein Handel

1. **Schild linksklicken**, ein Amboss-GUI fragt die Menge ab (beim Verkauf begrenzt durch Spieler-Bestand, Kisten-Platz und Besitzer-Guthaben).
2. Im Chat erscheinen klickbare `[✔ Confirm]`/`[✘ Cancel]`-Buttons (30 Sekunden gültig, `general.confirmation-timeout`).
3. Bei Bestätigung wird alles erneut geprüft und atomar gebucht: schlägt ein Teilschritt fehl, werden Geld und Items automatisch zurückgegeben. Passt nicht alles ins Inventar, fallen die restlichen Items vor die Füße (kein Verlust).

Beim Verkauf an einen Ankaufs-Shop (`BUYING`) zählen und nehmen nur die 36 Inventar-Slots; getragene Rüstung und das Offhand-Item werden nie verkauft. Stirbt ein Käufer zwischen Bestätigung und Übergabe, werden die gekauften Items an seiner Todesposition fallen gelassen statt mit dem Todes-Inventar zu verschwinden.

> **Hinweis:** Ändert der Besitzer zwischenzeitlich Preis oder Typ, bricht die Bestätigung automatisch ab. Preis- und Mengeneingaben laufen über Amboss-Fenster (nicht Chat) und verstehen `k`/`M`-Suffixe wie `1.5k`.

> **Tipp:** Die optionale Steuer (`tax-percentage`, 0 bis 100) wird niemandem gutgeschrieben, sie ist ein reiner Geld-Sink gegen Inflation. Frisst die Steuer den ganzen Betrag (z. B. Preis 0,01 bei 50 %), ist der Handel trotzdem gültig: der Käufer zahlt, der Besitzer bzw. Verkäufer erhält 0,00.

**Rechtsklick aufs eigene Schild** öffnet das Edit-Menü: Preis ändern, Typ umschalten und Shop entfernen (die beiden letzten Cooldown-geschützt, `cooldown.commands.shopedit`). Team-Shops auf `BUYING` umzustellen braucht zusätzlich das Team-Recht `WITHDRAW`, denn Ankaufs-Shops geben Team-Geld aus.

**Team-Shops** (`/team shop`): braucht Team-Mitgliedschaft mit dem Team-Recht `EDIT_TEAM_SHOPS` (oder `shop.admin`). Sie zählen nicht gegen das persönliche Limit, sondern gegen `max-shops-per-team`. Team-Shops lassen sich nur innerhalb eines Claims erstellen, der dem Team gehört (wie Team-Container).

## Schild

Das Schild wird automatisch gewachst und bei jeder Änderung neu gezeichnet:

| Zeile | Inhalt | Farbe |
|---|---|---|
| 1 | `[Shop]` | Pink |
| 2 | Besitzer (Spieler oder `Team <Name>`) | Aqua |
| 3 | Item-Name | Gelb |
| 4 | `Sell <Preis>` / `Buy <Preis>` (Kompaktformat wie `10k`) | Grün wenn verfügbar, sonst Rot |

## Schutzmechanismen

| Bedrohung | Schutz |
|---|---|
| Doppelkisten | Erstellung abgelehnt; nachträgliches Zusammenlegen technisch unmöglich |
| Abbau von Kiste/Schild | Nur Besitzer/Team-Verwalter/`shop.admin`, und selbst die nur schleichend |
| Explosionen | Shop-Kisten und -Schilder sind explosionsfest |
| Kolben | Bewegungen mit Shop-Blöcken werden komplett abgebrochen |
| Wasser/Lava/Feuer/Enderman | Können Shop-Blöcke nicht ersetzen oder zerstören |
| Hopper | Können Shop-Kisten weder leeren noch befüllen (`hopper-protection`) |
| Unbefugtes Öffnen | Kiste öffnet nur für Verwalter, gehandelt wird über das Schild |
| Team-Kisten | Team-beanspruchte Kisten können kein Shop werden |

## Shops und Claims

Ein Chest-Shop lässt sich nur in einem Claim anlegen, in dem du bauen darfst: im eigenen Claim, mit Bau-Trust im Claim eines anderen Spielers oder im Team-Claim (`require-claim`). Nicht nur die Kiste, sondern auch der Block für das Shop-Schild muss auf diesem Land liegen. Das Schild wird automatisch auf eine freie Seite gesetzt, die diese Regel erfüllt; gibt es keine, wird die Erstellung mit "keine freie Seite" abgelehnt. Spieler mit `shop.admin` dürfen überall Shops anlegen. Verschwindet der Claim (Aufgeben, Admin-Löschung, automatischer Ablauf, Team-Auflösung), werden alle Shops auf der Fläche zu normalen Kisten: Schild weg, Inhalt bleibt. Vor dem Aufgeben nennt dir der Server die Anzahl, im Web-Panel fragt eine Rückfrage nach. Shop-Besitzer, die nicht selbst aufgeben, bekommen eine Nachricht, offline beim nächsten Login. Ein Claim lässt sich nicht so verkleinern, dass Shops außerhalb landen: erst `/shop remove`, dann Ecke ziehen. Der Claim-Besitzer darf fremde Shops auf seinem Land per `/shop remove` entfernen, auf Team-Land Mitglieder mit dem Team-Recht `EDIT_TEAM_SHOPS`; der Shop-Besitzer wird benachrichtigt. Bei einer Übertragung des Claims bleiben die Shops bestehen. Shops, die vor dieser Regel außerhalb von Claims entstanden sind, laufen weiter.

## Item-Erkennung

Ein Shop handelt genau das Item, mit dem er erstellt wurde. Zwei Toleranzen lassen sich einstellen: `matching.ignore-cosmetics` behandelt ein Item mit Cosmetic-Skin wie das Item darunter (ein Shop, der mit einer geskinnten Spitzhacke angelegt wurde, handelt auch normale), `matching.ignore-name-and-lore` (Standard `false`) behandelt umbenannte oder mit Lore versehene Items wie das Grunditem; standardmäßig ist ein umbenanntes Item ein eigenes Item, und der Hover in der Shop-Info zeigt dessen Namen. Nie ignoriert werden Verzauberungen, Haltbarkeit, Trank-Effekte, Container-Inhalte und Custom-Items aus Resource-Packs (Nexo, Carpentary): Ein Shop nimmt also nie etwas Billigeres an, das nur ähnlich aussieht.

## Offline-Benachrichtigungen

Handel an deinen Shops, während du offline warst, wird gesammelt und beim nächsten Login angezeigt (`offline-notifications.enabled`). `max-messages-on-join` begrenzt die Einzelzeilen, der Rest wird als Zählung zusammengefasst; Einträge älter als `keep-days` verfallen ungesehen. Das Geld ist unabhängig davon immer sofort gutgeschrieben.

## Konfiguration (modules/shop.yml)

```yaml
# Schaltet das Chest-Shop-Modul ein oder aus.
enabled: true

shop:
  # Standard-Limit pro Spieler. Pro Rang per Permission übersteuern:
  # shop.limit.25 erlaubt 25 Shops, shop.limit.unlimited hebt das Limit auf.
  max-shops-per-player: 10
  # Maximale Shops pro Team (-1 = unbegrenzt). Team-Shops zählen nicht
  # gegen das persönliche Limit.
  max-shops-per-team: 15
  # Shops nur in Claims, in denen der Ersteller bauen darf. Verschwindet
  # der Claim, werden die Shops darin zu normalen Kisten.
  require-claim: true
  # Verhindert, dass Hopper Shop-Kisten leeren oder befüllen.
  hopper-protection: true
  # Erlaubter Preisbereich pro Item. max-price ist hart auf 999000000
  # begrenzt (höhere Werte werden beim Laden gekappt).
  min-price: 0.01
  max-price: 999000000.0
  # Steuer in Prozent auf jede abgeschlossene Transaktion. Der Betrag
  # wird niemandem gutgeschrieben (Geld-Sink). 0 = keine Steuer.
  # Werte außerhalb von 0 bis 100 werden beim Laden begrenzt.
  tax-percentage: 0
  # Spielt Transaktions-Sounds auch für Spieler in der Nähe.
  sound-broadcast: false
  integrations:
    coreprotect:
      # Meldet Transaktionen an CoreProtect (#shop-buy-<spieler>).
      transaction-logging: true
    nexo:
      # Löst Nexo-Item-Namen auf Schildern/Anzeigen auf.
      enabled: true
    carpentary:
      # Löst Carpentary-Item-Namen auf.
      enabled: true

cooldown:
  commands:
    # Sekunden zwischen /shopedit-Aktionen (gegen Spam-Toggling).
    shopedit: 3
```

## Komplette Beispiel-Config

```yaml
enabled: true

shop:
  max-shops-per-player: 5
  max-shops-per-team: 20
  require-claim: true
  hopper-protection: true
  min-price: 1.0
  max-price: 1000000.0
  tax-percentage: 5
  sound-broadcast: true
  integrations:
    coreprotect:
      transaction-logging: true
    nexo:
      enabled: false
    carpentary:
      enabled: false

cooldown:
  commands:
    shopedit: 5
```
