Upload via GUI (14 Dateien)
This commit is contained in:
@@ -1,314 +1,371 @@
|
|||||||
# LandsChunkInfo – Anleitung
|
# LandsChunkInfo – Anleitung (Version 1.0.4)
|
||||||
|
|
||||||
Dieses Plugin ist eine Erweiterung für das **Lands**-Plugin. Es zeigt Spielern:
|
Dieses Plugin ist eine Erweiterung für das **Lands**-Plugin. Es bietet:
|
||||||
|
|
||||||
- wie viele Chunks sie schon besitzen,
|
- **Chunk-Übersicht:** wie viele Chunks ein Land belegt, wie viele frei und wie viele gesperrt sind.
|
||||||
- wie viele noch frei sind,
|
- **Wartezeit nach `/unclaim`:** Der Slot bleibt für eine einstellbare Zeit gesperrt. Die Spieler sehen, **wann wieder ein Chunk frei wird**.
|
||||||
- **wann wieder ein Chunk frei wird** (nach dem Unclaimen oder durch den Upkeep).
|
- **Upkeep-Anzeige:** wann das Land das nächste Mal zahlen muss.
|
||||||
|
- **Slot freikaufen** (`skip`, `gift`), **Auto-Claim-Warteschlange**, **Watchlist** und **zeitlich begrenzte Claims**.
|
||||||
Du brauchst keine Programmierkenntnisse. Diese Anleitung erklärt alles Schritt für Schritt.
|
- **PvP-Regionen:** Bereiche (z. B. eine Arena), in denen Spieler kämpfen dürfen, auch wenn sie im selben Land Mitglied sind.
|
||||||
|
- **Platzhalter** für PlaceholderAPI.
|
||||||
---
|
|
||||||
|
Du brauchst keine Programmierkenntnisse. Diese Anleitung erklärt alles Schritt für Schritt.
|
||||||
## 1. Was brauche ich?
|
|
||||||
|
---
|
||||||
| Was | Pflicht? | Wofür |
|
|
||||||
|---|---|---|
|
## 1. Was brauche ich?
|
||||||
| Ein Minecraft-Server mit **Paper** (Version 1.21 bis 26) | Ja | Das Plugin läuft darauf |
|
|
||||||
| **Java 25** auf dem Server | Ja | Lands 8.8.0 braucht das ebenfalls |
|
| Was | Pflicht? | Wofür |
|
||||||
| Das Plugin **Lands** (Version 8.8.0) | Ja | Ohne Lands startet unser Plugin nicht |
|
|---|---|---|
|
||||||
| **Vault** + ein Economy-Plugin (z. B. EssentialsX) | Nein | Nur für das Bezahlen mit Spielergeld (`skip`, `gift`) |
|
| Ein Minecraft-Server mit **Paper** (Version 1.21 bis 26) | Ja | Das Plugin läuft darauf |
|
||||||
| **PlaceholderAPI** | Nein | Nur für Platzhalter in Scoreboard, Tab-Liste usw. |
|
| **Java 25** auf dem Server | Ja | Lands 8.8.0 braucht das ebenfalls |
|
||||||
|
| Das Plugin **Lands** (Version 8.8.0) | Ja | Ohne Lands startet dieses Plugin nicht |
|
||||||
Folia wird **nicht** unterstützt.
|
| **Vault** + ein Economy-Plugin (z. B. EssentialsX) | Nein | Nur zum Bezahlen mit Spielergeld (`skip`, `gift`) |
|
||||||
|
| **PlaceholderAPI** | Nein | Nur für Platzhalter in Scoreboard, Tab-Liste usw. |
|
||||||
---
|
|
||||||
|
Folia wird **nicht** unterstützt.
|
||||||
## 2. Installation (5 Schritte)
|
|
||||||
|
---
|
||||||
1. Stoppe den Server (oder lass ihn laufen, ein Neustart ist trotzdem später nötig).
|
|
||||||
2. Kopiere die Datei `LandsChunkInfo-1.0.3.jar` in den Ordner `plugins` deines Servers. Dort liegt auch die Lands-Jar.
|
## 2. Installation und Update
|
||||||
3. Starte den Server neu.
|
|
||||||
4. Schau in die Konsole. Du solltest `[LandsChunkInfo] Enabling LandsChunkInfo` sehen. Steht dort ein roter Fehler, lies Abschnitt 9.
|
1. Stoppe den Server.
|
||||||
5. Im Ordner `plugins/LandsChunkInfo/` wurde jetzt eine Datei `config.yml` erstellt. Dort kannst du alles einstellen (Abschnitt 5).
|
2. Kopiere `LandsChunkInfo-1.0.4.jar` in den Ordner `plugins` deines Servers (dort liegt auch die Lands-Jar).
|
||||||
|
**Bei einem Update:** Lösche zuerst die alte `LandsChunkInfo-*.jar`. Es darf nur **eine** Version im Ordner liegen.
|
||||||
Fertig. Spieler können ab sofort `/chunkinfo` benutzen.
|
3. Starte den Server.
|
||||||
|
4. Schau in die Konsole. Du solltest `[LandsChunkInfo] Enabling LandsChunkInfo` sehen. Steht dort ein roter Fehler, lies Abschnitt 11.
|
||||||
---
|
5. Beim ersten Start wird `plugins/LandsChunkInfo/config.yml` erstellt. Dort stellst du alles ein (Abschnitt 7).
|
||||||
|
|
||||||
## 3. Was können die Spieler? (Befehle)
|
**Wichtig:** Nach dem Austausch der Jar-Datei ist immer ein **Neustart** nötig. `/reload` reicht nicht und kann Fehler verursachen.
|
||||||
|
|
||||||
Der Hauptbefehl heißt `/chunkinfo`. Es gehen auch die Kurzformen `/chunks` und `/chunkslots`.
|
Deine Dateien in `plugins/LandsChunkInfo/` (`config.yml`, `data.yml`, `pvp-regions.yml`) bleiben bei einem Update erhalten.
|
||||||
|
|
||||||
### Übersicht anzeigen
|
---
|
||||||
|
|
||||||
| Befehl | Was passiert |
|
## 3. Der Befehl
|
||||||
|---|---|
|
|
||||||
| `/chunkinfo` | Zeigt alle deine Lands: Chunks belegt, Chunks frei, gesperrte Slots, wann der nächste Chunk frei wird, Upkeep |
|
Der Hauptbefehl heißt **`/chunks`**. Es gibt die Kurzform `/chunkslots`.
|
||||||
| `/chunkinfo MeinLand` | Zeigt nur dieses eine Land |
|
|
||||||
| `/chunkinfo top` | Zeigt die Lands mit den meisten Chunks |
|
> **Hinweis:** Der Name `/chunks` wird bewusst nicht benutzt, weil WorldEdit/FastAsyncWorldEdit einen eigenen Befehl `/chunks` hat. Der würde sonst mit diesem Plugin kollidieren (Fehler „Too many arguments“).
|
||||||
|
|
||||||
**Beispiel einer Anzeige:**
|
---
|
||||||
|
|
||||||
```
|
## 4. Was können die Spieler?
|
||||||
Deine Chunks
|
|
||||||
Von dir geclaimt: 12 / 20
|
### Übersicht anzeigen
|
||||||
MeinLand
|
|
||||||
Chunks: 12 / 20 | Frei: 6 | Gesperrt: 2
|
| Befehl | Was passiert |
|
||||||
Nächster Chunk wieder frei in: 3Std 12Min (23.10. 14:30)
|
|---|---|
|
||||||
Sofort freischalten: /chunkinfo skip (Preis: 80,00)
|
| `/chunks` | Zeigt alle deine Lands: Chunks belegt, frei, gesperrt, wann der nächste Chunk frei wird, Upkeep |
|
||||||
Upkeep: 36,00 pro Zyklus, nächster Einzug in 2T 4Std
|
| `/chunks MeinLand` | Zeigt nur dieses eine Land |
|
||||||
```
|
| `/chunks top` | Zeigt die Lands mit den meisten Chunks |
|
||||||
|
|
||||||
Was bedeuten die Wörter?
|
**Beispiel einer Anzeige:**
|
||||||
|
|
||||||
- **Frei** = So viele Chunks kannst du jetzt sofort claimen.
|
```
|
||||||
- **Gesperrt** = Du hast einen Chunk abgegeben (`/unclaim`). Dieser Platz ist für eine Weile blockiert. Nach der Wartezeit ist er wieder frei.
|
Deine Chunks
|
||||||
- **Upkeep** = Die regelmäßige Gebühr, die dein Land zahlen muss, damit es seine Chunks behält.
|
Von dir geclaimt: 12 / 20
|
||||||
|
MeinLand
|
||||||
### Gesperrten Slot sofort freikaufen
|
Chunks: 12 / 20 | Frei: 6 | Gesperrt: 2
|
||||||
|
Nächster Chunk wieder frei in: 3Std 12Min (23.10. 14:30)
|
||||||
Du willst nicht warten? Dann kauf den Slot frei.
|
Danach: 20Std 5Min
|
||||||
|
Sofort freischalten: /chunks skip (Preis: 80,00)
|
||||||
| Befehl | Was passiert |
|
Upkeep: 36,00 pro Zyklus, nächster Einzug in 2T 4Std
|
||||||
|---|---|
|
```
|
||||||
| `/chunkinfo skip` | Zeigt dir den Preis |
|
|
||||||
| `/chunkinfo skip confirm` | Kauft den Slot wirklich. Ohne `confirm` wird **nichts** bezahlt |
|
Was bedeuten die Wörter?
|
||||||
| `/chunkinfo gift MeinFreundLand` | Zeigt den Preis, um einen Slot in einem **fremden** Land freizukaufen |
|
|
||||||
| `/chunkinfo gift MeinFreundLand confirm` | Kauft den Slot für das fremde Land. Die Mitglieder werden benachrichtigt |
|
- **Frei** = So viele Chunks kann das Land jetzt sofort claimen.
|
||||||
|
- **Gesperrt** = Jemand hat einen Chunk abgegeben (`/unclaim`). Dieser Platz ist für eine Weile blockiert. Nach der Wartezeit ist er wieder frei.
|
||||||
Der Preis wird günstiger, je kürzer die Wartezeit noch ist.
|
- **Upkeep** = Die regelmäßige Gebühr, die das Land zahlen muss, damit es seine Chunks behält.
|
||||||
|
- Wenn das Land-Guthaben für den Upkeep nicht reicht, steht eine rote Warnung dabei (und, wenn Lands beim Upkeep Chunks abzieht, wie viele verloren gehen würden).
|
||||||
### Chunk vormerken (Warteschlange)
|
- Wenn Lands Inaktivität einstellt, steht dort auch, ob der Besitzer online ist oder wann das Land als inaktiv gilt.
|
||||||
|
|
||||||
Der Chunk, auf dem du **gerade stehst**, ist frei, aber dein Land hat keinen freien Slot? Dann merk ihn vor. Sobald ein Slot frei wird, claimt das Plugin ihn **automatisch** für dich.
|
### Gesperrten Slot sofort freikaufen
|
||||||
|
|
||||||
| Befehl | Was passiert |
|
| Befehl | Was passiert |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `/chunkinfo queue` | Merkt den Chunk vor, auf dem du stehst (für dein Land) |
|
| `/chunks skip` | Zeigt den Preis für den nächsten gesperrten Slot deines Lands |
|
||||||
| `/chunkinfo queue MeinLand` | Dasselbe, aber für ein bestimmtes Land |
|
| `/chunks skip confirm` | Kauft den Slot wirklich. Ohne `confirm` wird **nichts** bezahlt |
|
||||||
| `/chunkinfo queue list` | Zeigt deine vorgemerkten Chunks |
|
| `/chunks skip MeinLand confirm` | Dasselbe für ein bestimmtes eigenes Land |
|
||||||
| `/chunkinfo queue clear` | Löscht alle deine Vormerkungen |
|
| `/chunks gift FremdesLand` | Zeigt den Preis, um einen Slot in einem **fremden** Land freizukaufen |
|
||||||
|
| `/chunks gift FremdesLand confirm` | Kauft den Slot. Die online Mitglieder des Lands werden benachrichtigt |
|
||||||
Wichtig: **Du musst online sein**, damit der Chunk geclaimt wird.
|
|
||||||
|
Der Preis wird günstiger, je kürzer die Wartezeit noch ist. Es wird immer der Slot freigekauft, der am frühesten frei würde.
|
||||||
### Fremden Chunk beobachten (Watchlist)
|
|
||||||
|
### Chunk vormerken (Warteschlange)
|
||||||
Ein Chunk gehört jemand anderem, und du willst ihn haben, falls er frei wird? Stell dich drauf:
|
|
||||||
|
Der Chunk, auf dem du **gerade stehst**, ist frei, aber dein Land hat keinen freien Slot? Dann merk ihn vor. Sobald ein Slot frei wird, claimt das Plugin ihn **automatisch** für dich.
|
||||||
| Befehl | Was passiert |
|
|
||||||
|---|---|
|
| Befehl | Was passiert |
|
||||||
| `/chunkinfo watch` | Du bekommst eine Nachricht, sobald dieser Chunk frei wird |
|
|---|---|
|
||||||
| `/chunkinfo watch list` | Zeigt, was du beobachtest |
|
| `/chunks queue` | Merkt den Chunk vor, auf dem du stehst (für dein Hauptland) |
|
||||||
| `/chunkinfo watch clear` | Hört mit allem auf |
|
| `/chunks queue MeinLand` | Dasselbe, aber für ein bestimmtes Land |
|
||||||
|
| `/chunks queue list` | Zeigt deine vorgemerkten Chunks |
|
||||||
Tipp: Wenn die Nachricht kommt, nutze danach `/chunkinfo queue`, um ihn dir zu sichern.
|
| `/chunks queue clear` | Löscht alle deine Vormerkungen |
|
||||||
|
|
||||||
### Chunk nur für kurze Zeit (Temp-Claim)
|
Wichtig: **Du musst online sein**, damit der Chunk geclaimt wird. Ist der Chunk inzwischen von jemand anderem geclaimt, wird die Vormerkung gelöscht.
|
||||||
|
|
||||||
Du brauchst einen Chunk nur für ein paar Tage (z. B. für ein Event)? Stell dich in den Chunk (er muss zu **deinem eigenen** Land gehören):
|
### Fremden Chunk beobachten (Watchlist)
|
||||||
|
|
||||||
| Befehl | Was passiert |
|
Ein Chunk gehört jemand anderem, und du willst ihn haben, falls er frei wird? Stell dich drauf:
|
||||||
|---|---|
|
|
||||||
| `/chunkinfo temp 7` | Der Chunk wird nach 7 Tagen automatisch freigegeben |
|
| Befehl | Was passiert |
|
||||||
| `/chunkinfo temp list` | Zeigt deine Temp-Chunks |
|
|---|---|
|
||||||
| `/chunkinfo temp cancel` | Nimmt dem Chunk, auf dem du stehst, das Ablaufdatum wieder weg |
|
| `/chunks watch` | Du bekommst eine Nachricht, sobald dieser Chunk frei wird |
|
||||||
|
| `/chunks watch list` | Zeigt, was du beobachtest |
|
||||||
Wenn ein Temp-Chunk abläuft, wird dadurch **kein** Slot gesperrt.
|
| `/chunks watch clear` | Hört mit allem auf |
|
||||||
|
|
||||||
---
|
Tipp: Wenn die Nachricht kommt, nutze danach `/chunks queue`, um ihn dir zu sichern.
|
||||||
|
|
||||||
## 4. Die Platzhalter (optional)
|
### Chunk nur für kurze Zeit (Temp-Claim)
|
||||||
|
|
||||||
Nur nötig, wenn du **PlaceholderAPI** hast und die Werte z. B. im Scoreboard oder in der Tab-Liste anzeigen willst. Die Werte beziehen sich auf das Hauptland des Spielers (sein eigenes Land, sonst das erste Land, in dem er vertraut ist).
|
Du brauchst einen Chunk nur für ein paar Tage (z. B. für ein Event)? Stell dich in den Chunk. Er muss zu **deinem eigenen** Land gehören (du musst der Besitzer sein):
|
||||||
|
|
||||||
| Platzhalter | Zeigt |
|
| Befehl | Was passiert |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `%chunkinfo_land%` | Name des Lands |
|
| `/chunks temp 7` | Der Chunk wird nach 7 Tagen automatisch freigegeben |
|
||||||
| `%chunkinfo_used%` | Belegte Chunks |
|
| `/chunks temp list` | Zeigt die Temp-Chunks deiner Lands |
|
||||||
| `%chunkinfo_max%` | Maximale Chunks |
|
| `/chunks temp cancel` | Nimmt dem Chunk, auf dem du stehst, das Ablaufdatum wieder weg |
|
||||||
| `%chunkinfo_free%` | Freie Chunks |
|
|
||||||
| `%chunkinfo_locked%` | Gesperrte Slots |
|
Wenn ein Temp-Chunk abläuft, wird dadurch **kein** Slot gesperrt.
|
||||||
| `%chunkinfo_next_free%` | Zeit, bis der nächste Slot frei wird (`-` wenn keiner gesperrt ist) |
|
|
||||||
| `%chunkinfo_upkeep%` | Upkeep-Kosten pro Zyklus |
|
### Hinweis beim Einloggen
|
||||||
| `%chunkinfo_upkeep_in%` | Zeit bis zum nächsten Upkeep |
|
|
||||||
| `%chunkinfo_top_1_name%` | Name des Lands auf Platz 1 (statt 1 geht jede Zahl) |
|
Beim Einloggen (kurz nach dem Join) sagt das Plugin dem Spieler, wie viele Slots in seinen Lands frei sind und wann der nächste gesperrte Slot frei wird. Der Besitzer bekommt zusätzlich eine Warnung, wenn das Land-Guthaben nicht für den Upkeep reicht und der Einzug bald ansteht.
|
||||||
| `%chunkinfo_top_1_chunks%` | Chunks des Lands auf Platz 1 |
|
|
||||||
|
---
|
||||||
---
|
|
||||||
|
## 5. PvP-Regionen (für Admins)
|
||||||
## 5. Einstellungen (config.yml)
|
|
||||||
|
### Wozu?
|
||||||
Die Datei findest du unter `plugins/LandsChunkInfo/config.yml`. Öffne sie mit einem Texteditor (Notepad++ oder VS Code, **nicht** mit dem Windows-Notepad, wenn du auf Umlaute achtest). Nach einer Änderung gibst du im Spiel oder in der Konsole `/chunkinfo reload` ein.
|
|
||||||
|
Lands verbietet PvP in der **Wildnis** zwischen Spielern, die im selben Land Mitglied sind (Meldung: „Du kannst diesen Spieler nicht in der Wildnis angreifen, weil er Mitglied in einem deiner Länder ist“). Mit einer PvP-Region kannst du einen Bereich festlegen, in dem trotzdem gekämpft werden darf, z. B. eine Arena.
|
||||||
**Wichtig:** Lass die Einrückungen (die Leerzeichen am Zeilenanfang) unverändert. Ändere nur die Werte hinter dem Doppelpunkt.
|
|
||||||
|
### Region anlegen
|
||||||
### Wartezeit nach dem Unclaimen
|
|
||||||
|
Du brauchst das Recht `landschunkinfo.admin` (Standard: OPs).
|
||||||
```yaml
|
|
||||||
unclaim-cooldown:
|
1. Stell dich an die erste Ecke der Arena: `/chunks pvp pos1`
|
||||||
enabled: true
|
2. Stell dich an die gegenüberliegende Ecke: `/chunks pvp pos2`
|
||||||
duration: 24h
|
3. Lege die Region an: `/chunks pvp create arena`
|
||||||
enforce: true
|
|
||||||
```
|
| Befehl | Was passiert |
|
||||||
|
|---|---|
|
||||||
- `enabled` – `true` = Funktion an, `false` = aus.
|
| `/chunks pvp pos1` | Setzt die erste Ecke an deiner Position |
|
||||||
- `duration` – Wie lange ein Slot nach `/unclaim` gesperrt bleibt. Schreibweise:
|
| `/chunks pvp pos2` | Setzt die zweite Ecke an deiner Position |
|
||||||
- `30m` = 30 Minuten
|
| `/chunks pvp create <Name>` | Legt die Region aus den beiden Ecken an |
|
||||||
- `12h` = 12 Stunden
|
| `/chunks pvp delete <Name>` | Löscht die Region |
|
||||||
- `2d` = 2 Tage
|
| `/chunks pvp list` | Zeigt alle Regionen |
|
||||||
- `1d12h` = 1 Tag und 12 Stunden
|
|
||||||
- `enforce` – `true` = Spieler können in dieser Zeit wirklich **nicht** neu claimen. `false` = es wird nur angezeigt, aber nichts blockiert.
|
### Wie funktioniert das?
|
||||||
|
|
||||||
### Upkeep-Zeitpunkt
|
- Die Regionen sind **Rechtecke über die ganze Höhe**. Beide Ecken müssen in derselben Welt liegen.
|
||||||
|
- Solange ein Spieler in einer PvP-Region steht, bekommt er automatisch das Lands-Recht `lands.bypass.attack_player`. Lands prüft den Angriff dann nicht, und die rote Meldung bleibt aus. Verlässt er die Region, wird das Recht wieder entzogen.
|
||||||
```yaml
|
- Falls Lands einen Schlag trotzdem abbricht, wird er freigegeben, wenn **Angreifer und Opfer beide** in der Region stehen. Das gilt auch für Pfeile und andere Projektile.
|
||||||
upkeep:
|
- Der Rückstoß wird in der Region ebenfalls freigegeben.
|
||||||
anchor-date: ""
|
- **Außerhalb** der Region ändert sich nichts. Dort gelten weiter die Regeln von Lands.
|
||||||
```
|
- Die Regionen werden in `plugins/LandsChunkInfo/pvp-regions.yml` gespeichert.
|
||||||
|
|
||||||
Das Plugin merkt sich automatisch, wann Lands das erste Mal Upkeep eingezogen hat, und rechnet danach weiter. **Bis dahin ist die Anzeige nur geschätzt.** Wenn du genau weißt, an welchem Tag zuletzt eingezogen wurde, trage das Datum ein, zum Beispiel `"2026-10-15"`.
|
### Wichtig für die Server-Einrichtung
|
||||||
|
|
||||||
### Slot freikaufen
|
Die PvP-Region von diesem Plugin ist eine **zusätzliche** Region. Sie ersetzt keine WorldGuard-Region. Wenn du PvP sonst überall verbieten willst, regelst du das weiterhin in WorldGuard (z. B. `pvp deny` für die ganze Welt und `pvp allow` für die Arena). Lege die Region von diesem Plugin am besten genauso groß wie die WorldGuard-Arena an.
|
||||||
|
|
||||||
```yaml
|
Alternative ohne dieses Plugin: In der Lands-Config (`plugins/Lands/config.yml`) gibt es unter `combat:` die Option `ally-wilderness`. Steht sie auf `true`, dürfen Spieler mit gemeinsamem Land überall in der Wildnis kämpfen. Nach einer Änderung ist ein Neustart nötig.
|
||||||
skip:
|
|
||||||
enabled: true
|
---
|
||||||
payment: PLAYER
|
|
||||||
price-per-hour: 25.0
|
## 6. Die Platzhalter (optional)
|
||||||
min-price: 50.0
|
|
||||||
```
|
Nur nötig, wenn du **PlaceholderAPI** hast und die Werte z. B. im Scoreboard oder in der Tab-Liste anzeigen willst. Die Werte beziehen sich auf das Hauptland des Spielers (sein eigenes Land, sonst das erste Land, in dem er vertraut ist).
|
||||||
|
|
||||||
- `payment` – `PLAYER` = das Geld kommt vom Spieler (Vault nötig). `LAND` = das Geld kommt aus der Landkasse (nur der Besitzer darf das). `gift` bezahlt immer der Spieler selbst.
|
| Platzhalter | Zeigt |
|
||||||
- `price-per-hour` – Preis pro verbleibender Stunde Wartezeit.
|
|---|---|
|
||||||
- `min-price` – Mindestpreis, auch wenn nur noch wenige Minuten fehlen.
|
| `%chunkinfo_land%` | Name des Lands (`-` ohne Land) |
|
||||||
|
| `%chunkinfo_used%` | Belegte Chunks |
|
||||||
Beispiel: Noch 10 Stunden Wartezeit, 25 pro Stunde ergibt 250.
|
| `%chunkinfo_max%` | Maximale Chunks (oder `unbegrenzt`) |
|
||||||
|
| `%chunkinfo_free%` | Freie Chunks (oder `unbegrenzt`) |
|
||||||
### Warteschlange, Watchlist, Temp-Claims
|
| `%chunkinfo_locked%` | Gesperrte Slots |
|
||||||
|
| `%chunkinfo_next_free%` | Zeit, bis der nächste Slot frei wird (`-` wenn keiner gesperrt ist) |
|
||||||
```yaml
|
| `%chunkinfo_upkeep%` | Upkeep-Kosten pro Zyklus |
|
||||||
queue:
|
| `%chunkinfo_upkeep_in%` | Zeit bis zum nächsten Upkeep |
|
||||||
max: 3
|
| `%chunkinfo_top_1_name%` | Name des Lands auf Platz 1 (statt 1 geht jede Zahl) |
|
||||||
watch:
|
| `%chunkinfo_top_1_chunks%` | Chunks des Lands auf Platz 1 |
|
||||||
max: 5
|
|
||||||
temp-claims:
|
---
|
||||||
enabled: true
|
|
||||||
max-days: 30
|
## 7. Einstellungen (config.yml)
|
||||||
max-per-land: 3
|
|
||||||
```
|
Die Datei findest du unter `plugins/LandsChunkInfo/config.yml`. Öffne sie mit einem Texteditor (Notepad++ oder VS Code). Nach einer Änderung gibst du im Spiel oder in der Konsole `/chunks reload` ein (braucht das Recht `landschunkinfo.admin`).
|
||||||
|
|
||||||
- `max` – Wie viele Einträge ein Spieler gleichzeitig haben darf.
|
**Wichtig:** Lass die Einrückungen (die Leerzeichen am Zeilenanfang) unverändert. Ändere nur die Werte hinter dem Doppelpunkt.
|
||||||
- `max-days` – Längste erlaubte Dauer für einen Temp-Chunk.
|
|
||||||
- `max-per-land` – Wie viele Temp-Chunks ein Land gleichzeitig haben darf.
|
### Wartezeit nach dem Unclaimen
|
||||||
|
|
||||||
### Hinweis beim Einloggen
|
```yaml
|
||||||
|
unclaim-cooldown:
|
||||||
```yaml
|
enabled: true
|
||||||
join-reminder:
|
duration: 24h
|
||||||
enabled: true
|
enforce: true
|
||||||
upkeep-warning-hours: 48
|
```
|
||||||
```
|
|
||||||
|
- `enabled` – `true` = Funktion an, `false` = aus.
|
||||||
Beim Einloggen sagt das Plugin dem Spieler, wie viele Slots frei sind. Wenn das Guthaben des Lands nicht für den Upkeep reicht und der Einzug in weniger als `upkeep-warning-hours` Stunden ansteht, kommt zusätzlich eine Warnung (nur für den Besitzer).
|
- `duration` – Wie lange ein Slot nach `/unclaim` gesperrt bleibt. Schreibweise:
|
||||||
|
- `30m` = 30 Minuten
|
||||||
### Texte ändern
|
- `12h` = 12 Stunden
|
||||||
|
- `2d` = 2 Tage
|
||||||
Unter `messages:` stehen die Meldungen. Farben schreibst du mit `&`:
|
- `1d12h` = 1 Tag und 12 Stunden
|
||||||
|
- `enforce` – `true` = Das Land kann in dieser Zeit wirklich **nicht** neu claimen, wenn alle Plätze belegt oder gesperrt sind. `false` = es wird nur angezeigt, aber nichts blockiert.
|
||||||
- `&a` = grün, `&c` = rot, `&e` = gelb, `&7` = grau
|
|
||||||
|
### Upkeep-Zeitpunkt
|
||||||
`%time%` wird im Spiel durch die Restzeit ersetzt. Lass es stehen.
|
|
||||||
|
```yaml
|
||||||
---
|
upkeep:
|
||||||
|
anchor-date: ""
|
||||||
## 6. Rechte (Permissions)
|
```
|
||||||
|
|
||||||
Rechte vergibst du mit einem Rechte-Plugin, z. B. LuckPerms.
|
Das Plugin liest den Rhythmus aus der Lands-Config und merkt sich automatisch, wann Lands das erste Mal Upkeep eingezogen hat. **Bis dahin ist die Anzeige nur geschätzt.** Wenn du genau weißt, an welchem Tag zuletzt eingezogen wurde, trage das Datum ein, zum Beispiel `"2026-10-15"`.
|
||||||
|
|
||||||
| Recht | Wer bekommt es standardmäßig? | Was erlaubt es? |
|
### Slot freikaufen
|
||||||
|---|---|---|
|
|
||||||
| `landschunkinfo.use` | Alle | `/chunkinfo` und `top` benutzen |
|
```yaml
|
||||||
| `landschunkinfo.skip` | Alle | Eigenen Slot freikaufen |
|
skip:
|
||||||
| `landschunkinfo.gift` | Alle | Slot in fremdem Land freikaufen |
|
enabled: true
|
||||||
| `landschunkinfo.queue` | Alle | Warteschlange benutzen |
|
payment: PLAYER
|
||||||
| `landschunkinfo.watch` | Alle | Watchlist benutzen |
|
price-per-hour: 25.0
|
||||||
| `landschunkinfo.temp` | Alle | Temp-Claims benutzen |
|
min-price: 50.0
|
||||||
| `landschunkinfo.bypass` | Nur OPs | Wartezeit nach dem Unclaimen gilt **nicht** |
|
```
|
||||||
| `landschunkinfo.admin` | Nur OPs | `/chunkinfo reload` |
|
|
||||||
|
- `payment` – `PLAYER` = das Geld kommt vom Spieler (Vault nötig). `LAND` = das Geld kommt aus der Landkasse (nur der Besitzer darf das). `gift` bezahlt immer der Spieler selbst.
|
||||||
**Beispiel:** Du willst, dass niemand außer Teammitgliedern Slots verschenken darf. Entziehe allen das Recht `landschunkinfo.gift` und gib es nur der Team-Gruppe.
|
- `price-per-hour` – Preis pro verbleibender Stunde Wartezeit.
|
||||||
|
- `min-price` – Mindestpreis, auch wenn nur noch wenige Minuten fehlen.
|
||||||
---
|
|
||||||
|
Beispiel: Noch 10 Stunden Wartezeit, 25 pro Stunde ergibt 250.
|
||||||
## 7. Häufige Fragen
|
|
||||||
|
### Warteschlange, Watchlist, Temp-Claims, Top-Liste
|
||||||
**Warum sieht ein Spieler „Gesperrt“, obwohl er nichts gemacht hat?**
|
|
||||||
Jemand aus seinem Land hat einen Chunk abgegeben. Die Sperre gilt für das **ganze Land**, nicht für einzelne Spieler.
|
```yaml
|
||||||
|
queue:
|
||||||
**Warum wird bei manchen Unclaims nichts gesperrt?**
|
max: 3
|
||||||
Gesperrt wird nur, wenn ein Spieler selbst `/unclaim` benutzt. Nicht gesperrt wird, wenn das Land gelöscht wird, Chunks durch den Upkeep verloren gehen oder ein Temp-Chunk abläuft. Spieler mit dem Recht `landschunkinfo.bypass` lösen ebenfalls keine Sperre aus.
|
watch:
|
||||||
|
max: 5
|
||||||
**Die Upkeep-Zeit stimmt nicht.**
|
temp-claims:
|
||||||
Lands verrät dem Plugin nicht, wann genau der Zyklus gestartet ist. Nach dem ersten echten Einzug passt die Anzeige. Alternativ trägst du in `upkeep.anchor-date` ein bekanntes Einzugsdatum ein.
|
enabled: true
|
||||||
|
max-days: 30
|
||||||
**Muss ich das Plugin nach jeder Änderung neu starten?**
|
max-per-land: 3
|
||||||
Nein. Für Änderungen an der `config.yml` reicht `/chunkinfo reload`. Nur beim Austausch der Jar-Datei brauchst du einen Neustart.
|
top:
|
||||||
|
size: 10
|
||||||
**Verlieren Spieler ihre Chunks, wenn ich das Plugin entferne?**
|
```
|
||||||
Nein. Das Plugin ändert keine Lands-Daten außer bei zwei Dingen: Wenn die Warteschlange einen Chunk claimt oder wenn ein Temp-Chunk abläuft. Entfernst du das Plugin, bleiben alle bestehenden Chunks gleich. Die gespeicherten Sperren und Listen liegen nur in `plugins/LandsChunkInfo/data.yml`.
|
|
||||||
|
- `max` – Wie viele Einträge ein Spieler gleichzeitig haben darf.
|
||||||
**Kann ich einem Spieler mehr Chunk-Slots geben?**
|
- `max-days` – Längste erlaubte Dauer für einen Temp-Chunk.
|
||||||
Nein, das geht nur in Lands selbst (`player-limits.yml`). Dieses Plugin ändert keine Limits.
|
- `max-per-land` – Wie viele Temp-Chunks ein Land gleichzeitig haben darf.
|
||||||
|
- `top.size` – Wie viele Lands in `/chunks top` stehen.
|
||||||
---
|
|
||||||
|
### Hinweis beim Einloggen
|
||||||
## 8. Datensicherung
|
|
||||||
|
```yaml
|
||||||
Alles, was sich das Plugin merkt (Sperren, Warteschlange, Watchlist, Temp-Chunks, letzter Upkeep), steht in:
|
join-reminder:
|
||||||
|
enabled: true
|
||||||
`plugins/LandsChunkInfo/data.yml`
|
upkeep-warning-hours: 48
|
||||||
|
```
|
||||||
Wenn du den Server umziehst oder ein Backup machst, kopiere diese Datei und die `config.yml` mit. **Bearbeite `data.yml` nicht von Hand, solange der Server läuft.** Das Plugin überschreibt die Datei sonst.
|
|
||||||
|
Mit `enabled: false` schaltest du den Hinweis ab. `upkeep-warning-hours` legt fest, ab wie vielen Stunden vor dem Einzug die Upkeep-Warnung kommt.
|
||||||
---
|
|
||||||
|
### Texte ändern
|
||||||
## 9. Wenn etwas nicht klappt
|
|
||||||
|
Unter `messages:` stehen die Meldungen. Farben schreibst du mit `&`:
|
||||||
| Problem | Lösung |
|
|
||||||
|---|---|
|
- `&a` = grün, `&c` = rot, `&e` = gelb, `&7` = grau
|
||||||
| Plugin startet nicht, in der Konsole steht etwas mit „Lands“ | Lands fehlt oder ist nicht aktiv. Prüfe, ob die Lands-Jar im Ordner `plugins` liegt und startet |
|
|
||||||
| Fehler mit „Unsupported class file version“ oder „Java“ | Der Server läuft mit einem zu alten Java. Du brauchst **Java 25** |
|
`%time%` wird im Spiel durch die Restzeit ersetzt. Lass es stehen.
|
||||||
| `/chunkinfo` sagt „Du bist in keinem Land Mitglied“ | Der Spieler hat kein Land und ist in keinem als vertrauenswürdig eingetragen. Das ist normal |
|
|
||||||
| `skip` oder `gift` meldet, Vault fehle | Installiere Vault und ein Economy-Plugin, oder stelle `skip.payment` auf `LAND` (dann geht nur `skip`, `gift` bleibt gesperrt) |
|
---
|
||||||
| Die Platzhalter zeigen sich als Text, z. B. `%chunkinfo_used%` | PlaceholderAPI fehlt oder wurde nach unserem Plugin geladen. Starte den Server neu |
|
|
||||||
| Änderungen an der `config.yml` wirken nicht | `/chunkinfo reload` ausführen. Falls es trotzdem nicht klappt: Auf Einrückungen und fehlende Anführungszeichen prüfen |
|
## 8. Rechte (Permissions)
|
||||||
| Spieler können nach dem Unclaimen trotzdem sofort claimen | Prüfe `unclaim-cooldown.enforce`, das muss `true` sein. Und prüfe, ob der Spieler das Recht `landschunkinfo.bypass` hat (OPs haben es automatisch) |
|
|
||||||
|
Rechte vergibst du mit einem Rechte-Plugin, z. B. LuckPerms.
|
||||||
Wenn du nicht weiterkommst: Kopiere die **roten Zeilen aus der Server-Konsole** (oder aus `logs/latest.log`) und gib sie weiter. Daraus lässt sich fast immer die Ursache erkennen.
|
|
||||||
|
| Recht | Wer bekommt es standardmäßig? | Was erlaubt es? |
|
||||||
---
|
|---|---|---|
|
||||||
|
| `landschunkinfo.use` | Alle | `/chunks`, `top` und den Hinweis beim Einloggen |
|
||||||
## 10. Bekannte Grenzen
|
| `landschunkinfo.skip` | Alle | Eigenen Slot freikaufen |
|
||||||
|
| `landschunkinfo.gift` | Alle | Slot in fremdem Land freikaufen |
|
||||||
- Das Plugin wurde noch nicht auf einem echten Server getestet. Probiere es erst auf einem Testserver aus.
|
| `landschunkinfo.queue` | Alle | Warteschlange benutzen |
|
||||||
- Die Upkeep-Zeit ist bis zum ersten echten Einzug eine Schätzung.
|
| `landschunkinfo.watch` | Alle | Watchlist benutzen |
|
||||||
- Die Warteschlange und die Watchlist arbeiten nur für Spieler, die **online** sind.
|
| `landschunkinfo.temp` | Alle | Temp-Claims benutzen |
|
||||||
- Temp-Chunks laufen erst ab, wenn der Ersteller oder der Besitzer des Lands online ist.
|
| `landschunkinfo.bypass` | Nur OPs | Wartezeit nach dem Unclaimen gilt **nicht** |
|
||||||
- Lands-Limits (z. B. maximale Chunks) kann das Plugin nicht verändern.
|
| `landschunkinfo.admin` | Nur OPs | `/chunks reload` und `/chunks pvp ...` |
|
||||||
|
|
||||||
---
|
**Beispiel:** Du willst, dass niemand außer Teammitgliedern Slots verschenken darf. Entziehe allen das Recht `landschunkinfo.gift` und gib es nur der Team-Gruppe.
|
||||||
|
|
||||||
## 11. PvP-Regionen (neu in 1.0.2, erweitert in 1.0.3)
|
---
|
||||||
|
|
||||||
Lands blockiert PvP in der Wildnis zwischen Spielern, die im selben Land Mitglied sind. Mit PvP-Regionen kannst du Bereiche festlegen, in denen trotzdem gekämpft werden darf (z. B. eine Arena).
|
## 9. Häufige Fragen
|
||||||
|
|
||||||
| Befehl | Was passiert |
|
**Warum sieht ein Spieler „Gesperrt“, obwohl er nichts gemacht hat?**
|
||||||
|---|---|
|
Jemand aus seinem Land hat einen Chunk abgegeben. Die Sperre gilt für das **ganze Land**, nicht für einzelne Spieler.
|
||||||
| `/chunkinfo pvp pos1` | Setzt die erste Ecke an deiner Position |
|
|
||||||
| `/chunkinfo pvp pos2` | Setzt die zweite Ecke an deiner Position |
|
**Warum wird bei manchen Unclaims nichts gesperrt?**
|
||||||
| `/chunkinfo pvp create <Name>` | Legt die Region an |
|
Gesperrt wird nur, wenn ein Spieler selbst `/unclaim` benutzt. Nicht gesperrt wird, wenn das Land gelöscht wird, Chunks durch den Upkeep verloren gehen oder ein Temp-Chunk abläuft. Spieler mit dem Recht `landschunkinfo.bypass` lösen ebenfalls keine Sperre aus.
|
||||||
| `/chunkinfo pvp delete <Name>` | Löscht die Region |
|
|
||||||
| `/chunkinfo pvp list` | Zeigt alle Regionen |
|
**Wie sehen Spieler, wie lange sie auf einen Chunk warten müssen?**
|
||||||
|
Mit `/chunks`. Dort steht „Nächster Chunk wieder frei in: …“.
|
||||||
Dafür brauchst du das Recht `landschunkinfo.admin`. Die Regionen sind Rechtecke über die ganze Höhe und werden in `plugins/LandsChunkInfo/pvp-regions.yml` gespeichert. PvP wird nur freigegeben, wenn Angreifer und Opfer beide in der Region stehen.
|
|
||||||
|
**Die Upkeep-Zeit stimmt nicht.**
|
||||||
|
Lands verrät dem Plugin nicht, wann genau der Zyklus gestartet ist. Nach dem ersten echten Einzug passt die Anzeige. Alternativ trägst du in `upkeep.anchor-date` ein bekanntes Einzugsdatum ein.
|
||||||
|
|
||||||
|
**Muss ich den Server neu starten?**
|
||||||
|
Für Änderungen an der `config.yml` reicht `/chunks reload`. Beim Austausch der Jar-Datei brauchst du einen Neustart (kein `/reload`).
|
||||||
|
|
||||||
|
**Verlieren Spieler ihre Chunks, wenn ich das Plugin entferne?**
|
||||||
|
Nein. Das Plugin ändert keine Lands-Daten außer bei zwei Dingen: Wenn die Warteschlange einen Chunk claimt oder wenn ein Temp-Chunk abläuft. Entfernst du das Plugin, bleiben alle bestehenden Chunks gleich. Die gespeicherten Sperren und Listen liegen nur in `plugins/LandsChunkInfo/data.yml`.
|
||||||
|
|
||||||
|
**Kann ich einem Spieler mehr Chunk-Slots geben?**
|
||||||
|
Nein, das geht nur in Lands selbst (`player-limits.yml`). Dieses Plugin ändert keine Limits.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. Datensicherung
|
||||||
|
|
||||||
|
Alles, was sich das Plugin merkt, steht in diesen Dateien in `plugins/LandsChunkInfo/`:
|
||||||
|
|
||||||
|
| Datei | Inhalt |
|
||||||
|
|---|---|
|
||||||
|
| `config.yml` | Deine Einstellungen |
|
||||||
|
| `data.yml` | Sperren, Warteschlange, Watchlist, Temp-Chunks, letzter Upkeep |
|
||||||
|
| `pvp-regions.yml` | Die PvP-Regionen |
|
||||||
|
|
||||||
|
Wenn du den Server umziehst oder ein Backup machst, kopiere diese Dateien mit. **Bearbeite `data.yml` und `pvp-regions.yml` nicht von Hand, solange der Server läuft.** Das Plugin überschreibt die Dateien sonst.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. Wenn etwas nicht klappt
|
||||||
|
|
||||||
|
| Problem | Lösung |
|
||||||
|
|---|---|
|
||||||
|
| Plugin startet nicht, in der Konsole steht etwas mit „Lands“ | Lands fehlt oder ist nicht aktiv. Prüfe, ob die Lands-Jar im Ordner `plugins` liegt und startet |
|
||||||
|
| Fehler mit „Unsupported class file version“ oder „Java“ | Der Server läuft mit einem zu alten Java. Du brauchst **Java 25** |
|
||||||
|
| `/chunkinfo` zeigt „Too many arguments“ oder die Ausgabe von WorldEdit | Das ist der Befehl von WorldEdit/FAWE, nicht von diesem Plugin. Benutze `/chunks` oder `/chunkslots` |
|
||||||
|
| `/chunks` sagt „Du bist in keinem Land Mitglied“ | Der Spieler hat kein Land und ist in keinem als vertrauenswürdig eingetragen. Das ist normal |
|
||||||
|
| `skip` oder `gift` meldet, Vault fehle | Installiere Vault und ein Economy-Plugin, oder stelle `skip.payment` auf `LAND` (dann geht nur `skip`, `gift` bleibt gesperrt) |
|
||||||
|
| Die Platzhalter zeigen sich als Text, z. B. `%chunkinfo_used%` | PlaceholderAPI fehlt oder wurde nach diesem Plugin geladen. Starte den Server neu |
|
||||||
|
| Änderungen an der `config.yml` wirken nicht | `/chunks reload` ausführen. Falls es trotzdem nicht klappt: Auf Einrückungen und fehlende Anführungszeichen prüfen |
|
||||||
|
| Spieler können nach dem Unclaimen trotzdem sofort claimen | Prüfe `unclaim-cooldown.enforce`, das muss `true` sein. Und prüfe, ob der Spieler das Recht `landschunkinfo.bypass` hat (OPs haben es automatisch) |
|
||||||
|
| In der PvP-Region kommt trotzdem die Lands-Meldung oder kein Schaden | Prüfe mit `/chunks pvp list`, ob die Region existiert und ob **beide** Spieler darin stehen. Die Region ist ein Rechteck: am Rand zählt der Block, auf dem man steht |
|
||||||
|
| Mitglieder desselben Lands bekommen in der Arena keinen Rückstoß | Das Plugin gibt den Rückstoß frei, wenn Lands ihn blockiert. Hilft das nicht, kommt es von einem anderen Plugin (z. B. Team- oder Friendly-Fire-Plugin) |
|
||||||
|
| Nach dem Update ist die alte Version aktiv | Es liegen zwei Jar-Dateien in `plugins`. Lösche die alte und starte neu |
|
||||||
|
|
||||||
|
Wenn du nicht weiterkommst: Kopiere die **roten Zeilen aus der Server-Konsole** (oder aus `logs/latest.log`) und gib sie weiter. Daraus lässt sich fast immer die Ursache erkennen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. Bekannte Grenzen
|
||||||
|
|
||||||
|
- Die PvP-Regionen funktionieren auf einem echten Server. Die übrigen Funktionen (Sperren, Skip, Queue, Watch, Temp) wurden dort noch nicht ausführlich getestet. Probiere neue Versionen erst auf einem Testserver aus.
|
||||||
|
- Die Upkeep-Zeit ist bis zum ersten echten Einzug eine Schätzung.
|
||||||
|
- Die Warteschlange und die Watchlist arbeiten nur für Spieler, die **online** sind.
|
||||||
|
- Temp-Chunks laufen erst ab, wenn der Ersteller oder der Besitzer des Lands online ist.
|
||||||
|
- Lands-Limits (z. B. maximale Chunks) kann das Plugin nicht verändern.
|
||||||
|
- PvP-Regionen sind einfache Rechtecke ohne Höhenbegrenzung und keine WorldGuard-Regionen.
|
||||||
|
- Die rote Lands-Meldung zum PvP in der Wildnis kann das Plugin nicht umschreiben. Sie wird in der Arena nur vermieden, weil Lands den Angriff dort nicht mehr prüft.
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>de.landschunkinfo</groupId>
|
<groupId>de.landschunkinfo</groupId>
|
||||||
<artifactId>LandsChunkInfo</artifactId>
|
<artifactId>LandsChunkInfo</artifactId>
|
||||||
<version>1.0.2</version>
|
<version>1.0.4</version>
|
||||||
<packaging>jar</packaging>
|
<packaging>jar</packaging>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ final class InfoCommand implements CommandExecutor, TabCompleter {
|
|||||||
}
|
}
|
||||||
case "create" -> {
|
case "create" -> {
|
||||||
if (args.length < 3) {
|
if (args.length < 3) {
|
||||||
plugin.send(p, "&cNutzung: /chunkinfo pvp create <Name>");
|
plugin.send(p, "&cNutzung: /chunks pvp create <Name>");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String err = plugin.pvp.create(p, args[2]);
|
String err = plugin.pvp.create(p, args[2]);
|
||||||
@@ -88,7 +88,7 @@ final class InfoCommand implements CommandExecutor, TabCompleter {
|
|||||||
}
|
}
|
||||||
case "delete" -> {
|
case "delete" -> {
|
||||||
if (args.length < 3) {
|
if (args.length < 3) {
|
||||||
plugin.send(p, "&cNutzung: /chunkinfo pvp delete <Name>");
|
plugin.send(p, "&cNutzung: /chunks pvp delete <Name>");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
plugin.send(p, plugin.pvp.delete(args[2]) ? "&aRegion geloescht." : "&cRegion nicht gefunden.");
|
plugin.send(p, plugin.pvp.delete(args[2]) ? "&aRegion geloescht." : "&cRegion nicht gefunden.");
|
||||||
@@ -100,7 +100,7 @@ final class InfoCommand implements CommandExecutor, TabCompleter {
|
|||||||
plugin.pvp.all().values().forEach(r -> p.sendMessage(plugin.line("&8- &e" + r.name() + " &7(" + r.world()
|
plugin.pvp.all().values().forEach(r -> p.sendMessage(plugin.line("&8- &e" + r.name() + " &7(" + r.world()
|
||||||
+ ": " + r.minX() + "," + r.minZ() + " bis " + r.maxX() + "," + r.maxZ() + ")")));
|
+ ": " + r.minX() + "," + r.minZ() + " bis " + r.maxX() + "," + r.maxZ() + ")")));
|
||||||
}
|
}
|
||||||
default -> plugin.send(p, "&7/chunkinfo pvp pos1 | pos2 | create <Name> | delete <Name> | list");
|
default -> plugin.send(p, "&7/chunks pvp pos1 | pos2 | create <Name> | delete <Name> | list");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,7 +155,7 @@ final class InfoCommand implements CommandExecutor, TabCompleter {
|
|||||||
for (Land land : shown) {
|
for (Land land : shown) {
|
||||||
describe(p, land);
|
describe(p, land);
|
||||||
}
|
}
|
||||||
p.sendMessage(plugin.line("&8Mehr: &7/chunkinfo top | skip | gift | queue | watch | temp"));
|
p.sendMessage(plugin.line("&8Mehr: &7/chunks top | skip | gift | queue | watch | temp"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void describe(Player p, Land land) {
|
private void describe(Player p, Land land) {
|
||||||
@@ -187,7 +187,7 @@ final class InfoCommand implements CommandExecutor, TabCompleter {
|
|||||||
p.sendMessage(plugin.line(sb + (locked.size() > 5 ? " ..." : "")));
|
p.sendMessage(plugin.line(sb + (locked.size() > 5 ? " ..." : "")));
|
||||||
}
|
}
|
||||||
if (plugin.getConfig().getBoolean("skip.enabled", true)) {
|
if (plugin.getConfig().getBoolean("skip.enabled", true)) {
|
||||||
p.sendMessage(plugin.line("&7Sofort freischalten: &e/chunkinfo skip &7(Preis: &e"
|
p.sendMessage(plugin.line("&7Sofort freischalten: &e/chunks skip &7(Preis: &e"
|
||||||
+ price(first - now) + "&7)"));
|
+ price(first - now) + "&7)"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -253,7 +253,7 @@ final class InfoCommand implements CommandExecutor, TabCompleter {
|
|||||||
return Math.max(min, remainingMs / 3_600_000.0 * perHour);
|
return Math.max(min, remainingMs / 3_600_000.0 * perHour);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** /chunkinfo skip [Land] [confirm] bzw. /chunkinfo gift <Land> [confirm] */
|
/** /chunks skip [Land] [confirm] bzw. /chunks gift <Land> [confirm] */
|
||||||
private void skip(Player p, String[] args, boolean gift) {
|
private void skip(Player p, String[] args, boolean gift) {
|
||||||
if (!allowed(p, gift ? "gift" : "skip")) {
|
if (!allowed(p, gift ? "gift" : "skip")) {
|
||||||
return;
|
return;
|
||||||
@@ -270,7 +270,7 @@ final class InfoCommand implements CommandExecutor, TabCompleter {
|
|||||||
if (name != null) {
|
if (name != null) {
|
||||||
land = findLand(name);
|
land = findLand(name);
|
||||||
} else if (gift) {
|
} else if (gift) {
|
||||||
plugin.send(p, "&cNutzung: /chunkinfo gift <Land> [confirm]");
|
plugin.send(p, "&cNutzung: /chunks gift <Land> [confirm]");
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
land = plugin.landsOf(p.getUniqueId()).stream()
|
land = plugin.landsOf(p.getUniqueId()).stream()
|
||||||
@@ -304,7 +304,7 @@ final class InfoCommand implements CommandExecutor, TabCompleter {
|
|||||||
if (!confirm) {
|
if (!confirm) {
|
||||||
plugin.send(p, "&7Slot in &e" + land.getName() + " &7(noch &e" + TimeUtil.format(remaining)
|
plugin.send(p, "&7Slot in &e" + land.getName() + " &7(noch &e" + TimeUtil.format(remaining)
|
||||||
+ "&7) freischalten fuer &e" + money(price) + (fromLand ? " &7aus der Landkasse" : "")
|
+ "&7) freischalten fuer &e" + money(price) + (fromLand ? " &7aus der Landkasse" : "")
|
||||||
+ "&7. Bestaetigen: &e/chunkinfo " + (gift ? "gift " : "skip ") + land.getName() + " confirm");
|
+ "&7. Bestaetigen: &e/chunks " + (gift ? "gift " : "skip ") + land.getName() + " confirm");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -361,12 +361,12 @@ final class InfoCommand implements CommandExecutor, TabCompleter {
|
|||||||
int cx = p.getLocation().getBlockX() >> 4;
|
int cx = p.getLocation().getBlockX() >> 4;
|
||||||
int cz = p.getLocation().getBlockZ() >> 4;
|
int cz = p.getLocation().getBlockZ() >> 4;
|
||||||
if (plugin.lands.getLandByUnloadedChunk(w, cx, cz) != null) {
|
if (plugin.lands.getLandByUnloadedChunk(w, cx, cz) != null) {
|
||||||
plugin.send(p, "&cDieser Chunk ist schon geclaimt. Mit &e/chunkinfo watch &ckannst du ihn beobachten.");
|
plugin.send(p, "&cDieser Chunk ist schon geclaimt. Mit &e/chunks watch &ckannst du ihn beobachten.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
List<Entry> mine = plugin.store.entries(Kind.QUEUE).stream().filter(e -> e.player().equals(p.getUniqueId())).toList();
|
List<Entry> mine = plugin.store.entries(Kind.QUEUE).stream().filter(e -> e.player().equals(p.getUniqueId())).toList();
|
||||||
if (mine.size() >= plugin.getConfig().getInt("queue.max", 3)) {
|
if (mine.size() >= plugin.getConfig().getInt("queue.max", 3)) {
|
||||||
plugin.send(p, "&cDeine Warteschlange ist voll (&e/chunkinfo queue clear&c).");
|
plugin.send(p, "&cDeine Warteschlange ist voll (&e/chunks queue clear&c).");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (mine.stream().anyMatch(e -> e.at(w.getName(), cx, cz))) {
|
if (mine.stream().anyMatch(e -> e.at(w.getName(), cx, cz))) {
|
||||||
@@ -400,12 +400,12 @@ final class InfoCommand implements CommandExecutor, TabCompleter {
|
|||||||
int cz = p.getLocation().getBlockZ() >> 4;
|
int cz = p.getLocation().getBlockZ() >> 4;
|
||||||
Land holder = plugin.lands.getLandByUnloadedChunk(w, cx, cz);
|
Land holder = plugin.lands.getLandByUnloadedChunk(w, cx, cz);
|
||||||
if (holder == null) {
|
if (holder == null) {
|
||||||
plugin.send(p, "&cDieser Chunk ist frei - du kannst ihn direkt claimen oder mit &e/chunkinfo queue &avormerken.");
|
plugin.send(p, "&cDieser Chunk ist frei - du kannst ihn direkt claimen oder mit &e/chunks queue &avormerken.");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
List<Entry> mine = plugin.store.entries(Kind.WATCH).stream().filter(e -> e.player().equals(p.getUniqueId())).toList();
|
List<Entry> mine = plugin.store.entries(Kind.WATCH).stream().filter(e -> e.player().equals(p.getUniqueId())).toList();
|
||||||
if (mine.size() >= plugin.getConfig().getInt("watch.max", 5)) {
|
if (mine.size() >= plugin.getConfig().getInt("watch.max", 5)) {
|
||||||
plugin.send(p, "&cDeine Watchlist ist voll (&e/chunkinfo watch clear&c).");
|
plugin.send(p, "&cDeine Watchlist ist voll (&e/chunks watch clear&c).");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (mine.stream().anyMatch(e -> e.at(w.getName(), cx, cz))) {
|
if (mine.stream().anyMatch(e -> e.at(w.getName(), cx, cz))) {
|
||||||
@@ -469,7 +469,7 @@ final class InfoCommand implements CommandExecutor, TabCompleter {
|
|||||||
try {
|
try {
|
||||||
days = Integer.parseInt(arg);
|
days = Integer.parseInt(arg);
|
||||||
} catch (NumberFormatException ex) {
|
} catch (NumberFormatException ex) {
|
||||||
plugin.send(p, "&cNutzung: /chunkinfo temp <Tage> | cancel | list");
|
plugin.send(p, "&cNutzung: /chunks temp <Tage> | cancel | list");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int maxDays = plugin.getConfig().getInt("temp-claims.max-days", 30);
|
int maxDays = plugin.getConfig().getInt("temp-claims.max-days", 30);
|
||||||
|
|||||||
@@ -67,17 +67,17 @@ public final class LandsChunkInfo extends JavaPlugin implements Listener {
|
|||||||
vault = VaultHook.create();
|
vault = VaultHook.create();
|
||||||
}
|
}
|
||||||
if (vault == null) {
|
if (vault == null) {
|
||||||
getLogger().info("Vault/Economy nicht gefunden: Bezahlung nur aus der Landkasse moeglich, /chunkinfo gift ist deaktiviert.");
|
getLogger().info("Vault/Economy nicht gefunden: Bezahlung nur aus der Landkasse moeglich, /chunks gift ist deaktiviert.");
|
||||||
}
|
}
|
||||||
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
|
if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) {
|
||||||
new ChunkExpansion(this).register();
|
new ChunkExpansion(this).register();
|
||||||
}
|
}
|
||||||
|
|
||||||
pvp = new PvpRegions(getDataFolder(), getLogger());
|
pvp = new PvpRegions(this, getDataFolder(), getLogger());
|
||||||
Bukkit.getPluginManager().registerEvents(pvp, this);
|
Bukkit.getPluginManager().registerEvents(pvp, this);
|
||||||
Bukkit.getPluginManager().registerEvents(this, this);
|
Bukkit.getPluginManager().registerEvents(this, this);
|
||||||
InfoCommand command = new InfoCommand(this);
|
InfoCommand command = new InfoCommand(this);
|
||||||
var cmd = getCommand("chunkinfo");
|
var cmd = getCommand("chunks");
|
||||||
if (cmd != null) {
|
if (cmd != null) {
|
||||||
cmd.setExecutor(command);
|
cmd.setExecutor(command);
|
||||||
cmd.setTabCompleter(command);
|
cmd.setTabCompleter(command);
|
||||||
@@ -87,6 +87,9 @@ public final class LandsChunkInfo extends JavaPlugin implements Listener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDisable() {
|
public void onDisable() {
|
||||||
|
if (pvp != null) {
|
||||||
|
pvp.shutdown();
|
||||||
|
}
|
||||||
if (store != null) {
|
if (store != null) {
|
||||||
store.save();
|
store.save();
|
||||||
}
|
}
|
||||||
@@ -374,7 +377,7 @@ public final class LandsChunkInfo extends JavaPlugin implements Listener {
|
|||||||
if (lands.getLandByUnloadedChunk(w, e.x(), e.z()) == null) {
|
if (lands.getLandByUnloadedChunk(w, e.x(), e.z()) == null) {
|
||||||
store.remove(Kind.WATCH, e);
|
store.remove(Kind.WATCH, e);
|
||||||
send(p, "&aDer beobachtete Chunk &e" + e.x() + ", " + e.z() + " &a(" + e.world()
|
send(p, "&aDer beobachtete Chunk &e" + e.x() + ", " + e.z() + " &a(" + e.world()
|
||||||
+ ") ist jetzt frei! Mit &e/chunkinfo queue &akannst du ihn dir sichern.");
|
+ ") ist jetzt frei! Mit &e/chunks queue &akannst du ihn dir sichern.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,15 @@ import org.bukkit.event.EventHandler;
|
|||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
import org.bukkit.event.player.PlayerTeleportEvent;
|
||||||
|
import org.bukkit.event.player.PlayerVelocityEvent;
|
||||||
|
import org.bukkit.event.entity.EntityKnockbackByEntityEvent;
|
||||||
|
import org.bukkit.permissions.PermissionAttachment;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -36,13 +45,20 @@ final class PvpRegions implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final String BYPASS = "lands.bypass.attack_player";
|
||||||
|
|
||||||
|
/** Spieler, die gerade in einer PvP-Region getroffen wurden (fuer den Rueckstoss). */
|
||||||
|
private final Map<UUID, Long> recentHit = new ConcurrentHashMap<>();
|
||||||
|
private final JavaPlugin plugin;
|
||||||
|
private final Map<UUID, PermissionAttachment> bypass = new ConcurrentHashMap<>();
|
||||||
private final File file;
|
private final File file;
|
||||||
private final Logger log;
|
private final Logger log;
|
||||||
private final Map<String, Region> regions = new LinkedHashMap<>();
|
private final Map<String, Region> regions = new LinkedHashMap<>();
|
||||||
private final Map<UUID, Location> pos1 = new ConcurrentHashMap<>();
|
private final Map<UUID, Location> pos1 = new ConcurrentHashMap<>();
|
||||||
private final Map<UUID, Location> pos2 = new ConcurrentHashMap<>();
|
private final Map<UUID, Location> pos2 = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
PvpRegions(File dataFolder, Logger log) {
|
PvpRegions(JavaPlugin plugin, File dataFolder, Logger log) {
|
||||||
|
this.plugin = plugin;
|
||||||
this.file = new File(dataFolder, "pvp-regions.yml");
|
this.file = new File(dataFolder, "pvp-regions.yml");
|
||||||
this.log = log;
|
this.log = log;
|
||||||
load();
|
load();
|
||||||
@@ -100,7 +116,7 @@ final class PvpRegions implements Listener {
|
|||||||
Location a = pos1.get(p.getUniqueId());
|
Location a = pos1.get(p.getUniqueId());
|
||||||
Location b = pos2.get(p.getUniqueId());
|
Location b = pos2.get(p.getUniqueId());
|
||||||
if (a == null || b == null) {
|
if (a == null || b == null) {
|
||||||
return "Setze zuerst &e/chunkinfo pvp pos1 &7und &e/chunkinfo pvp pos2&7.";
|
return "Setze zuerst &e/chunks pvp pos1 &7und &e/chunks pvp pos2&7.";
|
||||||
}
|
}
|
||||||
if (a.getWorld() == null || !a.getWorld().equals(b.getWorld())) {
|
if (a.getWorld() == null || !a.getWorld().equals(b.getWorld())) {
|
||||||
return "Beide Punkte muessen in derselben Welt liegen.";
|
return "Beide Punkte muessen in derselben Welt liegen.";
|
||||||
@@ -109,6 +125,7 @@ final class PvpRegions implements Listener {
|
|||||||
Math.min(a.getBlockX(), b.getBlockX()), Math.min(a.getBlockZ(), b.getBlockZ()),
|
Math.min(a.getBlockX(), b.getBlockX()), Math.min(a.getBlockZ(), b.getBlockZ()),
|
||||||
Math.max(a.getBlockX(), b.getBlockX()), Math.max(a.getBlockZ(), b.getBlockZ())));
|
Math.max(a.getBlockX(), b.getBlockX()), Math.max(a.getBlockZ(), b.getBlockZ())));
|
||||||
save();
|
save();
|
||||||
|
refreshAll();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,6 +133,7 @@ final class PvpRegions implements Listener {
|
|||||||
boolean removed = regions.remove(name.toLowerCase()) != null;
|
boolean removed = regions.remove(name.toLowerCase()) != null;
|
||||||
if (removed) {
|
if (removed) {
|
||||||
save();
|
save();
|
||||||
|
refreshAll();
|
||||||
}
|
}
|
||||||
return removed;
|
return removed;
|
||||||
}
|
}
|
||||||
@@ -137,6 +155,77 @@ final class PvpRegions implements Listener {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------- Lands-Bypass in Regionen
|
||||||
|
|
||||||
|
/** Gibt dem Spieler in einer PvP-Region das Lands-Recht zum Angreifen, sonst entzieht es es. */
|
||||||
|
void refresh(Player p) {
|
||||||
|
refreshAt(p, p.isOnline() && inRegion(p.getLocation()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void refreshAll() {
|
||||||
|
for (Player p : Bukkit.getOnlinePlayers()) {
|
||||||
|
refresh(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void shutdown() {
|
||||||
|
for (Player p : Bukkit.getOnlinePlayers()) {
|
||||||
|
PermissionAttachment att = bypass.remove(p.getUniqueId());
|
||||||
|
if (att != null) {
|
||||||
|
try {
|
||||||
|
p.removeAttachment(att);
|
||||||
|
} catch (IllegalArgumentException ignored) {
|
||||||
|
// schon entfernt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onMove(PlayerMoveEvent e) {
|
||||||
|
if (e.getTo() == null || regions.isEmpty() && bypass.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (e.getFrom().getBlockX() != e.getTo().getBlockX() || e.getFrom().getBlockZ() != e.getTo().getBlockZ()) {
|
||||||
|
boolean inside = inRegion(e.getTo());
|
||||||
|
if (inside != bypass.containsKey(e.getPlayer().getUniqueId())) {
|
||||||
|
refreshAt(e.getPlayer(), inside);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onTeleport(PlayerTeleportEvent e) {
|
||||||
|
refreshAt(e.getPlayer(), inRegion(e.getTo()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onJoin(PlayerJoinEvent e) {
|
||||||
|
refresh(e.getPlayer());
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler
|
||||||
|
public void onQuit(PlayerQuitEvent e) {
|
||||||
|
bypass.remove(e.getPlayer().getUniqueId());
|
||||||
|
recentHit.remove(e.getPlayer().getUniqueId());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshAt(Player p, boolean inside) {
|
||||||
|
PermissionAttachment att = bypass.get(p.getUniqueId());
|
||||||
|
if (inside && att == null) {
|
||||||
|
PermissionAttachment a = p.addAttachment(plugin);
|
||||||
|
a.setPermission(BYPASS, true);
|
||||||
|
bypass.put(p.getUniqueId(), a);
|
||||||
|
} else if (!inside && att != null) {
|
||||||
|
bypass.remove(p.getUniqueId());
|
||||||
|
try {
|
||||||
|
p.removeAttachment(att);
|
||||||
|
} catch (IllegalArgumentException ignored) {
|
||||||
|
// schon entfernt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------- Event
|
// ----------------------------------------------------------------- Event
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -145,7 +234,7 @@ final class PvpRegions implements Listener {
|
|||||||
*/
|
*/
|
||||||
@EventHandler(priority = EventPriority.HIGHEST)
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
public void onDamage(EntityDamageByEntityEvent e) {
|
public void onDamage(EntityDamageByEntityEvent e) {
|
||||||
if (!e.isCancelled() || regions.isEmpty() || !(e.getEntity() instanceof Player victim)) {
|
if (regions.isEmpty() || !(e.getEntity() instanceof Player victim)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Entity damager = e.getDamager();
|
Entity damager = e.getDamager();
|
||||||
@@ -156,7 +245,30 @@ final class PvpRegions implements Listener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (inRegion(attacker.getLocation()) && inRegion(victim.getLocation())) {
|
if (inRegion(attacker.getLocation()) && inRegion(victim.getLocation())) {
|
||||||
|
recentHit.put(victim.getUniqueId(), System.currentTimeMillis());
|
||||||
|
if (e.isCancelled()) {
|
||||||
|
e.setCancelled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Rueckstoss in der PvP-Region freigeben, falls Lands ihn fuer Land-Mitglieder unterdrueckt. */
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
|
public void onKnockback(EntityKnockbackByEntityEvent e) {
|
||||||
|
if (e.isCancelled() && e.getEntity() instanceof Player victim && isRecent(victim)) {
|
||||||
e.setCancelled(false);
|
e.setCancelled(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST)
|
||||||
|
public void onVelocity(PlayerVelocityEvent e) {
|
||||||
|
if (e.isCancelled() && isRecent(e.getPlayer())) {
|
||||||
|
e.setCancelled(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean isRecent(Player victim) {
|
||||||
|
Long t = recentHit.get(victim.getUniqueId());
|
||||||
|
return t != null && System.currentTimeMillis() - t < 500 && inRegion(victim.getLocation());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ messages:
|
|||||||
reloaded: "&aKonfiguration neu geladen."
|
reloaded: "&aKonfiguration neu geladen."
|
||||||
claim-blocked: "&cAlle freien Chunk-Slots sind nach einem Unclaim noch gesperrt. Nächster Slot frei in &e%time%&c."
|
claim-blocked: "&cAlle freien Chunk-Slots sind nach einem Unclaim noch gesperrt. Nächster Slot frei in &e%time%&c."
|
||||||
|
|
||||||
# Gesperrten Slot sofort freischalten (/chunkinfo skip, /chunkinfo gift <Land>).
|
# Gesperrten Slot sofort freischalten (/chunks skip, /chunks gift <Land>).
|
||||||
skip:
|
skip:
|
||||||
enabled: true
|
enabled: true
|
||||||
# PLAYER = Geld des Spielers (Vault), LAND = Landkasse (nur Besitzer). gift nutzt immer PLAYER.
|
# PLAYER = Geld des Spielers (Vault), LAND = Landkasse (nur Besitzer). gift nutzt immer PLAYER.
|
||||||
@@ -31,16 +31,16 @@ skip:
|
|||||||
price-per-hour: 25.0
|
price-per-hour: 25.0
|
||||||
min-price: 50.0
|
min-price: 50.0
|
||||||
|
|
||||||
# Auto-Claim-Warteschlange (/chunkinfo queue): claimt vorgemerkte freie Chunks, sobald ein Slot frei ist.
|
# Auto-Claim-Warteschlange (/chunks queue): claimt vorgemerkte freie Chunks, sobald ein Slot frei ist.
|
||||||
# Der Spieler muss dafuer online sein.
|
# Der Spieler muss dafuer online sein.
|
||||||
queue:
|
queue:
|
||||||
max: 3
|
max: 3
|
||||||
|
|
||||||
# Watchlist (/chunkinfo watch): Nachricht, sobald ein fremder Chunk frei wird.
|
# Watchlist (/chunks watch): Nachricht, sobald ein fremder Chunk frei wird.
|
||||||
watch:
|
watch:
|
||||||
max: 5
|
max: 5
|
||||||
|
|
||||||
# Zeitlich begrenzte Claims (/chunkinfo temp <Tage>): Chunk wird nach Ablauf automatisch freigegeben,
|
# Zeitlich begrenzte Claims (/chunks temp <Tage>): Chunk wird nach Ablauf automatisch freigegeben,
|
||||||
# ohne dass dadurch ein Slot gesperrt wird.
|
# ohne dass dadurch ein Slot gesperrt wird.
|
||||||
temp-claims:
|
temp-claims:
|
||||||
enabled: true
|
enabled: true
|
||||||
|
|||||||
@@ -1,38 +1,38 @@
|
|||||||
name: LandsChunkInfo
|
name: LandsChunkInfo
|
||||||
main: de.landschunkinfo.LandsChunkInfo
|
main: de.landschunkinfo.LandsChunkInfo
|
||||||
version: ${project.version}
|
version: ${project.version}
|
||||||
api-version: '1.21'
|
api-version: '1.21'
|
||||||
depend: [Lands]
|
depend: [Lands]
|
||||||
softdepend: [Vault, PlaceholderAPI]
|
softdepend: [Vault, PlaceholderAPI]
|
||||||
folia-supported: false
|
folia-supported: false
|
||||||
description: Zeigt Spielern ihre Chunks und wann wieder ein Chunk frei wird (Unclaim-Cooldown und Upkeep), mit Skip, Queue, Watchlist, Temp-Claims und Platzhaltern.
|
description: Zeigt Spielern ihre Chunks und wann wieder ein Chunk frei wird (Unclaim-Cooldown und Upkeep), mit Skip, Queue, Watchlist, Temp-Claims und Platzhaltern.
|
||||||
commands:
|
commands:
|
||||||
chunkinfo:
|
chunks:
|
||||||
description: Chunk-Belegung, freie Slots, Upkeep, Queue, Watchlist und mehr
|
description: Chunk-Belegung, freie Slots, Upkeep, Queue, Watchlist und mehr
|
||||||
usage: /<command> [land|top|skip|gift|queue|watch|temp]
|
usage: /<command> [land|top|skip|gift|queue|watch|temp]
|
||||||
aliases: [chunks, chunkslots]
|
aliases: [chunkslots]
|
||||||
permissions:
|
permissions:
|
||||||
landschunkinfo.use:
|
landschunkinfo.use:
|
||||||
description: /chunkinfo benutzen
|
description: /chunks benutzen
|
||||||
default: true
|
default: true
|
||||||
landschunkinfo.skip:
|
landschunkinfo.skip:
|
||||||
description: Gesperrten Slot freikaufen
|
description: Gesperrten Slot freikaufen
|
||||||
default: true
|
default: true
|
||||||
landschunkinfo.gift:
|
landschunkinfo.gift:
|
||||||
description: Slot in fremdem Land freikaufen
|
description: Slot in fremdem Land freikaufen
|
||||||
default: true
|
default: true
|
||||||
landschunkinfo.queue:
|
landschunkinfo.queue:
|
||||||
description: Auto-Claim-Warteschlange
|
description: Auto-Claim-Warteschlange
|
||||||
default: true
|
default: true
|
||||||
landschunkinfo.watch:
|
landschunkinfo.watch:
|
||||||
description: Chunk-Watchlist
|
description: Chunk-Watchlist
|
||||||
default: true
|
default: true
|
||||||
landschunkinfo.temp:
|
landschunkinfo.temp:
|
||||||
description: Zeitlich begrenzte Claims
|
description: Zeitlich begrenzte Claims
|
||||||
default: true
|
default: true
|
||||||
landschunkinfo.bypass:
|
landschunkinfo.bypass:
|
||||||
description: Unclaim-Cooldown ignorieren
|
description: Unclaim-Cooldown ignorieren
|
||||||
default: op
|
default: op
|
||||||
landschunkinfo.admin:
|
landschunkinfo.admin:
|
||||||
description: /chunkinfo reload
|
description: /chunks reload
|
||||||
default: op
|
default: op
|
||||||
|
|||||||
Reference in New Issue
Block a user