Skip to content

Commit

Permalink
feat: 支持将按钮设置到玩家背包中
Browse files Browse the repository at this point in the history
  • Loading branch information
huanmeng-qwq committed Dec 28, 2024
1 parent fe76057 commit e5329c5
Show file tree
Hide file tree
Showing 6 changed files with 194 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;

/**
* 2023/3/17<br>
Expand Down Expand Up @@ -71,10 +72,13 @@ public abstract class AbstractGui<@NonNull G extends AbstractGui<@NonNull G>> im
protected boolean cancelMoveHotBarItemToSelf = true;
/**
* 是否取消玩家用鼠标选中拿起的物品移动至当前gui
* 或者Shift点击将背包物品移动至当前gui
*
* @see #cancelClickBottom
*/
protected boolean cancelMoveItemToSelf = true;
protected boolean cancelMoveItemToBottom = true;
protected boolean enablePlayerInventory = false;

protected boolean processingClickEvent;
/**
Expand Down Expand Up @@ -357,26 +361,33 @@ protected void setButton(@NonNull Slot slot, @Nullable Button button) {
}

@Nullable
public GuiButton getButton(int index) {
public GuiButton getButton(int index, Predicate<GuiButton> predicate) {
return editButtons
.stream()
.filter(predicate)
.filter(e -> e.getIndex() == index)
.findFirst()
.orElseGet(
() -> buttons
.stream()
.filter(predicate)
.filter(e -> e.getIndex() == index)
.findFirst()
.orElseGet(
() -> attachedButtons
.stream()
.filter(predicate)
.filter(e -> e.getIndex() == index)
.findFirst()
.orElse(null)
)
);
}

public GuiButton getButton(int index) {
return getButton(index, t -> true);
}

public ItemStack getItem(int index) {
return cacheInventory.getItem(index);
}
Expand All @@ -394,6 +405,9 @@ public ItemStack[] getItems(Slots slots) {
protected G fillItems(@NonNull Inventory inventory, @Nullable boolean all) {
if (all) {
inventory.clear();
if (enablePlayerInventory) {
player.getInventory().clear();
}
}
Set<GuiButton> fillItems = getFillItems();
fillItems.removeAll(editButtons);
Expand Down Expand Up @@ -428,7 +442,11 @@ protected G fillItems(@NonNull Inventory inventory, @Nullable boolean all) {
}

private void setItem(@NotNull Inventory inventory, GuiButton guiButton, ItemStack itemStack) {
manager.guiHandler().onSetItem(this, inventory, guiButton, itemStack);
if (!guiButton.isPlayerInventory()) {
manager.guiHandler().onSetItem(this, inventory, guiButton, itemStack);
} else if (enablePlayerInventory) {
manager.guiHandler().onSetItem(this, player.getInventory(), guiButton, itemStack);
}
}

/**
Expand Down Expand Up @@ -494,7 +512,7 @@ public void onClick(@NonNull InventoryClickEvent e) {
}
GuiButton item = manager.guiHandler().queryClickButton(e, this);
if (item == null) {
item = getButton(slot);
item = getButton(slot, btn -> !btn.isPlayerInventory());
}
if (item != null) {
if (!allowClick(player, item, e.getClick(), e.getAction(), e.getSlotType(), slot, e.getHotbarButton(), e)) {
Expand Down Expand Up @@ -528,6 +546,44 @@ public void onClick(@NonNull InventoryClickEvent e) {
if (cancelClickBottom) {
e.setCancelled(true);
}
if (e.isShiftClick() && cancelMoveItemToSelf) {
e.setCancelled(true);
}
if (enablePlayerInventory) {
int slot = e.getSlot();
if (slot == -999) {
e.setCancelled(true);
processingClickEvent = false;
return;
}
GuiButton item = manager.guiHandler().queryClickButton(e, this);
if (item == null) {
item = getButton(slot, GuiButton::isPlayerInventory);
}
if (item != null) {
if (!allowClick(player, item, e.getClick(), e.getAction(), e.getSlotType(), slot, e.getHotbarButton(), e)) {
processingClickEvent = false;
return;
}
Result result = item.onClick(this, player, e.getClick(), e.getAction(), e.getSlotType(), slot, e.getHotbarButton(), e);
if (result == null) {
result = Result.CANCEL;
}
if (result.isCancel()) {
e.setCancelled(true);
}
processResult(result, this, player, e.getClick(), e.getAction(), e.getSlotType(), slot, e.getHotbarButton(), e);
} else if (ItemUtil.isAir(e.getCurrentItem())) {
if (guiEmptyItemClick != null) {
if (guiEmptyItemClick.onClickEmptyButton(player, slot, e.getClick(), e.getAction(), e.getSlotType(), e.getHotbarButton(), e)) {
e.setCancelled(true);
}
}
}
if (!ItemUtil.isAir(e.getCursor()) && cancelMoveItemToBottom) {
e.setCancelled(true);
}
}

if (guiBottomClick != null) {
if (guiBottomClick.onClickBottom(player, view.getBottomInventory(), e.getClick(), e.getAction(), e.getSlotType(), e.getHotbarButton(), e)) {
Expand Down Expand Up @@ -586,9 +642,14 @@ public void onDarg(@NonNull InventoryDragEvent e) {
for (Map.Entry<Integer, ItemStack> entry : e.getNewItems().entrySet()) {
// fake event
InventoryClickEvent inventoryClickEvent = new InventoryClickEvent(e.getView(), InventoryType.SlotType.CONTAINER, entry.getKey(), ClickType.LEFT, InventoryAction.UNKNOWN);
ItemStack oldCursor = e.getOldCursor();
inventoryClickEvent.setCursor(oldCursor);
boolean hasCursor = ItemUtil.isAir(oldCursor);
onClick(inventoryClickEvent);
if (inventoryClickEvent.isCancelled()) {
e.setCancelled(true);
} else if (hasCursor) {
e.setCursor(null);
}
}
}
Expand Down Expand Up @@ -688,6 +749,13 @@ public G setCancelMoveItemToSelf(boolean cancelMoveItemToSelf) {
return self();
}

@CanIgnoreReturnValue
public G setCancelMoveItemToBottom(boolean cancelMoveItemToBottom) {
this.cancelMoveItemToBottom = cancelMoveItemToBottom;
return self();
}


@CanIgnoreReturnValue
public G setAllowReopen(boolean allowReopen) {
this.allowReopen = allowReopen;
Expand All @@ -711,6 +779,15 @@ public G customResultHandler(CustomResultHandler customResultHandler) {
return self();
}

public boolean enablePlayerInventory() {
return enablePlayerInventory;
}

public G enablePlayerInventory(boolean enablePlayerInventory) {
this.enablePlayerInventory = enablePlayerInventory;
return self();
}

public GuiManager manager() {
return this.manager;
}
Expand Down Expand Up @@ -739,6 +816,8 @@ protected AbstractGui<G> copy(Object newGui) {
gui.cancelClickBottom = cancelClickBottom;
gui.cancelMoveHotBarItemToSelf = cancelMoveHotBarItemToSelf;
gui.cancelMoveItemToSelf = cancelMoveItemToSelf;
gui.cancelMoveItemToBottom = cancelMoveItemToBottom;
gui.enablePlayerInventory = enablePlayerInventory;
gui.disableClick = disableClick;
gui.tickles = tickles;
gui.intervalTick = intervalTick;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import me.huanmeng.opensource.bukkit.gui.button.Button;
import me.huanmeng.opensource.bukkit.gui.enums.Result;
import me.huanmeng.opensource.bukkit.gui.slot.PlayerSlot;
import me.huanmeng.opensource.bukkit.gui.slot.Slot;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
Expand All @@ -27,10 +28,12 @@ public final class GuiButton {

@NonNull
private Button button;
private boolean isPlayerInventory;

public GuiButton(@NonNull Slot slot, @Nullable Button button) {
this.slot = slot;
this.button = button == null ? Button.empty() : button;
this.isPlayerInventory = this.slot instanceof PlayerSlot;
}

/**
Expand Down Expand Up @@ -69,18 +72,19 @@ public void setButton(@NonNull Button button) {
this.button = button;
}

public boolean isPlayerInventory() {
return isPlayerInventory;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;

GuiButton guiButton = (GuiButton) o;

return Objects.equals(slot.getIndex(), guiButton.slot.getIndex());
return isPlayerInventory == guiButton.isPlayerInventory && Objects.equals(slot, guiButton.slot);
}

@Override
public int hashCode() {
return slot.hashCode();
return Objects.hash(slot, isPlayerInventory);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package me.huanmeng.opensource.bukkit.gui.slot;

import me.huanmeng.opensource.bukkit.gui.AbstractGui;
import me.huanmeng.opensource.bukkit.gui.button.Button;
import me.huanmeng.opensource.bukkit.gui.enums.Result;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.event.inventory.InventoryAction;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryType;
import org.checkerframework.checker.nullness.qual.NonNull;

/**
* 代表玩家背包中的槽位
*
* @author huanmeng_qwq
*/
public class PlayerSlot implements Slot {
@NonNull
private final Slot slot;

public PlayerSlot(@NonNull Slot slot) {
this.slot = slot;
}

@Override
public int getIndex() {
return slot.getIndex();
}

@Override
public @NonNull Result onClick(@NonNull AbstractGui<?> gui, @NonNull Button button, @NonNull Player player, @NonNull ClickType click, @NonNull InventoryAction action, InventoryType.@NonNull SlotType slotType, int slot, int hotBarKey, @NonNull InventoryClickEvent e) {
return this.slot.onClick(gui, button, player, click, action, slotType, slot, hotBarKey, e);
}

@Override
public boolean tryPlace(@NonNull Button button, @NonNull Player player) {
return slot.tryPlace(button, player);
}

@Override
public PlayerSlot toPlayerSlot() {
return this;
}

public Slot getSlot() {
return slot;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package me.huanmeng.opensource.bukkit.gui.slot;

import me.huanmeng.opensource.bukkit.gui.AbstractGui;
import org.checkerframework.checker.nullness.qual.NonNull;
import org.jetbrains.annotations.NotNull;

import java.util.Arrays;

/**
* 2024/12/28<br>
* Bukkit-Gui-pom<br>
*
* @author huanmeng_qwq
*/
public class PlayerSlots implements Slots {
@NonNull
private final Slots slots;

public PlayerSlots(@NotNull Slots slots) {
this.slots = slots;
}

@Override
public @NotNull <G extends AbstractGui<@NonNull G>> @NonNull Slot[] slots(@NonNull G gui) {
return Arrays.stream(slots.slots(gui)).map(Slot::toPlayerSlot).toArray(PlayerSlot[]::new);
}

@Override
public PlayerSlots toPlayerSlots() {
return this;
}

public Slots getSlots() {
return slots;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,22 @@ static Slot forward(int i, Slot forwardSlot) {
}

@Nullable
default ItemStack getShowingItem(@NonNull AbstractGui gui, @NonNull Player player) {
default ItemStack getShowingItem(@NonNull AbstractGui<?> gui, @NonNull Player player) {
GuiButton button = gui.getButton(getIndex());
if (button == null) return null;
return button.getButton().getShowItem(player);
}

/**
* 玩家背包槽位
*
* @param index 背包槽位
*/
static PlayerSlot playerSlot(int index) {
return new PlayerSlot(of(index));
}

default PlayerSlot toPlayerSlot() {
return new PlayerSlot(this);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -148,4 +148,8 @@ static ExcludeSlots excludeRange(int min, int max) {
static Slots full() {
return FULL;
}

default PlayerSlots toPlayerSlots(){
return new PlayerSlots(this);
}
}

0 comments on commit e5329c5

Please sign in to comment.