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
     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
     Added 'Skills.Woodcutting.TreeFeller.Knock_On_Wood.Add_XP_Orbs_To_Drops' to advanced.yml
     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 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 {
             if (isLevelUp) {
                 NotificationManager.processLevelUpBroadcasting(mmoPlayer, skill, mmoPlayer.getSkillLevel(skill));
+                NotificationManager.processPowerLevelUpBroadcasting(mmoPlayer, mmoPlayer.getPowerLevel());
+
             }
         }
 
@@ -279,6 +281,7 @@ public final class EventUtils {
         } else {
             if (isLevelUp) {
                 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.Config;
 import com.gmail.nossr50.datatypes.LevelUpBroadcastPredicate;
+import com.gmail.nossr50.datatypes.PowerLevelUpBroadcastPredicate;
 import com.gmail.nossr50.datatypes.interactions.NotificationType;
 import com.gmail.nossr50.datatypes.notifications.SensitiveCommandType;
 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
     public static @NotNull LevelUpBroadcastPredicate<CommandSender> getLevelUpBroadcastPredicate(@NotNull CommandSender 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:
         # Whether or not level up broadcasts are enabled
         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)
         Milestone_Interval: 100
         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.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}
-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!