Skip to content

[REWRITE] Rewrite de la feature MainMenu #1503

Description

@iambibi

public class Page1 implements Menu {

private final Component title;
private final Map<Integer, ItemStack> content;
private static final Set<Integer> CITY_SLOTS = Set.of(0, 1, 2, 3, 9, 10, 11, 12, 18, 19, 20, 21, 27, 28, 29, 30, 36, 37, 38, 39, 45, 46, 47, 48);
private static final Set<Integer> QUEST_SLOTS = Set.of(4, 5, 6, 7, 8, 13, 14, 15, 16, 17, 22, 23, 24, 25, 26);
private static final Set<Integer> MILESTONES_SLOTS = Set.of(31, 32, 33, 34, 35, 40, 41, 42, 43, 44, 49, 50, 51, 52, 53);
private static final Set<Integer> CONTEST_SLOTS = Set.of(54, 55, 56, 57, 58);
private static final Set<Integer> SHOP_SLOTS = Set.of(63, 64, 65, 66, 67);
private static final Set<Integer> HOME_SLOTS = Set.of(72, 73, 74, 75, 76);
private static final Set<Integer> PROFILE_SLOTS = Set.of(59, 60, 61, 62, 68, 69, 70, 71, 77, 78, 79, 80);
private static final int LEFT_ARROW_SLOT = 81;  // Not used in this menu, but in Page2
private static final int RIGHT_ARROW_SLOT = 89;
private static final Set<Integer> SETTINGS_SLOTS = Set.of(82, 83, 84);
private static final Set<Integer> MAILBOX_SLOTS = Set.of(85, 86, 87);
private static final int ADVANCEMENTS_SLOT = 88;

private final AdminShopManager adminShopManager;
private final WeeklyEventsManager weeklyEventsManager;
private final ContestManager contestManager;

public Page1(Player player) {
    this.adminShopManager = OMCRegistry.FEATURES.ADMIN_SHOP.get();
    this.contestManager = OMCRegistry.FEATURES.CONTEST.get();
    this.weeklyEventsManager = OMCRegistry.FEATURES.WEEKLY_EVENTS.get();

    City playerCity = City.ofPlayer(player.getUniqueId());
    ItemStack cityItem = new ItemStack(Material.PAPER);
    cityItem.editMeta(meta -> {
        meta.setItemModel(NamespacedKey.minecraft("air"));
        meta.lore(List.of(TranslationManager.translation("feature.mainmenu.item.city.lore")
                .color(NamedTextColor.DARK_GRAY)));
    });

    if (playerCity != null) {
        title = Component.text(FontImageWrapper.replaceFontImages(":offset_-26::omc_main_menu_page_1:"));
        Component cityName = Component.text(playerCity.getName()).color(NamedTextColor.YELLOW);
        cityItem.editMeta(meta -> meta.itemName(TranslationManager.translation("feature.mainmenu.item.city.name", cityName)
                .color(NamedTextColor.YELLOW)));
    } else {
        title = Component.text(FontImageWrapper.replaceFontImages(":offset_-26::omc_main_menu_page_1_sans_ville:"));
        cityItem.editMeta(meta -> meta.itemName(TranslationManager.translation("feature.mainmenu.item.city.no_city")
                .color(NamedTextColor.GRAY)));
    }

    content = new HashMap<>();

    ItemStack advancementsItem = new ItemStack(Material.PAPER);
    advancementsItem.editMeta(meta -> {
        meta.setItemModel(NamespacedKey.minecraft("air"));
        meta.itemName(TranslationManager.translation("feature.mainmenu.item.advancements.name")
                .color(NamedTextColor.YELLOW));
    });
    content.put(ADVANCEMENTS_SLOT, advancementsItem);

    CITY_SLOTS.forEach(slot -> content.put(slot, cityItem));

    ItemStack questsItem = new ItemStack(Material.PAPER);
    questsItem.editMeta(meta -> {
        meta.setItemModel(NamespacedKey.minecraft("air"));
        meta.itemName(TranslationManager.translation("feature.mainmenu.item.quests.name")
                .color(NamedTextColor.YELLOW));
        meta.lore(List.of(TranslationManager.translation("feature.mainmenu.item.quests.lore")
                .color(NamedTextColor.DARK_GRAY)));
    });
    QUEST_SLOTS.forEach(slot -> content.put(slot, questsItem));

    ItemStack milestonesItem = new ItemStack(Material.PAPER);
    milestonesItem.editMeta(meta -> {
        meta.setItemModel(NamespacedKey.minecraft("air"));
        meta.itemName(TranslationManager.translation("feature.mainmenu.item.milestones.name")
                .color(NamedTextColor.YELLOW));
        meta.lore(List.of(
                TranslationManager.translation("feature.mainmenu.item.milestones.lore")
                        .color(NamedTextColor.WHITE),
                TranslationManager.translation("feature.mainmenu.item.milestones.command")
                        .color(NamedTextColor.DARK_GRAY)
        ));
    });
    MILESTONES_SLOTS.forEach(slot -> content.put(slot, milestonesItem));

    ItemStack contestItem = new ItemStack(Material.PAPER);
    ContestData data = contestManager.getData();

    if (weeklyEventsManager.getCurrentEvent() instanceof Contest && weeklyEventsManager.getCurrentPhase() != ContestPhase.END_PHASE.getPhase()) {
        contestItem.editMeta(meta -> {
            meta.setItemModel(NamespacedKey.minecraft("air"));
            meta.itemName(data.getCampVSComponent());
            Component timeComponent = Component.text(DateUtils.getTimeUntilNextDay(DayOfWeek.MONDAY))
                    .color(NamedTextColor.RED);
            meta.lore(List.of(
                            TranslationManager.translation("feature.mainmenu.item.contest.ends_in", timeComponent)
                                    .color(NamedTextColor.RED),
                            TranslationManager.translation("feature.mainmenu.item.contest.command")
                                    .color(NamedTextColor.DARK_GRAY)
                    )
            );
        });
    } else {
        contestItem.editMeta(meta -> {
            meta.setItemModel(NamespacedKey.minecraft("air"));
            meta.itemName(TranslationManager.translation("feature.mainmenu.item.contest.name")
                    .color(NamedTextColor.YELLOW));
            meta.lore(List.of(TranslationManager.translation("feature.mainmenu.item.contest.command")
                    .color(NamedTextColor.DARK_GRAY)));
        });
    }
    CONTEST_SLOTS.forEach(slot -> content.put(slot, contestItem));

    ItemStack shopItem = new ItemStack(Material.PAPER);
    shopItem.editMeta(meta -> {
        meta.setItemModel(NamespacedKey.minecraft("air"));
        meta.itemName(TranslationManager.translation("feature.mainmenu.item.shop.name")
                .color(NamedTextColor.YELLOW));
        meta.lore(List.of(TranslationManager.translation("feature.mainmenu.item.shop.command")
                .color(NamedTextColor.DARK_GRAY)));
    });
    SHOP_SLOTS.forEach(slot -> content.put(slot, shopItem));

    ItemStack homeItem = new ItemStack(Material.PAPER);
    homeItem.editMeta(meta -> {
        meta.setItemModel(NamespacedKey.minecraft("air"));
        meta.itemName(TranslationManager.translation("feature.mainmenu.item.home.name")
                .color(NamedTextColor.YELLOW));
        meta.lore(List.of(TranslationManager.translation("feature.mainmenu.item.home.command")
                .color(NamedTextColor.DARK_GRAY)));
    });
    HOME_SLOTS.forEach(slot -> content.put(slot, homeItem));

    ItemStack profilItem = new ItemStack(Material.PAPER);
    profilItem.editMeta(meta -> {
        meta.setItemModel(NamespacedKey.minecraft("air"));
        meta.itemName(TranslationManager.translation("feature.mainmenu.item.profile.name")
                .color(NamedTextColor.YELLOW));
        meta.lore(List.of(TranslationManager.translation("feature.mainmenu.item.profile.lore")
                .color(NamedTextColor.RED)));
    });
    PROFILE_SLOTS.forEach(slot -> {
        if (slot != 78)
            content.put(slot, profilItem);
    });

    ItemStack playerHeadProfileItem = CustomStack.getInstance("omc_main_menu:player_head").getItemStack();
    playerHeadProfileItem.editMeta(meta -> {
        meta.customName(TranslationManager.translation("feature.mainmenu.item.profile.name")
                .color(NamedTextColor.YELLOW)
                .decoration(TextDecoration.ITALIC, false));
        meta.lore(List.of(TranslationManager.translation("feature.mainmenu.item.profile.lore")
                .color(NamedTextColor.RED)));
        if (meta instanceof SkullMeta skullMeta) {
            skullMeta.setOwningPlayer(player);
        }
    });
    content.put(78, playerHeadProfileItem);

    ItemStack rightArrowItem = new ItemStack(Material.PAPER);
    rightArrowItem.editMeta(meta -> {
        meta.setItemModel(NamespacedKey.minecraft("air"));
        meta.itemName(TranslationManager.translation("feature.mainmenu.item.next_page")
                .color(NamedTextColor.YELLOW));
    });
    content.put(RIGHT_ARROW_SLOT, rightArrowItem);

    ItemStack settingsItem = new ItemStack(Material.PAPER);
    settingsItem.editMeta(meta -> {
        meta.setItemModel(NamespacedKey.minecraft("air"));
        meta.itemName(TranslationManager.translation("feature.mainmenu.item.settings.name")
                .color(NamedTextColor.YELLOW));
        meta.lore(List.of(TranslationManager.translation("feature.mainmenu.item.settings.command")
                .color(NamedTextColor.DARK_GRAY)));
    });
    SETTINGS_SLOTS.forEach(slot -> content.put(slot, settingsItem));

    ItemStack mailboxItem = new ItemStack(Material.PAPER);
    mailboxItem.editMeta(meta -> {
        meta.setItemModel(NamespacedKey.minecraft("air"));
        meta.itemName(TranslationManager.translation("feature.mainmenu.item.mailbox.name")
                .color(NamedTextColor.YELLOW));
        meta.lore(List.of(TranslationManager.translation("feature.mainmenu.item.mailbox.command")
                .color(NamedTextColor.DARK_GRAY)));
    });
    MAILBOX_SLOTS.forEach(slot -> content.put(slot, mailboxItem));
}

@Override
public Component getTitle() {
    return title;
}

@Override
public InventoryType getInventoryType() {
    return InventoryType.GENERIC_9X6;
}

@Override
public Map<Integer, ItemStack> getContent() {
    return content;
}

@Override
public void onInventoryClick(InventoryClickEvent event) {
    Player player = event.player();
    OMCPlayer omcPlayer = OMCPlayer.of(player);
    if (event.clickType() == ClickType.CLICK_OUTSIDE) {
        PacketMenuLib.closeMenu(player);
        return;
    }

    if (event.clickType() != ClickType.LEFT_CLICK) {
        return;
    }

    if (DreamUtils.isInDreamWorld(player)) {
        PacketMenuLib.closeMenu(player);
        MessagesManager.sendMessage(player,
                TranslationManager.translation("feature.mainmenu.message.dream_world")
                        .color(NamedTextColor.RED),
                Prefix.OPENMC, MessageType.ERROR, true);
        return;
    }

    int slot = event.slot();

    // todo: arreter ce carnage
    if (CITY_SLOTS.contains(slot)) {
        Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> CityCommands.mainCommand(player));
    } else if (QUEST_SLOTS.contains(slot)) {
        Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> QuestCommand.onQuest(player));
    } else if (MILESTONES_SLOTS.contains(slot)) {
        Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> new MainMilestonesMenu(player).open());
    } else if (CONTEST_SLOTS.contains(slot)) {
        Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> ContestCommand.mainCommand(player));
    } else if (SHOP_SLOTS.contains(slot)) {
        Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> adminShopManager.openMainMenu(player));
    } else if (HOME_SLOTS.contains(slot)) {
        Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> TpHomeCommand.home(omcPlayer, null));
    } else if (PROFILE_SLOTS.contains(slot)) {
        PacketMenuLib.closeMenu(player);
        Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> new ProfileMenu(player).open());
    } else if (RIGHT_ARROW_SLOT == slot) {
        PacketMenuLib.openMenu(new Page2(), player);
    } else if (SETTINGS_SLOTS.contains(slot)) {
        Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> SettingsCommand.settings(player));
    } else if (MAILBOX_SLOTS.contains(slot)) {
        Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> MailboxCommand.homeMailbox(player));
    } else if (ADVANCEMENTS_SLOT == slot) {
        PacketMenuLib.closeMenu(player);
        Bukkit.getScheduler().runTask(OMCPlugin.getInstance(), () -> {
            ServerPlayer nmsPlayer = ((CraftPlayer) player).getHandle();
            ClientboundUpdateAdvancementsPacket packet = MainMenuListener.getAdvancementPackets().get(nmsPlayer.getUUID());
            if (packet == null)
                return;

            nmsPlayer.connection.send(packet);
            MainMenuListener.getEnabledAdvancements().add(nmsPlayer.getUUID());
            Component message = TranslationManager.translation(
                    "feature.mainmenu.message.advancements_hint",
                    Component.keybind("key.advancements").color(NamedTextColor.YELLOW)
            ).color(NamedTextColor.GREEN);
            player.sendActionBar(message);
        });
    }
}

@Override
public void onInventoryClose(InventoryCloseEvent event) {
}

@Override
public boolean isCursorItemEnabled() {
    return false;
}

}

Comprenez moi que ça devient insupportable de voir ce genre de code xD.
Systeme pas a rewrite, or les méthodes et l'automatisation (car les Page1 et Page2 sont vrm sales)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

☢-AIssue importante !🧹RewriteSouvent dédié à un rewrite ou tout simplement un changement interne qui change peu aux joueurs

Type

No type

Projects

No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions