Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improved system for saving player settings #3

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
.idea/
DurabilityAlert.iml
/server/
DurabilityAlert.iml
dependency-reduced-pom.xml
/target/
10 changes: 5 additions & 5 deletions src/main/java/me/darkolythe/durabilityalert/CommandHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandlabel,
} else {
player.sendMessage(main.prefix + ChatColor.GREEN + main.confighandler.warningsenabled);
}
main.joinlistener.playerSave(player);
PlayerSaveManager.save(player);
} else if (args[0].equalsIgnoreCase("status")) {
Utility.printStatus(player, main);
} else if (args[0].equalsIgnoreCase("type")) {
Expand All @@ -38,7 +38,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandlabel,
} else {
player.sendMessage(main.prefix + ChatColor.GREEN + main.confighandler.enchantedtrue);
}
main.joinlistener.playerSave(player);
PlayerSaveManager.save(player);
} else {
player.sendMessage(main.prefix + ChatColor.RED + main.confighandler.invalidarguments + ": /durabilityalert [toggle/armour/tools/type/status/enchant]");
}
Expand All @@ -47,7 +47,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandlabel,
if (args[1].equalsIgnoreCase("durability") || args[1].equalsIgnoreCase("percent")) {
main.setPlayerType(player, (args[1].equalsIgnoreCase("durability") ? 1 : 0));
player.sendMessage(main.prefix + ChatColor.GREEN + main.confighandler.settype.replaceAll("%type%", args[1]));
main.joinlistener.playerSave(player);
PlayerSaveManager.save(player);
} else {
player.sendMessage(main.prefix + ChatColor.RED + main.confighandler.invalidarguments + ": /durabilityalert type [percent/durability]");
}
Expand All @@ -58,11 +58,11 @@ public boolean onCommand(CommandSender sender, Command cmd, String commandlabel,
if (args[0].equalsIgnoreCase("armour") || args[0].equalsIgnoreCase("armor") || args[0].equalsIgnoreCase("a")) {
main.setPlayerArmour(player, percent);
player.sendMessage(main.prefix + ChatColor.GREEN + main.confighandler.armourset.replaceAll("%armour%", Integer.toString(percent)));
main.joinlistener.playerSave(player);
PlayerSaveManager.save(player);
} else if (args[0].equalsIgnoreCase("tools") || args[0].equalsIgnoreCase("tool") || args[0].equalsIgnoreCase("t")) {
main.setPlayerTools(player, percent);
player.sendMessage(main.prefix + ChatColor.GREEN + main.confighandler.toolset.replaceAll("%tool%", Integer.toString(percent)));
main.joinlistener.playerSave(player);
PlayerSaveManager.save(player);
} else {
player.sendMessage(main.prefix + ChatColor.RED + main.confighandler.invalidarguments + ": /durabilityalert [armour/tools]");
}
Expand Down
15 changes: 7 additions & 8 deletions src/main/java/me/darkolythe/durabilityalert/DurabilityAlert.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package me.darkolythe.durabilityalert;

import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
Expand Down Expand Up @@ -30,10 +31,9 @@ public void onEnable() {

saveDefaultConfig();

joinlistener = new JoinListener(plugin);
joinlistener = new JoinListener();
durabilitylistener = new DurabilityListener(plugin);
confighandler = new ConfigHandler(plugin);
joinlistener.setup();

// register events
getServer().getPluginManager().registerEvents(durabilitylistener, plugin);
Expand Down Expand Up @@ -61,7 +61,11 @@ public void onEnable() {

Metrics metrics = new Metrics(plugin);

joinlistener.onServerStart();
PlayerSaveManager.convertOldFile();

for (Player p : Bukkit.getServer().getOnlinePlayers()) {
PlayerSaveManager.load(p);
}

displaytime = getConfig().getInt("displaytime");
defaultvalue = getConfig().getInt("defaultvalue");
Expand All @@ -74,11 +78,6 @@ public void onEnable() {
System.out.println(prefix + ChatColor.GREEN + "DurabilityAlert enabled!");
}

@Override
public void onDisable() {
joinlistener.onServerStop();
}

public static DurabilityAlert getInstance() {
return plugin;
}
Expand Down
79 changes: 3 additions & 76 deletions src/main/java/me/darkolythe/durabilityalert/JoinListener.java
Original file line number Diff line number Diff line change
@@ -1,92 +1,19 @@
package me.darkolythe.durabilityalert;

import net.md_5.bungee.api.ChatColor;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;

import java.io.File;
import java.io.IOException;
import java.util.List;

public class JoinListener implements Listener {

private DurabilityAlert plugin = DurabilityAlert.getInstance();

private FileConfiguration playerDataConfig;
private File playerData;

private DurabilityAlert main;
JoinListener(DurabilityAlert plugin) {
main = plugin;
}

void setup() {
if (!plugin.getDataFolder().exists()) {
plugin.getDataFolder().mkdir();
}

playerData = new File(plugin.getDataFolder(), "PlayerData.yml");

if (!playerData.exists()) {
try {
playerData.createNewFile();
System.out.println(main.prefix + ChatColor.GREEN + "PlayerData.yml has been created");
} catch (IOException e) {
System.out.println(main.prefix + ChatColor.RED + "Could not create PlayerData.yml");
}
}
playerDataConfig = YamlConfiguration.loadConfiguration(playerData);
}

@EventHandler
private void onPlayerJoin(PlayerJoinEvent event) {
playerLoad(event.getPlayer());
PlayerSaveManager.load(event.getPlayer());
}

@EventHandler
private void onPlayerLeave(PlayerQuitEvent event) {
playerSave(event.getPlayer());
main.removePlayerData(event.getPlayer());
}

public void onServerStop() {
for (Player p : Bukkit.getServer().getOnlinePlayers()) {
playerSave(p);
}
}

public void onServerStart() {
for (Player p : Bukkit.getServer().getOnlinePlayers()) {
playerLoad(p);
}
}

private void playerLoad(Player player) {
if (playerDataConfig.contains("player." + player.getUniqueId())) {
List<Integer> data = playerDataConfig.getIntegerList("player." + player.getUniqueId());
if (data.size() < 4) {
data.add(0);
}
main.setPlayerData(player, data);
}
}

void playerSave(Player player) {
playerDataConfig = YamlConfiguration.loadConfiguration(playerData);

String path = "player." + player.getUniqueId();
playerDataConfig.set(path, main.getPlayerData(player));

try {
playerDataConfig.save(playerData);
} catch (IOException e) {
System.out.println(main.prefix + ChatColor.RED + "Could not save recipes");
}
PlayerSaveManager.remove(event.getPlayer());
DurabilityAlert.getInstance().removePlayerData(event.getPlayer());
}
}
100 changes: 100 additions & 0 deletions src/main/java/me/darkolythe/durabilityalert/PlayerSaveManager.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
package me.darkolythe.durabilityalert;

import net.md_5.bungee.api.ChatColor;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;

public abstract class PlayerSaveManager
{
private static final File playersDirectory;
private static HashMap<Player, FileConfiguration> playersData = new HashMap<>();

static
{
playersDirectory = new File(DurabilityAlert.getInstance().getDataFolder(), "players/");
if(!playersDirectory.exists())
{
playersDirectory.mkdir();
}
}

public static void convertOldFile()
{
File oldPlayerDataFile = new File(DurabilityAlert.getInstance().getDataFolder(), "PlayerData.yml");

if(oldPlayerDataFile.exists())
{
FileConfiguration oldDatas = YamlConfiguration.loadConfiguration(oldPlayerDataFile);

for(String uuid: oldDatas.getConfigurationSection("player").getKeys(false))
{
File playerFile = new File(playersDirectory, uuid+".yml");

try {
FileConfiguration playerDatas = YamlConfiguration.loadConfiguration(playerFile);
playerDatas.set("data", oldDatas.getIntegerList("player."+uuid));
playerDatas.save(playerFile);
} catch (IOException e) {
System.out.println(DurabilityAlert.getInstance().prefix + ChatColor.RED + "Could not save recipes");
}
}

oldPlayerDataFile.renameTo(new File(DurabilityAlert.getInstance().getDataFolder(), "PlayerData.yml.old"));
DurabilityAlert.getInstance().getLogger().info("Old PlayerData file converted");
}
}

public static void load(Player player)
{
File playerFile = new File(playersDirectory, player.getUniqueId()+".yml");
if(playerFile.exists())
{
FileConfiguration playerDatas = YamlConfiguration.loadConfiguration(playerFile);
playersData.put(player, playerDatas);
List<Integer> data = playerDatas.getIntegerList("data");
if (data.size() < 4) {
data.add(0);
}
DurabilityAlert.getInstance().setPlayerData(player, data);
}
}

public static void save(Player player)
{
File playerFile = new File(playersDirectory, player.getUniqueId()+".yml");

if(!playersData.containsKey(player))
{
if(!playersDirectory.exists())
{
playersDirectory.mkdir();
}

try {
playerFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
playersData.put(player, YamlConfiguration.loadConfiguration(playerFile));
}

try {
FileConfiguration playerDatas = playersData.get(player);
playerDatas.set("data", DurabilityAlert.getInstance().getPlayerData(player));
playerDatas.save(playerFile);
} catch (IOException e) {
System.out.println(DurabilityAlert.getInstance().prefix + ChatColor.RED + "Could not save recipes");
}
}

public static void remove(Player player)
{
playersData.remove(player);
}
}