Paper1.21.11Official#spawn#warp#ışınlanma#sunucu
Spawn ve Warp
/spawn, /setspawn, /warp, /setwarp, /delwarp, /warps: ilk girişte ve ölünce spawn'a gönderme, bekleme süresi, yönetici izinleri.
Tüm hakları saklıdırUse on serverModifyCommercial· Attribution
src/main/java/com/minborai/spawnvewarp/SpawnVeWarp.java
1package com.minborai.spawnvewarp;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.event.EventHandler;14import org.bukkit.event.Listener;15import org.bukkit.event.player.PlayerJoinEvent;16import org.bukkit.event.player.PlayerRespawnEvent;17import org.bukkit.plugin.java.JavaPlugin;1819import java.io.File;20import java.io.IOException;21import java.util.ArrayList;22import java.util.Collections;23import java.util.List;24import java.util.Locale;25import java.util.Set;26import java.util.regex.Pattern;2728public final class SpawnVeWarp extends JavaPlugin implements Listener {2930private static final MiniMessage MM = MiniMessage.miniMessage();31private static final Pattern NAME = Pattern.compile("[a-z0-9_-]{1,24}");3233private File dataFile;34private YamlConfiguration data;35private Teleporter teleporter;3637@Override38public void onEnable() {39saveDefaultConfig();40dataFile = new File(getDataFolder(), "data.yml");41data = YamlConfiguration.loadConfiguration(dataFile);42teleporter = new Teleporter(this);43getServer().getPluginManager().registerEvents(this, this);44}4546private void save() {47try {48data.save(dataFile);49} catch (IOException e) {50getLogger().warning("data.yml kaydedilemedi: " + e.getMessage());51}52}5354private Component text(String key, String... pairs) {55List<TagResolver> tags = new ArrayList<>();56for (int i = 0; i + 1 < pairs.length; i += 2) tags.add(Placeholder.unparsed(pairs[i], pairs[i + 1]));57return MM.deserialize(getConfig().getString("messages.prefix", "") + getConfig().getString("messages." + key, key), TagResolver.resolver(tags));58}5960private Location spawn() {61Location loc = data.getLocation("spawn");62return loc != null && loc.getWorld() != null ? loc : null;63}6465private Set<String> warps() {66ConfigurationSection sec = data.getConfigurationSection("warps");67return sec == null ? Collections.emptySet() : sec.getKeys(false);68}6970private int warmup(Player player) {71return player.hasPermission("warps.bypass.warmup") ? 0 : getConfig().getInt("warmup-seconds", 3);72}7374@EventHandler75public void onJoin(PlayerJoinEvent event) {76Location loc = spawn();77if (loc != null && !event.getPlayer().hasPlayedBefore() && getConfig().getBoolean("spawn-on-first-join", true)) {78event.getPlayer().teleportAsync(loc);79}80}8182@EventHandler83public void onRespawn(PlayerRespawnEvent event) {84Location loc = spawn();85if (loc != null && getConfig().getBoolean("respawn-at-spawn", true) && !event.isBedSpawn() && !event.isAnchorSpawn()) {86event.setRespawnLocation(loc);87}88}8990@Override91public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {92if (!(sender instanceof Player player)) {93sender.sendMessage(text("players-only"));94return true;95}96switch (command.getName()) {97case "setspawn" -> {98data.set("spawn", player.getLocation());99save();100player.sendMessage(text("spawn-set"));101}102case "spawn" -> {103Location loc = spawn();104if (loc == null) {105player.sendMessage(text("no-spawn"));106return true;107}108int s = warmup(player);109if (s > 0) player.sendMessage(text("warmup", "seconds", String.valueOf(s)));110teleporter.teleport(player, loc, s, () -> text("spawn-teleported"), () -> text("cancelled"));111}112case "setwarp", "delwarp", "warp" -> {113if (args.length == 0) return false;114String name = args[0].toLowerCase(Locale.ROOT);115if (!NAME.matcher(name).matches()) {116player.sendMessage(text("invalid-name"));117return true;118}119String path = "warps." + name;120if (command.getName().equals("setwarp")) {121data.set(path, player.getLocation());122save();123player.sendMessage(text("warp-set", "warp", name));124} else if (command.getName().equals("delwarp")) {125if (!data.contains(path)) {126player.sendMessage(text("warp-not-found", "warp", name));127return true;128}129data.set(path, null);130save();131player.sendMessage(text("warp-deleted", "warp", name));132} else {133Location loc = data.getLocation(path);134if (loc == null || loc.getWorld() == null) {135player.sendMessage(text("warp-not-found", "warp", name));136return true;137}138if (getConfig().getBoolean("per-warp-permission", false) && !player.hasPermission("warps.warp." + name)) {139player.sendMessage(text("no-permission"));140return true;141}142int s = warmup(player);143if (s > 0) player.sendMessage(text("warmup", "seconds", String.valueOf(s)));144teleporter.teleport(player, loc, s, () -> text("warp-teleported", "warp", name), () -> text("cancelled"));145}146}147case "warps" -> {148Set<String> all = warps();149player.sendMessage(all.isEmpty() ? text("no-warps") : text("warp-list", "warps", String.join(", ", all)));150}151default -> {152return false;153}154}155return true;156}157158@Override159public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {160if (args.length != 1 || !(command.getName().equals("warp") || command.getName().equals("delwarp"))) return Collections.emptyList();161String prefix = args[0].toLowerCase(Locale.ROOT);162List<String> out = new ArrayList<>();163for (String w : warps()) if (w.startsWith(prefix)) out.add(w);164return out;165}166}167