Merged OfflinePlayerData and OfflinePlayerValues

This commit is contained in:
Indyuce 2020-02-13 22:08:50 +01:00
parent 2df5d86f25
commit 54ed7d8fdb
6 changed files with 130 additions and 134 deletions

View File

@ -1,40 +1,31 @@
package net.Indyuce.mmocore.api.player; package net.Indyuce.mmocore.api.player;
import java.util.List;
import java.util.UUID; import java.util.UUID;
import net.Indyuce.mmocore.api.ConfigFile; import net.Indyuce.mmocore.api.player.profess.PlayerClass;
public class OfflinePlayerData { public abstract class OfflinePlayerData {
private final UUID uuid; private final UUID uuid;
private final PlayerData data;
/*
* supports offline player data operations like friend removals which can't
* be handled when their player data is not loaded in the data map.
*/
public OfflinePlayerData(UUID uuid) { public OfflinePlayerData(UUID uuid) {
data = PlayerData.isLoaded(this.uuid = uuid) ? PlayerData.get(uuid) : null; this.uuid = uuid;
} }
public boolean isLoaded() { public UUID getUniqueId() {
return data != null; return uuid;
} }
public void removeFriend(UUID uuid) { public abstract void removeFriend(UUID uuid);
if (isLoaded()) {
data.removeFriend(uuid);
return;
}
ConfigFile config = new ConfigFile(this.uuid); public abstract boolean hasFriend(UUID uuid);
List<String> friends = config.getConfig().getStringList("friends");
friends.remove(uuid.toString());
config.getConfig().set("friends", friends);
config.save();
}
public boolean hasFriend(UUID uuid) { public abstract PlayerClass getProfess();
return isLoaded() ? data.hasFriend(uuid) : new ConfigFile(this.uuid).getConfig().getStringList("friends").contains(uuid.toString());
public abstract int getLevel();
public abstract long getLastLogin();
public static OfflinePlayerData get(UUID uuid) {
return PlayerData.isLoaded(uuid) ? PlayerData.get(uuid) : new SimpleOfflinePlayerData(uuid);
} }
} }

View File

@ -55,9 +55,7 @@ import net.md_5.bungee.api.chat.TextComponent;
import net.mmogroup.mmolib.MMOLib; import net.mmogroup.mmolib.MMOLib;
import net.mmogroup.mmolib.version.VersionSound; import net.mmogroup.mmolib.version.VersionSound;
public class PlayerData { public class PlayerData extends OfflinePlayerData {
private final UUID uuid;
/* /*
* is updated everytime the player joins the server. it is kept when the * is updated everytime the player joins the server. it is kept when the
@ -96,7 +94,8 @@ public class PlayerData {
private static Map<UUID, PlayerData> playerData = new HashMap<>(); private static Map<UUID, PlayerData> playerData = new HashMap<>();
private PlayerData(Player player) { private PlayerData(Player player) {
uuid = player.getUniqueId(); super(player.getUniqueId());
setPlayer(player); setPlayer(player);
playerStats = new PlayerStats(this); playerStats = new PlayerStats(this);
@ -115,7 +114,8 @@ public class PlayerData {
this.mana = getStats().getStat(StatType.MAX_MANA); this.mana = getStats().getStat(StatType.MAX_MANA);
this.stamina = getStats().getStat(StatType.MAX_STAMINA); this.stamina = getStats().getStat(StatType.MAX_STAMINA);
this.stellium = getStats().getStat(StatType.MAX_STELLIUM); this.stellium = getStats().getStat(StatType.MAX_STELLIUM);
if (config.contains("guild")) this.guild = MMOCore.plugin.guildManager.stillInGuild(getUniqueId(), config.getString("guild")); if (config.contains("guild"))
this.guild = MMOCore.plugin.guildManager.stillInGuild(getUniqueId(), config.getString("guild"));
if (config.contains("attribute")) if (config.contains("attribute"))
attributes.load(config.getConfigurationSection("attribute")); attributes.load(config.getConfigurationSection("attribute"));
if (config.contains("profession")) if (config.contains("profession"))
@ -162,8 +162,10 @@ public class PlayerData {
config.set("waypoints", new ArrayList<>(waypoints)); config.set("waypoints", new ArrayList<>(waypoints));
config.set("friends", toStringList(friends)); config.set("friends", toStringList(friends));
config.set("last-login", lastLogin); config.set("last-login", lastLogin);
if(guild != null) config.set("guild", guild.getId()); if (guild != null)
else config.set("guild", null); config.set("guild", guild.getId());
else
config.set("guild", null);
config.set("skill", null); config.set("skill", null);
skills.entrySet().forEach(entry -> config.set("skill." + entry.getKey(), entry.getValue())); skills.entrySet().forEach(entry -> config.set("skill." + entry.getKey(), entry.getValue()));
@ -246,44 +248,6 @@ public class PlayerData {
return playerData.values(); return playerData.values();
} }
/**
* START OF EXPERIMENTAL CODE
*
* This must be more simple to do than my 2AM brain could think of...
* - Aria
*/
private static Map<UUID, PlayerDataOfflineValues> offlineValues = new HashMap<>();
public static PlayerDataOfflineValues getOfflineValues(UUID uuid) {
if(!offlineValues.containsKey(uuid))
offlineValues.put(uuid, new PlayerDataOfflineValues(uuid));
return offlineValues.get(uuid) ;
}
public static class PlayerDataOfflineValues {
// Values can be added as they are needed
private final PlayerClass profess;
private final int level;
private final long lastLogin;
public PlayerDataOfflineValues(UUID uuid) {
FileConfiguration config = new ConfigFile(uuid).getConfig();
this.profess = MMOCore.plugin.classManager.get(config.getString("class"));
this.level = config.getInt("level");
this.lastLogin = config.getLong("last-login");
}
public PlayerClass getProfess()
{ return profess; }
public int getLevel()
{ return level; }
public long getLastLogin()
{ return lastLogin; }
}
/**
* END OF EXPERIMENTAL CODE
*/
private PlayerData setPlayer(Player player) { private PlayerData setPlayer(Player player) {
this.player = player; this.player = player;
this.lastLogin = System.currentTimeMillis(); this.lastLogin = System.currentTimeMillis();
@ -306,10 +270,7 @@ public class PlayerData {
return player; return player;
} }
public UUID getUniqueId() { @Override
return uuid;
}
public long getLastLogin() { public long getLastLogin() {
return lastLogin; return lastLogin;
} }
@ -318,6 +279,7 @@ public class PlayerData {
return lastFriendRequest; return lastFriendRequest;
} }
@Override
public int getLevel() { public int getLevel() {
return Math.max(1, level); return Math.max(1, level);
} }
@ -446,10 +408,12 @@ public class PlayerData {
friends.add(uuid); friends.add(uuid);
} }
@Override
public void removeFriend(UUID uuid) { public void removeFriend(UUID uuid) {
friends.remove(uuid); friends.remove(uuid);
} }
@Override
public boolean hasFriend(UUID uuid) { public boolean hasFriend(UUID uuid) {
return friends.contains(uuid); return friends.contains(uuid);
} }
@ -570,6 +534,7 @@ public class PlayerData {
return experience; return experience;
} }
@Override
public PlayerClass getProfess() { public PlayerClass getProfess() {
return profess == null ? MMOCore.plugin.classManager.getDefaultClass() : profess; return profess == null ? MMOCore.plugin.classManager.getDefaultClass() : profess;
} }
@ -824,6 +789,6 @@ public class PlayerData {
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
return obj != null && obj instanceof PlayerData && ((PlayerData) obj).uuid.equals(uuid); return obj != null && obj instanceof PlayerData && ((PlayerData) obj).getUniqueId().equals(getUniqueId());
} }
} }

View File

@ -0,0 +1,50 @@
package net.Indyuce.mmocore.api.player;
import java.util.List;
import java.util.UUID;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.ConfigFile;
import net.Indyuce.mmocore.api.player.profess.PlayerClass;
public class SimpleOfflinePlayerData extends OfflinePlayerData {
private final ConfigFile config;
/*
* supports offline player data operations like friend removals which can't
* be handled when their player data is not loaded in the data map.
*/
public SimpleOfflinePlayerData(UUID uuid) {
super(uuid);
config = new ConfigFile(uuid);
}
@Override
public void removeFriend(UUID uuid) {
List<String> friends = config.getConfig().getStringList("friends");
friends.remove(uuid.toString());
config.getConfig().set("friends", friends);
config.save();
}
@Override
public boolean hasFriend(UUID uuid) {
return config.getConfig().getStringList("friends").contains(uuid.toString());
}
@Override
public PlayerClass getProfess() {
return config.getConfig().contains("class") ? MMOCore.plugin.classManager.get(config.getConfig().getString("class")) : MMOCore.plugin.classManager.getDefaultClass();
}
@Override
public int getLevel() {
return config.getConfig().getInt("level");
}
@Override
public long getLastLogin() {
return config.getConfig().getLong("last-login");
}
}

View File

