Advertisement
JackOUT

Untitled

Jul 13th, 2022
978
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.83 KB | None | 0 0
  1. package games.coob.laserturrets.menu;
  2.  
  3. import games.coob.laserturrets.PlayerCache;
  4. import games.coob.laserturrets.model.PlayerBlacklistPrompt;
  5. import games.coob.laserturrets.model.TurretData;
  6. import games.coob.laserturrets.model.TurretRegistry;
  7. import lombok.Getter;
  8. import lombok.Setter;
  9. import org.bukkit.entity.Player;
  10. import org.bukkit.event.inventory.ClickType;
  11. import org.bukkit.event.inventory.InventoryAction;
  12. import org.bukkit.inventory.Inventory;
  13. import org.bukkit.inventory.ItemStack;
  14. import org.mineacademy.fo.MathUtil;
  15. import org.mineacademy.fo.Messenger;
  16. import org.mineacademy.fo.collection.StrictMap;
  17. import org.mineacademy.fo.menu.Menu;
  18. import org.mineacademy.fo.menu.MenuContainerChances;
  19. import org.mineacademy.fo.menu.MenuPagged;
  20. import org.mineacademy.fo.menu.MenuQuantitable;
  21. import org.mineacademy.fo.menu.button.Button;
  22. import org.mineacademy.fo.menu.button.ButtonConversation;
  23. import org.mineacademy.fo.menu.button.ButtonMenu;
  24. import org.mineacademy.fo.menu.button.StartPosition;
  25. import org.mineacademy.fo.menu.button.annotation.Position;
  26. import org.mineacademy.fo.menu.model.ItemCreator;
  27. import org.mineacademy.fo.menu.model.MenuClickLocation;
  28. import org.mineacademy.fo.menu.model.MenuQuantity;
  29. import org.mineacademy.fo.model.Tuple;
  30. import org.mineacademy.fo.remain.CompMaterial;
  31.  
  32. import java.util.ArrayList;
  33. import java.util.List;
  34.  
  35. public class TurretMenu extends Menu { // TODO create enum for each type of turret to avoid duplicate code
  36.  
  37.     private final PlayerCache cache;
  38.  
  39.     @Position(9 + 2)
  40.     private final Button arrowTurretButton;
  41.  
  42.     @Position(9 + 4)
  43.     private final Button flameTurretButton;
  44.  
  45.     @Position(9 + 6)
  46.     private final Button laserTurretButton;
  47.  
  48.     public TurretMenu(final Player player) {
  49.  
  50.         this.cache = PlayerCache.from(player);
  51.  
  52.         this.setTitle("Turret Menu");
  53.         this.setSize(9 * 4);
  54.         this.setSlotNumbersVisible();
  55.         this.setViewer(player);
  56.  
  57.         this.arrowTurretButton = new ButtonMenu(new ArrowTurretsMenu(player), CompMaterial.ARROW,
  58.                 "Arrow Turret Menu",
  59.                 "",
  60.                 "Open this menu to edit",
  61.                 "arrow turret settings.");
  62.  
  63.         this.flameTurretButton = new ButtonMenu(new ArrowTurretsMenu(player), CompMaterial.ARROW,
  64.                 "Arrow Turret Menu",
  65.                 "",
  66.                 "Open this menu to edit",
  67.                 "arrow turret settings.");
  68.  
  69.         this.laserTurretButton = new ButtonMenu(new ArrowTurretsMenu(player), CompMaterial.ARROW,
  70.                 "Arrow Turret Menu",
  71.                 "",
  72.                 "Open this menu to edit",
  73.                 "arrow turret settings.");
  74.     }
  75.  
  76.     @Override
  77.     protected String[] getInfo() {
  78.         return new String[]{
  79.                 "In this menu, you can select",
  80.                 "a turret type to view them",
  81.                 "and you can also edit each",
  82.                 "individual turret."
  83.         };
  84.     }
  85.  
  86.     @Override
  87.     public ItemStack getItemAt(final int slot) {
  88.         return NO_ITEM;
  89.     }
  90.  
  91.     @Override
  92.     public Menu newInstance() {
  93.         return new TurretMenu(this.getViewer());
  94.     }
  95.  
  96.     private class ArrowTurretsMenu extends MenuPagged<TurretData> {
  97.  
  98.  
  99.         @Position(2)
  100.         private final Button levelEditButton;
  101.  
  102.         @Position(4)
  103.         private final Button playerBlacklistButton;
  104.  
  105.         @Position(6)
  106.         private final Button lootButton;
  107.  
  108.         @Position(8)
  109.         private final Button teleportButton;
  110.  
  111.         ArrowTurretsMenu(final Player player) {
  112.             super(9 * 3, TurretMenu.this, new ArrayList<>(TurretRegistry.getInstance().getArrowTurrets()));
  113.  
  114.             this.setTitle("Arrow Turrets");
  115.  
  116.             this.levelEditButton = new ButtonMenu(new TurretLevelMenu(player), CompMaterial.EXPERIENCE_BOTTLE,
  117.                     "Level Menu",
  118.                     "",
  119.                     "Open this menu to upgrade",
  120.                     "or downgrade the turret.");
  121.  
  122.             this.playerBlacklistButton = new ButtonConversation(new PlayerBlacklistPrompt(), CompMaterial.KNOWLEDGE_BOOK,
  123.                     "Player Blacklist",
  124.                     "",
  125.                     "Click to add or remove",
  126.                     "players from the blacklist",
  127.                     "to prevent the turret from",
  128.                     "targeting specific players.");
  129.  
  130.             this.lootButton = new ButtonMenu(new TurretLootChancesMenu(player), CompMaterial.CHEST,
  131.                     "Turret Loot",
  132.                     "",
  133.                     "Open this menu to edit",
  134.                     "the loot players get when",
  135.                     "they destroy a turret.",
  136.                     "You can also edit the drop",
  137.                     "chance.");
  138.  
  139.             this.teleportButton = Button.makeSimple(CompMaterial.ENDER_EYE, "Teleport", "Teleport to the turret/nto visit it.", player1 -> {
  140.                 player1.teleport(cache.getSelectedTurret().getLocation());
  141.  
  142.                 Messenger.success(player1, "You have successfully teleported to the arrow turret with the id of &2" + cache.getSelectedTurret().getId());
  143.             });
  144.         }
  145.  
  146.         @Override
  147.         protected ItemStack convertToItemStack(final TurretData turretData) {
  148.             return ItemCreator.of(turretData.getMaterial()).name("&0Arrow Turret &7" + turretData.getId()).make();
  149.         }
  150.  
  151.         @Override
  152.         protected void onPageClick(final Player player, final TurretData turretData, final ClickType clickType) {
  153.             cache.setSelectedTurret(turretData);
  154.         }
  155.  
  156.         @Override
  157.         protected void onMenuClose(final Player player, final Inventory inventory) {
  158.             cache.setSelectedTurret(null);
  159.             System.out.println("closed menu turret");
  160.         }
  161.  
  162.         @Override
  163.         protected String[] getInfo() {
  164.             return new String[]{
  165.                     "Select an arrow turret",
  166.                     "to edit its settings."
  167.             };
  168.         }
  169.     }
  170.  
  171.     private class TurretLevelMenu extends Menu implements MenuQuantitable {
  172.  
  173.         @Getter
  174.         @Setter
  175.         private MenuQuantity quantity = MenuQuantity.ONE;
  176.  
  177.         @Position(start = StartPosition.CENTER)
  178.         private final Button levelButton;
  179.  
  180.         TurretLevelMenu(final Player player) {
  181.             super(ArrowTurretsMenu.getMenu(player));
  182.  
  183.             this.setTitle("Turret Level");
  184.             this.setSize(27);
  185.             this.setViewer(player);
  186.  
  187.             this.levelButton = Button.makeDummy(ItemCreator.of(CompMaterial.EXPERIENCE_BOTTLE)
  188.                     .amount(cache.getSelectedTurret().getLevel() > 0 ? cache.getSelectedTurret().getLevel() : 1));
  189.         }
  190.  
  191.         @Override
  192.         protected void onButtonClick(final Player player, final int slot, final InventoryAction action, final ClickType click, final Button button) {
  193.             if (button.equals(levelButton)) {
  194.                 final int nextLevel = (int) MathUtil.range(cache.getSelectedTurret().getLevel() + this.getNextQuantityPercent(click), 1, 3);
  195.  
  196.                 cache.getSelectedTurret().setLevel(nextLevel);
  197.             }
  198.         }
  199.     }
  200.  
  201.     private class TurretLootChancesMenu extends MenuContainerChances {
  202.  
  203.         TurretLootChancesMenu(final Player player) {
  204.             super(ArrowTurretsMenu.getMenu(player));
  205.  
  206.             this.setTitle("Place turret loot here");
  207.         }
  208.  
  209.         @Override
  210.         protected boolean canEditItem(final MenuClickLocation location, final int slot, final ItemStack clicked, final ItemStack cursor, final InventoryAction action) {
  211.             final ItemStack placedItem = clicked != null && !CompMaterial.isAir(clicked) ? clicked : cursor;
  212.  
  213.             if (placedItem != null && !CompMaterial.isAir(placedItem)) {
  214.                 if (placedItem.getAmount() > 1 && action != InventoryAction.PLACE_ONE) {
  215.                     this.animateTitle("&4Amount must be 1!");
  216.  
  217.                     return false;
  218.                 }
  219.             }
  220.  
  221.             return true;
  222.         }
  223.  
  224.         @Override
  225.         protected ItemStack getDropAt(final int slot) {
  226.             final Tuple<ItemStack, Double> tuple = this.getTuple(slot);
  227.  
  228.             return tuple != null ? tuple.getKey() : NO_ITEM;
  229.         }
  230.  
  231.         @Override
  232.         protected double getDropChance(final int slot) {
  233.             final Tuple<ItemStack, Double> tuple = this.getTuple(slot);
  234.  
  235.             return tuple != null ? tuple.getValue() : 0;
  236.         }
  237.  
  238.         private Tuple<ItemStack, Double> getTuple(final int slot) {
  239.             final TurretRegistry registry = TurretRegistry.getInstance();
  240.             final List<Tuple<ItemStack, Double>> items = registry.getTurretLootChances(this.getViewer());
  241.  
  242.             return slot < items.size() ? items.get(slot) : null;
  243.         }
  244.  
  245.         @Override
  246.         protected void onMenuClose(final StrictMap<Integer, Tuple<ItemStack, Double>> items) {
  247.             final TurretRegistry registry = TurretRegistry.getInstance();
  248.  
  249.             registry.setTurretLootChances(cache.getSelectedTurret(), new ArrayList<>(items.values()));
  250.         }
  251.  
  252.         @Override
  253.         public boolean allowDecimalQuantities() {
  254.             return true;
  255.         }
  256.     }
  257. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement