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.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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
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());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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<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;
|
||||
|
||||
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<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