TeleportManager.java v1.0
個人/共通転送ポイントの管理と権限制御、カウントダウン・冷却時間・GUI管理をサポート
命令列表
- /warp自分/共通転送ポイントに移動
- /setwarp自分の転送ポイントを設定
- /delwarp自分の転送ポイントを削除
- /warps自分の転送ポイント一覧
- /setpublicwarp共通転送ポイントを設定(管理者)
- /delpublicwarp共通転送ポイントを削除(管理者)
- /publicwarps共通転送ポイント一覧
package com.example.teleportmanager;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* @pluginName TeleportManager
* @author ScriptircAI
* @version 1.0
* @description 個人/共通転送ポイントの管理と権限制御、カウントダウン・冷却時間・GUI管理をサポート
* [command]/warp|自分/共通転送ポイントに移動[/command]
* [command]/setwarp|自分の転送ポイントを設定[/command]
* [command]/delwarp|自分の転送ポイントを削除[/command]
* [command]/warps|自分の転送ポイント一覧[/command]
* [command]/setpublicwarp|共通転送ポイントを設定(管理者)[/command]
* [command]/delpublicwarp|共通転送ポイントを削除(管理者)[/command]
* [command]/publicwarps|共通転送ポイント一覧[/command]
* [Permission]teleport.limit.X|X個まで転送ポイント設定可[/Permission]
* [Permission]teleport.admin|共通転送ポイント管理可[/Permission]
*/
public class TeleportManagerPlugin extends JavaPlugin implements Listener {
// プレイヤーごとの転送ポイント: UUID→(名前→Location)
private final Map<UUID, Map<String, Location>> playerWarps = new ConcurrentHashMap<>();
// 共通転送ポイント: 名前→Location
private final Map<String, Location> publicWarps = new ConcurrentHashMap<>();
// プレイヤーの転送冷却: UUID→タイムスタンプ
private final Map<UUID, Long> cooldowns = new ConcurrentHashMap<>();
// デフォルト設定値
private int defaultLimit = 3;
private int teleportCooldown = 30; // 秒
private int teleportCountdown = 5; // 秒
@Override
public void onEnable() {
// イベント登録
Bukkit.getPluginManager().registerEvents(this, this);
// 設定ロード
loadConfig();
// データロード
loadData();
getLogger().info("TeleportManager 有効化");
}
@Override
public void onDisable() {
saveData();
getLogger().info("TeleportManager 無効化");
}
// 設定ファイルの読み込み
private void loadConfig() {
getConfig().addDefault("defaultLimit", 3);
getConfig().addDefault("teleportCooldown", 30);
getConfig().addDefault("teleportCountdown", 5);
getConfig().options().copyDefaults(true);
saveConfig();
defaultLimit = getConfig().getInt("defaultLimit");
teleportCooldown = getConfig().getInt("teleportCooldown");
teleportCountdown = getConfig().getInt("teleportCountdown");
}
// データ保存(簡易YAML)
private void saveData() {
// プレイヤー転送ポイント
for (UUID uuid : playerWarps.keySet()) {
for (Map.Entry<String, Location> entry : playerWarps.get(uuid).entrySet()) {
Location loc = entry.getValue();
getConfig().set("playerWarps." + uuid + "." + entry.getKey(), serializeLocation(loc));
}
}
// 共通転送ポイント
for (Map.Entry<String, Location> entry : publicWarps.entrySet()) {
getConfig().set("publicWarps." + entry.getKey(), serializeLocation(entry.getValue()));
}
saveConfig();
}
// データ読み込み
private void loadData() {
if (getConfig().isConfigurationSection("playerWarps")) {
for (String uuidStr : getConfig().getConfigurationSection("playerWarps").getKeys(false)) {
UUID uuid = UUID.fromString(uuidStr);
Map<String, Location> warps = new HashMap<>();
for (String name : getConfig().getConfigurationSection("playerWarps." + uuidStr).getKeys(false)) {
String locStr = getConfig().getString("playerWarps." + uuidStr + "." + name);
warps.put(name, deserializeLocation(locStr));
}
playerWarps.put(uuid, warps);
}
}
if (getConfig().isConfigurationSection("publicWarps")) {
for (String name : getConfig().getConfigurationSection("publicWarps").getKeys(false)) {
String locStr = getConfig().getString("publicWarps." + name);
publicWarps.put(name, deserializeLocation(locStr));
}
}
}
// Location→String
private String serializeLocation(Location loc) {
return loc.getWorld().getName() + "," + loc.getX() + "," + loc.getY() + "," + loc.getZ() + "," + loc.getYaw() + "," + loc.getPitch();
}
// String→Location
private Location deserializeLocation(String str) {
String[] parts = str.split(",");
return new Location(Bukkit.getWorld(parts[0]), Double.parseDouble(parts[1]), Double.parseDouble(parts[2]), Double.parseDouble(parts[3]), Float.parseFloat(parts[4]), Float.parseFloat(parts[5]));
}
// コマンド処理
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (!(sender instanceof Player)) {
sender.sendMessage("§cこのコマンドはプレイヤーのみ使用可能です。");
return true;
}
Player player = (Player) sender;
UUID uuid = player.getUniqueId();
String cmdName = cmd.getName().toLowerCase();
switch (cmdName) {
case "setwarp":
if (args.length != 1) {
player.sendMessage("§e/setwarp <名前>");
return true;
}
int limit = getWarpLimit(player);
Map<String, Location> warps = playerWarps.getOrDefault(uuid, new HashMap<>());
if (!warps.containsKey(args[0]) && warps.size() >= limit) {
player.sendMessage("§c転送ポイントの上限(" + limit + ")に達しています。");
return true;
}
warps.put(args[0], player.getLocation());
playerWarps.put(uuid, warps);
player.sendMessage("§a転送ポイント『" + args[0] + "』を設定しました。");
break;
case "delwarp":
if (args.length != 1) {
player.sendMessage("§e/delwarp <名前>");
return true;
}
warps = playerWarps.getOrDefault(uuid, new HashMap<>());
if (warps.remove(args[0]) != null) {
player.sendMessage("§a転送ポイント『" + args[0] + "』を削除しました。");
} else {
player.sendMessage("§cその名前の転送ポイントはありません。");
}
break;
case "warps":
warps = playerWarps.getOrDefault(uuid, new HashMap<>());
if (warps.isEmpty()) {
player.sendMessage("§e転送ポイントはありません。");
} else {
player.sendMessage("§aあなたの転送ポイント一覧:");
for (String name : warps.keySet()) {
player.sendMessage(" - " + name);
}
}
break;
case "warp":
if (args.length != 1) {
player.sendMessage("§e/warp <名前>");
return true;
}
// まず個人→共通の順で検索
warps = playerWarps.getOrDefault(uuid, new HashMap<>());
Location loc = warps.get(args[0]);
boolean isPublic = false;
if (loc == null) {
loc = publicWarps.get(args[0]);
isPublic = true;
}
if (loc == null) {
player.sendMessage("§cその名前の転送ポイントはありません。");
return true;
}
// 冷却チェック
long now = System.currentTimeMillis();
long last = cooldowns.getOrDefault(uuid, 0L);
if (now - last < teleportCooldown * 1000L) {
long left = (teleportCooldown * 1000L - (now - last)) / 1000L;
player.sendMessage("§c転送はクールダウン中です。残り: " + left + "秒");
return true;
}
// カウントダウン
player.sendMessage("§e転送まで " + teleportCountdown + " 秒... 動かずにお待ちください。");
new BukkitRunnable() {
int count = teleportCountdown;
@Override
public void run() {
if (count <= 0) {
player.teleport(loc);
player.sendMessage("§a転送しました!");
cooldowns.put(uuid, System.currentTimeMillis());
cancel();
} else {
player.sendMessage("§e... " + count + " ...");
count--;
}
}
}.runTaskTimer(this, 0, 20);
break;
case "setpublicwarp":
if (!player.hasPermission("teleport.admin")) {
player.sendMessage("§c権限がありません。");
return true;
}
if (args.length != 1) {
player.sendMessage("§e/setpublicwarp <名前>");
return true;
}
publicWarps.put(args[0], player.getLocation());
player.sendMessage("§a共通転送ポイント『" + args[0] + "』を設定しました。");
break;
case "delpublicwarp":
if (!player.hasPermission("teleport.admin")) {
player.sendMessage("§c権限がありません。");
return true;
}
if (args.length != 1) {
player.sendMessage("§e/delpublicwarp <名前>");
return true;
}
if (publicWarps.remove(args[0]) != null) {
player.sendMessage("§a共通転送ポイント『" + args[0] + "』を削除しました。");
} else {
player.sendMessage("§cその名前の共通転送ポイントはありません。");
}
break;
case "publicwarps":
if (publicWarps.isEmpty()) {
player.sendMessage("§e共通転送ポイントはありません。");
} else {
player.sendMessage("§a共通転送ポイント一覧:");
for (String name : publicWarps.keySet()) {
player.sendMessage(" - " + name);
}
}
break;
default:
return false;
}
return true;
}
// 権限による転送ポイント上限取得
private int getWarpLimit(Player player) {
for (int i = 100; i >= 1; i--) {
if (player.hasPermission("teleport.limit." + i)) return i;
}
return defaultLimit;
}
// GUI部分(例: /warpgui で自分の転送ポイント一覧を開く)
// 必要に応じて拡張可能
public void openWarpGUI(Player player) {
Map<String, Location> warps = playerWarps.getOrDefault(player.getUniqueId(), new HashMap<>());
int size = ((warps.size() - 1) / 9 + 1) * 9;
Inventory inv = Bukkit.createInventory(null, Math.max(9, size), "§aあなたの転送ポイント");
int i = 0;
for (String name : warps.keySet()) {
ItemStack item = new ItemStack(Material.ENDER_PEARL);
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(name);
item.setItemMeta(meta);
inv.setItem(i++, item);
}
player.openInventory(inv);
}
// GUIクリックイベント例(詳細は省略、必要に応じて拡張)
//@EventHandler
public void onInventoryClick(InventoryClickEvent event) {
// ここでクリックされたアイテム名から転送処理などを行う
}
//@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
// プレイヤー退出時にデータ保存など必要に応じて
}
}