diff --git a/core/src/main/java/me/zort/containr/Element.java b/core/src/main/java/me/zort/containr/Element.java index 889437a..2259129 100644 --- a/core/src/main/java/me/zort/containr/Element.java +++ b/core/src/main/java/me/zort/containr/Element.java @@ -9,6 +9,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.function.Consumer; + @Getter public abstract class Element implements Component { @@ -23,4 +25,14 @@ public void click(ContextClickInfo info) {} @Nullable public abstract ItemStack item(Player player); + /** + * Post-process the created ItemStack before it is applied to the GUI. + * + * @param player The player for which the item has been created. + * @param item The created item. Is not the same as the returned from {@link #item(Player)}. + * @param newItemConsumer The handler that MUST be called after the item has been modified to update the menu. + */ + public void postProcessItem(Player player, ItemStack item, Consumer newItemConsumer) { + // No modifications by default. + } } diff --git a/core/src/main/java/me/zort/containr/GUI.java b/core/src/main/java/me/zort/containr/GUI.java index 5d9acea..ed052d0 100644 --- a/core/src/main/java/me/zort/containr/GUI.java +++ b/core/src/main/java/me/zort/containr/GUI.java @@ -217,6 +217,9 @@ public void update(@NotNull Player p, boolean clear, Class... item = NBT.modifyNBT(item, nbtItem -> nbtItem.setString(Constants.ELEMENT_ID_KEY, element.getId())); } if(slot < inventory.getSize() && slot >= 0) { + Consumer processFinalItem = (finalItem) -> inventory.setItem(slot, finalItem); + element.postProcessItem(p, item, processFinalItem); + inventory.setItem(slot, item); } else { String err = "Cannot complete menu %s for player %s because index out of bounds: %d >= %d";