Cleans up the function for paying for book printing
This commit is contained in:
parent
e17347f3ce
commit
9cb7ba4dd8
@ -12,6 +12,7 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.ListIterator;
|
import java.util.ListIterator;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
import net.milkbowl.vault.economy.Economy;
|
import net.milkbowl.vault.economy.Economy;
|
||||||
import org.bukkit.ChatColor;
|
import org.bukkit.ChatColor;
|
||||||
@ -25,6 +26,7 @@ import org.bukkit.configuration.file.YamlConfiguration;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemFactory;
|
import org.bukkit.inventory.ItemFactory;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.bukkit.inventory.PlayerInventory;
|
||||||
import org.bukkit.inventory.meta.BookMeta;
|
import org.bukkit.inventory.meta.BookMeta;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
@ -400,6 +402,7 @@ public class BooksWithoutBorders extends JavaPlugin {
|
|||||||
|
|
||||||
//Player only commands
|
//Player only commands
|
||||||
if (sender instanceof Player) {
|
if (sender instanceof Player) {
|
||||||
|
Player player = (Player) sender;
|
||||||
|
|
||||||
if (args[0].equalsIgnoreCase("savePublic")) {
|
if (args[0].equalsIgnoreCase("savePublic")) {
|
||||||
if (!sender.hasPermission("bookswithoutborders.savepublic")) {
|
if (!sender.hasPermission("bookswithoutborders.savepublic")) {
|
||||||
@ -407,9 +410,9 @@ public class BooksWithoutBorders extends JavaPlugin {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((Player) sender).getItemInHand().getType() == Material.WRITTEN_BOOK || ((Player) sender).getItemInHand().getType() == Material.WRITABLE_BOOK) {
|
if (player.getItemInHand().getType() == Material.WRITTEN_BOOK || player.getItemInHand().getType() == Material.WRITABLE_BOOK) {
|
||||||
if (args.length == 2) {
|
if (args.length == 2) {
|
||||||
saveBook((Player) sender, args[1], true);
|
saveBook(player, args[1], true);
|
||||||
} else {
|
} else {
|
||||||
saveBook((Player) sender, "false", true);
|
saveBook((Player) sender, "false", true);
|
||||||
}
|
}
|
||||||
@ -563,13 +566,13 @@ public class BooksWithoutBorders extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ItemStack newBook;
|
ItemStack newBook;
|
||||||
Player player = this.getServer().getPlayer(args[2]);
|
Player receivingPlayer = this.getServer().getPlayer(args[2]);
|
||||||
if (player == null) {
|
if (receivingPlayer == null) {
|
||||||
sender.sendMessage(ChatColor.RED + "Player not found!");
|
sender.sendMessage(ChatColor.RED + "Player not found!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player.getInventory().firstEmpty() == -1) {
|
if (receivingPlayer.getInventory().firstEmpty() == -1) {
|
||||||
sender.sendMessage(ChatColor.RED + "Receiving player must have space in their inventory to receive books!");
|
sender.sendMessage(ChatColor.RED + "Receiving player must have space in their inventory to receive books!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -588,9 +591,9 @@ public class BooksWithoutBorders extends JavaPlugin {
|
|||||||
newBook = loadBook(sender, cleanString(args[1]), "true", "player");
|
newBook = loadBook(sender, cleanString(args[1]), "true", "player");
|
||||||
|
|
||||||
if (newBook != null) {
|
if (newBook != null) {
|
||||||
player.getInventory().addItem(newBook);
|
receivingPlayer.getInventory().addItem(newBook);
|
||||||
sender.sendMessage(ChatColor.GREEN + "Book sent!");
|
sender.sendMessage(ChatColor.GREEN + "Book sent!");
|
||||||
player.sendMessage(ChatColor.GREEN + "Book received!");
|
receivingPlayer.sendMessage(ChatColor.GREEN + "Book received!");
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
sender.sendMessage(ChatColor.RED + "Book failed to load!");
|
sender.sendMessage(ChatColor.RED + "Book failed to load!");
|
||||||
@ -641,7 +644,18 @@ public class BooksWithoutBorders extends JavaPlugin {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsign((Player) sender);
|
boolean hasBookInMainHand = player.getInventory().getItemInMainHand().getType() == Material.WRITTEN_BOOK;
|
||||||
|
boolean hasBookInOffHand = player.getInventory().getItemInOffHand().getType() == Material.WRITTEN_BOOK;
|
||||||
|
|
||||||
|
//Find which hand the player is using to hold the book. If holding one in each, throw an error
|
||||||
|
if (hasBookInMainHand && hasBookInOffHand) {
|
||||||
|
sender.sendMessage(ChatColor.RED + "You cannot un-sign two books at once. Please un-equip one " +
|
||||||
|
"of the books you're holding!");
|
||||||
|
} else if (hasBookInMainHand) {
|
||||||
|
unSignHeldBook(player, true);
|
||||||
|
} else if (hasBookInOffHand) {
|
||||||
|
unSignHeldBook(player, false);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -668,8 +682,9 @@ public class BooksWithoutBorders extends JavaPlugin {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BooksHavePrice() && !sender.hasPermission("bookswithoutborders.bypassbookprice")) {
|
if (BooksHavePrice() &&
|
||||||
if (!printBook((Player) sender, Integer.parseInt(args[1])))
|
!sender.hasPermission("bookswithoutborders.bypassbookprice") &&
|
||||||
|
cannotPayForBookPrinting((Player) sender, Integer.parseInt(args[1]))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -959,13 +974,13 @@ public class BooksWithoutBorders extends JavaPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
ItemStack newBook;
|
ItemStack newBook;
|
||||||
Player player = this.getServer().getPlayer(args[2]);
|
Player receivingPlayer = this.getServer().getPlayer(args[2]);
|
||||||
if (player == null) {
|
if (receivingPlayer == null) {
|
||||||
sender.sendMessage(ChatColor.RED + "Player not found!");
|
sender.sendMessage(ChatColor.RED + "Player not found!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (player.getInventory().firstEmpty() == -1) {
|
if (receivingPlayer.getInventory().firstEmpty() == -1) {
|
||||||
sender.sendMessage(ChatColor.RED + "Receiving player must have space in their inventory to receive books!");
|
sender.sendMessage(ChatColor.RED + "Receiving player must have space in their inventory to receive books!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -982,9 +997,9 @@ public class BooksWithoutBorders extends JavaPlugin {
|
|||||||
newBook = loadBook(sender, cleanString(args[1]), "true", "public");
|
newBook = loadBook(sender, cleanString(args[1]), "true", "public");
|
||||||
|
|
||||||
if (newBook != null) {
|
if (newBook != null) {
|
||||||
player.getInventory().addItem(newBook);
|
receivingPlayer.getInventory().addItem(newBook);
|
||||||
sender.sendMessage(ChatColor.GREEN + "Book sent!");
|
sender.sendMessage(ChatColor.GREEN + "Book sent!");
|
||||||
player.sendMessage(ChatColor.GREEN + "Book received!");
|
receivingPlayer.sendMessage(ChatColor.GREEN + "Book received!");
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
sender.sendMessage(ChatColor.RED + "Book failed to load!");
|
sender.sendMessage(ChatColor.RED + "Book failed to load!");
|
||||||
@ -1420,8 +1435,9 @@ public class BooksWithoutBorders extends JavaPlugin {
|
|||||||
book.setAmount(numCopies);
|
book.setAmount(numCopies);
|
||||||
|
|
||||||
if (BooksHavePrice() && !sender.hasPermission("bookswithoutborders.bypassbookprice") &&
|
if (BooksHavePrice() && !sender.hasPermission("bookswithoutborders.bypassbookprice") &&
|
||||||
(dir.equalsIgnoreCase("public") || dir.equalsIgnoreCase("player") || dir.equalsIgnoreCase(""))) {
|
(dir.equalsIgnoreCase("public") || dir.equalsIgnoreCase("player") ||
|
||||||
if (!printBook((Player) sender, numCopies))
|
dir.equalsIgnoreCase("")) &&
|
||||||
|
cannotPayForBookPrinting((Player) sender, numCopies)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1743,52 +1759,110 @@ public class BooksWithoutBorders extends JavaPlugin {
|
|||||||
sender.sendMessage(ChatColor.GREEN + "\"" + fname + "\" deleted successfully");
|
sender.sendMessage(ChatColor.GREEN + "\"" + fname + "\" deleted successfully");
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void unsign(Player player) {
|
/**
|
||||||
BookMeta oldbook = (BookMeta) player.getItemInHand().getItemMeta();
|
* Unsigns the player's currently held book
|
||||||
ItemStack newbook = new ItemStack(Material.WRITABLE_BOOK);
|
* @param player <p>The player holding the book</p>
|
||||||
newbook.setItemMeta(oldbook);
|
* @param mainHand <p>Whether the player is holding the book in its main hand or its off hand</p>
|
||||||
|
*/
|
||||||
|
protected void unSignHeldBook(Player player, boolean mainHand) {
|
||||||
|
//Get the old book
|
||||||
|
BookMeta oldBook;
|
||||||
|
if (mainHand) {
|
||||||
|
oldBook = (BookMeta) player.getInventory().getItemInMainHand().getItemMeta();
|
||||||
|
} else {
|
||||||
|
oldBook = (BookMeta) player.getInventory().getItemInOffHand().getItemMeta();
|
||||||
|
}
|
||||||
|
|
||||||
player.setItemInHand(newbook);
|
//UnSign the book
|
||||||
|
ItemStack newBook = new ItemStack(Material.WRITABLE_BOOK);
|
||||||
|
newBook.setItemMeta(oldBook);
|
||||||
|
|
||||||
|
if (mainHand) {
|
||||||
|
player.getInventory().setItemInMainHand(newBook);
|
||||||
|
} else {
|
||||||
|
player.getInventory().setItemInOffHand(newBook);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean BooksHavePrice() {
|
protected boolean BooksHavePrice() {
|
||||||
return (bookPriceType != null && bookPriceQuantity > 0);
|
return (bookPriceType != null && bookPriceQuantity > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean printBook(Player player, int numCopies) {
|
/**
|
||||||
|
* Makes the player pay for printing a given number of books
|
||||||
|
* @param player <p>The player printing the books</p>
|
||||||
|
* @param numCopies <p>The number of copies the player is trying to print</p>
|
||||||
|
* @return <p>True if the player cannot pay for the printing of the books</p>
|
||||||
|
*/
|
||||||
|
protected boolean cannotPayForBookPrinting(Player player, int numCopies) {
|
||||||
|
//BookPriceQuantity: How many items are required to pay for each book
|
||||||
|
//BookPriceType: Which item is used to pay for the books. AIR = use economy
|
||||||
|
double cost = bookPriceQuantity * numCopies;
|
||||||
|
int itemCost = (int) cost;
|
||||||
|
|
||||||
if (bookPriceType == Material.AIR) {
|
if (bookPriceType == Material.AIR) {
|
||||||
if ((BooksWithoutBorders.eco.getBalance(player.getName()) - (bookPriceQuantity * numCopies)) >= 0) {
|
return !payForBookPrintingEconomy(player, cost, numCopies);
|
||||||
BooksWithoutBorders.eco.withdrawPlayer(player.getName(), (bookPriceQuantity * numCopies));
|
|
||||||
player.sendMessage(ChatColor.GREEN + BooksWithoutBorders.eco.format(bookPriceQuantity * numCopies) + " withdrawn to create " + numCopies + " book(s)");
|
|
||||||
player.sendMessage(ChatColor.GREEN + "New balance: " + BooksWithoutBorders.eco.format(BooksWithoutBorders.eco.getBalance(player.getName())));
|
|
||||||
return true;
|
|
||||||
} else {
|
} else {
|
||||||
player.sendMessage(ChatColor.RED + BooksWithoutBorders.eco.format(bookPriceQuantity * numCopies) + " is required for this command!");
|
if (player.getInventory().contains(bookPriceType, itemCost)) {
|
||||||
|
payForBookPrintingItem(player, itemCost);
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
} else if (player.getInventory().contains(bookPriceType, (int) bookPriceQuantity * numCopies)) {
|
|
||||||
|
|
||||||
int clearedAmount = 0, reqAmount = (int) bookPriceQuantity * numCopies;
|
|
||||||
while (clearedAmount != reqAmount) {
|
|
||||||
if (player.getInventory().getItem(player.getInventory().first(bookPriceType)).getAmount() <= reqAmount - clearedAmount) {
|
|
||||||
clearedAmount += player.getInventory().getItem(player.getInventory().first(bookPriceType)).getAmount();
|
|
||||||
player.getInventory().clear(player.getInventory().first(bookPriceType));
|
|
||||||
} else {
|
} else {
|
||||||
clearedAmount = reqAmount;
|
player.sendMessage(ChatColor.RED + String.valueOf(itemCost) + " " + bookPriceType.toString() +
|
||||||
player.getInventory().getItem(player.getInventory().first(bookPriceType)).setAmount(player.getInventory().getItem(player.getInventory().first(bookPriceType)).getAmount() - (clearedAmount));
|
"(s) are required for this command!");
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
player.sendMessage(ChatColor.RED + String.valueOf((int) bookPriceQuantity * numCopies) + " " + bookPriceType.toString() + "(s) are required for this command!");
|
/**
|
||||||
|
* Takes payment for printing a number of books by withdrawing the correct item
|
||||||
|
* @param player <p>The player which needs to pay</p>
|
||||||
|
* @param itemCost <p>The number of items to pay</p>
|
||||||
|
*/
|
||||||
|
private void payForBookPrintingItem(Player player, int itemCost) {
|
||||||
|
PlayerInventory playerInventory = player.getInventory();
|
||||||
|
|
||||||
|
int clearedAmount = 0;
|
||||||
|
while (clearedAmount < itemCost) {
|
||||||
|
int firstItemIndex = playerInventory.first(bookPriceType);
|
||||||
|
ItemStack firstItem = playerInventory.getItem(firstItemIndex);
|
||||||
|
|
||||||
|
if (Objects.requireNonNull(firstItem).getAmount() <= itemCost - clearedAmount) {
|
||||||
|
clearedAmount += firstItem.getAmount();
|
||||||
|
player.getInventory().clear(firstItemIndex);
|
||||||
|
} else {
|
||||||
|
clearedAmount = itemCost;
|
||||||
|
firstItem.setAmount(firstItem.getAmount() - (clearedAmount));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uses economy to take payment for printing a number of books
|
||||||
|
* @param player <p>The player which needs to pay</p>
|
||||||
|
* @param cost <p>The cost of the book printing</p>
|
||||||
|
* @param numCopies <p>The number of books the player is printing</p>
|
||||||
|
* @return <p>True if the player had the money and it has been withdrawn</p>
|
||||||
|
*/
|
||||||
|
private boolean payForBookPrintingEconomy(Player player, double cost, int numCopies) {
|
||||||
|
Economy economy = BooksWithoutBorders.eco;
|
||||||
|
if ((economy.getBalance(player) - cost) >= 0) {
|
||||||
|
economy.withdrawPlayer(player, cost);
|
||||||
|
player.sendMessage(ChatColor.GREEN + economy.format(cost) + " withdrawn to create " + numCopies + " book(s)");
|
||||||
|
player.sendMessage(ChatColor.GREEN + "New balance: " + economy.format(economy.getBalance(player)));
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
player.sendMessage(ChatColor.RED + economy.format(cost) + " is required for this command!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean printBook(Player player) {
|
|
||||||
return printBook(player, 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the given player is the author of a given book
|
||||||
|
* @param player <p>The player to check</p>
|
||||||
|
* @param book <p>The book to check</p>
|
||||||
|
* @return <p>True if the player is the book's author</p>
|
||||||
|
*/
|
||||||
protected boolean isAuthor(Player player, BookMeta book) {
|
protected boolean isAuthor(Player player, BookMeta book) {
|
||||||
String author = book.getAuthor();
|
String author = book.getAuthor();
|
||||||
if (author != null && cleanString(player.getName()).equalsIgnoreCase(cleanString(author))) {
|
if (author != null && cleanString(player.getName()).equalsIgnoreCase(cleanString(author))) {
|
||||||
|
Loading…
Reference in New Issue
Block a user