mirror of
				https://github.com/mcMMO-Dev/mcMMO.git
				synced 2025-11-04 11:03:43 +01:00 
			
		
		
		
	Add broadcasting when players reach certain level milestones (defaults to every 100 levels)
This commit is contained in:
		@@ -32,6 +32,7 @@ import com.gmail.nossr50.events.skills.secondaryabilities.SubSkillEvent;
 | 
			
		||||
import com.gmail.nossr50.events.skills.unarmed.McMMOPlayerDisarmEvent;
 | 
			
		||||
import com.gmail.nossr50.locale.LocaleLoader;
 | 
			
		||||
import com.gmail.nossr50.mcMMO;
 | 
			
		||||
import com.gmail.nossr50.util.player.NotificationManager;
 | 
			
		||||
import com.gmail.nossr50.util.player.UserManager;
 | 
			
		||||
import com.gmail.nossr50.util.skills.CombatUtils;
 | 
			
		||||
import org.bukkit.block.Block;
 | 
			
		||||
@@ -232,6 +233,24 @@ public final class EventUtils {
 | 
			
		||||
        return isCancelled;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean tryLevelChangeEvent(@NotNull McMMOPlayer mmoPlayer, PrimarySkillType skill, int levelsChanged, float xpRemoved, boolean isLevelUp, XPGainReason xpGainReason) {
 | 
			
		||||
        McMMOPlayerLevelChangeEvent event = isLevelUp ? new McMMOPlayerLevelUpEvent(mmoPlayer.getPlayer(), skill, levelsChanged, xpGainReason) : new McMMOPlayerLevelDownEvent(mmoPlayer.getPlayer(), skill, levelsChanged, xpGainReason);
 | 
			
		||||
        mcMMO.p.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
 | 
			
		||||
        boolean isCancelled = event.isCancelled();
 | 
			
		||||
 | 
			
		||||
        if (isCancelled) {
 | 
			
		||||
            mmoPlayer.modifySkill(skill, mmoPlayer.getSkillLevel(skill) - (isLevelUp ? levelsChanged : -levelsChanged));
 | 
			
		||||
            mmoPlayer.addXp(skill, xpRemoved);
 | 
			
		||||
        } else {
 | 
			
		||||
            if (isLevelUp) {
 | 
			
		||||
                NotificationManager.processLevelUpBroadcasting(mmoPlayer, skill, mmoPlayer.getSkillLevel(skill));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return isCancelled;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean tryLevelEditEvent(Player player, PrimarySkillType skill, int levelsChanged, float xpRemoved, boolean isLevelUp, XPGainReason xpGainReason, int oldLevel) {
 | 
			
		||||
        McMMOPlayerLevelChangeEvent event = isLevelUp ? new McMMOPlayerLevelUpEvent(player, skill, levelsChanged - oldLevel, xpGainReason) : new McMMOPlayerLevelDownEvent(player, skill, levelsChanged, xpGainReason);
 | 
			
		||||
        mcMMO.p.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
@@ -248,6 +267,24 @@ public final class EventUtils {
 | 
			
		||||
        return isCancelled;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean tryLevelEditEvent(@NotNull McMMOPlayer mmoPlayer, PrimarySkillType skill, int levelsChanged, float xpRemoved, boolean isLevelUp, XPGainReason xpGainReason, int oldLevel) {
 | 
			
		||||
        McMMOPlayerLevelChangeEvent event = isLevelUp ? new McMMOPlayerLevelUpEvent(mmoPlayer.getPlayer(), skill, levelsChanged - oldLevel, xpGainReason) : new McMMOPlayerLevelDownEvent(mmoPlayer.getPlayer(), skill, levelsChanged, xpGainReason);
 | 
			
		||||
        mcMMO.p.getServer().getPluginManager().callEvent(event);
 | 
			
		||||
 | 
			
		||||
        boolean isCancelled = event.isCancelled();
 | 
			
		||||
 | 
			
		||||
        if (isCancelled) {
 | 
			
		||||
            mmoPlayer.modifySkill(skill, mmoPlayer.getSkillLevel(skill) - (isLevelUp ? levelsChanged : -levelsChanged));
 | 
			
		||||
            mmoPlayer.addXp(skill, xpRemoved);
 | 
			
		||||
        } else {
 | 
			
		||||
            if (isLevelUp) {
 | 
			
		||||
                NotificationManager.processLevelUpBroadcasting(mmoPlayer, skill, mmoPlayer.getSkillLevel(skill));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return isCancelled;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Simulate a block break event.
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -2,6 +2,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.interactions.NotificationType;
 | 
			
		||||
import com.gmail.nossr50.datatypes.notifications.SensitiveCommandType;
 | 
			
		||||
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
 | 
			
		||||
@@ -19,14 +20,23 @@ import net.kyori.adventure.audience.Audience;
 | 
			
		||||
import net.kyori.adventure.audience.MessageType;
 | 
			
		||||
import net.kyori.adventure.identity.Identity;
 | 
			
		||||
import net.kyori.adventure.text.Component;
 | 
			
		||||
import net.kyori.adventure.text.event.HoverEvent;
 | 
			
		||||
import net.kyori.adventure.text.format.TextColor;
 | 
			
		||||
import org.bukkit.Bukkit;
 | 
			
		||||
import org.bukkit.ChatColor;
 | 
			
		||||
import org.bukkit.Server;
 | 
			
		||||
import org.bukkit.SoundCategory;
 | 
			
		||||
import org.bukkit.command.CommandSender;
 | 
			
		||||
import org.bukkit.entity.Player;
 | 
			
		||||
import org.jetbrains.annotations.NotNull;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDate;
 | 
			
		||||
 | 
			
		||||
public class NotificationManager {
 | 
			
		||||
 | 
			
		||||
    public static final String HEX_BEIGE_COLOR = "#c2a66e";
 | 
			
		||||
    public static final String HEX_LIME_GREEN_COLOR = "#8ec26e";
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sends players notifications from mcMMO
 | 
			
		||||
     * Does so by sending out an event so other plugins can cancel it
 | 
			
		||||
@@ -256,4 +266,37 @@ public class NotificationManager {
 | 
			
		||||
        return newArray;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void processLevelUpBroadcasting(@NotNull McMMOPlayer mmoPlayer, @NotNull PrimarySkillType primarySkillType, int level) {
 | 
			
		||||
        if(level <= 0)
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        //Check if broadcasting is enabled
 | 
			
		||||
        if(Config.getInstance().shouldLevelUpBroadcasts()) {
 | 
			
		||||
            int levelInterval = Config.getInstance().getLevelUpBroadcastInterval();
 | 
			
		||||
            int remainder = level % levelInterval;
 | 
			
		||||
 | 
			
		||||
            if(remainder == 0) {
 | 
			
		||||
                //Grab appropriate audience
 | 
			
		||||
                Audience audience = mcMMO.getAudiences().filter(getLevelUpBroadcastPredicate(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(primarySkillType.getName()+" reached level "+level)).color(TextColor.fromHexString(HEX_BEIGE_COLOR))
 | 
			
		||||
                        .asHoverEvent();
 | 
			
		||||
 | 
			
		||||
                String localeMessage = LocaleLoader.getString("Broadcasts.LevelUpMilestone", mmoPlayer.getPlayer().getDisplayName(), level, primarySkillType.toString());
 | 
			
		||||
                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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user