Skip to content

Commit

Permalink
Add support for saved items.
Browse files Browse the repository at this point in the history
Introduces the concept of a _saved item_; an in-game item that has been
captured in a YAML file via Bukkit's item serialization mechanism. These
items can be referenced in the config-file in all places that any other
normal item can be used, assuming the ThingManager is in charge of the
parsing. This should help bridge the gap between class chests and the
config-file by allowing any Bukkit serializable item stack to be stored
and referenced as if MobArena's item syntax directly supported it.

Three new setup commands are introduced to help manage the items, such
that they can be created, deleted, and loaded (for "editing" purposes).
The commands are somewhat rough around the edges and may need a little
bit of polish going forward.

Together with the new inventory referencing Things, this functionality
should help provide most of the flexibility people have been missing
from the item syntax for about a decade... Hell, it's about time.

Closes #212
  • Loading branch information
garbagemule committed Nov 4, 2023
1 parent bdffc3a commit 219b2e1
Show file tree
Hide file tree
Showing 9 changed files with 425 additions and 0 deletions.
17 changes: 17 additions & 0 deletions src/main/java/com/garbagemule/MobArena/MobArena.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import com.garbagemule.MobArena.formula.FormulaManager;
import com.garbagemule.MobArena.framework.Arena;
import com.garbagemule.MobArena.framework.ArenaMaster;
import com.garbagemule.MobArena.items.SavedItemsManager;
import com.garbagemule.MobArena.listeners.MAGlobalListener;
import com.garbagemule.MobArena.metrics.ArenaCountChart;
import com.garbagemule.MobArena.metrics.ClassChestsChart;
Expand Down Expand Up @@ -67,6 +68,8 @@ public class MobArena extends JavaPlugin
private FormulaManager formman;
private FormulaMacros macros;

private SavedItemsManager itemman;

private SignListeners signListeners;

@Override
Expand Down Expand Up @@ -106,6 +109,7 @@ private void setup() {
try {
createDataFolder();
setupFormulaMacros();
setupSavedItemsManager();
setupArenaMaster();
setupCommandHandler();

Expand Down Expand Up @@ -134,6 +138,10 @@ private void setupFormulaMacros() {
macros = FormulaMacros.create(this);
}

private void setupSavedItemsManager() {
itemman = new SavedItemsManager(this);
}

private void setupArenaMaster() {
arenaMaster = new ArenaMasterImpl(this);
}
Expand Down Expand Up @@ -190,6 +198,7 @@ public void reload() {
reloadConfig();
reloadGlobalMessenger();
reloadFormulaMacros();
reloadSavedItemsManager();
reloadArenaMaster();
reloadAnnouncementsFile();
reloadSigns();
Expand Down Expand Up @@ -226,6 +235,10 @@ private void reloadFormulaMacros() {
}
}

private void reloadSavedItemsManager() {
itemman.reload();
}

private void reloadArenaMaster() {
arenaMaster.getArenas().forEach(Arena::forceEnd);
arenaMaster.initialize();
Expand Down Expand Up @@ -317,4 +330,8 @@ public FormulaManager getFormulaManager() {
public FormulaMacros getFormulaMacros() {
return macros;
}

public SavedItemsManager getSavedItemsManager() {
return itemman;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,15 @@
import com.garbagemule.MobArena.commands.setup.CheckDataCommand;
import com.garbagemule.MobArena.commands.setup.CheckSpawnsCommand;
import com.garbagemule.MobArena.commands.setup.ClassChestCommand;
import com.garbagemule.MobArena.commands.setup.DeleteItemCommand;
import com.garbagemule.MobArena.commands.setup.EditArenaCommand;
import com.garbagemule.MobArena.commands.setup.ListClassesCommand;
import com.garbagemule.MobArena.commands.setup.LoadItemCommand;
import com.garbagemule.MobArena.commands.setup.RemoveArenaCommand;
import com.garbagemule.MobArena.commands.setup.RemoveContainerCommand;
import com.garbagemule.MobArena.commands.setup.RemoveLeaderboardCommand;
import com.garbagemule.MobArena.commands.setup.RemoveSpawnpointCommand;
import com.garbagemule.MobArena.commands.setup.SaveItemCommand;
import com.garbagemule.MobArena.commands.setup.SettingCommand;
import com.garbagemule.MobArena.commands.setup.SetupCommand;
import com.garbagemule.MobArena.commands.user.ArenaListCommand;
Expand Down Expand Up @@ -340,6 +343,10 @@ private void registerCommands() {

register(RemoveLeaderboardCommand.class);
register(AutoGenerateCommand.class);

register(SaveItemCommand.class);
register(DeleteItemCommand.class);
register(LoadItemCommand.class);
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package com.garbagemule.MobArena.commands.setup;

import com.garbagemule.MobArena.commands.Command;
import com.garbagemule.MobArena.commands.CommandInfo;
import com.garbagemule.MobArena.framework.ArenaMaster;
import com.garbagemule.MobArena.items.SavedItemsManager;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

@CommandInfo(
name = "deleteitem",
pattern = "deleteitem",
usage = "/ma deleteitem <identifier>",
desc = "delete the item with the given identifier",
permission = "mobarena.setup.deleteitem"
)
public class DeleteItemCommand implements Command {

@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (args.length != 1) {
return false;
}

String key = args[0];

SavedItemsManager items = am.getPlugin().getSavedItemsManager();
try {
items.deleteItem(key);
} catch (Exception e) {
am.getGlobalMessenger().tell(sender, "Couldn't delete " + ChatColor.YELLOW + key + ChatColor.RESET + ", because: " + ChatColor.RED + e.getMessage());
return true;
}

am.getGlobalMessenger().tell(sender, "Saved item " + ChatColor.YELLOW + key + ChatColor.RESET + " deleted.");
return true;
}

@Override
public List<String> tab(ArenaMaster am, Player player, String... args) {
if (args.length > 1) {
return Collections.emptyList();
}

String prefix = args[0].toLowerCase();

SavedItemsManager items = am.getPlugin().getSavedItemsManager();
List<String> keys = items.getKeys();

return keys.stream()
.filter(key -> key.startsWith(prefix))
.collect(Collectors.toList());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package com.garbagemule.MobArena.commands.setup;

import com.garbagemule.MobArena.Msg;
import com.garbagemule.MobArena.commands.Command;
import com.garbagemule.MobArena.commands.CommandInfo;
import com.garbagemule.MobArena.commands.Commands;
import com.garbagemule.MobArena.framework.ArenaMaster;
import com.garbagemule.MobArena.items.SavedItemsManager;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

@CommandInfo(
name = "loaditem",
pattern = "loaditem",
usage = "/ma loaditem <identifier>",
desc = "load the item saved by the given identifier into your hand",
permission = "mobarena.setup.loaditem"
)
public class LoadItemCommand implements Command {

@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (!Commands.isPlayer(sender)) {
am.getGlobalMessenger().tell(sender, Msg.MISC_NOT_FROM_CONSOLE);
return true;
}

if (args.length != 1) {
return false;
}

String key = args[0];

SavedItemsManager items = am.getPlugin().getSavedItemsManager();
ItemStack stack = items.getItem(key);
if (stack == null) {
am.getGlobalMessenger().tell(sender, "No saved item with identifier " + ChatColor.YELLOW + key + ChatColor.RESET + " found.");
return true;
}

Player player = Commands.unwrap(sender);
player.getInventory().setItemInMainHand(stack);

am.getGlobalMessenger().tell(sender, "Saved item " + ChatColor.YELLOW + key + ChatColor.RESET + " loaded.");
return true;
}

@Override
public List<String> tab(ArenaMaster am, Player player, String... args) {
if (args.length > 1) {
return Collections.emptyList();
}

String prefix = args[0].toLowerCase();

SavedItemsManager items = am.getPlugin().getSavedItemsManager();
List<String> keys = items.getKeys();

return keys.stream()
.filter(key -> key.startsWith(prefix))
.collect(Collectors.toList());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package com.garbagemule.MobArena.commands.setup;

import com.garbagemule.MobArena.Msg;
import com.garbagemule.MobArena.commands.Command;
import com.garbagemule.MobArena.commands.CommandInfo;
import com.garbagemule.MobArena.commands.Commands;
import com.garbagemule.MobArena.framework.ArenaMaster;
import com.garbagemule.MobArena.items.SavedItemsManager;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

@CommandInfo(
name = "saveitem",
pattern = "saveitem",
usage = "/ma saveitem <identifier>",
desc = "save the currently held item for use in the config-file",
permission = "mobarena.setup.saveitem"
)
public class SaveItemCommand implements Command {

@Override
public boolean execute(ArenaMaster am, CommandSender sender, String... args) {
if (!Commands.isPlayer(sender)) {
am.getGlobalMessenger().tell(sender, Msg.MISC_NOT_FROM_CONSOLE);
return true;
}

if (args.length != 1) {
return false;
}

String key = args[0];
if (key.contains(":")) {
am.getGlobalMessenger().tell(sender, "The identifier cannot contain a colon (:).");
return true;
}
if (key.contains("/")) {
am.getGlobalMessenger().tell(sender, "The identifier cannot contain a slash (/).");
return true;
}
if (key.contains("\\")) {
am.getGlobalMessenger().tell(sender, "The identifier cannot contain a backslash (\\).");
return true;
}

Player player = Commands.unwrap(sender);
ItemStack stack = player.getInventory().getItemInMainHand();
if (stack.getType() == Material.AIR) {
am.getGlobalMessenger().tell(sender, "You must be holding an item.");
return true;
}

SavedItemsManager items = am.getPlugin().getSavedItemsManager();
try {
items.saveItem(key, stack);
} catch (Exception e) {
am.getGlobalMessenger().tell(sender, "Couldn't save " + ChatColor.YELLOW + key + ChatColor.RESET + ", because: " + ChatColor.RED + e.getMessage());
return true;
}

am.getGlobalMessenger().tell(sender, "Item saved as " + ChatColor.YELLOW + key + ChatColor.RESET + ".");
return true;
}

@Override
public List<String> tab(ArenaMaster am, Player player, String... args) {
if (args.length > 1) {
return Collections.emptyList();
}

String prefix = args[0].toLowerCase();

SavedItemsManager items = am.getPlugin().getSavedItemsManager();
List<String> keys = items.getKeys();

return keys.stream()
.filter(key -> key.startsWith(prefix))
.collect(Collectors.toList());
}

}
Loading

0 comments on commit 219b2e1

Please sign in to comment.