1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-20 11:45:51 +00:00

Merge pull request #1174 from WalshyDev/async-player-profile-fetch

Implement PlayerProfile async fetch
This commit is contained in:
TheBusyBiscuit 2019-10-13 15:57:02 +02:00 committed by GitHub
commit a2fe40cfe1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 278 additions and 227 deletions

View File

@ -7,6 +7,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem;
import me.mrCookieSlime.Slimefun.api.PlayerProfile;
import me.mrCookieSlime.Slimefun.api.Slimefun;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@ -114,9 +115,18 @@ public class LockedCategory extends Category {
public boolean hasUnlocked(Player p) {
PlayerProfile profile = PlayerProfile.get(p);
return hasUnlocked(p, profile);
}
public boolean hasUnlocked(Player p, PlayerProfile profile) {
for (Category category: parents) {
for (SlimefunItem item: category.getItems()) {
if (Slimefun.isEnabled(p, item, false) && Slimefun.hasPermission(p, item, false) && item.getResearch() != null && !profile.hasUnlocked(item.getResearch())) return false;
if (Slimefun.isEnabled(p, item, false)
&& Slimefun.hasPermission(p, item, false)
&& item.getResearch() != null
&& !profile.hasUnlocked(item.getResearch())
)
return false;
}
}
return true;

View File

@ -3,6 +3,7 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks;
import java.util.List;
import java.util.UUID;
import me.mrCookieSlime.Slimefun.listeners.BackpackListener;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
@ -106,12 +107,7 @@ public class EnhancedCraftingTable extends MultiBlockMachine {
if (adding.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: <ID>"))) {
int backpackID = PlayerProfile.get(p).createBackpack(size).getID();
ItemMeta im = adding.getItemMeta();
List<String> lore = im.getLore();
lore.set(line, lore.get(line).replace("<ID>", p.getUniqueId() + "#" + backpackID));
im.setLore(lore);
adding.setItemMeta(im);
break;
BackpackListener.setBackpackId(p, adding, line, backpackID);
}
}
}

View File

@ -3,6 +3,7 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks;
import java.util.List;
import java.util.UUID;
import me.mrCookieSlime.Slimefun.listeners.BackpackListener;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Effect;
@ -112,12 +113,7 @@ public class MagicWorkbench extends MultiBlockMachine {
if (adding.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: <ID>"))) {
int backpackID = PlayerProfile.get(p).createBackpack(size).getID();
ItemMeta im = adding.getItemMeta();
List<String> lore = im.getLore();
lore.set(line, lore.get(line).replace("<ID>", p.getUniqueId() + "#" + backpackID));
im.setLore(lore);
adding.setItemMeta(im);
break;
BackpackListener.setBackpackId(p, adding, line, backpackID);
}
}
}

View File

