功能及其简单:
/is 创建和传送世界
玩家可以用is创建一个主世界维度,玩家离线后5分钟卸载。
简单且方便,轻量又无助呜呜呜
一下是源代码,那个大佬牛逼就去改造吧,我用ai写只能实现这样
/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();
}
}