Extracts some functions for finding and replacing books to InventoryHelper

This commit is contained in:
Kristian Knarvik 2021-08-29 23:40:16 +02:00
parent d50af8a12b
commit 57cc06bdb8
2 changed files with 179 additions and 123 deletions

View File

@ -16,6 +16,7 @@ import java.util.Objects;
import net.knarcraft.bookswithoutborders.utility.BookFormatter;
import net.knarcraft.bookswithoutborders.utility.EncryptionHelper;
import net.knarcraft.bookswithoutborders.utility.FileHelper;
import net.knarcraft.bookswithoutborders.utility.InventoryHelper;
import net.milkbowl.vault.economy.Economy;
import org.bukkit.ChatColor;
import org.bukkit.Material;
@ -558,46 +559,8 @@ public class BooksWithoutBorders extends JavaPlugin {
return commandUnSign(player);
case "copy":
return commandCopy(player, args);
}
if (args[0].equalsIgnoreCase("encrypt")) {
if (!sender.hasPermission("bookswithoutborders.encrypt")) {
sendErrorMessage(sender, " You don't have permission to use this command!");
return false;
}
if (!(((Player) sender).getItemInHand().getType() == Material.WRITTEN_BOOK)) {
sendErrorMessage(sender, "You must be holding a written book to encrypt it!");
return false;
}
if (args.length < 2) {
sendErrorMessage(sender, "You must specify a key to encrypt a book!");
return false;
}
if (args.length > 3) {
sendErrorMessage(sender, "Too many command options specified!");
return false;
}
if (!((BookMeta) ((Player) sender).getItemInHand().getItemMeta()).hasPages()) {
sendErrorMessage(sender, "Book must have contents to encrypt!");
return false;
}
ItemStack eBook;
if (args.length == 3) {
eBook = encryptBook((Player) sender, true, args[1], EncryptionStyle.getFromString(args[2]), "");
} else {
eBook = encryptBook((Player) sender, true, args[1], EncryptionStyle.SUBSTITUTION, "");
}
if (eBook != null) {
((Player) sender).setItemInHand(eBook);
return true;
} else
return false;
case "encrypt":
return commandEncrypt(player, args);
}
if (args[0].equalsIgnoreCase("groupEncrypt")) {
@ -973,6 +936,48 @@ public class BooksWithoutBorders extends JavaPlugin {
return false;
}
protected boolean commandEncrypt(Player player, String[] args) {
if (!player.hasPermission("bookswithoutborders.encrypt")) {
sendErrorMessage(player, " You don't have permission to use this command!");
return false;
}
if (InventoryHelper.notHoldingOneBookCheck(player, "You must be holding a written book to encrypt it!",
"You cannot encrypt two books at once!")) {
return false;
}
if (args.length < 2) {
sendErrorMessage(player, "You must specify a key to encrypt a book!");
return false;
}
if (args.length > 3) {
sendErrorMessage(player, "Too many command options specified!");
return false;
}
ItemStack heldBook = InventoryHelper.getHeldBook(player);
if (!((BookMeta) Objects.requireNonNull(heldBook.getItemMeta())).hasPages()) {
sendErrorMessage(player, "Book must have contents to encrypt!");
return false;
}
ItemStack encryptedBook;
if (args.length == 3) {
encryptedBook = encryptBook(player, true, args[1], EncryptionStyle.getFromString(args[2]), "");
} else {
encryptedBook = encryptBook(player, true, args[1], EncryptionStyle.SUBSTITUTION, "");
}
if (encryptedBook != null) {
InventoryHelper.setHeldBook(player, encryptedBook);
return true;
} else
return false;
}
/**
* Executes the copy command
* @param player <p>The player which sent the command</p>
@ -985,15 +990,8 @@ public class BooksWithoutBorders extends JavaPlugin {
return false;
}
BookHoldingState holdingState = holdingBook(player);
if (holdingState == BookHoldingState.NONE) {
sendErrorMessage(player, "You must be holding a written book to copy it!");
return false;
}
if (holdingState == BookHoldingState.BOTH_HANDS) {
sendErrorMessage(player, "You cannot copy two books at once!");
if (InventoryHelper.notHoldingOneBookCheck(player, "You must be holding a written book to copy it!",
"You cannot copy two books at once!")) {
return false;
}
@ -1002,12 +1000,7 @@ public class BooksWithoutBorders extends JavaPlugin {
return false;
}
ItemStack heldBook;
if (holdingState == BookHoldingState.MAIN_HAND) {
heldBook = player.getInventory().getItemInMainHand();
} else {
heldBook = player.getInventory().getItemInOffHand();
}
ItemStack heldBook = InventoryHelper.getHeldBook(player);
try {
if (Integer.parseInt(args[1]) > 0) {
@ -1048,43 +1041,17 @@ public class BooksWithoutBorders extends JavaPlugin {
return false;
}
BookHoldingState holdingState = holdingBook(player);
if (holdingState == BookHoldingState.NONE) {
sendErrorMessage(player, "You must be holding a written book to un-sign it!");
if (InventoryHelper.notHoldingOneBookCheck(player, "You must be holding a written book to un-sign it!",
"You cannot un-sign two books at once. Please un-equip one of the books you're holding!")) {
return false;
}
//Find which hand the player is using to hold the book. If holding one in each, throw an error
if (holdingState == BookHoldingState.BOTH_HANDS) {
sendErrorMessage(player, "You cannot un-sign two books at once. Please un-equip one " +
"of the books you're holding!");
} else {
BookHoldingState holdingState = InventoryHelper.getHoldingBookState(player);
unSignHeldBook(player, holdingState == BookHoldingState.MAIN_HAND);
}
return true;
}
/**
* Gets the state of which hands of the player contains a book
* @param player <p>The player possibly holding a book</p>
* @return <p>The state of the player's book holding</p>
*/
protected BookHoldingState holdingBook(Player player) {
boolean hasBookInMainHand = player.getInventory().getItemInMainHand().getType() == Material.WRITTEN_BOOK;
boolean hasBookInOffHand = player.getInventory().getItemInOffHand().getType() == Material.WRITTEN_BOOK;
if (hasBookInMainHand && hasBookInOffHand) {
return BookHoldingState.BOTH_HANDS;
} else if (hasBookInMainHand) {
return BookHoldingState.MAIN_HAND;
} else if (hasBookInOffHand) {
return BookHoldingState.OFF_HAND;
} else {
return BookHoldingState.NONE;
}
}
/**
* Executes the delete command
* @param player <p>The player which sent the command</p>
@ -1695,7 +1662,7 @@ public class BooksWithoutBorders extends JavaPlugin {
//converts user supplied key into integer form
String integerKey = EncryptionHelper.getNumberKeyFromStringKey(key);
BookMeta book = getHeldBookMetadata(player, mainHand);
BookMeta book = InventoryHelper.getHeldBookMetadata(player, mainHand);
if (!book.hasPages()) {
sendErrorMessage(player, "Book is empty!");
@ -1741,11 +1708,7 @@ public class BooksWithoutBorders extends JavaPlugin {
encryptedBook.setItemMeta(book);
//Update item amount
if (mainHand) {
encryptedBook.setAmount(player.getInventory().getItemInMainHand().getAmount());
} else {
encryptedBook.setAmount(player.getInventory().getItemInOffHand().getAmount());
}
encryptedBook.setAmount(InventoryHelper.getHeldBook(player).getAmount());
//Set new item metadata
encryptedBook.setItemMeta(newMetadata);
@ -1847,43 +1810,13 @@ public class BooksWithoutBorders extends JavaPlugin {
*/
protected void unSignHeldBook(Player player, boolean mainHand) {
//Get the old book
BookMeta oldBook = getHeldBookMetadata(player, mainHand);
BookMeta oldBook = InventoryHelper.getHeldBookMetadata(player, mainHand);
//UnSign the book
ItemStack newBook = new ItemStack(Material.WRITABLE_BOOK);
newBook.setItemMeta(oldBook);
replaceHeldBook(player, newBook, mainHand);
}
/**
* Gets metadata about the player's held book
*
* @param player <p>The player holding the book</p>
* @param mainHand <p>Whether to get information about a book in the player's main hand or off hand</p>
* @return <p>Information about the held book</p>
*/
private BookMeta getHeldBookMetadata(Player player, boolean mainHand) {
if (mainHand) {
return (BookMeta) player.getInventory().getItemInMainHand().getItemMeta();
} else {
return (BookMeta) player.getInventory().getItemInOffHand().getItemMeta();
}
}
/**
* Replaces the player's held item
*
* @param player <p>The player to replace the item for</p>
* @param newBook <p>The new book the player should hold</p>
* @param mainHand <p>Whether to replace the item in the player's main hand or off hand</p>
*/
private void replaceHeldBook(Player player, ItemStack newBook, boolean mainHand) {
if (mainHand) {
player.getInventory().setItemInMainHand(newBook);
} else {
player.getInventory().setItemInOffHand(newBook);
}
InventoryHelper.replaceHeldBook(player, newBook, mainHand);
}
/**

View File

@ -0,0 +1,123 @@
package net.knarcraft.bookswithoutborders.utility;
import net.knarcraft.bookswithoutborders.BookHoldingState;
import net.knarcraft.bookswithoutborders.BooksWithoutBorders;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BookMeta;
public class InventoryHelper {
/**
* Gets the book the holder is playing
* @param player <p>The player holding the book</p>
* @return <p>The book the player is holding</p>
*/
public static ItemStack getHeldBook(Player player) {
BookHoldingState holdingState = getHoldingBookState(player);
ItemStack heldBook;
if (holdingState == BookHoldingState.MAIN_HAND) {
heldBook = getHeldBook(player, true);
} else if (holdingState == BookHoldingState.OFF_HAND) {
heldBook = getHeldBook(player, false);
} else {
throw new IllegalArgumentException("The player is not holding exactly one book.");
}
return heldBook;
}
/**
* Replaces the book the player is holding
* @param player <p>The player holding the book</p>
* @param newBook <p>The new book the player should hold</p>
*/
public static void setHeldBook(Player player, ItemStack newBook) {
BookHoldingState holdingState = getHoldingBookState(player);
replaceHeldBook(player, newBook, holdingState == BookHoldingState.MAIN_HAND);
}
/**
* Performs checks to validate that a player contains exactly one book
* @param player <p>The player to validate</p>
* @param noBookMessage <p>The message to display if the player is not holding a book</p>
* @param twoBooksMessage <p>The message to display if the player is holding one book in each hand</p>
* @return <p>False if the player is holding exactly one book</p>
*/
public static boolean notHoldingOneBookCheck(Player player, String noBookMessage, String twoBooksMessage) {
BookHoldingState holdingState = getHoldingBookState(player);
if (holdingState == BookHoldingState.NONE) {
BooksWithoutBorders.sendErrorMessage(player, noBookMessage);
return true;
}
if (holdingState == BookHoldingState.BOTH_HANDS) {
BooksWithoutBorders.sendErrorMessage(player, twoBooksMessage);
return true;
}
return false;
}
/**
* Gets the state of which hands of the player contains a book
* @param player <p>The player possibly holding a book</p>
* @return <p>The state of the player's book holding</p>
*/
public static BookHoldingState getHoldingBookState(Player player) {
boolean hasBookInMainHand = player.getInventory().getItemInMainHand().getType() == Material.WRITTEN_BOOK;
boolean hasBookInOffHand = player.getInventory().getItemInOffHand().getType() == Material.WRITTEN_BOOK;
if (hasBookInMainHand && hasBookInOffHand) {
return BookHoldingState.BOTH_HANDS;
} else if (hasBookInMainHand) {
return BookHoldingState.MAIN_HAND;
} else if (hasBookInOffHand) {
return BookHoldingState.OFF_HAND;
} else {
return BookHoldingState.NONE;
}
}
/**
* Gets metadata about the player's held book
*
* @param player <p>The player holding the book</p>
* @param mainHand <p>Whether to get information about a book in the player's main hand or off hand</p>
* @return <p>Information about the held book</p>
*/
public static BookMeta getHeldBookMetadata(Player player, boolean mainHand) {
return (BookMeta) getHeldBook(player, mainHand).getItemMeta();
}
/**
* Gets the item the player is holding
* @param player <p>The player to get from</p>
* @param mainHand <p>Whether to get the item in the player's main hand or off hand</p>
* @return <p>The item the player is holding in the given hand</p>
*/
public static ItemStack getHeldBook(Player player, boolean mainHand) {
if (mainHand) {
return player.getInventory().getItemInMainHand();
} else {
return player.getInventory().getItemInOffHand();
}
}
/**
* Replaces the player's held item
*
* @param player <p>The player to replace the item for</p>
* @param newBook <p>The new book the player should hold</p>
* @param mainHand <p>Whether to replace the item in the player's main hand or off hand</p>
*/
public static void replaceHeldBook(Player player, ItemStack newBook, boolean mainHand) {
if (mainHand) {
player.getInventory().setItemInMainHand(newBook);
} else {
player.getInventory().setItemInOffHand(newBook);
}
}
}