• 【MineBBS社区发展意见征集】

    欢迎参与MineBBS社区调查,助力打造更好Minecraft社区!完成问卷可获赠200金粒,优质回答可额外获得200金粒(限5名),快来参与吧!【点击参与】

资源图标

原创 开源 世界管理 独立世界 1.0

请登录后获取
版权类型
原创
插件中文名称
独立世界
插件英文名称
IslandPlugin
原帖地址
#
支持的核心(服务端)
  1. Paper
语言支持
中文(简体)
前置组件
适配版本(Java)
  1. 1.21
功能及其简单:
/is 创建和传送世界
玩家可以用is创建一个主世界维度,玩家离线后5分钟卸载。
简单且方便,轻量又无助呜呜呜

一下是源代码,那个大佬牛逼就去改造吧,我用ai写只能实现这样

代码:
import org.bukkit.*;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitTask;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class IslandPlugin extends JavaPlugin implements Listener {

    private final Map<UUID, World> playerWorlds = new HashMap<>();
    private final Map<UUID, BukkitTask> unloadTasks = new HashMap<>();

    @Override
    public void onEnable() {
        getServer().getPluginManager().registerEvents(this, this);
        getCommand("is").setExecutor(new IslandCommand());
    }

    class IslandCommand implements CommandExecutor {
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
            if (!(sender instanceof Player player)) {
                sender.sendMessage("§c只有玩家可以使用此命令");
                return true;
            }

            UUID playerId = player.getUniqueId();
            String worldName = "island_" + playerId;

            // 处理现有世界
            if (handleExistingWorld(player, playerId)) return true;

            // 创建/加载世界
            World world = Bukkit.getWorld(worldName) != null ?
                Bukkit.getWorld(worldName) :
                createNewWorld(worldName);

            if (world == null) {
                player.sendMessage("§c世界加载失败");
                return true;
            }

            playerWorlds.put(playerId, world);
            teleportPlayer(player, world);
            return true;
        }

        private boolean handleExistingWorld(Player player, UUID playerId) {
            if (playerWorlds.containsKey(playerId)) {
                World world = playerWorlds.get(playerId);
                teleportPlayer(player, world);
                return true;
            }
            return false;
        }

        private World createNewWorld(String worldName) {
            return new WorldCreator(worldName)
                .environment(World.Environment.NORMAL)
                .generateStructures(true)
                .createWorld();
        }

        private void teleportPlayer(Player player, World world) {
            Location spawn = world.getSpawnLocation();
            if (spawn.getY() == 0) { // 防止生成在虚空
                spawn.setY(world.getHighestBlockYAt(spawn) + 1);
                world.setSpawnLocation(spawn);
            }
            
            player.teleportAsync(spawn).thenRun(() ->
                player.sendMessage("§a已传送至你的岛屿世界"));
        }
    }

    @EventHandler
    public void onPlayerQuit(PlayerQuitEvent event) {
        Player player = event.getPlayer();
        UUID playerId = player.getUniqueId();

        if (playerWorlds.containsKey(playerId)) {
            scheduleUnloadTask(playerId);
        }
    }

    private void scheduleUnloadTask(UUID playerId) {
        // 取消已有卸载任务
        if (unloadTasks.containsKey(playerId)) {
            unloadTasks.get(playerId).cancel();
        }

        // 新建5分钟卸载任务
        BukkitTask task = Bukkit.getScheduler().runTaskLater(this, () -> {
            World world = playerWorlds.get(playerId);
            if (world != null && world.getPlayers().isEmpty()) {
                Bukkit.unloadWorld(world, true);
                playerWorlds.remove(playerId);
            }
            unloadTasks.remove(playerId);
        }, 20L * 60 * 5); // 5分钟

        unloadTasks.put(playerId, task);
    }

    @Override
    public void onDisable() {
        // 安全卸载所有世界
        playerWorlds.values().forEach(world -> {
            if (!world.getPlayers().isEmpty()) {
                world.getPlayers().forEach(p -> p.teleportAsync(Bukkit.getWorlds().get(0).getSpawnLocation()));
            }
            Bukkit.unloadWorld(world, true);
        });
        playerWorlds.clear();
    }
}
作者
NaiveGod
价格
200金粒
下载
1
查看
196
首次发布
最后更新

评分

0.00 星 0 次评分

NaiveGod 的其他资源

最新更新

  1. 优化存档名称

    优化存档名称,增加前置+玩家id
后退
顶部 底部