2
0
Эх сурвалжийг харах

Add Power Level broadcasts
Fixes #4388

nossr50 4 жил өмнө
parent
commit
27ae7ae1a7

+ 11 - 0
Changelog.txt

@@ -1,5 +1,16 @@
 Version 2.1.172
 Version 2.1.172
     Added 'mcmmo.broadcast.levelup' permission node, if a player lacks this node they will not have their level up milestones broadcast to chat
     Added 'mcmmo.broadcast.levelup' permission node, if a player lacks this node they will not have their level up milestones broadcast to chat
+    Power Levels are now included in level up broadcasts and they have their own settings (mirroring the existing settings for skill broadcasts)
+    Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels' to config.yml
+    Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Enabled' to config.yml
+    Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Milestone_Interval' to config.yml
+    Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Send_To_Console' to config.yml
+    Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Only_Party_Members' to config.yml
+    Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Only_Same_World' to config.yml
+    Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Distance_Restrictions.Restrict_Distance' to config.yml
+    Added 'General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Distance_Restrictions.Restricted_Radius' to config.yml
+    Added 'Broadcasts.PowerLevelUpMilestone' to locale
+
     You can now disable the XP orbs from being dropped when Knock On Wood triggers during Tree Feller
     You can now disable the XP orbs from being dropped when Knock On Wood triggers during Tree Feller
     Added 'Skills.Woodcutting.TreeFeller.Knock_On_Wood.Add_XP_Orbs_To_Drops' to advanced.yml
     Added 'Skills.Woodcutting.TreeFeller.Knock_On_Wood.Add_XP_Orbs_To_Drops' to advanced.yml
     Updated german locale (thanks TheBusyBiscuit)
     Updated german locale (thanks TheBusyBiscuit)

+ 8 - 0
src/main/java/com/gmail/nossr50/config/Config.java

@@ -589,4 +589,12 @@ public class Config extends AutoUpdateConfigLoader {
     public int getLevelUpBroadcastRadius() { return config.getInt("General.Level_Up_Chat_Broadcasts.Broadcast_Targets.Distance_Restrictions.Restricted_Radius", 100); }
     public int getLevelUpBroadcastRadius() { return config.getInt("General.Level_Up_Chat_Broadcasts.Broadcast_Targets.Distance_Restrictions.Restricted_Radius", 100); }
     public int getLevelUpBroadcastInterval() { return config.getInt("General.Level_Up_Chat_Broadcasts.Milestone_Interval", 100); }
     public int getLevelUpBroadcastInterval() { return config.getInt("General.Level_Up_Chat_Broadcasts.Milestone_Interval", 100); }
 
 
+    public boolean shouldPowerLevelUpBroadcasts() { return config.getBoolean("General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Enabled", true); }
+    public boolean shouldPowerLevelUpBroadcastToConsole() { return config.getBoolean("General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Send_To_Console", true); }
+    public boolean isPowerLevelUpBroadcastsPartyMembersOnly() { return config.getBoolean("General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Only_Party_Members", false); }
+    public boolean isPowerLevelUpBroadcastsSameWorldOnly() { return config.getBoolean("General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Only_Same_World", false); }
+    public boolean shouldPowerLevelUpBroadcastsRestrictDistance() { return config.getBoolean("General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Distance_Restrictions.Restrict_Distance", false); }
+    public int getPowerLevelUpBroadcastRadius() { return config.getInt("General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Broadcast_Targets.Distance_Restrictions.Restricted_Radius", 100); }
+    public int getPowerLevelUpBroadcastInterval() { return config.getInt("General.Level_Up_Chat_Broadcasts.Broadcast_Powerlevels.Milestone_Interval", 100); }
+
 }
 }

+ 100 - 0
src/main/java/com/gmail/nossr50/datatypes/PowerLevelUpBroadcastPredicate.java

