mirror of
https://github.com/BentoBoxWorld/BentoBox.git
synced 2024-11-23 19:25:12 +01:00
Enables blueprint bundle slot positioning in GUI
https://github.com/BentoBoxWorld/BentoBox/issues/708
This commit is contained in:
parent
5c8d88868a
commit
40f0591f7a
@ -8,6 +8,11 @@ import world.bentobox.bentobox.api.panels.PanelItem;
|
||||
import world.bentobox.bentobox.api.panels.PanelListener;
|
||||
import world.bentobox.bentobox.api.user.User;
|
||||
|
||||
/**
|
||||
* Builds panels
|
||||
* @author tastybento
|
||||
*
|
||||
*/
|
||||
public class PanelBuilder {
|
||||
private String name;
|
||||
private TreeMap<Integer, PanelItem> items = new TreeMap<>();
|
||||
@ -79,11 +84,29 @@ public class PanelBuilder {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the next free slot number after the largest slot
|
||||
* Get the next free slot number after the largest slot. If larger than the size of the panel, the first free spot available
|
||||
* is used.
|
||||
* @return next slot number, or -1 in case none has been found.
|
||||
*/
|
||||
public int nextSlot() {
|
||||
return items.isEmpty() ? 0 : items.lastKey() + 1;
|
||||
int slot = items.isEmpty() ? 0 : items.lastKey() + 1;
|
||||
if (slot >= size) {
|
||||
return getFirstAvailableSlot();
|
||||
}
|
||||
return slot;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the first available slot
|
||||
* @return slot or -1 if panel is full
|
||||
*/
|
||||
public int getFirstAvailableSlot() {
|
||||
for (int i = 0; i < size; i++) {
|
||||
if (!slotOccupied(i)) {
|
||||
return i;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,16 +1,18 @@
|
||||
package world.bentobox.bentobox.blueprints.dataobjects;
|
||||
|
||||
import com.google.gson.annotations.Expose;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import world.bentobox.bentobox.blueprints.Blueprint;
|
||||
import world.bentobox.bentobox.database.objects.DataObject;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
|
||||
import com.google.gson.annotations.Expose;
|
||||
|
||||
import world.bentobox.bentobox.blueprints.Blueprint;
|
||||
import world.bentobox.bentobox.database.objects.DataObject;
|
||||
|
||||
/**
|
||||
* Represents a bundle of three {@link Blueprint}s.
|
||||
* This is what the player will choose when creating his island.
|
||||
@ -52,6 +54,15 @@ public class BlueprintBundle implements DataObject {
|
||||
*/
|
||||
@Expose
|
||||
private Map<World.Environment, String> blueprints = new EnumMap<>(World.Environment.class);
|
||||
|
||||
/**
|
||||
* Preferred slot in GUI.
|
||||
*/
|
||||
@Expose
|
||||
private int slot = 0;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @return the uniqueId
|
||||
*/
|
||||
@ -164,5 +175,17 @@ public class BlueprintBundle implements DataObject {
|
||||
public void setRequirePermission(boolean requirePermission) {
|
||||
this.requirePermission = requirePermission;
|
||||
}
|
||||
/**
|
||||
* @return the slot
|
||||
*/
|
||||
public int getSlot() {
|
||||
return slot;
|
||||
}
|
||||
/**
|
||||
* @param slot the slot to set
|
||||
*/
|
||||
public void setSlot(int slot) {
|
||||
this.slot = slot;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -2,6 +2,7 @@ package world.bentobox.bentobox.panels;
|
||||
|
||||
import java.util.AbstractMap;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -47,6 +48,7 @@ public class BlueprintManagementPanel {
|
||||
private final Map<World.Environment, Blueprint> ENV_TO_BP;
|
||||
private static final int MAX_WORLD_SLOT = 9;
|
||||
private static final int MIN_WORLD_SLOT = 0;
|
||||
public static final int MAX_BP_SLOT = 35;
|
||||
private Entry<Integer, Blueprint> selected;
|
||||
private Map<Integer, Blueprint> blueprints = new HashMap<>();
|
||||
private final User user;
|
||||
@ -80,23 +82,43 @@ public class BlueprintManagementPanel {
|
||||
// Create the panel
|
||||
PanelBuilder pb = new PanelBuilder().name(t("title")).user(user).size(45);
|
||||
// Get the bundles
|
||||
Comparator<BlueprintBundle> sortByDisplayName = (p, o) -> p.getDisplayName().compareToIgnoreCase(o.getDisplayName());
|
||||
plugin.getBlueprintsManager().getBlueprintBundles(addon).values().stream().limit(36)
|
||||
.forEach(bb -> pb.item(new PanelItemBuilder()
|
||||
.name(bb.getDisplayName())
|
||||
.description(t("edit"),
|
||||
!bb.getUniqueId().equals(BlueprintsManager.DEFAULT_BUNDLE_NAME) ? t("rename") : "")
|
||||
.icon(bb.getIcon())
|
||||
.clickHandler((panel, u, clickType, slot) -> {
|
||||
u.closeInventory();
|
||||
if (clickType.equals(ClickType.RIGHT) && !bb.getUniqueId().equals(BlueprintsManager.DEFAULT_BUNDLE_NAME)) {
|
||||
// Rename
|
||||
askForName(u.getPlayer(), addon, bb);
|
||||
} else {
|
||||
openBB(bb);
|
||||
}
|
||||
return true;
|
||||
})
|
||||
.build()));
|
||||
.sorted(sortByDisplayName)
|
||||
.forEach(bb -> {
|
||||
// Make item
|
||||
PanelItem item = new PanelItemBuilder()
|
||||
.name(bb.getDisplayName())
|
||||
.description(t("edit"),
|
||||
!bb.getUniqueId().equals(BlueprintsManager.DEFAULT_BUNDLE_NAME) ? t("rename") : "")
|
||||
.icon(bb.getIcon())
|
||||
.clickHandler((panel, u, clickType, slot) -> {
|
||||
|
||||
u.closeInventory();
|
||||
if (clickType.equals(ClickType.RIGHT) && !bb.getUniqueId().equals(BlueprintsManager.DEFAULT_BUNDLE_NAME)) {
|
||||
// Rename
|
||||
askForName(u.getPlayer(), addon, bb);
|
||||
} else {
|
||||
openBB(bb);
|
||||
}
|
||||
return true;
|
||||
})
|
||||
.build();
|
||||
// Determine slot
|
||||
if (bb.getSlot() < 0 || bb.getSlot() > MAX_BP_SLOT) {
|
||||
bb.setSlot(0);
|
||||
}
|
||||
if (pb.slotOccupied(bb.getSlot())) {
|
||||
int slot = pb.getFirstAvailableSlot();
|
||||
if (slot == -1) {
|
||||
// TODO add paging
|
||||
plugin.logError("Too many blueprint bundles to show!");
|
||||
}
|
||||
pb.item(slot, item);
|
||||
} else {
|
||||
pb.item(bb.getSlot(), item);
|
||||
}
|
||||
});
|
||||
|
||||
// Panel has New Blueprint Bundle button - clicking in creates a new bundle
|
||||
pb.item(36, getNewBundle(user, addon));
|
||||
@ -134,8 +156,10 @@ public class BlueprintManagementPanel {
|
||||
// Toggle permission - default is always allowed
|
||||
pb.item(39, getPermissionIcon(addon, bb));
|
||||
}
|
||||
// Preferred slot
|
||||
pb.item(40, getSlotIcon(addon, bb));
|
||||
// Panel has a Back icon.
|
||||
pb.item(44, new PanelItemBuilder().icon(Material.ARROW).name(t("back")).clickHandler((panel, u, clickType, slot) -> {
|
||||
pb.item(44, new PanelItemBuilder().icon(Material.OAK_DOOR).name(t("back")).clickHandler((panel, u, clickType, slot) -> {
|
||||
openPanel();
|
||||
return true;
|
||||
}).build());
|
||||
@ -144,6 +168,39 @@ public class BlueprintManagementPanel {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the preferred slot icon
|
||||
* @param addon - addon
|
||||
* @param bb - blueprint bundle
|
||||
* @return slot panel item
|
||||
*/
|
||||
private PanelItem getSlotIcon(GameModeAddon addon, BlueprintBundle bb) {
|
||||
return new PanelItemBuilder()
|
||||
.name(t("slot", TextVariables.NUMBER, String.valueOf(bb.getSlot())))
|
||||
.description(t("slot-instructions"))
|
||||
.icon(Material.IRON_TRAPDOOR)
|
||||
.clickHandler((panel, u, clickType, slot) -> {
|
||||
// Increment or decrement slot
|
||||
if (clickType.isLeftClick()) {
|
||||
bb.setSlot(bb.getSlot() + 1);
|
||||
if (bb.getSlot() > MAX_BP_SLOT) {
|
||||
bb.setSlot(0);
|
||||
}
|
||||
} else if (clickType.isRightClick()) {
|
||||
bb.setSlot(bb.getSlot() - 1);
|
||||
if (bb.getSlot() < 0) {
|
||||
bb.setSlot(MAX_BP_SLOT);
|
||||
}
|
||||
}
|
||||
u.getPlayer().playSound(u.getLocation(), Sound.UI_BUTTON_CLICK, 1F, 1F);
|
||||
// Save
|
||||
plugin.getBlueprintsManager().saveBlueprintBundle(addon, bb);
|
||||
panel.getInventory().setItem(40, getSlotIcon(addon, bb).getItem());
|
||||
return true;
|
||||
})
|
||||
.build();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the panel item for Blueprint Bundle
|
||||
* @param bb - blueprint bundle
|
||||
|
@ -1,13 +1,16 @@
|
||||
package world.bentobox.bentobox.panels;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.eclipse.jdt.annotation.NonNull;
|
||||
|
||||
import world.bentobox.bentobox.BentoBox;
|
||||
import world.bentobox.bentobox.api.addons.GameModeAddon;
|
||||
import world.bentobox.bentobox.api.commands.CompositeCommand;
|
||||
import world.bentobox.bentobox.api.panels.PanelItem;
|
||||
import world.bentobox.bentobox.api.panels.builders.PanelBuilder;
|
||||
import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder;
|
||||
import world.bentobox.bentobox.api.user.User;
|
||||
@ -34,7 +37,9 @@ public class IslandCreationPanel {
|
||||
// Create the panel
|
||||
PanelBuilder pb = new PanelBuilder().name(user.getTranslation("commands.island.create.pick")).user(user);
|
||||
// Get the bundles
|
||||
Collection<BlueprintBundle> bbs = plugin.getBlueprintsManager().getBlueprintBundles((@NonNull GameModeAddon) command.getAddon()).values();
|
||||
Comparator<BlueprintBundle> sortByDisplayName = (p, o) -> p.getDisplayName().compareToIgnoreCase(o.getDisplayName());
|
||||
List<BlueprintBundle> bbs = plugin.getBlueprintsManager().getBlueprintBundles((@NonNull GameModeAddon) command.getAddon()).values()
|
||||
.stream().sorted(sortByDisplayName).collect(Collectors.toList());
|
||||
// Loop through them and create items in the panel
|
||||
for (BlueprintBundle bb : bbs) {
|
||||
String perm = command.getPermissionPrefix() + "island.create." + bb.getUniqueId();
|
||||
@ -42,12 +47,26 @@ public class IslandCreationPanel {
|
||||
|| !bb.isRequirePermission()
|
||||
|| user.hasPermission(perm)) {
|
||||
// Add an item
|
||||
pb.item(new PanelItemBuilder().name(bb.getDisplayName()).description(bb.getDescription())
|
||||
PanelItem item = new PanelItemBuilder().name(bb.getDisplayName()).description(bb.getDescription())
|
||||
.icon(bb.getIcon()).clickHandler((panel, user1, clickType, slot1) -> {
|
||||
user1.closeInventory();
|
||||
command.execute(user1, label, Collections.singletonList(bb.getUniqueId()));
|
||||
return true;
|
||||
}).build());
|
||||
}).build();
|
||||
// Determine slot
|
||||
if (bb.getSlot() < 0 || bb.getSlot() > BlueprintManagementPanel.MAX_BP_SLOT) {
|
||||
bb.setSlot(0);
|
||||
}
|
||||
if (pb.slotOccupied(bb.getSlot())) {
|
||||
int slot = pb.getFirstAvailableSlot();
|
||||
if (slot == -1) {
|
||||
// TODO add paging
|
||||
plugin.logError("Too many blueprint bundles to show!");
|
||||
}
|
||||
pb.item(slot, item);
|
||||
} else {
|
||||
pb.item(bb.getSlot(), item);
|
||||
}
|
||||
}
|
||||
}
|
||||
pb.build();
|
||||
|
@ -272,6 +272,10 @@ commands:
|
||||
default-color: ""
|
||||
success: "Success!"
|
||||
cancelling: "Cancelling"
|
||||
slot: "&fPreferred Slot [number]"
|
||||
slot-instructions: |
|
||||
&aLeft click to increment
|
||||
&aRight click to decrement
|
||||
resetflags:
|
||||
description: "Reset all islands to default flag settings in config.yml"
|
||||
world:
|
||||
|
Loading…
Reference in New Issue
Block a user