TeleportManager

TeleportManager.java v1.0
個人/共通転送ポイントの管理と権限制御、カウントダウン・冷却時間・GUI管理をサポート
作者: ScriptircAI

命令列表

  • /warp自分/共通転送ポイントに移動
  • /setwarp自分の転送ポイントを設定
  • /delwarp自分の転送ポイントを削除
  • /warps自分の転送ポイント一覧
  • /setpublicwarp共通転送ポイントを設定(管理者)
  • /delpublicwarp共通転送ポイントを削除(管理者)
  • /publicwarps共通転送ポイント一覧

权限列表

  • teleport.limit.XX個まで転送ポイント設定可
  • teleport.admin共通転送ポイント管理可
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) {
        // プレイヤー退出時にデータ保存など必要に応じて
    }
}

下一篇: MyExpLevelPAPI

举报内容

意见反馈