|
@@ -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 +
|
|
|
+ '}';
|
|
|
+ }
|
|
|
+}
|