mirror of
https://github.com/CarmJos/MoeTeleport.git
synced 2024-09-19 21:35:56 +00:00
完成用户home数据的加载与存储
This commit is contained in:
parent
c36a93ff6a
commit
f1a2a5c2d4
@ -2,6 +2,7 @@ package cc.carm.plugin.moeteleport;
|
|||||||
|
|
||||||
import cc.carm.plugin.moeteleport.listener.UserListener;
|
import cc.carm.plugin.moeteleport.listener.UserListener;
|
||||||
import cc.carm.plugin.moeteleport.manager.ConfigManager;
|
import cc.carm.plugin.moeteleport.manager.ConfigManager;
|
||||||
|
import cc.carm.plugin.moeteleport.manager.UserManager;
|
||||||
import cc.carm.plugin.moeteleport.util.ColorParser;
|
import cc.carm.plugin.moeteleport.util.ColorParser;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.command.CommandExecutor;
|
import org.bukkit.command.CommandExecutor;
|
||||||
@ -17,6 +18,8 @@ public class Main extends JavaPlugin {
|
|||||||
private static Main instance;
|
private static Main instance;
|
||||||
public static boolean debugMode = true;
|
public static boolean debugMode = true;
|
||||||
|
|
||||||
|
private UserManager userManager;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
instance = this;
|
instance = this;
|
||||||
@ -26,6 +29,9 @@ public class Main extends JavaPlugin {
|
|||||||
log("加载配置文件...");
|
log("加载配置文件...");
|
||||||
ConfigManager.initConfig();
|
ConfigManager.initConfig();
|
||||||
|
|
||||||
|
log("加载用户管理器...");
|
||||||
|
this.userManager = new UserManager(this);
|
||||||
|
|
||||||
log("注册监听器...");
|
log("注册监听器...");
|
||||||
regListener(new UserListener());
|
regListener(new UserListener());
|
||||||
|
|
||||||
@ -57,9 +63,13 @@ public class Main extends JavaPlugin {
|
|||||||
Bukkit.getConsoleSender().sendMessage(ColorParser.parse("[" + getInstance().getName() + "] " + message));
|
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) {
|
public static void debug(String message) {
|
||||||
if (debugMode) {
|
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);
|
if (tabCompleter != null) command.setTabCompleter(tabCompleter);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static UserManager getUserManager() {
|
||||||
|
return Main.getInstance().userManager;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -11,9 +11,9 @@ import java.io.IOException;
|
|||||||
public class FileConfig {
|
public class FileConfig {
|
||||||
|
|
||||||
private final JavaPlugin plugin;
|
private final JavaPlugin plugin;
|
||||||
|
|
||||||
private final String fileName;
|
private final String fileName;
|
||||||
|
|
||||||
|
|
||||||
private File file;
|
private File file;
|
||||||
private FileConfiguration config;
|
private FileConfiguration config;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,8 +1,27 @@
|
|||||||
package cc.carm.plugin.moeteleport.listener;
|
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.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
public class UserListener implements Listener {
|
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());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,48 @@
|
|||||||
package cc.carm.plugin.moeteleport.manager;
|
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 {
|
public class UserManager {
|
||||||
|
|
||||||
|
private final File dataFolder;
|
||||||
|
|
||||||
|
private final HashMap<UUID, UserData> 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<UUID, UserData> getUserDataMap() {
|
||||||
|
return userDataMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
public File getDataFolder() {
|
||||||
|
return dataFolder;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,81 @@
|
|||||||
package cc.carm.plugin.moeteleport.user;
|
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 {
|
public class UserData {
|
||||||
|
|
||||||
|
private final @NotNull File dataFile;
|
||||||
|
private final @NotNull FileConfiguration dataConfig;
|
||||||
|
|
||||||
|
private LinkedHashMap<String, DataLocation> 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<String, DataLocation> 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<String, DataLocation> getHomeLocations() {
|
||||||
|
return homeLocations;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NotNull File getDataFile() {
|
||||||
|
return dataFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public @NotNull FileConfiguration getDataConfig() {
|
||||||
|
return dataConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public LinkedHashMap<String, String> saveToMap() {
|
||||||
|
LinkedHashMap<String, DataLocation> homeLocations = getHomeLocations();
|
||||||
|
LinkedHashMap<String, String> 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user