From f1a2a5c2d4e068fc8bd97dc8dd6f7ab6d9502f9b Mon Sep 17 00:00:00 2001 From: CarmJos Date: Thu, 16 Dec 2021 03:12:01 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=94=A8=E6=88=B7home?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=9A=84=E5=8A=A0=E8=BD=BD=E4=B8=8E=E5=AD=98?= =?UTF-8?q?=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cc/carm/plugin/moeteleport/Main.java | 16 +- .../configuration/file/FileConfig.java | 2 +- .../configuration/location/DataLocation.java | 166 ++++++++++++++++++ .../moeteleport/listener/UserListener.java | 19 ++ .../moeteleport/manager/UserManager.java | 44 +++++ .../plugin/moeteleport/user/UserData.java | 77 ++++++++ 6 files changed, 322 insertions(+), 2 deletions(-) create mode 100644 src/main/java/cc/carm/plugin/moeteleport/configuration/location/DataLocation.java diff --git a/src/main/java/cc/carm/plugin/moeteleport/Main.java b/src/main/java/cc/carm/plugin/moeteleport/Main.java index c270913..35ad977 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/Main.java +++ b/src/main/java/cc/carm/plugin/moeteleport/Main.java @@ -2,6 +2,7 @@ package cc.carm.plugin.moeteleport; import cc.carm.plugin.moeteleport.listener.UserListener; import cc.carm.plugin.moeteleport.manager.ConfigManager; +import cc.carm.plugin.moeteleport.manager.UserManager; import cc.carm.plugin.moeteleport.util.ColorParser; import org.bukkit.Bukkit; import org.bukkit.command.CommandExecutor; @@ -17,6 +18,8 @@ public class Main extends JavaPlugin { private static Main instance; public static boolean debugMode = true; + private UserManager userManager; + @Override public void onEnable() { instance = this; @@ -26,6 +29,9 @@ public class Main extends JavaPlugin { log("加载配置文件..."); ConfigManager.initConfig(); + log("加载用户管理器..."); + this.userManager = new UserManager(this); + log("注册监听器..."); regListener(new UserListener()); @@ -57,9 +63,13 @@ public class Main extends JavaPlugin { Bukkit.getConsoleSender().sendMessage(ColorParser.parse("[" + getInstance().getName() + "] " + message)); } + public static void error(String message) { + log("&4[ERROR] &r" + message); + } + public static void debug(String message) { if (debugMode) { - log("[DEBUG] " + message); + log("&b[DEBUG] &r" + message); } } @@ -81,4 +91,8 @@ public class Main extends JavaPlugin { if (tabCompleter != null) command.setTabCompleter(tabCompleter); } + public static UserManager getUserManager() { + return Main.getInstance().userManager; + } + } diff --git a/src/main/java/cc/carm/plugin/moeteleport/configuration/file/FileConfig.java b/src/main/java/cc/carm/plugin/moeteleport/configuration/file/FileConfig.java index ff2bf62..93b38da 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/configuration/file/FileConfig.java +++ b/src/main/java/cc/carm/plugin/moeteleport/configuration/file/FileConfig.java @@ -11,9 +11,9 @@ import java.io.IOException; public class FileConfig { private final JavaPlugin plugin; - private final String fileName; + private File file; private FileConfiguration config; diff --git a/src/main/java/cc/carm/plugin/moeteleport/configuration/location/DataLocation.java b/src/main/java/cc/carm/plugin/moeteleport/configuration/location/DataLocation.java new file mode 100644 index 0000000..4deef7f --- /dev/null +++ b/src/main/java/cc/carm/plugin/moeteleport/configuration/location/DataLocation.java @@ -0,0 +1,166 @@ +package cc.carm.plugin.moeteleport.configuration.location; + +import org.apache.commons.lang.StringUtils; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.util.NumberConversions; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +public class DataLocation implements Cloneable { + + private String worldName; + private double x; + private double y; + private double z; + private float yaw; + private float pitch; + + public DataLocation(Location location) { + this(location.getWorld() != null ? location.getWorld().getName() : "", location.getX(), location.getY(), location.getZ(), location.getYaw(), location.getPitch()); + } + + public DataLocation(final String worldName, final double x, final double y, final double z) { + this(worldName, x, y, z, 0, 0); + } + + public DataLocation(final String worldName, final double x, final double y, final double z, final float yaw, final float pitch) { + this.worldName = worldName; + this.x = x; + this.y = y; + this.z = z; + this.pitch = pitch; + this.yaw = yaw; + } + + public String getWorldName() { + return worldName; + } + + public double getX() { + return x; + } + + public void setX(double x) { + this.x = x; + } + + public double getY() { + return y; + } + + public void setY(double y) { + this.y = y; + } + + public double getZ() { + return z; + } + + public void setZ(double z) { + this.z = z; + } + + public float getYaw() { + return yaw; + } + + public void setYaw(float yaw) { + this.yaw = yaw; + } + + public float getPitch() { + return pitch; + } + + public void setPitch(float pitch) { + this.pitch = pitch; + } + + + public @NotNull Location getBukkitLocation(World world) { + return new Location(world, getX(), getY(), getZ(), getYaw(), getPitch()); + } + + + public @Nullable Location getBukkitLocation() { + World world = Bukkit.getWorld(getWorldName()); + if (world == null) return null; + else return new Location(world, getX(), getY(), getZ(), getYaw(), getPitch()); + } + + @Override + public Object clone() { + try { + return super.clone(); + } catch (Exception ex) { + } + return null; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof DataLocation)) return false; + DataLocation that = (DataLocation) o; + return that.worldName.equals(worldName) + && Double.compare(that.x, x) == 0 + && Double.compare(that.y, y) == 0 + && Double.compare(that.z, z) == 0 + && Float.compare(that.pitch, pitch) == 0 + && Float.compare(that.yaw, yaw) == 0; + } + + @Override + public int hashCode() { + return Objects.hash(x, y, z, yaw, pitch); + } + + @Override + public String toString() { + return worldName + " " + x + " " + y + " " + z + " " + yaw + " " + pitch; + } + + @Deprecated + public String toSerializedString() { + return serializeToText(); + } + + public String serializeToText() { + if (getYaw() != 0 || getPitch() != 0) { + return worldName + ";" + x + ";" + y + ";" + z + ";" + yaw + ";" + pitch; + } else { + return worldName + ";" + x + ";" + y + ";" + z; + } + } + + public static DataLocation deserializeText(String s) { + if (s == null || !s.contains(";")) return null; + String[] args = StringUtils.split(s, ";"); + if (args.length < 4) return null; + try { + String worldName = args[0]; + double x = NumberConversions.toDouble(args[0]); + double y = NumberConversions.toDouble(args[1]); + double z = NumberConversions.toDouble(args[2]); + float yaw = 0; + float pitch = 0; + if (args.length == 5) { + yaw = NumberConversions.toFloat(args[3]); + pitch = NumberConversions.toFloat(args[4]); + } + return new DataLocation(worldName, x, y, z, yaw, pitch); + } catch (Exception ex) { + return null; + } + } + + @Deprecated + public static DataLocation parseString(String s) { + return deserializeText(s); + } + +} \ No newline at end of file diff --git a/src/main/java/cc/carm/plugin/moeteleport/listener/UserListener.java b/src/main/java/cc/carm/plugin/moeteleport/listener/UserListener.java index 4e00ed5..ed74236 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/listener/UserListener.java +++ b/src/main/java/cc/carm/plugin/moeteleport/listener/UserListener.java @@ -1,8 +1,27 @@ package cc.carm.plugin.moeteleport.listener; +import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.user.UserData; +import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.util.UUID; public class UserListener implements Listener { + @EventHandler + public void onJoin(PlayerJoinEvent event) { + UUID uuid = event.getPlayer().getUniqueId(); + UserData data = Main.getUserManager().loadData(uuid); + Main.getUserManager().getUserDataMap().put(uuid, data); + } + + @EventHandler + public void onQuit(PlayerQuitEvent event) { + Main.getUserManager().getData(event.getPlayer()).save(); //保存 + Main.getUserManager().getUserDataMap().remove(event.getPlayer().getUniqueId()); + } } diff --git a/src/main/java/cc/carm/plugin/moeteleport/manager/UserManager.java b/src/main/java/cc/carm/plugin/moeteleport/manager/UserManager.java index d473ab5..81bd8e1 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/manager/UserManager.java +++ b/src/main/java/cc/carm/plugin/moeteleport/manager/UserManager.java @@ -1,4 +1,48 @@ package cc.carm.plugin.moeteleport.manager; +import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.user.UserData; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.File; +import java.util.HashMap; +import java.util.UUID; + public class UserManager { + + private final File dataFolder; + + private final HashMap userDataMap = new HashMap<>(); + + public UserManager(Main main) { + this.dataFolder = new File(main.getDataFolder() + "/data"); + if (!dataFolder.isDirectory() || !dataFolder.exists()) { + boolean success = dataFolder.mkdir(); + } + } + + @NotNull + public UserData loadData(UUID userUUID) { + return new UserData(getDataFolder(), userUUID); + } + + @Nullable + public UserData getData(UUID userUUID) { + return getUserDataMap().get(userUUID); + } + + @NotNull + public UserData getData(Player player) { + return getUserDataMap().get(player.getUniqueId()); + } + + public HashMap getUserDataMap() { + return userDataMap; + } + + public File getDataFolder() { + return dataFolder; + } } diff --git a/src/main/java/cc/carm/plugin/moeteleport/user/UserData.java b/src/main/java/cc/carm/plugin/moeteleport/user/UserData.java index 931aad8..52e7206 100644 --- a/src/main/java/cc/carm/plugin/moeteleport/user/UserData.java +++ b/src/main/java/cc/carm/plugin/moeteleport/user/UserData.java @@ -1,4 +1,81 @@ package cc.carm.plugin.moeteleport.user; +import cc.carm.plugin.moeteleport.Main; +import cc.carm.plugin.moeteleport.configuration.location.DataLocation; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.Optional; +import java.util.UUID; + public class UserData { + + private final @NotNull File dataFile; + private final @NotNull FileConfiguration dataConfig; + + private LinkedHashMap homeLocations; + + public UserData(@NotNull File dataFolder, @NotNull UUID uuid) { + this(new File(dataFolder, uuid + ".yml")); + } + + public UserData(@NotNull File file) { + if (!file.exists()) { + try { + boolean success = file.createNewFile(); + } catch (IOException e) { + Main.error("在加载用户 " + file.getName() + " 的数据时出现异常。"); + Main.error(e.getLocalizedMessage()); + } + } + this.dataFile = file; + this.dataConfig = YamlConfiguration.loadConfiguration(dataFile); + loadHomeData(); + } + + public void loadHomeData() { + LinkedHashMap data = new LinkedHashMap<>(); + Optional.ofNullable(getDataConfig().getConfigurationSection("homes")) + .ifPresent(section -> section.getKeys(false).forEach(homeName -> { + DataLocation location = DataLocation.deserializeText(section.getString(homeName)); + if (location != null) data.put(homeName, location); + })); + this.homeLocations = data; + } + + public LinkedHashMap getHomeLocations() { + return homeLocations; + } + + public @NotNull File getDataFile() { + return dataFile; + } + + public @NotNull FileConfiguration getDataConfig() { + return dataConfig; + } + + + public LinkedHashMap saveToMap() { + LinkedHashMap homeLocations = getHomeLocations(); + LinkedHashMap data = new LinkedHashMap<>(); + if (homeLocations.isEmpty()) return data; + homeLocations.forEach((name, loc) -> data.put(name, loc.serializeToText())); + return data; + } + + + public void save() { + try { + getDataConfig().createSection("homes", saveToMap()); + getDataConfig().save(getDataFile()); + } catch (Exception ex) { + Main.error("在保存 " + getDataFile().getName() + " 时出现异常。"); + Main.error(ex.getLocalizedMessage()); + } + } }