Skip to content

Commit

Permalink
Fixed massive lag when opening the Leaderboard Frame
Browse files Browse the repository at this point in the history
Closes #617
Added loading message to the buttons lore
Previous and Next page buttons now hide if they have no use
  • Loading branch information
RoinujNosde committed Jun 6, 2020
1 parent 6e255fc commit 68065a3
Show file tree
Hide file tree
Showing 21 changed files with 165 additions and 103 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>net.sacredlabyrinth.phaed.simpleclans</groupId>
<artifactId>SimpleClans</artifactId>
<version>2.12.0</version>
<version>2.12.1</version>
<name>SimpleClans</name>
<url>http://dev.bukkit.org/server-mods/simpleclans/</url>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,9 @@ public boolean isEnableGUI() {

public void setEnableGUI(boolean enableGUI) {
this.enableGUI = enableGUI;
}
getConfig().set("settings.enable-gui", enableGUI);
save();
}

public Locale getLanguage() {
String[] split = language.split("_");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
package net.sacredlabyrinth.phaed.simpleclans.ui;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.*;

import org.bukkit.Bukkit;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.scheduler.BukkitRunnable;

import net.sacredlabyrinth.phaed.simpleclans.ClanPlayer;
Expand All @@ -20,6 +21,8 @@
import net.sacredlabyrinth.phaed.simpleclans.ui.frames.WarningFrame;
import org.jetbrains.annotations.NotNull;

import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;

/**
*
* @author RoinujNosde
Expand Down Expand Up @@ -79,7 +82,16 @@ public void onInteract(InventoryClickEvent event) {
}
}

listener.run();
Bukkit.getScheduler().runTask(SimpleClans.getInstance(), () -> {
ItemStack currentItem = event.getCurrentItem();
if (currentItem == null) return;

ItemMeta itemMeta = currentItem.getItemMeta();
Objects.requireNonNull(itemMeta).setLore(Collections.singletonList(lang("gui.loading")));
currentItem.setItemMeta(itemMeta);

listener.run();
});
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,110 +4,119 @@
import net.sacredlabyrinth.phaed.simpleclans.commands.MenuCommand;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.scheduler.BukkitRunnable;

import net.sacredlabyrinth.phaed.simpleclans.SimpleClans;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.List;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;

import static net.sacredlabyrinth.phaed.simpleclans.SimpleClans.lang;

public class InventoryDrawer {
private static final SimpleClans plugin = SimpleClans.getInstance();
private static final ConcurrentHashMap<UUID, SCFrame> OPENING = new ConcurrentHashMap<>();

private InventoryDrawer() {
}

public static void open(@Nullable SCFrame frame) {
if (frame == null) return;

new BukkitRunnable() {

@Override
public void run() {
try {
Inventory inventory = Bukkit.createInventory(frame.getViewer(), frame.getSize(), frame.getTitle());

setComponents(inventory, frame);

frame.getViewer().openInventory(inventory);
InventoryController.register(frame);
} catch (NoSuchFieldError ex) {
SimpleClans plugin = SimpleClans.getInstance();
Player player = frame.getViewer();
MenuCommand menuCommand = new MenuCommand();
menuCommand.execute(player);
plugin.getServer().getConsoleSender().sendMessage(lang("gui.not.supported"));
plugin.getSettingsManager().setEnableGUI(false);
plugin.getSettingsManager().save();
}
}
}.runTask(SimpleClans.getInstance());
}
if (frame == null) {
return;
}
UUID uuid = frame.getViewer().getUniqueId();
if (frame.equals(OPENING.get(uuid))) {
return;
}

public static void update(@NotNull SCFrame frame) {
OPENING.put(uuid, frame);
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {

new BukkitRunnable() {
Inventory inventory = prepareInventory(frame);

@Override
public void run() {
InventoryView view = frame.getViewer().getOpenInventory();
Inventory inventory = view.getTopInventory();
if (inventory.getType() == InventoryType.CRAFTING) {
return;
}
//if the title or size changed, the inventory needs to be recreated
if (!view.getTitle().equals(frame.getTitle()) || inventory.getSize() != frame.getSize()) {
open(frame);
return;
}
inventory.clear();
if (!frame.equals(OPENING.get(uuid))) {
return;
}
Bukkit.getScheduler().runTask(plugin, () -> {
frame.getViewer().openInventory(inventory);
InventoryController.register(frame);
OPENING.remove(uuid);
});
});
}

setComponents(inventory, frame);
@NotNull
private static Inventory prepareInventory(@NotNull SCFrame frame) {
Inventory inventory = Bukkit.createInventory(frame.getViewer(), frame.getSize(), frame.getTitle());
long start = System.currentTimeMillis();
setComponents(inventory, frame);

}
}.runTask(SimpleClans.getInstance());
if (plugin.getSettingsManager().isDebugging()) {
plugin.getLogger().log(Level.INFO,
String.format("It took %s millisecond(s) to load the frame %s for %s",
System.currentTimeMillis() - start, frame.getTitle(), frame.getViewer().getName()));
}
return inventory;
}

@Deprecated
public static void update(@NotNull SCFrame frame) {
open(frame);
}

private static void setComponents(@NotNull Inventory inventory, @NotNull SCFrame frame) {
frame.clear();
frame.createComponents();
try {
frame.createComponents();
} catch (NoSuchFieldError ex) {
runHelpCommand(frame.getViewer());
return;
}

SimpleClans plugin = SimpleClans.getInstance();
if (frame.getComponents().isEmpty()) {
Set<SCComponent> components = frame.getComponents();
if (components.isEmpty()) {
plugin.getLogger().warning(String.format("Frame %s has no components", frame.getTitle()));
return;
}
for (SCComponent c : frame.getComponents()) {
if (c.getSlot() >= frame.getSize()) {
continue;
}
ItemMeta itemMeta = c.getItemMeta();
if (itemMeta != null) {
List<String> lore = itemMeta.getLore();
if (lore != null) {
Object permission = c.getLorePermission();
if (permission != null) {
if (!hasPermission(frame.getViewer(), permission)) {
lore.clear();
lore.add(lang("gui.lore.no.permission"));
itemMeta.setLore(lore);
c.setItemMeta(itemMeta);
}
checkLorePermission(frame, c);
inventory.setItem(c.getSlot(), c.getItem());
}
}

private static void runHelpCommand(@NotNull Player player) {
MenuCommand menuCommand = new MenuCommand();
menuCommand.execute(player);
Bukkit.getScheduler().runTask(plugin, () -> plugin.getServer().getConsoleSender().sendMessage(lang("gui.not.supported")));
plugin.getSettingsManager().setEnableGUI(false);
}

private static void checkLorePermission(@NotNull SCFrame frame, @NotNull SCComponent component) {
ItemMeta itemMeta = component.getItemMeta();
if (itemMeta != null) {
List<String> lore = itemMeta.getLore();
if (lore != null) {
Object permission = component.getLorePermission();
if (permission != null) {
if (!hasPermission(frame.getViewer(), permission)) {
lore.clear();
lore.add(lang("gui.lore.no.permission"));
itemMeta.setLore(lore);
component.setItemMeta(itemMeta);
}
}
}
inventory.setItem(c.getSlot(), c.getItem());
}
}

private static boolean hasPermission(@NotNull Player viewer, @NotNull Object permission) {
SimpleClans plugin = SimpleClans.getInstance();
private static boolean hasPermission(@NotNull Player viewer, @NotNull Object permission) {
if (permission instanceof String) {
return plugin.getPermissionsManager().has(viewer, (String) permission);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package net.sacredlabyrinth.phaed.simpleclans.ui;

import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
Expand All @@ -16,7 +16,7 @@ public abstract class SCFrame {

private final SCFrame parent;
private final Player viewer;
private final Set<SCComponent> components = new HashSet<>();
private final Set<SCComponent> components = ConcurrentHashMap.newKeySet();

public SCFrame(@Nullable SCFrame parent, @NotNull Player viewer) {
this.parent = parent;
Expand Down Expand Up @@ -63,4 +63,20 @@ public Set<SCComponent> getComponents() {
return components;
}

@Override
public boolean equals(Object other) {
if (other instanceof SCFrame) {
SCFrame otherFrame = (SCFrame) other;
return getSize() == otherFrame.getSize() && getTitle().equals(otherFrame.getTitle())
&& getComponents().equals(otherFrame.getComponents());
}

return false;
}

@Override
public int hashCode() {
return getTitle().hashCode() + Integer.hashCode(getSize()) + getComponents().hashCode();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ public void createComponents() {
}
add(Components.getBackComponent(getParent(), 2));

add(Components.getPreviousPageComponent(6, this::previousPage));
add(Components.getNextPageComponent(7, this::nextPage));
add(Components.getPreviousPageComponent(6, this::previousPage, paginator));
add(Components.getNextPageComponent(7, this::nextPage, paginator));

int slot = 9;
for (int i = paginator.getMinIndex(); paginator.isValidIndex(i); i++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ public void createComponents() {
}
add(Components.getBackComponent(getParent(), 2));

add(Components.getPreviousPageComponent(6, this::previousPage));
add(Components.getNextPageComponent(7, this::nextPage));
add(Components.getPreviousPageComponent(6, this::previousPage, paginator));
add(Components.getNextPageComponent(7, this::nextPage, paginator));

int slot = 9;
for (int i = paginator.getMinIndex(); paginator.isValidIndex(i); i++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ public void createComponents() {
}
add(Components.getBackComponent(getParent(), 2));

add(Components.getPreviousPageComponent(6, this::previousPage));
add(Components.getNextPageComponent(7, this::nextPage));
add(Components.getPreviousPageComponent(6, this::previousPage, paginator));
add(Components.getNextPageComponent(7, this::nextPage, paginator));

int slot = 9;
for (int i = paginator.getMinIndex(); paginator.isValidIndex(i); i++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,8 @@ public void createComponents() {
add.setPermission(ClickType.LEFT, RankPermission.ALLY_ADD);
add(add);

add(Components.getPreviousPageComponent(6, this::previousPage));
add(Components.getNextPageComponent(7, this::nextPage));
add(Components.getPreviousPageComponent(6, this::previousPage, paginator));
add(Components.getNextPageComponent(7, this::nextPage, paginator));

int slot = 9;
for (int i = paginator.getMinIndex(); paginator.isValidIndex(i); i++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ public void createComponents() {
}
add(Components.getBackComponent(getParent(), 2));

add(Components.getPreviousPageComponent(6, this::previousPage));
add(Components.getNextPageComponent(7, this::nextPage));
add(Components.getPreviousPageComponent(6, this::previousPage, paginator));
add(Components.getNextPageComponent(7, this::nextPage, paginator));

int slot = 9;
for (int i = paginator.getMinIndex(); paginator.isValidIndex(i); i++) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import java.util.Arrays;
import java.util.List;

import net.sacredlabyrinth.phaed.simpleclans.utils.Paginator;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
Expand Down Expand Up @@ -135,14 +136,20 @@ public static SCComponent getPanelComponent(int slot) {
return new SCComponentImpl(" ", null, Material.GRAY_STAINED_GLASS_PANE, slot);
}

public static SCComponent getPreviousPageComponent(int slot, Runnable listener) {
public static SCComponent getPreviousPageComponent(int slot, @Nullable Runnable listener, @NotNull Paginator paginator) {
if (!paginator.hasPreviousPage()) {
return getPanelComponent(slot);
}
SCComponent c = new SCComponentImpl(lang("gui.previous.page.title"), null,
Material.STONE_BUTTON, slot);
c.setListener(ClickType.LEFT, listener);
return c;
}

public static SCComponent getNextPageComponent(int slot, Runnable listener) {
public static SCComponent getNextPageComponent(int slot, @Nullable Runnable listener, @NotNull Paginator paginator) {
if (!paginator.hasNextPage()) {
return getPanelComponent(slot);
}
SCComponent c = new SCComponentImpl(lang("gui.next.page.title"), null,
Material.STONE_BUTTON, slot);
c.setListener(ClickType.LEFT, listener);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ public void createComponents() {

add(Components.getBackComponent(getParent(), 2));

add(Components.getPreviousPageComponent(6, this::previousPage));
add(Components.getNextPageComponent(7, this::nextPage));
add(Components.getPreviousPageComponent(6, this::previousPage, paginator));
add(Components.getNextPageComponent(7, this::nextPage, paginator));
int slot = 9;
for (int i = paginator.getMinIndex(); paginator.isValidIndex(i); i++) {
ClanPlayer cp = allMembers.get(i);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ public void createComponents() {
}
add(Components.getBackComponent(getParent(), 2));

add(Components.getPreviousPageComponent(6, this::previousPage));
add(Components.getNextPageComponent(7, this::nextPage));
add(Components.getPreviousPageComponent(6, this::previousPage, paginator));
add(Components.getNextPageComponent(7, this::nextPage, paginator));

int slot = 9;
for (int i = paginator.getMinIndex(); paginator.isValidIndex(i); i++) {
Expand Down
Loading

0 comments on commit 68065a3

Please sign in to comment.