@@ -0,0 +1,100 @@
+package com.gmail.nossr50.datatypes;
+
+import com.gmail.nossr50.config.Config;
+import com.gmail.nossr50.datatypes.party.Party;
+import com.gmail.nossr50.datatypes.player.McMMOPlayer;
+import com.gmail.nossr50.mcMMO;
+import com.gmail.nossr50.util.Misc;
+import com.gmail.nossr50.util.player.UserManager;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.function.Predicate;
+
+//TODO: Allow for offline players to broadcast
+public class PowerLevelUpBroadcastPredicate<T extends CommandSender> implements Predicate<T> {
+
+    private final @NotNull T broadcaster;
+
+    public PowerLevelUpBroadcastPredicate(@NotNull T broadcaster) {
+        this.broadcaster = broadcaster;
+    }
+
+    @Override
+    public boolean test(@NotNull T t) {
+        Player broadcastingPlayer = (Player) broadcaster; //Always a player no need to check cast
+
+        //Broadcaster should be online
+        if(!broadcastingPlayer.isOnline()) {
+            return false;
+        }
+
+        McMMOPlayer mmoBroadcastingPlayer = UserManager.getPlayer(broadcastingPlayer);
+
+        if(mmoBroadcastingPlayer == null) {
+            //This should never be null, but just in case...
+            mcMMO.p.getLogger().severe("McMMOPlayer was null for broadcaster in LevelUpBroadcastPredicate when it should never be null!");
+            return false;
+        }
+
+        if(t instanceof Player) {
+            Player listeningPlayer = (Player) t;
+
+            //Party Member Check
+            if(Config.getInstance().isPowerLevelUpBroadcastsPartyMembersOnly()) {
+                McMMOPlayer mmoListeningPlayer = UserManager.getPlayer(listeningPlayer);
+
+                if(mmoListeningPlayer == null) {
+                    return false; //No profile so therefor no party
+                }
+
+                Party playerWhoLeveledParty = mmoBroadcastingPlayer.getParty();
+                Party broadcastRecipientParty = mmoListeningPlayer.getParty();
+
+                if(playerWhoLeveledParty == null || broadcastRecipientParty == null) {
+                    return false; //No party on either player when being in the same party is required
+                }
+
+                if(!playerWhoLeveledParty.equals(broadcastRecipientParty)) {
+                    return false; //Not in the same party when it is required
+                }
+            }
+
+            //Same world check
+            if(isPowerLevelUpBroadcastsSameWorldOnly()) {
+                if(!mmoBroadcastingPlayer.getPlayer().getWorld().equals(listeningPlayer.getWorld())) {
+                    return false; //Not in the same world when its required
+                }
+
+                //Distance checks
+                if(Config.getInstance().shouldPowerLevelUpBroadcastsRestrictDistance()) {
+                    if(!Misc.isNear(mmoBroadcastingPlayer.getPlayer().getLocation(), listeningPlayer.getLocation(), Config.getInstance().getPowerLevelUpBroadcastRadius())) {
+                        return false;
+                    }
+                }
+            }
+
+            //Visibility checks
+            if(!listeningPlayer.canSee(mmoBroadcastingPlayer.getPlayer())) {
+                return false; //Player who leveled should be invisible to this player so don't send the message
+            }
+
+            return true;
+        } else {
+            //Send out to console
+            return Config.getInstance().shouldPowerLevelUpBroadcastToConsole();
+        }
+    }
+
+    private static boolean isPowerLevelUpBroadcastsSameWorldOnly() {
+        return Config.getInstance().isPowerLevelUpBroadcastsSameWorldOnly();
+    }
+
+    @Override
+    public String toString() {
+        return "PowerLevelUpBroadcastPredicate{" +
+                "broadcaster=" + broadcaster +
+                '}';
+    }
+}

+ 3 - 0
src/main/java/com/gmail/nossr50/util/EventUtils.java

@@ -245,6 +245,8 @@ public final class EventUtils {
         } else {
         } else {
             if (isLevelUp) {
             if (isLevelUp) {
                 NotificationManager.processLevelUpBroadcasting(mmoPlayer, skill, mmoPlayer.getSkillLevel(skill));
                 NotificationManager.processLevelUpBroadcasting(mmoPlayer, skill, mmoPlayer.getSkillLevel(skill));
+                NotificationManager.processPowerLevelUpBroadcasting(mmoPlayer, mmoPlayer.getPowerLevel());
+
             }
             }
         }
         }
 
 
@@ -279,6 +281,7 @@ public final class EventUtils {
         } else {
         } else {
             if (isLevelUp) {
             if (isLevelUp) {
                 NotificationManager.processLevelUpBroadcasting(mmoPlayer, skill, mmoPlayer.getSkillLevel(skill));
                 NotificationManager.processLevelUpBroadcasting(mmoPlayer, skill, mmoPlayer.getSkillLevel(skill));
+                NotificationManager.processPowerLevelUpBroadcasting(mmoPlayer, mmoPlayer.getPowerLevel());
             }
             }
         }
         }
 
 

+ 39 - 0
src/main/java/com/gmail/nossr50/util/player/NotificationManager.java

@@ -3,6 +3,7 @@ package com.gmail.nossr50.util.player;
 import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.AdvancedConfig;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.config.Config;
 import com.gmail.nossr50.datatypes.LevelUpBroadcastPredicate;
 import com.gmail.nossr50.datatypes.LevelUpBroadcastPredicate;
+import com.gmail.nossr50.datatypes.PowerLevelUpBroadcastPredicate;
 import com.gmail.nossr50.datatypes.interactions.NotificationType;
 import com.gmail.nossr50.datatypes.interactions.NotificationType;
 import com.gmail.nossr50.datatypes.notifications.SensitiveCommandType;
 import com.gmail.nossr50.datatypes.notifications.SensitiveCommandType;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 import com.gmail.nossr50.datatypes.player.McMMOPlayer;
@@ -299,9 +300,47 @@ public class NotificationManager {
         }
         }
     }
     }
 
 
