Skip to content

Commit

Permalink
Merge branch 'master' into development
Browse files Browse the repository at this point in the history
  • Loading branch information
PXAV committed Mar 19, 2021
2 parents e32fe55 + 68cce64 commit 06e34de
Show file tree
Hide file tree
Showing 13 changed files with 187 additions and 112 deletions.
10 changes: 10 additions & 0 deletions CHANGELOG/kelp-v0.3.1.md
@@ -0,0 +1,10 @@
# v0.3.1
> Release date: 05.03.2021
**Independent Widgets**:
* Widgets _can_ now independent from players (#44)
* Added an additional KelpPlayer parameter to the following methods:
- `KelpInventory.render(KelpPlayer)`
- `GroupedWidget.render(KelpPlayer)`
* To summarize and cleanup all `Widget` implementations, the abstract class `AbstractWidget<W extends AbstractWidget<?>>` was added. It's responsible for player-specific actions like adding a `ClickListener` to a certain item.
* Add `/sweetinv` command to testing module demonstrating the new feature
Expand Up @@ -63,7 +63,7 @@ public void loadMaterials() {
* @param player The player who should see the inventory.
*/
public void openInventory(KelpInventory inventory, KelpPlayer player) {
Inventory renderedInventory = inventory.render();
Inventory renderedInventory = inventory.render(player);
player.getBukkitPlayer().openInventory(renderedInventory);
boolean animated = false;

Expand Down
15 changes: 11 additions & 4 deletions core/src/main/java/de/pxav/kelp/core/inventory/item/KelpItem.java
Expand Up @@ -9,7 +9,6 @@
import de.pxav.kelp.core.inventory.version.ItemVersionTemplate;
import de.pxav.kelp.core.player.KelpPlayer;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;

Expand Down Expand Up @@ -260,9 +259,17 @@ public KelpItem allowInteractions() {
* @return Instance of the current {@code KelpItem} object.
*/
public KelpItem addListener(KelpPlayer player, ClickListener listener) {
String listenerId = listenerRepository.registerListener(player.getUUID(), listener);
this.addTag("listener-" + ThreadLocalRandom.current().nextInt(1, 1000), listenerId);
return this;
return addListener(player.getUUID(), listener);
}

/**
* Adds a global listener, which does not depend on any player.
*
* @param listener The listener.
* @return Instance of the current {@code KelpItem} object.
*/
public KelpItem addGlobalListener(ClickListener listener) {
return addListener(KelpListenerRepository.GLOBAL_LISTENER_ID, listener);
}

/**
Expand Down
Expand Up @@ -5,6 +5,7 @@
import com.google.common.collect.Multimap;
import com.google.inject.Singleton;

import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.UUID;

Expand All @@ -22,6 +23,9 @@
@Singleton
public class KelpListenerRepository {

// Used to store listeners that are independent from players
public static final UUID GLOBAL_LISTENER_ID = UUID.nameUUIDFromBytes("KLR_GLOBAL".getBytes(StandardCharsets.UTF_8));

// Stores which listener ids go with which player.
// This allows to unregister listeners of a specific player
// when they quit the server or their inventory in order to
Expand All @@ -46,8 +50,13 @@ public class KelpListenerRepository {
*/
public String registerListener(UUID playerFor, ClickListener listener) {
String listenerId = this.newListenerId();

listeners.put(listenerId, listener);
listenerOwners.put(playerFor, listenerId);

if(playerFor != GLOBAL_LISTENER_ID) {
listenerOwners.put(playerFor, listenerId);
}

return listenerId;
}

Expand Down
Expand Up @@ -4,18 +4,14 @@
import de.pxav.kelp.core.KelpPlugin;
import de.pxav.kelp.core.animation.StaticTextAnimation;
import de.pxav.kelp.core.animation.TextAnimation;
import de.pxav.kelp.core.animation.TextAnimationFactory;
import de.pxav.kelp.core.inventory.item.KelpItem;
import de.pxav.kelp.core.inventory.version.InventoryVersionTemplate;
import de.pxav.kelp.core.inventory.widget.GroupedWidget;
import de.pxav.kelp.core.inventory.widget.SimpleWidget;
import de.pxav.kelp.core.inventory.version.WindowPacketTemplate;
import de.pxav.kelp.core.player.KelpPlayer;
import de.pxav.kelp.core.sidebar.type.AnimatedSidebar;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;

import java.util.List;
import java.util.concurrent.Executors;
Expand Down Expand Up @@ -87,7 +83,7 @@ public void updateTitleOnly(Player player, int state) {
}

@Override
public Inventory render() {
public Inventory render(KelpPlayer player) {
if (this.title == null) {
this.title = StaticTextAnimation.create().text("§8Inventory");
}
Expand All @@ -100,7 +96,7 @@ public Inventory render() {
}

for (GroupedWidget current : groupedWidgets) {
current.render().forEach(item -> {
current.render(player).forEach(item -> {
inventory.setItem(item.getSlot(), item.getItemStack());
});
}
Expand All @@ -119,7 +115,7 @@ public void update(KelpPlayer toUpdate) {
}

for (GroupedWidget current : groupedWidgets) {
current.render().forEach(item -> {
current.render(toUpdate).forEach(item -> {
playerInventory.setItem(item.getSlot(), item.getItemStack());
});
}
Expand Down
Expand Up @@ -10,7 +10,7 @@
*/
public abstract class KelpInventory {

public abstract Inventory render();
public abstract Inventory render(KelpPlayer player);

public abstract void update(KelpPlayer toUpdate);

Expand Down
@@ -0,0 +1,54 @@
package de.pxav.kelp.core.inventory.widget;

import de.pxav.kelp.core.inventory.item.KelpItem;
import de.pxav.kelp.core.inventory.listener.ClickListener;
import de.pxav.kelp.core.player.KelpPlayer;

/**
* An abstract implementation of the Widget class,
* which is responsible for player-dependent actions.
*
* @author Etrayed
*/
public abstract class AbstractWidget<W extends AbstractWidget<?>> implements Widget {

protected KelpPlayer player;

/**
* Sets the player to whom the current widget is currently dedicated.
*
* @param player The player you want to choose.
* @return The current instance of the widget.
*/
@Override
public final W player(KelpPlayer player) {
this.player = player;

return (W) this;
}

/**
* Gets the player to whom the current widget is dedicated.
*
* @return The {@code KelpPlayer} - "owner" of the widget.
*/
@Override
public final KelpPlayer getPlayer() {
return this.player;
}

/**
* Adds a listener to the omitted item. If {@link #player the player}
* is {@code null}, a {@link KelpItem#addGlobalListener(ClickListener) global listener} will be added.
*
* @param item The item to listen to.
* @param listener The listener.
*/
protected void addClickListener(KelpItem item, ClickListener listener) {
if(player == null) {
item.addGlobalListener(listener);
} else {
item.addListener(player, listener);
}
}
}
@@ -1,6 +1,7 @@
package de.pxav.kelp.core.inventory.widget;

import de.pxav.kelp.core.inventory.item.KelpItem;
import de.pxav.kelp.core.player.KelpPlayer;

import java.util.Collection;

Expand All @@ -24,8 +25,9 @@ public interface GroupedWidget extends Widget {
* Converts all the given information and customization
* and generates a collection of items out of it.
*
* @param player The widget "receiver".
* @return The collection of items representing the widget.
*/
Collection<KelpItem> render();
Collection<KelpItem> render(KelpPlayer player);

}
Expand Up @@ -3,7 +3,6 @@
import com.google.common.collect.Sets;
import de.pxav.kelp.core.inventory.item.KelpItem;
import de.pxav.kelp.core.inventory.listener.ClickListener;
import de.pxav.kelp.core.player.KelpPlayer;

import java.util.Set;

Expand All @@ -14,9 +13,7 @@
*
* @author pxav
*/
public class ItemWidget implements SimpleWidget {

private KelpPlayer player;
public class ItemWidget extends AbstractWidget<ItemWidget> implements SimpleWidget {

// the item to be set into the inventory.
private KelpItem item;
Expand Down Expand Up @@ -65,32 +62,11 @@ public ItemWidget addItemListener(ClickListener listener) {
}

// if the item exists, nothing has to be cached
item.addListener(player, listener);
return this;
}
addClickListener(item, listener);

/**
* Sets the player to whom the current widget is currently dedicated.
*
* @param player The player you want to choose.
* @return The current instance of the widget.
*/
@Override
public ItemWidget player(KelpPlayer player) {
this.player = player;
return this;
}

/**
* Gets the player to whom the current widget is dedicated.
*
* @return The {@code KelpPlayer} - "owner" of the widget.
*/
@Override
public KelpPlayer getPlayer() {
return this.player;
}

/**
* Renders the widget and converts all the given information
* and configuration to a single {@code KelpItem}, which can
Expand All @@ -102,9 +78,7 @@ public KelpPlayer getPlayer() {
public KelpItem render() {
// add cached listeners which were created when then item
// did not exist.
for (ClickListener listener : listenerCache) {
item.addListener(player, listener);
}
listenerCache.forEach(listener -> addClickListener(item, listener));

return item;
}
Expand Down
Expand Up @@ -25,9 +25,7 @@
*
* @author pxav
*/
public class Pagination implements GroupedWidget {

private KelpPlayer player;
public class Pagination extends AbstractWidget<Pagination> implements GroupedWidget {

// the slots which should be used for the pages
private List<Integer> contentSlots;
Expand Down Expand Up @@ -93,9 +91,12 @@ public Pagination contentItems(KelpItem... contentItem) {

public Pagination nextButton(KelpItem nextButton, Runnable onLastPage) {
this.nextButton = nextButton;
nextButton.addListener(player, event -> {

addClickListener(nextButton, event -> {
KelpPlayer player = event.getPlayer();
Map<Pagination, Integer> playerPages = inventoryRepository.getPlayerPages().getOrDefault(player.getUUID(), Maps.newHashMap());
int currentPage = playerPages.getOrDefault(this, 0);

if (currentPage >= this.getMaxPage() - 1) {
playerPages.put(this, currentPage);
onLastPage.run();
Expand All @@ -107,14 +108,18 @@ public Pagination nextButton(KelpItem nextButton, Runnable onLastPage) {
inventoryRepository.getPlayerPages().put(player.getUUID(), playerPages);
player.updateKelpInventory();
});

return this;
}

public Pagination previousButton(KelpItem previousButton, Runnable onFirstPage) {
this.previousButton = previousButton;
previousButton.addListener(player, event -> {

addClickListener(previousButton, event -> {
KelpPlayer player = event.getPlayer();
Map<Pagination, Integer> playerPages = inventoryRepository.getPlayerPages().getOrDefault(player.getUUID(), Maps.newHashMap());
int currentPage = playerPages.getOrDefault(this, 0);

if (currentPage == 0) {
playerPages.put(this, currentPage);
onFirstPage.run();
Expand All @@ -125,6 +130,7 @@ public Pagination previousButton(KelpItem previousButton, Runnable onFirstPage)
player.updateKelpInventory();
inventoryRepository.getPlayerPages().put(player.getUUID(), playerPages);
});

return this;
}

Expand All @@ -149,7 +155,9 @@ private int getMaxPage() {
* @return The collection of items representing the widget.
*/
@Override
public Collection<KelpItem> render() {
public Collection<KelpItem> render(KelpPlayer player) {
player = this.player != null ? this.player : player;

Collection<KelpItem> output = Lists.newArrayList();

// Iterate all items and check to which page they belong
Expand Down Expand Up @@ -182,27 +190,4 @@ public Collection<KelpItem> render() {

return output;
}

/**
* Sets the player to whom the current widget is currently dedicated.
*
* @param player The player you want to choose.
* @return The current instance of the widget.
*/
@Override
public Pagination player(KelpPlayer player) {
this.player = player;
return this;
}

/**
* Gets the player to whom the current widget is dedicated.
*
* @return The {@code KelpPlayer} - "owner" of the widget.
*/
@Override
public KelpPlayer getPlayer() {
return this.player;
}

}

0 comments on commit 06e34de

Please sign in to comment.