Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package edu.nmt.minecraft.HomeWorldPlugin.market;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.LinkedList;
- import org.bukkit.entity.Player;
- import org.bukkit.event.EventHandler;
- import org.bukkit.event.EventPriority;
- import org.bukkit.event.Listener;
- import org.bukkit.event.inventory.InventoryClickEvent;
- import org.bukkit.event.inventory.InventoryCloseEvent;
- import org.bukkit.event.inventory.InventoryOpenEvent;
- import org.bukkit.event.player.PlayerInteractEvent;
- import org.bukkit.inventory.DoubleChestInventory;
- import org.bukkit.inventory.Inventory;
- import org.bukkit.inventory.ItemStack;
- import org.bukkit.Bukkit;
- import org.bukkit.Location;
- import org.bukkit.Material;
- import edu.nmt.minecraft.HomeWorldPlugin.HomeWorldPlugin;
- /**
- * Represents a Marketplace, for buying and selling items
- * @author Matthew
- *
- */
- public class MarketPlace implements Listener{
- /**
- * The List of items that are currently up for sale on the market
- */
- private ArrayList<MarketItemStack> market;
- private HashMap<String, MarketPlayerInfo> playerInfo;
- private HashMap<String, MarketItemStack> toSell;
- /**
- * Default Constructor
- */
- public MarketPlace(){
- //change these to load from file
- market = new ArrayList<MarketItemStack>();
- playerInfo = new HashMap<String, MarketPlayerInfo>();
- toSell = new HashMap<String, MarketItemStack>();
- }
- /**
- * Event that is triggered when the player opens a marketplace chest
- * Dresses the chest.
- * @param event
- */
- @EventHandler(priority = EventPriority.LOWEST)
- public void marketStart(org.bukkit.event.player.PlayerInteractEvent event) {
- Player player = (Player) event.getPlayer();
- //make sure player is at market
- if (!atMarket(event)){
- return;
- }
- //create first time data if needed
- if (! playerInfo.containsKey(player.getName())){
- playerInfo.put(player.getName(), new MarketPlayerInfo(player));
- }
- //paint the chest for the main menu
- //clear inventory
- Inventory inv = playerInfo.get(player.getName()).getInventory();
- for (int i = 0; i < inv.getSize(); i++){
- inv.setItem(i, null);
- }
- //add items
- for (int i = 0; i < min(market.size(), (inv.getSize() - 9)); i++){
- inv.setItem(i, market.get(i));
- }
- //add menu buttons
- //add next buttons
- ItemStack next = new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x2);
- inv.setItem(getLeft(inv, 0), next);
- inv.setItem(getRight(inv, 0), next);
- //add sell button
- inv.setItem(getRight(inv, 1), new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x5));
- playerInfo.get(player.getName()).setIndex(0);
- playerInfo.get(player.getName()).setMenu(0);
- player.openInventory(playerInfo.get(player.getName()).getInventory());
- }
- /**
- * Event triggered when an item is clicked in the chest
- * @param event
- */
- @EventHandler(priority = EventPriority.LOWEST)
- public void itemClicked(InventoryClickEvent event) {
- Player player = (Player) event.getWhoClicked();
- //don't do anything if the player isn't in the marketplace
- if (!atMarket(player)){
- return;
- }
- //make sure we are in bounds
- if (event.getSlot() < 0){
- return;
- }
- //choose the right menu
- //main menu
- if (playerInfo.get(player.getName()).getMenu() == 0){
- player.sendMessage("Main menu");
- mainMenu(event);
- }
- //buy menu
- else if (playerInfo.get(player.getName()).getMenu() == 1){
- player.sendMessage("Buy menu");
- buyMenu(event);
- }
- //sell menu
- else if (playerInfo.get(player.getName()).getMenu() == 2){
- player.sendMessage("Sell menu");
- sellMenu(event);
- }
- switchItem(event);
- }
- public void marketClosed(InventoryCloseEvent event){
- if (atMarket((Player) event.getPlayer())){
- playerInfo.remove(((Player) event.getPlayer()).getName());
- }
- }
- /**
- * The sell menu. Called when a player wants to buy an item
- * @param event the InventoryClickEvent
- * @param
- */
- private void buyMenu(InventoryClickEvent event) {
- Player player = (Player) event.getWhoClicked();
- Inventory inv = event.getInventory();
- //click was made in the player's inventory
- if (event.getRawSlot() > event.getSlot()){
- return;
- }
- //item being bought was clicked
- if (event.getSlot() == 0){
- //do nothing
- return;
- }
- //buy button was pressed
- if (event.getSlot() == getRight(inv, 1)){
- player.sendMessage("You pressed the buy button");
- //buy the item
- buyItem(player, getItemStack(inv.getItem(0), null), event);
- //paint the chest for the main menu
- paintMainMenu(event,0);
- playerInfo.get(player.getName()).setIndex(0);
- playerInfo.get(player.getName()).setMenu(0);
- return;
- }
- //player pressed the back button
- else if (event.getSlot() == getRight(inv, 0)){
- player.sendMessage("You pressed the back button");
- //paint the chest for the main menu
- paintMainMenu(event,0);
- playerInfo.get(player.getName()).setIndex(0);
- playerInfo.get(player.getName()).setMenu(0);
- return;
- }
- }
- /**
- * The sell menu. Called when a player wants to sell an item
- * @param event the InventoryClickEvent
- */
- private void sellMenu(InventoryClickEvent event) {
- Player player = (Player) event.getWhoClicked();
- Inventory inv = event.getInventory();
- //create a market item is one does not exist yet
- if (! toSell.containsKey(player.getName())){
- toSell.put(player.getName(), new MarketItemStack(event.getCurrentItem(), player.getName(), 0, true, false));
- }
- //click was made in the player's inventory
- if (event.getRawSlot() > event.getSlot()){
- player.sendMessage("You want to put that up for sale");
- player.sendMessage("$" + toSell.get(player.getName()).getPrice());
- //put the item up for sale
- MarketItemStack oldItem = toSell.get(player.getName());
- MarketItemStack newItem = new MarketItemStack(event.getCurrentItem(), player.getName(), oldItem.getPrice(), true, false);
- toSell.remove(oldItem);
- toSell.put(player.getName(), newItem);
- //repaint
- inv.setItem(0, newItem);
- return;
- }
- //left click is increment, right click is decrement
- int amount = -1;
- if (event.isLeftClick()){
- amount = 1;
- }
- //if click was to change a place in the value
- for (int i = 0; i < 9; i++){
- if (event.getSlot() == getRight(inv, (9 + i))){
- //change the cost of the item
- MarketItemStack marketItem = toSell.get(player.getName());
- //make sure the value is still positive
- if (marketItem.getPrice() + (amount * java.lang.Math.pow(10, i)) < 0){
- paintSellMenu(event, player);
- return;
- }
- marketItem.setPrice(marketItem.getPrice() + (amount * java.lang.Math.pow(10, i)));
- //repaint
- stats(event);
- int j = 0;
- int price = (int) marketItem.getPrice();
- while ((price % (java.lang.Math.pow(10, i + 1))) != 0){
- j++;
- price -= java.lang.Math.pow(10, i);
- }
- //j = 0. make a zero
- if (j == 0){
- }
- //j is not zero. make sticks
- else{
- event.setCurrentItem(new ItemStack(Material.STICK, j));
- event.setCursor(new ItemStack(Material.AIR));
- }
- player.sendMessage("You changed the price");
- return;
- }
- }
- //sell button was pressed
- if (event.getSlot() == getRight(inv, 1)){
- player.sendMessage("You pressed the sell button");
- //make sure there is an item to sell
- if (toSell.get(player.getName()).getType().equals(Material.AIR)){
- player.sendMessage("You haven't put anything up for sale yet.");
- return;
- }
- //remove the item from the player's inventory
- player.getInventory().setItem(player.getInventory().first(toSell.get(player.getName())), null);
- //place the item on the market
- market.add(toSell.get(player.getName()));
- toSell.remove(player.getName());
- //paint the chest for the main menu
- paintMainMenu(event,0);
- playerInfo.get(player.getName()).setIndex(0);
- playerInfo.get(player.getName()).setMenu(0);
- return;
- }
- //player pressed the back button
- else if (event.getSlot() == getRight(inv, 0)){
- player.sendMessage("You pressed the back button");
- //paint the chest for the main menu
- paintMainMenu(event,0);
- playerInfo.get(player.getName()).setIndex(0);
- playerInfo.get(player.getName()).setMenu(0);
- return;
- }
- }
- /**
- * The main menu. Called when an item was clicked in the market
- * @param event the InventoryClickEvent
- * @param item
- */
- public void mainMenu(InventoryClickEvent event){
- Player player = (Player) event.getWhoClicked();
- Inventory inv = event.getInventory();
- //click was made in the player's inventory
- if (event.getRawSlot() > event.getSlot()){
- return;
- }
- //if previous button was pressed
- if (event.getSlot() == getLeft(inv, 0)){
- int index = playerInfo.get(player.getName()).getIndex();
- //make sure we are not out of bounds
- if (index == 0){
- return;
- }
- //redraw the chest
- paintMainMenu(event,index - 1);
- //reajust the index for the player
- playerInfo.get(player.getName()).setIndex(index - 1);
- return;
- }
- //if next button was pressed
- if (event.getSlot() == getRight(inv, 0)){
- int index = playerInfo.get(player.getName()).getIndex();
- //redraw the chest
- paintMainMenu(event,index + 1);
- //reajust the index for the player
- playerInfo.get(player.getName()).setIndex(index + 1);
- return;
- }
- //if sell item button was pressed
- if (event.getSlot() == getRight(inv, 1)){
- //set chest up for item menu
- player.sendMessage("You clicked the sell button");
- //paint the sell menu
- paintSellMenu(event, player);
- //set the player's menu
- playerInfo.get(player.getName()).setMenu(2);
- return;
- }
- //if another item was pressed that wasn't air
- if (! event.getCurrentItem().getType().equals(Material.AIR)){
- //paint the buy item
- paintBuyMenu(event, getItemStack(event.getCurrentItem(), null));
- //set the player's menu
- playerInfo.get(player.getName()).setMenu(1);
- player.sendMessage("You want to buy that item");
- return;
- }
- player.sendMessage("You clicked air");
- }
- private void stats(InventoryClickEvent event) {
- System.out.println("Cursor: " + event.getCursor().toString());
- System.out.println("Current Item: " + event.getCurrentItem().toString());
- }
- private void paintSellMenu(InventoryClickEvent event, Player player) {
- Inventory inv = event.getInventory();
- //clear inventory
- for (int i = 0; i < inv.getSize(); i++){
- inv.setItem(i, null);
- }
- //add menu buttons
- //add sell button
- ItemStack next = new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x5);
- inv.setItem(getRight(inv, 1), next);
- //add back button
- inv.setItem(getRight(inv, 0), new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x2));
- //add the item if it exists
- if (toSell.containsKey(player.getName())){
- inv.setItem(0, toSell.get(player.getName()));
- //add price
- int price = (int) toSell.get(player.getName()).getPrice();
- for (int i = 0; i < 9; i++){
- int j = 0;
- while ((price % (java.lang.Math.pow(10, i + 1))) != 0){
- j++;
- price -= java.lang.Math.pow(10, i);
- }
- //j = 0. make a zero
- if (j == 0){
- }
- //j is not zero. make sticks
- else{
- inv.setItem(getRight(inv, 9 + i), new ItemStack(Material.STICK, j));
- }
- }
- }
- }
- private void paintBuyMenu(InventoryClickEvent event, MarketItemStack item) {
- Inventory inv = event.getInventory();
- //clear inventory
- for (int i = 0; i < inv.getSize(); i++){
- inv.setItem(i, null);
- }
- //add item
- inv.setItem(0, item);
- //add price
- int price = (int) item.getPrice();
- for (int i = 0; i < 9; i++){
- int j = 0;
- while ((price % (java.lang.Math.pow(10, i + 1))) != 0){
- j++;
- price -= java.lang.Math.pow(10, i);
- }
- //j = 0. make a zero
- if (j == 0){
- }
- //j is not zero. make sticks
- else{
- inv.setItem(getRight(inv, 9 + i), new ItemStack(Material.STICK, j));
- }
- }
- //add menu buttons
- //add buy button
- ItemStack next = new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x5);
- inv.setItem(getRight(inv, 1), next);
- //add back button
- inv.setItem(getRight(inv, 0), new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x2));
- }
- /**
- * Player buys an item. Item is taken off of the market
- * @param player the player buying the item
- * @param item the item to be bought
- * @param inv the inventory of the market (to be repainted)
- */
- private void buyItem(Player player, MarketItemStack marketItem, InventoryClickEvent event) {
- //make sure the item wasn't quickly bought buy someone else
- if (marketItem.hasSold()){
- player.sendMessage("I'm sorry, but this item has already been sold");
- return;
- }
- //if the player has room and can afford the item, buy it
- if (! playerHasSpace(player)){
- player.sendMessage("I'm sorry, but you do'nt have enough space.");
- return;
- }
- if ((! playerCanAfford(player, marketItem)) && (! player.getName().equals(marketItem.getSeller()))){
- player.sendMessage("You can't afford that.");
- return;
- }
- //buy the item
- marketItem.setSold(true);
- player.getInventory().addItem(marketItem);
- HomeWorldPlugin.economy.deposit(marketItem.getSeller(), marketItem.getPrice());
- Bukkit.getPlayer(marketItem.getSeller()).sendMessage(player.getName() + " just bought your " + marketItem.toString() + " for $" + marketItem.getPrice());
- HomeWorldPlugin.economy.withdraw(player.getName(), marketItem.getPrice());
- player.sendMessage("You have bought: " + marketItem.toString() + " for $" + marketItem.getPrice());
- //remove it from the market
- market.remove(marketItem);
- //redraw the chest
- paintMainMenu(event,0);
- playerInfo.get(player.getName()).setIndex(0);
- }
- /**
- * Returns whether or not a player can afford an item
- * @param player The player
- * @param item The item the player wants to buy
- * @return whether or not a player can afford an item
- */
- private boolean playerCanAfford(Player player, MarketItemStack item) {
- double money = HomeWorldPlugin.economy.getBalance(player.getName());
- if (item.isBulk()){
- if (money >= item.getPrice()){
- return true;
- }
- }
- if (money >= (item.getPrice() * item.getAmount())){
- return true;
- }
- return false;
- }
- /**
- * Returns whether or not a player has an open inventory space
- * @param player The player
- * @return whether or not a player has an open inventory space
- */
- private boolean playerHasSpace(Player player) {
- Inventory inv = player.getInventory();
- for (ItemStack st: inv.getContents()){
- if (st == null){
- return true;
- }
- }
- return false;
- }
- /**
- * paints the chest with items that are currently on the market.
- */
- private void paintMainMenu(InventoryClickEvent event, int index){
- Inventory inv = event.getInventory();
- //clear inventory
- for (int i = 0; i < inv.getSize(); i++){
- inv.setItem(i, null);
- }
- //add items
- for (int i = index; i < min(market.size(), (inv.getSize() - 9)); i++){
- inv.setItem(i - index, market.get(i));
- }
- //add menu buttons
- //add next buttons
- ItemStack next = new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x2);
- inv.setItem(getLeft(inv, 0), next);
- inv.setItem(getRight(inv, 0), next);
- //add sell button
- inv.setItem(getRight(inv, 1), new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x5));
- }
- /**
- * Returns a place in the inventory, right-aligned to the offset
- * @param inv the Inventory
- * @param offset the offset after the alignment
- * @return a place in the inventory, right-aligned to the offset
- */
- private int getRight(Inventory inv, int offset){
- return inv.getSize() - 1 - offset;
- }
- /**
- * Returns a place in the inventory, left-aligned to the offset
- * @param inv the Inventory
- * @param offset the offset after the alignment
- * @return a place in the inventory, left-aligned
- */
- private int getLeft(Inventory inv, int offset){
- return inv.getSize() - 9 + offset;
- }
- /**
- * Returns whether or not a player is inside of the marketplace. TODO: change the area to be a parameter for the object
- * @param player
- * @param inv
- * @return
- */
- private boolean atMarket(Player player){
- if (player.getLocation().getBlockX() >= 210 && player.getLocation().getBlockX() <= 215){
- if (player.getLocation().getBlockZ() >= 160 && player.getLocation().getBlockZ() <= 165){
- return true;
- }
- }
- return false;
- }
- private boolean atMarket(PlayerInteractEvent event){
- if (event.getClickedBlock() == null){
- return false;
- }
- if (event.getClickedBlock().getLocation().equals(new Location(Bukkit.getWorld("HomeWorld"), 213, 72, 163))){
- return true;
- }
- return false;
- }
- /**
- * Returns the MarketItemStack of the ItemStack at hand
- * @param item the ItemStack at hand
- * @param name
- * @return the MarketItemStack of the ItemStack at hand
- */
- public MarketItemStack getItemStack(ItemStack item, String name){
- if (item == null){
- item = new ItemStack(Material.AIR);
- }
- for (MarketItemStack m: market){
- if (item.equals((ItemStack) m)){
- if (name == null){
- return m;
- }
- if (m.getSeller().equals(name)){
- return m;
- }
- }
- }
- return new MarketItemStack(new ItemStack(Material.AIR), name, 0, true, true);
- }
- /**
- * returns the minumum of a and b
- * @param a
- * @param b
- * @return
- */
- private int min(int a, int b){
- if (a < b) return a;
- return b;
- }
- public void printMarket(){
- for (MarketItemStack m: market){
- System.out.println(m.toString());
- }
- }
- private void switchItem(InventoryClickEvent event){
- ItemStack item;
- Player player = (Player) event.getWhoClicked();
- //stop the player from picking up an item
- //left click
- if(event.isLeftClick()){
- item = event.getCursor();
- event.setCursor(event.getCurrentItem());
- event.setCurrentItem(item);
- }
- if(event.isRightClick()){
- item = event.getCursor();
- event.setCursor(event.getCurrentItem());
- event.setCurrentItem(item);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement