Paper1.21.11Official#ev#ışınlanma#komut#temel
Ev Sistemi
/sethome, /home, /delhome, /homes: izinle ev sınırı, ışınlanma bekleme süresi (hareketle iptal), sekme tamamlama, YAML kayıt.
Tüm hakları saklıdırUse on serverModifyCommercial· Attribution
src/main/java/com/minborai/evsistemi/EvSistemi.java
1package com.minborai.evsistemi;23import net.kyori.adventure.text.Component;4import net.kyori.adventure.text.minimessage.MiniMessage;5import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;6import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;7import org.bukkit.Location;8import org.bukkit.command.Command;9import org.bukkit.command.CommandSender;10import org.bukkit.configuration.ConfigurationSection;11import org.bukkit.configuration.file.YamlConfiguration;12import org.bukkit.entity.Player;13import org.bukkit.plugin.java.JavaPlugin;1415import java.io.File;16import java.io.IOException;17import java.util.ArrayList;18import java.util.Collections;19import java.util.List;20import java.util.Locale;21import java.util.Set;22import java.util.UUID;23import java.util.regex.Pattern;2425public final class EvSistemi extends JavaPlugin {2627private static final MiniMessage MM = MiniMessage.miniMessage();28private static final Pattern NAME = Pattern.compile("[a-z0-9_-]{1,16}");2930private File homesFile;31private YamlConfiguration homes;32private Teleporter teleporter;3334@Override35public void onEnable() {36saveDefaultConfig();37homesFile = new File(getDataFolder(), "homes.yml");38homes = YamlConfiguration.loadConfiguration(homesFile);39teleporter = new Teleporter(this);40}4142@Override43public void onDisable() {44save();45}4647private void save() {48try {49homes.save(homesFile);50} catch (IOException e) {51getLogger().warning("homes.yml kaydedilemedi: " + e.getMessage());52}53}5455private Component text(String key, String... pairs) {56List<TagResolver> tags = new ArrayList<>();57for (int i = 0; i + 1 < pairs.length; i += 2) tags.add(Placeholder.unparsed(pairs[i], pairs[i + 1]));58String raw = getConfig().getString("messages.prefix", "") + getConfig().getString("messages." + key, key);59return MM.deserialize(raw, TagResolver.resolver(tags));60}6162private Set<String> names(UUID id) {63ConfigurationSection sec = homes.getConfigurationSection(id.toString());64return sec == null ? Collections.emptySet() : sec.getKeys(false);65}6667private int limit(Player player) {68if (player.hasPermission("homes.unlimited")) return Integer.MAX_VALUE;69for (int i = 100; i >= 1; i--) {70if (player.hasPermission("homes.limit." + i)) return i;71}72return getConfig().getInt("default-limit", 3);73}7475@Override76public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {77if (!(sender instanceof Player player)) {78sender.sendMessage(text("players-only"));79return true;80}81UUID id = player.getUniqueId();82Set<String> existing = names(id);83String name = args.length > 0 ? args[0].toLowerCase(Locale.ROOT) : (existing.size() == 1 && !command.getName().equals("sethome") ? existing.iterator().next() : "home");8485switch (command.getName()) {86case "sethome" -> {87if (!NAME.matcher(name).matches()) {88player.sendMessage(text("invalid-name"));89return true;90}91if (!existing.contains(name) && existing.size() >= limit(player)) {92player.sendMessage(text("limit", "limit", String.valueOf(limit(player))));93return true;94}95homes.set(id + "." + name, player.getLocation());96save();97player.sendMessage(text("set", "home", name));98}99case "home" -> {100Location loc = homes.getLocation(id + "." + name);101if (loc == null || loc.getWorld() == null) {102player.sendMessage(text("not-found", "home", name));103return true;104}105int seconds = player.hasPermission("homes.bypass.warmup") ? 0 : getConfig().getInt("warmup-seconds", 3);106if (seconds > 0) player.sendMessage(text("warmup", "seconds", String.valueOf(seconds)));107teleporter.teleport(player, loc, seconds, () -> text("teleported", "home", name), () -> text("cancelled"));108}109case "delhome" -> {110if (args.length == 0 || !existing.contains(name)) {111player.sendMessage(text("not-found", "home", name));112return true;113}114homes.set(id + "." + name, null);115save();116player.sendMessage(text("deleted", "home", name));117}118case "homes" -> {119if (existing.isEmpty()) {120player.sendMessage(text("none"));121} else {122int max = limit(player);123player.sendMessage(text("list", "homes", String.join(", ", existing), "count", String.valueOf(existing.size()), "limit", max == Integer.MAX_VALUE ? "∞" : String.valueOf(max)));124}125}126default -> {127return false;128}129}130return true;131}132133@Override134public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {135if (!(sender instanceof Player player) || args.length != 1 || command.getName().equals("homes")) return Collections.emptyList();136String prefix = args[0].toLowerCase(Locale.ROOT);137List<String> out = new ArrayList<>();138for (String n : names(player.getUniqueId())) if (n.startsWith(prefix)) out.add(n);139return out;140}141}142