+    //TODO: Remove the code duplication, am lazy atm
+    public static void processPowerLevelUpBroadcasting(@NotNull McMMOPlayer mmoPlayer, int powerLevel) {
+        if(powerLevel <= 0)
+            return;
+
+        //Check if broadcasting is enabled
+        if(Config.getInstance().shouldPowerLevelUpBroadcasts()) {
+            //Permission check
+            if(!Permissions.levelUpBroadcast(mmoPlayer.getPlayer())) {
+                return;
+            }
+
+            int levelInterval = Config.getInstance().getPowerLevelUpBroadcastInterval();
+            int remainder = powerLevel % levelInterval;
+
+            if(remainder == 0) {
+                //Grab appropriate audience
+                Audience audience = mcMMO.getAudiences().filter(getPowerLevelUpBroadcastPredicate(mmoPlayer.getPlayer()));
+                //TODO: Make prettier
+                HoverEvent<Component> levelMilestoneHover = Component.text(mmoPlayer.getPlayer().getName())
+                        .append(Component.newline())
+                        .append(Component.text(LocalDate.now().toString()))
+                        .append(Component.newline())
+                        .append(Component.text("Power level has reached "+powerLevel)).color(TextColor.fromHexString(HEX_BEIGE_COLOR))
+                        .asHoverEvent();
+
+                String localeMessage = LocaleLoader.getString("Broadcasts.PowerLevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), powerLevel);
+                Component message = Component.text(localeMessage).hoverEvent(levelMilestoneHover);
+
+                audience.sendMessage(Identity.nil(), message);
+            }
+        }
+    }
+
     //TODO: Could cache
     //TODO: Could cache
     public static @NotNull LevelUpBroadcastPredicate<CommandSender> getLevelUpBroadcastPredicate(@NotNull CommandSender levelUpPlayer) {
     public static @NotNull LevelUpBroadcastPredicate<CommandSender> getLevelUpBroadcastPredicate(@NotNull CommandSender levelUpPlayer) {
         return new LevelUpBroadcastPredicate<>(levelUpPlayer);
         return new LevelUpBroadcastPredicate<>(levelUpPlayer);
     }
     }
 
 
+    public static @NotNull PowerLevelUpBroadcastPredicate<CommandSender> getPowerLevelUpBroadcastPredicate(@NotNull CommandSender levelUpPlayer) {
+        return new PowerLevelUpBroadcastPredicate<>(levelUpPlayer);
+    }
+
 }
 }

+ 17 - 0
src/main/resources/config.yml

@@ -12,6 +12,23 @@ General:
     Level_Up_Chat_Broadcasts:
     Level_Up_Chat_Broadcasts:
         # Whether or not level up broadcasts are enabled
         # Whether or not level up broadcasts are enabled
         Enabled: true
         Enabled: true
+        # Whether or not you want power level milestones to be broadcast
+        Broadcast_Powerlevels:
+            Enabled: true
+            # How often to broadcast, you can change this to 1 to always broadcast a level up event, a setting of 100 will limit it to every 100 levels (for example level 100, level 200, etc)
+            Milestone_Interval: 100
+            Broadcast_Targets:
+                # Send the message to the console as well
+                Send_To_Console: true
+                # Whether or not to only send chat messages to party members
+                Only_Party_Members: false
+                # Whether or not players who recieve a level up broadcast have to be on the same world as the one who leveled up
+                Only_Same_World: false
+                # Distance restrictions
+                Distance_Restrictions:
+                    Restrict_Distance: false
+                    # When using Restrict_Distance the blow setting configures the range of the broadcast
+                    Restricted_Radius: 100
         # How often to broadcast, you can change this to 1 to always broadcast a level up event, a setting of 100 will limit it to every 100 levels (for example level 100, level 200, etc)
         # How often to broadcast, you can change this to 1 to always broadcast a level up event, a setting of 100 will limit it to every 100 levels (for example level 100, level 200, etc)
         Milestone_Interval: 100
         Milestone_Interval: 100
         Broadcast_Targets:
         Broadcast_Targets:

+ 2 - 1
src/main/resources/locale/locale_en_US.properties

@@ -1136,4 +1136,5 @@ Chat.Identity.Console=&6* Console *
 Chat.Channel.On=&6(&amcMMO-Chat&6) &eYour chat messages will now be automatically delivered to the &a{0}&e chat channel.
 Chat.Channel.On=&6(&amcMMO-Chat&6) &eYour chat messages will now be automatically delivered to the &a{0}&e chat channel.
 Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Your chat messages will no longer be automatically delivered to specific chat channels.
 Chat.Channel.Off=&6(&amcMMO-Chat&6) &7Your chat messages will no longer be automatically delivered to specific chat channels.
 Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1}
 Chat.Spy.Party=&6[&eSPY&6-&a{2}&6] &r{0} &b\u2192 &r{1}
-Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 has reached level &a{1}&7 in [[DARK_AQUA]]{2}&7!
+Broadcasts.LevelUpMilestone=&6(&amcMMO&6) {0}&7 has reached level &a{1}&7 in [[DARK_AQUA]]{2}&7!
+Broadcasts.PowerLevelUpMilestone=&6(&amcMMO&6) {0}&7 has reached a Power level of &a{1}&7!