Advertisement
Guest User

MarketPlace.java

a guest
Oct 31st, 2012
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 19.04 KB | None | 0 0
  1. package edu.nmt.minecraft.HomeWorldPlugin.market;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.LinkedList;
  6.  
  7. import org.bukkit.entity.Player;
  8. import org.bukkit.event.EventHandler;
  9. import org.bukkit.event.EventPriority;
  10. import org.bukkit.event.Listener;
  11. import org.bukkit.event.inventory.InventoryClickEvent;
  12. import org.bukkit.event.inventory.InventoryCloseEvent;
  13. import org.bukkit.event.inventory.InventoryOpenEvent;
  14. import org.bukkit.event.player.PlayerInteractEvent;
  15. import org.bukkit.inventory.DoubleChestInventory;
  16. import org.bukkit.inventory.Inventory;
  17. import org.bukkit.inventory.ItemStack;
  18. import org.bukkit.Bukkit;
  19. import org.bukkit.Location;
  20. import org.bukkit.Material;
  21.  
  22. import edu.nmt.minecraft.HomeWorldPlugin.HomeWorldPlugin;
  23.  
  24. /**
  25.  * Represents a Marketplace, for buying and selling items
  26.  * @author Matthew
  27.  *
  28.  */
  29. public class MarketPlace implements Listener{
  30.    
  31.     /**
  32.      * The List of items that are currently up for sale on the market
  33.      */
  34.     private ArrayList<MarketItemStack> market;
  35.    
  36.     private HashMap<String, MarketPlayerInfo> playerInfo;
  37.    
  38.     private HashMap<String, MarketItemStack> toSell;
  39.    
  40.     /**
  41.      * Default Constructor
  42.      */
  43.     public MarketPlace(){
  44.         //change these to load from file
  45.         market = new ArrayList<MarketItemStack>();
  46.         playerInfo = new HashMap<String, MarketPlayerInfo>();
  47.         toSell = new HashMap<String, MarketItemStack>();
  48.     }
  49.    
  50.    
  51.     /**
  52.      * Event that is triggered when the player opens a marketplace chest
  53.      * Dresses the chest.
  54.      * @param event
  55.      */
  56.     @EventHandler(priority = EventPriority.LOWEST)
  57.     public void marketStart(org.bukkit.event.player.PlayerInteractEvent event) {
  58.        
  59.         Player player = (Player) event.getPlayer();
  60.        
  61.         //make sure player is at market
  62.         if (!atMarket(event)){
  63.             return;
  64.         }
  65.            
  66.         //create first time data if needed
  67.         if (! playerInfo.containsKey(player.getName())){
  68.             playerInfo.put(player.getName(), new MarketPlayerInfo(player));
  69.         }
  70.        
  71.         //paint the chest for the main menu
  72.         //clear inventory
  73.         Inventory inv = playerInfo.get(player.getName()).getInventory();
  74.         for (int i = 0; i < inv.getSize(); i++){
  75.             inv.setItem(i, null);
  76.         }
  77.        
  78.         //add items
  79.         for (int i = 0; i < min(market.size(), (inv.getSize() - 9)); i++){
  80.             inv.setItem(i, market.get(i));
  81.         }
  82.        
  83.         //add menu buttons
  84.         //add next buttons
  85.         ItemStack next = new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x2);
  86.         inv.setItem(getLeft(inv, 0), next);
  87.         inv.setItem(getRight(inv, 0), next);
  88.        
  89.         //add sell button
  90.         inv.setItem(getRight(inv, 1), new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x5));
  91.         playerInfo.get(player.getName()).setIndex(0);
  92.         playerInfo.get(player.getName()).setMenu(0);
  93.        
  94.         player.openInventory(playerInfo.get(player.getName()).getInventory());
  95.            
  96.     }
  97.    
  98.     /**
  99.      * Event triggered when an item is clicked in the chest
  100.      * @param event
  101.      */
  102.     @EventHandler(priority = EventPriority.LOWEST)
  103.     public void itemClicked(InventoryClickEvent event) {
  104.         Player player = (Player) event.getWhoClicked();
  105.        
  106.         //don't do anything if the player isn't in the marketplace
  107.         if (!atMarket(player)){
  108.             return;
  109.         }
  110.        
  111.         //make sure we are in bounds
  112.         if (event.getSlot() < 0){
  113.             return;
  114.         }
  115.        
  116.        
  117.        
  118.         //choose the right menu
  119.         //main menu
  120.         if (playerInfo.get(player.getName()).getMenu() == 0){
  121.             player.sendMessage("Main menu");
  122.             mainMenu(event);
  123.         }
  124.         //buy menu
  125.         else if (playerInfo.get(player.getName()).getMenu() == 1){
  126.             player.sendMessage("Buy menu");
  127.             buyMenu(event);
  128.         }
  129.         //sell menu
  130.         else if (playerInfo.get(player.getName()).getMenu() == 2){
  131.             player.sendMessage("Sell menu");
  132.             sellMenu(event);
  133.         }
  134.        
  135.         switchItem(event);
  136.        
  137.     }
  138.    
  139.     public void marketClosed(InventoryCloseEvent event){
  140.        
  141.         if (atMarket((Player) event.getPlayer())){
  142.             playerInfo.remove(((Player) event.getPlayer()).getName());
  143.         }
  144.        
  145.     }
  146.    
  147.  
  148.     /**
  149.      * The sell menu. Called when a player wants to buy an item
  150.      * @param event the InventoryClickEvent
  151.      * @param  
  152.      */
  153.     private void buyMenu(InventoryClickEvent event) {
  154.         Player player = (Player) event.getWhoClicked();
  155.         Inventory inv = event.getInventory();
  156.        
  157.         //click was made in the player's inventory
  158.         if (event.getRawSlot() > event.getSlot()){ 
  159.             return;
  160.         }
  161.        
  162.         //item being bought was clicked
  163.         if (event.getSlot() == 0){
  164.             //do nothing
  165.             return;
  166.         }
  167.        
  168.         //buy button was pressed
  169.         if (event.getSlot() == getRight(inv, 1)){
  170.             player.sendMessage("You pressed the buy button");
  171.            
  172.             //buy the item
  173.             buyItem(player, getItemStack(inv.getItem(0), null), event);
  174.            
  175.             //paint the chest for the main menu
  176.             paintMainMenu(event,0);
  177.             playerInfo.get(player.getName()).setIndex(0);
  178.             playerInfo.get(player.getName()).setMenu(0);
  179.             return;
  180.            
  181.         }
  182.        
  183.         //player pressed the back button
  184.         else if (event.getSlot() == getRight(inv, 0)){
  185.             player.sendMessage("You pressed the back button");
  186.            
  187.             //paint the chest for the main menu
  188.             paintMainMenu(event,0);
  189.             playerInfo.get(player.getName()).setIndex(0);
  190.             playerInfo.get(player.getName()).setMenu(0);
  191.             return;
  192.         }
  193.     }
  194.    
  195.     /**
  196.      * The sell menu. Called when a player wants to sell an item
  197.      * @param event the InventoryClickEvent
  198.      */
  199.     private void sellMenu(InventoryClickEvent event) {  
  200.         Player player = (Player) event.getWhoClicked();
  201.         Inventory inv = event.getInventory();
  202.        
  203.         //create a market item is one does not exist yet
  204.         if (! toSell.containsKey(player.getName())){
  205.             toSell.put(player.getName(), new MarketItemStack(event.getCurrentItem(), player.getName(), 0, true, false));
  206.         }
  207.        
  208.         //click was made in the player's inventory
  209.         if (event.getRawSlot() > event.getSlot()){ 
  210.  
  211.             player.sendMessage("You want to put that up for sale");
  212.             player.sendMessage("$" + toSell.get(player.getName()).getPrice());
  213.            
  214.             //put the item up for sale
  215.             MarketItemStack oldItem = toSell.get(player.getName());
  216.             MarketItemStack newItem = new MarketItemStack(event.getCurrentItem(), player.getName(), oldItem.getPrice(), true, false);
  217.             toSell.remove(oldItem);
  218.             toSell.put(player.getName(), newItem);
  219.  
  220.             //repaint
  221.             inv.setItem(0, newItem);
  222.  
  223.             return;
  224.         }
  225.        
  226.         //left click is increment, right click is decrement
  227.         int amount = -1;
  228.         if (event.isLeftClick()){
  229.             amount = 1;
  230.         }
  231.        
  232.         //if click was to change a place in the value
  233.         for (int i = 0; i < 9; i++){
  234.             if (event.getSlot() == getRight(inv, (9 + i))){
  235.                
  236.                 //change the cost of the item
  237.                 MarketItemStack marketItem = toSell.get(player.getName());
  238.                
  239.                 //make sure the value is still positive
  240.                 if (marketItem.getPrice() + (amount * java.lang.Math.pow(10, i)) < 0){
  241.                     paintSellMenu(event, player);
  242.                     return;
  243.                 }
  244.                 marketItem.setPrice(marketItem.getPrice() + (amount * java.lang.Math.pow(10, i)));
  245.                
  246.                 //repaint
  247.                 stats(event);
  248.                 int j = 0;
  249.                 int price = (int) marketItem.getPrice();
  250.                 while ((price % (java.lang.Math.pow(10, i + 1))) != 0){
  251.                     j++;
  252.                     price -= java.lang.Math.pow(10, i);
  253.                 }
  254.                 //j = 0. make a zero
  255.                 if (j == 0){
  256.                    
  257.                 }
  258.                 //j is not zero. make sticks
  259.                 else{
  260.                     event.setCurrentItem(new ItemStack(Material.STICK, j));
  261.                     event.setCursor(new ItemStack(Material.AIR));
  262.                 }
  263.                
  264.                 player.sendMessage("You changed the price");
  265.                 return;
  266.             }
  267.         }
  268.        
  269.         //sell button was pressed
  270.         if (event.getSlot() == getRight(inv, 1)){
  271.             player.sendMessage("You pressed the sell button");
  272.            
  273.             //make sure there is an item to sell
  274.             if (toSell.get(player.getName()).getType().equals(Material.AIR)){
  275.                 player.sendMessage("You haven't put anything up for sale yet.");
  276.                 return;
  277.             }
  278.            
  279.             //remove the item from the player's inventory
  280.             player.getInventory().setItem(player.getInventory().first(toSell.get(player.getName())), null);
  281.            
  282.             //place the item on the market
  283.             market.add(toSell.get(player.getName()));
  284.             toSell.remove(player.getName());           
  285.            
  286.             //paint the chest for the main menu
  287.             paintMainMenu(event,0);
  288.             playerInfo.get(player.getName()).setIndex(0);
  289.             playerInfo.get(player.getName()).setMenu(0);
  290.             return;
  291.         }
  292.        
  293.         //player pressed the back button
  294.         else if (event.getSlot() == getRight(inv, 0)){
  295.             player.sendMessage("You pressed the back button");
  296.            
  297.             //paint the chest for the main menu
  298.             paintMainMenu(event,0);
  299.             playerInfo.get(player.getName()).setIndex(0);
  300.             playerInfo.get(player.getName()).setMenu(0);
  301.             return;
  302.         }
  303.     }
  304.  
  305.     /**
  306.      * The main menu. Called when an item was clicked in the market
  307.      * @param event the InventoryClickEvent
  308.      * @param item
  309.      */
  310.     public void mainMenu(InventoryClickEvent event){
  311.         Player player = (Player) event.getWhoClicked();
  312.         Inventory inv = event.getInventory();
  313.        
  314.         //click was made in the player's inventory
  315.         if (event.getRawSlot() > event.getSlot()){ 
  316.             return;
  317.         }
  318.        
  319.         //if previous button was pressed
  320.         if (event.getSlot() == getLeft(inv, 0)){
  321.             int index = playerInfo.get(player.getName()).getIndex();
  322.            
  323.             //make sure we are not out of bounds
  324.             if (index == 0){
  325.                 return;
  326.             }
  327.            
  328.             //redraw the chest
  329.             paintMainMenu(event,index - 1);
  330.            
  331.             //reajust the index for the player
  332.             playerInfo.get(player.getName()).setIndex(index - 1);
  333.             return;
  334.         }
  335.         //if next button was pressed
  336.         if (event.getSlot() == getRight(inv, 0)){
  337.             int index = playerInfo.get(player.getName()).getIndex();
  338.            
  339.             //redraw the chest
  340.             paintMainMenu(event,index + 1);
  341.            
  342.             //reajust the index for the player
  343.             playerInfo.get(player.getName()).setIndex(index + 1);
  344.             return;
  345.         }
  346.        
  347.        
  348.         //if sell item button was pressed
  349.         if (event.getSlot() == getRight(inv, 1)){
  350.             //set chest up for item menu
  351.             player.sendMessage("You clicked the sell button");
  352.            
  353.             //paint the sell menu
  354.             paintSellMenu(event, player);
  355.            
  356.             //set the player's menu
  357.             playerInfo.get(player.getName()).setMenu(2);
  358.            
  359.             return;
  360.         }
  361.        
  362.         //if another item was pressed that wasn't air
  363.         if (! event.getCurrentItem().getType().equals(Material.AIR)){
  364.             //paint the buy item
  365.             paintBuyMenu(event, getItemStack(event.getCurrentItem(), null));
  366.            
  367.             //set the player's menu
  368.             playerInfo.get(player.getName()).setMenu(1);
  369.            
  370.             player.sendMessage("You want to buy that item");
  371.             return;
  372.         }
  373.        
  374.         player.sendMessage("You clicked air");
  375.     }
  376.    
  377.     private void stats(InventoryClickEvent event) {
  378.         System.out.println("Cursor: " + event.getCursor().toString());
  379.         System.out.println("Current Item: " + event.getCurrentItem().toString());
  380.     }
  381.  
  382.  
  383.     private void paintSellMenu(InventoryClickEvent event, Player player) {
  384.         Inventory inv = event.getInventory();
  385.        
  386.         //clear inventory
  387.         for (int i = 0; i < inv.getSize(); i++){
  388.             inv.setItem(i, null);
  389.         }
  390.        
  391.         //add menu buttons
  392.         //add sell button
  393.         ItemStack next = new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x5);
  394.         inv.setItem(getRight(inv, 1), next);
  395.        
  396.         //add back button
  397.         inv.setItem(getRight(inv, 0), new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x2));
  398.        
  399.         //add the item if it exists
  400.         if (toSell.containsKey(player.getName())){
  401.             inv.setItem(0, toSell.get(player.getName()));
  402.        
  403.             //add price
  404.             int price = (int) toSell.get(player.getName()).getPrice();
  405.             for (int i = 0; i < 9; i++){
  406.                 int j = 0;
  407.                 while ((price % (java.lang.Math.pow(10, i + 1))) != 0){
  408.                     j++;
  409.                     price -= java.lang.Math.pow(10, i);
  410.                 }
  411.                 //j = 0. make a zero
  412.                 if (j == 0){
  413.                    
  414.                 }
  415.                 //j is not zero. make sticks
  416.                 else{
  417.                     inv.setItem(getRight(inv, 9 + i), new ItemStack(Material.STICK, j));
  418.                 }
  419.             }
  420.         }
  421.     }
  422.  
  423.  
  424.     private void paintBuyMenu(InventoryClickEvent event, MarketItemStack item) {
  425.         Inventory inv = event.getInventory();
  426.        
  427.         //clear inventory
  428.         for (int i = 0; i < inv.getSize(); i++){
  429.             inv.setItem(i, null);
  430.         }
  431.        
  432.         //add item
  433.         inv.setItem(0, item);
  434.        
  435.         //add price
  436.         int price = (int) item.getPrice();
  437.         for (int i = 0; i < 9; i++){
  438.             int j = 0;
  439.             while ((price % (java.lang.Math.pow(10, i + 1))) != 0){
  440.                 j++;
  441.                 price -= java.lang.Math.pow(10, i);
  442.             }
  443.             //j = 0. make a zero
  444.             if (j == 0){
  445.                
  446.             }
  447.             //j is not zero. make sticks
  448.             else{
  449.                 inv.setItem(getRight(inv, 9 + i), new ItemStack(Material.STICK, j));
  450.             }
  451.         }
  452.        
  453.         //add menu buttons
  454.         //add buy button
  455.         ItemStack next = new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x5);
  456.         inv.setItem(getRight(inv, 1), next);
  457.        
  458.         //add back button
  459.         inv.setItem(getRight(inv, 0), new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x2));
  460.     }
  461.  
  462.  
  463.     /**
  464.      * Player buys an item. Item is taken off of the market
  465.      * @param player the player buying the item
  466.      * @param item the item to be bought
  467.      * @param inv the inventory of the market (to be repainted)
  468.      */
  469.     private void buyItem(Player player, MarketItemStack marketItem, InventoryClickEvent event) {
  470.        
  471.         //make sure the item wasn't quickly bought buy someone else
  472.         if (marketItem.hasSold()){
  473.             player.sendMessage("I'm sorry, but this item has already been sold");
  474.             return;
  475.         }
  476.        
  477.         //if the player has room and can afford the item, buy it
  478.         if (! playerHasSpace(player)){
  479.             player.sendMessage("I'm sorry, but you do'nt have enough space.");
  480.             return;
  481.         }
  482.        
  483.         if ((! playerCanAfford(player, marketItem)) && (! player.getName().equals(marketItem.getSeller()))){
  484.             player.sendMessage("You can't afford that.");
  485.             return;
  486.         }
  487.        
  488.         //buy the item
  489.         marketItem.setSold(true);
  490.         player.getInventory().addItem(marketItem);
  491.        
  492.         HomeWorldPlugin.economy.deposit(marketItem.getSeller(), marketItem.getPrice());
  493.         Bukkit.getPlayer(marketItem.getSeller()).sendMessage(player.getName() + " just bought your " + marketItem.toString() + " for $" + marketItem.getPrice());
  494.        
  495.         HomeWorldPlugin.economy.withdraw(player.getName(), marketItem.getPrice());
  496.         player.sendMessage("You have bought: " + marketItem.toString() + " for $" + marketItem.getPrice());
  497.        
  498.         //remove it from the market
  499.         market.remove(marketItem);
  500.        
  501.         //redraw the chest
  502.         paintMainMenu(event,0);
  503.         playerInfo.get(player.getName()).setIndex(0);
  504.     }
  505.  
  506.     /**
  507.      * Returns whether or not a player can afford an item
  508.      * @param player The player
  509.      * @param item The item the player wants to buy
  510.      * @return whether or not a player can afford an item
  511.      */
  512.     private boolean playerCanAfford(Player player, MarketItemStack item) {
  513.         double money = HomeWorldPlugin.economy.getBalance(player.getName());
  514.        
  515.         if (item.isBulk()){
  516.             if (money >= item.getPrice()){
  517.                 return true;
  518.             }
  519.         }
  520.        
  521.         if (money >= (item.getPrice() * item.getAmount())){
  522.             return true;
  523.         }
  524.        
  525.         return false;
  526.     }
  527.  
  528.     /**
  529.      * Returns whether or not a player has an open inventory space
  530.      * @param player The player
  531.      * @return whether or not a player has an open inventory space
  532.      */
  533.     private boolean playerHasSpace(Player player) {
  534.         Inventory inv = player.getInventory();
  535.         for (ItemStack st: inv.getContents()){
  536.             if (st == null){
  537.                 return true;
  538.             }
  539.         }
  540.         return false;
  541.     }
  542.    
  543.     /**
  544.      * paints the chest with items that are currently on the market.
  545.      */
  546.     private void paintMainMenu(InventoryClickEvent event, int index){
  547.         Inventory inv = event.getInventory();
  548.        
  549.         //clear inventory
  550.         for (int i = 0; i < inv.getSize(); i++){
  551.             inv.setItem(i, null);
  552.         }
  553.        
  554.         //add items
  555.         for (int i = index; i < min(market.size(), (inv.getSize() - 9)); i++){
  556.             inv.setItem(i - index, market.get(i));
  557.         }
  558.        
  559.         //add menu buttons
  560.         //add next buttons
  561.         ItemStack next = new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x2);
  562.         inv.setItem(getLeft(inv, 0), next);
  563.         inv.setItem(getRight(inv, 0), next);
  564.        
  565.         //add sell button
  566.         inv.setItem(getRight(inv, 1), new ItemStack(Material.WOOL, 1, (short) 0, (byte) 0x5));
  567.        
  568.     }  
  569.    
  570.     /**
  571.      * Returns a place in the inventory, right-aligned to the offset
  572.      * @param inv the Inventory
  573.      * @param offset the offset after the alignment
  574.      * @return a place in the inventory, right-aligned to the offset
  575.      */
  576.     private int getRight(Inventory inv, int offset){
  577.         return inv.getSize() - 1 - offset;
  578.     }
  579.    
  580.     /**
  581.      * Returns a place in the inventory, left-aligned to the offset
  582.      * @param inv the Inventory
  583.      * @param offset the offset after the alignment
  584.      * @return a place in the inventory, left-aligned
  585.      */
  586.     private int getLeft(Inventory inv, int offset){
  587.         return inv.getSize() - 9 + offset;
  588.     }
  589.    
  590.     /**
  591.      * Returns whether or not a player is inside of the marketplace. TODO: change the area to be a parameter for the object
  592.      * @param player
  593.      * @param inv
  594.      * @return
  595.      */
  596.     private boolean atMarket(Player player){   
  597.         if (player.getLocation().getBlockX() >= 210 && player.getLocation().getBlockX() <= 215){   
  598.             if (player.getLocation().getBlockZ() >= 160 && player.getLocation().getBlockZ() <= 165){
  599.                 return true;
  600.             }
  601.         }
  602.         return false;
  603.     }
  604.    
  605.     private boolean atMarket(PlayerInteractEvent event){   
  606.         if (event.getClickedBlock() == null){
  607.             return false;
  608.         }
  609.        
  610.         if (event.getClickedBlock().getLocation().equals(new Location(Bukkit.getWorld("HomeWorld"), 213, 72, 163))){
  611.             return true;
  612.         }
  613.         return false;
  614.     }
  615.    
  616.     /**
  617.      * Returns the MarketItemStack of the ItemStack at hand
  618.      * @param item the ItemStack at hand
  619.      * @param name
  620.      * @return the MarketItemStack of the ItemStack at hand
  621.      */
  622.     public MarketItemStack getItemStack(ItemStack item, String name){
  623.         if (item == null){
  624.             item = new ItemStack(Material.AIR);
  625.         }
  626.        
  627.         for (MarketItemStack m: market){
  628.             if (item.equals((ItemStack) m)){
  629.                 if (name == null){
  630.                     return m;
  631.                 }
  632.                 if (m.getSeller().equals(name)){
  633.                     return m;
  634.                 }
  635.             }
  636.         }
  637.         return new MarketItemStack(new ItemStack(Material.AIR), name, 0, true, true);
  638.     }
  639.    
  640.     /**
  641.      * returns the minumum of a and b
  642.      * @param a
  643.      * @param b
  644.      * @return
  645.      */
  646.     private int min(int a, int b){
  647.         if (a < b) return a;
  648.         return b;
  649.     }
  650.    
  651.     public void printMarket(){
  652.         for (MarketItemStack m: market){
  653.             System.out.println(m.toString());
  654.         }
  655.     }
  656.    
  657.     private void switchItem(InventoryClickEvent event){
  658.         ItemStack item;
  659.         Player player = (Player) event.getWhoClicked();
  660.         //stop the player from picking up an item
  661.         //left click
  662.         if(event.isLeftClick()){
  663.             item = event.getCursor();
  664.             event.setCursor(event.getCurrentItem());
  665.             event.setCurrentItem(item);
  666.         }
  667.         if(event.isRightClick()){
  668.             item = event.getCursor();
  669.             event.setCursor(event.getCurrentItem());
  670.             event.setCurrentItem(item);
  671.         }
  672.        
  673.     }
  674. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement