1
mirror of https://github.com/CarmJos/MoeTeleport.git synced 2024-09-19 21:35:56 +00:00

完成用户home数据的加载与存储

This commit is contained in:
Carm Jos 2021-12-16 03:12:01 +08:00
parent c36a93ff6a
commit f1a2a5c2d4
6 changed files with 322 additions and 2 deletions

View File

@ -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;
}
}

View File

@ -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;

View File

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

View File

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

View File

@ -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;
}
}

View File

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