Paper1.21.11Resmi#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.

MinborAIminborai 1 0 0 0
Kaynak kod (ZIP)
Tüm hakları saklıdırSunucuda kullanDeğiştirTicari· Atıf gerekli
src/main/java/com/minborai/evsistemi/EvSistemi.java
1package com.minborai.evsistemi;
2
3import 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;
14
15import 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;
24
25public final class EvSistemi extends JavaPlugin {
26
27 private static final MiniMessage MM = MiniMessage.miniMessage();
28 private static final Pattern NAME = Pattern.compile("[a-z0-9_-]{1,16}");
29
30 private File homesFile;
31 private YamlConfiguration homes;
32 private Teleporter teleporter;
33
34 @Override
35 public void onEnable() {
36 saveDefaultConfig();
37 homesFile = new File(getDataFolder(), "homes.yml");
38 homes = YamlConfiguration.loadConfiguration(homesFile);
39 teleporter = new Teleporter(this);
40 }
41
42 @Override
43 public void onDisable() {
44 save();
45 }
46
47 private void save() {
48 try {
49 homes.save(homesFile);
50 } catch (IOException e) {
51 getLogger().warning("homes.yml kaydedilemedi: " + e.getMessage());
52 }
53 }
54
55 private Component text(String key, String... pairs) {
56 List<TagResolver> tags = new ArrayList<>();
57 for (int i = 0; i + 1 < pairs.length; i += 2) tags.add(Placeholder.unparsed(pairs[i], pairs[i + 1]));
58 String raw = getConfig().getString("messages.prefix", "") + getConfig().getString("messages." + key, key);
59 return MM.deserialize(raw, TagResolver.resolver(tags));
60 }
61
62 private Set<String> names(UUID id) {
63 ConfigurationSection sec = homes.getConfigurationSection(id.toString());
64 return sec == null ? Collections.emptySet() : sec.getKeys(false);
65 }
66
67 private int limit(Player player) {
68 if (player.hasPermission("homes.unlimited")) return Integer.MAX_VALUE;
69 for (int i = 100; i >= 1; i--) {
70 if (player.hasPermission("homes.limit." + i)) return i;
71 }
72 return getConfig().getInt("default-limit", 3);
73 }
74
75 @Override
76 public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
77 if (!(sender instanceof Player player)) {
78 sender.sendMessage(text("players-only"));
79 return true;
80 }
81 UUID id = player.getUniqueId();
82 Set<String> existing = names(id);
83 String name = args.length > 0 ? args[0].toLowerCase(Locale.ROOT) : (existing.size() == 1 && !command.getName().equals("sethome") ? existing.iterator().next() : "home");
84
85 switch (command.getName()) {
86 case "sethome" -> {
87 if (!NAME.matcher(name).matches()) {
88 player.sendMessage(text("invalid-name"));
89 return true;
90 }
91 if (!existing.contains(name) && existing.size() >= limit(player)) {
92 player.sendMessage(text("limit", "limit", String.valueOf(limit(player))));
93 return true;
94 }
95 homes.set(id + "." + name, player.getLocation());
96 save();
97 player.sendMessage(text("set", "home", name));
98 }
99 case "home" -> {
100 Location loc = homes.getLocation(id + "." + name);
101 if (loc == null || loc.getWorld() == null) {
102 player.sendMessage(text("not-found", "home", name));
103 return true;
104 }
105 int seconds = player.hasPermission("homes.bypass.warmup") ? 0 : getConfig().getInt("warmup-seconds", 3);
106 if (seconds > 0) player.sendMessage(text("warmup", "seconds", String.valueOf(seconds)));
107 teleporter.teleport(player, loc, seconds, () -> text("teleported", "home", name), () -> text("cancelled"));
108 }
109 case "delhome" -> {
110 if (args.length == 0 || !existing.contains(name)) {
111 player.sendMessage(text("not-found", "home", name));
112 return true;
113 }
114 homes.set(id + "." + name, null);
115 save();
116 player.sendMessage(text("deleted", "home", name));
117 }
118 case "homes" -> {
119 if (existing.isEmpty()) {
120 player.sendMessage(text("none"));
121 } else {
122 int max = limit(player);
123 player.sendMessage(text("list", "homes", String.join(", ", existing), "count", String.valueOf(existing.size()), "limit", max == Integer.MAX_VALUE ? "∞" : String.valueOf(max)));
124 }
125 }
126 default -> {
127 return false;
128 }
129 }
130 return true;
131 }
132
133 @Override
134 public List<String> onTabComplete(CommandSender sender, Command command, String alias, String[] args) {
135 if (!(sender instanceof Player player) || args.length != 1 || command.getName().equals("homes")) return Collections.emptyList();
136 String prefix = args[0].toLowerCase(Locale.ROOT);
137 List<String> out = new ArrayList<>();
138 for (String n : names(player.getUniqueId())) if (n.startsWith(prefix)) out.add(n);
139 return out;
140 }
141}
142