@ -74,6 +74,8 @@ public class SlimefunLocalization extends Localization {
setDefaultMessage("messages.cannot-place" ,"&cYou cannot place that block there!");
setDefaultMessage("messages.no-pvp" ,"&cYou cannot pvp in here!");
setDefaultMessage("messages.radiation" ,"&4You have been exposed to deadly radiation! &cGet rid of the radioactive item or equip the complete hazmat suit!");
setDefaultMessage("messages.opening-guide", "&bOpening guide, this may take a few seconds...");
setDefaultMessage("messages.opening-backpack", "&bOpening backpack, this may take a few seconds...");
setDefaultMessage("machines.pattern-not-found", "&eSorry, I could not recognize this Pattern. Please place the Items in the correct Pattern into the Dispenser.");
setDefaultMessage("machines.unknown-material", "&eSorry, I could not recognize the Item in my Dispenser. Please put something in that I know.");

View File

@ -175,7 +175,7 @@ public final class SlimefunGuide {
menu.open(p);
}
public static void openCredits(Player p, final ItemStack guide) {
private static void openCredits(Player p, final ItemStack guide) {
final ChestMenu menu = new ChestMenu("Credits");
menu.setEmptySlotsClickable(false);
@ -239,23 +239,30 @@ public final class SlimefunGuide {
}
public static void openCheatMenu(Player p) {
openMainMenu(p, false, false, 1);
openMainMenuAsync(p, false, false, 1);
}
public static void openGuide(Player p, boolean book) {
if (!SlimefunPlugin.getWhitelist().getBoolean(p.getWorld().getName() + ".enabled")) return;
if (!SlimefunPlugin.getWhitelist().getBoolean(p.getWorld().getName() + ".enabled-items.SLIMEFUN_GUIDE")) return;
if (!getHistory().containsKey(p.getUniqueId())) {
openMainMenu(p, true, book, 1);
}
else {
Object last = getLastEntry(p, false);
if (last == null)
openMainMenuAsync(p, true, book, 1);
else
handleHistory(p, last, book, false);
}
private static void openMainMenuAsync(final Player player, final boolean survival, final boolean book, final int selected_page) {
if (!PlayerProfile.get(player, profile -> Slimefun.runSync(() -> openMainMenu(profile, survival, book, selected_page))))
Slimefun.getLocal().sendMessage(player, "messages.opening-guide");
}
public static void openMainMenu(final Player p, final boolean survival, final boolean book, final int selected_page) {
private static void openMainMenu(final PlayerProfile profile, final boolean survival, final boolean book, final int selected_page) {
Player p = Bukkit.getPlayer(profile.getUUID());
if (p == null) return;
if (survival) {
clearHistory(p.getUniqueId());
}
@ -305,7 +312,7 @@ public final class SlimefunGuide {
tooltips.add(null);
actions.add(null);
}
if (category instanceof LockedCategory && !((LockedCategory) category).hasUnlocked(p)) {
if (category instanceof LockedCategory && !((LockedCategory) category).hasUnlocked(p, profile)) {
StringBuilder parents = new StringBuilder(ChatColor.translateAlternateColorCodes('&', "&4&lLOCKED\n\n&7In order to unlock this Category,\n&7you need to unlock all Items from\n&7the following Categories first:\n"));
for (Category parent: ((LockedCategory) category).getParents()) {
@ -444,7 +451,7 @@ public final class SlimefunGuide {
}
}
}
else if (((LockedCategory) category).hasUnlocked(p)) {
else if (((LockedCategory) category).hasUnlocked(p, profile)) {
menu.addItem(index, category.getItem());
menu.addMenuClickHandler(index, (pl, slot, item, action) -> {
openCategory(pl, category, survival, 1, book);
@ -476,7 +483,7 @@ public final class SlimefunGuide {
menu.addMenuClickHandler(46, (pl, slot, item, action) -> {
int next = selected_page - 1;
if (next < 1) next = finalPages;
if (next != selected_page) openMainMenu(pl, survival, book, next);
if (next != selected_page) openMainMenuAsync(pl, survival, book, next);
return false;
});
@ -484,7 +491,7 @@ public final class SlimefunGuide {
menu.addMenuClickHandler(52, (pl, slot, item, action) -> {
int next = selected_page + 1;
if (next > finalPages) next = 1;
if (next != selected_page) openMainMenu(pl, survival, book, next);
if (next != selected_page) openMainMenuAsync(pl, survival, book, next);
return false;
});
@ -492,12 +499,12 @@ public final class SlimefunGuide {
}
}
public static String shorten(String string, String string2) {
private static String shorten(String string, String string2) {
if (ChatColor.stripColor(string + string2).length() > 19) return (string + ChatColor.stripColor(string2)).substring(0, 18) + "...";
else return (string + ChatColor.stripColor(string2));
}
public static void openCategory(final Player p, final Category category, final boolean survival, final int selected_page, final boolean book) {
private static void openCategory(final Player p, final Category category, final boolean survival, final int selected_page, final boolean book) {
if (category == null) return;
if (book && category.getItems().size() < 250) {
@ -596,7 +603,7 @@ public final class SlimefunGuide {
@Override
public void run(final Player p) {
Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> openMainMenu(p, survival, true, 1), 1L);
openMainMenuAsync(p, survival, true, 1);
}
});
@ -620,7 +627,7 @@ public final class SlimefunGuide {
menu.addItem(4, new CustomItem(new ItemStack(Material.ENCHANTED_BOOK), "&7\u21E6 Back"));
menu.addMenuClickHandler(4, (pl, slot, item, action) -> {
openMainMenu(pl, survival, book, 1);
openMainMenuAsync(pl, survival, book, 1);
return false;
});
@ -804,7 +811,7 @@ public final class SlimefunGuide {
);
menu.addMenuClickHandler(0, (pl, slot, item118, action) -> {
if (action.isShiftClicked()) openMainMenu(pl, true, false, 1);
if (action.isShiftClicked()) openMainMenuAsync(pl, true, false, 1);
else {
Object last = getLastEntry(pl, true);
handleHistory(pl, last, book, cheat);
@ -816,7 +823,7 @@ public final class SlimefunGuide {
else {
menu.addItem(0, new CustomItem(new ItemStack(Material.ENCHANTED_BOOK), "&7\u21E6 Back", "", "&rLeft Click: &7Go back to Main Menu"));
menu.addMenuClickHandler(0, (pl, slot, item, action) -> {
openMainMenu(pl, true, book, 1);
openMainMenuAsync(pl, true, book, 1);
return false;
});
}
@ -841,7 +848,7 @@ public final class SlimefunGuide {
return history == null || history.isEmpty() ? null: history.getLast();
}
public static void displayItem(Player p, final ItemStack item, boolean addToHistory, final boolean book, final int page) {
private static void displayItem(Player p, final ItemStack item, boolean addToHistory, final boolean book, final int page) {
if (item == null || item.getType() == Material.AIR) return;
final SlimefunItem sfItem = SlimefunItem.getByItem(item);
@ -916,7 +923,7 @@ public final class SlimefunGuide {
if (history != null && history.size() > 1) {
menu.addItem(0, new CustomItem(new ItemStack(Material.ENCHANTED_BOOK), "&7\u21E6 Back", "", "&rLeft Click: &7Go back to previous Page", "&rShift + left Click: &7Go back to Main Menu"));
menu.addMenuClickHandler(0, (pl, slot, itemstack, action) -> {
if (action.isShiftClicked()) openMainMenu(p, true, book, 1);
if (action.isShiftClicked()) openMainMenuAsync(p, true, book, 1);
else {
Object last = getLastEntry(pl, true);
handleHistory(pl, last, book, false);
@ -927,7 +934,7 @@ public final class SlimefunGuide {
else {
menu.addItem(0, new CustomItem(new ItemStack(Material.ENCHANTED_BOOK), "&7\u21E6 Back", "", "&rLeft Click: &7Go back to Main Menu"));
menu.addMenuClickHandler(0, (pl, slot, itemstack, action) -> {
openMainMenu(pl, true, book, 1);
openMainMenuAsync(pl, true, book, 1);
return false;
});
}
@ -1116,7 +1123,7 @@ public final class SlimefunGuide {
return SlimefunPlugin.getUtilities().guideHistory;
}
public static void clearHistory(UUID uuid) {
private static void clearHistory(UUID uuid) {
getHistory().remove(uuid);
}
}

View File

@ -9,12 +9,14 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.function.Consumer;
import java.util.stream.IntStream;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.OfflinePlayer;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config;
@ -57,13 +59,7 @@ public final class PlayerProfile {
}
private PlayerProfile(UUID uuid) {
this.uuid = uuid;
this.name = Bukkit.getOfflinePlayer(uuid).getName();
cfg = new Config(new File("data-storage/Slimefun/Players/" + uuid.toString() + ".yml"));
for (Research research: Research.list()) {
if (cfg.contains("researches." + research.getID())) researches.add(research);
}
this(Bukkit.getOfflinePlayer(uuid));
}
public HashedArmorpiece[] getArmor() {
@ -212,6 +208,10 @@ public final class PlayerProfile {
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', "&7Total XP Levels spent: &b" + levels));
}
public Player getPlayer() {
return Bukkit.getPlayer(getUUID());
}
public static PlayerProfile fromUUID(UUID uuid) {
PlayerProfile profile = SlimefunPlugin.getUtilities().profiles.get(uuid);
@ -226,6 +226,14 @@ public final class PlayerProfile {
return profile;
}
/**
* This is now deprecated, use {@link #get(OfflinePlayer, Consumer)} instead
*
* @param p The player's profile you wish to retrieve
* @return The PlayerProfile of this player
* @deprecated Use {@link #get(OfflinePlayer, Consumer)}
*/
@Deprecated
public static PlayerProfile get(OfflinePlayer p) {
PlayerProfile profile = SlimefunPlugin.getUtilities().profiles.get(p.getUniqueId());
@ -240,6 +248,28 @@ public final class PlayerProfile {
return profile;
}
/**
* Get the PlayerProfile for a player asynchronously.
*
* @param p The player who's profile to retrieve
* @param callback The callback with the PlayerProfile
* @return If the player was cached or not.
*/
public static boolean get(OfflinePlayer p, Consumer<PlayerProfile> callback) {
PlayerProfile profile = SlimefunPlugin.getUtilities().profiles.get(p.getUniqueId());
if (profile != null) {
callback.accept(profile);
return true;
}
Bukkit.getScheduler().runTaskAsynchronously(SlimefunPlugin.instance, () -> {
PlayerProfile pp = new PlayerProfile(p);
SlimefunPlugin.getUtilities().profiles.put(p.getUniqueId(), pp);
callback.accept(pp);
});
return false;
}
public static boolean isLoaded(UUID uuid) {
return SlimefunPlugin.getUtilities().profiles.containsKey(uuid);
}

View File

@ -5,6 +5,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.logging.Logger;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
@ -323,4 +324,8 @@ public final class Slimefun {
public static SlimefunLocalization getLocal() {
return SlimefunPlugin.getLocal();
}
public static void runSync(Runnable r) {
Bukkit.getScheduler().runTask(SlimefunPlugin.instance, r);
}
}

View File

@ -2,6 +2,8 @@ package me.mrCookieSlime.Slimefun.listeners;
import java.util.List;
import me.mrCookieSlime.Slimefun.Setup.SlimefunLocalization;
import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.Sound;
@ -81,65 +83,68 @@ public class BackpackListener implements Listener {
@EventHandler
public void onInteract(PlayerInteractEvent e) {
if (e.getAction() == Action.RIGHT_CLICK_AIR || e.getAction() == Action.RIGHT_CLICK_BLOCK) {
ItemStack item = e.getItem();
Player p = e.getPlayer();
ItemStack item = e.getItem();
SlimefunItem sfItem = SlimefunItem.getByItem(item);
if (sfItem == null) return;
if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BACKPACK_SMALL, false)) {
openBackpack(SlimefunItems.BACKPACK_SMALL, 9, e, p, item);
}
else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BACKPACK_MEDIUM, false)) {
openBackpack(SlimefunItems.BACKPACK_MEDIUM, 18, e, p, item);
}
else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BACKPACK_LARGE, false)) {
openBackpack(SlimefunItems.BACKPACK_LARGE, 27, e, p, item);
}
else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.WOVEN_BACKPACK, false)) {
openBackpack(SlimefunItems.WOVEN_BACKPACK, 36, e, p, item);
}
else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.GILDED_BACKPACK, false)) {
openBackpack(SlimefunItems.GILDED_BACKPACK, 45, e, p, item);
}
else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.RADIANT_BACKPACK, false)) {
openBackpack(SlimefunItems.RADIANT_BACKPACK, 54, e, p, item);
}
else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BOUND_BACKPACK, false)) {
openBackpack(SlimefunItems.BOUND_BACKPACK, 36, e, p, item);
}
else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.COOLER, false)) {
openBackpack(SlimefunItems.COOLER, 27, e, p, item);
}
// Surely this can be even simpler?
if (sfItem.isItem(SlimefunItems.BACKPACK_SMALL))
openBackpack(SlimefunItems.BACKPACK_SMALL, sfItem, 9, e, p);
else if (sfItem.isItem(SlimefunItems.BACKPACK_MEDIUM))
openBackpack(SlimefunItems.BACKPACK_MEDIUM, sfItem, 18, e, p);
else if (sfItem.isItem(SlimefunItems.BACKPACK_LARGE))
openBackpack(SlimefunItems.BACKPACK_LARGE, sfItem, 27, e, p);
else if (sfItem.isItem(SlimefunItems.WOVEN_BACKPACK))
openBackpack(SlimefunItems.WOVEN_BACKPACK, sfItem, 36, e, p);
else if (sfItem.isItem(SlimefunItems.GILDED_BACKPACK))
openBackpack(SlimefunItems.GILDED_BACKPACK, sfItem, 45, e, p);
else if (sfItem.isItem(SlimefunItems.RADIANT_BACKPACK))
openBackpack(SlimefunItems.RADIANT_BACKPACK, sfItem, 54, e, p);
else if (sfItem.isItem(SlimefunItems.BOUND_BACKPACK))
openBackpack(SlimefunItems.BOUND_BACKPACK, sfItem, 36, e, p);
else if (sfItem.isItem(SlimefunItems.COOLER))
openBackpack(SlimefunItems.COOLER, sfItem, 27, e, p);
}
}
private void openBackpack(ItemStack sfItem, int size, PlayerInteractEvent e, Player p, ItemStack item) {
private void openBackpack(ItemStack item, SlimefunItem sfItem, int size, PlayerInteractEvent e, Player p) {
e.setCancelled(true);
if (item.getAmount() == 1) {
if (Slimefun.hasUnlocked(p, sfItem, true)) {
PlayerProfile profile = PlayerProfile.get(p);
for (int line = 0; line < item.getItemMeta().getLore().size(); line++) {
if (item.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: <ID>"))) {
BackpackInventory backpack = profile.createBackpack(size);
ItemMeta im = item.getItemMeta();
List<String> lore = im.getLore();
lore.set(line, lore.get(line).replace("<ID>", p.getUniqueId() + "#" + backpack.getID()));
im.setLore(lore);
item.setItemMeta(im);
break;
}
}
if(!SlimefunPlugin.getUtilities().backpack.containsValue(item)) {
PlayerProfile.getBackpack(item).open(p);
p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F);
SlimefunPlugin.getUtilities().backpack.put(p.getUniqueId(), item);
}
else SlimefunPlugin.getLocal().sendMessage(p, "backpack.already-open", true);
if (!PlayerProfile.get(p, profile -> openBackpack(item, profile, size)))
Slimefun.getLocal().sendMessage(p, "messages.opening-backpack");
}
}
else SlimefunPlugin.getLocal().sendMessage(p, "backpack.no-stack", true);
}
private void openBackpack(ItemStack item, PlayerProfile profile, int size) {
Player p = profile.getPlayer();
for (int line = 0; line < item.getItemMeta().getLore().size(); line++) {
if (item.getItemMeta().getLore().get(line).equals(ChatColor.translateAlternateColorCodes('&', "&7ID: <ID>"))) {
BackpackInventory backpack = profile.createBackpack(size);
setBackpackId(p, item, line, backpack.getID());
break;
}
}
if (!SlimefunPlugin.getUtilities().backpack.containsValue(item)) {
p.playSound(p.getLocation(), Sound.ENTITY_HORSE_ARMOR, 1F, 1F);
SlimefunPlugin.getUtilities().backpack.put(p.getUniqueId(), item);
Slimefun.runSync(() -> PlayerProfile.getBackpack(item).open(p));
}
else SlimefunPlugin.getLocal().sendMessage(p, "backpack.already-open", true);
}
public static void setBackpackId(Player p, ItemStack item, int line, int id) {
ItemMeta im = item.getItemMeta();
List<String> lore = im.getLore();
lore.set(line, lore.get(line).replace("<ID>", p.getUniqueId() + "#" + id));
im.setLore(lore);
item.setItemMeta(im);
}
}

View File

@ -210,6 +210,7 @@ public class ItemListener implements Listener {
final Player p = e.getPlayer();
ItemStack item = e.getItem();
SlimefunItem slimefunItem = SlimefunItem.getByItem(item);
if (SlimefunManager.isItemSimiliar(item, SlimefunGuide.getItem(SlimefunGuideLayout.BOOK), true)) {
if (p.isSneaking()) SlimefunGuide.openSettings(p, item);
@ -226,7 +227,7 @@ public class ItemListener implements Listener {
else if (SlimefunManager.isItemSimiliar(item, SlimefunItems.DEBUG_FISH, true)) {
// Ignore the debug fish in here
}
else if (Slimefun.hasUnlocked(p, item, true)) {
else if (Slimefun.hasUnlocked(p, slimefunItem, true)) {
for (ItemHandler handler : SlimefunItem.getHandlers("ItemInteractionHandler")) {
if (((ItemInteractionHandler) handler).onRightClick(e, p, item)) return;
}
@ -249,8 +250,7 @@ public class ItemListener implements Listener {
if (tool != null && tool.getType() != Material.AIR) {
SlimefunItem sfItem = SlimefunItem.getByItem(tool);
List<Integer> modes = ((MultiTool) sfItem).getModes();
int index = 0;
if (utilities.mode.containsKey(p.getUniqueId())) index = utilities.mode.get(p.getUniqueId());
int index = utilities.mode.getOrDefault(p.getUniqueId(), 0);
if (!p.isSneaking()) {
float charge = ItemEnergy.getStoredEnergy(item);