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;
import java.util.List;
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 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) {
data = PlayerData.isLoaded(this.uuid = uuid) ? PlayerData.get(uuid) : null;
this.uuid = uuid;
}
public boolean isLoaded() {
return data != null;
public UUID getUniqueId() {
return uuid;
}
public void removeFriend(UUID uuid) {
if (isLoaded()) {
data.removeFriend(uuid);
return;
}
public abstract void removeFriend(UUID uuid);
ConfigFile config = new ConfigFile(this.uuid);
List<String> friends = config.getConfig().getStringList("friends");
friends.remove(uuid.toString());
config.getConfig().set("friends", friends);
config.save();
}
public abstract boolean hasFriend(UUID uuid);
public boolean hasFriend(UUID uuid) {
return isLoaded() ? data.hasFriend(uuid) : new ConfigFile(this.uuid).getConfig().getStringList("friends").contains(uuid.toString());
public abstract PlayerClass getProfess();
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.version.VersionSound;
public class PlayerData {
private final UUID uuid;
public class PlayerData extends OfflinePlayerData {
/*
* 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 PlayerData(Player player) {
uuid = player.getUniqueId();
super(player.getUniqueId());
setPlayer(player);
playerStats = new PlayerStats(this);
@ -115,7 +114,8 @@ public class PlayerData {
this.mana = getStats().getStat(StatType.MAX_MANA);
this.stamina = getStats().getStat(StatType.MAX_STAMINA);
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"))
attributes.load(config.getConfigurationSection("attribute"));
if (config.contains("profession"))
@ -162,9 +162,11 @@ public class PlayerData {
config.set("waypoints", new ArrayList<>(waypoints));
config.set("friends", toStringList(friends));
config.set("last-login", lastLogin);
if(guild != null) config.set("guild", guild.getId());
else config.set("guild", null);
if (guild != null)
config.set("guild", guild.getId());
else
config.set("guild", null);
config.set("skill", null);
skills.entrySet().forEach(entry -> config.set("skill." + entry.getKey(), entry.getValue()));
@ -246,44 +248,6 @@ public class PlayerData {
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) {
this.player = player;
this.lastLogin = System.currentTimeMillis();
@ -306,10 +270,7 @@ public class PlayerData {
return player;
}
public UUID getUniqueId() {
return uuid;
}
@Override
public long getLastLogin() {
return lastLogin;
}
@ -318,6 +279,7 @@ public class PlayerData {
return lastFriendRequest;
}
@Override
public int getLevel() {
return Math.max(1, level);
}
@ -446,10 +408,12 @@ public class PlayerData {
friends.add(uuid);
}
@Override
public void removeFriend(UUID uuid) {
friends.remove(uuid);
}
@Override
public boolean hasFriend(UUID uuid) {
return friends.contains(uuid);
}
@ -518,13 +482,13 @@ public class PlayerData {
public void giveExperience(int value) {
giveExperience(value, null);
}
public void giveExperience(int value, Location loc) {
if (profess == null || hasReachedMaxLevel()) {
setExperience(0);
return;
}
// display hologram
if (MMOItems.plugin.getConfig().getBoolean("game-indicators.exp.enabled")) {
if (loc != null && MMOCore.plugin.hologramSupport != null)
@ -570,6 +534,7 @@ public class PlayerData {
return experience;
}
@Override
public PlayerClass getProfess() {
return profess == null ? MMOCore.plugin.classManager.getDefaultClass() : profess;
}
@ -637,7 +602,7 @@ public class PlayerData {
public boolean canSeeActionBar() {
return actionBarTimeOut < System.currentTimeMillis();
}
public void setActionBarTimeOut(long timeOut) {
actionBarTimeOut = System.currentTimeMillis() + (timeOut * 50);
}
@ -824,6 +789,6 @@ public class PlayerData {
@Override
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;
}
if (new OfflinePlayerData(((Player) sender).getUniqueId()).hasFriend(uuid)) {
if (OfflinePlayerData.get(((Player) sender).getUniqueId()).hasFriend(uuid)) {
MMOCore.plugin.requestManager.unregisterRequest(uuid);
return true;
}

View File

@ -53,7 +53,7 @@ public class EditableFriendRemoval extends EditableInventory {
public void whenClicked(InventoryClickEvent event, InventoryItem item) {
if (item.getFunction().equals("yes")) {
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);
MMOCore.plugin.configManager.getSimpleMessage("no-longer-friends", "unfriend", friend.getName()).send(player);
last.open();

View File

@ -17,8 +17,8 @@ import org.bukkit.inventory.meta.SkullMeta;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.input.PlayerInput.InputType;
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.PlayerDataOfflineValues;
import net.Indyuce.mmocore.gui.api.EditableInventory;
import net.Indyuce.mmocore.gui.api.GeneratedInventory;
import net.Indyuce.mmocore.gui.api.PluginInventory;
@ -36,8 +36,7 @@ public class EditableGuildView extends EditableInventory {
@Override
public InventoryItem load(String function, ConfigurationSection config) {
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);
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);
}
public class MemberDisplayItem extends InventoryPlaceholderItem {
@ -49,25 +48,16 @@ public class EditableGuildView extends EditableInventory {
public Placeholders getPlaceholders(PluginInventory inv, int n) {
UUID uuid = inv.getPlayerData().getGuild().getMembers().get(n);
Placeholders holders = new Placeholders();
/**
* Will never be null since a players name
* will always be recorded if they've been in a guild
*/
/*
* Will never be null since a players name will always be recorded
* if they've been in a guild
*/
holders.register("name", Bukkit.getOfflinePlayer(uuid).getName());
if(PlayerData.get(uuid) == null) {
PlayerDataOfflineValues pdov = PlayerData.getOfflineValues(uuid);
holders.register("class", pdov.getProfess().getName());
holders.register("level", "" + pdov.getLevel());
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()));
}
OfflinePlayerData offline = OfflinePlayerData.get(uuid);
holders.register("class", offline.getProfess().getName());
holders.register("level", offline.getLevel());
holders.register("since", new DelayFormat(2).format(System.currentTimeMillis() - offline.getLastLogin()));
return holders;
}
@ -121,10 +111,10 @@ public class EditableGuildView extends EditableInventory {
return true;
}
}
public class ConditionalItem extends NoPlaceholderItem {
private final String function;
public ConditionalItem(String func, ConfigurationSection config) {
super(config);
this.function = func;
@ -133,14 +123,13 @@ public class EditableGuildView extends EditableInventory {
@Override
public ItemStack display(GeneratedInventory invpar, int n) {
GuildViewInventory inv = (GuildViewInventory) invpar;
if(function.equals("next"))
if(inv.getPage() == (int) Math.ceil((inv.getPlayerData().getGuild().getMembers().count() + 20) / inv.getByFunction("member").getSlots().size()))
if (function.equals("next"))
if (inv.getPage() == (int) Math.ceil((inv.getPlayerData().getGuild().getMembers().count() + 20) / inv.getByFunction("member").getSlots().size()))
return null;
if(function.equals("previous") && inv.getPage() == 1)
if (function.equals("previous") && inv.getPage() == 1)
return null;
if((function.equals("disband") || function.equals("invite")) && !inv.getPlayerData()
.getGuild().getOwner().equals(inv.getPlayer().getUniqueId()))
if ((function.equals("disband") || function.equals("invite")) && !inv.getPlayerData().getGuild().getOwner().equals(inv.getPlayer().getUniqueId()))
return null;
return super.display(inv, n);
}
@ -157,19 +146,12 @@ public class EditableGuildView extends EditableInventory {
public GuildViewInventory(PlayerData playerData, EditableInventory editable) {
super(playerData, editable);
maxpages = (int) Math.ceil((playerData.getGuild().getMembers().count() + 20) /
editable.getByFunction("member").getSlots().size());
maxpages = (int) Math.ceil((playerData.getGuild().getMembers().count() + 20) / editable.getByFunction("member").getSlots().size());
}
@Override
public String calculateName() {
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());
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());
}
@Override
@ -180,12 +162,18 @@ public class EditableGuildView extends EditableInventory {
player.closeInventory();
return;
}
if (item.getFunction().equals("next") && page != maxpages)
{ page++; open(); return; }
if (item.getFunction().equals("previous") && page != 1)
{ page--; open(); return; }
if (item.getFunction().equals("next") && page != maxpages) {
page++;
open();
return;
}
if (item.getFunction().equals("previous") && page != 1) {
page--;
open();
return;
}
if (item.getFunction().equals("disband")) {
if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId()))
@ -195,16 +183,17 @@ public class EditableGuildView extends EditableInventory {
player.closeInventory();
return;
}
if (item.getFunction().equals("invite")) {
if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId()))
return;
/**if (playerData.getGuild().getMembers().count() >= max) {
MMOCore.plugin.configManager.getSimpleMessage("guild-is-full").send(player);
player.playSound(player.getLocation(), Sound.ENTITY_VILLAGER_NO, 1, 1);
return;
}*/
/**
* if (playerData.getGuild().getMembers().count() >= max) {
* MMOCore.plugin.configManager.getSimpleMessage("guild-is-full").send(player);
* player.playSound(player.getLocation(),
* Sound.ENTITY_VILLAGER_NO, 1, 1); return; }
*/
MMOCore.plugin.configManager.newPlayerInput(player, InputType.GUILD_INVITE, (input) -> {
Player target = Bukkit.getPlayer(input);
@ -240,7 +229,7 @@ public class EditableGuildView extends EditableInventory {
if (item.getFunction().equals("member") && event.getAction() == InventoryAction.PICKUP_HALF && !NBTItem.get(event.getCurrentItem()).getString("uuid").isEmpty()) {
if (!playerData.getGuild().getOwner().equals(playerData.getUniqueId()))
return;
OfflinePlayer target = Bukkit.getOfflinePlayer(UUID.fromString(NBTItem.get(event.getCurrentItem()).getString("uuid")));
if (target.equals(player))
return;
@ -250,8 +239,9 @@ public class EditableGuildView extends EditableInventory {
player.playSound(player.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1, 1);
}
}
public int getPage()
{ return page; }
public int getPage() {
return page;
}
}
}