JackOUT

Untitled

Aug 29th, 2022
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.54 KB | None | 0 0
  1. package games.coob.laserturrets.menu;
  2.  
  3. import games.coob.laserturrets.model.TurretData;
  4. import games.coob.laserturrets.model.TurretRegistry;
  5. import games.coob.laserturrets.settings.Settings;
  6. import games.coob.laserturrets.util.StringUtil;
  7. import lombok.RequiredArgsConstructor;
  8. import org.bukkit.conversations.ConversationContext;
  9. import org.bukkit.conversations.Prompt;
  10. import org.bukkit.entity.Player;
  11. import org.bukkit.event.inventory.ClickType;
  12. import org.bukkit.event.inventory.InventoryAction;
  13. import org.bukkit.inventory.Inventory;
  14. import org.bukkit.inventory.ItemStack;
  15. import org.jetbrains.annotations.NotNull;
  16. import org.mineacademy.fo.Common;
  17. import org.mineacademy.fo.Messenger;
  18. import org.mineacademy.fo.collection.StrictMap;
  19. import org.mineacademy.fo.conversation.SimplePrompt;
  20. import org.mineacademy.fo.menu.Menu;
  21. import org.mineacademy.fo.menu.MenuContainerChances;
  22. import org.mineacademy.fo.menu.MenuPagged;
  23. import org.mineacademy.fo.menu.button.Button;
  24. import org.mineacademy.fo.menu.button.ButtonConversation;
  25. import org.mineacademy.fo.menu.button.ButtonMenu;
  26. import org.mineacademy.fo.menu.button.annotation.Position;
  27. import org.mineacademy.fo.menu.model.ItemCreator;
  28. import org.mineacademy.fo.menu.model.MenuClickLocation;
  29. import org.mineacademy.fo.model.RangedValue;
  30. import org.mineacademy.fo.model.Tuple;
  31. import org.mineacademy.fo.remain.CompMaterial;
  32.  
  33. import java.util.ArrayList;
  34. import java.util.List;
  35. import java.util.Set;
  36.  
  37. public class TurretsMenu extends MenuPagged<TurretData> {
  38.  
  39.     private TurretType turretType;
  40.  
  41.     private TurretData turretData;
  42.  
  43.     private final Button changeTypeButton;
  44.  
  45.     private final Button settingsButton;
  46.  
  47.     private TurretsMenu(final Player player, final TurretType turretType) {
  48.         super(9 * 4, compileTurrets(turretType));
  49.  
  50.         this.turretType = turretType;
  51.  
  52.         this.setTitle(turretType.typeName + " Turrets");
  53.         this.setSize(9 * 3);
  54.         this.setViewer(player);
  55.  
  56.         this.changeTypeButton = new ButtonConversation(new EditMenuTypePrompt(),
  57.                 ItemCreator.of(CompMaterial.BEACON, "Change View Type",
  58.                         "Click this button to view",
  59.                         "turrets of a different type."));
  60.  
  61.         this.settingsButton = new ButtonMenu(new SettingsMenu(this, player), CompMaterial.ANVIL, "Settings",
  62.                 "Click this button to edit",
  63.                 "your turret settings for a",
  64.                 "specific type.");
  65.     }
  66.  
  67.     @Override
  68.     protected String[] getInfo() {
  69.         return new String[]{
  70.                 "In this menu, you can",
  71.                 "view all turrets of a",
  72.                 "specific type. You can",
  73.                 "also edit each individual",
  74.                 "turret by clicking them."
  75.         };
  76.     }
  77.  
  78.     private static List<TurretData> compileTurrets(final TurretType viewMode) {
  79.         return new ArrayList<>(viewMode.turretTypeList);
  80.     }
  81.  
  82.     @Override
  83.     protected ItemStack convertToItemStack(final TurretData turretData) {
  84.         final int level = turretData.getCurrentLevel();
  85.         final String id = turretData.getId();
  86.         final String type = StringUtil.capitalize(turretData.getType());
  87.         final List<String> lore = new ArrayList<>();
  88.  
  89.         lore.add("Level: " + level);
  90.         lore.add("Type: " + type);
  91.         lore.add("");
  92.         lore.add("Click to edit this turret");
  93.  
  94.         if (this.turretType.typeName.equals("All"))
  95.             return ItemCreator.of(turretData.getMaterial()).name("&b" + type + " Turret &8" + id).lore(lore).makeMenuTool();
  96.         else if (type.equalsIgnoreCase(this.turretType.typeName))
  97.             return ItemCreator.of(turretData.getMaterial()).name("&f" + type + " Turret &7" + id).lore(lore).makeMenuTool();
  98.  
  99.         return NO_ITEM;
  100.     }
  101.  
  102.     @Override
  103.     protected void onPageClick(final Player player, final TurretData turretData, final ClickType clickType) {
  104.         this.newInstance().displayTo(player);
  105.         this.turretData = turretData;
  106.         Common.runLater(() -> new TurretEditMenu(this).displayTo(player));
  107.     }
  108.  
  109.     @Override
  110.     public ItemStack getItemAt(final int slot) {
  111.         if (slot == getSize() - 1)
  112.             return changeTypeButton.getItem();
  113.         if (slot == getBottomCenterSlot())
  114.             return settingsButton.getItem();
  115.  
  116.         return super.getItemAt(slot);
  117.     }
  118.  
  119.     @Override
  120.     public Menu newInstance() {
  121.         return new TurretsMenu(this.getViewer(), this.turretType);
  122.     }
  123.  
  124.     /**
  125.      * The prompt to give a new kit a name
  126.      */
  127.     private final class EditMenuTypePrompt extends SimplePrompt {
  128.  
  129.         private EditMenuTypePrompt() {
  130.             super(true);
  131.         }
  132.  
  133.         @Override
  134.         protected String getPrompt(final ConversationContext ctx) {
  135.             return "&6Enter one of the following turret types (all, arrow, fireball, beam)";
  136.         }
  137.  
  138.         @Override
  139.         protected boolean isInputValid(final ConversationContext context, final String input) {
  140.             return input.equals("all") || input.equals("arrow") || input.equals("fireball") || input.equals("beam");
  141.         }
  142.  
  143.         @Override
  144.         protected String getFailedValidationText(final ConversationContext context, final String invalidInput) {
  145.             return "Type " + invalidInput + " does not exist, choose one of the following (all, arrow, fireball, beam).";
  146.         }
  147.  
  148.         @Override
  149.         protected Prompt acceptValidatedInput(@NotNull final ConversationContext context, @NotNull final String input) {
  150.             turretType = TurretType.valueOf(input.toUpperCase());
  151.  
  152.             return Prompt.END_OF_CONVERSATION;
  153.         }
  154.     }
  155.  
  156.     private final class TurretEditMenu extends Menu {
  157.  
  158.         @Position(11)
  159.         private final Button levelEditButton;
  160.  
  161.         @Position(13)
  162.         private final Button blacklistButton;
  163.  
  164.         @Position(15)
  165.         private final Button teleportButton;
  166.  
  167.         TurretEditMenu(final Menu parent) {
  168.             super(parent);
  169.  
  170.             this.setSize(9 * 4);
  171.             this.setTitle(turretType.typeName + " Turrets");
  172.  
  173.  
  174.             this.levelEditButton = new ButtonMenu(new LevelMenu(turretData.getCurrentLevel()), CompMaterial.EXPERIENCE_BOTTLE,
  175.                     "Level Menu",
  176.                     "Open this menu to upgrade",
  177.                     "or downgrade the turret.");
  178.  
  179.             this.blacklistButton = new ButtonMenu(new BlacklistMenu(TurretEditMenu.this, turretData, this.getViewer()), CompMaterial.KNOWLEDGE_BOOK,
  180.                     "Turret Blacklist",
  181.                     "Click this button to edit",
  182.                     "your turrets blacklist.");
  183.  
  184.             this.teleportButton = Button.makeSimple(CompMaterial.ENDER_EYE, "Teleport", "Click to visit turret", player1 -> {
  185.                 player1.teleport(turretData.getLocation());
  186.  
  187.                 Messenger.success(player1, "&aYou have successfully teleported to the " + turretData.getType() + " turret with the id of &2" + turretData.getId() + "&a.");
  188.             });
  189.         }
  190.  
  191.         @Override
  192.         protected void onMenuClose(final Player player, final Inventory inventory) {
  193.             this.restartMenu();
  194.         }
  195.  
  196.         @Override
  197.         protected String[] getInfo() {
  198.             return new String[]{
  199.                     "Edit this turrets settings."
  200.             };
  201.         }
  202.  
  203.         @Override
  204.         public Menu newInstance() {
  205.             return new TurretEditMenu(getParent());
  206.         }
  207.  
  208.         private class LevelMenu extends Menu {
  209.  
  210.             private final int turretLevel;
  211.  
  212.             private final TurretData.TurretLevel level;
  213.  
  214.             @Position(10)
  215.             private final Button rangeButton;
  216.  
  217.             @Position(12)
  218.             private final Button laserEnabledButton;
  219.  
  220.             @Position(14)
  221.             private final Button laserDamageButton;
  222.  
  223.             @Position(16)
  224.             private final Button lootButton;
  225.  
  226.             @Position(30)
  227.             private final Button previousLevelButton;
  228.  
  229.             @Position(32)
  230.             private final Button nextLevelButton;
  231.  
  232.             @Position(31)
  233.             private final Button priceButton;
  234.  
  235.             public LevelMenu(final int turretLevel) {
  236.                 super(TurretEditMenu.this);
  237.  
  238.                 final boolean nextLevelExists = turretLevel < turretData.getLevels() || turretData.getLevels() == 0;
  239.                 final TurretRegistry registry = TurretRegistry.getInstance();
  240.  
  241.                 this.turretLevel = turretLevel;
  242.                 this.level = getOrMakeLevel(turretLevel);
  243.  
  244.                 this.setTitle("Turret Level " + turretLevel);
  245.                 this.setSize(9 * 4);
  246.  
  247.                 this.rangeButton = Button.makeIntegerPrompt(ItemCreator.of(CompMaterial.BOW).name("Turret Range")
  248.                                 .lore("Set the turrets range", "by clicking this button.", "", "Current: &9" + turretData.getLevel(turretLevel).getRange()),
  249.                         "Type in an integer value between 1 and 40 (recommend value : 15-20)",
  250.                         new RangedValue(1, 40), () -> turretData.getLevel(turretLevel).getRange(), (Integer input) -> registry.setRange(turretData, turretLevel, input));
  251.  
  252.  
  253.                 this.laserEnabledButton = new Button() {
  254.                     @Override
  255.                     public void onClickedInMenu(final Player player, final Menu menu, final ClickType clickType) {
  256.                         final TurretRegistry registry = TurretRegistry.getInstance();
  257.                         final boolean isEnabled = turretData.getLevel(turretLevel).isLaserEnabled();
  258.  
  259.                         registry.setLaserEnabled(turretData, turretLevel, !isEnabled);
  260.                         restartMenu((isEnabled ? "&cDisabled" : "&aEnabled") + " laser pointer");
  261.                     }
  262.  
  263.                     @Override
  264.                     public ItemStack getItem() {
  265.                         final boolean isEnabled = turretData.getLevel(turretLevel).isLaserEnabled();
  266.  
  267.                         return ItemCreator.of(isEnabled ? CompMaterial.GREEN_WOOL : CompMaterial.RED_WOOL, "Enabled/Disable Laser",
  268.                                 "Current: " + (isEnabled ? "&atrue" : "&cfalse"),
  269.                                 "",
  270.                                 "Click to enable or disable",
  271.                                 "lasers for this turret.").make();
  272.                     }
  273.                 };
  274.  
  275.                 this.laserDamageButton = Button.makeDecimalPrompt(ItemCreator.of(CompMaterial.BLAZE_POWDER).name("Laser Damage")
  276.                                 .lore("Set the amount of damage", "lasers deal if they're enabled", "by clicking this button.", "", "Current: &9" + turretData.getLevel(turretLevel).getLaserDamage()),
  277.                         "Type in an integer value between 1 and 40 (recommended value: 15-20)",
  278.                         new RangedValue(1, 40), () -> turretData.getLevel(turretLevel).getLaserDamage(), (Double input) -> registry.setLaserDamage(turretData, turretLevel, input));
  279.  
  280.                 this.lootButton = new ButtonMenu(new LevelMenu.TurretLootChancesMenu(), CompMaterial.CHEST,
  281.                         "Turret Loot",
  282.                         "Open this menu to edit",
  283.                         "the loot players get when",
  284.                         "they destroy a turret.",
  285.                         "You can also edit the drop",
  286.                         "chance.");
  287.  
  288.                 this.previousLevelButton = new Button() {
  289.  
  290.                     final boolean aboveFirstLevel = turretLevel > 1;
  291.  
  292.                     @Override
  293.                     public void onClickedInMenu(final Player player, final Menu menu, final ClickType clickType) {
  294.                         if (aboveFirstLevel)
  295.                             new LevelMenu(turretLevel - 1).displayTo(player);
  296.                     }
  297.  
  298.                     @Override
  299.                     public ItemStack getItem() {
  300.                         return ItemCreator
  301.                                 .of(aboveFirstLevel ? CompMaterial.LIME_DYE : CompMaterial.GRAY_DYE,
  302.                                         aboveFirstLevel ? "Edit previous level" : "This is the first level").make();
  303.                     }
  304.                 };
  305.  
  306.                 this.nextLevelButton = new Button() {
  307.  
  308.                     @Override
  309.                     public void onClickedInMenu(final Player player, final Menu menu, final ClickType clickType) {
  310.                         final Menu nextLevelMenu;
  311.  
  312.                         if (!nextLevelExists)
  313.                             TurretRegistry.getInstance().createLevel(turretData);
  314.  
  315.                         nextLevelMenu = new LevelMenu(turretLevel + 1);
  316.                         nextLevelMenu.displayTo(player);
  317.                     }
  318.  
  319.                     @Override
  320.                     public ItemStack getItem() {
  321.                         return ItemCreator
  322.                                 .of(nextLevelExists ? CompMaterial.LIME_DYE : CompMaterial.PURPLE_DYE,
  323.                                         nextLevelExists ? "Edit next level" : "Create a new level").make();
  324.                     }
  325.                 };
  326.  
  327.                 this.priceButton = Button.makeDecimalPrompt(ItemCreator.of(
  328.                                 CompMaterial.SUNFLOWER,
  329.                                 "Edit Price",
  330.                                 "Current: " + this.level.getPrice() + " coins",
  331.                                 "",
  332.                                 "Edit the price for",
  333.                                 "this level."), "Enter the price for this level. (Current: " + this.level.getPrice() + " " + Settings.CurrencySection.CURRENCY_NAME + ")",
  334.                         this.getTitle(), RangedValue.parse("0-100000"), () -> turretData.getLevel(turretLevel).getPrice(), (Double input) -> registry.setLevelPrice(turretData, turretLevel, input));
  335.             }
  336.  
  337.             private TurretData.TurretLevel getOrMakeLevel(final int turretLevel) {
  338.                 TurretData.TurretLevel level = turretData.getLevel(turretLevel);
  339.  
  340.                 if (level == null)
  341.                     level = turretData.addLevel();
  342.  
  343.                 return level;
  344.             }
  345.  
  346.             @Override
  347.             protected String[] getInfo() {
  348.                 return new String[]{
  349.                         "You can edit each individual",
  350.                         "level in this menu and set its",
  351.                         "price."
  352.                 };
  353.             }
  354.  
  355.             @Override
  356.             protected void onMenuClose(final Player player, final Inventory inventory) {
  357.                 this.restartMenu();
  358.             }
  359.  
  360.             @Override
  361.             public Menu newInstance() {
  362.                 return new LevelMenu(turretLevel);
  363.             }
  364.  
  365.             private class TurretLootChancesMenu extends MenuContainerChances {
  366.  
  367.                 TurretLootChancesMenu() {
  368.                     super(LevelMenu.this);
  369.  
  370.                     this.setTitle("Place turret loot here");
  371.                 }
  372.  
  373.                 @Override
  374.                 protected boolean canEditItem(final MenuClickLocation location, final int slot, final ItemStack clicked, final ItemStack cursor, final InventoryAction action) {
  375.                     return true;
  376.                 }
  377.  
  378.                 @Override
  379.                 protected ItemStack getDropAt(final int slot) {
  380.                     final Tuple<ItemStack, Double> tuple = this.getTuple(slot);
  381.                     return tuple != null ? tuple.getKey() : NO_ITEM;
  382.                 }
  383.  
  384.                 @Override
  385.                 protected double getDropChance(final int slot) {
  386.                     final Tuple<ItemStack, Double> tuple = this.getTuple(slot);
  387.  
  388.                     return tuple != null ? tuple.getValue() : 0;
  389.                 }
  390.  
  391.                 private Tuple<ItemStack, Double> getTuple(final int slot) {
  392.                     final TurretRegistry registry = TurretRegistry.getInstance();
  393.                     final List<Tuple<ItemStack, Double>> items = registry.getTurretLootChances(turretData, turretLevel);
  394.  
  395.                     return slot < items.size() ? items.get(slot) : null;
  396.                 }
  397.  
  398.                 @Override
  399.                 protected void onMenuClose(final StrictMap<Integer, Tuple<ItemStack, Double>> items) {
  400.                     final TurretRegistry registry = TurretRegistry.getInstance();
  401.  
  402.                     registry.setTurretLootChances(turretData, turretLevel, new ArrayList<>(items.values()));
  403.                 }
  404.  
  405.                 @Override
  406.                 public boolean allowDecimalQuantities() {
  407.                     return true;
  408.                 }
  409.             }
  410.         }
  411.     }
  412.  
  413.     /*private final class ValidateMenu extends Menu {
  414.  
  415.     }*/ // TODO
  416.  
  417.     @RequiredArgsConstructor
  418.     private enum TurretType {
  419.         ALL("All", TurretRegistry.getInstance().getRegisteredTurrets()),
  420.         ARROW("Arrow", TurretRegistry.getInstance().getArrowTurrets()),
  421.         FIREBALL("Fireball", TurretRegistry.getInstance().getFireballTurrets()),
  422.         BEAM("Beam", TurretRegistry.getInstance().getBeamTurrets());
  423.  
  424.         private final String typeName;
  425.         private final Set<TurretData> turretTypeList;
  426.     }
  427.  
  428.     public static void openAllTurretsSelectionMenu(final Player player) {
  429.         new TurretsMenu(player, TurretType.ALL).displayTo(player);
  430.     }
  431.  
  432.     public static void openArrowTurretsSelectionMenu(final Player player) {
  433.         new TurretsMenu(player, TurretType.ARROW).displayTo(player);
  434.     }
  435.  
  436.     public static void openFireballTurretsSelectionMenu(final Player player) {
  437.         new TurretsMenu(player, TurretType.FIREBALL).displayTo(player);
  438.     }
  439.  
  440.     public static void openBeamTurretsSelectionMenu(final Player player) {
  441.         new TurretsMenu(player, TurretType.BEAM).displayTo(player);
  442.     }
  443. }
Add Comment
Please, Sign In to add comment