diff --git a/Changelog.txt b/Changelog.txt index 0a450ae4d..d4b07cadf 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -153,6 +153,9 @@ Version 2.2.0 Config_Update_Overwrite, Tool_Mods_Enabled, Armor_Mods_Enabled, Block_Mods_Enabled, Entity_Mods_Enabled, ExperienceConversionMultiplier API Changes + Restructured McMMOPlayerNotificationEvent to accommodate for new changes in NotificationManager + Now Notification events are no longer assumed to be sending to the action bar with an option to have a copy sent to chat + Notifications are now sent to either chat, actionbar, both or neither. The PlayerNotification type holds information on this. You can modify the event to change this how you wish if you hook into mcMMO. Added PrimarySkillType::getCapitalizedName Config settings can now be found in the ConfigManager (getter for it in mcMMO.java) Collection values from the config get converted into a runtime appropriate dataset, those can be found in DynamicSettingsManager (getter for it in mcMMO.java) diff --git a/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerNotificationEvent.java b/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerNotificationEvent.java index 6a44181ff..f7b7333ef 100644 --- a/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerNotificationEvent.java +++ b/src/main/java/com/gmail/nossr50/events/skills/McMMOPlayerNotificationEvent.java @@ -1,8 +1,10 @@ package com.gmail.nossr50.events.skills; +import com.gmail.nossr50.config.hocon.notifications.PlayerNotification; import com.gmail.nossr50.datatypes.interactions.NotificationType; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.craftbukkit.libs.jline.internal.Nullable; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; @@ -10,26 +12,23 @@ import org.bukkit.event.HandlerList; /** * This event is sent for when mcMMO informs a player about various important information + * Contains a TextComponent if the message contains complex features such as hover objects, clickables, etc + * TextComponent is not guaranteed to exist, but often it does */ public class McMMOPlayerNotificationEvent extends Event implements Cancellable { private static final HandlerList handlers = new HandlerList(); - protected final NotificationType notificationType; - protected ChatMessageType chatMessageType; - protected TextComponent notificationTextComponent; + private PlayerNotification playerNotification; + private Player recipient; private boolean isCancelled; - /* - * Messages can be sent to both places, as configured in advanced.yml - * If isBeingSentToActionBar is false, then messages will ALWAYS be sent to the chat bar - * isMessageAlsoBeingSentToChat just indicates a copy of that message will be sent to chat - */ - private boolean isMessageAlsoBeingSentToChat; + private NotificationType notificationType; + private TextComponent textComponent; - public McMMOPlayerNotificationEvent(Player who, NotificationType notificationType, TextComponent notificationTextComponent, ChatMessageType chatMessageType, boolean isMessageAlsoBeingSentToChat) { + public McMMOPlayerNotificationEvent(NotificationType notificationType, Player recipient, PlayerNotification playerNotification, TextComponent textComponent) { super(false); this.notificationType = notificationType; - this.notificationTextComponent = notificationTextComponent; - this.chatMessageType = chatMessageType; - this.isMessageAlsoBeingSentToChat = isMessageAlsoBeingSentToChat; + this.recipient = recipient; + this.playerNotification = playerNotification; + this.textComponent = textComponent; isCancelled = false; } @@ -37,33 +36,80 @@ public class McMMOPlayerNotificationEvent extends Event implements Cancellable { * Getters & Setters */ + /** + * Whether or not this notification event uses a text component + * @return true if this notification has a text component + */ + public boolean hasTextComponent() { + return textComponent != null; + } + + /** + * The recipient of this notification + * @return the recipient of this notification + */ + public Player getRecipient() { + return recipient; + } + + public void setRecipient(Player recipient) { + this.recipient = recipient; + } + + /** + * Is this notification being sent to chat + * @return true if being sent to chat + */ + public boolean isBeingSentToChat() { + return playerNotification.isSendToChat(); + } + + /** + * Is this notification being sent to action bar + * @return true if being sent to action bar + */ + public boolean isBeingSentToActionBar() { + return playerNotification.isSendToActionBar(); + } + + /** + * Change whether or not this notification sends to chat + * @param sendToChat new value + */ + public void setSendToChat(boolean sendToChat) { + playerNotification.setSendToChat(sendToChat); + } + + /** + * Change whether or not this notification sends to action bar + * @param sendToActionBar new value + */ + public void setSendToActionBar(boolean sendToActionBar) { + playerNotification.setSendToActionBar(sendToActionBar); + } + public static HandlerList getHandlerList() { return handlers; } - public boolean isMessageAlsoBeingSentToChat() { - return isMessageAlsoBeingSentToChat; - } - - public void setMessageAlsoBeingSentToChat(boolean messageAlsoBeingSentToChat) { - isMessageAlsoBeingSentToChat = messageAlsoBeingSentToChat; - } - + /** + * Get the text component if it exists + * @return the text component if it exists + */ public TextComponent getNotificationTextComponent() { - return notificationTextComponent; + return textComponent; } - public void setNotificationTextComponent(TextComponent notificationTextComponent) { - this.notificationTextComponent = notificationTextComponent; + /** + * Override the text component for this event + * Note that not all events are using a text component + * If you set one and it didn't exist before, then mcMMO will use the text component instead of the raw message + * @param textComponent new text component + */ + public void setNotificationTextComponent(TextComponent textComponent) { + this.textComponent = textComponent; } - public ChatMessageType getChatMessageType() { - return chatMessageType; - } - - public void setChatMessageType(ChatMessageType chatMessageType) { - this.chatMessageType = chatMessageType; - } /* * Custom Event Boilerplate diff --git a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java index 5e76972b5..4b7da34ce 100644 --- a/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java +++ b/src/main/java/com/gmail/nossr50/util/player/NotificationManager.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.util.player; import com.gmail.nossr50.config.AdvancedConfig; +import com.gmail.nossr50.config.hocon.notifications.PlayerNotification; import com.gmail.nossr50.datatypes.interactions.NotificationType; import com.gmail.nossr50.datatypes.notifications.SensitiveCommandType; import com.gmail.nossr50.datatypes.player.McMMOPlayer; @@ -22,7 +23,23 @@ import org.bukkit.SoundCategory; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import java.util.HashMap; + public class NotificationManager { + + private HashMap playerNotificationHashMap; + + public NotificationManager() { + playerNotificationHashMap = new HashMap<>(); + + initMaps(); + } + + private void initMaps() { + //Copy the map + playerNotificationHashMap = new HashMap<>(mcMMO.getConfigManager().getConfigNotifications().getNotificationSettingHashMap()); + } + /** * Sends players notifications from mcMMO * This does this by sending out an event so other plugins can cancel it