Update from Git Manager GUI
This commit is contained in:
@@ -1,39 +1,91 @@
|
|||||||
package de.mviper.elevator;
|
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.Material;
|
||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
|
import org.bukkit.configuration.ConfigurationSection;
|
||||||
import org.bukkit.enchantments.Enchantment;
|
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.ItemFlag;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.ShapedRecipe;
|
import org.bukkit.inventory.ShapedRecipe;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
import java.util.Arrays;
|
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 static Elevator instance;
|
||||||
private DatabaseManager databaseManager;
|
private DatabaseManager databaseManager;
|
||||||
private HologramManager hologramManager;
|
private HologramManager hologramManager;
|
||||||
|
private String latestVersionFound;
|
||||||
|
private final String releaseUrl = "https://git.viper.ipv64.net/M_Viper/Elevator/releases";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
instance = this;
|
instance = this;
|
||||||
saveDefaultConfig();
|
saveDefaultConfig();
|
||||||
|
|
||||||
this.databaseManager = new DatabaseManager();
|
this.databaseManager = new DatabaseManager();
|
||||||
this.hologramManager = new HologramManager();
|
this.hologramManager = new HologramManager();
|
||||||
hologramManager.purgeAllHolograms();
|
hologramManager.purgeAllHolograms();
|
||||||
|
|
||||||
|
// Events & Commands registrieren
|
||||||
getServer().getPluginManager().registerEvents(new ElevatorListener(), this);
|
getServer().getPluginManager().registerEvents(new ElevatorListener(), this);
|
||||||
|
getServer().getPluginManager().registerEvents(this, this);
|
||||||
getCommand("elevator").setExecutor(new ElevatorCommand());
|
getCommand("elevator").setExecutor(new ElevatorCommand());
|
||||||
|
|
||||||
|
// Rezept laden
|
||||||
registerElevatorRecipe();
|
registerElevatorRecipe();
|
||||||
|
|
||||||
|
// Update Check starten
|
||||||
|
checkForUpdates();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkForUpdates() {
|
||||||
|
new UpdateChecker(this).getLatestVersion(version -> {
|
||||||
|
this.latestVersionFound = version;
|
||||||
|
String currentVersion = this.getDescription().getVersion();
|
||||||
|
|
||||||
|
if (!currentVersion.equalsIgnoreCase(version)) {
|
||||||
|
getLogger().info("====================================================");
|
||||||
|
getLogger().info("NEUES UPDATE VERFÜGBAR: " + version);
|
||||||
|
getLogger().info("Download: " + releaseUrl);
|
||||||
|
getLogger().info("====================================================");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@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 Release-Seite")));
|
||||||
|
|
||||||
|
message.addExtra(link);
|
||||||
|
player.spigot().sendMessage(message);
|
||||||
|
player.sendMessage(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Registriert das Elevator-Modul Rezept basierend auf der Config-Einstellung.
|
|
||||||
* Unterstützte Rezept-Typen: "standard", "expensive"
|
|
||||||
*/
|
|
||||||
private void registerElevatorRecipe() {
|
private void registerElevatorRecipe() {
|
||||||
// Erstelle das Elevator-Modul Item
|
// Das Resultat-Item (Aufzug-Modul)
|
||||||
ItemStack item = new ItemStack(Material.DAYLIGHT_DETECTOR);
|
ItemStack item = new ItemStack(Material.DAYLIGHT_DETECTOR);
|
||||||
ItemMeta meta = item.getItemMeta();
|
ItemMeta meta = item.getItemMeta();
|
||||||
if (meta != null) {
|
if (meta != null) {
|
||||||
@@ -48,56 +100,71 @@ public class Elevator extends JavaPlugin {
|
|||||||
item.setItemMeta(meta);
|
item.setItemMeta(meta);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lese Rezept-Typ aus der Config (Standard: "standard")
|
NamespacedKey key = new NamespacedKey(this, "elevator_module");
|
||||||
String recipeType = getConfig().getString("recipe.type", "standard").toLowerCase();
|
ShapedRecipe recipe = new ShapedRecipe(key, item);
|
||||||
|
|
||||||
// Erstelle das ShapedRecipe
|
// Shape laden und bereinigen (verhindert den "Length 5" Fehler)
|
||||||
ShapedRecipe recipe = new ShapedRecipe(new NamespacedKey(this, "elevator_module"), item);
|
List<String> shapeLines = getConfig().getStringList("recipe.shape");
|
||||||
|
if (shapeLines.size() != 3) {
|
||||||
// Wähle das Rezept basierend auf dem Config-Wert
|
getLogger().severe("Rezept konnte nicht geladen werden: 'shape' benötigt genau 3 Zeilen!");
|
||||||
switch (recipeType) {
|
return;
|
||||||
case "expensive":
|
}
|
||||||
// Teures Rezept:
|
|
||||||
// D E D D = DIAMOND
|
String[] cleanedRows = new String[3];
|
||||||
// E I E E = ENDER_PEARL
|
for (int i = 0; i < 3; i++) {
|
||||||
// D E D I = IRON_BLOCK
|
// Entferne alle Leerzeichen für die interne Verarbeitung
|
||||||
recipe.shape("DED", "EIE", "DED");
|
String line = shapeLines.get(i).replace(" ", "");
|
||||||
recipe.setIngredient('D', Material.DIAMOND);
|
|
||||||
recipe.setIngredient('E', Material.ENDER_PEARL);
|
// Mit Leerzeichen auffüllen, falls die Zeile kürzer als 3 ist
|
||||||
recipe.setIngredient('I', Material.IRON_BLOCK);
|
while (line.length() < 3) {
|
||||||
getLogger().info("§aElevator-Rezept aktiviert: §eExpensive (Diamanten + Enderperlen)");
|
line += " ";
|
||||||
break;
|
}
|
||||||
|
// Kürzen, falls sie länger als 3 ist
|
||||||
case "standard":
|
if (line.length() > 3) {
|
||||||
default:
|
line = line.substring(0, 3);
|
||||||
// Standard-Rezept:
|
}
|
||||||
// S . S S = DAYLIGHT_DETECTOR
|
cleanedRows[i] = line;
|
||||||
// . I . I = IRON_BLOCK
|
}
|
||||||
// S . S
|
|
||||||
recipe.shape("S.S", ".I.", "S.S");
|
recipe.shape(cleanedRows[0], cleanedRows[1], cleanedRows[2]);
|
||||||
recipe.setIngredient('S', Material.DAYLIGHT_DETECTOR);
|
|
||||||
recipe.setIngredient('I', Material.IRON_BLOCK);
|
// Zutaten zuweisen
|
||||||
getLogger().info("§aElevator-Rezept aktiviert: §eStandard (Daylight Detector + Iron Block)");
|
ConfigurationSection section = getConfig().getConfigurationSection("recipe.ingredients");
|
||||||
break;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rezept zum Server hinzufügen
|
|
||||||
try {
|
try {
|
||||||
|
getServer().removeRecipe(key);
|
||||||
getServer().addRecipe(recipe);
|
getServer().addRecipe(recipe);
|
||||||
|
getLogger().info("Elevator: Crafting-Rezept erfolgreich registriert.");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
getLogger().warning("§cKonnte Elevator-Rezept nicht registrieren: " + e.getMessage());
|
getLogger().log(Level.WARNING, "Fehler beim Rezept-Setup: {0}", e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Elevator getInstance() {
|
public static Elevator getInstance() { return instance; }
|
||||||
return instance;
|
public DatabaseManager getDatabaseManager() { return databaseManager; }
|
||||||
}
|
public HologramManager getHologramManager() { return hologramManager; }
|
||||||
|
|
||||||
public DatabaseManager getDatabaseManager() {
|
|
||||||
return databaseManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public HologramManager getHologramManager() {
|
|
||||||
return hologramManager;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
43
src/main/java/de/mviper/elevator/UpdateChecker.java
Normal file
43
src/main/java/de/mviper/elevator/UpdateChecker.java
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
package de.mviper.elevator;
|
||||||
|
|
||||||
|
import com.google.gson.JsonObject;
|
||||||
|
import com.google.gson.JsonParser;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public class UpdateChecker {
|
||||||
|
|
||||||
|
private final Elevator plugin;
|
||||||
|
private final String versionUrl = "https://git.viper.ipv64.net/api/v1/repos/M_Viper/Elevator/releases/latest";
|
||||||
|
|
||||||
|
public UpdateChecker(Elevator plugin) {
|
||||||
|
this.plugin = plugin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void getLatestVersion(Consumer<String> consumer) {
|
||||||
|
Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> {
|
||||||
|
try {
|
||||||
|
HttpURLConnection connection = (HttpURLConnection) new URL(versionUrl).openConnection();
|
||||||
|
connection.setRequestMethod("GET");
|
||||||
|
connection.setConnectTimeout(5000);
|
||||||
|
connection.setReadTimeout(5000);
|
||||||
|
|
||||||
|
if (connection.getResponseCode() == 200) {
|
||||||
|
InputStreamReader reader = new InputStreamReader(connection.getInputStream());
|
||||||
|
JsonObject jsonResponse = JsonParser.parseReader(reader).getAsJsonObject();
|
||||||
|
// Holt den Tag-Namen (z.B. v1.1) aus der Gitea API
|
||||||
|
if (jsonResponse.has("tag_name")) {
|
||||||
|
String latestVersion = jsonResponse.get("tag_name").getAsString();
|
||||||
|
consumer.accept(latestVersion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
plugin.getLogger().warning("Update-Check fehlgeschlagen: " + e.getMessage());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,8 @@
|
|||||||
# Elevator Config by mviper
|
# =============================================================
|
||||||
|
# Elevator Config by M_Viper
|
||||||
|
# =============================================================
|
||||||
|
|
||||||
|
# Datenbank-Einstellungen (SQLite wird standardmäßig genutzt, falls false)
|
||||||
mysql:
|
mysql:
|
||||||
enable: false
|
enable: false
|
||||||
host: "localhost"
|
host: "localhost"
|
||||||
@@ -7,51 +11,64 @@ mysql:
|
|||||||
user: "root"
|
user: "root"
|
||||||
password: ""
|
password: ""
|
||||||
|
|
||||||
|
# Allgemeine Aufzug-Logik
|
||||||
settings:
|
settings:
|
||||||
max-distance: 64
|
max-distance: 64 # Maximale Reichweite zwischen zwei Modulen
|
||||||
hologram-duration: 45
|
hologram-duration: 45 # Wie lange das Hologramm (in Ticks) sichtbar bleibt
|
||||||
cooldown: 500
|
cooldown: 500 # Wartezeit zwischen Teleports (in Millisekunden)
|
||||||
|
|
||||||
|
# Optische Effekte & Hologramme
|
||||||
visuals:
|
visuals:
|
||||||
enable-particles: true
|
enable-particles: true
|
||||||
particle-type: "FIREWORKS_SPARK"
|
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«"
|
hologram-text: "&8&l» &b&lEtage %floor% &8&l«"
|
||||||
|
actionbar-text: "&fTransport: &b&lEtage %floor%"
|
||||||
|
|
||||||
|
# Darstellung des Hologramms
|
||||||
hologram-height-offset: 2.2
|
hologram-height-offset: 2.2
|
||||||
hologram-scale: 1.5
|
hologram-scale: 1.5
|
||||||
actionbar-text: "&fTransport: &b&lEtage %floor%"
|
|
||||||
|
# Hintergrund-Box (RGBA Werte)
|
||||||
hologram-background-color:
|
hologram-background-color:
|
||||||
alpha: 120
|
alpha: 120
|
||||||
red: 0
|
red: 0
|
||||||
green: 0
|
green: 0
|
||||||
blue: 0
|
blue: 0
|
||||||
|
|
||||||
|
# Akustisches Feedback
|
||||||
sounds:
|
sounds:
|
||||||
enable: true
|
enable: true
|
||||||
type: "BLOCK_NOTE_BLOCK_CHIME"
|
type: "BLOCK_NOTE_BLOCK_CHIME"
|
||||||
volume: 1.0
|
volume: 1.0
|
||||||
pitch: 1.5
|
pitch: 1.5
|
||||||
|
|
||||||
|
# Nachrichten-System
|
||||||
messages:
|
messages:
|
||||||
prefix: "&8[&bElevator&8] "
|
prefix: "&8[&bElevator&8] "
|
||||||
registered: "&aModul erfolgreich registriert!"
|
registered: "&aModul erfolgreich registriert!"
|
||||||
no-target: "&cKeine weitere Etage gefunden."
|
no-target: "&cKeine weitere Etage gefunden."
|
||||||
|
|
||||||
# ============================================
|
# =============================================================
|
||||||
# REZEPT-AUSWAHL
|
# REZEPT-EINSTELLUNGEN
|
||||||
# ============================================
|
# =============================================================
|
||||||
# Hier kannst du zwischen verschiedenen Crafting-Rezepten wählen.
|
# Crafting-Gitter Übersicht:
|
||||||
# Mögliche Werte: "standard", "expensive"
|
# [ 1 | 2 | 3 ] -> Zeile 1
|
||||||
#
|
# [ 4 | 5 | 6 ] -> Zeile 2
|
||||||
Standard-Rezept:
|
# [ 7 | 8 | 9 ] -> Zeile 3
|
||||||
S.S S = DAYLIGHT_DETECTOR
|
# =============================================================
|
||||||
.I. I = IRON_BLOCK
|
|
||||||
S.S
|
|
||||||
#
|
|
||||||
Teures Rezept (Expensive):
|
|
||||||
DED D = DIAMOND
|
|
||||||
EIE E = ENDER_PEARL
|
|
||||||
DED I = IRON_BLOCK
|
|
||||||
|
|
||||||
recipe:
|
recipe:
|
||||||
type: "standard"
|
# 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"
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
name: Elevator
|
name: Elevator
|
||||||
version: 1.1
|
version: 1.2
|
||||||
main: de.mviper.elevator.Elevator
|
main: de.mviper.elevator.Elevator
|
||||||
api-version: 1.20
|
api-version: 1.20
|
||||||
author: mviper
|
author: mviper
|
||||||
|
|||||||
Reference in New Issue
Block a user