Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,10 @@
<id>vault-repo</id>
<url>http://nexus.hc.to/content/repositories/pub_releases</url>
</repository>
<repository>
<id>matteodev</id>
<url>https://maven.devs.beer/</url>
</repository>
</repositories>

<!-- Your addon must contain Spigot and BentoBox APIs dependencies. -->
Expand All @@ -147,6 +151,13 @@
<artifactId>annotations</artifactId>
<version>18.0.0</version>
</dependency>

<dependency>
<groupId>dev.lone</groupId>
<artifactId>api-itemsadder</artifactId>
<version>4.0.10</version>
<scope>provided</scope>
</dependency>
</dependencies>

<!-- Build contains information for maven. It allows to create correct
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import world.bentobox.controlpanel.database.objects.ControlPanelObject.ControlPanelButton;
import world.bentobox.controlpanel.panels.GuiUtils;
import world.bentobox.controlpanel.utils.Constants;
import world.bentobox.controlpanel.utils.ItemsAdderParse;
import world.bentobox.controlpanel.utils.Utils;


Expand Down Expand Up @@ -247,7 +248,6 @@ public void importControlPanels(@Nullable User user, @NotNull GameModeAddon addo
* @param user - user
* @param gameModeName - gamemode name where ControlPanels must be imported.
* @param fileName Specifies from which file control panel will be loaded
* @return true if successful
*/
private void importControlPanels(@Nullable User user, String gameModeName, @NotNull String fileName)
{
Expand Down Expand Up @@ -356,48 +356,53 @@ private void readControlPanel(YamlConfiguration config, @Nullable User user, fin
if (buttonListSection != null)
{
buttonListSection.getKeys(false).forEach(slotReference -> {
ControlPanelButton button = new ControlPanelButton();
button.setSlot(Integer.parseInt(slotReference));
for (int slotNum : Utils.readIntArray(List.of(slotReference))) {
ControlPanelButton button = new ControlPanelButton();
button.setSlot(slotNum);

ConfigurationSection buttonSection =
buttonListSection.getConfigurationSection(slotReference);
ConfigurationSection buttonSection =
buttonListSection.getConfigurationSection(slotReference);

if (buttonSection != null)
{
button.setName(buttonSection.getString("name"));
button.setCommand(buttonSection.getString("command", "[user_command]"));

// Create empty list
button.setDescriptionLines(new ArrayList<>());

if (buttonSection.isList("description"))
{
// Read description by each line
buttonSection.getStringList("description").forEach(line ->
button.getDescriptionLines().add(
line.replace("[gamemode]", gameMode.toLowerCase())));
}
else if (buttonSection.isString("description"))
if (buttonSection != null)
{
// Check if description is not defined as simple string
String input = buttonSection.getString("description", "");
button.setName(buttonSection.getString("name"));
button.setCommand(buttonSection.getString("command", "[user_command]"));

if (input != null && !input.isEmpty())
// Create empty list
button.setDescriptionLines(new ArrayList<>());

if (buttonSection.isList("description"))
{
button.getDescriptionLines().add(
input.replace("[gamemode]", gameMode.toLowerCase()));
// Read description by each line
buttonSection.getStringList("description").forEach(line ->
button.getDescriptionLines().add(
line.replace("[gamemode]", gameMode.toLowerCase())));
}
else if (buttonSection.isString("description"))
{
// Check if description is not defined as simple string
String input = buttonSection.getString("description", "");

if (!input.isEmpty())
{
button.getDescriptionLines().add(
input.replace("[gamemode]", gameMode.toLowerCase()));
}
}
else
{
this.addon.logWarning("Description for button "
+ button.getSlot() + " could not be read.");
}
}
else
{
this.addon.logWarning("Description for button " +
+ button.getSlot() + " could not be read.");
}

button.setMaterial(Material.matchMaterial(buttonSection.getString("material", "GRASS")));
button.setIcon(ItemParser.parse("icon", new ItemStack(Material.PAPER)));
button.setMaterial(Material.matchMaterial(buttonSection.getString("material", "GRASS")));
if(buttonSection.getString("icon") != null)
button.setIcon(ItemParser.parse(buttonSection.getString("icon"), new ItemStack(Material.PAPER)));
if(buttonSection.getString("itemsadder") != null)
button.setIcon(ItemsAdderParse.parse(buttonSection.getString("itemsadder")));

buttonList.add(button);
buttonList.add(button);
}
}
});
}
Expand Down Expand Up @@ -501,15 +506,15 @@ public ControlPanelObject getUserControlPanel(User user, World world, String per
/**
* Control Panel Addon instance.
*/
private ControlPanelAddon addon;
private final ControlPanelAddon addon;

/**
* This database allows to access to all stored control panels.
*/
private Database<ControlPanelObject> controlPanelDatabase;
private final Database<ControlPanelObject> controlPanelDatabase;

/**
* This map contains all control panel object linked to their reference game mode.
*/
private Map<String, ControlPanelObject> controlPanelCache;
private final Map<String, ControlPanelObject> controlPanelCache;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package world.bentobox.controlpanel.utils;

import dev.lone.itemsadder.api.CustomStack;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;

public class ItemsAdderParse {
public static ItemStack parse(String string, ItemStack itemStack)
{
if(!Bukkit.getServer().getPluginManager().isPluginEnabled("ItemsAdder")) return itemStack;
CustomStack stack = CustomStack.getInstance(string);
if(stack != null) return stack.getItemStack();
return itemStack;
}
public static ItemStack parse(String string)
{
return parse(string, new ItemStack(Material.PAPER));
}
}
60 changes: 60 additions & 0 deletions src/main/java/world/bentobox/controlpanel/utils/Utils.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@

import org.bukkit.World;
import org.bukkit.permissions.PermissionAttachmentInfo;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.addons.GameModeAddon;
Expand Down Expand Up @@ -143,4 +146,61 @@ public static <T> T getPreviousValue(T[] values, T currentValue)

return currentValue;
}

/**
* Reads a list of objects and converts it into an array of integers.
* <p>
* The method processes each element in the list:
* <ul>
* <li>If the element is an Integer, it adds it directly to the result array.</li>
* <li>If the element is a String in the format "start-end", it adds all integers
* from "start" to "end" (inclusive) to the result array.</li>
* </ul>
*
* <b>Example:</b>
* If the input list is `["1-3", 5, "7-9"]`, the method will return an array
* containing `[1, 2, 3, 5, 7, 8, 9]`.
*
* @param objectList A list of objects, each of which can either be an Integer or a String
* in the format "start-end" (inclusive range).
* @return An array of integers containing all the integers parsed from the input list.
* The integers from ranges are added to the result array in order.
* @throws NumberFormatException If the string representation of a number is not valid.
*/
public static int[] readIntArray(List<?> objectList) {
List<Integer> values = new ArrayList<>();

// Process each item in the objectList
for (Object o : objectList) {
// If the object is an Integer, add it directly to values
if (o instanceof Integer) {
values.add((int) o);
}
// If the object is a String in the form "start-end"
else if (o instanceof String) {
try {
int n = Integer.parseInt((String) o);
values.add(n);
}catch (NumberFormatException ignored) {}
String[] args = ((String) o).split("-");
if (args.length >= 2) {
try {
int n0 = Integer.parseInt(args[0]);
int n1 = Integer.parseInt(args[1]) + 1; // Add 1 to include the upper bound
// Add all integers in the range [n0, n1)
for (int n : IntStream.range(n0, n1).toArray()) {
values.add(n);
}
continue;
} catch (NumberFormatException e) {
// Handle invalid number format if necessary
throw new NumberFormatException("Invalid number format in range string: " + o);
}
}
}
}

// Convert List<Integer> to a primitive int array and return it
return values.stream().mapToInt(Integer::intValue).toArray();
}
}
2 changes: 1 addition & 1 deletion src/main/resources/addon.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ authors:
- BONNe

# Soft dependencies of current addon.
softdepend: AcidIsland, BSkyBlock, CaveBlock, SkyGrid, AOneBlock
softdepend: AcidIsland, BSkyBlock, CaveBlock, SkyGrid, AOneBlock, ItemsAdder

# List of addon permissions
permissions:
Expand Down
Loading