36 Commits
Author SHA1 Message Date
Git Manager GUI c493f18efa Upload folder via GUI - src 2026-05-14 22:10:33 +02:00
Git Manager GUI d387424e0f Upload via Git Manager GUI 2026-05-12 23:24:09 +02:00
Git Manager GUI 01205de952 Upload folder via GUI - src 2026-05-12 23:19:51 +02:00
Git Manager GUI b3b0ae042b Upload folder via GUI - src 2026-05-11 12:01:12 +02:00
Git Manager GUI 876b9cd005 Upload via Git Manager GUI 2026-05-11 12:00:52 +02:00
Git Manager GUI d71f15086d Upload folder via GUI - src 2026-05-05 21:08:18 +02:00
Git Manager GUI 1409fe5e21 Upload via Git Manager GUI 2026-05-05 21:05:34 +02:00
M_Viper f03c10f785 README.md aktualisiert 2026-05-05 10:07:00 +00:00
M_Viper 9834a9d6da wp-ingame-shop/wp-ingame-shop-pro.php aktualisiert 2026-05-02 12:11:23 +00:00
Git Manager GUI 902f8ed43c Upload folder via GUI - src 2026-04-30 09:34:22 +02:00
Git Manager GUI d6ed6544db Upload via Git Manager GUI 2026-04-30 09:33:35 +02:00
Git Manager GUI 30427f7bb3 Upload via Git Manager GUI 2026-04-29 21:06:12 +02:00
Git Manager GUI 798abcc0f2 Upload via Git Manager GUI 2026-04-29 19:15:39 +02:00
Git Manager GUI 6df2548399 Upload folder via GUI - src 2026-04-29 19:14:58 +02:00
Git Manager GUI d1618d45c8 Upload folder via GUI - src 2026-04-29 16:55:46 +02:00
Git Manager GUI c25050b88a Upload via Git Manager GUI 2026-04-29 16:55:43 +02:00
M_Viper b7f689c726 README.md aktualisiert 2026-04-29 14:51:15 +00:00
Git Manager GUI d11fef0032 Upload via Git Manager GUI 2026-04-29 16:41:51 +02:00
Git Manager GUI f5b14ffd6f Upload folder via GUI - src 2026-04-29 16:40:53 +02:00
Git Manager GUI 8e28d518c3 Upload via Git Manager GUI 2026-04-28 22:39:27 +02:00
M_Viper 2c3602f271 Edit wp-ingame-shop/wp-ingame-shop-pro.php via Git Manager GUI 2026-04-28 20:39:14 +00:00
Git Manager GUI 4ff55a3736 Upload folder via GUI - src 2026-04-28 22:17:42 +02:00
Git Manager GUI 10f5fb03a7 Upload via Git Manager GUI 2026-04-28 22:17:25 +02:00
M_Viper f7b274a794 README.md aktualisiert 2026-04-28 20:13:05 +00:00
Git Manager GUI 9f9d064139 Upload folder via GUI - src 2026-04-28 21:46:16 +02:00
Git Manager GUI f571c9e8f8 Upload via Git Manager GUI 2026-04-28 21:45:56 +02:00
M_Viper a7134aaaba README.md aktualisiert 2026-04-28 19:41:46 +00:00
M_Viper ebdd4e22bc README.md aktualisiert 2026-04-25 21:07:27 +00:00
Git Manager GUI 738f6d0218 Upload folder via GUI - src 2026-04-25 21:53:13 +02:00
Git Manager GUI da3dfd717a Upload via Git Manager GUI 2026-04-24 09:13:06 +02:00
Git Manager GUI 38c51a9beb Upload folder via GUI - src 2026-04-24 09:13:04 +02:00
Git Manager GUI 3ba519b53d Upload via Git Manager GUI 2026-04-24 09:12:43 +02:00
M_Viper 25a3f62b06 wp-ingame-shop/wp-ingame-shop.php gelöscht 2026-04-10 06:04:19 +00:00
Git Manager GUI eeb5b5e74f Upload via Git Manager GUI 2026-04-10 08:02:01 +02:00
M_Viper 47915c6dd8 wp-ingame-shop/wp-ingame-shop.php aktualisiert 2026-04-02 19:50:12 +00:00
M_Viper b398a706fe README.md aktualisiert 2026-03-01 11:17:02 +00:00
7 changed files with 13384 additions and 3619 deletions
+15 -7
View File
@@ -6,21 +6,29 @@
<groupId>de.mviper</groupId>
<artifactId>IngameShopSpigot</artifactId>
<version>1.0</version>
<version>1.2</version>
<packaging>jar</packaging>
<name>IngameShopSpigot</name>
<repositories>
<!-- PaperMC Repository -->
<repository>
<id>papermc</id>
<url>https://repo.papermc.io/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<!-- Spigot API -->
<!-- Paper API (enthält Spigot + Adventure + Paper-Events) -->
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>1.20.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<!-- Vault fEconomy -->
<!-- Vault Economy -->
<dependency>
<groupId>net.milkbowl.vault</groupId>
<artifactId>VaultAPI</artifactId>
@@ -42,7 +50,7 @@
</configuration>
</plugin>
<!-- Shade Plugin optional fAbh-->
<!-- Shade Plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
@@ -61,4 +69,4 @@
</plugin>
</plugins>
</build>
</project>
</project>
File diff suppressed because it is too large Load Diff
+56 -3
View File
@@ -1,4 +1,4 @@
# IngameShopSpigot v6.3 Konfiguration
# IngameShopSpigot v6.4 Konfiguration
# ==========================================
# Deine WordPress-URL (kein abschließendes /)
@@ -12,10 +12,63 @@ api-key: "HIER_DEN_KEY_AUS_WORDPRESS_EINTRAGEN"
server-name: "survival"
# Währungsname (muss mit WordPress-Einstellung übereinstimmen)
currency-name: "Coins"
currency-name: "$"
# Wie oft (in Sekunden) nach ausstehenden Bestellungen gesucht wird
check-interval: 10
# Debug-Modus (ausführliche Logs in der Konsole)
debug-mode: false
debug-mode: false
# Fly-Code-Einlösung auf diesem Server deaktivieren
# true = Codes können hier NICHT eingelöst werden (z.B. Lobby, Hub, Event-Server)
# false = Codes können normal eingelöst werden (Standard)
fly-redeem-disabled: false
# Spieler der die Einnahmen aus dem Shop erhält (Vault-Konto)
# Leer lassen ("") wenn niemand die Einnahmen erhalten soll
income-receiver: ""
# MySQL-Verbindung (für Fly-Code-System, Rang-Sessions, Fly-Abo und Plot-Slots)
mysql:
host: "localhost"
port: "3306"
database: "minecraft"
username: "root"
password: "DEIN_PASSWORT"
# ──────────────────────────────────────────────
# Ankauf-Einstellungen (Spieler verkaufen Items)
# ──────────────────────────────────────────────
sell:
# Ankauf auf diesem Server aktivieren
enabled: true
# Preiskorrektur relativ zum WP-Ankaufspreis (in Prozent)
# Beispiele:
# 0.0 → exakt den WP-Ankaufspreis zahlen
# -10.0 → 10 % weniger als der WP-Ankaufspreis
# +5.0 → 5 % mehr als der WP-Ankaufspreis
price-offset: -10.0
# ──────────────────────────────────────────────
# Fly-Abo Einstellungen
# ──────────────────────────────────────────────
fly-abo:
# Maximale Fly-Zeit pro Tag in Stunden (Standard: 6)
max-daily-hours: 6
# ──────────────────────────────────────────────
# Plot-Slot Einstellungen (nur Citybuild)
# ──────────────────────────────────────────────
plot-slots:
# Auf welchem Server greift das Plot-Slot-System?
# Muss mit server-name des Citybuild-Servers übereinstimmen
server: "citybuild"
# Standard-Plot-Slots pro LuckPerms-Gruppe
# LuckPerms Meta "plotlimit" wird automatisch gesetzt und von
# PlotSquared über die Option "max-plots-per-player: -1" + Meta gelesen
rank-defaults:
member: 2
vip: 3
scout: 4
primo: 5
+135 -1
View File
@@ -1,8 +1,9 @@
name: IngameShopSpigot
version: 6.3
version: 1.2
main: de.mviper.spigot.IngameShopSpigot
api-version: 1.19
depend: [Vault]
softdepend: [BCEconomy, NexEco]
description: Verbindet den WP Ingame Shop Pro mit dem Spigot-Server
author: M_Viper
@@ -11,8 +12,141 @@ commands:
description: Zeigt deine letzten Bestellungen im Shop an
usage: /orders
permission: ingameshop.orders
flytime:
description: Zeigt deine aktive verbleibende Fly-Zeit an
usage: /flytime
permission: ingameshop.flytime
flyredeem:
description: Löst einen Fly-Gutschein-Code ein
usage: /flyredeem <Code>
permission: ingameshop.flyredeem
flycodes:
description: Öffnet ein GUI mit deinen ungenutzten Fly-Gutscheinen
usage: /flycodes
permission: ingameshop.flycodes
flygive:
description: Gibt einem Spieler einen Fly-Gutschein-Code (Admin)
usage: /flygive <Spieler> <Sekunden> [Label]
permission: ingameshop.flygive
flypause:
description: Pausiert oder setzt die aktive Fly-Zeit fort
usage: /flypause
permission: ingameshop.flypause
rankinfo:
description: Zeigt deine aktiven zeitbasierten Ränge an
usage: /rankinfo
permission: ingameshop.rankinfo
sell:
description: Verkauft Items an den Shop (GUI, /sell hand, /sell all)
usage: /sell [hand|all]
permission: ingameshop.sell
wpis:
description: IngameShop Admin-Befehle
usage: /wpis <reload>
permission: ingameshop.reload
abo:
description: Zeigt eine Übersicht aller deiner laufenden Abonnements
usage: /abo
permission: ingameshop.abo
flyabo:
description: Zeigt deinen Fly-Abo Status und heutiges Tageslimit
usage: /flyabo
permission: ingameshop.flyabo
flyabocancel:
description: Kündigt dein Fly-Abo zum Monatsende
usage: /flyabocancel [confirm]
permission: ingameshop.flyabocancel
flyabogive:
description: Gibt einem Spieler ein Fly-Abo manuell (Admin)
usage: /flyabogive <Spieler> <Monatspreis> [Label]
permission: ingameshop.flyabogive
plotslots:
description: Zeigt deine aktuellen Plot-Slots (Basis + Extra + Abo)
usage: /plotslots
permission: ingameshop.plotslots
plotabo:
description: Zeigt deinen Plot-Abo Status
usage: /plotabo
permission: ingameshop.plotabo
plotabocancel:
description: Kündigt dein Plot-Abo zum Monatsende
usage: /plotabocancel [confirm]
permission: ingameshop.plotabocancel
plotabogive:
description: Gibt einem Spieler ein Plot-Abo manuell (Admin)
usage: /plotabogive <Spieler> <Slots> <Monatspreis> [Label]
permission: ingameshop.plotabogive
plotslotsgive:
description: Gibt einem Spieler permanente Plot-Slots (Admin)
usage: /plotslotsgive <Spieler> <Slots> [Label]
permission: ingameshop.plotslotsgive
itemabocancel:
description: Kündigt ein bestimmtes Item-Abo anhand der Nummer aus /abo
usage: /itemabocancel <Nr> [confirm]
permission: ingameshop.itemabocancel
mycoupons:
description: Zeigt deine ungenutzten Gutschein-Karten
usage: /mycoupons
permission: ingameshop.mycoupons
permissions:
ingameshop.orders:
description: Kann eigene Bestellhistorie einsehen
default: true
ingameshop.flytime:
description: Kann aktive Fly-Zeit abfragen
default: true
ingameshop.flyredeem:
description: Kann Fly-Codes einlösen
default: true
ingameshop.flycodes:
description: Kann eigene ungenutzte Fly-Codes auflisten
default: true
ingameshop.flygive:
description: Kann Spielern Fly-Gutscheine geben (Admin)
default: op
ingameshop.flypause:
description: Kann die eigene Fly-Zeit pausieren
default: true
ingameshop.rankinfo:
description: Kann eigene aktive Ränge einsehen
default: true
ingameshop.sell:
description: Kann Items an den Shop verkaufen
default: true
ingameshop.reload:
description: Kann die IngameShop-Config live neu laden
default: op
ingameshop.abo:
description: Kann eigene Abo-Übersicht einsehen
default: true
ingameshop.flyabo:
description: Kann eigenen Fly-Abo-Status einsehen
default: true
ingameshop.flyabocancel:
description: Kann eigenes Fly-Abo kündigen
default: true
ingameshop.flyabogive:
description: Kann Spielern Fly-Abos manuell vergeben (Admin)
default: op
ingameshop.plotslots:
description: Kann eigene Plot-Slot Übersicht einsehen
default: true
ingameshop.plotabo:
description: Kann eigenen Plot-Abo-Status einsehen
default: true
ingameshop.plotabocancel:
description: Kann eigenes Plot-Abo kündigen
default: true
ingameshop.plotabogive:
description: Kann Spielern Plot-Abos manuell vergeben (Admin)
default: op
ingameshop.plotslotsgive:
description: Kann Spielern permanente Plot-Slots vergeben (Admin)
default: op
ingameshop.itemabocancel:
description: Kann eigenes Item-Abo kündigen
default: true
ingameshop.mycoupons:
description: Kann eigene Gutschein-Karten einsehen
default: true
+562 -12
View File
@@ -1,7 +1,7 @@
# WP Ingame Shop Pro
Ein leistungsstarker, vollständig eigenständiger Ingame-Shop für WordPress, entwickelt für Minecraft-Server (Spigot/Paper).
Er bietet ein komfortables Warenkorb-System, Gutscheine, Daily Deals und eine benutzerdefinierte Währung – komplett ohne RCON.
Er bietet ein komfortables Warenkorb-System, Gutscheine, Daily Deals, eine benutzerdefinierte Währung und ein **Item-Ankauf-System** – komplett ohne RCON.
Dieses Plugin nutzt eine eigene Datenbankstruktur für maximale Performance und vollständige Unabhängigkeit von WordPress-Beiträgen.
@@ -14,10 +14,10 @@ Dieses Plugin nutzt eine eigene Datenbankstruktur für maximale Performance und
Eine Bestellung = eine saubere Datenbankzeile mit JSON-Details.
- ⚡ **Mehrfachbearbeitung (Bulk Edit)**
Hunderte Items gleichzeitig bearbeiten (Preis, Server, Kategorie, Status).
Hunderte Items gleichzeitig bearbeiten (Preis, Server, Kategorie, Status, **Ankauf**).
- 💰 **Eigene Währung**
„Coins“, „Tokens“ oder beliebige virtuelle Währungen.
„Coins", „Tokens" oder beliebige virtuelle Währungen.
- 🖼️ **Automatische Bildzuweisung**
`minecraft:diamond` → `minecraft_diamond.png`
@@ -28,6 +28,18 @@ Dieses Plugin nutzt eine eigene Datenbankstruktur für maximale Performance und
- 🎫 **Smart Coupons**
Prozent- oder Festbetrag, optional nicht kombinierbar mit Angeboten.
- 🔄 **Item-Ankauf-System**
Spieler können Items direkt ingame an den Shop verkaufen.
Ankaufspreis pro Item konfigurierbar (% vom VK, Festpreis oder VK minus Betrag).
- ✈️ **Fly-Abo-System**
Monatlich abgebuchtes Abonnement mit tägl. Stunden-Limit (Standard: 6h).
Kauf im Shop, Verwaltung & Kündigung vollständig ingame.
- 📦 **Plot-Slot-System**
Zusätzliche PlotSquared-Slots einmalig kaufen oder monatlich abonnieren.
Integration über LuckPerms (`plots.plot.<n>` Permission), vollautomatisch.
- 🌐 **REST API ohne RCON**
- 📊 **Top-Spender & Umsatzstatistik**
@@ -36,9 +48,13 @@ Dieses Plugin nutzt eine eigene Datenbankstruktur für maximale Performance und
## 🚀 Installation
### WordPress Plugin
1. Ordner `wp-ingame-shop-pro` nach:
```
wp-content/plugins/
```
2. Plugin im WordPress Backend aktivieren.
3. Fertig.
@@ -48,6 +64,291 @@ Bei Aktivierung werden automatisch erstellt:
- Datenbanktabellen (`wp_wis_*`)
- Cron-Jobs für Daily Deals
### Spigot/Paper Plugin
1. `IngameShopSpigot.jar` in den `plugins/`-Ordner des Servers legen.
2. Server starten – `config.yml` wird automatisch erstellt.
3. `config.yml` ausfüllen (WordPress-URL, API-Key, Server-Name).
4. `/wpis reload` oder Server neu starten.
**Voraussetzungen:** Vault + ein Economy-Plugin (z.B. EssentialsX)
---
# ⚙️ Spigot Plugin Konfiguration
```yaml
# WordPress-URL (kein abschließendes /)
wordpress-url: "https://deine-domain.de"
# API-Key aus den WordPress-Einstellungen
api-key: "HIER_DEN_KEY_AUS_WORDPRESS_EINTRAGEN"
# Name dieses Servers (muss mit dem Server-Slug in WordPress übereinstimmen)
server-name: "survival"
# Währungsname (muss mit WordPress-Einstellung übereinstimmen)
currency-name: "$"
# Wie oft (in Sekunden) nach ausstehenden Bestellungen gesucht wird
check-interval: 10
# Debug-Modus (ausführliche Logs in der Konsole)
debug-mode: false
# Fly-Code-Einlösung auf diesem Server deaktivieren
fly-redeem-disabled: false
# Spieler der die Einnahmen aus dem Shop erhält (Vault-Konto)
income-receiver: ""
# MySQL-Verbindung (für Fly-Code-System, Rang-Sessions, Fly-Abo und Plot-Slots)
mysql:
host: "localhost"
port: "3306"
database: "minecraft"
username: "root"
password: "DEIN_PASSWORT"
# Ankauf-Einstellungen
sell:
enabled: true
# Preiskorrektur relativ zum WP-Ankaufspreis (in Prozent)
# 0.0 = exakt WP-Preis | -10.0 = 10 % weniger | +5.0 = 5 % mehr
price-offset: 0.0
# Fly-Abo-Einstellungen
fly-abo:
# Maximale Fly-Zeit pro Tag in Stunden (Standard: 6)
max-daily-hours: 6
# Plot-Slot Einstellungen (nur Citybuild)
plot-slots:
# Auf welchem Server greift das Plot-Slot-System?
server: "citybuild"
# Standard-Plot-Slots pro LuckPerms-Gruppe
rank-defaults:
member: 2
vip: 3
scout: 4
primo: 5
```
---
# 🎮 Ingame-Befehle
## Übersicht
| Befehl | Beschreibung | Berechtigung |
|--------|-------------|--------------|
| `/abo` | Zeigt alle laufenden Abonnements in einer Übersicht | `ingameshop.abo` |
## Shop / Bestellungen
| Befehl | Beschreibung | Berechtigung |
|--------|-------------|--------------|
| `/orders` | Zeigt deine letzten Bestellungen | `ingameshop.orders` |
## Fly-Gutscheine
| Befehl | Beschreibung | Berechtigung |
|--------|-------------|--------------|
| `/flytime` | Zeigt deine aktive verbleibende Fly-Zeit | `ingameshop.flytime` |
| `/flyredeem <Code>` | Löst einen Fly-Gutschein-Code ein | `ingameshop.flyredeem` |
| `/flycodes` | GUI mit deinen ungenutzten Fly-Codes (einlösen / weitergeben) | `ingameshop.flycodes` |
| `/flygive <Spieler> <Sekunden> [Label]` | Gibt einem Spieler einen Fly-Code (Admin) | `ingameshop.flygive` |
| `/flypause` | Pausiert oder setzt die aktive Fly-Zeit fort | `ingameshop.flypause` |
## Fly-Abo
| Befehl | Beschreibung | Berechtigung |
|--------|-------------|--------------|
| `/flyabo` | Zeigt Abo-Status, Ablaufdatum und heutiges Tageslimit | `ingameshop.flyabo` |
| `/flyabocancel confirm` | Kündigt das Abo zum Monatsende (bleibt bis dahin aktiv) | `ingameshop.flyabocancel` |
| `/flyabogive <Spieler> <Monatspreis> [Label]` | Vergibt ein Fly-Abo manuell (Admin) | `ingameshop.flyabogive` (OP) |
## Plot-Slots
| Befehl | Beschreibung | Berechtigung |
|--------|-------------|--------------|
| `/plotslots` | Zeigt eigene Slot-Übersicht (Basis / Einmalig / Abo / Gesamt) | `ingameshop.plotslots` |
| `/plotabo` | Zeigt Plot-Abo-Status, Slots, Preis und Ablaufdatum | `ingameshop.plotabo` |
| `/plotabocancel confirm` | Kündigt das Plot-Abo zum Monatsende | `ingameshop.plotabocancel` |
| `/plotabogive <Spieler> <Slots> <Preis> [Label]` | Vergibt ein Plot-Abo manuell (Admin) | `ingameshop.plotabogive` (OP) |
| `/plotslotsgive <Spieler> <Slots> [Label]` | Vergibt permanente Plot-Slots (Admin) | `ingameshop.plotslotsgive` (OP) |
## Ränge
| Befehl | Beschreibung | Berechtigung |
|--------|-------------|--------------|
| `/rankinfo` | Zeigt deine aktiven zeitbasierten Ränge | `ingameshop.rankinfo` |
## Item-Ankauf
| Befehl | Beschreibung | Berechtigung |
|--------|-------------|--------------|
| `/sell` | Öffnet das Ankauf-GUI mit allen ankaufbaren Items | `ingameshop.sell` |
| `/sell hand` | Verkauft den Stack in der Hand direkt | `ingameshop.sell` |
| `/sell all` | Verkauft alle ankaufbaren Items aus dem Inventar | `ingameshop.sell` |
### Ankauf-GUI
- **Linksklick** auf ein Item → verkauft alle davon im Inventar
- **Rechtsklick** auf ein Item → verkauft genau 1 Stack (max. 64)
- Items werden alle 5 Minuten automatisch aus WordPress aktualisiert
## Admin
| Befehl | Beschreibung | Berechtigung |
|--------|-------------|--------------|
| `/wpis reload` | Lädt config.yml und Ankaufliste live neu | `ingameshop.reload` (OP) |
---
# ✈️ Fly-Abo-System
Das Fly-Abo ermöglicht es Spielern, ein monatlich abgebuchtes Abonnement im Shop zu kaufen, das ihnen täglich eine konfigurierbare Menge an Fly-Zeit gewährt.
## Funktionsweise
- Spieler kaufen das Abo einmalig im Shop – der **Artikelpreis** ist gleichzeitig der monatliche Beitrag
- Das Abo ist sofort aktiv und gilt bis zum letzten Tag des laufenden Monats
- Täglich stehen bis zu `max-daily-hours` Stunden Fly zur Verfügung (Standard: 6h)
- Der Tagesverbrauch wird täglich zurückgesetzt
- Am **1. jedes Monats** wird der Monatsbeitrag automatisch per Vault abgebucht und das Abo verlängert
- Kann der Spieler nicht zahlen, wird das Abo **automatisch zum Monatsende gekündigt**
- Kündigung jederzeit ingame möglich – das Abo läuft bis **Ende des laufenden Monats** weiter
- Verwaltung und Kündigung erfolgen ausschließlich ingame
## BossBar
Beim aktiven Fly-Abo wird eine **grüne BossBar** angezeigt:
```
✈ Fly-Abo: 5h 30min / 6h
```
Warnungen bei: 1h, 30min, 10min, 5min, 1min, 30s, 10s verbleibend.
## Shop-Artikel anlegen (WordPress)
1. **Ingame Shop → Items → Neu**
2. Typ: **„✈ Fly-Abo (tägl. Limit)"** auswählen
3. **Preis setzen** – dieser Betrag wird monatlich per Vault abgebucht
4. Name vergeben → Speichern
Die Item-ID wird automatisch als `fly_abo` gespeichert.
> **Hinweis:** Es gibt nur einen Fly-Abo-Artikel. Der Preis im Shop = monatlicher Beitrag.
## Billing-Übersicht
| Zeitpunkt | Was passiert |
|-----------|-------------|
| Kauf im Shop | Vault-Abzug, Abo sofort aktiv bis Monatsende |
| 1. des Monats | Automatische Vault-Abbuchung, Abo verlängert sich |
| Zahlung fehlgeschlagen | Abo läuft bis Monatsende, danach automatisch beendet |
| `/flyabocancel confirm` | Kündigung vorgemerkt, Abo läuft bis Monatsende weiter |
---
# 📦 Plot-Slot-System
Spieler können zusätzliche Plot-Slots auf dem Citybuild-Server kaufen – entweder **einmalig permanent** oder als **monatliches Abo**.
## Standard-Limits pro Rang
| Rang | Standard-Slots |
|------|---------------|
| Member | 2 |
| VIP | 3 |
| Scout | 4 |
| Primo | 5 |
## Gesamtlimit-Berechnung
```
Gesamt = Rang-Basis + einmalig gekaufte Slots + Abo-Slots
```
Das Plugin setzt automatisch die LuckPerms-Permission `plots.plot.<n>` – PlotSquared liest diese direkt aus.
## PlotSquared Voraussetzung
In `plugins/PlotSquared/config/worlds.yml` muss für jede Welt gesetzt sein:
```yaml
worlds:
citybuild:
plot:
max_plots_per_player: -1
```
## Shop-Artikel anlegen (WordPress)
**Einmaliger Kauf (permanent):**
1. Typ: **„📦 Plot-Slots (einmalig)"** auswählen
2. Anzahl der zusätzlichen Slots eingeben
3. Preis setzen → Speichern
Item-ID: `plot_slots_2` (z.B. +2 Slots permanent)
**Monatliches Abo:**
1. Typ: **„📦 Plot-Abo (monatlich)"** auswählen
2. Anzahl der Abo-Slots eingeben
3. Preis setzen (= monatlicher Beitrag) → Speichern
Item-ID: `plot_abo_2` (z.B. +2 Slots monatlich)
## Billing-Übersicht
| Zeitpunkt | Was passiert |
|-----------|-------------|
| Kauf im Shop | Vault-Abzug, Slots sofort aktiv, LuckPerms Permission gesetzt |
| 1. des Monats | Automatische Vault-Abbuchung, Abo-Slots bleiben aktiv |
| Zahlung fehlgeschlagen | Abo-Slots verfallen, überzählige Plots eingefroren |
| `/plotabocancel confirm` | Kündigung vorgemerkt, läuft bis Monatsende weiter |
## Einfrieren bei Zahlungsausfall
Wenn nach Zahlungsausfall der Spieler mehr Plots besitzt als das neue Limit erlaubt, werden die überzähligen Plots eingefroren (kein Bauen möglich) bis das Abo erneuert wird.
---
# 📋 /abo – Abo-Übersicht
Der Befehl `/abo` zeigt alle laufenden Abonnements eines Spielers in einer kompakten Übersicht:
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📋 Meine Abonnements
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✈ Fly-Abo
┌ Paket: Fly-Abo Monat
├ Preis: 50 $ / Monat
├ Status: ✔ Aktiv
├ Aktiv bis: 30.04.2026
├ Nächste Abbuchung: 01.05.2026
├ Heute: 1h 30min / 6h (noch: 4h 30min)
└ Kündigen: /flyabocancel confirm
📦 Plot-Abo
┌ Paket: Plot-Abo +2 Slots
├ Slots: +2 Plot-Slots
├ Preis: 30 $ / Monat
├ Status: ✔ Aktiv
├ Aktiv bis: 30.04.2026
├ Nächste Abbuchung: 01.05.2026
└ Kündigen: /plotabocancel confirm
📦 Plot-Slots
┌ Rang-Basis: 2
├ Einmalig: +1
├ Abo: +2
└ Gesamt: 5 Slots
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```
Die Plot-Slots-Übersicht wird immer angezeigt. Hat der Spieler kein Abo, erscheint ein Hinweis mit dem Shop-Link.
---
# 🖼️ Bilder-Konfiguration (Gitea Raw)
@@ -134,28 +435,44 @@ Ideal für:
### Einzelbearbeitung
- Item ID (`minecraft:diamond`)
- Typ: Minecraft Item | ✈ Fly-Gutschein | 👑 Rang (LuckPerms) | ✈ Fly-Abo | 📦 Plot-Slots (einmalig) | 📦 Plot-Abo (monatlich)
- Preis
- Angebotspreis
- Server-Zuweisung
- Kategorie
- Status (`publish` / `draft`)
- **Ankauf aktivieren** (mit Preismodus und Live-Vorschau)
### Ankauf-Preismodi (pro Item)
| Modus | Beispiel | Ergebnis bei VK 100 |
|-------|---------|---------------------|
| `% vom VK` | 80 | 80 Coins |
| `VK minus` | 10 | 90 Coins |
| `Fixpreis` | 15 | immer 15 Coins |
---
## 🔄 Bulk Edit (Mehrfachbearbeitung)
Beispiel: 100 Items einem Server zuweisen.
Beispiel: 100 Items auf Ankauf konfigurieren.
1. Items anhaken
2. „Massenaktionen“ wählen:
2. „Massenaktionen" wählen:
- Server zuweisen
- Preis ändern
- Angebot ändern
- Kategorie setzen
- Status ändern
- Status ändern
- **Ankauf konfigurieren**
3. Anwenden
4. Änderungen speichern
Überschreibt bestehende Server-/Kategorie-Zuweisungen.
Bei **Ankauf konfigurieren** siehst du pro Item:
- Checkbox zum Aktivieren/Deaktivieren
- Modus-Auswahl (%, minus, fix)
- Wert-Eingabe
- Live-Vorschau des Ankaufspreises
---
@@ -199,7 +516,7 @@ Beispiel:
```
Blöcke
Waffen
Rüstung
R�stung
Ranks
```
@@ -297,6 +614,57 @@ POST /wis/v1/validate_coupon
---
## Ankauf – Items abrufen
```
GET /wis/v1/sell_items?server=survival
```
Antwort:
```json
{
"items": [
{
"item_id": "minecraft:diamond",
"name": "Diamant",
"buy_price": 100,
"sell_price": 80
}
],
"currency": "Coins"
}
```
---
## Ankauf – Item verkaufen
```
POST /wis/v1/sell_item
```
```json
{
"player": "Steve",
"server": "survival",
"item_id": "minecraft:diamond",
"quantity": 5
}
```
Antwort:
```json
{
"success": true,
"item_name": "Diamant",
"quantity": 5,
"price_per_item": 80.00,
"total": 400.00
}
```
---
# 💾 Datenbank-Struktur
## `wp_wis_items`
@@ -311,6 +679,9 @@ POST /wis/v1/validate_coupon
| servers | JSON Array |
| categories | JSON Array |
| status | publish / draft |
| sell_enabled | 0 / 1 – Ankauf aktiv? |
| sell_price_mode | percent / fixed / minus |
| sell_price_value | Wert passend zum Modus |
---
@@ -339,6 +710,73 @@ POST /wis/v1/validate_coupon
---
## `wp_wis_sell_log`
| Feld | Beschreibung |
|------|-------------|
| player_name | Minecraft Name |
| server | Server-Slug |
| item_id | minecraft:diamond |
| item_name | Anzeigename |
| quantity | Verkaufte Menge |
| price_per_item | Ankaufspreis pro Stück |
| total_paid | Ausgezahlter Gesamtbetrag |
| sold_at | Zeitstempel |
---
## `wis_fly_abos` *(Spigot MySQL)*
| Feld | Beschreibung |
|------|-------------|
| player_name | Minecraft Name |
| label | Anzeigename des Pakets |
| monthly_price | Monatlicher Beitrag (Vault) |
| cancelled | 0 / 1 – Kündigung vorgemerkt? |
| cancellation_reason | `user` oder `payment_failed` |
| next_billing_date | Datum der nächsten Abbuchung (immer 1. des Monats) |
| period_end | Letzter Tag der aktuellen Abo-Periode (Monatsende) |
| granted_at | Aktivierungszeitpunkt |
---
## `wis_fly_abo_usage` *(Spigot MySQL)*
| Feld | Beschreibung |
|------|-------------|
| player_name | Minecraft Name |
| usage_date | Datum (täglich) |
| used_sec | Verbrauchte Sekunden an diesem Tag |
---
## `wis_plot_extra_slots` *(Spigot MySQL)*
| Feld | Beschreibung |
|------|-------------|
| player_name | Minecraft Name |
| extra_slots | Dauerhaft gekaufte Zusatz-Slots |
| last_perm | Zuletzt gesetzter `plots.plot.<n>` Wert (für sauberes LP-Update) |
| granted_at | Zeitstempel der letzten Vergabe |
---
## `wis_plot_abos` *(Spigot MySQL)*
| Feld | Beschreibung |
|------|-------------|
| player_name | Minecraft Name |
| label | Anzeigename des Pakets |
| abo_slots | Anzahl der Abo-Slots |
| monthly_price | Monatlicher Beitrag (Vault) |
| cancelled | 0 / 1 – Kündigung vorgemerkt? |
| cancellation_reason | `user` oder `payment_failed` |
| next_billing_date | Datum der nächsten Abbuchung (immer 1. des Monats) |
| period_end | Letzter Tag der aktuellen Abo-Periode (Monatsende) |
| granted_at | Aktivierungszeitpunkt |
---
## `wp_wis_servers`
Serverdefinitionen
@@ -362,6 +800,120 @@ Bei 1500+ PNG-Dateien:
---
# 🗿 ArmorStand-Editor (SurvivalPlus)
## Übersicht
Der ArmorStand-Editor ermöglicht das vollständige Bearbeiten von ArmorStands direkt ingame – ohne externe Tools.
| Aktion | Beschreibung |
|--------|-------------|
| **Shift+Rechtsklick** auf einen ArmorStand | Editor öffnen |
| **Rechtsklick** auf einen ArmorStand | Hinterlegten BungeeCord-Command / Server-Switch ausführen |
| **Shift+Linksklick** auf einen ArmorStand | ArmorStand löschen |
**Benötigte Permissions:**
| Permission | Beschreibung | Standard |
|------------|-------------|---------|
| `survivalplus.armorstand.edit` | Editor öffnen, Ausrüstung & Pose bearbeiten | op |
| `survivalplus.armorstand.destroy` | ArmorStand per Shift+Linksklick löschen | op |
---
## Haupt-GUI
Öffnet sich per Shift+Rechtsklick oder `/asedit`.
| Slot | Funktion |
|------|---------|
| Sichtbarkeit | Sichtbar / Unsichtbar umschalten |
| Arme | Arme ein-/ausblenden |
| Basisplatte | Basisplatte ein-/ausblenden |
| Schwerkraft | Schwerkraft ein-/ausschalten |
| Größe | Normal / Klein umschalten |
| Unverletzlichkeit | Unverletzlich / Verletzlich umschalten |
| Namens-Anzeige | Customname ein-/ausblenden |
| Namen setzen | Namen per Chat eingeben (Farbcodes mit `&` möglich, `remove` zum Löschen) |
| Kopf / Körper / Arme / Beine | Pose-Sub-GUI öffnen |
| **Ausrüstung** | Ausrüstungs-GUI öffnen |
| **BungeeCord-Command** | BungeeCord-GUI öffnen |
| Pose zurücksetzen | Alle Winkel auf 0° setzen |
| Editor schließen | GUI schließen |
---
## Ausrüstungs-GUI
Öffnet sich über „Ausrüstung" im Haupt-GUI.
**Items setzen:**
- **Shift-Klick** auf ein Item im eigenen Inventar → wird automatisch in den richtigen Slot gesetzt (Helm, Brust, Beine, Schuhe, Mainhand)
- **Item auf Cursor nehmen** (normaler Klick im Inventar) und dann auf einen Ausrüstungs-Slot klicken → setzt das Item; altes Item kommt auf den Cursor zurück
**Items entfernen:**
- Auf einen besetzten Slot klicken **ohne** Cursor-Item → Item geht zurück ins Inventar
| Slot | Ausrüstungsplatz |
|------|----------------|
| 10 | Helm |
| 12 | Brustteil |
| 14 | Beinteil |
| 16 | Schuhe |
| 11 | Mainhand |
| 13 | Offhand |
**Automatische Slot-Erkennung beim Shift-Klick:**
| Item-Typ | Ziel-Slot |
|----------|----------|
| `*_HELMET`, `*_SKULL`, `*_HEAD`, Kürbis, Spielerkopf | Helm |
| `*_CHESTPLATE`, Elytra | Brust |
| `*_LEGGINGS` | Beine |
| `*_BOOTS` | Schuhe |
| Alles andere | Mainhand |
---
## Pose-GUI
Öffnet sich für Kopf, Körper, linken Arm, rechten Arm, linkes Bein oder rechtes Bein.
- Rotation auf **X-, Y- und Z-Achse** je in Schritten von **±5°** (fein) oder **±15°** (grob)
- Aktueller Winkel wird live angezeigt
- Zurück-Pfeil → Haupt-GUI
---
## BungeeCord-Command-GUI
Öffnet sich über „BungeeCord-Command" im Haupt-GUI.
| Option | Beschreibung |
|--------|-------------|
| **Server-Switch** | Spieler wird beim Rechtsklick auf den Stand zu einem anderen BungeeCord-Server weitergeleitet. Server-Namen im Chat eingeben (z.B. `lobby`). |
| **Command ausführen** | Führt beim Rechtsklick einen Befehl als Spieler aus. Befehl **ohne** `/` im Chat eingeben (z.B. `spawn`). |
| **Entfernen** | Löscht den hinterlegten Command/Server-Switch. |
> Mit `cancel` im Chat wird die Eingabe abgebrochen.
>
> Server-Switch und Command schließen sich gegenseitig aus – es kann nur eines aktiv sein.
Commands und Server-Switch-Daten werden im **Persistent Data Container (PDC)** des ArmorStands gespeichert und überleben Server-Neustarts.
---
## Befehle
| Befehl | Beschreibung | Permission |
|--------|-------------|------------|
| `/asedit` | Öffnet den Editor für den nächsten ArmorStand (≤ 5 Blöcke) | `survivalplus.armorstand.edit` |
| `/ascommand` | Alias für `/asedit` | `survivalplus.armorstand.edit` |
| `/showarmorstands [Radius]` | Macht unsichtbare ArmorStands sichtbar | `survivalplus.showarmorstands` |
| `/cleardebugarmorstands` | Entfernt alle Debug-ArmorStands | `survivalplus.cleardebugarmorstands` |
---
# 🔐 Sicherheitshinweis
Aktuell sind API-Endpunkte öffentlich (`__return_true`).
@@ -375,8 +927,6 @@ Für Produktion empfohlen:
---
# 📦 Meta
**Copyright © 2026 - M_Viper - Alle Rechte vorbehalten**
Version: 2.1.0
Autor: M_Viper
Lizenz: GPL-2.0-or-later
Die unbefugte Vervielfältigung, Verbreitung oder Weitergabe dieses Plugins ist strafbar und wird rechtlich verfolgt.
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff