From 5ac115087ae3c6d38da3e2bcd6ab01e71e4d3d29 Mon Sep 17 00:00:00 2001 From: LMBishop <13875753+LMBishop@users.noreply.github.com> Date: Mon, 28 Jun 2021 22:54:02 +0100 Subject: Add sounds (closes #195) --- .../quests/bukkit/menu/CancelQMenu.java | 5 ++- .../quests/bukkit/menu/CategoryQMenu.java | 7 +++- .../quests/bukkit/menu/MenuController.java | 19 ++++++---- .../leonardobishop/quests/bukkit/menu/QMenu.java | 2 +- .../quests/bukkit/menu/QuestQMenu.java | 14 +++++--- .../quests/bukkit/menu/StartedQMenu.java | 9 +++-- .../questcontroller/NormalQuestController.java | 8 +++-- .../quests/bukkit/util/SoundUtils.java | 40 ++++++++++++++++++++++ 8 files changed, 85 insertions(+), 19 deletions(-) create mode 100644 bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/SoundUtils.java (limited to 'bukkit/src/main/java') diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CancelQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CancelQMenu.java index 51a36dc4..ab6013bc 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CancelQMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CancelQMenu.java @@ -68,14 +68,17 @@ public class CancelQMenu implements QMenu { } @Override - public void handleClick(InventoryClickEvent event, MenuController controller) { + public boolean handleClick(InventoryClickEvent event, MenuController controller) { if (event.getSlot() == 10 || event.getSlot() == 11 || event.getSlot() == 12) { controller.openMenu(event.getWhoClicked(), superMenu, 1); + return true; } else if (event.getSlot() == 14 || event.getSlot() == 15 || event.getSlot() == 16) { if (owner.cancelQuest(quest)) { event.getWhoClicked().closeInventory(); + return true; } } + return false; } public QMenu getSuperMenu() { diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CategoryQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CategoryQMenu.java index a31352f3..6d1993b6 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CategoryQMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/CategoryQMenu.java @@ -149,12 +149,14 @@ public class CategoryQMenu implements QMenu { } @Override - public void handleClick(InventoryClickEvent event, MenuController controller) { + public boolean handleClick(InventoryClickEvent event, MenuController controller) { if (pagePrevLocation == event.getSlot()) { controller.openMenu(event.getWhoClicked(), this, currentPage - 1); + return true; } else if (pageNextLocation == event.getSlot()) { controller.openMenu(event.getWhoClicked(), this, currentPage + 1); + return true; } else if (event.getSlot() < pageSize && menuElements.containsKey(event.getSlot() + (((currentPage) - 1) * pageSize))) { MenuElement element = menuElements.get(event.getSlot() + ((currentPage - 1) * pageSize)); @@ -164,8 +166,11 @@ public class CategoryQMenu implements QMenu { if (plugin.getMenuController().openQuestCategory(owner, plugin.getQuestManager().getCategoryById(questQMenu.getCategoryName()), questQMenu) != 0) { event.getWhoClicked().sendMessage(Messages.QUEST_CATEGORY_PERMISSION.getMessage()); + } else { + return true; } } } + return false; } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/MenuController.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/MenuController.java index aeb543d6..c4a7a54b 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/MenuController.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/MenuController.java @@ -1,6 +1,7 @@ package com.leonardobishop.quests.bukkit.menu; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; +import com.leonardobishop.quests.bukkit.util.SoundUtils; import com.leonardobishop.quests.common.player.QPlayer; import com.leonardobishop.quests.common.quest.Category; import com.leonardobishop.quests.common.quest.Quest; @@ -29,6 +30,8 @@ public class MenuController implements Listener { } public void openMenu(HumanEntity player, QMenu qMenu, int page) { + SoundUtils.playSoundForPlayer((Player) player, plugin.getQuestsConfig().getString("options.sounds.gui.open")); +// Bukkit.getScheduler().runTaskLater(plugin, () -> SoundUtils.playSoundForPlayer((Player) player, plugin.getQuestsConfig().getString("options.sounds.gui.open")), 1L); player.openInventory(qMenu.toInventory(page)); tracker.put(player.getUniqueId(), qMenu); } @@ -41,15 +44,19 @@ public class MenuController implements Listener { @EventHandler private void onClick(InventoryClickEvent event) { // check if the player has a quest menu open - if (tracker.containsKey(event.getWhoClicked().getUniqueId())) { + Player player = (Player) event.getWhoClicked(); + if (tracker.containsKey(player.getUniqueId())) { event.setCancelled(true); if (event.getClickedInventory() == null) return; //The player clicked outside the inventory if (event.getClickedInventory().getType() == InventoryType.PLAYER) return; //The clicked inventory is a player inventory type - QMenu qMenu = tracker.get(event.getWhoClicked().getUniqueId()); - qMenu.handleClick(event, this); + QMenu qMenu = tracker.get(player.getUniqueId()); + if (qMenu.handleClick(event, this)) { + SoundUtils.playSoundForPlayer(player, plugin.getQuestsConfig().getString("options.sounds.gui.interact")); +// Bukkit.getScheduler().runTaskLater(plugin, () -> SoundUtils.playSoundForPlayer(player, plugin.getQuestsConfig().getString("options.sounds.gui.interact")), 1L); + } } } @@ -132,7 +139,7 @@ public class MenuController implements Listener { } categoryQMenu.populate(questMenus); - plugin.getMenuController().openMenu(player, categoryQMenu, 1); + openMenu(player, categoryQMenu, 1); } else { QuestQMenu questQMenu = new QuestQMenu(plugin, qPlayer, "", null); List quests = new ArrayList<>(); @@ -142,7 +149,7 @@ public class MenuController implements Listener { questQMenu.populate(quests); questQMenu.setBackButtonEnabled(false); - plugin.getMenuController().openMenu(player, questQMenu, 1); + openMenu(player, questQMenu, 1); } } // } else { @@ -170,7 +177,7 @@ public class MenuController implements Listener { } startedQMenu.populate(quests); - plugin.getMenuController().openMenu(player, startedQMenu, 1); + openMenu(player, startedQMenu, 1); } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QMenu.java index 0e3c9f78..898041f3 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QMenu.java @@ -8,6 +8,6 @@ public interface QMenu { QPlayer getOwner(); Inventory toInventory(int page); - void handleClick(InventoryClickEvent event, MenuController controller); + boolean handleClick(InventoryClickEvent event, MenuController controller); } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestQMenu.java index 98cd649b..c61bb6e2 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestQMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestQMenu.java @@ -207,35 +207,39 @@ public class QuestQMenu implements QMenu { } @Override - public void handleClick(InventoryClickEvent event, MenuController controller) { + public boolean handleClick(InventoryClickEvent event, MenuController controller) { //TODO maybe redo this maybe if (pagePrevLocation == event.getSlot()) { controller.openMenu(event.getWhoClicked(), this, currentPage - 1); - + return true; } else if (pageNextLocation == event.getSlot()) { controller.openMenu(event.getWhoClicked(), this, currentPage + 1); - + return true; } else if (config.getBoolean("options.categories-enabled") && backButtonLocation == event.getSlot()) { controller.openMenu(event.getWhoClicked(), superMenu, 1); - + return true; } else if (event.getSlot() < pageSize && menuElements.containsKey(event.getSlot() + (((currentPage) - 1) * pageSize))) { MenuElement menuElement = menuElements.get(event.getSlot() + ((currentPage - 1) * pageSize)); if (menuElement instanceof QuestMenuElement) { QuestMenuElement questMenuElement = (QuestMenuElement) menuElement; Quest quest = plugin.getQuestManager().getQuestById(questMenuElement.getQuestId()); if (event.getClick() == ClickType.LEFT) { - if (config.getBoolean("options.quest-autostart")) return; + if (config.getBoolean("options.quest-autostart")) return false; if (owner.startQuest(quest) == QuestStartResult.QUEST_SUCCESS) { event.getWhoClicked().closeInventory(); //TODO Option to keep the menu open } + return true; } else if (event.getClick() == ClickType.MIDDLE && config.getBoolean("options.quest-autostart")) { MenuUtils.handleMiddleClick(plugin, this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); + return true; } else if (event.getClick() == ClickType.RIGHT && config.getBoolean("options.allow-quest-cancel") && owner.hasStartedQuest(quest)) { MenuUtils.handleRightClick(plugin, this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); + return true; } } } + return false; } public boolean isBackButtonEnabled() { diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/StartedQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/StartedQMenu.java index 8171ac19..7d05294e 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/StartedQMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/StartedQMenu.java @@ -152,13 +152,13 @@ public class StartedQMenu implements QMenu { } @Override - public void handleClick(InventoryClickEvent event, MenuController controller) { + public boolean handleClick(InventoryClickEvent event, MenuController controller) { if (pagePrevLocation == event.getSlot()) { controller.openMenu(event.getWhoClicked(), this, currentPage - 1); - + return true; } else if (pageNextLocation == event.getSlot()) { controller.openMenu(event.getWhoClicked(), this, currentPage + 1); - + return true; } else if (event.getSlot() < pageSize && slotsToQuestIds.containsKey(event.getSlot() + ((currentPage) - 1) * pageSize)) { // repeat from above @@ -166,10 +166,13 @@ public class StartedQMenu implements QMenu { Quest quest = plugin.getQuestManager().getQuestById(questid); if (event.getClick() == ClickType.MIDDLE && config.getBoolean("options.allow-quest-track")) { MenuUtils.handleMiddleClick(plugin, this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); + return true; } else if (event.getClick() == ClickType.RIGHT && config.getBoolean("options.allow-quest-cancel") && owner.hasStartedQuest(quest)) { MenuUtils.handleRightClick(plugin, this, quest, Bukkit.getPlayer(owner.getPlayerUUID()), controller); + return true; } } + return false; } } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java index d9e39424..b538c209 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/questcontroller/NormalQuestController.java @@ -11,6 +11,7 @@ import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; import com.leonardobishop.quests.bukkit.menu.itemstack.QItemStack; import com.leonardobishop.quests.bukkit.util.Format; import com.leonardobishop.quests.bukkit.util.Messages; +import com.leonardobishop.quests.bukkit.util.SoundUtils; import com.leonardobishop.quests.bukkit.util.chat.Chat; import com.leonardobishop.quests.common.enums.QuestStartResult; import com.leonardobishop.quests.common.player.QPlayer; @@ -40,7 +41,6 @@ public class NormalQuestController implements QuestController { this.config = (BukkitQuestsConfig) plugin.getQuestsConfig(); List autoStartQuestCache = new ArrayList<>(); - List nonAutoStartQuestCache = new ArrayList<>(); for (Quest quest : plugin.getQuestManager().getQuests().values()) { if (quest.isAutoStartEnabled()) autoStartQuestCache.add(quest); } @@ -122,6 +122,7 @@ public class NormalQuestController implements QuestController { for (String s : quest.getStartString()) { player.sendMessage(Chat.color(s)); } + SoundUtils.playSoundForPlayer(player, plugin.getQuestsConfig().getString("options.sounds.quest-start")); } for (Task task : quest.getTasks()) { try { @@ -217,6 +218,7 @@ public class NormalQuestController implements QuestController { for (String s : quest.getRewardString()) { player.sendMessage(Chat.color(s)); } + SoundUtils.playSoundForPlayer(player, plugin.getQuestsConfig().getString("options.sounds.quest-complete")); } if ((config.getBoolean("options.allow-quest-track") && config.getBoolean("options.quest-autotrack") && !(quest.isRepeatable() && !quest.isCooldownEnabled())) || (!config.getBoolean("options.allow-quest-track") && config.getBoolean("options.quest-autotrack"))) { @@ -264,8 +266,10 @@ public class NormalQuestController implements QuestController { PlayerCancelQuestEvent questCancelEvent = new PlayerCancelQuestEvent(player, qPlayer, questProgress, questCancelMessage); Bukkit.getPluginManager().callEvent(questCancelEvent); // PlayerCancelQuestEvent -- end - if (questCancelEvent.getQuestCancelMessage() != null) + if (questCancelEvent.getQuestCancelMessage() != null) { player.sendMessage(questCancelEvent.getQuestCancelMessage()); + } + SoundUtils.playSoundForPlayer(player, plugin.getQuestsConfig().getString("options.sounds.quest-cancel")); } return true; } diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/SoundUtils.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/SoundUtils.java new file mode 100644 index 00000000..8eacd5d4 --- /dev/null +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/SoundUtils.java @@ -0,0 +1,40 @@ +package com.leonardobishop.quests.bukkit.util; + +import org.bukkit.Sound; +import org.bukkit.entity.Player; + +import java.util.regex.Pattern; + +public class SoundUtils { + + /** + * Play a sound to a player + * + * @param soundString the sound string as formatted by a user in the config, e.g ENTITY_PLAYER_LEVELUP:2:3 + */ + public static void playSoundForPlayer(Player player, String soundString) { + if (soundString == null || soundString.isEmpty()) return; + + String[] parts = soundString.split(Pattern.quote(":")); + float pitch = 1; + float volume = 3; + try { + switch (parts.length) { + case 3: + volume = Float.parseFloat(parts[2]); + case 2: + pitch = Float.parseFloat(parts[1]); + } + } catch (NumberFormatException ignored) { } + + Sound sound; + try { + sound = Sound.valueOf(parts[0]); + } catch (IllegalArgumentException ex) { + return; + } + + player.playSound(player.getLocation(), sound, volume, pitch); + } + +} -- cgit v1.2.3-70-g09d2