mcMMO/src/main/java/com/gmail/nossr50/skills/maces/MacesManager.java
Robert Alan Chapton 971e5da0ad
Maces (#5035)
Add Maces skill
2024-06-30 15:10:29 -07:00

115 lines
4.2 KiB
Java

package com.gmail.nossr50.skills.maces;
import com.gmail.nossr50.datatypes.interactions.NotificationType;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.skills.PrimarySkillType;
import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.skills.SkillManager;
import com.gmail.nossr50.util.Permissions;
import com.gmail.nossr50.util.player.NotificationManager;
import com.gmail.nossr50.util.random.ProbabilityUtil;
import com.gmail.nossr50.util.skills.ParticleEffectUtils;
import com.gmail.nossr50.util.skills.RankUtils;
import org.bukkit.NamespacedKey;
import org.bukkit.Registry;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffectType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Locale;
public class MacesManager extends SkillManager {
private static @Nullable PotionEffectType slowEffectType;
public MacesManager(McMMOPlayer mmoPlayer) {
super(mmoPlayer, PrimarySkillType.MACES);
}
private static @Nullable PotionEffectType mockSpigotMatch(@NotNull String input) {
// Replicates match() behaviour for older versions lacking this API
final String filtered = input.toLowerCase(Locale.ROOT).replaceAll("\\s+", "_");
final NamespacedKey namespacedKey = NamespacedKey.fromString(filtered);
return (namespacedKey != null) ? Registry.EFFECT.get(namespacedKey) : null;
}
/**
* Get the Crush damage bonus.
*
* @return the Crush damage bonus.
*/
public double getCrushDamage() {
if (!Permissions.canUseSubSkill(mmoPlayer.getPlayer(), SubSkillType.MACES_CRUSH))
return 0;
int rank = RankUtils.getRank(getPlayer(), SubSkillType.MACES_CRUSH);
if (rank > 0) {
return (0.5D + (rank * 1.D));
}
return 0;
}
/**
* Process Cripple attack.
*
* @param target The defending entity
*/
public void processCripple(@NotNull LivingEntity target) {
// Lazy initialized to avoid some backwards compatibility issues
if (slowEffectType == null) {
if (mockSpigotMatch("slowness") == null) {
mcMMO.p.getLogger().severe("Unable to find the Slowness PotionEffectType, " +
"mcMMO will not function properly.");
throw new IllegalStateException("Unable to find the Slowness PotionEffectType!");
} else {
slowEffectType = mockSpigotMatch("slowness");
}
}
boolean isPlayerTarget = target instanceof Player;
// Don't apply Cripple if the target is already Slowed
if (slowEffectType == null || target.getPotionEffect(slowEffectType) != null) {
return;
}
if (!Permissions.canUseSubSkill(mmoPlayer.getPlayer(), SubSkillType.MACES_CRIPPLE)) {
return;
}
int crippleRank = RankUtils.getRank(getPlayer(), SubSkillType.MACES_CRIPPLE);
double crippleOdds = (mcMMO.p.getAdvancedConfig().getCrippleChanceToApplyOnHit(crippleRank)
* mmoPlayer.getAttackStrength());
if (ProbabilityUtil.isStaticSkillRNGSuccessful(PrimarySkillType.MACES, mmoPlayer, crippleOdds)) {
if (mmoPlayer.useChatNotifications()) {
NotificationManager.sendPlayerInformation(mmoPlayer.getPlayer(),
NotificationType.SUBSKILL_MESSAGE, "Maces.SubSkill.Cripple.Activated");
}
// Cripple is success, Cripple the target
target.addPotionEffect(slowEffectType.createEffect(
getCrippleTickDuration(isPlayerTarget),
getCrippleStrength(isPlayerTarget)));
ParticleEffectUtils.playCrippleEffect(target);
}
}
public static int getCrippleTickDuration(boolean isPlayerTarget) {
// TODO: Make configurable
if (isPlayerTarget) {
return 20;
} else {
return 30;
}
}
public static int getCrippleStrength(boolean isPlayerTarget) {
// TODO: Make configurable
return isPlayerTarget ? 1 : 2;
}
}