JackOUT

Untitled

Mar 11th, 2023
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 17.42 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.Lang;
  7. import games.coob.laserturrets.util.TurretUtil;
  8. import lombok.RequiredArgsConstructor;
  9. import org.bukkit.conversations.ConversationContext;
  10. import org.bukkit.conversations.Prompt;
  11. import org.bukkit.entity.Player;
  12. import org.bukkit.event.inventory.ClickType;
  13. import org.bukkit.event.inventory.InventoryAction;
  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> { // TODO fix pagged menu
  38.  
  39.     private TurretType turretType;
  40.  
  41.     private TurretData turretData;
  42.  
  43.     private final Player player;
  44.  
  45.     private final Button changeTypeButton;
  46.  
  47.     private final Button settingsButton;
  48.  
  49.     private TurretsMenu(final Player player, final TurretType turretType) {
  50.         super(9 * 4, null, compileTurrets(turretType), true);
  51.  
  52.         this.turretType = turretType;
  53.         this.player = player;
  54.  
  55.         this.setTitle(Lang.of("Turrets_Menu.Menu_Title", "{turretType}", TurretUtil.capitalizeWord(TurretUtil.getDisplayName(turretType.typeName))));
  56.  
  57.         this.changeTypeButton = new ButtonConversation(new EditMenuTypePrompt(),
  58.                 ItemCreator.of(CompMaterial.BEACON, Lang.of("Turrets_Menu.Change_Turret_Type_Button_Title"),
  59.                         Lang.ofArray("Turrets_Menu.Change_Turret_Type_Button_Lore")));
  60.  
  61.         this.settingsButton = new ButtonMenu(new SettingsMenu(this, player), CompMaterial.ANVIL, Lang.of("Turrets_Menu.Settings_Button_Title"),
  62.                 Lang.ofArray("Turrets_Menu.Settings_Button_Lore"));
  63.     }
  64.  
  65.     @Override
  66.     protected String[] getInfo() {
  67.         return Lang.ofArray("Turrets_Menu.Info_Button");
  68.     }
  69.  
  70.     private static List<TurretData> compileTurrets(final TurretType viewMode) {
  71.         return new ArrayList<>(viewMode.turretTypeList);
  72.     }
  73.  
  74.     @Override
  75.     protected ItemStack convertToItemStack(final TurretData turretData) {
  76.         final int level = turretData.getCurrentLevel();
  77.         final String id = turretData.getId();
  78.         final String type = TurretUtil.capitalizeWord(TurretUtil.getDisplayName(turretData.getType()));
  79.         final String[] lore = Lang.ofArray("Turrets_Menu.Turrets_Lore", "{level}", level, "{turretType}", type);
  80.  
  81.         if (this.turretType.typeName.equalsIgnoreCase("all"))
  82.             return ItemCreator.of(turretData.getMaterial()).name(Lang.of("Turrets_Menu.Turrets_Title", "{turretType}", type, "{turretId}", id)).lore(lore).makeMenuTool();
  83.         else if (type.equalsIgnoreCase(this.turretType.typeName))
  84.             return ItemCreator.of(turretData.getMaterial()).name(Lang.of("Turrets_Menu.Turrets_Title", "{turretType}", type, "{turretId}", id)).lore(lore).makeMenuTool();
  85.  
  86.         return NO_ITEM;
  87.     }
  88.  
  89.     @Override
  90.     protected void onPageClick(final Player player, final TurretData turretData, final ClickType clickType) {
  91.         this.newInstance().displayTo(player);
  92.         this.turretData = turretData;
  93.         Common.runLater(() -> new TurretEditMenu(this).displayTo(player));
  94.     }
  95.  
  96.     @Override
  97.     public ItemStack getItemAt(final int slot) {
  98.         if (slot == getSize() - 2)
  99.             return changeTypeButton.getItem();
  100.         if (slot == getBottomCenterSlot())
  101.             return settingsButton.getItem();
  102.  
  103.         return super.getItemAt(slot);
  104.     }
  105.  
  106.     @Override
  107.     public Menu newInstance() {
  108.         return new TurretsMenu(this.player, this.turretType);
  109.     }
  110.  
  111.     private final class EditMenuTypePrompt extends SimplePrompt {
  112.  
  113.         private EditMenuTypePrompt() {
  114.             super(true);
  115.         }
  116.  
  117.         @Override
  118.         protected String getPrompt(final ConversationContext ctx) {
  119.             return Lang.of("Turrets_Menu.Edit_Turret_View_Type_Prompt_Message");
  120.         }
  121.  
  122.         @Override
  123.         protected boolean isInputValid(final ConversationContext context, final String input) {
  124.             return input.equals("all") || input.equals("arrow") || input.equals("fireball") || input.equals("beam");
  125.         }
  126.  
  127.         @Override
  128.         protected String getFailedValidationText(final ConversationContext context, final String invalidInput) {
  129.             return Lang.of("Turrets_Menu.Edit_Turret_View_Type_Prompt_Invalid_Text", "{invalidType}", invalidInput);
  130.         }
  131.  
  132.         @Override
  133.         protected Prompt acceptValidatedInput(@NotNull final ConversationContext context, @NotNull final String input) {
  134.             turretType = TurretType.valueOf(input.toUpperCase());
  135.  
  136.             return Prompt.END_OF_CONVERSATION;
  137.         }
  138.     }
  139.  
  140.     private final class TurretEditMenu extends Menu {
  141.  
  142.         @Position(11)
  143.         private final Button levelEditButton;
  144.  
  145.         @Position(13)
  146.         private final Button blacklistButton;
  147.  
  148.         @Position(15)
  149.         private final Button teleportButton;
  150.  
  151.         @Position(31)
  152.         private final Button removeTurret;
  153.  
  154.         TurretEditMenu(final Menu parent) {
  155.             super(parent, true);
  156.  
  157.             this.setSize(9 * 4);
  158.             this.setTitle(Lang.of("Turrets_Menu.Turret_Edit_Menu_Title", "{turretType}", TurretUtil.capitalizeWord(TurretUtil.getDisplayName(turretData.getType())), "{turretId}", turretData.getId()));
  159.  
  160.             this.levelEditButton = new ButtonMenu(new LevelMenu(turretData.getCurrentLevel()), CompMaterial.EXPERIENCE_BOTTLE,
  161.                     Lang.of("Turrets_Menu.Level_Edit_Button_Title"),
  162.                     Lang.ofArray("Turrets_Menu.Level_Edit_Button_Lore"));
  163.  
  164.             this.blacklistButton = new ButtonMenu(new AlliesMenu(TurretEditMenu.this, turretData, player), CompMaterial.KNOWLEDGE_BOOK,
  165.                     Lang.of("Turrets_Menu.Allies_Button_Title"),
  166.                     Lang.ofArray("Turrets_Menu.Allies_Button_Lore"));
  167.  
  168.             this.teleportButton = Button.makeSimple(CompMaterial.ENDER_EYE, Lang.of("Turrets_Menu.Teleport_Button_Title"),
  169.                     Lang.of("Turrets_Menu.Teleport_Button_Lore"), player1 -> {
  170.                         player1.teleport(turretData.getLocation());
  171.  
  172.                         Messenger.success(player1, Lang.of("Turrets_Menu.Teleport_Success_Message", "{turretType}", TurretUtil.getDisplayName(turretData.getType()), "{turretId}", turretData.getId()));
  173.                     });
  174.  
  175.             this.removeTurret = Button.makeSimple(CompMaterial.BARRIER, Lang.of("Turrets_Menu.Remove_Turret_Button_Title"), Lang.of("Turrets_Menu.Remove_Turret_Button_Lore"), player1 -> {
  176.                 final TurretRegistry registry = TurretRegistry.getInstance();
  177.  
  178.                 registry.unregister(turretData);
  179.  
  180.                 final Menu previousMenu = new TurretsMenu(player1, turretType);
  181.  
  182.                 previousMenu.displayTo(player1);
  183.                 Common.runLater(() -> previousMenu.restartMenu(Lang.of("Turrets_Menu.Remove_Turret_Animated_Message", "{turretType}", TurretUtil.getDisplayName(turretData.getType()), "{turretId}", turretData.getId())));
  184.             });
  185.         }
  186.  
  187.         @Override
  188.         protected String[] getInfo() {
  189.             return Lang.ofArray("Turrets_Menu.Turret_Edit_Menu_Info_Button", "{turretType}", TurretUtil.getDisplayName(turretData.getType()), "{turretId}", turretData.getId());
  190.         }
  191.  
  192.         @Override
  193.         public Menu newInstance() {
  194.             return new TurretEditMenu(getParent());
  195.         }
  196.  
  197.         private class LevelMenu extends Menu {
  198.  
  199.             private final int turretLevel;
  200.  
  201.             private final TurretData.TurretLevel level;
  202.  
  203.             @Position(11)
  204.             private final Button rangeButton;
  205.  
  206.             @Position(13)
  207.             private final Button laserEnabledButton;
  208.  
  209.             @Position(15)
  210.             private final Button laserDamageButton;
  211.  
  212.             @Position(21)
  213.             private final Button lootButton;
  214.  
  215.             @Position(23)
  216.             private final Button healthButton;
  217.  
  218.             @Position(39)
  219.             private final Button previousLevelButton;
  220.  
  221.             @Position(41)
  222.             private final Button nextLevelButton;
  223.  
  224.             private final Button removeLevelButton;
  225.  
  226.             @Position(40)
  227.             private final Button priceButton;
  228.  
  229.             public LevelMenu(final int turretLevel) {
  230.                 super(TurretEditMenu.this, true);
  231.  
  232.                 final boolean nextLevelExists = turretLevel < turretData.getLevels() || turretData.getLevels() == 0;
  233.                 final TurretRegistry registry = TurretRegistry.getInstance();
  234.  
  235.                 this.turretLevel = turretLevel;
  236.                 this.level = getOrMakeLevel(turretLevel);
  237.  
  238.                 this.setTitle(Lang.of("Turrets_Menu.Level_Menu_Title", "{level}", turretLevel));
  239.                 this.setSize(9 * 5);
  240.  
  241.                 this.rangeButton = Button.makeIntegerPrompt(ItemCreator.of(CompMaterial.BOW).name(Lang.of("Turrets_Menu.Range_Button_Title"))
  242.                                 .lore(Lang.ofArray("Turrets_Menu.Range_Button_Lore", "{range}", turretData.getLevel(turretLevel).getRange())),
  243.                         Lang.of("Turrets_Menu.Range_Prompt_Message", "{range}", turretData.getLevel(turretLevel).getRange()),
  244.                         new RangedValue(1, 40), () -> turretData.getLevel(turretLevel).getRange(), (Integer input) -> registry.setRange(turretData, turretLevel, input));
  245.  
  246.  
  247.                 this.laserEnabledButton = new Button() {
  248.                     @Override
  249.                     public void onClickedInMenu(final Player player, final Menu menu, final ClickType clickType) {
  250.                         final TurretRegistry registry = TurretRegistry.getInstance();
  251.                         final boolean isEnabled = turretData.getLevel(turretLevel).isLaserEnabled();
  252.  
  253.                         registry.setLaserEnabled(turretData, turretLevel, !isEnabled);
  254.                         restartMenu((Lang.of("Turrets_Menu.Laser_Enabled_Button_Animated_Message", "{enabledOrDisabled}", isEnabled ? TurretUtil.capitalizeWord(Lang.of("Placeholders.Enabled")) : TurretUtil.capitalizeWord(Lang.of("Placeholders.Disabled")))));
  255.                     }
  256.  
  257.                     @Override
  258.                     public ItemStack getItem() {
  259.                         final boolean isEnabled = turretData.getLevel(turretLevel).isLaserEnabled();
  260.  
  261.                         return ItemCreator.of(isEnabled ? CompMaterial.GREEN_WOOL : CompMaterial.RED_WOOL, Lang.of("Turrets_Menu.Laser_Enabled_Button_Title"),
  262.                                 Lang.ofArray("Turrets_Menu.Laser_Enabled_Button_Lore", "{enabledOrDisabled}", isEnabled ? Lang.of("Placeholders.Enabled") : Lang.of("Placeholders.Disabled"))).make();
  263.                     }
  264.                 };
  265.  
  266.                 this.laserDamageButton = Button.makeDecimalPrompt(ItemCreator.of(CompMaterial.BLAZE_POWDER).name(Lang.of("Turrets_Menu.Laser_Damage_Button_Title"))
  267.                                 .lore(Lang.ofArray("Turrets_Menu.Laser_Damage_Button_Lore", "{damage}", turretData.getLevel(turretLevel).getLaserDamage())),
  268.                         Lang.of("Turrets_Menu.Laser_Damage_Prompt_Message", "{damage}", turretData.getLevel(turretLevel).getLaserDamage()),
  269.                         new RangedValue(0.0, 500.0), () -> turretData.getLevel(turretLevel).getLaserDamage(), (Double input) -> registry.setLaserDamage(turretData, turretLevel, input));
  270.  
  271.                 this.lootButton = new ButtonMenu(new LevelMenu.TurretLootChancesMenu(), CompMaterial.CHEST,
  272.                         Lang.of("Turrets_Menu.Loot_Drop_Button_Title"),
  273.                         Lang.ofArray("Turrets_Menu.Loot_Drop_Button_Lore"));
  274.  
  275.                 this.healthButton = Button.makeDecimalPrompt(ItemCreator.of(CompMaterial.DIAMOND_CHESTPLATE).name(Lang.of("Turrets_Menu.Health_Button_Title"))
  276.                                 .lore(Lang.ofArray("Turrets_Menu.Health_Button_Lore", "{health}", turretData.getLevel(turretLevel).getMaxHealth())),
  277.                         Lang.of("Turrets_Menu.Health_Prompt_Message", "{health}", turretData.getLevel(turretLevel).getMaxHealth()),
  278.                         new RangedValue(0.0, 5000.0), () -> turretData.getLevel(turretLevel).getMaxHealth(), (Double input) -> turretData.getLevel(turretLevel).setMaxHealth(input));
  279.  
  280.  
  281.                 this.previousLevelButton = new Button() {
  282.  
  283.                     final boolean aboveFirstLevel = turretLevel > 1;
  284.  
  285.                     @Override
  286.                     public void onClickedInMenu(final Player player, final Menu menu, final ClickType clickType) {
  287.                         if (aboveFirstLevel)
  288.                             new LevelMenu(turretLevel - 1).displayTo(player);
  289.                     }
  290.  
  291.                     @Override
  292.                     public ItemStack getItem() {
  293.                         return ItemCreator
  294.                                 .of(aboveFirstLevel ? CompMaterial.LIME_DYE : CompMaterial.GRAY_DYE,
  295.                                         aboveFirstLevel ? Lang.of("Turrets_Menu.Previous_Level_Button_Title_2") : Lang.of("Turrets_Menu.Previous_Level_Button_Title_1")).make();
  296.                     }
  297.                 };
  298.  
  299.                 this.nextLevelButton = new Button() {
  300.  
  301.                     @Override
  302.                     public void onClickedInMenu(final Player player, final Menu menu, final ClickType clickType) {
  303.                         final Menu nextLevelMenu;
  304.  
  305.                         if (!nextLevelExists)
  306.                             TurretRegistry.getInstance().createLevel(turretData);
  307.  
  308.                         nextLevelMenu = new LevelMenu(turretLevel + 1);
  309.                         nextLevelMenu.displayTo(player);
  310.                     }
  311.  
  312.                     @Override
  313.                     public ItemStack getItem() {
  314.                         return ItemCreator.of(nextLevelExists ? CompMaterial.LIME_DYE : CompMaterial.PURPLE_DYE,
  315.                                 nextLevelExists ? Lang.of("Turrets_Menu.Next_Level_Button_Title_2") : Lang.of("Turrets_Menu.Next_Level_Button_Title_1")).make();
  316.                     }
  317.                 };
  318.  
  319.                 this.removeLevelButton = new Button() {
  320.  
  321.                     @Override
  322.                     public void onClickedInMenu(final Player player, final Menu menu, final ClickType clickType) {
  323.                         TurretRegistry.getInstance().removeLevel(turretData, turretLevel);
  324.  
  325.                         final Menu previousMenu = new LevelMenu(turretLevel - 1);
  326.  
  327.                         previousMenu.displayTo(player);
  328.                         Common.runLater(() -> previousMenu.animateTitle(Lang.of("Turrets_Menu.Remove_Level_Button_Animated_Message", "{level}", turretLevel)));
  329.                     }
  330.  
  331.                     @Override
  332.                     public ItemStack getItem() {
  333.                         return ItemCreator.of(CompMaterial.BARRIER, Lang.of("Turrets_Menu.Remove_Level_Button_Title", "{level}", turretLevel)).make();
  334.                     }
  335.                 };
  336.  
  337.                 this.priceButton = Button.makeDecimalPrompt(ItemCreator.of(
  338.                                 CompMaterial.SUNFLOWER,
  339.                                 Lang.of("Turrets_Menu.Price_Button_Title"),
  340.                                 Lang.ofArray("Turrets_Menu.Price_Button_Lore", "{price}", this.level.getPrice(), "{currencyName}", Settings.CurrencySection.CURRENCY_NAME)),
  341.                         Lang.of("Turrets_Menu.Price_Prompt_Message", "{price}", this.level.getPrice(), "{currencyName}", Settings.CurrencySection.CURRENCY_NAME),
  342.                         this.getTitle(), RangedValue.parse("0-100000"), () -> turretData.getLevel(turretLevel).getPrice(), (Double input) -> registry.setLevelPrice(turretData, turretLevel, input));
  343.             }
  344.  
  345.             private TurretData.TurretLevel getOrMakeLevel(final int turretLevel) {
  346.                 TurretData.TurretLevel level = turretData.getLevel(turretLevel);
  347.  
  348.                 if (level == null)
  349.                     level = turretData.addLevel();
  350.  
  351.                 return level;
  352.             }
  353.  
  354.             @Override
  355.             protected String[] getInfo() {
  356.                 return Lang.ofArray("Turrets_Menu.Level_Menu_Info_Button");
  357.             }
  358.  
  359.             @Override
  360.             public ItemStack getItemAt(final int slot) {
  361.                 final boolean nextLevelExists = this.turretLevel < turretData.getLevels() || turretData.getLevels() == 0;
  362.  
  363.                 if (!nextLevelExists && slot == getBottomCenterSlot() + 3)
  364.                     return this.removeLevelButton.getItem();
  365.  
  366.                 return NO_ITEM;
  367.             }
  368.  
  369.             @Override
  370.             public Menu newInstance() {
  371.                 return new LevelMenu(turretLevel);
  372.             }
  373.  
  374.             private class TurretLootChancesMenu extends MenuContainerChances {
  375.  
  376.                 TurretLootChancesMenu() {
  377.                     super(LevelMenu.this);
  378.  
  379.                     this.setSize(54);
  380.                     this.setTitle(Lang.of("Turrets_Menu.Turret_Loot_Menu_Title"));
  381.                 }
  382.  
  383.                 @Override
  384.                 protected boolean canEditItem(final MenuClickLocation location, final int slot, final ItemStack clicked, final ItemStack cursor, final InventoryAction action) {
  385.                     return true;
  386.                 }
  387.  
  388.                 @Override
  389.                 protected ItemStack getDropAt(final int slot) {
  390.                     final Tuple<ItemStack, Double> tuple = this.getTuple(slot);
  391.                     return tuple != null ? tuple.getKey() : NO_ITEM;
  392.                 }
  393.  
  394.                 @Override
  395.                 protected double getDropChance(final int slot) {
  396.                     final Tuple<ItemStack, Double> tuple = this.getTuple(slot);
  397.  
  398.                     return tuple != null ? tuple.getValue() : 0;
  399.                 }
  400.  
  401.                 private Tuple<ItemStack, Double> getTuple(final int slot) {
  402.                     final TurretRegistry registry = TurretRegistry.getInstance();
  403.                     final List<Tuple<ItemStack, Double>> items = registry.getTurretLootChances(turretData, turretLevel);
  404.  
  405.                     return slot < items.size() ? items.get(slot) : null;
  406.                 }
  407.  
  408.                 @Override
  409.                 protected void onMenuClose(final StrictMap<Integer, Tuple<ItemStack, Double>> items) {
  410.                     final TurretRegistry registry = TurretRegistry.getInstance();
  411.  
  412.                     registry.setTurretLootChances(turretData, turretLevel, new ArrayList<>(items.values()));
  413.                 }
  414.  
  415.                 @Override
  416.                 public boolean allowDecimalQuantities() {
  417.                     return true;
  418.                 }
  419.             }
  420.         }
  421.     }
  422.  
  423.     /*private final class ValidateMenu extends Menu {
  424.  
  425.     }*/ // TODO
  426.  
  427.     @RequiredArgsConstructor
  428.     private enum TurretType {
  429.         ALL("all", TurretRegistry.getInstance().getRegisteredTurrets()),
  430.         ARROW("arrow", TurretRegistry.getInstance().getTurretsOfType("arrow")),
  431.         FIREBALL("fireball", TurretRegistry.getInstance().getTurretsOfType("fireball")),
  432.         BEAM("beam", TurretRegistry.getInstance().getTurretsOfType("beam"));
  433.  
  434.         private final String typeName;
  435.         private final Set<TurretData> turretTypeList;
  436.     }
  437.  
  438.     public static void openAllTurretsSelectionMenu(final Player player) {
  439.         new TurretsMenu(player, TurretType.ALL).displayTo(player);
  440.     }
  441.  
  442.     public static void openArrowTurretsSelectionMenu(final Player player) {
  443.         new TurretsMenu(player, TurretType.ARROW).displayTo(player);
  444.     }
  445.  
  446.     public static void openFireballTurretsSelectionMenu(final Player player) {
  447.         new TurretsMenu(player, TurretType.FIREBALL).displayTo(player);
  448.     }
  449.  
  450.     public static void openBeamTurretsSelectionMenu(final Player player) {
  451.         new TurretsMenu(player, TurretType.BEAM).displayTo(player);
  452.     }
  453. }
Add Comment
Please, Sign In to add comment