CrazyAuctions/paper/src/main/java/com/badbones69/crazyauctions/Main.java

480 lines
26 KiB
Java

package com.badbones69.crazyauctions;
import com.badbones69.crazyauctions.api.*;
import com.badbones69.crazyauctions.api.FileManager.Files;
import com.badbones69.crazyauctions.api.events.AuctionListEvent;
import com.badbones69.crazyauctions.controllers.DupePatch;
import com.badbones69.crazyauctions.controllers.GUI;
import com.badbones69.crazyauctions.currency.Vault;
import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.BookMeta;
import org.bukkit.permissions.PermissionAttachmentInfo;
import org.bukkit.plugin.java.JavaPlugin;
import org.yaml.snakeyaml.error.YAMLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
public class Main extends JavaPlugin implements Listener {
public static FileManager fileManager = FileManager.getInstance();
public static CrazyAuctions crazyAuctions = CrazyAuctions.getInstance();
@Override
public void onEnable() {
fileManager.logInfo(true).setup(this);
crazyAuctions.loadCrazyAuctions();
Bukkit.getServer().getPluginManager().registerEvents(this, this);
Bukkit.getServer().getPluginManager().registerEvents(new GUI(), this);
Bukkit.getServer().getPluginManager().registerEvents(new DupePatch(), this);
Methods.updateAuction();
startCheck();
if (!Vault.setupEconomy()) { saveDefaultConfig(); }
Messages.addMissingMessages();
new Metrics(this, 4624); //Starts up bStats
}
@Override
public void onDisable() {
int file = 0;
Bukkit.getScheduler().cancelTask(file);
Files.DATA.saveFile(true);
}
public boolean onCommand(CommandSender sender, Command cmd, String commandLable, String[] args) {
if (commandLable.equalsIgnoreCase("CrazyAuctions") || commandLable.equalsIgnoreCase("CrazyAuction") || commandLable.equalsIgnoreCase("CA") || commandLable.equalsIgnoreCase("AH") || commandLable.equalsIgnoreCase("HDV")) {
if (args.length == 0) {
if (!Methods.hasPermission(sender, "Access")) return true;
if (!(sender instanceof Player)) {
sender.sendMessage(Messages.PLAYERS_ONLY.getMessage());
return true;
}
Player player = (Player) sender;
if (Files.CONFIG.getFile().contains("Settings.Category-Page-Opens-First")) {
if (Files.CONFIG.getFile().getBoolean("Settings.Category-Page-Opens-First")) {
GUI.openCategories(player, ShopType.SELL);
return true;
}
}
if (crazyAuctions.isSellingEnabled()) {
GUI.openShop(player, ShopType.SELL, Category.NONE, 1);
} else if (crazyAuctions.isBiddingEnabled()) {
GUI.openShop(player, ShopType.BID, Category.NONE, 1);
} else {
player.sendMessage(Methods.getPrefix() + Methods.color("&cThe bidding and selling options are both disabled. Please contact the admin about this."));
}
return true;
}
if (args.length >= 1) {
if (args[0].equalsIgnoreCase("Help")) {// CA Help
if (!Methods.hasPermission(sender, "Access")) return true;
sender.sendMessage(Messages.HELP.getMessage());
return true;
}
if (args[0].equalsIgnoreCase("test")) {// CA test [times]
if (!Methods.hasPermission(sender, "test")) return true;
int times = 1;
if (args.length >= 2) {
if (!Methods.isInt(args[1])) {
HashMap<String, String> placeholders = new HashMap<>();
placeholders.put("%Arg%", args[1]);
placeholders.put("%arg%", args[1]);
sender.sendMessage(Messages.NOT_A_NUMBER.getMessage(placeholders));
return true;
}
times = Integer.parseInt(args[1]);
}
int price = 10;
int amount = 1;
ItemStack item = Methods.getItemInHand((Player) sender);
if (item != null && item.getType() != Material.AIR) {
// For testing as another player
String seller = "Test-Account";
for (int it = 1; it <= times; it++) {
int num = 1;
Random r = new Random();
for (; Files.DATA.getFile().contains("Items." + num); num++) ;
Files.DATA.getFile().set("Items." + num + ".Price", price);
Files.DATA.getFile().set("Items." + num + ".Seller", seller);
if (args[0].equalsIgnoreCase("Bid")) {
Files.DATA.getFile().set("Items." + num + ".Time-Till-Expire", Methods.convertToMill(Files.CONFIG.getFile().getString("Settings.Bid-Time")));
} else {
Files.DATA.getFile().set("Items." + num + ".Time-Till-Expire", Methods.convertToMill(Files.CONFIG.getFile().getString("Settings.Sell-Time")));
}
Files.DATA.getFile().set("Items." + num + ".Full-Time", Methods.convertToMill(Files.CONFIG.getFile().getString("Settings.Full-Expire-Time")));
int id = r.nextInt(Integer.MAX_VALUE);
for (String i : Files.DATA.getFile().getConfigurationSection("Items").getKeys(false))
if (Files.DATA.getFile().getInt("Items." + i + ".StoreID") == id) id = r.nextInt(Integer.MAX_VALUE);
Files.DATA.getFile().set("Items." + num + ".StoreID", id);
ShopType type = ShopType.SELL;
Files.DATA.getFile().set("Items." + num + ".Biddable", args[0].equalsIgnoreCase("Bid"));
Files.DATA.getFile().set("Items." + num + ".TopBidder", "None");
ItemStack I = item.clone();
I.setAmount(amount);
Files.DATA.getFile().set("Items." + num + ".Item", I);
}
Files.DATA.saveFile();
HashMap<String, String> placeholders = new HashMap<>();
placeholders.put("%Price%", price + "");
placeholders.put("%price%", price + "");
sender.sendMessage(Messages.ADDED_ITEM_TO_AUCTION.getMessage(placeholders));
if (item.getAmount() <= 1 || (item.getAmount() - amount) <= 0) {
Methods.setItemInHand((Player) sender, new ItemStack(Material.AIR));
} else {
item.setAmount(item.getAmount() - amount);
}
} else {
sender.sendMessage(Messages.DOSENT_HAVE_ITEM_IN_HAND.getMessage());
}
return true;
}
if (args[0].equalsIgnoreCase("Reload")) {// CA Reload
if (!Methods.hasPermission(sender, "Admin")) return true;
fileManager.logInfo(true).setup(this);
crazyAuctions.loadCrazyAuctions();
sender.sendMessage(Messages.RELOAD.getMessage());
return true;
}
if (args[0].equalsIgnoreCase("View")) {// CA View <Player>
if (!Methods.hasPermission(sender, "View")) return true;
if (!(sender instanceof Player)) {
sender.sendMessage(Messages.PLAYERS_ONLY.getMessage());
return true;
}
if (args.length >= 2) {
Player player = (Player) sender;
GUI.openViewer(player, args[1], 1);
return true;
}
sender.sendMessage(Messages.CRAZYAUCTIONS_VIEW.getMessage());
return true;
}
if (args[0].equalsIgnoreCase("Expired") || args[0].equalsIgnoreCase("Collect")) {// CA Expired
if (!Methods.hasPermission(sender, "Access")) return true;
if (!(sender instanceof Player)) {
sender.sendMessage(Messages.PLAYERS_ONLY.getMessage());
return true;
}
Player player = (Player) sender;
GUI.openPlayersExpiredList(player, 1);
return true;
}
if (args[0].equalsIgnoreCase("Listed")) {// CA Listed
if (!Methods.hasPermission(sender, "Access")) return true;
if (!(sender instanceof Player)) {
sender.sendMessage(Messages.PLAYERS_ONLY.getMessage());
return true;
}
Player player = (Player) sender;
GUI.openPlayersCurrentList(player, 1);
return true;
}
if (args[0].equalsIgnoreCase("Sell") || args[0].equalsIgnoreCase("Bid")) {// /CA Sell/Bid <Price> [Amount of Items]
if (!(sender instanceof Player)) {
sender.sendMessage(Messages.PLAYERS_ONLY.getMessage());
return true;
}
if (args.length >= 2) {
Player player = (Player) sender;
if (args[0].equalsIgnoreCase("Sell")) {
if (!crazyAuctions.isSellingEnabled()) {
player.sendMessage(Messages.SELLING_DISABLED.getMessage());
return true;
}
if (!Methods.hasPermission(player, "Sell")) return true;
}
if (args[0].equalsIgnoreCase("Bid")) {
if (!crazyAuctions.isBiddingEnabled()) {
player.sendMessage(Messages.BIDDING_DISABLED.getMessage());
return true;
}
if (!Methods.hasPermission(player, "Bid")) return true;
}
ItemStack item = Methods.getItemInHand(player);
int amount = item.getAmount();
if (args.length >= 3) {
if (!Methods.isInt(args[2])) {
HashMap<String, String> placeholders = new HashMap<>();
placeholders.put("%Arg%", args[2]);
placeholders.put("%arg%", args[2]);
player.sendMessage(Messages.NOT_A_NUMBER.getMessage(placeholders));
return true;
}
amount = Integer.parseInt(args[2]);
if (amount <= 0) amount = 1;
if (amount > item.getAmount()) amount = item.getAmount();
}
if (!Methods.isLong(args[1])) {
HashMap<String, String> placeholders = new HashMap<>();
placeholders.put("%Arg%", args[1]);
placeholders.put("%arg%", args[1]);
player.sendMessage(Messages.NOT_A_NUMBER.getMessage(placeholders));
return true;
}
if (Methods.getItemInHand(player).getType() == Material.AIR) {
player.sendMessage(Messages.DOSENT_HAVE_ITEM_IN_HAND.getMessage());
return false;
}
long price = Long.parseLong(args[1]);
if (args[0].equalsIgnoreCase("Bid")) {
if (price < Files.CONFIG.getFile().getLong("Settings.Minimum-Bid-Price")) {
player.sendMessage(Messages.BID_PRICE_TO_LOW.getMessage());
return true;
}
if (price > Files.CONFIG.getFile().getLong("Settings.Max-Beginning-Bid-Price")) {
player.sendMessage(Messages.BID_PRICE_TO_HIGH.getMessage());
return true;
}
} else {
if (price < Files.CONFIG.getFile().getLong("Settings.Minimum-Sell-Price")) {
player.sendMessage(Messages.SELL_PRICE_TO_LOW.getMessage());
return true;
}
if (price > Files.CONFIG.getFile().getLong("Settings.Max-Beginning-Sell-Price")) {
player.sendMessage(Messages.SELL_PRICE_TO_HIGH.getMessage());
return true;
}
}
if (!player.hasPermission("crazyauctions.bypass")) {
int SellLimit = 0;
int BidLimit = 0;
for (PermissionAttachmentInfo permission : player.getEffectivePermissions()) {
String perm = permission.getPermission();
if (perm.startsWith("crazyauctions.sell.")) {
perm = perm.replace("crazyauctions.sell.", "");
if (Methods.isInt(perm)) {
if (Integer.parseInt(perm) > SellLimit) {
SellLimit = Integer.parseInt(perm);
}
}
}
if (perm.startsWith("crazyauctions.bid.")) {
perm = perm.replace("crazyauctions.bid.", "");
if (Methods.isInt(perm)) {
if (Integer.parseInt(perm) > BidLimit) {
BidLimit = Integer.parseInt(perm);
}
}
}
}
for (int i = 1; i < 100; i++) {
if (SellLimit < i) {
if (player.hasPermission("crazyauctions.sell." + i)) {
SellLimit = i;
}
}
if (BidLimit < i) {
if (player.hasPermission("crazyauctions.bid." + i)) {
BidLimit = i;
}
}
}
if (args[0].equalsIgnoreCase("Sell")) {
if (crazyAuctions.getItems(player, ShopType.SELL).size() >= SellLimit) {
player.sendMessage(Messages.MAX_ITEMS.getMessage());
return true;
}
}
if (args[0].equalsIgnoreCase("Bid")) {
if (crazyAuctions.getItems(player, ShopType.BID).size() >= BidLimit) {
player.sendMessage(Messages.MAX_ITEMS.getMessage());
return true;
}
}
}
for (String id : Files.CONFIG.getFile().getStringList("Settings.BlackList")) {
if (item.getType() == Methods.makeItem(id, 1).getType()) {
player.sendMessage(Messages.ITEM_BLACKLISTED.getMessage());
return true;
}
}
if (!Files.CONFIG.getFile().getBoolean("Settings.Allow-Damaged-Items")) {
for (Material i : getDamageableItems()) {
if (item.getType() == i) {
if (item.getDurability() > 0) {
player.sendMessage(Messages.ITEM_DAMAGED.getMessage());
return true;
}
}
}
}
if (!allowBook(item)) {
player.sendMessage(Messages.BOOK_NOT_ALLOWED.getMessage());
return true;
}
String seller = player.getName();
// For testing as another player
//String seller = "Test-Account";
int num = 1;
Random r = new Random();
for (; Files.DATA.getFile().contains("Items." + num); num++) ;
Files.DATA.getFile().set("Items." + num + ".Price", price);
Files.DATA.getFile().set("Items." + num + ".Seller", seller);
if (args[0].equalsIgnoreCase("Bid")) {
Files.DATA.getFile().set("Items." + num + ".Time-Till-Expire", Methods.convertToMill(Files.CONFIG.getFile().getString("Settings.Bid-Time")));
} else {
Files.DATA.getFile().set("Items." + num + ".Time-Till-Expire", Methods.convertToMill(Files.CONFIG.getFile().getString("Settings.Sell-Time")));
}
Files.DATA.getFile().set("Items." + num + ".Full-Time", Methods.convertToMill(Files.CONFIG.getFile().getString("Settings.Full-Expire-Time")));
int id = r.nextInt(999999);
// Runs 3x to check for same ID.
for (String i : Files.DATA.getFile().getConfigurationSection("Items").getKeys(false))
if (Files.DATA.getFile().getInt("Items." + i + ".StoreID") == id) id = r.nextInt(Integer.MAX_VALUE);
for (String i : Files.DATA.getFile().getConfigurationSection("Items").getKeys(false))
if (Files.DATA.getFile().getInt("Items." + i + ".StoreID") == id) id = r.nextInt(Integer.MAX_VALUE);
for (String i : Files.DATA.getFile().getConfigurationSection("Items").getKeys(false))
if (Files.DATA.getFile().getInt("Items." + i + ".StoreID") == id) id = r.nextInt(Integer.MAX_VALUE);
Files.DATA.getFile().set("Items." + num + ".StoreID", id);
ShopType type = ShopType.SELL;
if (args[0].equalsIgnoreCase("Bid")) {
Files.DATA.getFile().set("Items." + num + ".Biddable", true);
type = ShopType.BID;
} else {
Files.DATA.getFile().set("Items." + num + ".Biddable", false);
}
Files.DATA.getFile().set("Items." + num + ".TopBidder", "None");
ItemStack I = item.clone();
I.setAmount(amount);
Files.DATA.getFile().set("Items." + num + ".Item", I);
Files.DATA.saveFile();
Bukkit.getPluginManager().callEvent(new AuctionListEvent(player, type, I, price));
HashMap<String, String> placeholders = new HashMap<>();
placeholders.put("%Price%", price + "");
placeholders.put("%price%", price + "");
player.sendMessage(Messages.ADDED_ITEM_TO_AUCTION.getMessage(placeholders));
if (item.getAmount() <= 1 || (item.getAmount() - amount) <= 0) {
Methods.setItemInHand(player, new ItemStack(Material.AIR));
} else {
item.setAmount(item.getAmount() - amount);
}
return false;
}
sender.sendMessage(Messages.CRAZYAUCTIONS_SELL_BID.getMessage());
return true;
}
}
}
sender.sendMessage(Messages.CRAZYAUCTIONS_HELP.getMessage());
return false;
}
@EventHandler
public void onJoin(PlayerJoinEvent e) {
final Player player = e.getPlayer();
if (player.getName().equalsIgnoreCase("BadBones69")) {
Bukkit.getScheduler().runTaskLater(this, () -> player.sendMessage(Methods.getPrefix() + Methods.color("&7This server is running your Crazy Auctions Plugin. " + "&7It is running version &av" + Bukkit.getServer().getPluginManager().getPlugin("CrazyAuctions").getDescription().getVersion() + "&7.")), 40);
}
}
private void startCheck() {
Bukkit.getScheduler().runTaskTimer(this, Methods :: updateAuction, 20, 5 * 20);
}
private ArrayList<Material> getDamageableItems() {
ArrayList<Material> ma = new ArrayList<>();
if (Version.isNewer(Version.v1_12_R1)) {
ma.add(Material.matchMaterial("GOLDEN_HELMET"));
ma.add(Material.matchMaterial("GOLDEN_CHESTPLATE"));
ma.add(Material.matchMaterial("GOLDEN_LEGGINGS"));
ma.add(Material.matchMaterial("GOLDEN_BOOTS"));
ma.add(Material.matchMaterial("WOODEN_SWORD"));
ma.add(Material.matchMaterial("WOODEN_AXE"));
ma.add(Material.matchMaterial("WOODEN_PICKAXE"));
ma.add(Material.matchMaterial("WOODEN_AXE"));
ma.add(Material.matchMaterial("WOODEN_SHOVEL"));
ma.add(Material.matchMaterial("STONE_SHOVEL"));
ma.add(Material.matchMaterial("IRON_SHOVEL"));
ma.add(Material.matchMaterial("DIAMOND_SHOVEL"));
ma.add(Material.matchMaterial("WOODEN_HOE"));
ma.add(Material.matchMaterial("GOLDEN_HOE"));
ma.add(Material.matchMaterial("CROSSBOW"));
ma.add(Material.matchMaterial("TRIDENT"));
ma.add(Material.matchMaterial("TURTLE_HELMET"));
} else {
ma.add(Material.matchMaterial("GOLD_HELMET"));
ma.add(Material.matchMaterial("GOLD_CHESTPLATE"));
ma.add(Material.matchMaterial("GOLD_LEGGINGS"));
ma.add(Material.matchMaterial("GOLD_BOOTS"));
ma.add(Material.matchMaterial("WOOD_SWORD"));
ma.add(Material.matchMaterial("WOOD_AXE"));
ma.add(Material.matchMaterial("WOOD_PICKAXE"));
ma.add(Material.matchMaterial("WOOD_AXE"));
ma.add(Material.matchMaterial("WOOD_SPADE"));
ma.add(Material.matchMaterial("STONE_SPADE"));
ma.add(Material.matchMaterial("IRON_SPADE"));
ma.add(Material.matchMaterial("DIAMOND_SPADE"));
ma.add(Material.matchMaterial("WOOD_HOE"));
ma.add(Material.matchMaterial("GOLD_HOE"));
}
ma.add(Material.DIAMOND_HELMET);
ma.add(Material.DIAMOND_CHESTPLATE);
ma.add(Material.DIAMOND_LEGGINGS);
ma.add(Material.DIAMOND_BOOTS);
ma.add(Material.CHAINMAIL_HELMET);
ma.add(Material.CHAINMAIL_CHESTPLATE);
ma.add(Material.CHAINMAIL_LEGGINGS);
ma.add(Material.CHAINMAIL_BOOTS);
ma.add(Material.IRON_HELMET);
ma.add(Material.IRON_CHESTPLATE);
ma.add(Material.IRON_LEGGINGS);
ma.add(Material.IRON_BOOTS);
ma.add(Material.LEATHER_HELMET);
ma.add(Material.LEATHER_CHESTPLATE);
ma.add(Material.LEATHER_LEGGINGS);
ma.add(Material.LEATHER_BOOTS);
ma.add(Material.BOW);
ma.add(Material.STONE_SWORD);
ma.add(Material.IRON_SWORD);
ma.add(Material.DIAMOND_SWORD);
ma.add(Material.STONE_AXE);
ma.add(Material.IRON_AXE);
ma.add(Material.DIAMOND_AXE);
ma.add(Material.STONE_PICKAXE);
ma.add(Material.IRON_PICKAXE);
ma.add(Material.DIAMOND_PICKAXE);
ma.add(Material.STONE_AXE);
ma.add(Material.IRON_AXE);
ma.add(Material.DIAMOND_AXE);
ma.add(Material.STONE_HOE);
ma.add(Material.IRON_HOE);
ma.add(Material.DIAMOND_HOE);
ma.add(Material.FLINT_AND_STEEL);
ma.add(Material.ANVIL);
ma.add(Material.FISHING_ROD);
return ma;
}
private boolean allowBook(ItemStack item) {
if (item != null && item.hasItemMeta() && item.getItemMeta() instanceof BookMeta) {
Bukkit.getLogger().info("Checking " + item.getType() + " for illegal unicode.");
try {
Files.TEST_FILE.getFile().set("Test", item);
Files.TEST_FILE.saveFile();
Bukkit.getLogger().info("" + item.getType() + " has passed unicode checks.");
} catch (YAMLException e) {
Bukkit.getLogger().info("" + item.getType() + " has failed unicode checks and has been denied.");
return false;
}
return ((BookMeta) item.getItemMeta()).getPages().stream().mapToInt(String :: length).sum() < 2000;
}
return true;
}
public Material getMaterial(String newMaterial, String oldMaterial) {
return Material.matchMaterial(Version.isNewer(Version.v1_12_R1) ? newMaterial : oldMaterial);
}
}