JackOUT

Untitled

Aug 6th, 2022
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 17.84 KB | None | 0 0
  1. package games.coob.laserturrets.menu;
  2.  
  3. import games.coob.laserturrets.settings.TurretSettings;
  4. import games.coob.laserturrets.util.StringUtil;
  5. import org.bukkit.Bukkit;
  6. import org.bukkit.OfflinePlayer;
  7. import org.bukkit.conversations.ConversationContext;
  8. import org.bukkit.conversations.Prompt;
  9. import org.bukkit.entity.EntityType;
  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.ItemUtil;
  17. import org.mineacademy.fo.collection.StrictMap;
  18. import org.mineacademy.fo.conversation.SimplePrompt;
  19. import org.mineacademy.fo.menu.Menu;
  20. import org.mineacademy.fo.menu.MenuContainerChances;
  21. import org.mineacademy.fo.menu.MenuPagged;
  22. import org.mineacademy.fo.menu.button.Button;
  23. import org.mineacademy.fo.menu.button.ButtonConversation;
  24. import org.mineacademy.fo.menu.button.ButtonMenu;
  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.model.RangedValue;
  29. import org.mineacademy.fo.model.Tuple;
  30. import org.mineacademy.fo.remain.CompMaterial;
  31. import org.mineacademy.fo.remain.Remain;
  32.  
  33. import javax.annotation.Nullable;
  34. import java.util.ArrayList;
  35. import java.util.Arrays;
  36. import java.util.List;
  37. import java.util.UUID;
  38. import java.util.stream.Collectors;
  39.  
  40. public final class SettingsMenu extends Menu {
  41.  
  42.     private Player viewer;
  43.  
  44.     @Position(11)
  45.     private final Button arrowSettingsButton;
  46.  
  47.     @Position(13)
  48.     private final Button laserSettingsButton;
  49.  
  50.     @Position(15)
  51.     private final Button flameSettingsButton;
  52.  
  53.     public SettingsMenu(final @Nullable Menu parent, final Player player) {
  54.         super(parent);
  55.  
  56.         this.viewer = player;
  57.  
  58.         this.setSize(27);
  59.         this.setTitle("Turret Settings");
  60.  
  61.         this.arrowSettingsButton = new ButtonMenu(new SettingsEditMenu("arrow"), CompMaterial.ARROW,
  62.                 "Arrow Turret Settings",
  63.                 "",
  64.                 "Edit the default settings",
  65.                 "for arrow turrets.");
  66.  
  67.         this.flameSettingsButton = new ButtonMenu(new SettingsEditMenu("flame"), CompMaterial.LAVA_BUCKET,
  68.                 "Flame Turret Settings",
  69.                 "",
  70.                 "Edit the default settings",
  71.                 "for flame turrets.");
  72.  
  73.         this.laserSettingsButton = new ButtonMenu(new SettingsEditMenu("laser"), CompMaterial.BLAZE_ROD,
  74.                 "Laser Turret Settings",
  75.                 "",
  76.                 "Edit the default settings",
  77.                 "for laser turrets.");
  78.     }
  79.  
  80.     private final class SettingsEditMenu extends Menu {
  81.  
  82.         private final TurretSettings settings;
  83.  
  84.         @Position(12)
  85.         private final Button levelEditButton;
  86.  
  87.         @Position(14)
  88.         private final Button blacklistButton;
  89.  
  90.         private SettingsEditMenu(final String typeName) {
  91.             super(SettingsMenu.this);
  92.             this.settings = TurretSettings.findTurretSettings(typeName);
  93.             System.out.println(this.settings);
  94.  
  95.             this.setSize(9 * 4);
  96.             this.setTitle(StringUtil.capitalize(typeName) + " Turrets");
  97.  
  98.             this.levelEditButton = new ButtonMenu(new LevelMenu(1), CompMaterial.EXPERIENCE_BOTTLE,
  99.                     "Level Menu",
  100.                     "",
  101.                     "Open this menu to upgrade",
  102.                     "or downgrade the turret.");
  103.  
  104.             this.blacklistButton = new ButtonMenu(new SettingsBlacklistMenu(SettingsEditMenu.this, viewer), CompMaterial.KNOWLEDGE_BOOK,
  105.                     "Turret Blacklist",
  106.                     "",
  107.                     "Click this button to edit",
  108.                     "your turrets blacklist.");
  109.         }
  110.  
  111.         @Override
  112.         protected String[] getInfo() {
  113.             return new String[]{
  114.                     "Edit this turrets settings."
  115.             };
  116.         }
  117.  
  118.         private class LevelMenu extends Menu {
  119.  
  120.             private final TurretSettings.LevelData level;
  121.  
  122.             @Position(10)
  123.             private final Button rangeButton;
  124.  
  125.             @Position(12)
  126.             private final Button laserEnabledButton;
  127.  
  128.             @Position(14)
  129.             private final Button laserDamageButton;
  130.  
  131.             @Position(16)
  132.             private final Button lootButton;
  133.  
  134.             @Position(30)
  135.             private final Button previousLevelButton;
  136.  
  137.             @Position(32)
  138.             private final Button nextLevelButton;
  139.  
  140.             @Position(31)
  141.             private final Button priceButton;
  142.  
  143.             public LevelMenu(final int turretLevel) {
  144.                 super(SettingsEditMenu.this);
  145.  
  146.                 System.out.println("Settings: " + settings);
  147.                 System.out.println("Levels size: " + settings.getLevelsSize());
  148.                 System.out.println("All Levels: " + settings.getLevels().toString());
  149.                 final boolean nextLevelExists = turretLevel < settings.getLevelsSize() || settings.getLevelsSize() == 0;
  150.  
  151.                 this.level = getOrMakeLevel(turretLevel);
  152.  
  153.                 System.out.println("Level: " + this.level);
  154.  
  155.                 this.setTitle("Turret Level " + turretLevel);
  156.                 this.setSize(9 * 4);
  157.  
  158.                 this.rangeButton = Button.makeIntegerPrompt(ItemCreator.of(CompMaterial.BOW).name("Turret Range")
  159.                                 .lore("Set the turrets range", "by clicking this button.", "", "Current: &9" + level.getRange()),
  160.                         "Type in an integer value between 1 and 40 (recommend value : 15-20)",
  161.                         new RangedValue(1, 40), level::getRange, (Integer input) -> settings.setSettingsRange(level, input));
  162.  
  163.  
  164.                 this.laserEnabledButton = new Button() {
  165.                     @Override
  166.                     public void onClickedInMenu(final Player player, final Menu menu, final ClickType clickType) {
  167.                         final boolean isEnabled = level.isLaserEnabled();
  168.  
  169.                         settings.setLaserEnabled(level, !isEnabled);
  170.                         restartMenu((isEnabled ? "&cDisabled" : "&aEnabled") + " laser pointer");
  171.                     }
  172.  
  173.                     @Override
  174.                     public ItemStack getItem() {
  175.                         final boolean isEnabled = level.isLaserEnabled();
  176.  
  177.                         return ItemCreator.of(isEnabled ? CompMaterial.GREEN_CONCRETE : CompMaterial.RED_CONCRETE, "Enabled/Disable Laser",
  178.                                 "",
  179.                                 "Current: " + (isEnabled ? "&atrue" : "&cfalse"),
  180.                                 "",
  181.                                 "Click to enable or disable",
  182.                                 "lasers for this turret.").make();
  183.                     }
  184.                 };
  185.  
  186.                 this.laserDamageButton = Button.makeDecimalPrompt(ItemCreator.of(CompMaterial.END_CRYSTAL).name("Laser Damage")
  187.                                 .lore("Set the amount of damage", "lasers deal if they're enabled", "by clicking this button.", "", "Current: &9" + level.getLaserDamage()),
  188.                         "Type in an integer value between 1 and 40 (recommended value: 15-20)",
  189.                         new RangedValue(1, 40), level::getLaserDamage, (Double input) -> settings.setLaserDamage(level, input));
  190.  
  191.                 this.lootButton = new ButtonMenu(new LevelMenu.TurretLootChancesMenu(), CompMaterial.CHEST,
  192.                         "Turret Loot",
  193.                         "",
  194.                         "Open this menu to edit",
  195.                         "the loot players get when",
  196.                         "they destroy a turret.",
  197.                         "You can also edit the drop",
  198.                         "chance.");
  199.  
  200.                 this.previousLevelButton = new Button() {
  201.  
  202.                     final boolean aboveFirstLevel = turretLevel > 1;
  203.  
  204.                     @Override
  205.                     public void onClickedInMenu(final Player player, final Menu menu, final ClickType clickType) {
  206.                         if (aboveFirstLevel)
  207.                             new LevelMenu(turretLevel - 1).displayTo(player);
  208.                     }
  209.  
  210.                     @Override
  211.                     public ItemStack getItem() {
  212.                         return ItemCreator
  213.                                 .of(aboveFirstLevel ? CompMaterial.LIME_DYE : CompMaterial.GRAY_DYE,
  214.                                         aboveFirstLevel ? "Edit previous level" : "This is the first level").make();
  215.                     }
  216.                 };
  217.  
  218.                 this.nextLevelButton = new Button() {
  219.  
  220.                     @Override
  221.                     public void onClickedInMenu(final Player player, final Menu menu, final ClickType clickType) {
  222.                         final Menu nextLevelMenu;
  223.  
  224.                         if (nextLevelExists) {
  225.                             nextLevelMenu = new LevelMenu(turretLevel + 1); // TODO add level
  226.                             System.out.println("Exists");
  227.                         } else {
  228.                             settings.createSettingsLevel();
  229.                             nextLevelMenu = new LevelMenu(turretLevel + 1);
  230.                             System.out.println("Doesn't exist");
  231.                         }
  232.  
  233.                         nextLevelMenu.displayTo(player);
  234.                     }
  235.  
  236.                     @Override
  237.                     public ItemStack getItem() {
  238.                         return ItemCreator
  239.                                 .of(nextLevelExists ? CompMaterial.LIME_DYE : CompMaterial.PURPLE_DYE,
  240.                                         nextLevelExists ? "Edit next level" : "Create a new level").make();
  241.                     }
  242.                 };
  243.  
  244.                 this.priceButton = Button.makeDecimalPrompt(ItemCreator.of(
  245.                                 CompMaterial.SUNFLOWER,
  246.                                 "Edit Price",
  247.                                 "",
  248.                                 "Current: " + this.level.getPrice() + " coins",
  249.                                 "",
  250.                                 "Edit the price for",
  251.                                 "this level."),
  252.                         "Enter teh price for this level. Curretnt: " + this.level.getPrice() + " coins.",
  253.                         RangedValue.parse("0-100000"), (Double input) -> settings.setLevelPrice(level, input));
  254.             }
  255.  
  256.             private TurretSettings.LevelData getOrMakeLevel(final int turretLevel) { // TODO get level 3 too
  257.                 TurretSettings.LevelData level = settings.getLevel(turretLevel);
  258.  
  259.                 if (level == null)
  260.                     level = settings.addLevel();
  261.  
  262.                 return level;
  263.             }
  264.  
  265.             @Override
  266.             protected String[] getInfo() {
  267.                 return new String[]{
  268.                         "You can edit each individual",
  269.                         "level in this menu and set its",
  270.                         "price."
  271.                 };
  272.             }
  273.  
  274.             private class TurretLootChancesMenu extends MenuContainerChances {
  275.  
  276.                 TurretLootChancesMenu() {
  277.                     super(LevelMenu.this);
  278.  
  279.                     this.setTitle("Place turret loot here");
  280.                 }
  281.  
  282.                 @Override
  283.                 protected boolean canEditItem(final MenuClickLocation location, final int slot, final ItemStack clicked, final ItemStack cursor, final InventoryAction action) {
  284.                     return true;
  285.                 }
  286.  
  287.                 @Override
  288.                 protected ItemStack getDropAt(final int slot) {
  289.                     final Tuple<ItemStack, Double> tuple = this.getTuple(slot);
  290.  
  291.                     return tuple != null ? tuple.getKey() : NO_ITEM;
  292.                 }
  293.  
  294.                 @Override
  295.                 protected double getDropChance(final int slot) {
  296.                     final Tuple<ItemStack, Double> tuple = this.getTuple(slot);
  297.  
  298.                     return tuple != null ? tuple.getValue() : 0;
  299.                 }
  300.  
  301.                 private Tuple<ItemStack, Double> getTuple(final int slot) {
  302.                     final List<Tuple<ItemStack, Double>> items = level.getLootChances();
  303.  
  304.                     return slot < items.size() ? items.get(slot) : null;
  305.                 }
  306.  
  307.                 @Override
  308.                 protected void onMenuClose(final StrictMap<Integer, Tuple<ItemStack, Double>> items) {
  309.                     settings.setLootChances(level, new ArrayList<>(items.values()));
  310.                 }
  311.  
  312.                 @Override
  313.                 public boolean allowDecimalQuantities() {
  314.                     return true;
  315.                 }
  316.             }
  317.         }
  318.  
  319.         public class SettingsBlacklistMenu extends Menu {
  320.  
  321.             @Position(14)
  322.             private final Button mobBlacklistButton;
  323.  
  324.             @Position(12)
  325.             private final Button playerBlacklistButton;
  326.  
  327.             public SettingsBlacklistMenu(final Menu parent, final Player player) {
  328.                 super(parent);
  329.  
  330.                 this.setViewer(player);
  331.                 this.setSize(27);
  332.                 this.setTitle("Turret Blacklist");
  333.  
  334.                 this.mobBlacklistButton = new ButtonMenu(new MobBlacklistMenu(), CompMaterial.CREEPER_HEAD,
  335.                         "Mob Blacklist", "", "Edit your mob blacklist");
  336.  
  337.                 this.playerBlacklistButton = new ButtonMenu(new PlayerBlacklistMenu(), CompMaterial.PLAYER_HEAD,
  338.                         "Player Blacklist", "", "Edit your player blacklist");
  339.             }
  340.  
  341.             private class MobBlacklistMenu extends MenuPagged<EntityType> {
  342.  
  343.                 private final Button addButton;
  344.  
  345.                 private MobBlacklistMenu() {
  346.                     super(27, SettingsBlacklistMenu.this, settings.getMobBlacklist());
  347.  
  348.                     this.setTitle("Mob Blacklist");
  349.  
  350.                     this.addButton = new ButtonMenu(new MobBlacklistMenu.MobSelectionMenu(), CompMaterial.ENDER_CHEST,
  351.                             "Add Mob",
  352.                             "",
  353.                             "Open this menu to add ",
  354.                             "mobs from the blacklist",
  355.                             "to prevent the turret",
  356.                             "from targeting them.");
  357.                 }
  358.  
  359.                 @Override
  360.                 protected ItemStack convertToItemStack(final EntityType entityType) {
  361.                     return ItemCreator.ofEgg(entityType, ItemUtil.bountifyCapitalized(entityType))
  362.                             .lore("Click to remove").make();
  363.                 }
  364.  
  365.                 @Override
  366.                 protected void onPageClick(final Player player, final EntityType entityType, final ClickType clickType) {
  367.                     settings.removeMobFromBlacklist(entityType);
  368.                     this.restartMenu("&cRemoved " + entityType.name());
  369.                     MobBlacklistMenu.this.newInstance().displayTo(player);
  370.                 }
  371.  
  372.                 @Override
  373.                 public ItemStack getItemAt(final int slot) {
  374.                     if (slot == this.getBottomCenterSlot())
  375.                         return addButton.getItem();
  376.  
  377.                     return super.getItemAt(slot);
  378.                 }
  379.  
  380.                 @Override
  381.                 protected String[] getInfo() {
  382.                     return new String[]{
  383.                             "Edit your mob blacklist by",
  384.                             "clicking the existing eggs",
  385.                             "to remove them or clicking",
  386.                             "the 'Add Mob' button to add",
  387.                             "mobs to your blacklist."
  388.                     };
  389.                 }
  390.  
  391.                 @Override
  392.                 public Menu newInstance() {
  393.                     return new MobBlacklistMenu();
  394.                 }
  395.  
  396.                 private class MobSelectionMenu extends MenuPagged<EntityType> {
  397.                     private MobSelectionMenu() {
  398.                         super(27, MobBlacklistMenu.this, Arrays.stream(EntityType.values())
  399.                                 .filter(EntityType::isAlive)
  400.                                 .collect(Collectors.toList()));
  401.  
  402.                         this.setTitle("Select a Mob");
  403.                     }
  404.  
  405.                     @Override
  406.                     protected ItemStack convertToItemStack(final EntityType entityType) {
  407.                         return ItemCreator.ofEgg(entityType, ItemUtil.bountifyCapitalized(entityType))
  408.                                 .glow(settings.getMobBlacklist().contains(entityType))
  409.                                 .lore(settings.getMobBlacklist().contains(entityType) ? "&aAlready blacklisted" : "Click to add")
  410.                                 .make();
  411.                     }
  412.  
  413.                     @Override
  414.                     protected void onPageClick(final org.bukkit.entity.Player player, final EntityType entityType, final ClickType clickType) {
  415.                         settings.addMobToBlacklist(entityType);
  416.                         this.restartMenu("&aAdded " + entityType.name());
  417.                     }
  418.  
  419.                     @Override
  420.                     protected void onMenuClose(final Player player, final Inventory inventory) {
  421.                         MobBlacklistMenu.this.newInstance().displayTo(player);
  422.                     }
  423.                 }
  424.             }
  425.  
  426.             private class PlayerBlacklistMenu extends MenuPagged<UUID> {
  427.  
  428.                 private final Button addButton;
  429.  
  430.                 private final Button addPromptButton;
  431.  
  432.                 private PlayerBlacklistMenu() {
  433.                     super(27, SettingsBlacklistMenu.this, settings.getPlayerBlacklist());
  434.  
  435.                     this.setTitle("Player Blacklist");
  436.  
  437.                     this.addButton = new ButtonMenu(new PlayerBlacklistMenu.PlayerSelectionMenu(), CompMaterial.ENDER_CHEST,
  438.                             "Add Players",
  439.                             "",
  440.                             "Open this menu to add ",
  441.                             "players to the blacklist",
  442.                             "to prevent the turret",
  443.                             "from targeting them.");
  444.  
  445.                     this.addPromptButton = new ButtonConversation(new PlayerBlacklistPrompt(),
  446.                             ItemCreator.of(CompMaterial.WRITABLE_BOOK, "Type a name",
  447.                                     "",
  448.                                     "Click this button if you",
  449.                                     "would like to add a player",
  450.                                     "to the blacklist by typing ",
  451.                                     "his name, this means you can",
  452.                                     "also add offline players."));
  453.                 }
  454.  
  455.                 @Override
  456.                 protected ItemStack convertToItemStack(final UUID uuid) {
  457.                     final Player player = Remain.getPlayerByUUID(uuid);
  458.  
  459.                     return ItemCreator.of(
  460.                                     CompMaterial.PLAYER_HEAD,
  461.                                     player.getName(),
  462.                                     "Click to remove")
  463.                             .skullOwner(player.getName()).make();
  464.                 }
  465.  
  466.                 @Override
  467.                 protected void onPageClick(final Player player, final UUID item, final ClickType click) {
  468.                     final Player target = Remain.getPlayerByUUID(item);
  469.  
  470.                     settings.removePlayerFromBlacklist(target.getUniqueId());
  471.                     this.restartMenu("&cRemoved " + target.getName());
  472.                     PlayerBlacklistMenu.this.newInstance().displayTo(player);
  473.                 }
  474.  
  475.                 @Override
  476.                 public ItemStack getItemAt(final int slot) {
  477.                     if (slot == this.getBottomCenterSlot() - 1)
  478.                         return addButton.getItem();
  479.                     if (slot == this.getBottomCenterSlot() + 1)
  480.                         return addPromptButton.getItem();
  481.  
  482.                     return super.getItemAt(slot);
  483.                 }
  484.  
  485.                 @Override
  486.                 protected String[] getInfo() {
  487.                     return new String[]{
  488.                             "Edit your player blacklist by",
  489.                             "clicking the existing heads",
  490.                             "to remove them or clicking",
  491.                             "the 'Add Mob' button to add",
  492.                             "players to your blacklist."
  493.                     };
  494.                 }
  495.  
  496.                 @Override
  497.                 public Menu newInstance() {
  498.                     return new PlayerBlacklistMenu();
  499.                 }
  500.  
  501.                 private class PlayerSelectionMenu extends MenuPagged<Player> {
  502.                     private PlayerSelectionMenu() {
  503.                         super(18, PlayerBlacklistMenu.this, viewer.getWorld().getPlayers());
  504.  
  505.                         this.setTitle("Select a player");
  506.                     }
  507.  
  508.                     @Override
  509.                     protected ItemStack convertToItemStack(final Player player) {
  510.                         return ItemCreator.of(
  511.                                         CompMaterial.PLAYER_HEAD,
  512.                                         player.getName(),
  513.                                         (settings.getPlayerBlacklist().contains(player.getUniqueId()) ? "&aAlready blacklisted" : "Click to add"))
  514.                                 .skullOwner(player.getName()).make();
  515.                     }
  516.  
  517.                     @Override
  518.                     protected void onPageClick(final Player player, final Player item, final ClickType click) {
  519.                         settings.addPlayerToBlacklist(item.getUniqueId());
  520.                         this.restartMenu("&aAdded " + player.getName());
  521.                     }
  522.  
  523.                     @Override
  524.                     protected void onMenuClose(final Player player, final Inventory inventory) {
  525.                         PlayerBlacklistMenu.this.newInstance().displayTo(player);
  526.                     }
  527.                 }
  528.             }
  529.  
  530.             private final class PlayerBlacklistPrompt extends SimplePrompt {
  531.  
  532.                 @Override
  533.                 protected String getPrompt(final ConversationContext context) {
  534.                     return "&6What player shouldn't be targeted by this turret? You can add more players to the blacklist by using the /turret blacklist add <player> command.";
  535.                 }
  536.  
  537.                 @Override
  538.                 protected boolean isInputValid(final ConversationContext context, final String input) {
  539.                     for (final OfflinePlayer player : Bukkit.getOfflinePlayers())
  540.                         return player.getName() != null && player.getName().equals(input);
  541.                     return false;
  542.                 }
  543.  
  544.                 @Override
  545.                 protected String getFailedValidationText(final ConversationContext context, final String invalidInput) {
  546.                     return "Player '" + invalidInput + "' doesn't exist.";
  547.                 }
  548.  
  549.                 @org.jetbrains.annotations.Nullable
  550.                 @Override
  551.                 protected Prompt acceptValidatedInput(@NotNull final ConversationContext context, @NotNull final String input) {
  552.                     settings.addPlayerToBlacklist(Bukkit.getOfflinePlayer(input).getUniqueId());
  553.                     tellSuccess("You have added " + input + " to the blacklist!");
  554.  
  555.                     return END_OF_CONVERSATION;
  556.                 }
  557.             }
  558.         }
  559.     }
  560. }
Add Comment
Please, Sign In to add comment