11 Commits
1.0 ... 1.4

Author SHA1 Message Date
be191df87e Update from Git Manager GUI 2026-02-05 10:33:58 +01:00
a884822115 Upload pom.xml via GUI 2026-02-05 09:33:57 +00:00
95052e9da4 Update from Git Manager GUI 2026-01-31 08:57:53 +01:00
fe7b0fed4b Upload pom.xml via GUI 2026-01-31 07:57:52 +00:00
710f8cf4f5 README.md aktualisiert 2026-01-30 16:25:29 +00:00
67b06252cb Update from Git Manager GUI 2026-01-30 17:17:16 +01:00
4e8705ba8e Upload pom.xml via GUI 2026-01-30 16:17:15 +00:00
4325d54e18 Update from Git Manager GUI 2026-01-30 12:33:12 +01:00
1e083c26b9 Upload pom.xml via GUI 2026-01-30 11:33:10 +00:00
5ca80669cf Update from Git Manager GUI 2026-01-30 12:32:10 +01:00
68bc2dd0fa Upload pom.xml via GUI 2026-01-30 11:32:09 +00:00
7 changed files with 321 additions and 103 deletions

View File

@@ -5,6 +5,7 @@
![Version](https://img.shields.io/badge/Version-1.18.x--1.21.x-green.svg)
![Java](https://img.shields.io/badge/Java-17+-orange.svg)
![Type](https://img.shields.io/badge/Type-Utility-blue.svg)
![Updates](https://img.shields.io/badge/Updates-Git--Notifier-gold.svg)
---
@@ -14,25 +15,25 @@
* **📱 Smart-GUI Interface:** Ein Rechtsklick auf das Modul öffnet ein elegantes Menü zur Direktauswahl aller Etagen im Schacht.
* **💎 Dynamische Hologramme:** Nutzt moderne **Text-Displays** zur Anzeige der Etagen-Namen direkt über dem Modul (ressourcenschonend).
* **🔒 Privatsphäre-System:** Schalte Etagen per Befehl zwischen `Public` (öffentlich) und `Private` (nur Besitzer) um.
* **🛠 Voll anpassbares Rezept:** Erstelle dein eigenes Crafting-Layout inklusive frei wählbarer Materialien direkt in der Config.
* **🎨 Customizing:** Volle Unterstützung von **Farbcodes & Hex-Farben** für individuelle Etagennamen.
* **🛡️ Grief-Schutz:** Nur Besitzer oder Admins können Module konfigurieren oder entfernen.
* **📝 Auto-Schilder:** Erstelle stylische Anzeigen automatisch mit `[Elevator]` in der ersten Zeile eines Schildes.
* **🔔 Ingame Update-Check:** Admins erhalten beim Joinen eine interaktive Meldung mit direktem Download-Link, sobald eine neue Version auf Git verfügbar ist.
---
## 🛠 Crafting-Rezept
## 🛠 Crafting-System
Das **Premium Aufzug-Modul** kann an jeder Werkbank mit folgendem Rezept hergestellt werden:
Dank des neuen dynamischen Rezept-Systems kannst du das **Aufzug-Modul** in der `config.yml` völlig frei gestalten. Standardmäßig ist folgendes Layout vorkonfiguriert:
| Slot | Material |
| :--- | :--- |
| **Oben Links** | Tageslichtsensor |
| **Oben Rechts** | Tageslichtsensor |
| **Mitte** | Eisenblock |
| **Unten Links** | Tageslichtsensor |
| **Unten Rechts** | Tageslichtsensor |
| Slot | Position | Standard-Material |
|:-----|:---------|:------------------|
| **1, 3, 7, 9** | Ecken | Eisenbarren |
| **2, 4, 6, 8** | Seiten | Enderperle |
| **5** | Mitte | Tageslichtsensor |
**Ergebnis:** `1x Aufzug-Modul`
> **Hinweis:** Das Gitter (Shape) und die Zutaten (Ingredients) können jederzeit ohne Code-Änderungen in der Konfiguration angepasst werden.
> **Material-Liste:** Alle verfügbaren Materialien findest du in der [Spigot Material Documentation](https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html).
---
@@ -41,7 +42,7 @@ Das **Premium Aufzug-Modul** kann an jeder Werkbank mit folgendem Rezept hergest
### Befehle
| Befehl | Beschreibung | Berechtigung |
| :--- | :--- | :--- |
|:-------|:-------------|:-------------|
| `/elevator name <Text>` | Ändert den Namen der aktuellen Etage. | `elevator.use` |
| `/elevator private` | Setzt die Etage auf **Privat**. | `elevator.use` |
| `/elevator public` | Setzt die Etage auf **Öffentlich**. | `elevator.use` |
@@ -49,40 +50,48 @@ Das **Premium Aufzug-Modul** kann an jeder Werkbank mit folgendem Rezept hergest
### Administration
| Berechtigung | Beschreibung |
| :--- | :--- |
| `elevator.admin` | Verwalten & Abbauen fremder Aufzüge sowie Bypass von Private-Sperren. |
|:-------------|:-------------|
| `elevator.admin` | Verwalten & Abbauen fremder Aufzüge sowie Erhalt von Update-Benachrichtigungen. |
---
## ⚙️ Konfiguration (Auszug)
```yaml
settings:
max-distance: 64 # Maximale Distanz zwischen Modulen
cooldown: 500 # Cooldown in ms zwischen Teleports
# Dynamisches Rezept-Beispiel
recipe:
shape:
- "ABA"
- "BCB"
- "ABA"
ingredients:
A: "IRON_INGOT"
B: "ENDER_PEARL"
C: "DAYLIGHT_DETECTOR"
# Visuelle Einstellungen
visuals:
enable-particles: true
hologram-text: "&8&l» &b&lEtage %floor% &8&l«"
hologram-scale: 1.5
```
---
## 🏗 Installation
1. **Download:** Lade die `Elevator.jar` herunter.
2. **Upload:** Verschiebe die Datei in deinen `/plugins` Ordner.
3. **Start:** Starte deinen Server neu, damit das Plugin geladen wird.
4. **Setup:** Passe die `config.yml` im Ordner `/plugins/Elevator/` nach deinen Wünschen an und lade das Plugin ggf. neu.
1. **Download**: Lade die neueste `Elevator.jar` von unserem Repository herunter.
2. **Upload**: Verschiebe die Datei in deinen `/plugins` Ordner.
3. **Start**: Starte deinen Server neu, damit das Plugin geladen wird.
4. **Setup**: Passe die `config.yml` im Ordner `/plugins/Elevator/` nach deinen Wünschen an.
---
## 👤 Autor & Support
**Erstellt von: M_Viper**
**Erstellt von:** M_Viper
💡 Entwickelt mit Fokus auf **Performance**, **Design** und **maximalen Bedienkomfort**. Bei Fragen, Fehlern oder Verbesserungsvorschlägen tritt gerne unserem Discord bei:
[![Discord Support](https://img.shields.io/badge/Discord-Support-7289DA?style=for-the-badge&logo=discord)](https://discord.com/invite/FdRs4BRd8D)
💡 Entwickelt mit Fokus auf Performance, Design und maximalen Bedienkomfort. Bei Fragen, Fehlern oder Verbesserungsvorschlägen tritt gerne unserem Discord bei.
---
*Viper Plugins © 2026 — Effiziente Systemlösungen für deinen Server.*
**Viper Plugins** © 2026 — Effiziente Systemlösungen für deinen Server.

104
pom.xml
View File

@@ -1,53 +1,53 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.mviper</groupId>
<artifactId>Elevator</artifactId>
<version>1.0-RELEASE</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>minecraft-libraries</id>
<url>https://libraries.minecraft.net/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.20.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mojang</groupId>
<artifactId>authlib</artifactId>
<version>3.11.50</version> <scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>de.mviper</groupId>
<artifactId>Elevator</artifactId>
<version>1.4</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<repositories>
<repository>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>
<repository>
<id>minecraft-libraries</id>
<url>https://libraries.minecraft.net/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot-api</artifactId>
<version>1.20.1-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.mojang</groupId>
<artifactId>authlib</artifactId>
<version>3.11.50</version> <scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.13.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@@ -1,51 +1,172 @@
package de.mviper.elevator;
import net.md_5.bungee.api.chat.ClickEvent;
import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.chat.hover.content.Text;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.ShapedRecipe;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.Arrays;
import java.util.List;
import java.util.logging.Level;
public class Elevator extends JavaPlugin {
public class Elevator extends JavaPlugin implements Listener {
private static Elevator instance;
private DatabaseManager databaseManager;
private HologramManager hologramManager;
private String latestVersionFound;
private final int RESOURCE_ID = 132220;
private final String releaseUrl = "https://www.spigotmc.org/resources/" + RESOURCE_ID;
@Override
public void onEnable() {
instance = this;
saveDefaultConfig();
this.databaseManager = new DatabaseManager();
this.hologramManager = new HologramManager();
hologramManager.purgeAllHolograms();
// Events & Commands registrieren
getServer().getPluginManager().registerEvents(new ElevatorListener(), this);
getServer().getPluginManager().registerEvents(this, this);
getCommand("elevator").setExecutor(new ElevatorCommand());
// Rezept laden
registerElevatorRecipe();
// Update Check starten (Offizielle Spigot API)
checkForUpdates();
}
private void checkForUpdates() {
new UpdateChecker(this, RESOURCE_ID).getLatestVersion(version -> {
this.latestVersionFound = version;
String currentVersion = this.getDescription().getVersion();
if (!currentVersion.equalsIgnoreCase(version)) {
getLogger().info("====================================================");
getLogger().info("NEUES UPDATE VERFÜGBAR: v" + version);
getLogger().info("Download: " + releaseUrl);
getLogger().info("====================================================");
} else {
getLogger().info("Plugin ist auf dem neuesten Stand (v" + currentVersion + ").");
}
});
}
@EventHandler
public void onJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
if (player.hasPermission("elevator.admin") || player.isOp()) {
if (latestVersionFound != null && !this.getDescription().getVersion().equalsIgnoreCase(latestVersionFound)) {
player.sendMessage(" ");
player.sendMessage("§b§l[Elevator] §eEine neue Version (§b" + latestVersionFound + "§e) ist verfügbar!");
TextComponent message = new TextComponent("§eDownload: ");
TextComponent link = new TextComponent("§6§l[KLICK HIER FÜR UPDATE]");
link.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, releaseUrl));
link.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new Text("§7Öffnet die SpigotMC-Seite")));
message.addExtra(link);
player.spigot().sendMessage(message);
player.sendMessage(" ");
}
}
}
private void registerElevatorRecipe() {
ItemStack item = new ItemStack(Material.DAYLIGHT_DETECTOR);
ItemMeta meta = item.getItemMeta();
if (meta != null) {
meta.setDisplayName("§b§lAufzug-Modul");
meta.setLore(Arrays.asList("§7Platziere dies als Etage.", "§eRechtsklick: §fMenü öffnen", "§eSpringen/Sneaken: §fReisen"));
meta.addEnchant(Enchantment.LUCK, 1, true);
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
item.setItemMeta(meta);
ItemStack item = createElevatorModuleItem();
NamespacedKey key = new NamespacedKey(this, "elevator_module");
ShapedRecipe recipe = new ShapedRecipe(key, item);
List<String> shapeLines = getConfig().getStringList("recipe.shape");
if (shapeLines.size() != 3) {
getLogger().severe("Rezept konnte nicht geladen werden: 'shape' benötigt genau 3 Zeilen!");
return;
}
String[] cleanedRows = new String[3];
for (int i = 0; i < 3; i++) {
String line = shapeLines.get(i).replace(" ", "");
while (line.length() < 3) {
line += " ";
}
if (line.length() > 3) {
line = line.substring(0, 3);
}
cleanedRows[i] = line;
}
recipe.shape(cleanedRows[0], cleanedRows[1], cleanedRows[2]);
ConfigurationSection section = getConfig().getConfigurationSection("recipe.ingredients");
if (section == null) {
getLogger().severe("Keine 'recipe.ingredients' in der Config gefunden!");
return;
}
for (String row : cleanedRows) {
for (char c : row.toCharArray()) {
if (c == ' ') continue;
String matName = section.getString(String.valueOf(c));
if (matName != null) {
Material mat = Material.matchMaterial(matName.toUpperCase());
if (mat != null) {
recipe.setIngredient(c, mat);
} else {
getLogger().warning("Ungültiges Material '" + matName + "' für Symbol '" + c + "'!");
return;
}
} else {
getLogger().warning("Symbol '" + c + "' im Shape hat keine Zuweisung in ingredients!");
return;
}
}
}
try {
getServer().removeRecipe(key);
getServer().addRecipe(recipe);
getLogger().info("Elevator: Crafting-Rezept erfolgreich registriert.");
} catch (Exception e) {
getLogger().log(Level.WARNING, "Fehler beim Rezept-Setup: {0}", e.getMessage());
}
ShapedRecipe recipe = new ShapedRecipe(new NamespacedKey(this, "elevator_module"), item);
recipe.shape("S.S", ".I.", "S.S");
recipe.setIngredient('S', Material.DAYLIGHT_DETECTOR);
recipe.setIngredient('I', Material.IRON_BLOCK);
getServer().addRecipe(recipe);
}
public static Elevator getInstance() { return instance; }
public DatabaseManager getDatabaseManager() { return databaseManager; }
public HologramManager getHologramManager() { return hologramManager; }
public ItemStack createElevatorModuleItem() {
ItemStack item = new ItemStack(Material.DAYLIGHT_DETECTOR);
ItemMeta meta = item.getItemMeta();
if (meta != null) {
meta.setDisplayName("§b§lAufzug-Modul");
meta.setLore(Arrays.asList(
"§7Platziere dies als Etage.",
"§eRechtsklick: §fMenü öffnen",
"§eSpringen/Sneaken: §fReisen"
));
meta.addEnchant(Enchantment.LUCK, 1, true);
meta.addItemFlags(ItemFlag.HIDE_ENCHANTS);
item.setItemMeta(meta);
}
return item;
}
}

View File

@@ -331,7 +331,27 @@ public class ElevatorListener implements Listener {
return;
}
db.removeElevator(e.getBlock().getLocation());
e.setDropItems(false);
e.setExpToDrop(0);
Location breakLoc = e.getBlock().getLocation();
db.removeElevator(breakLoc);
e.getBlock().setType(Material.AIR);
if (e.getPlayer().getGameMode() == GameMode.SURVIVAL) {
ItemStack moduleItem = Elevator.getInstance().createElevatorModuleItem();
HashMap<Integer, ItemStack> leftover = e.getPlayer().getInventory().addItem(moduleItem);
for (ItemStack rest : leftover.values()) {
breakLoc.getWorld().dropItemNaturally(breakLoc, rest);
}
}
if (breakLoc.getWorld() != null) {
breakLoc.getWorld().spawnParticle(Particle.CLOUD, breakLoc.add(0.5, 0.5, 0.5), 12, 0.2, 0.2, 0.2, 0.01);
breakLoc.getWorld().playSound(breakLoc, Sound.BLOCK_IRON_DOOR_CLOSE, 0.7f, 1.6f);
}
e.getPlayer().sendMessage("§eAufzug-Modul entfernt.");
}
}

View File

@@ -0,0 +1,32 @@
package de.mviper.elevator;
import org.bukkit.Bukkit;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Scanner;
import java.util.function.Consumer;
public class UpdateChecker {
private final Elevator plugin;
private final int resourceId;
public UpdateChecker(Elevator plugin, int resourceId) {
this.plugin = plugin;
this.resourceId = resourceId;
}
public void getLatestVersion(final Consumer<String> consumer) {
Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> {
try (InputStream inputStream = new URL("https://api.spigotmc.org/legacy/update.php?resource=" + this.resourceId).openStream();
Scanner scanner = new Scanner(inputStream)) {
if (scanner.hasNext()) {
consumer.accept(scanner.next());
}
} catch (IOException exception) {
plugin.getLogger().info("Update-Check fehlgeschlagen: " + exception.getMessage());
}
});
}
}

View File

@@ -1,4 +1,8 @@
# Elevator Config by mviper
# =============================================================
# Elevator Config by M_Viper
# =============================================================
# Datenbank-Einstellungen (SQLite wird standardmäßig genutzt, falls false)
mysql:
enable: false
host: "localhost"
@@ -7,32 +11,64 @@ mysql:
user: "root"
password: ""
# Allgemeine Aufzug-Logik
settings:
max-distance: 64
hologram-duration: 45
cooldown: 500
max-distance: 64 # Maximale Reichweite zwischen zwei Modulen
hologram-duration: 45 # Wie lange das Hologramm (in Ticks) sichtbar bleibt
cooldown: 500 # Wartezeit zwischen Teleports (in Millisekunden)
# Optische Effekte & Hologramme
visuals:
enable-particles: true
particle-type: "FIREWORKS_SPARK"
# Nutze HIER nur das & Zeichen für Farben!
# Texte & Farben (Nutze '&' für Farbcodes)
hologram-text: "&8&l» &b&lEtage %floor% &8&l«"
actionbar-text: "&fTransport: &b&lEtage %floor%"
# Darstellung des Hologramms
hologram-height-offset: 2.2
hologram-scale: 1.5
actionbar-text: "&fTransport: &b&lEtage %floor%"
# Hintergrund-Box (RGBA Werte)
hologram-background-color:
alpha: 120
red: 0
green: 0
blue: 0
# Akustisches Feedback
sounds:
enable: true
type: "BLOCK_NOTE_BLOCK_CHIME"
volume: 1.0
pitch: 1.5
# Nachrichten-System
messages:
prefix: "&8[&bElevator&8] "
registered: "&aModul erfolgreich registriert!"
no-target: "&cKeine weitere Etage gefunden."
no-target: "&cKeine weitere Etage gefunden."
# =============================================================
# REZEPT-EINSTELLUNGEN
# =============================================================
# Crafting-Gitter Übersicht:
# [ 1 | 2 | 3 ] -> Zeile 1
# [ 4 | 5 | 6 ] -> Zeile 2
# [ 7 | 8 | 9 ] -> Zeile 3
# =============================================================
recipe:
# Das 3x3 Layout (Maximal 3 Zeichen pro Zeile!)
# Nutze einen Punkt (.) für ein leeres Feld.
shape:
- "ABA" # Slot 1 2 3
- "BCB" # Slot 4 5 6
- "ABA" # Slot 7 8 9
# Material-Zuweisung
# Liste aller Materialien: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html
ingredients:
A: "IRON_INGOT"
B: "ENDER_PEARL"
C: "DAYLIGHT_DETECTOR"

View File

@@ -1,5 +1,5 @@
name: Elevator
version: 1.0
version: 1.4
main: de.mviper.elevator.Elevator
api-version: 1.20
author: mviper