@ -47,7 +47,7 @@ public class FriendsCommand extends BukkitCommand {
return true; return true;
} }
if (new OfflinePlayerData(((Player) sender).getUniqueId()).hasFriend(uuid)) { if (OfflinePlayerData.get(((Player) sender).getUniqueId()).hasFriend(uuid)) {
MMOCore.plugin.requestManager.unregisterRequest(uuid); MMOCore.plugin.requestManager.unregisterRequest(uuid);
return true; return true;
} }

View File

@ -53,7 +53,7 @@ public class EditableFriendRemoval extends EditableInventory {
public void whenClicked(InventoryClickEvent event, InventoryItem item) { public void whenClicked(InventoryClickEvent event, InventoryItem item) {
if (item.getFunction().equals("yes")) { if (item.getFunction().equals("yes")) {
playerData.removeFriend(friend.getUniqueId()); playerData.removeFriend(friend.getUniqueId());
new OfflinePlayerData(friend.getUniqueId()).removeFriend(playerData.getUniqueId()); OfflinePlayerData.get(friend.getUniqueId()).removeFriend(playerData.getUniqueId());
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1);
MMOCore.plugin.configManager.getSimpleMessage("no-longer-friends", "unfriend", friend.getName()).send(player); MMOCore.plugin.configManager.getSimpleMessage("no-longer-friends", "unfriend", friend.getName()).send(player);
last.open(); last.open();

View File

@ -17,8 +17,8 @@ import org.bukkit.inventory.meta.SkullMeta;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.input.PlayerInput.InputType; import net.Indyuce.mmocore.api.input.PlayerInput.InputType;
import net.Indyuce.mmocore.api.math.format.DelayFormat; import net.Indyuce.mmocore.api.math.format.DelayFormat;
import net.Indyuce.mmocore.api.player.OfflinePlayerData;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import net.Indyuce.mmocore.api.player.PlayerData.PlayerDataOfflineValues;
import net.Indyuce.mmocore.gui.api.EditableInventory; import net.Indyuce.mmocore.gui.api.EditableInventory;
import net.Indyuce.mmocore.gui.api.GeneratedInventory; import net.Indyuce.mmocore.gui.api.GeneratedInventory;
import net.Indyuce.mmocore.gui.api.PluginInventory; import net.Indyuce.mmocore.gui.api.PluginInventory;
@ -36,8 +36,7 @@ public class EditableGuildView extends EditableInventory {
@Override @Override
public InventoryItem load(String function, ConfigurationSection config) { public InventoryItem load(String function, ConfigurationSection config) {
return function.equals("member") ? new MemberItem(config) : (function.equals("next") || function.equals("previous") return function.equals("member") ? new MemberItem(config) : (function.equals("next") || function.equals("previous") || function.equals("disband") || function.equals("invite")) ? new ConditionalItem(function, config) : new NoPlaceholderItem(config);
|| function.equals("disband") || function.equals("invite")) ? new ConditionalItem(function, config) : new NoPlaceholderItem(config);
} }
public class MemberDisplayItem extends InventoryPlaceholderItem { public class MemberDisplayItem extends InventoryPlaceholderItem {
@ -49,25 +48,16 @@ public class EditableGuildView extends EditableInventory {
public Placeholders getPlaceholders(PluginInventory inv, int n) { public Placeholders getPlaceholders(PluginInventory inv, int n) {
UUID uuid = inv.getPlayerData().getGuild().getMembers().get(n); UUID uuid = inv.getPlayerData().getGuild().getMembers().get(n);
Placeholders holders = new Placeholders(); Placeholders holders = new Placeholders();
/** /*
* Will never be null since a players name * Will never be null since a players name will always be recorded
* will always be recorded if they've been in a guild * if they've been in a guild
*/ */
holders.register("name", Bukkit.getOfflinePlayer(uuid).getName()); holders.register("name", Bukkit.getOfflinePlayer(uuid).getName());
if(PlayerData.get(uuid) == null) { OfflinePlayerData offline = OfflinePlayerData.get(uuid);
PlayerDataOfflineValues pdov = PlayerData.getOfflineValues(uuid); holders.register("class", offline.getProfess().getName());
holders.register("class", pdov.getProfess().getName()); holders.register("level", offline.getLevel());
holders.register("level", "" + pdov.getLevel()); holders.register("since", new DelayFormat(2).format(System.currentTimeMillis() - offline.getLastLogin()));
holders.register("since", new DelayFormat(2).format(System.currentTimeMillis() - pdov.getLastLogin()));
}
else
{
PlayerData member = PlayerData.get(uuid);
holders.register("class", member.getProfess().getName());
holders.register("level", "" + member.getLevel());
holders.register("since", new DelayFormat(2).format(System.currentTimeMillis() - member.getLastLogin()));
}
return holders; return holders;
} }
@ -134,13 +124,12 @@ public class EditableGuildView extends EditableInventory {
public ItemStack display(GeneratedInventory invpar, int n) { public ItemStack display(GeneratedInventory invpar, int n) {
GuildViewInventory inv = (GuildViewInventory) invpar; GuildViewInventory inv = (GuildViewInventory) invpar;
if(function.equals("next")) if (function.equals("next"))
if(inv.getPage() == (int) Math.ceil((inv.getPlayerData().getGuild().getMembers().count() + 20) / inv.getByFunction("member").getSlots().size())) if (inv.getPage() == (int) Math.ceil((inv.getPlayerData().getGuild().getMembers().count() + 20) / inv.getByFunction("member").getSlots().size()))
return null; return null;
if(function.equals("previous") && inv.getPage() == 1) if (function.equals("previous") && inv.getPage() == 1)
return null; return null;
if((function.equals("disband") || function.equals("invite")) && !inv.getPlayerData() if ((function.equals("disband") || function.equals("invite")) && !inv.getPlayerData().getGuild().getOwner().equals(inv.getPlayer().getUniqueId()))
.getGuild().getOwner().equals(inv.getPlayer().getUniqueId()))
return null; return null;
return super.display(inv, n); return super.display(inv, n);
} }
@ -157,19 +146,12 @@ public class EditableGuildView extends EditableInventory {
public GuildViewInventory(PlayerData playerData, EditableInventory editable) { public GuildViewInventory(PlayerData playerData, EditableInventory editable) {
super(playerData, editable); super(playerData, editable);
maxpages = (int) Math.ceil((playerData.getGuild().getMembers().count() + 20) / maxpages = (int) Math.ceil((playerData.getGuild().getMembers().count() + 20) / editable.getByFunction("member").getSlots().size());
editable.getByFunction("member").getSlots().size());
} }
@Override @Override
public String calculateName() { public String calculateName() {
return getName() return getName().replace("{online_players}", "" + getPlayerData().getGuild().getMembers().countOnline()).replace("{page}", "" + page).replace("{maxpages}", "" + maxpages).replace("{players}", "" + getPlayerData().getGuild().getMembers().count()).replace("{tag}", getPlayerData().getGuild().getTag()).replace("{name}", getPlayerData().getGuild().getName());
.replace("{online_players}", "" + getPlayerData().getGuild().getMembers().countOnline())
.replace("{page}", "" + page)
.replace("{maxpages}", "" + maxpages)
.replace("{players}", "" + getPlayerData().getGuild().getMembers().count())
.replace("{tag}", getPlayerData().getGuild().getTag())
.replace("{name}", getPlayerData().getGuild().getName());
} }
@Override @Override
@ -181,11 +163,17 @@ public class EditableGuildView extends EditableInventory {
return; return;
} }
if (item.getFunction().equals("next") && page != maxpages) if (item.getFunction().equals("next") && page != maxpages) {
{ page++; open(); return; } page++;
open();
return;
}
if (item.getFunction().equals("previous") && page != 1) if (item.getFunction().equals("previous") && page != 1) {
{ page--; open(); return; } page--;
open();
return;
}
if (item.getFunction().equals("disband")) { if (item.getFunction().equals("disband")) {
if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId())) if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId()))
@ -200,11 +188,12 @@ public class EditableGuildView extends EditableInventory {
if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId())) if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId()))
return; return;
/**if (playerData.getGuild().getMembers().count() >= max) { /**
MMOCore.plugin.configManager.getSimpleMessage("guild-is-full").send(player); * if (playerData.getGuild().getMembers().count() >= max) {
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1); * MMOCore.plugin.configManager.getSimpleMessage("guild-is-full").send(player);
return; * player.playSound(player.getLocation(),
}*/ * Sound.ENTITY_VILLAGER_NO, 1, 1); return; }
*/
MMOCore.plugin.configManager.newPlayerInput(player, InputType.GUILD_INVITE, (input) -> { MMOCore.plugin.configManager.newPlayerInput(player, InputType.GUILD_INVITE, (input) -> {
Player target = Bukkit.getPlayer(input); Player target = Bukkit.getPlayer(input);
@ -251,7 +240,8 @@ public class EditableGuildView extends EditableInventory {
} }
} }
public int getPage() public int getPage() {
{ return page; } return page;
}
} }
} }